diff --git a/interface/ispconfig/interface/admin/firewall_del.php b/interface/ispconfig/interface/admin/firewall_del.php new file mode 100644 index 0000000000000000000000000000000000000000..5f4dc9172d649a144b62f0481c5ab71bc82166f0 --- /dev/null +++ b/interface/ispconfig/interface/admin/firewall_del.php @@ -0,0 +1,51 @@ +auth->check_module_permissions('admin'); + +$app->uses("tform_actions"); +$app->tform_actions->onDelete(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/firewall_edit.php b/interface/ispconfig/interface/admin/firewall_edit.php new file mode 100644 index 0000000000000000000000000000000000000000..0401143dcff01bdbee227f393461a52864db33a2 --- /dev/null +++ b/interface/ispconfig/interface/admin/firewall_edit.php @@ -0,0 +1,72 @@ +auth->check_module_permissions('admin'); + +// Loading classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + function onBeforeUpdate() { + global $app, $conf; + + //* Check if the server has been changed + // We do this only for the admin or reseller users, as normal clients can not change the server ID anyway + if($_SESSION["s"]["user"]["typ"] == 'admin' || $app->auth->has_clients($_SESSION['s']['user']['userid'])) { + $rec = $app->db->queryOneRecord("SELECT server_id from firewall WHERE firewall_id = ".$this->id); + if($rec['server_id'] != $this->dataRecord["server_id"]) { + //* Add a error message and switch back to old server + $app->tform->errorMessage .= $app->lng('The Server can not be changed.'); + $this->dataRecord["server_id"] = $rec['server_id']; + } + unset($rec); + } + } +} + +$page = new page_action; +$page->onLoad(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/firewall_list.php b/interface/ispconfig/interface/admin/firewall_list.php new file mode 100644 index 0000000000000000000000000000000000000000..f95c570c20f82cc578723521467c8eafd134cc91 --- /dev/null +++ b/interface/ispconfig/interface/admin/firewall_list.php @@ -0,0 +1,52 @@ +auth->check_module_permissions('admin'); + +$app->uses('listform_actions'); + +$app->listform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/form/dbsync.tform.php b/interface/ispconfig/interface/admin/form/dbsync.tform.php new file mode 100644 index 0000000000000000000000000000000000000000..363c916f20695e3dd481a6504fbe8203c0da9a6c --- /dev/null +++ b/interface/ispconfig/interface/admin/form/dbsync.tform.php @@ -0,0 +1,264 @@ + 'DB sync', + 'width' => 80, + 'template' => 'templates/dbsync_edit.htm', + 'fields' => array ( + ################################## + # Beginn Datenbankfelder + ################################## + 'jobname' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'regex' => '/^.{1,30}$/', + 'errmsg' => 'jobname_err', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '15', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'sync_interval_minutes' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'regex' => '', + 'errmsg' => '', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '15', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'db_type' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'regex' => '', + 'errmsg' => '', + 'default' => '', + 'value' => array('mysql' => 'mysql'), + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'db_host' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'regex' => '', + 'errmsg' => '', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'db_name' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'regex' => '', + 'errmsg' => '', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'db_username' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'regex' => '', + 'errmsg' => '', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'db_password' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'regex' => '', + 'errmsg' => '', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'db_tables' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOXARRAY', + 'regex' => '', + 'errmsg' => '', + 'default' => 'admin,forms', + 'value' => $db_tables, + 'separator' => ',', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'empty_datalog' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'CHECKBOX', + 'regex' => '', + 'errmsg' => '', + 'default' => '', + 'value' => array(0 => 0,1 => 1), + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'sync_datalog_external' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'CHECKBOX', + 'regex' => '', + 'errmsg' => '', + 'default' => '', + 'value' => array(0 => 0,1 => 1), + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'active' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'CHECKBOX', + 'regex' => '', + 'errmsg' => '', + 'default' => '1', + 'value' => array(0 => 0,1 => 1), + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ) + ################################## + # ENDE Datenbankfelder + ################################## + ) +); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/form/filesync.tform.php b/interface/ispconfig/interface/admin/form/filesync.tform.php new file mode 100644 index 0000000000000000000000000000000000000000..c252b1a29510b1d1435bb5dd3cbe0e5403f8cc18 --- /dev/null +++ b/interface/ispconfig/interface/admin/form/filesync.tform.php @@ -0,0 +1,205 @@ + "Datei sync", + 'width' => 80, + 'template' => "templates/filesync_edit.htm", + 'fields' => array ( + ################################## + # Beginn Datenbankfelder + ################################## + 'jobname' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'regex' => '/^.{1,30}$/', + 'errmsg' => 'jobname_err', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '15', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'sync_interval_minutes' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'regex' => '', + 'errmsg' => '', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '15', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'ftp_host' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'regex' => '', + 'errmsg' => '', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'ftp_path' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'regex' => '', + 'errmsg' => '', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'ftp_username' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'regex' => '', + 'errmsg' => '', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'ftp_password' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'regex' => '', + 'errmsg' => '', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'local_path' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'regex' => '', + 'errmsg' => '', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'wput_options' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'regex' => '', + 'errmsg' => '', + 'default' => '', + 'value' => '--timestamping --dont-continue', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'active' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'CHECKBOX', + 'regex' => '', + 'errmsg' => '', + 'default' => '1', + 'value' => array(0 => 0,1 => 1), + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ) + ################################## + # ENDE Datenbankfelder + ################################## + ) +); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/form/firewall.tform.php b/interface/ispconfig/interface/admin/form/firewall.tform.php new file mode 100644 index 0000000000000000000000000000000000000000..edbe89ce4a0252db13472602bf8323955c99f994 --- /dev/null +++ b/interface/ispconfig/interface/admin/form/firewall.tform.php @@ -0,0 +1,112 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['firewall'] = array ( + 'title' => "Firewall", + 'width' => 100, + 'template' => "templates/firewall_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'validators' => array ( 0 => array ( 'type' => 'UNIQUE', + 'errmsg'=> 'firewall_error_unique'), + ), + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'value' => '' + ), + 'tcp_port' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'REGEX', + 'regex' => '/^[\s0-9\,\:]{0,255}$/', + 'errmsg'=> 'tcp_ports_error_regex'), + ), + 'default' => '20,21,22,25,53,80,110,143,443,3306,8080,10000', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'udp_port' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'REGEX', + 'regex' => '/^[\s0-9\,\:]{0,255}$/', + 'errmsg'=> 'tcp_ports_error_regex'), + ), + 'default' => '53,3306', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'active' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(0 => 'n',1 => 'y') + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/form/groups.tform.php b/interface/ispconfig/interface/admin/form/groups.tform.php new file mode 100644 index 0000000000000000000000000000000000000000..c27cfad6326dd5ce23801597c857578572334bb7 --- /dev/null +++ b/interface/ispconfig/interface/admin/form/groups.tform.php @@ -0,0 +1,112 @@ + "Groups", + 'width' => 80, + 'template' => "templates/groups_edit.htm", + 'fields' => array ( + ################################## + # Beginn Datenbankfelder + ################################## + 'name' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'regex' => '/^.{1,30}$/', + 'errmsg' => 'name_err', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'description' => array ( + 'datatype' => 'TEXT', + 'formtype' => 'TEXTAREA', + 'regex' => '', + 'errmsg' => '', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '', + 'maxlength' => '', + 'rows' => '5', + 'cols' => '30' + ) + ################################## + # ENDE Datenbankfelder + ################################## + ) +); +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/form/remote_user.tform.php b/interface/ispconfig/interface/admin/form/remote_user.tform.php new file mode 100644 index 0000000000000000000000000000000000000000..2657656244595c07f7f12180ddc969093de527c5 --- /dev/null +++ b/interface/ispconfig/interface/admin/form/remote_user.tform.php @@ -0,0 +1,160 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['remote_user'] = array ( + 'title' => "Remote User", + 'width' => 100, + 'template' => "templates/remote_user_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'remote_userid' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT remote_userid,remote_username FROM remote_user WHERE {AUTHSQL} ORDER BY remote_username', + 'keyfield'=> 'remote_userid', + 'valuefield'=> 'remote_username' + ), + 'value' => '' + ), + + 'remote_username' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'UNIQUE', + 'errmsg'=> 'username_error_unique'), + 1 => array ( 'type' => 'REGEX', + 'regex' => '/^[\w\.\-]{0,64}$/', + 'errmsg'=> 'username_error_regex'), +2 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'username_error_empty'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'remote_password' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'PASSWORD', + 'encryption' => 'MD5', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'remote_functions' => array ( + 'datatype' => 'TEXT', + 'formtype' => 'CHECKBOXARRAY', + 'regex' => '', + 'errmsg' => '', + 'default' => '', + 'value' => $function_list, + 'separator' => ';', + 'width' => '', + 'maxlength' => '', + 'rows' => '5', + 'cols' => '30' + ) + + ################################## + # ENDE Datatable fields + ################################## + ) +); + + + + + +?> diff --git a/interface/ispconfig/interface/admin/form/server.tform.php b/interface/ispconfig/interface/admin/form/server.tform.php new file mode 100644 index 0000000000000000000000000000000000000000..9c0138bb792d120e568cca43c1e067a9732b34a8 --- /dev/null +++ b/interface/ispconfig/interface/admin/form/server.tform.php @@ -0,0 +1,157 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 1; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['services'] = array ( + 'title' => "Services", + 'width' => 100, + 'template' => "templates/server_edit_services.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'server_name' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'mail_server' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'CHECKBOX', + 'default' => '0', + 'value' => array(0 => 0,1 => 1) + ), + 'web_server' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'CHECKBOX', + 'default' => '0', + 'value' => array(0 => 0,1 => 1) + ), + 'dns_server' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'CHECKBOX', + 'default' => '0', + 'value' => array(0 => 0,1 => 1) + ), + 'file_server' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'CHECKBOX', + 'default' => '0', + 'value' => array(0 => 0,1 => 1) + ), + 'db_server' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'CHECKBOX', + 'default' => '0', + 'value' => array(0 => 0,1 => 1) + ), + 'vserver_server' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'CHECKBOX', + 'default' => '0', + 'value' => array(0 => 0,1 => 1) + ), + 'mirror_server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '' + ), + /* + 'update' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '1', + 'value' => array(0 => 'No', 1 => 'Yes') + ), + */ + 'active' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '1', + 'value' => array(0 => 'No', 1 => 'Yes') + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + +/* +$form["tabs"]['config'] = array ( + 'title' => "Config", + 'width' => 100, + 'template' => "templates/server_edit_config.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'config' => array ( + 'datatype' => 'TEXT', + 'formtype' => 'TEXTAREA', + 'default' => '', + 'value' => '', + 'width' => '', + 'cols' => '40', + 'rows' => '20', + 'maxlength' => '' + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); +*/ + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/form/server_config.tform.php b/interface/ispconfig/interface/admin/form/server_config.tform.php new file mode 100644 index 0000000000000000000000000000000000000000..b16f9234f6016316a52bb5f5d5d32fdca1c0db5c --- /dev/null +++ b/interface/ispconfig/interface/admin/form/server_config.tform.php @@ -0,0 +1,750 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['server'] = array ( + 'title' => "Server", + 'width' => 70, + 'template' => "templates/server_config_server_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'auto_network_configuration' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'n', + 'value' => array(0 => 'n',1 => 'y') + ), + 'ip_address' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '192.168.0.105', + 'validators' => array ( 0 => array ( 'type' => 'ISIPV4', + 'errmsg'=> 'ip_address_error_wrong'), + ), + 'value' => '', + 'width' => '15', + 'maxlength' => '255' + ), + 'netmask' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '255.255.255.0', + 'validators' => array ( 0 => array ( 'type' => 'ISIPV4', + 'errmsg'=> 'netmask_error_wrong'), + ), + 'value' => '', + 'width' => '15', + 'maxlength' => '255' + ), + 'gateway' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '192.168.0.1', + 'validators' => array ( 0 => array ( 'type' => 'ISIPV4', + 'errmsg'=> 'gateway_error_wrong'), + ), + 'value' => '', + 'width' => '15', + 'maxlength' => '255' + ), + 'hostname' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => 'server1.domain.tld', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'hostname_error_empty'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + 'nameservers' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '192.168.0.1,192.168.0.2', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'nameservers_error_empty'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + 'loglevel' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '2', + 'value' => array('0' => 'Debug', '1' => 'Warnings', '2' => 'Errors'), + 'width' => '40', + 'maxlength' => '255' + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + +$form["tabs"]['mail'] = array ( + 'title' => "Mail", + 'width' => 60, + 'template' => "templates/server_config_mail_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'module' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => '', + 'value' => array('postfix_mysql' => 'postfix_mysql') + ), + 'maildir_path' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '/home/vmail/[domain]/[localpart]/', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'maildir_path_error_empty'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + 'homedir_path' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '/home/vmail/', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'homedir_path_error_empty'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + 'pop3_imap_daemon' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => '20', + 'value' => array('courier' => 'Courier', 'dovecot' => 'Dovecot') + ), + 'mail_filter_syntax' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => '20', + 'value' => array('maildrop' => 'Maildrop', 'sieve' => 'Sieve') + ), + 'mailuser_uid' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '5000', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'mailuser_uid_error_empty'), + ), + 'value' => '', + 'width' => '10', + 'maxlength' => '255' + ), + 'mailuser_gid' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '5000', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'mailuser_gid_error_empty'), + ), + 'value' => '', + 'width' => '10', + 'maxlength' => '255' + ), + 'mailuser_name' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => 'vmail', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'mailuser_name_error_empty'), + ), + 'value' => '', + 'width' => '10', + 'maxlength' => '255' + ), + 'mailuser_group' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => 'vmail', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'mailuser_group_error_empty'), + ), + 'value' => '', + 'width' => '10', + 'maxlength' => '255' + ), + 'relayhost' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + 'relayhost_user' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + 'relayhost_password' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + 'mailbox_size_limit' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '0', + 'value' => '', + 'width' => '10', + 'maxlength' => '15' + ), + 'message_size_limit' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '0', + 'value' => '', + 'width' => '10', + 'maxlength' => '15' + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + +$form["tabs"]['getmail'] = array ( + 'title' => "Getmail", + 'width' => 80, + 'template' => "templates/server_config_getmail_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'getmail_config_dir' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'getmail_config_dir_error_empty'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + +$form["tabs"]['web'] = array ( + 'title' => "Web", + 'width' => 60, + 'template' => "templates/server_config_web_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'website_basedir' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'website_basedir_error_empty'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + 'website_path' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'website_path_error_empty'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + 'website_symlinks' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'website_symlinks_error_empty'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + 'vhost_conf_dir' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'vhost_conf_dir_error_empty'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + 'vhost_conf_enabled_dir' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'vhost_conf_enabled_dir_error_empty'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + 'security_level' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => '20', + 'value' => array('10' => 'Medium', '20' => 'High') + ), + 'user' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'apache_user_error_empty'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + 'group' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'apache_group_error_empty'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + 'php_open_basedir' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'php_open_basedir_error_empty'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + 'htaccess_allow_override' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'htaccess_allow_override_error_empty'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + 'apps_vhost_port' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '8081', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'apps_vhost_port_error_empty'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + 'apps_vhost_ip' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '_default_', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'apps_vhost_ip_error_empty'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + 'apps_vhost_servername' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + +$form["tabs"]['dns'] = array ( + 'title' => "DNS", + 'width' => 60, + 'template' => "templates/server_config_dns_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'bind_user' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'bind_user_error_empty'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + 'bind_group' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'bind_group_error_empty'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + 'bind_zonefiles_dir' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'bind_zonefiles_dir_error_empty'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + 'named_conf_path' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'named_conf_path_error_empty'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + 'named_conf_local_path' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'named_conf_local_path_error_empty'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + +$form["tabs"]['fastcgi'] = array ( + 'title' => "FastCGI", + 'width' => 80, + 'template' => "templates/server_config_fastcgi_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'fastcgi_starter_path' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'fastcgi_starter_path_error_empty'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + 'fastcgi_starter_script' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'fastcgi_starter_script_error_empty'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + 'fastcgi_alias' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'fastcgi_alias_error_empty'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + 'fastcgi_phpini_path' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'fastcgi_phpini_path_error_empty'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + 'fastcgi_children' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'fastcgi_children_error_empty'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + 'fastcgi_max_requests' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'fastcgi_max_requests_error_empty'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + 'fastcgi_bin' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'fastcgi_bin_error_empty'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + +$form["tabs"]['jailkit'] = array ( + 'title' => "Jailkit", + 'width' => 80, + 'template' => "templates/server_config_jailkit_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'jailkit_chroot_home' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'jailkit_chroot_home_error_empty'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + 'jailkit_chroot_app_sections' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'jailkit_chroot_app_sections_error_empty'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '1000' + ), + 'jailkit_chroot_app_programs' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'jailkit_chroot_app_programs_error_empty'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '1000' + ), + 'jailkit_chroot_cron_programs' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'jailkit_chroot_cron_programs_error_empty'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '1000' + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + +$form["tabs"]['vlogger'] = array ( + 'title' => "vlogger", + 'width' => 80, + 'template' => "templates/server_config_vlogger_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'config_dir' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'vlogger_config_dir_error_empty'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + + +$form["tabs"]['cron'] = array ( + 'title' => "Cron", + 'width' => 80, + 'template' => "templates/server_config_cron_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'init_script' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'cron_init_script_error_empty'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + 'crontab_dir' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'crontab_dir_error_empty'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + 'wget' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'cron_wget_error_empty'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + + + + + + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/form/server_ip.tform.php b/interface/ispconfig/interface/admin/form/server_ip.tform.php new file mode 100644 index 0000000000000000000000000000000000000000..d0f12dae8f0198cace5296f50f7e5198bed076f8 --- /dev/null +++ b/interface/ispconfig/interface/admin/form/server_ip.tform.php @@ -0,0 +1,125 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['server_ip'] = array ( + 'title' => "IP Address", + 'width' => 80, + 'template' => "templates/server_ip_edit.htm", + 'fields' => array ( + ################################## + # Beginn Datenbankfelder + ################################## + 'server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'value' => '' + ), + 'ip_address' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISIPV4', + 'errmsg'=> 'ip_error_wrong'), + 1 => array ( 'type' => 'UNIQUE', + 'errmsg'=> 'ip_error_unique'), + ), + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '15', + 'maxlength' => '15', + 'rows' => '', + 'cols' => '' + ), + 'virtualhost' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(0 => 'n',1 => 'y') + ), + ################################## + # ENDE Datenbankfelder + ################################## + ) +); +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/form/software_repo.tform.php b/interface/ispconfig/interface/admin/form/software_repo.tform.php new file mode 100644 index 0000000000000000000000000000000000000000..361d93c7944b6db1f62d962005ee8d7b7e1aaaa9 --- /dev/null +++ b/interface/ispconfig/interface/admin/form/software_repo.tform.php @@ -0,0 +1,153 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['software_repo'] = array ( + 'title' => "Repository", + 'width' => 80, + 'template' => "templates/software_repo_edit.htm", + 'fields' => array ( + ################################## + # Beginn Datenbankfelder + ################################## + 'repo_name' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'repo_name_empty'), + 1 => array ( 'type' => 'UNIQUE', + 'errmsg'=> 'repo_name_unique'), + ), + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '40', + 'maxlength' => '40', + 'rows' => '', + 'cols' => '' + ), + 'repo_url' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'repo_name_empty'), + 1 => array ( 'type' => 'UNIQUE', + 'errmsg'=> 'repo_name_unique'), + ), + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '40', + 'maxlength' => '40', + 'rows' => '', + 'cols' => '' + ), + 'repo_username' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '30', + 'rows' => '', + 'cols' => '' + ), + 'repo_password' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'PASSWORD', + 'encryption' => 'CLEARTEXT', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '30', + 'rows' => '', + 'cols' => '' + ), + 'active' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(0 => 'n',1 => 'y') + ), + ################################## + # ENDE Datenbankfelder + ################################## + ) +); +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/form/system_config.tform.php b/interface/ispconfig/interface/admin/form/system_config.tform.php new file mode 100644 index 0000000000000000000000000000000000000000..2ce24c52f2214faad8f731f6ac7bf0e5ccca03ce --- /dev/null +++ b/interface/ispconfig/interface/admin/form/system_config.tform.php @@ -0,0 +1,167 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['sites'] = array ( + 'title' => "Sites", + 'width' => 70, + 'template' => "templates/system_config_sites_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'dbname_prefix' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'REGEX', + 'regex' => '/^[a-zA-Z0-0\-\_\[\]]{0,50}$/', + 'errmsg'=> 'dbname_prefix_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'dbuser_prefix' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'REGEX', + 'regex' => '/^[a-zA-Z0-0\-\_\[\]]{0,50}$/', + 'errmsg'=> 'dbuser_prefix_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'ftpuser_prefix' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'REGEX', + 'regex' => '/^[a-zA-Z0-0\-\_\[\]]{0,50}$/', + 'errmsg'=> 'ftpuser_prefix_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'shelluser_prefix' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'REGEX', + 'regex' => '/^[a-zA-Z0-0\-\_\[\]]{0,50}$/', + 'errmsg'=> 'shelluser_prefix_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'dblist_phpmyadmin_link' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'n', + 'value' => array(0 => 'n',1 => 'y') + ), + 'phpmyadmin_url' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'REGEX', + 'regex' => '/^[0-9a-zA-Z\:\/\-\.]{0,255}$/', + 'errmsg'=> 'phpmyadmin_url_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + +$form["tabs"]['mail'] = array ( + 'title' => "Mail", + 'width' => 70, + 'template' => "templates/system_config_mail_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'mailboxlist_webmail_link' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'n', + 'value' => array(0 => 'n',1 => 'y') + ), + 'webmail_url' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'REGEX', + 'regex' => '/^[0-9a-zA-Z\:\/\-\.]{0,255}$/', + 'errmsg'=> 'webmail_url_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/form/users.tform.php b/interface/ispconfig/interface/admin/form/users.tform.php new file mode 100644 index 0000000000000000000000000000000000000000..1edbb0cc432afbb6a0e7dd78dd54c095ed3d7624 --- /dev/null +++ b/interface/ispconfig/interface/admin/form/users.tform.php @@ -0,0 +1,456 @@ + 0 id must match with id of current user +$form['auth_preset']['userid'] = 0; +//* 0 = default groupid of the user, > 0 id must match with groupid of current user +$form['auth_preset']['groupid'] = 0; + +//** Permissions are: r = read, i = insert, u = update, d = delete +$form['auth_preset']['perm_user'] = 'riud'; +$form['auth_preset']['perm_group'] = 'riud'; +$form['auth_preset']['perm_other'] = ''; + +//* Pick out modules +$modules_list = array(); +$handle = @opendir(ISPC_WEB_PATH); +while ($file = @readdir ($handle)) { + if ($file != '.' && $file != '..') { + if(@is_dir(ISPC_WEB_PATH."/$file")) { + if(is_file(ISPC_WEB_PATH."/$file/lib/module.conf.php") and $file != 'login' && $file != 'designer') { + $modules_list[$file] = $file; + } + } + } +} + +//* Load themes +$themes_list = array(); +$handle = @opendir(ISPC_THEMES_PATH); +while ($file = @readdir ($handle)) { + if (substr($file, 0, 1) != '.') { + if(@is_dir(ISPC_THEMES_PATH."/$file")) { + $themes_list[$file] = $file; + } + } +} + +//* Languages +$language_list = array(); +$handle = @opendir(ISPC_ROOT_PATH.'/lib/lang'); +while ($file = @readdir ($handle)) { + if ($file != '.' && $file != '..') { + if(@is_file(ISPC_ROOT_PATH.'/lib/lang/'.$file) and substr($file,-4,4) == '.lng') { + $tmp = substr($file, 0, 2); + $language_list[$tmp] = $tmp; + } + } +} + +//* Pick out groups +$groups_list = array(); +$tmp_records = $app->db->queryAllRecords('SELECT groupid, name FROM sys_group ORDER BY name'); +if(is_array($tmp_records)) { + foreach($tmp_records as $tmp_rec) { + $groups_list[$tmp_rec['groupid']] = $tmp_rec['name']; + } +} + +$form['tabs']['users'] = array ( + 'title' => 'Users', + 'width' => 80, + 'template' => 'templates/users_user_edit.htm', + 'fields' => array ( + ################################## + # Beginn Datenbankfelder + ################################## + 'username' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'username_empty'), + 1 => array ( 'type' => 'UNIQUE', + 'errmsg'=> 'username_unique'), + 2 => array ( 'type' => 'REGEX', + 'regex' => '/^[\w\.\-\_]{0,64}$/', + 'errmsg'=> 'username_err'), + ), + 'regex' => '', + 'errmsg' => '', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '15', + 'maxlength' => '30', + 'rows' => '', + 'cols' => '' + ), + 'passwort' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'PASSWORD', + 'encryption'=> 'CRYPT', + 'regex' => '', + 'errmsg' => '', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '15', + 'maxlength' => '100', + 'rows' => '', + 'cols' => '' + ), + 'modules' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOXARRAY', + 'regex' => '', + 'errmsg' => '', + 'default' => 'admin,forms', + 'value' => $modules_list, + 'separator' => ',', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'startmodule' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'regex' => '', + 'errmsg' => '', + 'default' => '', + 'value' => $modules_list, + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'app_theme' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'RADIO', + 'regex' => '', + 'errmsg' => '', + 'default' => 'default', + 'value' => $themes_list, + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'typ' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'RADIO', + 'regex' => '', + 'errmsg' => '', + 'default' => 'user', + 'value' => array ('user' => 'user', 'admin' => 'admin'), + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'active' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'CHECKBOX', + 'regex' => '', + 'errmsg' => '', + 'default' => '', + 'value' => array(0 => 0,1 => 1), + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'language' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'regex' => '', + 'errmsg' => '', + 'default' => '', + 'value' => $language_list, + 'separator' => '', + 'width' => '30', + 'maxlength' => '2', + 'rows' => '', + 'cols' => '' + ) + ################################## + # ENDE Datenbankfelder + ################################## + ) +); +/* +$form['tabs']['address'] = array ( + 'title' => 'Address', + 'width' => 80, + 'template' => 'templates/users_address_edit.htm', + 'fields' => array ( + ################################## + # Beginn Datenbankfelder + ################################## + 'name' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'regex' => '', + 'errmsg' => '', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'vorname' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'regex' => '', + 'errmsg' => '', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'unternehmen' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'regex' => '', + 'errmsg' => '', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'strasse' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'regex' => '', + 'errmsg' => '', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'ort' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'regex' => '', + 'errmsg' => '', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'plz' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'regex' => '', + 'errmsg' => '', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'land' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'regex' => '', + 'errmsg' => '', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'email' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'regex' => '', + 'errmsg' => '', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'url' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'regex' => '', + 'errmsg' => '', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'telefon' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'regex' => '', + 'errmsg' => '', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'fax' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'regex' => '', + 'errmsg' => '', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ) + + ################################## + # ENDE Datenbankfelder + ################################## + ) +); +*/ + +$form['tabs']['groups'] = array ( + 'title' => 'Groups', + 'width' => 80, + 'template' => 'templates/users_groups_edit.htm', + 'fields' => array ( + ################################## + # Beginn Datenbankfelder + ################################## + 'default_group' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'regex' => '', + 'errmsg' => '', + 'default' => '', + 'value' => $groups_list, + 'separator' => ',', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'groups' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOXARRAY', + 'regex' => '', + 'errmsg' => '', + 'default' => '', + 'value' => $groups_list, + 'separator' => ',', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ) + + ################################## + # ENDE Datenbankfelder + ################################## + ) +); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/groups_del.php b/interface/ispconfig/interface/admin/groups_del.php new file mode 100644 index 0000000000000000000000000000000000000000..a7a804db59c344aa6acc286ed5e884c1b8e89a9e --- /dev/null +++ b/interface/ispconfig/interface/admin/groups_del.php @@ -0,0 +1,51 @@ +auth->check_module_permissions('admin'); + +$app->uses("tform_actions"); +$app->tform_actions->onDelete(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/groups_edit.php b/interface/ispconfig/interface/admin/groups_edit.php new file mode 100644 index 0000000000000000000000000000000000000000..bee5976db23e01ac2cd206e632dd6a1a16d63735 --- /dev/null +++ b/interface/ispconfig/interface/admin/groups_edit.php @@ -0,0 +1,53 @@ +auth->check_module_permissions('admin'); + +// Loading classes +$app->uses('tpl,tform,tform_actions'); + +// let tform_actions handle the page +$app->tform_actions->onLoad(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/groups_list.php b/interface/ispconfig/interface/admin/groups_list.php new file mode 100644 index 0000000000000000000000000000000000000000..fee6a17bbc2f138adf202d2093c2a88ef9405615 --- /dev/null +++ b/interface/ispconfig/interface/admin/groups_list.php @@ -0,0 +1,51 @@ +auth->check_module_permissions('admin'); + +$app->uses('listform_actions'); +$app->listform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/index.php b/interface/ispconfig/interface/admin/index.php new file mode 100644 index 0000000000000000000000000000000000000000..50afd7bca5c810acfcd7d7a658063c6527de4851 --- /dev/null +++ b/interface/ispconfig/interface/admin/index.php @@ -0,0 +1,78 @@ +uses('tpl'); + $app->tpl->newTemplate("form.tpl.htm"); + + $app->tpl->setVar('error',$error); + $app->tpl->setInclude('content_tpl','admin/templates/index.htm'); + return $app->tpl->grab(); + /* + $filename = 'test.txt'; +$somecontent = $app->tpl->grab(); + +// Sichergehen, dass die Datei existiert und beschreibbar ist + + + // Wir ffnen $filename im "Anhnge" - Modus. + // Der Dateizeiger befindet sich am Ende der Datei, und + // dort wird $somecontent spter mit fwrite() geschrieben. + if (!$handle = fopen($filename, "w")) { + print "Kann die Datei $filename nicht ffnen"; + exit; + } + + // Schreibe $somecontent in die geffnete Datei. + if (!fwrite($handle, $somecontent)) { + print "Kann in die Datei $filename nicht schreiben"; + exit; + } + + + fclose($handle); + + + + + return 'dd'; + */ + } +} + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/language_add.php b/interface/ispconfig/interface/admin/language_add.php new file mode 100644 index 0000000000000000000000000000000000000000..9ab9adccc941c7f1a580d131ab5b6dc29ea1591c --- /dev/null +++ b/interface/ispconfig/interface/admin/language_add.php @@ -0,0 +1,104 @@ +auth->check_module_permissions('admin'); + +//* This is only allowed for administrators +if(!$app->auth->is_admin()) die('only allowed for administrators.'); + +$app->uses('tpl'); + +$app->tpl->newTemplate('form.tpl.htm'); +$app->tpl->setInclude('content_tpl', 'templates/language_add.htm'); + +//* reading languages +$language_option = ''; +$error = ''; +$msg = ''; +$selected_language = (isset($_REQUEST['lng_select']))?substr($_REQUEST['lng_select'],0,2):'en'; +if(!preg_match("/^[a-z]{2}$/i", $selected_language)) die('unallowed characters in selected language name.'); + +$handle = opendir(ISPC_ROOT_PATH.'/lib/lang/'); +while ($file = readdir ($handle)) { + if ($file != '.' && $file != '..') { + $tmp_lng = substr($file,0,-4); + if($tmp_lng !='') { + $selected = ($tmp_lng == $selected_language)?'SELECTED':''; + $language_option .= ""; + if(isset($_POST['lng_new']) && $_POST['lng_new'] == $tmp_lng) $error = 'Language exists already.'; + } + } +} +$app->tpl->setVar('language_option',$language_option); +$app->tpl->setVar('error',$error); + +if(isset($_POST['lng_new']) && strlen($_POST['lng_new']) == 2 && $error == '') { + $lng_new = $_POST['lng_new']; + if(!preg_match("/^[a-z]{2}$/i", $lng_new)) die('unallowed characters in language name.'); + + //* Copy the main language file + copy(ISPC_LIB_PATH."/lang/$selected_language.lng",ISPC_LIB_PATH."/lang/$lng_new.lng"); + + //* Make a copy of every language file + $bgcolor = '#FFFFFF'; + $language_files_list = array(); + $handle = @opendir(ISPC_WEB_PATH); + while ($file = @readdir ($handle)) { + if ($file != '.' && $file != '..') { + if(@is_dir(ISPC_WEB_PATH.'/'.$file.'/lib/lang')) { + $handle2 = opendir(ISPC_WEB_PATH.'/'.$file.'/lib/lang'); + while ($lang_file = @readdir ($handle2)) { + if ($lang_file != '.' && $lang_file != '..' && substr($lang_file,0,2) == $selected_language) { + $new_lang_file = $lng_new.substr($lang_file,2); + //echo ISPC_WEB_PATH.'/'.$file.'/lib/lang/'.$lang_file.' ## '.ISPC_WEB_PATH.'/'.$file.'/lib/lang/'.$new_lang_file; + copy(ISPC_WEB_PATH.'/'.$file.'/lib/lang/'.$lang_file,ISPC_WEB_PATH.'/'.$file.'/lib/lang/'.$new_lang_file); + $msg = 'Added new language '.$lng_new; + } + } + } + } + } +} + +$app->tpl->setVar('msg',$msg); + +//* load language file +$lng_file = 'lib/lang/'.$_SESSION['s']['language'].'_language_add.lng'; +include($lng_file); +$app->tpl->setVar($wb); + +$app->tpl_defaults(); +$app->tpl->pparse(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/language_complete.php b/interface/ispconfig/interface/admin/language_complete.php new file mode 100644 index 0000000000000000000000000000000000000000..0906a52b54d2beb91e8772e2bbad454e36ff5b69 --- /dev/null +++ b/interface/ispconfig/interface/admin/language_complete.php @@ -0,0 +1,167 @@ +auth->check_module_permissions('admin'); + +//* This is only allowed for administrators +if(!$app->auth->is_admin()) die('only allowed for administrators.'); + +$app->uses('tpl'); + +$app->tpl->newTemplate('form.tpl.htm'); +$app->tpl->setInclude('content_tpl', 'templates/language_complete.htm'); + +//* reading languages +$language_option = ''; +$error = ''; +$msg = ''; +$selected_language = (isset($_REQUEST['lng_select']))?substr($_REQUEST['lng_select'],0,2):'en'; +if(!preg_match("/^[a-z]{2}$/i", $selected_language)) die('unallowed characters in selected language name.'); + +$handle = opendir(ISPC_ROOT_PATH.'/lib/lang/'); +while ($file = readdir ($handle)) { + if ($file != '.' && $file != '..') { + $tmp_lng = substr($file,0,-4); + if($tmp_lng !='' && $tmp_lng != 'en') { + $selected = ($tmp_lng == $selected_language)?'SELECTED':''; + $language_option .= ""; + //if(isset($_POST['lng_new']) && $_POST['lng_new'] == $tmp_lng) $error = 'Language exists already.'; + } + } +} +$app->tpl->setVar('language_option',$language_option); +$app->tpl->setVar('error',$error); + +// Export the language file +if(isset($_POST['lng_select']) && $error == '') { + + // complete the global langauge file + merge_langfile(ISPC_LIB_PATH."/lang/".$selected_language.".lng",ISPC_LIB_PATH."/lang/en.lng"); + + // Go trough all language files + $bgcolor = '#FFFFFF'; + $language_files_list = array(); + $handle = @opendir(ISPC_WEB_PATH); + while ($file = @readdir ($handle)) { + if ($file != '.' && $file != '..') { + if(@is_dir(ISPC_WEB_PATH.'/'.$file.'/lib/lang')) { + $handle2 = opendir(ISPC_WEB_PATH.'/'.$file.'/lib/lang'); + while ($lang_file = @readdir ($handle2)) { + if ($lang_file != '.' && $lang_file != '..' && substr($lang_file,0,2) == 'en') { + $target_lang_file = $selected_language.substr($lang_file,2); + merge_langfile(ISPC_WEB_PATH.'/'.$file.'/lib/lang/'.$target_lang_file,ISPC_WEB_PATH.'/'.$file.'/lib/lang/'.$lang_file); + } + } + $handle2 = opendir(ISPC_WEB_PATH.'/'.$file.'/lib/lang'); + while ($lang_file = @readdir ($handle2)) { + if ($lang_file != '.' && $lang_file != '..' && substr($lang_file,0,2) == $selected_language) { + $master_lang_file=ISPC_WEB_PATH.'/'.$file.'/lib/lang/en'.substr($lang_file,2); + $target_lang_file=ISPC_WEB_PATH.'/'.$file.'/lib/lang/'.$lang_file; + if(!file_exists($master_lang_file)){ + unlink($target_lang_file); + $msg.="File $target_lang_file removed because does not exist in master language
"; + } + } + }//Finish of remove the files how not exists in master language + } + } + } +if($msg=='') +$msg="No files created, removed or modified
"; +} + +function merge_langfile($langfile,$masterfile) { + global $msg; + + if(is_file($langfile)) { + + // Load the english language file + include($masterfile); + if(isset($wb) && is_array($wb)) { + $wb_master = $wb; + unset($wb); + } else { + $wb_master = array(); + } + + // Load the incomplete language file + $wb = array(); + include($langfile); + + $n = 0; + foreach($wb_master as $key => $val) { + if(!isset($wb[$key])) { + $wb[$key] = $val; + $n++; + } + } + + $r = 0; + foreach($wb as $key => $val) { + if(!isset($wb_master[$key])) { + unset($wb[$key]); + $r++; + } + } + + $file_content = " $val) { + $val = str_replace("'",'',$val); + $val = str_replace('"','',$val); + $file_content .= '$wb['."'$key'".'] = '."'$val';\n"; + } + $file_content .= "?>\n"; + + if($n!=0) + $msg .= "Added $n lines to the file $langfile
"; + if($r!=0) + $msg .= "Removed $r lines to the file $langfile
"; + file_put_contents($langfile ,$file_content); + } else { + $msg .= "File does not exist yet. Copied file $masterfile to $langfile
"; + copy($masterfile,$langfile); + } +} + +$app->tpl->setVar('msg',$msg); + +//* load language file +$lng_file = 'lib/lang/'.$_SESSION['s']['language'].'_language_complete.lng'; +include($lng_file); +$app->tpl->setVar($wb); + +$app->tpl_defaults(); +$app->tpl->pparse(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/language_edit.php b/interface/ispconfig/interface/admin/language_edit.php new file mode 100644 index 0000000000000000000000000000000000000000..d76dc62a8bc4028ccffa809ce7384f6c6743f429 --- /dev/null +++ b/interface/ispconfig/interface/admin/language_edit.php @@ -0,0 +1,104 @@ +auth->check_module_permissions('admin'); + +//* This is only allowed for administrators +if(!$app->auth->is_admin()) die('only allowed for administrators.'); + +$app->uses('tpl'); + +$app->tpl->newTemplate('form.tpl.htm'); +$app->tpl->setInclude('content_tpl', 'templates/language_edit.htm'); + +$lang = $_REQUEST['lang']; +$module = $_REQUEST['module']; +$lang_file = $_REQUEST['lang_file']; + +if(!preg_match("/^[a-z]+$/i", $lang)) die('unallowed characters in language name.'); +if(!preg_match("/^[a-z_]+$/i", $module)) die('unallowed characters in module name.'); +if(!preg_match("/^[a-z\._]+$/i", $lang_file)) die('unallowed characters in language file name.'); + +$msg = ''; + +//* Save data +if(isset($_POST['records']) && is_array($_POST['records'])) { + $file_content = " $val) { + $val = stripslashes($val); + $val = str_replace('"','\"',$val); + $val = str_replace('$','',$val); + $file_content .= '$wb['."'$key'".'] = "'.$val.'";'."\n"; + $msg = 'File saved.'; + } + $file_content .= "?>\n"; + if($module == 'global') { + file_put_contents(ISPC_LIB_PATH."/lang/$lang_file" ,$file_content); + } else { + file_put_contents(ISPC_WEB_PATH."/$module/lib/lang/$lang_file" ,$file_content); + } +} + + +$app->tpl->setVar(array('module' => $module,'lang_file' => $lang_file, 'lang' => $lang, 'msg' => $msg)); + +if($module == 'global') { + include(ISPC_LIB_PATH."/lang/$lang_file"); + $file_path = ISPC_LIB_PATH."/lang/$lang_file"; +} else { + include(ISPC_WEB_PATH."/$module/lib/lang/$lang_file"); + $file_path = ISPC_WEB_PATH."/$module/lib/lang/$lang_file"; +} +$app->tpl->setVar("file_path", $file_path); + +$keyword_list = array(); +if(isset($wb) && is_array($wb)) { + foreach($wb as $key => $val) { + $keyword_list[] = array('key' => $key, 'val' => $val); + } + + $app->tpl->setLoop('records', $keyword_list); + unset($wb); +} + + +//* load language file +$lng_file = 'lib/lang/'.$_SESSION['s']['language'].'_language_edit.lng'; +include($lng_file); +$app->tpl->setVar($wb); + +$app->tpl_defaults(); +$app->tpl->pparse(); + + +?> diff --git a/interface/ispconfig/interface/admin/language_export.php b/interface/ispconfig/interface/admin/language_export.php new file mode 100644 index 0000000000000000000000000000000000000000..eb5790bf19d1d3805baada7cc233ca9d1263b84d --- /dev/null +++ b/interface/ispconfig/interface/admin/language_export.php @@ -0,0 +1,120 @@ +auth->check_module_permissions('admin'); + +//* This is only allowed for administrators +if(!$app->auth->is_admin()) die('only allowed for administrators.'); + +$app->uses('tpl'); + +$app->tpl->newTemplate('form.tpl.htm'); +$app->tpl->setInclude('content_tpl', 'templates/language_export.htm'); + +//* reading languages +$language_option = ''; +$error = ''; +$msg = ''; +$selected_language = (isset($_REQUEST['lng_select']))?substr($_REQUEST['lng_select'],0,2):'en'; +if(!preg_match("/^[a-z]{2}$/i", $selected_language)) die('unallowed characters in selected language name.'); + +$handle = opendir(ISPC_ROOT_PATH.'/lib/lang/'); +while ($file = readdir ($handle)) { + if ($file != '.' && $file != '..') { + $tmp_lng = substr($file,0,-4); + if($tmp_lng !='') { + $selected = ($tmp_lng == $selected_language)?'SELECTED':''; + $language_option .= ""; + //if(isset($_POST['lng_new']) && $_POST['lng_new'] == $tmp_lng) $error = 'Language exists already.'; + } + } +} +$app->tpl->setVar('language_option',$language_option); +$app->tpl->setVar('error',$error); + +// Export the language file +if(isset($_POST['lng_select']) && $error == '') { + //$lng_select = $_POST['lng_select']; + //if(!preg_match("/^[a-z]{2}$/i", $lng_select)) die('unallowed characters in language name.'); + + // This variable contains the content of the language files + $content = ''; + $content .= "---|ISPConfig Language File|".$conf["app_version"]."|".$selected_language."\n"; + + //* get the global language file + $content .= "--|global|".$selected_language."|".$selected_language.".lng\n"; + $content .= file_get_contents(ISPC_LIB_PATH."/lang/".$selected_language.".lng")."\n"; + + //* Get the global file of the module + //$content .= "---|$module|$selected_language|\n"; + //copy(ISPC_WEB_PATH."/$module/lib/lang/$selected_language.lng",ISPC_WEB_PATH."/$module/lib/lang/$lng_new.lng"); + $bgcolor = '#FFFFFF'; + $language_files_list = array(); + $handle = @opendir(ISPC_WEB_PATH); + while ($file = @readdir ($handle)) { + if ($file != '.' && $file != '..') { + if(@is_dir(ISPC_WEB_PATH.'/'.$file.'/lib/lang')) { + $handle2 = opendir(ISPC_WEB_PATH.'/'.$file.'/lib/lang'); + while ($lang_file = @readdir ($handle2)) { + if ($lang_file != '.' && $lang_file != '..' && substr($lang_file,0,2) == $selected_language) { + $content .= "--|".$file."|".$selected_language."|".$lang_file."\n"; + $content .= file_get_contents(ISPC_WEB_PATH.'/'.$file.'/lib/lang/'.$lang_file)."\n"; + $msg .= 'Exported language file '.$lang_file.'
'; + } + } + } + } + } + + $content .= '---|EOF'; + + // Write the language file + file_put_contents(ISPC_WEB_TEMP_PATH.'/'.$selected_language.'.lng', $content); + + $msg = "Exported language file to: /temp/".$selected_language.'.lng'; + + //$msg = nl2br($content); +} + +$app->tpl->setVar('msg',$msg); + +//* load language file +$lng_file = 'lib/lang/'.$_SESSION['s']['language'].'_language_export.lng'; +include($lng_file); +$app->tpl->setVar($wb); + +$app->tpl_defaults(); +$app->tpl->pparse(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/language_import.php b/interface/ispconfig/interface/admin/language_import.php new file mode 100644 index 0000000000000000000000000000000000000000..12eb86d4abc19d12e659aafedb4edb6507099012 --- /dev/null +++ b/interface/ispconfig/interface/admin/language_import.php @@ -0,0 +1,105 @@ +auth->check_module_permissions('admin'); + +//* This is only allowed for administrators +if(!$app->auth->is_admin()) die('only allowed for administrators.'); + +$app->uses('tpl'); + +$app->tpl->newTemplate('form.tpl.htm'); +$app->tpl->setInclude('content_tpl', 'templates/language_import.htm'); +$msg = ''; +$error = ''; + +// Export the language file +if(isset($_FILES['file']['name']) && is_uploaded_file($_FILES['file']['tmp_name'])) { + $lines = file($_FILES['file']['tmp_name']); + // initial check + $parts = explode('|',$lines[0]); + if($parts[0] == '---' && $parts[1] == 'ISPConfig Language File') { + if($_POST['ignore_version'] != 1 && $parts[2] != $conf["app_version"]) { + $error .= 'Application version does not match. Appversion: '.$conf["app_version"].' Lanfile version: '.$parts[2]; + } else { + unset($lines[0]); + + $buffer = ''; + $langfile_path = ''; + // all other lines + foreach($lines as $line) { + $parts = explode('|',$line); + if(is_array($parts) && count($parts) > 0 && $parts[0] == '--') { + // Write language file, if its not the first file + if($buffer != '' && $langfile_path != '') { + if(@$_REQUEST['overwrite'] != 1 && @is_file($langfile_path)) { + $error .= "File exists, not written: $langfile_path
"; + } else { + $msg .= "File written: $langfile_path
"; + file_put_contents($langfile_path,$buffer); + } + } + // empty buffer and set variables + $buffer = ''; + $module_name = trim($parts[1]); + $selected_language = trim($parts[2]); + $file_name = trim($parts[3]); + if(!preg_match("/^[a-z]{2}$/i", $selected_language)) die("unallowed characters in selected language name: $selected_language"); + if(!preg_match("/^[a-z_]+$/i", $module_name)) die('unallowed characters in module name.'); + if(!preg_match("/^[a-z\._]+$/i", $file_name) || stristr($file_name,'..')) die("unallowed characters in language file name: '$file_name'"); + if($module_name == 'global') { + $langfile_path = trim(ISPC_LIB_PATH."/lang/".$selected_language.".lng"); + } else { + $langfile_path = trim(ISPC_WEB_PATH.'/'.$module_name.'/lib/lang/'.$file_name); + } + } else { + $buffer .= $line; + } + } + } + } +} + +$app->tpl->setVar('msg',$msg); +$app->tpl->setVar('error',$error); + +//* load language file +$lng_file = 'lib/lang/'.$_SESSION['s']['language'].'_language_import.lng'; +include($lng_file); +$app->tpl->setVar($wb); + +$app->tpl_defaults(); +$app->tpl->pparse(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/language_list.php b/interface/ispconfig/interface/admin/language_list.php new file mode 100644 index 0000000000000000000000000000000000000000..f423be4cc5b397a68ab9d51276bd57268dbef133 --- /dev/null +++ b/interface/ispconfig/interface/admin/language_list.php @@ -0,0 +1,108 @@ +auth->check_module_permissions('admin'); + +//* This is only allowed for administrators +if(!$app->auth->is_admin()) die('only allowed for administrators.'); + +$app->uses('tpl'); + +$app->tpl->newTemplate('form.tpl.htm'); +$app->tpl->setInclude('content_tpl', 'templates/language_list.htm'); + +$language_files_list = array(); +$bgcolor = '#FFFFFF'; + +//* reading languages +$language_option = ''; +$selected_language = (isset($_REQUEST['lng_select']))?substr($_REQUEST['lng_select'],0,2):$_SESSION['s']['language']; +$handle = opendir(ISPC_ROOT_PATH.'/lib/lang/'); +while ($file = readdir ($handle)) { + if ($file != '.' && $file != '..') { + $tmp_lng = substr($file,0,-4); + if($tmp_lng !='') { + $selected = ($tmp_lng == $selected_language)?'SELECTED':''; + $language_option .= ""; + + //$bgcolor = ($bgcolor == '#FFFFFF') ? '#EEEEEE' : '#FFFFFF'; + if($file == $selected_language.'.lng') { + $language_files_list[] = array( 'module' => 'global', + 'lang_file' => $file, + 'lang_file_date' => date("Y-m-d H:i:s", filectime(ISPC_ROOT_PATH.'/lib/lang/'.$file)), + 'bgcolor' => $bgcolor, + 'lang' => $selected_language); + } + + + } + } +} +$app->tpl->setVar('language_option',$language_option); +// $app->tpl->setLoop('records', $language_list); + +//* list all language files of the selected language +$handle = @opendir(ISPC_WEB_PATH); +while ($file = @readdir ($handle)) { + if ($file != '.' && $file != '..') { + if(@is_dir(ISPC_WEB_PATH.'/'.$file.'/lib/lang')) { + $handle2 = opendir(ISPC_WEB_PATH.'/'.$file.'/lib/lang'); + while ($lang_file = @readdir ($handle2)) { + if ($lang_file != '.' && $lang_file != '..' && substr($lang_file,0,2) == $selected_language) { + $bgcolor = ($bgcolor == '#FFFFFF') ? '#EEEEEE' : '#FFFFFF'; + $language_files_list[] = array( 'module' => $file, + 'lang_file' => $lang_file, + 'lang_file_date' => date("Y-m-d H:i:s", filectime(ISPC_WEB_PATH.'/'.$file.'/lib/lang/'.$lang_file)), + 'bgcolor' => $bgcolor, + 'lang' => $selected_language); + } + } + } + } +} + +$app->tpl->setLoop('records', $language_files_list); + + + + +//* load language file +$lng_file = 'lib/lang/'.$_SESSION['s']['language'].'_language_list.lng'; +include($lng_file); +$app->tpl->setVar($wb); + +$app->tpl_defaults(); +$app->tpl->pparse(); + + +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/bg.lng b/interface/ispconfig/interface/admin/lib/lang/bg.lng new file mode 100644 index 0000000000000000000000000000000000000000..8a1c30b48ae427bf10f741eedc907227296272d2 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/bg.lng @@ -0,0 +1,40 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/bg_firewall.lng b/interface/ispconfig/interface/admin/lib/lang/bg_firewall.lng new file mode 100644 index 0000000000000000000000000000000000000000..e626345d3c1ee3bbce74ffd70c36fcc7ff3297c2 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/bg_firewall.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/bg_firewall_list.lng b/interface/ispconfig/interface/admin/lib/lang/bg_firewall_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..24a34be1c121271493b5c469f3defce76a660523 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/bg_firewall_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/bg_groups.lng b/interface/ispconfig/interface/admin/lib/lang/bg_groups.lng new file mode 100644 index 0000000000000000000000000000000000000000..b59c2102caf425f4ba535d6130ab49d14c11ce8f --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/bg_groups.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/bg_groups_list.lng b/interface/ispconfig/interface/admin/lib/lang/bg_groups_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..fcf73a118cef10ddaafcbc5c3a59bd7c9ac900f8 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/bg_groups_list.lng @@ -0,0 +1,7 @@ +WARNING: Do not edit or modify any user settings here. Use the Client- and Reseller settings in the Client module instead. Modifying or changing Users or groups here may cause data loss!'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/bg_language_add.lng b/interface/ispconfig/interface/admin/lib/lang/bg_language_add.lng new file mode 100644 index 0000000000000000000000000000000000000000..2dd36894ed353b9f99da264b97d2dc954bcb9dc5 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/bg_language_add.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/bg_language_complete.lng b/interface/ispconfig/interface/admin/lib/lang/bg_language_complete.lng new file mode 100644 index 0000000000000000000000000000000000000000..30c51c292a4479a563744d95c351ecd1dab83f74 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/bg_language_complete.lng @@ -0,0 +1,7 @@ +Към избрания език ще бъдат добавени файлове и отделни записи, които липсват в него, но съществуват в английския.'; +$wb['language_select_txt'] = 'Изберете език'; +$wb['btn_save_txt'] = 'Сливане'; +$wb['btn_cancel_txt'] = 'Отказ'; +$wb['list_desc_txt'] = 'Merge the selected language file with the english master language file.
This adds missing strings from the english master language files to the selected language.'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/bg_language_edit.lng b/interface/ispconfig/interface/admin/lib/lang/bg_language_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..ce30b66fc18d7fddf8f7786fe050700b3aa1275d --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/bg_language_edit.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/bg_language_export.lng b/interface/ispconfig/interface/admin/lib/lang/bg_language_export.lng new file mode 100644 index 0000000000000000000000000000000000000000..d8e91de25ce9734417c57226939d5fb2452e1a11 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/bg_language_export.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/bg_language_import.lng b/interface/ispconfig/interface/admin/lib/lang/bg_language_import.lng new file mode 100644 index 0000000000000000000000000000000000000000..4d3922ed7e2fb8e9131374a091f61fac0b4ca030 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/bg_language_import.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/bg_language_list.lng b/interface/ispconfig/interface/admin/lib/lang/bg_language_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..2a096aa61342345a794308c20b403245a7b60adf --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/bg_language_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/bg_remote_user.lng b/interface/ispconfig/interface/admin/lib/lang/bg_remote_user.lng new file mode 100644 index 0000000000000000000000000000000000000000..cc9335bc52638b05b2a4419cbb6415daebbca52e --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/bg_remote_user.lng @@ -0,0 +1,42 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/bg_remote_user_list.lng b/interface/ispconfig/interface/admin/lib/lang/bg_remote_user_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..152a75fba4c8917a1829b6960df7291e583d34a7 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/bg_remote_user_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/bg_server.lng b/interface/ispconfig/interface/admin/lib/lang/bg_server.lng new file mode 100644 index 0000000000000000000000000000000000000000..1b42f22c89bb1d1b31c43935eb77ab24fd28db77 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/bg_server.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/bg_server_config.lng b/interface/ispconfig/interface/admin/lib/lang/bg_server_config.lng new file mode 100644 index 0000000000000000000000000000000000000000..16803a9f5cdd6bf7f712f631d086785bf7b369b0 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/bg_server_config.lng @@ -0,0 +1,68 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/bg_server_config_list.lng b/interface/ispconfig/interface/admin/lib/lang/bg_server_config_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..636c2e050a026856a624bbd1ef3613df64544ba7 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/bg_server_config_list.lng @@ -0,0 +1,4 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/bg_server_ip.lng b/interface/ispconfig/interface/admin/lib/lang/bg_server_ip.lng new file mode 100644 index 0000000000000000000000000000000000000000..6d451f5b20bcee9480a6d5fccbc9c38bb974b113 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/bg_server_ip.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/bg_server_ip_list.lng b/interface/ispconfig/interface/admin/lib/lang/bg_server_ip_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..81ae8f01d6e8c9e1fc8e0029ece7fc5462338006 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/bg_server_ip_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/bg_server_list.lng b/interface/ispconfig/interface/admin/lib/lang/bg_server_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..7b42c497e85f27a477d02c860a8c82e730682850 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/bg_server_list.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/bg_software_package_list.lng b/interface/ispconfig/interface/admin/lib/lang/bg_software_package_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..03917cabce20eb163fd64a168a2c8bbaf58599e6 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/bg_software_package_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/bg_software_repo.lng b/interface/ispconfig/interface/admin/lib/lang/bg_software_repo.lng new file mode 100644 index 0000000000000000000000000000000000000000..574dd1162989badc8499f5af31451a43673bf4da --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/bg_software_repo.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/bg_software_repo_list.lng b/interface/ispconfig/interface/admin/lib/lang/bg_software_repo_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..b7a219ffa8e2f6d389fabdc5386286a24fc2a11a --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/bg_software_repo_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/bg_software_update_list.lng b/interface/ispconfig/interface/admin/lib/lang/bg_software_update_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..ebf4e6fbc544390ef8ea9357a33d184062568e27 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/bg_software_update_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/bg_system_config.lng b/interface/ispconfig/interface/admin/lib/lang/bg_system_config.lng new file mode 100644 index 0000000000000000000000000000000000000000..e7f5d9365e01f4adcfe52c7c7aba0075a096283d --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/bg_system_config.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/bg_users.lng b/interface/ispconfig/interface/admin/lib/lang/bg_users.lng new file mode 100644 index 0000000000000000000000000000000000000000..8e70364aa7e32dfaa3066c953250a7af61b1bdfe --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/bg_users.lng @@ -0,0 +1,28 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/bg_users_list.lng b/interface/ispconfig/interface/admin/lib/lang/bg_users_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..0de8cdc3ef4b9567e6413742c7dadf388fa82d83 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/bg_users_list.lng @@ -0,0 +1,9 @@ +WARNING: Do not edit or modify any user settings here. Use the Client- and Reseller settings in the Client module instead. Modifying or changing Users or groups here may cause data loss!'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/br.lng b/interface/ispconfig/interface/admin/lib/lang/br.lng new file mode 100644 index 0000000000000000000000000000000000000000..9debee0b48583fbaaa498d8dbd28670f0b3b47f7 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/br.lng @@ -0,0 +1,40 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/br_firewall.lng b/interface/ispconfig/interface/admin/lib/lang/br_firewall.lng new file mode 100644 index 0000000000000000000000000000000000000000..40a7496af0ab97f0730c20e63df8c6d9c727dc62 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/br_firewall.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/br_firewall_list.lng b/interface/ispconfig/interface/admin/lib/lang/br_firewall_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..d2999571241ce1e766bc87e1a315476fa1521bb9 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/br_firewall_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/br_groups.lng b/interface/ispconfig/interface/admin/lib/lang/br_groups.lng new file mode 100644 index 0000000000000000000000000000000000000000..41afadbfef2642b50f2dde7912caa81f15ae7c81 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/br_groups.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/br_groups_list.lng b/interface/ispconfig/interface/admin/lib/lang/br_groups_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..73a6f438fff0cfca44d92842d951d96eb67256ab --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/br_groups_list.lng @@ -0,0 +1,7 @@ +AVISO: Não modifique ou edite qualquer configuração de usuário aqui. Use o módulo de cliente ou revendedor. Modificar ou alterar usuários e grupos aqui pode ocasionar perda de dados!'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/br_language_add.lng b/interface/ispconfig/interface/admin/lib/lang/br_language_add.lng new file mode 100644 index 0000000000000000000000000000000000000000..064b9eaf0a4a90a94945840c3937e890b22261ac --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/br_language_add.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/br_language_complete.lng b/interface/ispconfig/interface/admin/lib/lang/br_language_complete.lng new file mode 100644 index 0000000000000000000000000000000000000000..c4c0b1453e684e49fb4b7bc982f93c0f635084d7 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/br_language_complete.lng @@ -0,0 +1,7 @@ +Isto permite completar qualquer falha de tradução, com o arquivo principal original em inglês.'; +$wb['language_select_txt'] = 'Selecionar Idioma'; +$wb['btn_save_txt'] = 'Mesclar arquivos agora'; +$wb['btn_cancel_txt'] = 'Voltar'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/br_language_edit.lng b/interface/ispconfig/interface/admin/lib/lang/br_language_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..2a3f572d19caa3883c54f76907e31bbdb3734c10 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/br_language_edit.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/br_language_export.lng b/interface/ispconfig/interface/admin/lib/lang/br_language_export.lng new file mode 100644 index 0000000000000000000000000000000000000000..d4846613899570de4ac7fcb7dd1bb0c4c12710ac --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/br_language_export.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/br_language_import.lng b/interface/ispconfig/interface/admin/lib/lang/br_language_import.lng new file mode 100644 index 0000000000000000000000000000000000000000..290335b6f0e6519a800064461e3a9f8bd947f452 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/br_language_import.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/br_language_list.lng b/interface/ispconfig/interface/admin/lib/lang/br_language_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..348b94aaf126579571317d392ee358f11fe44b7d --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/br_language_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/br_remote_user.lng b/interface/ispconfig/interface/admin/lib/lang/br_remote_user.lng new file mode 100644 index 0000000000000000000000000000000000000000..c873979781206ec18ed485e2041e4ad389d2db65 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/br_remote_user.lng @@ -0,0 +1,42 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/br_remote_user_list.lng b/interface/ispconfig/interface/admin/lib/lang/br_remote_user_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..d84321ddbdc067e3ee0e24a62a8d0bbc5a77dc47 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/br_remote_user_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/br_server.lng b/interface/ispconfig/interface/admin/lib/lang/br_server.lng new file mode 100644 index 0000000000000000000000000000000000000000..899104f61e6219205febffec45245a2348c4c7b4 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/br_server.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/br_server_config.lng b/interface/ispconfig/interface/admin/lib/lang/br_server_config.lng new file mode 100644 index 0000000000000000000000000000000000000000..6791ea1da696ff680f7e1645b6956b3a1d915cab --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/br_server_config.lng @@ -0,0 +1,68 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/br_server_config_list.lng b/interface/ispconfig/interface/admin/lib/lang/br_server_config_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..60047d5c183432eca141e1c11f0fe5150b301f01 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/br_server_config_list.lng @@ -0,0 +1,4 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/br_server_ip.lng b/interface/ispconfig/interface/admin/lib/lang/br_server_ip.lng new file mode 100644 index 0000000000000000000000000000000000000000..b062dbbf169f9154d1d25c9855ebcdd75c10976e --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/br_server_ip.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/br_server_ip_list.lng b/interface/ispconfig/interface/admin/lib/lang/br_server_ip_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..864464e22f0f808a2e68b3cc892d3fbeeaba5707 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/br_server_ip_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/br_server_list.lng b/interface/ispconfig/interface/admin/lib/lang/br_server_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..5a1266c6456d362367a4a8c1e8ef2681688d982e --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/br_server_list.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/br_software_package_list.lng b/interface/ispconfig/interface/admin/lib/lang/br_software_package_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..893cc4cc373fb786317f3b477875c207ca182a85 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/br_software_package_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/br_software_repo.lng b/interface/ispconfig/interface/admin/lib/lang/br_software_repo.lng new file mode 100644 index 0000000000000000000000000000000000000000..5b54c3080a049d334f22d959cbb248462779963c --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/br_software_repo.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/br_software_repo_list.lng b/interface/ispconfig/interface/admin/lib/lang/br_software_repo_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..6941c7f1470f06d93ed5c4b5a2436e8ec593356a --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/br_software_repo_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/br_software_update_list.lng b/interface/ispconfig/interface/admin/lib/lang/br_software_update_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..e6af8ec634b3062f5fef25f2586833c3376a76f3 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/br_software_update_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/br_system_config.lng b/interface/ispconfig/interface/admin/lib/lang/br_system_config.lng new file mode 100644 index 0000000000000000000000000000000000000000..5fa32abd9ce3ca7e20c7aaf22a66ff11b4ec9383 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/br_system_config.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/br_users.lng b/interface/ispconfig/interface/admin/lib/lang/br_users.lng new file mode 100644 index 0000000000000000000000000000000000000000..28369f7a654a18102bc166498a6b77dc7584193d --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/br_users.lng @@ -0,0 +1,28 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/br_users_list.lng b/interface/ispconfig/interface/admin/lib/lang/br_users_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..d21054a0844258574f307df2a72ef73140b78cfe --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/br_users_list.lng @@ -0,0 +1,9 @@ +AVISO: Não modifique ou edite qualquer configuração de usuário aqui. Use o módulo de cliente ou revendedor. Modificar ou alterar usuários e grupos aqui pode ocasionar perda de dados!'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/de.lng b/interface/ispconfig/interface/admin/lib/lang/de.lng new file mode 100644 index 0000000000000000000000000000000000000000..c5fd284ee24591281987ba8755a0ff5ece6a6474 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/de.lng @@ -0,0 +1,40 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/de_firewall.lng b/interface/ispconfig/interface/admin/lib/lang/de_firewall.lng new file mode 100644 index 0000000000000000000000000000000000000000..0f58d7c3d7ec0d29e2a12812a61e4b6166e35878 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/de_firewall.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/de_firewall_list.lng b/interface/ispconfig/interface/admin/lib/lang/de_firewall_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..aefad619ba3d876f33be29d81ee8560732477270 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/de_firewall_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/de_groups.lng b/interface/ispconfig/interface/admin/lib/lang/de_groups.lng new file mode 100644 index 0000000000000000000000000000000000000000..25f81b1f39c177e5450da0d23ba9d0f4294889ac --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/de_groups.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/de_groups_list.lng b/interface/ispconfig/interface/admin/lib/lang/de_groups_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..244743177184de087808fba36d5f5bfc7c5f8080 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/de_groups_list.lng @@ -0,0 +1,7 @@ +WARNUNG: Bitte hier keine Benutzereinstellungen verändern. Benutzen Sie die Kunden- und Resellereinstellungen im Kundenmodul. Modifizieren der Benutzer oder Gruppen hier könnte zum Datenverlust führen!'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/de_language_add.lng b/interface/ispconfig/interface/admin/lib/lang/de_language_add.lng new file mode 100644 index 0000000000000000000000000000000000000000..118bdee049d3c854e0088debf806c00216d9e075 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/de_language_add.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/de_language_complete.lng b/interface/ispconfig/interface/admin/lib/lang/de_language_complete.lng new file mode 100644 index 0000000000000000000000000000000000000000..1376e0c8a258863d13d077abb8aa6f3389563755 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/de_language_complete.lng @@ -0,0 +1,7 @@ +Dies fügt fehlende Sätze aus der englischen Master Sprachdatei in der gewählten Sprache ein.'; +$wb['language_select_txt'] = 'Sprache auswählen'; +$wb['btn_save_txt'] = 'Dateien jetzt zusammenführen'; +$wb['btn_cancel_txt'] = 'Zurück'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/de_language_edit.lng b/interface/ispconfig/interface/admin/lib/lang/de_language_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..30ab21b28d0e65110f0f46e9401642bbadf7a2d7 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/de_language_edit.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/de_language_export.lng b/interface/ispconfig/interface/admin/lib/lang/de_language_export.lng new file mode 100644 index 0000000000000000000000000000000000000000..70eb466d4ce79c8039ccf4afadd84959199d05ad --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/de_language_export.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/de_language_import.lng b/interface/ispconfig/interface/admin/lib/lang/de_language_import.lng new file mode 100644 index 0000000000000000000000000000000000000000..698213e4385c96bbd5cc661e806cb220df55f959 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/de_language_import.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/de_language_list.lng b/interface/ispconfig/interface/admin/lib/lang/de_language_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..074eab9e80ef66cfdbed295c3f30223874329a4b --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/de_language_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/de_remote_user.lng b/interface/ispconfig/interface/admin/lib/lang/de_remote_user.lng new file mode 100644 index 0000000000000000000000000000000000000000..c6fddd9a666f88971277932fca5e4c4739cfe1f7 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/de_remote_user.lng @@ -0,0 +1,42 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/de_remote_user_list.lng b/interface/ispconfig/interface/admin/lib/lang/de_remote_user_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..163b7e8473f2bcf9dd0c868fc8ea0d7fbaec919d --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/de_remote_user_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/de_server.lng b/interface/ispconfig/interface/admin/lib/lang/de_server.lng new file mode 100644 index 0000000000000000000000000000000000000000..f01116a58f4d57c5fdc6ca360d31437c581ed981 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/de_server.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/de_server_config.lng b/interface/ispconfig/interface/admin/lib/lang/de_server_config.lng new file mode 100644 index 0000000000000000000000000000000000000000..f0caa43f29b714580306ab30c9914accd75155a3 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/de_server_config.lng @@ -0,0 +1,68 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/de_server_config_list.lng b/interface/ispconfig/interface/admin/lib/lang/de_server_config_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..191b2c8d32f65ec714a135fef04f123f0e4b9c3a --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/de_server_config_list.lng @@ -0,0 +1,4 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/de_server_ip.lng b/interface/ispconfig/interface/admin/lib/lang/de_server_ip.lng new file mode 100644 index 0000000000000000000000000000000000000000..8210037c5ffab42e812fac2ebbcc869eeb83f047 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/de_server_ip.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/de_server_ip_list.lng b/interface/ispconfig/interface/admin/lib/lang/de_server_ip_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..0d0727cd15a8315573e69198986f4d703306cd67 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/de_server_ip_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/de_server_list.lng b/interface/ispconfig/interface/admin/lib/lang/de_server_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..332a603ccb596195bd4bfa4ec9614a88e21ad246 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/de_server_list.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/de_software_package_list.lng b/interface/ispconfig/interface/admin/lib/lang/de_software_package_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..ca797d3cc7ef8da3d5c5b0e2f4b29dd89ced7f91 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/de_software_package_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/de_software_repo.lng b/interface/ispconfig/interface/admin/lib/lang/de_software_repo.lng new file mode 100644 index 0000000000000000000000000000000000000000..6e54c4a6b30bc1a33267befe5a4f3760f03dd84e --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/de_software_repo.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/de_software_repo_list.lng b/interface/ispconfig/interface/admin/lib/lang/de_software_repo_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..db6f49fd4edd70c55ebc84f05dc84fc704e861ce --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/de_software_repo_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/de_software_update_list.lng b/interface/ispconfig/interface/admin/lib/lang/de_software_update_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..6f01c1f081fa5d195bd1837f2977c3ea9fa5f9eb --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/de_software_update_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/de_system_config.lng b/interface/ispconfig/interface/admin/lib/lang/de_system_config.lng new file mode 100644 index 0000000000000000000000000000000000000000..2c10f256779318d58c063f2ddabdeb3c77b7959e --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/de_system_config.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/de_users.lng b/interface/ispconfig/interface/admin/lib/lang/de_users.lng new file mode 100644 index 0000000000000000000000000000000000000000..436cff547956a763c2ecb27c6d9d64d83bfe43be --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/de_users.lng @@ -0,0 +1,28 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/de_users_list.lng b/interface/ispconfig/interface/admin/lib/lang/de_users_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..73a61951794a3b6c2ebeb65921c54be5d8e3dd7f --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/de_users_list.lng @@ -0,0 +1,9 @@ +WARNUNG: Bitte hier keine Benutzereinstellungen verändern. Benutzen Sie die Kunden- und Resellereinstellungen im Kundenmodul. Modifizieren der Benutzer oder Gruppen hier könnte zum Datenverlust führen!'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/en.lng b/interface/ispconfig/interface/admin/lib/lang/en.lng new file mode 100644 index 0000000000000000000000000000000000000000..06a3b45bf0bbd98a5f66c872ad97d77dd6d76954 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/en.lng @@ -0,0 +1,42 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/lib/lang/en_firewall.lng b/interface/ispconfig/interface/admin/lib/lang/en_firewall.lng new file mode 100644 index 0000000000000000000000000000000000000000..025108bebefa2484e16f8a59b4cd7776d69ef61e --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/en_firewall.lng @@ -0,0 +1,12 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/lib/lang/en_firewall_list.lng b/interface/ispconfig/interface/admin/lib/lang/en_firewall_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..d16e1c7dfcb8fac81462da0217b2a0355be8fdcc --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/en_firewall_list.lng @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/lib/lang/en_groups.lng b/interface/ispconfig/interface/admin/lib/lang/en_groups.lng new file mode 100644 index 0000000000000000000000000000000000000000..a504f9913ef4fa30dd76004a1d3365622803d763 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/en_groups.lng @@ -0,0 +1,5 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/lib/lang/en_groups_list.lng b/interface/ispconfig/interface/admin/lib/lang/en_groups_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..ba1831836ae442a56bceef72c91cb808814ec842 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/en_groups_list.lng @@ -0,0 +1,7 @@ +WARNING: Do not edit or modify any user settings here. Use the Client- and Reseller settings in the Client module instead. Modifying or changing Users or groups here may cause data loss!'; +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/lib/lang/en_language_add.lng b/interface/ispconfig/interface/admin/lib/lang/en_language_add.lng new file mode 100644 index 0000000000000000000000000000000000000000..2b5e5a40f89e8977436a8b3aa315504224297b8b --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/en_language_add.lng @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/lib/lang/en_language_complete.lng b/interface/ispconfig/interface/admin/lib/lang/en_language_complete.lng new file mode 100644 index 0000000000000000000000000000000000000000..15438775fca485d0441d073001fe9970c7f6daa2 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/en_language_complete.lng @@ -0,0 +1,7 @@ +This adds missing strings from the english master language files to the selected language.'; +$wb["language_select_txt"] = 'Select language'; +$wb['btn_save_txt'] = 'Merge files now'; +$wb['btn_cancel_txt'] = 'Back'; +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/lib/lang/en_language_edit.lng b/interface/ispconfig/interface/admin/lib/lang/en_language_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..4c50e883e6933c8a9449319b4524216e9adac9f5 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/en_language_edit.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/en_language_export.lng b/interface/ispconfig/interface/admin/lib/lang/en_language_export.lng new file mode 100644 index 0000000000000000000000000000000000000000..791fc894d31731be124b3cc083e4ace7661f9aa7 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/en_language_export.lng @@ -0,0 +1,6 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/lib/lang/en_language_import.lng b/interface/ispconfig/interface/admin/lib/lang/en_language_import.lng new file mode 100644 index 0000000000000000000000000000000000000000..a554c6c2200b493f8fc0ef60f744a01a1116c6c6 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/en_language_import.lng @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/lib/lang/en_language_list.lng b/interface/ispconfig/interface/admin/lib/lang/en_language_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..e70f09f8eaf3c7df8c8e82d10c0d6c8a27f9883e --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/en_language_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/en_remote_user.lng b/interface/ispconfig/interface/admin/lib/lang/en_remote_user.lng new file mode 100644 index 0000000000000000000000000000000000000000..cc9335bc52638b05b2a4419cbb6415daebbca52e --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/en_remote_user.lng @@ -0,0 +1,42 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/en_remote_user_list.lng b/interface/ispconfig/interface/admin/lib/lang/en_remote_user_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..56c6fac4be29b7a8bbc856383c7044edd82214f4 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/en_remote_user_list.lng @@ -0,0 +1,8 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/en_server.lng b/interface/ispconfig/interface/admin/lib/lang/en_server.lng new file mode 100644 index 0000000000000000000000000000000000000000..dcd46c582ccce8c1eb025b0a73d59776e13c0575 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/en_server.lng @@ -0,0 +1,13 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/lib/lang/en_server_config.lng b/interface/ispconfig/interface/admin/lib/lang/en_server_config.lng new file mode 100644 index 0000000000000000000000000000000000000000..603245d7d40016568ef67ad33a98b3ede60d4979 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/en_server_config.lng @@ -0,0 +1,68 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/lib/lang/en_server_config_list.lng b/interface/ispconfig/interface/admin/lib/lang/en_server_config_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..4d8a3f6a59645c3da2e611a07994613d263d87b1 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/en_server_config_list.lng @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/lib/lang/en_server_ip.lng b/interface/ispconfig/interface/admin/lib/lang/en_server_ip.lng new file mode 100644 index 0000000000000000000000000000000000000000..ae4717c5383e54fda6d958eddfb952b0c87ff4c5 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/en_server_ip.lng @@ -0,0 +1,7 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/lib/lang/en_server_ip_list.lng b/interface/ispconfig/interface/admin/lib/lang/en_server_ip_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..008dfc4e0032a5d3e87f248353803cffb35277a3 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/en_server_ip_list.lng @@ -0,0 +1,6 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/lib/lang/en_server_list.lng b/interface/ispconfig/interface/admin/lib/lang/en_server_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..d15701e807f3dfeced62a31265c274e7a864eac5 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/en_server_list.lng @@ -0,0 +1,11 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/lib/lang/en_software_package_list.lng b/interface/ispconfig/interface/admin/lib/lang/en_software_package_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..03917cabce20eb163fd64a168a2c8bbaf58599e6 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/en_software_package_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/en_software_repo.lng b/interface/ispconfig/interface/admin/lib/lang/en_software_repo.lng new file mode 100644 index 0000000000000000000000000000000000000000..7968b000fddc0b703bdeb64d4faf940401899a33 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/en_software_repo.lng @@ -0,0 +1,7 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/lib/lang/en_software_repo_list.lng b/interface/ispconfig/interface/admin/lib/lang/en_software_repo_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..f0a0b309205c4f6204a062a91707de60c49b2661 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/en_software_repo_list.lng @@ -0,0 +1,6 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/lib/lang/en_software_update_list.lng b/interface/ispconfig/interface/admin/lib/lang/en_software_update_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..ec4af23a4bf359a8f669c4baf386b79da53dcd49 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/en_software_update_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/en_system_config.lng b/interface/ispconfig/interface/admin/lib/lang/en_system_config.lng new file mode 100644 index 0000000000000000000000000000000000000000..450222722ab2777bf6ff0854f2327f213c03ba06 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/en_system_config.lng @@ -0,0 +1,17 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/lib/lang/en_users.lng b/interface/ispconfig/interface/admin/lib/lang/en_users.lng new file mode 100644 index 0000000000000000000000000000000000000000..0f9a1c5b5629e7cb98931bda27f29bdc44de3873 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/en_users.lng @@ -0,0 +1,28 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/en_users_list.lng b/interface/ispconfig/interface/admin/lib/lang/en_users_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..1042cd35b1dee40e9401292d33513c022594f39f --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/en_users_list.lng @@ -0,0 +1,9 @@ +WARNING: Do not edit or modify any user settings here. Use the Client- and Reseller settings in the Client module instead. Modifying or changing Users or groups here may cause data loss!'; +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/lib/lang/es.lng b/interface/ispconfig/interface/admin/lib/lang/es.lng new file mode 100644 index 0000000000000000000000000000000000000000..3e3566f6e9cc1c1ed992966ce3a7beccb206b05e --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/es.lng @@ -0,0 +1,40 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/es_firewall.lng b/interface/ispconfig/interface/admin/lib/lang/es_firewall.lng new file mode 100644 index 0000000000000000000000000000000000000000..2b31cf5aa54b79f4121b6f73a2f776c9bd7e5163 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/es_firewall.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/es_firewall_list.lng b/interface/ispconfig/interface/admin/lib/lang/es_firewall_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..8332c413a5d9bed64deea475ed6dea280fdc22fb --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/es_firewall_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/es_groups.lng b/interface/ispconfig/interface/admin/lib/lang/es_groups.lng new file mode 100644 index 0000000000000000000000000000000000000000..37e6cd8eb86902d2b98e4e6b84b11c36c950e6cc --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/es_groups.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/es_groups_list.lng b/interface/ispconfig/interface/admin/lib/lang/es_groups_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..f36c4d8587e28bc8da2a1cf8797ff03c6f0ddc8a --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/es_groups_list.lng @@ -0,0 +1,7 @@ +WARNING: Do not edit or modify any user settings here. Use the Client- and Reseller settings in the Client module instead. Modifying or changing Users or groups here may cause data loss!'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/es_language_add.lng b/interface/ispconfig/interface/admin/lib/lang/es_language_add.lng new file mode 100644 index 0000000000000000000000000000000000000000..d0f057aefc6bf3d7804b5f51753ebd84b3638f25 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/es_language_add.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/es_language_complete.lng b/interface/ispconfig/interface/admin/lib/lang/es_language_complete.lng new file mode 100644 index 0000000000000000000000000000000000000000..0e3e183f3bc8a729f92edbd1b968257574cecc97 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/es_language_complete.lng @@ -0,0 +1,7 @@ +Esto añade las cadenas perdidas desde el fichero maestro en inglés.'; +$wb['language_select_txt'] = 'Elegir idioma'; +$wb['btn_save_txt'] = 'Mezclar los ficheros ahora'; +$wb['btn_cancel_txt'] = 'Atrás'; +$wb['list_desc_txt'] = 'Mezclar el fichero de idioma seleccionado con el fichero de idioma maestro en inglés.
Esto añade cadenas perdidas desde el fichero de idioma maestro en inglés al idioma seleccionado.'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/es_language_edit.lng b/interface/ispconfig/interface/admin/lib/lang/es_language_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..f471c4d40cf0b26a937123e8df63a779fb9d2048 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/es_language_edit.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/es_language_export.lng b/interface/ispconfig/interface/admin/lib/lang/es_language_export.lng new file mode 100644 index 0000000000000000000000000000000000000000..2883a7e202c00b86c6e1a5aa9816dd189ef6e048 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/es_language_export.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/es_language_import.lng b/interface/ispconfig/interface/admin/lib/lang/es_language_import.lng new file mode 100644 index 0000000000000000000000000000000000000000..87b465e141393fb72deea5338d34d3d14150383e --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/es_language_import.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/es_language_list.lng b/interface/ispconfig/interface/admin/lib/lang/es_language_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..dfa2caeccc45c3410143e4d28d13f53e67d92c0b --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/es_language_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/es_remote_user.lng b/interface/ispconfig/interface/admin/lib/lang/es_remote_user.lng new file mode 100644 index 0000000000000000000000000000000000000000..f3d3a9a12908cb714fc48da0dd5a388141abe750 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/es_remote_user.lng @@ -0,0 +1,42 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/es_remote_user_list.lng b/interface/ispconfig/interface/admin/lib/lang/es_remote_user_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..e73f8002d9431f7e393deb52575da092e9afb419 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/es_remote_user_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/es_server.lng b/interface/ispconfig/interface/admin/lib/lang/es_server.lng new file mode 100644 index 0000000000000000000000000000000000000000..e38ccfc92d21ab328881b0fc46ced73c73017630 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/es_server.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/es_server_config.lng b/interface/ispconfig/interface/admin/lib/lang/es_server_config.lng new file mode 100644 index 0000000000000000000000000000000000000000..a76a5cfe28aee6cce5355c0d355b941fa4dcef1a --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/es_server_config.lng @@ -0,0 +1,68 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/es_server_config_list.lng b/interface/ispconfig/interface/admin/lib/lang/es_server_config_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..6dd827ae027537fa47b6a54a7aaf6bdb6c577be7 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/es_server_config_list.lng @@ -0,0 +1,4 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/es_server_ip.lng b/interface/ispconfig/interface/admin/lib/lang/es_server_ip.lng new file mode 100644 index 0000000000000000000000000000000000000000..6358c5d389d25e98d6e0834996a8f5f637c7805b --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/es_server_ip.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/es_server_ip_list.lng b/interface/ispconfig/interface/admin/lib/lang/es_server_ip_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..9ae98341570bf3dc066b629d7cf3d1599c65ba50 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/es_server_ip_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/es_server_list.lng b/interface/ispconfig/interface/admin/lib/lang/es_server_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..11a8e6f10a0a50765ec1edede1986ffb9505f893 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/es_server_list.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/es_software_package_list.lng b/interface/ispconfig/interface/admin/lib/lang/es_software_package_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..d4482d59ef3d7def989b77fbed5038160937f411 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/es_software_package_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/es_software_repo.lng b/interface/ispconfig/interface/admin/lib/lang/es_software_repo.lng new file mode 100644 index 0000000000000000000000000000000000000000..3b9a89e88a233267935796debc6b78d7d55d9ea9 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/es_software_repo.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/es_software_repo_list.lng b/interface/ispconfig/interface/admin/lib/lang/es_software_repo_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..59f97903e7c1297cb0bbf46e121c010355a7fd7d --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/es_software_repo_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/es_software_update_list.lng b/interface/ispconfig/interface/admin/lib/lang/es_software_update_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..adbe6d8c990298bea737b02cf6f52b1c7d5fb6b0 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/es_software_update_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/es_system_config.lng b/interface/ispconfig/interface/admin/lib/lang/es_system_config.lng new file mode 100644 index 0000000000000000000000000000000000000000..7ce9dbebe9329f92f3f2d7636ea16b4254e11f8f --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/es_system_config.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/es_users.lng b/interface/ispconfig/interface/admin/lib/lang/es_users.lng new file mode 100644 index 0000000000000000000000000000000000000000..1561060511aa130e815fc269a54dd30b4a01a9d3 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/es_users.lng @@ -0,0 +1,28 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/es_users_list.lng b/interface/ispconfig/interface/admin/lib/lang/es_users_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..ec368916ffb03f2a28edcbffe10413dbcbd9c59e --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/es_users_list.lng @@ -0,0 +1,9 @@ +WARNING: Do not edit or modify any user settings here. Use the Client- and Reseller settings in the Client module instead. Modifying or changing Users or groups here may cause data loss!'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/fi.lng b/interface/ispconfig/interface/admin/lib/lang/fi.lng new file mode 100644 index 0000000000000000000000000000000000000000..545a3bfa8c8b3e41bc1c90a6beefc3690f3cd93e --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fi.lng @@ -0,0 +1,40 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fi_firewall.lng b/interface/ispconfig/interface/admin/lib/lang/fi_firewall.lng new file mode 100644 index 0000000000000000000000000000000000000000..63cc2f7e716573fcc4f61f219bb7c907d3521d6a --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fi_firewall.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fi_firewall_list.lng b/interface/ispconfig/interface/admin/lib/lang/fi_firewall_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..96ff2dc63abeeff38ecbcf3d77e69a573b7f844f --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fi_firewall_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fi_groups.lng b/interface/ispconfig/interface/admin/lib/lang/fi_groups.lng new file mode 100644 index 0000000000000000000000000000000000000000..141322bc008274184c4a4ff894720421bd73222f --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fi_groups.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fi_groups_list.lng b/interface/ispconfig/interface/admin/lib/lang/fi_groups_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..71d9383996022cf9ba428afd138d40242ea31dcb --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fi_groups_list.lng @@ -0,0 +1,7 @@ +WARNING: Do not edit or modify any user settings here. Use the Client- and Reseller settings in the Client module instead. Modifying or changing Users or groups here may cause data loss!'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/fi_language_add.lng b/interface/ispconfig/interface/admin/lib/lang/fi_language_add.lng new file mode 100644 index 0000000000000000000000000000000000000000..24efb7e4e09ebc32c7d53d529c477321c808fb94 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fi_language_add.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fi_language_complete.lng b/interface/ispconfig/interface/admin/lib/lang/fi_language_complete.lng new file mode 100644 index 0000000000000000000000000000000000000000..b1776c9212b6e74c3074f9b33d5e07ac69c76324 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fi_language_complete.lng @@ -0,0 +1,7 @@ +Tämä lisää puuttuvat käännöskohdat valittuun kielitiedostoon.'; +$wb['language_select_txt'] = 'Valitse täydennettävä kieli'; +$wb['btn_save_txt'] = 'Yhdistä kielitiedostot nyt'; +$wb['btn_cancel_txt'] = 'Keskeytä'; +$wb['list_desc_txt'] = 'Yhdistää valitun kielitiedoston englannin kielisen päätiedoston kanssa.
Tämä lisää puuttuvat käännöstiedot valittuun kielitiedostoon.'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/fi_language_edit.lng b/interface/ispconfig/interface/admin/lib/lang/fi_language_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..cdf73da643afb563ff1d2df34cd530399e75f285 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fi_language_edit.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fi_language_export.lng b/interface/ispconfig/interface/admin/lib/lang/fi_language_export.lng new file mode 100644 index 0000000000000000000000000000000000000000..b1ff06c4e8c96719efa699677a3a1747df7c5a3f --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fi_language_export.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fi_language_import.lng b/interface/ispconfig/interface/admin/lib/lang/fi_language_import.lng new file mode 100644 index 0000000000000000000000000000000000000000..ca60528e067a15633d006c5f0f18743ecec0fe11 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fi_language_import.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fi_language_list.lng b/interface/ispconfig/interface/admin/lib/lang/fi_language_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..85e7b70e11c9313e5fbf5b6f0ac0e129955a22a7 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fi_language_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fi_remote_user.lng b/interface/ispconfig/interface/admin/lib/lang/fi_remote_user.lng new file mode 100644 index 0000000000000000000000000000000000000000..1876872ed36fa7ba7304c5a97837bc7190b19272 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fi_remote_user.lng @@ -0,0 +1,42 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fi_remote_user_list.lng b/interface/ispconfig/interface/admin/lib/lang/fi_remote_user_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..6aa4bd775377dbc211ddfc89b3eab05486152a28 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fi_remote_user_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fi_server.lng b/interface/ispconfig/interface/admin/lib/lang/fi_server.lng new file mode 100644 index 0000000000000000000000000000000000000000..10058aa7656021ac29e62464ba47f093edfadc66 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fi_server.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fi_server_config.lng b/interface/ispconfig/interface/admin/lib/lang/fi_server_config.lng new file mode 100644 index 0000000000000000000000000000000000000000..3ef8fd6910e3cf50c5baff28ae43395fb3a8c796 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fi_server_config.lng @@ -0,0 +1,68 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fi_server_config_list.lng b/interface/ispconfig/interface/admin/lib/lang/fi_server_config_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..ed1cbed5b4656b7c01b16da5a778052d71c026c5 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fi_server_config_list.lng @@ -0,0 +1,4 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fi_server_ip.lng b/interface/ispconfig/interface/admin/lib/lang/fi_server_ip.lng new file mode 100644 index 0000000000000000000000000000000000000000..9c330fc45c66b69ab8fee2a5ae380aa51ef51c36 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fi_server_ip.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fi_server_ip_list.lng b/interface/ispconfig/interface/admin/lib/lang/fi_server_ip_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..a297a62bf6c56094f43f4bf0a1c28ea4499fb1ab --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fi_server_ip_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fi_server_list.lng b/interface/ispconfig/interface/admin/lib/lang/fi_server_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..30863bdf247d2e0ad51acdee2b6f4dd8cbada2f9 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fi_server_list.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fi_software_package_list.lng b/interface/ispconfig/interface/admin/lib/lang/fi_software_package_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..a8957cc9f772dc4cf032283a37f7dca3c9e837a2 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fi_software_package_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fi_software_repo.lng b/interface/ispconfig/interface/admin/lib/lang/fi_software_repo.lng new file mode 100644 index 0000000000000000000000000000000000000000..c89969445fe5bfdddf0369b72c1934b578b0b7f8 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fi_software_repo.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fi_software_repo_list.lng b/interface/ispconfig/interface/admin/lib/lang/fi_software_repo_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..bde844c99f8d8ea61c5e7b4b1dd98c831ae57a92 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fi_software_repo_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fi_software_update_list.lng b/interface/ispconfig/interface/admin/lib/lang/fi_software_update_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..9d9a2d2f7455c10fc2cfeab44b94b71aa4ef9695 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fi_software_update_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fi_system_config.lng b/interface/ispconfig/interface/admin/lib/lang/fi_system_config.lng new file mode 100644 index 0000000000000000000000000000000000000000..254801e737592a8650778d51c6e4fae64bca04d0 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fi_system_config.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fi_users.lng b/interface/ispconfig/interface/admin/lib/lang/fi_users.lng new file mode 100644 index 0000000000000000000000000000000000000000..08bada0374e099ca3ce9d5b5a8e7728781ec0a5b --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fi_users.lng @@ -0,0 +1,28 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fi_users_list.lng b/interface/ispconfig/interface/admin/lib/lang/fi_users_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..fe58f3b3b6769338dca84c8e0e7df6bff6da830a --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fi_users_list.lng @@ -0,0 +1,9 @@ +WARNING: Do not edit or modify any user settings here. Use the Client- and Reseller settings in the Client module instead. Modifying or changing Users or groups here may cause data loss!'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/fr.lng b/interface/ispconfig/interface/admin/lib/lang/fr.lng new file mode 100644 index 0000000000000000000000000000000000000000..929c46ef1500a469f0ab94630145da2d6d45c98b --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fr.lng @@ -0,0 +1,40 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fr_firewall.lng b/interface/ispconfig/interface/admin/lib/lang/fr_firewall.lng new file mode 100644 index 0000000000000000000000000000000000000000..128000a32791cee98fa48fb82f16ef37292ee037 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fr_firewall.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fr_firewall_list.lng b/interface/ispconfig/interface/admin/lib/lang/fr_firewall_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..965eb0109ee6b191c6afb880610daa319e72f01f --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fr_firewall_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fr_groups.lng b/interface/ispconfig/interface/admin/lib/lang/fr_groups.lng new file mode 100644 index 0000000000000000000000000000000000000000..e0a92d7344a1ec1a2c46573e4c3d239ae0b4d349 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fr_groups.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fr_groups_list.lng b/interface/ispconfig/interface/admin/lib/lang/fr_groups_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..2ebbc365aca0d53316f457b8e4ce98ea3baca148 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fr_groups_list.lng @@ -0,0 +1,7 @@ +WARNING: Do not edit or modify any user settings here. Use the Client- and Reseller settings in the Client module instead. Modifying or changing Users or groups here may cause data loss!'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/fr_language_add.lng b/interface/ispconfig/interface/admin/lib/lang/fr_language_add.lng new file mode 100644 index 0000000000000000000000000000000000000000..7db36eb7c8651f107a0088b4b2df3756c4ac5ade --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fr_language_add.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fr_language_complete.lng b/interface/ispconfig/interface/admin/lib/lang/fr_language_complete.lng new file mode 100644 index 0000000000000000000000000000000000000000..ede6ca5d09c6ea75738c3d66279e4ec1ac107252 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fr_language_complete.lng @@ -0,0 +1,7 @@ +Ceci ajoute les élements manquant en anglais au fichier sélectionné.'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/fr_language_edit.lng b/interface/ispconfig/interface/admin/lib/lang/fr_language_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..021acb4408a896fda08929aa520e73bcafbcf6c9 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fr_language_edit.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fr_language_export.lng b/interface/ispconfig/interface/admin/lib/lang/fr_language_export.lng new file mode 100644 index 0000000000000000000000000000000000000000..b8196967c8fa79224a2b245a210d93bb54f79141 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fr_language_export.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fr_language_import.lng b/interface/ispconfig/interface/admin/lib/lang/fr_language_import.lng new file mode 100644 index 0000000000000000000000000000000000000000..8f765458a7247eb9b5f696fbb3199f19a189c0de --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fr_language_import.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fr_language_list.lng b/interface/ispconfig/interface/admin/lib/lang/fr_language_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..8e9f26a7b1534bcad19e4a639e1a3dd2976f617d --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fr_language_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fr_remote_user.lng b/interface/ispconfig/interface/admin/lib/lang/fr_remote_user.lng new file mode 100644 index 0000000000000000000000000000000000000000..cc9335bc52638b05b2a4419cbb6415daebbca52e --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fr_remote_user.lng @@ -0,0 +1,42 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fr_remote_user_list.lng b/interface/ispconfig/interface/admin/lib/lang/fr_remote_user_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..152a75fba4c8917a1829b6960df7291e583d34a7 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fr_remote_user_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fr_server.lng b/interface/ispconfig/interface/admin/lib/lang/fr_server.lng new file mode 100644 index 0000000000000000000000000000000000000000..e8ab79753d8afad9208a2de1df4582bf53c32e0e --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fr_server.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fr_server_config.lng b/interface/ispconfig/interface/admin/lib/lang/fr_server_config.lng new file mode 100644 index 0000000000000000000000000000000000000000..0c228902f423392af9ccead05e4f0fdb65578c21 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fr_server_config.lng @@ -0,0 +1,68 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fr_server_config_list.lng b/interface/ispconfig/interface/admin/lib/lang/fr_server_config_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..850cdd12035255a20379510237d2c9a75c774be1 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fr_server_config_list.lng @@ -0,0 +1,4 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fr_server_ip.lng b/interface/ispconfig/interface/admin/lib/lang/fr_server_ip.lng new file mode 100644 index 0000000000000000000000000000000000000000..39ae21c601f19ead429195103f8c11409f7438e3 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fr_server_ip.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fr_server_ip_list.lng b/interface/ispconfig/interface/admin/lib/lang/fr_server_ip_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..6bef5a3732987db888157b82985cf61967168742 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fr_server_ip_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fr_server_list.lng b/interface/ispconfig/interface/admin/lib/lang/fr_server_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..32637a3507690d2de18c53d0dab75436de56c580 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fr_server_list.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fr_software_package_list.lng b/interface/ispconfig/interface/admin/lib/lang/fr_software_package_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..f3d2c87b715a4055b8279143670b94840d41af28 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fr_software_package_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fr_software_repo.lng b/interface/ispconfig/interface/admin/lib/lang/fr_software_repo.lng new file mode 100644 index 0000000000000000000000000000000000000000..7b3ec481a2867b3d383dd73d2f04f76b4fd1a48f --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fr_software_repo.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fr_software_repo_list.lng b/interface/ispconfig/interface/admin/lib/lang/fr_software_repo_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..56749896bb0bf5c6b876cc1646a07ee273380656 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fr_software_repo_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fr_software_update_list.lng b/interface/ispconfig/interface/admin/lib/lang/fr_software_update_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..e630b6741b71c0d19715f3d15606465e5c93b17a --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fr_software_update_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fr_system_config.lng b/interface/ispconfig/interface/admin/lib/lang/fr_system_config.lng new file mode 100644 index 0000000000000000000000000000000000000000..9c7f7d9079f0b0399614a685f99e6aa872938cfc --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fr_system_config.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fr_users.lng b/interface/ispconfig/interface/admin/lib/lang/fr_users.lng new file mode 100644 index 0000000000000000000000000000000000000000..9bef687fb31a87bb708f26825618ffa21491a4be --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fr_users.lng @@ -0,0 +1,28 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fr_users_list.lng b/interface/ispconfig/interface/admin/lib/lang/fr_users_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..6d70fd85c2cf4bd0f12462dac4631ae2fe9ece99 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fr_users_list.lng @@ -0,0 +1,9 @@ +WARNING: Do not edit or modify any user settings here. Use the Client- and Reseller settings in the Client module instead. Modifying or changing Users or groups here may cause data loss!'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/hu.lng b/interface/ispconfig/interface/admin/lib/lang/hu.lng new file mode 100644 index 0000000000000000000000000000000000000000..d9e925f8381b3c6416b5bacec740a9ab8851e5a7 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/hu.lng @@ -0,0 +1,40 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/hu_firewall.lng b/interface/ispconfig/interface/admin/lib/lang/hu_firewall.lng new file mode 100644 index 0000000000000000000000000000000000000000..e626345d3c1ee3bbce74ffd70c36fcc7ff3297c2 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/hu_firewall.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/hu_firewall_list.lng b/interface/ispconfig/interface/admin/lib/lang/hu_firewall_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..24a34be1c121271493b5c469f3defce76a660523 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/hu_firewall_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/hu_groups.lng b/interface/ispconfig/interface/admin/lib/lang/hu_groups.lng new file mode 100644 index 0000000000000000000000000000000000000000..61c3dc538d47a4daad960cc7be1d4fca220b5a06 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/hu_groups.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/hu_groups_list.lng b/interface/ispconfig/interface/admin/lib/lang/hu_groups_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..f1d8e2c1a33b92ad997cc3373de412aacf5202dc --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/hu_groups_list.lng @@ -0,0 +1,7 @@ +WARNING: Do not edit or modify any user settings here. Use the Client- and Reseller settings in the Client module instead. Modifying or changing Users or groups here may cause data loss!'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/hu_language_add.lng b/interface/ispconfig/interface/admin/lib/lang/hu_language_add.lng new file mode 100644 index 0000000000000000000000000000000000000000..8236c48512e03c091563d0b4862ef661a8c44c12 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/hu_language_add.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/hu_language_complete.lng b/interface/ispconfig/interface/admin/lib/lang/hu_language_complete.lng new file mode 100644 index 0000000000000000000000000000000000000000..b5200ff9df30536d461edf601236bc2e91112af7 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/hu_language_complete.lng @@ -0,0 +1,7 @@ +This adds missing strings from the english master language files to the selected language.'; +$wb['language_select_txt'] = 'Select language'; +$wb['btn_save_txt'] = 'Merge files now'; +$wb['btn_cancel_txt'] = 'Back'; +$wb['list_desc_txt'] = 'Merge the selected language file with the english master language file.
This adds missing strings from the english master language files to the selected language.'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/hu_language_edit.lng b/interface/ispconfig/interface/admin/lib/lang/hu_language_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..06ec606b03bd9c1a891c0a88100e39de569945c4 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/hu_language_edit.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/hu_language_export.lng b/interface/ispconfig/interface/admin/lib/lang/hu_language_export.lng new file mode 100644 index 0000000000000000000000000000000000000000..64c537f60de125706b991d871b8728c51e28d1d4 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/hu_language_export.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/hu_language_import.lng b/interface/ispconfig/interface/admin/lib/lang/hu_language_import.lng new file mode 100644 index 0000000000000000000000000000000000000000..811100182ed6b31ed2b243b730cab5416534597a --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/hu_language_import.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/hu_language_list.lng b/interface/ispconfig/interface/admin/lib/lang/hu_language_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..658bd41256703e1bca1aaa1b5438d7429930f3b7 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/hu_language_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/hu_remote_user.lng b/interface/ispconfig/interface/admin/lib/lang/hu_remote_user.lng new file mode 100644 index 0000000000000000000000000000000000000000..cc9335bc52638b05b2a4419cbb6415daebbca52e --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/hu_remote_user.lng @@ -0,0 +1,42 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/hu_remote_user_list.lng b/interface/ispconfig/interface/admin/lib/lang/hu_remote_user_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..152a75fba4c8917a1829b6960df7291e583d34a7 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/hu_remote_user_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/hu_server.lng b/interface/ispconfig/interface/admin/lib/lang/hu_server.lng new file mode 100644 index 0000000000000000000000000000000000000000..1d61a372be0dce56b743edcf98666a3ff63ffe42 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/hu_server.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/hu_server_config.lng b/interface/ispconfig/interface/admin/lib/lang/hu_server_config.lng new file mode 100644 index 0000000000000000000000000000000000000000..39f006e6ff400efb8724ff5eaea5e17617f36d85 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/hu_server_config.lng @@ -0,0 +1,68 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/hu_server_config_list.lng b/interface/ispconfig/interface/admin/lib/lang/hu_server_config_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..ade34c78c9afae911aa7df55acdd892bee81992e --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/hu_server_config_list.lng @@ -0,0 +1,4 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/hu_server_ip.lng b/interface/ispconfig/interface/admin/lib/lang/hu_server_ip.lng new file mode 100644 index 0000000000000000000000000000000000000000..5ffcd04db5d2c3b7e7d62c54929255509d0cbb0a --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/hu_server_ip.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/hu_server_ip_list.lng b/interface/ispconfig/interface/admin/lib/lang/hu_server_ip_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..df533bca24f1a522556da9432874df964247104e --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/hu_server_ip_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/hu_server_list.lng b/interface/ispconfig/interface/admin/lib/lang/hu_server_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..e0e9d1384650b3e143c67d3d6a6ccd83b82ccca0 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/hu_server_list.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/hu_software_package_list.lng b/interface/ispconfig/interface/admin/lib/lang/hu_software_package_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..6f71f751556a159037c77361ccd1445b32ebb5b4 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/hu_software_package_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/hu_software_repo.lng b/interface/ispconfig/interface/admin/lib/lang/hu_software_repo.lng new file mode 100644 index 0000000000000000000000000000000000000000..574dd1162989badc8499f5af31451a43673bf4da --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/hu_software_repo.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/hu_software_repo_list.lng b/interface/ispconfig/interface/admin/lib/lang/hu_software_repo_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..8d2d4300552494355144c928bd365ae3ecdf55a9 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/hu_software_repo_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/hu_software_update_list.lng b/interface/ispconfig/interface/admin/lib/lang/hu_software_update_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..db6ade2c406d602e70c9672804acfd65347f57cd --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/hu_software_update_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/hu_system_config.lng b/interface/ispconfig/interface/admin/lib/lang/hu_system_config.lng new file mode 100644 index 0000000000000000000000000000000000000000..e7f5d9365e01f4adcfe52c7c7aba0075a096283d --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/hu_system_config.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/hu_users.lng b/interface/ispconfig/interface/admin/lib/lang/hu_users.lng new file mode 100644 index 0000000000000000000000000000000000000000..f9b525e995caaf1b85e232cc6df74d8882314994 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/hu_users.lng @@ -0,0 +1,28 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/hu_users_list.lng b/interface/ispconfig/interface/admin/lib/lang/hu_users_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..1cfe243f781da461fff2dce95be87c8179a3a62c --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/hu_users_list.lng @@ -0,0 +1,9 @@ +WARNING: Do not edit or modify any user settings here. Use the Client- and Reseller settings in the Client module instead. Modifying or changing Users or groups here may cause data loss!'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/it.lng b/interface/ispconfig/interface/admin/lib/lang/it.lng new file mode 100644 index 0000000000000000000000000000000000000000..1628a4ef76e574a710f475192da15fcc7b9773cf --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/it.lng @@ -0,0 +1,40 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/it_firewall.lng b/interface/ispconfig/interface/admin/lib/lang/it_firewall.lng new file mode 100644 index 0000000000000000000000000000000000000000..c58341df892d70b42cf4ec15676075ad0d4b7e6e --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/it_firewall.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/it_firewall_list.lng b/interface/ispconfig/interface/admin/lib/lang/it_firewall_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..24a34be1c121271493b5c469f3defce76a660523 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/it_firewall_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/it_groups.lng b/interface/ispconfig/interface/admin/lib/lang/it_groups.lng new file mode 100644 index 0000000000000000000000000000000000000000..61c3dc538d47a4daad960cc7be1d4fca220b5a06 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/it_groups.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/it_groups_list.lng b/interface/ispconfig/interface/admin/lib/lang/it_groups_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..f1d8e2c1a33b92ad997cc3373de412aacf5202dc --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/it_groups_list.lng @@ -0,0 +1,7 @@ +WARNING: Do not edit or modify any user settings here. Use the Client- and Reseller settings in the Client module instead. Modifying or changing Users or groups here may cause data loss!'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/it_language_add.lng b/interface/ispconfig/interface/admin/lib/lang/it_language_add.lng new file mode 100644 index 0000000000000000000000000000000000000000..d157e08f6f7b7a2b9788f849efb1d7974edfa1e7 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/it_language_add.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/it_language_complete.lng b/interface/ispconfig/interface/admin/lib/lang/it_language_complete.lng new file mode 100644 index 0000000000000000000000000000000000000000..b5200ff9df30536d461edf601236bc2e91112af7 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/it_language_complete.lng @@ -0,0 +1,7 @@ +This adds missing strings from the english master language files to the selected language.'; +$wb['language_select_txt'] = 'Select language'; +$wb['btn_save_txt'] = 'Merge files now'; +$wb['btn_cancel_txt'] = 'Back'; +$wb['list_desc_txt'] = 'Merge the selected language file with the english master language file.
This adds missing strings from the english master language files to the selected language.'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/it_language_edit.lng b/interface/ispconfig/interface/admin/lib/lang/it_language_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..4c50e883e6933c8a9449319b4524216e9adac9f5 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/it_language_edit.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/it_language_export.lng b/interface/ispconfig/interface/admin/lib/lang/it_language_export.lng new file mode 100644 index 0000000000000000000000000000000000000000..f45d47b17c7e0e208e49a14fdabe76ed41f52367 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/it_language_export.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/it_language_import.lng b/interface/ispconfig/interface/admin/lib/lang/it_language_import.lng new file mode 100644 index 0000000000000000000000000000000000000000..4c31ec3de3606dcb7aebf451f711ff2dd41a8981 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/it_language_import.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/it_language_list.lng b/interface/ispconfig/interface/admin/lib/lang/it_language_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..c63fb0f57042f31f4e47803ce2c956e302d6ff97 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/it_language_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/it_remote_user.lng b/interface/ispconfig/interface/admin/lib/lang/it_remote_user.lng new file mode 100644 index 0000000000000000000000000000000000000000..cc9335bc52638b05b2a4419cbb6415daebbca52e --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/it_remote_user.lng @@ -0,0 +1,42 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/it_remote_user_list.lng b/interface/ispconfig/interface/admin/lib/lang/it_remote_user_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..152a75fba4c8917a1829b6960df7291e583d34a7 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/it_remote_user_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/it_server.lng b/interface/ispconfig/interface/admin/lib/lang/it_server.lng new file mode 100644 index 0000000000000000000000000000000000000000..922eae179fe8c8744297391041e71f9d81ddb6a1 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/it_server.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/it_server_config.lng b/interface/ispconfig/interface/admin/lib/lang/it_server_config.lng new file mode 100644 index 0000000000000000000000000000000000000000..dfe9ce657d6a43894fae7b36ddf1a75165091c5f --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/it_server_config.lng @@ -0,0 +1,68 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/it_server_config_list.lng b/interface/ispconfig/interface/admin/lib/lang/it_server_config_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..10a3e17316d3618a6f6350ec5010d94875dd2c07 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/it_server_config_list.lng @@ -0,0 +1,4 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/it_server_ip.lng b/interface/ispconfig/interface/admin/lib/lang/it_server_ip.lng new file mode 100644 index 0000000000000000000000000000000000000000..6d451f5b20bcee9480a6d5fccbc9c38bb974b113 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/it_server_ip.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/it_server_ip_list.lng b/interface/ispconfig/interface/admin/lib/lang/it_server_ip_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..c2c4ab9e0b06959528eeb959b4f06493ca3e3eca --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/it_server_ip_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/it_server_list.lng b/interface/ispconfig/interface/admin/lib/lang/it_server_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..79ec28fbb19f4b74c0565cf230089f2ae5381387 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/it_server_list.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/it_software_package_list.lng b/interface/ispconfig/interface/admin/lib/lang/it_software_package_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..03917cabce20eb163fd64a168a2c8bbaf58599e6 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/it_software_package_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/it_software_repo.lng b/interface/ispconfig/interface/admin/lib/lang/it_software_repo.lng new file mode 100644 index 0000000000000000000000000000000000000000..574dd1162989badc8499f5af31451a43673bf4da --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/it_software_repo.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/it_software_repo_list.lng b/interface/ispconfig/interface/admin/lib/lang/it_software_repo_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..4db52118ec6bd564032ac437355c68aa5e17cf78 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/it_software_repo_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/it_software_update_list.lng b/interface/ispconfig/interface/admin/lib/lang/it_software_update_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..d45ee9ac47f6dc3a1b7da4c2afb11b24cc5b1709 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/it_software_update_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/it_system_config.lng b/interface/ispconfig/interface/admin/lib/lang/it_system_config.lng new file mode 100644 index 0000000000000000000000000000000000000000..e7f5d9365e01f4adcfe52c7c7aba0075a096283d --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/it_system_config.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/it_users.lng b/interface/ispconfig/interface/admin/lib/lang/it_users.lng new file mode 100644 index 0000000000000000000000000000000000000000..8e70364aa7e32dfaa3066c953250a7af61b1bdfe --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/it_users.lng @@ -0,0 +1,28 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/it_users_list.lng b/interface/ispconfig/interface/admin/lib/lang/it_users_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..35598d33fff7ebc527da1b652f070ee1329b362a --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/it_users_list.lng @@ -0,0 +1,9 @@ +WARNING: Do not edit or modify any user settings here. Use the Client- and Reseller settings in the Client module instead. Modifying or changing Users or groups here may cause data loss!'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/ja.lng b/interface/ispconfig/interface/admin/lib/lang/ja.lng new file mode 100644 index 0000000000000000000000000000000000000000..338f024045a52761a6a4560e183714c9be404d8e --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ja.lng @@ -0,0 +1,40 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ja_firewall.lng b/interface/ispconfig/interface/admin/lib/lang/ja_firewall.lng new file mode 100644 index 0000000000000000000000000000000000000000..1f567b6b0493aa1b71d41efae4951e0bb4b69f3e --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ja_firewall.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ja_firewall_list.lng b/interface/ispconfig/interface/admin/lib/lang/ja_firewall_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..738c3e83f0f13654268c7a0eb3874cf9917bee43 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ja_firewall_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ja_groups.lng b/interface/ispconfig/interface/admin/lib/lang/ja_groups.lng new file mode 100644 index 0000000000000000000000000000000000000000..7fa2d9fa1a6fdf8f4abeb4c2c56e5e6dda074d22 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ja_groups.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ja_groups_list.lng b/interface/ispconfig/interface/admin/lib/lang/ja_groups_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..ced6ab2c4141890b6c0d34da70fb91297a6feb17 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ja_groups_list.lng @@ -0,0 +1,7 @@ +WARNING: Do not edit or modify any user settings here. Use the Client- and Reseller settings in the Client module instead. Modifying or changing Users or groups here may cause data loss!'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/ja_language_add.lng b/interface/ispconfig/interface/admin/lib/lang/ja_language_add.lng new file mode 100644 index 0000000000000000000000000000000000000000..c704242c92eaba0b83c224d9e677044e484cfaee --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ja_language_add.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ja_language_complete.lng b/interface/ispconfig/interface/admin/lib/lang/ja_language_complete.lng new file mode 100644 index 0000000000000000000000000000000000000000..a5da8806fd6b946c98dba14d462e688c1bcedd50 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ja_language_complete.lng @@ -0,0 +1,7 @@ +選んだ言語ファイルに欠けている要素がある場合、英語版から抜き出して追加します。'; +$wb['language_select_txt'] = '言語を選んでください'; +$wb['btn_save_txt'] = 'ファイルをマージする'; +$wb['btn_cancel_txt'] = '戻る'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/ja_language_edit.lng b/interface/ispconfig/interface/admin/lib/lang/ja_language_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..f913997b9c0e96cada520125764e05d1b3f41355 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ja_language_edit.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ja_language_export.lng b/interface/ispconfig/interface/admin/lib/lang/ja_language_export.lng new file mode 100644 index 0000000000000000000000000000000000000000..fc5d3845bcc2fd486bf17456abf8a0cae75a3778 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ja_language_export.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ja_language_import.lng b/interface/ispconfig/interface/admin/lib/lang/ja_language_import.lng new file mode 100644 index 0000000000000000000000000000000000000000..4c55514953169243010e8dd4ab55519d3ed1d453 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ja_language_import.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ja_language_list.lng b/interface/ispconfig/interface/admin/lib/lang/ja_language_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..7fe018edb586eb3165d8ecc13d9048a85c3ac7f4 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ja_language_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ja_remote_user.lng b/interface/ispconfig/interface/admin/lib/lang/ja_remote_user.lng new file mode 100644 index 0000000000000000000000000000000000000000..4a01d4c56afec166a6f797f2b2b88d26a784b7bd --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ja_remote_user.lng @@ -0,0 +1,42 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ja_remote_user_list.lng b/interface/ispconfig/interface/admin/lib/lang/ja_remote_user_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..4631fbbdbaf37578fac6e9443685d4c34fecc47d --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ja_remote_user_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ja_server.lng b/interface/ispconfig/interface/admin/lib/lang/ja_server.lng new file mode 100644 index 0000000000000000000000000000000000000000..8eb0ef74df7e9ea1f935c5440503792b9b94f86f --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ja_server.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ja_server_config.lng b/interface/ispconfig/interface/admin/lib/lang/ja_server_config.lng new file mode 100644 index 0000000000000000000000000000000000000000..5ef759a3a34f6a802220ba2e64fbabf7293064fa --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ja_server_config.lng @@ -0,0 +1,68 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ja_server_config_list.lng b/interface/ispconfig/interface/admin/lib/lang/ja_server_config_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..c77cfc9bcce692de17f35f916a61d056f6b19feb --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ja_server_config_list.lng @@ -0,0 +1,4 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ja_server_ip.lng b/interface/ispconfig/interface/admin/lib/lang/ja_server_ip.lng new file mode 100644 index 0000000000000000000000000000000000000000..db52f249dade73236ec79ad02841644214d3e323 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ja_server_ip.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ja_server_ip_list.lng b/interface/ispconfig/interface/admin/lib/lang/ja_server_ip_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..7879f512742ecd13bd1247926fa9b30ee1b87289 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ja_server_ip_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ja_server_list.lng b/interface/ispconfig/interface/admin/lib/lang/ja_server_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..1fa42e8efdb3c1aafc8630e8603ddf7f34bc71dd --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ja_server_list.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ja_software_package_list.lng b/interface/ispconfig/interface/admin/lib/lang/ja_software_package_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..5718b756e7559c2f46b9d572e9bb8b0d8fe85b2a --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ja_software_package_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ja_software_repo.lng b/interface/ispconfig/interface/admin/lib/lang/ja_software_repo.lng new file mode 100644 index 0000000000000000000000000000000000000000..fba63e9985d77f2df3ab21cc1724be59098165cc --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ja_software_repo.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ja_software_repo_list.lng b/interface/ispconfig/interface/admin/lib/lang/ja_software_repo_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..a7d06d8fdec5616b64fbd9e572d0d37b11b0a337 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ja_software_repo_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ja_software_update_list.lng b/interface/ispconfig/interface/admin/lib/lang/ja_software_update_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..b37528035daea58454a04c155bb58999c5305fe0 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ja_software_update_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ja_system_config.lng b/interface/ispconfig/interface/admin/lib/lang/ja_system_config.lng new file mode 100644 index 0000000000000000000000000000000000000000..673ef189d06ad56b12d819a17a33fb8fb724d0c1 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ja_system_config.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ja_users.lng b/interface/ispconfig/interface/admin/lib/lang/ja_users.lng new file mode 100644 index 0000000000000000000000000000000000000000..040c2692ac774cd5ca9dd1fae2f5450aa9b5e7d1 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ja_users.lng @@ -0,0 +1,28 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ja_users_list.lng b/interface/ispconfig/interface/admin/lib/lang/ja_users_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..2ab8d227fc040ab84a036bac440cf0b2c34a14e6 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ja_users_list.lng @@ -0,0 +1,9 @@ +WARNING: Do not edit or modify any user settings here. Use the Client- and Reseller settings in the Client module instead. Modifying or changing Users or groups here may cause data loss!'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/nl.lng b/interface/ispconfig/interface/admin/lib/lang/nl.lng new file mode 100644 index 0000000000000000000000000000000000000000..41071ac339fd9e8f66fac51d7846643500aaf88c --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/nl.lng @@ -0,0 +1,40 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/nl_firewall.lng b/interface/ispconfig/interface/admin/lib/lang/nl_firewall.lng new file mode 100644 index 0000000000000000000000000000000000000000..26001af2b82926bec187321da2884b93b88c0cc6 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/nl_firewall.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/nl_firewall_list.lng b/interface/ispconfig/interface/admin/lib/lang/nl_firewall_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..37f78048cc22d28bb482afaed1f04989c1851c07 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/nl_firewall_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/nl_groups.lng b/interface/ispconfig/interface/admin/lib/lang/nl_groups.lng new file mode 100644 index 0000000000000000000000000000000000000000..0454a672e3298ea5ece9962395c08dafc9f9bada --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/nl_groups.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/nl_groups_list.lng b/interface/ispconfig/interface/admin/lib/lang/nl_groups_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..43e2729a09668bf4ca3599e1d6be4ba81dbe2474 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/nl_groups_list.lng @@ -0,0 +1,7 @@ +LET OP: Uitgevoerde wijzigingen in deze module kunnen gevolgen hebben voor gebruikers gekoppeld aan deze groepen!'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/nl_language_add.lng b/interface/ispconfig/interface/admin/lib/lang/nl_language_add.lng new file mode 100644 index 0000000000000000000000000000000000000000..8a5c5db5f456c6fd47f1dc7297671f725fe75a8e --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/nl_language_add.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/nl_language_complete.lng b/interface/ispconfig/interface/admin/lib/lang/nl_language_complete.lng new file mode 100644 index 0000000000000000000000000000000000000000..61163713120d1f7dc1b0ec3337d7b01fd066e4a5 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/nl_language_complete.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/nl_language_edit.lng b/interface/ispconfig/interface/admin/lib/lang/nl_language_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..9656b36a08739c4f6cfad3881034bd050c28ace3 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/nl_language_edit.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/nl_language_export.lng b/interface/ispconfig/interface/admin/lib/lang/nl_language_export.lng new file mode 100644 index 0000000000000000000000000000000000000000..2c1d78f7d7ce0b3fc066bfd0f805ac73b0d4fc95 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/nl_language_export.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/nl_language_import.lng b/interface/ispconfig/interface/admin/lib/lang/nl_language_import.lng new file mode 100644 index 0000000000000000000000000000000000000000..f1d5fa51acbe22dc3363aa7260a9ab64716c047e --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/nl_language_import.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/nl_language_list.lng b/interface/ispconfig/interface/admin/lib/lang/nl_language_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..dc5843af24e16fd71245bb36332ad7dfd0eec42e --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/nl_language_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/nl_remote_user.lng b/interface/ispconfig/interface/admin/lib/lang/nl_remote_user.lng new file mode 100644 index 0000000000000000000000000000000000000000..4f9dc1de3580509c5c8a7fa2de85dcaebf9cc745 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/nl_remote_user.lng @@ -0,0 +1,42 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/nl_remote_user_list.lng b/interface/ispconfig/interface/admin/lib/lang/nl_remote_user_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..664ea756ec78f50e5f993810496190f55a1df038 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/nl_remote_user_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/nl_server.lng b/interface/ispconfig/interface/admin/lib/lang/nl_server.lng new file mode 100644 index 0000000000000000000000000000000000000000..f348c7962fc5db5389f5cd537cc374fa573e8de2 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/nl_server.lng @@ -0,0 +1,13 @@ +
Wijzigen? Zie: Server configuratie'; +$wb['server_name_txt'] = 'Servernaam'; +$wb['mail_server_txt'] = 'Mailserver'; +$wb['web_server_txt'] = 'Webserver'; +$wb['dns_server_txt'] = 'DNS server'; +$wb['file_server_txt'] = 'Fileserver'; +$wb['db_server_txt'] = 'Database server'; +$wb['vserver_server_txt'] = 'VServer-server'; +$wb['active_txt'] = 'Actief?'; +$wb['mirror_server_id_txt'] = 'Deze server is mirror van server'; +$wb['- None -'] = '- niet van toepassing -'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/nl_server_config.lng b/interface/ispconfig/interface/admin/lib/lang/nl_server_config.lng new file mode 100644 index 0000000000000000000000000000000000000000..8293bb8135de8836e489f0d01f3124da1b63fe42 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/nl_server_config.lng @@ -0,0 +1,68 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/nl_server_config_list.lng b/interface/ispconfig/interface/admin/lib/lang/nl_server_config_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..3d376e5f196f8129a7b8bd3bebd4354975997311 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/nl_server_config_list.lng @@ -0,0 +1,4 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/nl_server_ip.lng b/interface/ispconfig/interface/admin/lib/lang/nl_server_ip.lng new file mode 100644 index 0000000000000000000000000000000000000000..ef8079adaa24dfbbc9771d9cb536127a43a7da42 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/nl_server_ip.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/nl_server_ip_list.lng b/interface/ispconfig/interface/admin/lib/lang/nl_server_ip_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..acbd83e294945a9cd7a38d3e8e82446f9e26a9c5 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/nl_server_ip_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/nl_server_list.lng b/interface/ispconfig/interface/admin/lib/lang/nl_server_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..05e7aac6c2c9eb262d023f5afa0a377a022b6989 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/nl_server_list.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/nl_software_package_list.lng b/interface/ispconfig/interface/admin/lib/lang/nl_software_package_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..177e1b82c47b19efe34928bfadb1c32d20199328 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/nl_software_package_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/nl_software_repo.lng b/interface/ispconfig/interface/admin/lib/lang/nl_software_repo.lng new file mode 100644 index 0000000000000000000000000000000000000000..bd4c93119290603c313cf804cdf3290d7bce83e2 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/nl_software_repo.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/nl_software_repo_list.lng b/interface/ispconfig/interface/admin/lib/lang/nl_software_repo_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..737e5cf4358548f6fea319c8b2d9e91cb1b50376 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/nl_software_repo_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/nl_software_update_list.lng b/interface/ispconfig/interface/admin/lib/lang/nl_software_update_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..7c8dc76232a412ea3206f13ca7f1bce0e8374fa0 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/nl_software_update_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/nl_system_config.lng b/interface/ispconfig/interface/admin/lib/lang/nl_system_config.lng new file mode 100644 index 0000000000000000000000000000000000000000..6d6d4f9a16db83a6b1e0659dcefd27a15f5735d5 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/nl_system_config.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/nl_users.lng b/interface/ispconfig/interface/admin/lib/lang/nl_users.lng new file mode 100644 index 0000000000000000000000000000000000000000..4ab27372c78100ce84bc0db8bb7b1fa5e6e465fc --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/nl_users.lng @@ -0,0 +1,28 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/nl_users_list.lng b/interface/ispconfig/interface/admin/lib/lang/nl_users_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..1435934003feff8c163b7ca5bc3ac64853ba746f --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/nl_users_list.lng @@ -0,0 +1,9 @@ +LET OP: Verander hier geen gegevens. Gebruik daarvoor de functie Wijzig klant/Wijzig reseller onder de Klanten-module van ISPConfig. Het veranderen van gebruikers in deze module kan dataverlies opleveren!'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/pl.lng b/interface/ispconfig/interface/admin/lib/lang/pl.lng new file mode 100644 index 0000000000000000000000000000000000000000..939bffb3dd72888a1e797a14e938f387a6d1a66a --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pl.lng @@ -0,0 +1,40 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/pl_firewall.lng b/interface/ispconfig/interface/admin/lib/lang/pl_firewall.lng new file mode 100644 index 0000000000000000000000000000000000000000..a216af6b1c0839e45c8e97eb089d668fc8225203 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pl_firewall.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/pl_firewall_list.lng b/interface/ispconfig/interface/admin/lib/lang/pl_firewall_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..f7e1640404ac610157313081934dc4286b4c9717 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pl_firewall_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/pl_groups.lng b/interface/ispconfig/interface/admin/lib/lang/pl_groups.lng new file mode 100644 index 0000000000000000000000000000000000000000..b3c8b9ca777f58387a7713ceb9e0170b03b39f77 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pl_groups.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/pl_groups_list.lng b/interface/ispconfig/interface/admin/lib/lang/pl_groups_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..14565b0c76f282ab531e730127f7066ed41c30c7 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pl_groups_list.lng @@ -0,0 +1,7 @@ +WARNING: Do not edit or modify any user settings here. Use the Client- and Reseller settings in the Client module instead. Modifying or changing Users or groups here may cause data loss!'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/pl_language_add.lng b/interface/ispconfig/interface/admin/lib/lang/pl_language_add.lng new file mode 100644 index 0000000000000000000000000000000000000000..82e42ef720eea1c0c5e7387249693933b41b68bc --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pl_language_add.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/pl_language_complete.lng b/interface/ispconfig/interface/admin/lib/lang/pl_language_complete.lng new file mode 100644 index 0000000000000000000000000000000000000000..0096c69efabccd5775ca0bc4e739e21156cae4c4 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pl_language_complete.lng @@ -0,0 +1,7 @@ +Ta opcja dodaje do wybranego języka brakujące zmienne językowe z plików języka angielskiego.'; +$wb['language_select_txt'] = 'Wybierz język'; +$wb['btn_save_txt'] = 'Połącz pliki teraz'; +$wb['btn_cancel_txt'] = 'Wróć'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/pl_language_edit.lng b/interface/ispconfig/interface/admin/lib/lang/pl_language_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..3a5e7069393b0af5a2da2b080b3b55d0673f62a9 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pl_language_edit.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/pl_language_export.lng b/interface/ispconfig/interface/admin/lib/lang/pl_language_export.lng new file mode 100644 index 0000000000000000000000000000000000000000..82666fcb7802901bf00fb9dd1a94c233a7192ed7 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pl_language_export.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/pl_language_import.lng b/interface/ispconfig/interface/admin/lib/lang/pl_language_import.lng new file mode 100644 index 0000000000000000000000000000000000000000..83e988116581ad59fd7e55e00033a2ada7345481 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pl_language_import.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/pl_language_list.lng b/interface/ispconfig/interface/admin/lib/lang/pl_language_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..68f710be04737d4f2c44388b8a0ca08c6c55873d --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pl_language_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/pl_remote_user.lng b/interface/ispconfig/interface/admin/lib/lang/pl_remote_user.lng new file mode 100644 index 0000000000000000000000000000000000000000..cc9335bc52638b05b2a4419cbb6415daebbca52e --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pl_remote_user.lng @@ -0,0 +1,42 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/pl_remote_user_list.lng b/interface/ispconfig/interface/admin/lib/lang/pl_remote_user_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..152a75fba4c8917a1829b6960df7291e583d34a7 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pl_remote_user_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/pl_server.lng b/interface/ispconfig/interface/admin/lib/lang/pl_server.lng new file mode 100644 index 0000000000000000000000000000000000000000..c027c0b31fa7deeed75cd3c45367c07e9f93b6c3 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pl_server.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/pl_server_config.lng b/interface/ispconfig/interface/admin/lib/lang/pl_server_config.lng new file mode 100644 index 0000000000000000000000000000000000000000..76c3589c725673f47c0bf274d3c740b9f17ecf96 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pl_server_config.lng @@ -0,0 +1,68 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/pl_server_config_list.lng b/interface/ispconfig/interface/admin/lib/lang/pl_server_config_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..f9e8dcf1b559349ac491040e4920bec5fa38a7e6 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pl_server_config_list.lng @@ -0,0 +1,4 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/pl_server_ip.lng b/interface/ispconfig/interface/admin/lib/lang/pl_server_ip.lng new file mode 100644 index 0000000000000000000000000000000000000000..41e0b941625c1320d64818764e13227351804d8e --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pl_server_ip.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/pl_server_ip_list.lng b/interface/ispconfig/interface/admin/lib/lang/pl_server_ip_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..6ab81c1e5b408915764d4c25f69d4f30d5029305 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pl_server_ip_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/pl_server_list.lng b/interface/ispconfig/interface/admin/lib/lang/pl_server_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..f61ba5fc8764d1e275290810d2a8907be7e93892 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pl_server_list.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/pl_software_package_list.lng b/interface/ispconfig/interface/admin/lib/lang/pl_software_package_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..9549333b1a352d8b50aa8b0de73bfe815ac97856 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pl_software_package_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/pl_software_repo.lng b/interface/ispconfig/interface/admin/lib/lang/pl_software_repo.lng new file mode 100644 index 0000000000000000000000000000000000000000..d11a1b3b330d331c507e129f195f3f6ada2874f5 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pl_software_repo.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/pl_software_repo_list.lng b/interface/ispconfig/interface/admin/lib/lang/pl_software_repo_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..7ca6af9f9f43559891103a0c50ebd189da3f795b --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pl_software_repo_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/pl_software_update_list.lng b/interface/ispconfig/interface/admin/lib/lang/pl_software_update_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..e38bdf8a317456ce5e84b4e8ff6f689094ae8161 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pl_software_update_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/pl_system_config.lng b/interface/ispconfig/interface/admin/lib/lang/pl_system_config.lng new file mode 100644 index 0000000000000000000000000000000000000000..adaffcaa666c4cab00f072bc3326de7020f9bce4 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pl_system_config.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/pl_users.lng b/interface/ispconfig/interface/admin/lib/lang/pl_users.lng new file mode 100644 index 0000000000000000000000000000000000000000..3b2472dfeb005bd15a2650b19eb788d999c8102a --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pl_users.lng @@ -0,0 +1,28 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/pl_users_list.lng b/interface/ispconfig/interface/admin/lib/lang/pl_users_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..b628eae876f0c45379c0f99b1dc642c009f7ac31 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pl_users_list.lng @@ -0,0 +1,9 @@ +WARNING: Do not edit or modify any user settings here. Use the Client- and Reseller settings in the Client module instead. Modifying or changing Users or groups here may cause data loss!'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/pt.lng b/interface/ispconfig/interface/admin/lib/lang/pt.lng new file mode 100644 index 0000000000000000000000000000000000000000..81bcba098114e328c5f0792190da0f8ce183e047 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pt.lng @@ -0,0 +1,41 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/pt_firewall.lng b/interface/ispconfig/interface/admin/lib/lang/pt_firewall.lng new file mode 100644 index 0000000000000000000000000000000000000000..9c1fb784be1d34cb8d92b6d054fc515361e887e6 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pt_firewall.lng @@ -0,0 +1,12 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/pt_firewall_list.lng b/interface/ispconfig/interface/admin/lib/lang/pt_firewall_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..d1dd50b7194b65e88d747bc68ff202d5cf11ce43 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pt_firewall_list.lng @@ -0,0 +1,9 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/pt_groups.lng b/interface/ispconfig/interface/admin/lib/lang/pt_groups.lng new file mode 100644 index 0000000000000000000000000000000000000000..ee7577627264b47328a7f93b8d91529be6f5a50d --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pt_groups.lng @@ -0,0 +1,6 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/pt_groups_list.lng b/interface/ispconfig/interface/admin/lib/lang/pt_groups_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..6e61aef914db0a9ca1752d7bee6b045023368251 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pt_groups_list.lng @@ -0,0 +1,8 @@ +AVISO: Não modifique ou edite qualquer configuração de utilizador aqui. Use o módulo de cliente ou revendedor. Modificar ou alterar utilizadors e grupos aqui pode ocasionar perda de dados!'; +?> + diff --git a/interface/ispconfig/interface/admin/lib/lang/pt_language_add.lng b/interface/ispconfig/interface/admin/lib/lang/pt_language_add.lng new file mode 100644 index 0000000000000000000000000000000000000000..fb1a41ad6d757838b7ee0d5cdc2c2ab74a5ae306 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pt_language_add.lng @@ -0,0 +1,9 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/pt_language_complete.lng b/interface/ispconfig/interface/admin/lib/lang/pt_language_complete.lng new file mode 100644 index 0000000000000000000000000000000000000000..54f44d0140f316be58636cb4eb706cd5c6c767c0 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pt_language_complete.lng @@ -0,0 +1,8 @@ +Isto permite completar qualquer falha de tradução, com o ficheiro principal original em inglês.'; +$wb['language_select_txt'] = 'Seleccionar Idioma'; +$wb['btn_save_txt'] = 'Mesclar ficheiros agora'; +$wb['btn_cancel_txt'] = 'Voltar'; +?> + diff --git a/interface/ispconfig/interface/admin/lib/lang/pt_language_edit.lng b/interface/ispconfig/interface/admin/lib/lang/pt_language_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..0c6e29a3370203fb5f4e95580436bb6920ed5419 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pt_language_edit.lng @@ -0,0 +1,9 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/pt_language_export.lng b/interface/ispconfig/interface/admin/lib/lang/pt_language_export.lng new file mode 100644 index 0000000000000000000000000000000000000000..b4630e5e48a5a647db19150f15bfe602300460a7 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pt_language_export.lng @@ -0,0 +1,7 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/pt_language_import.lng b/interface/ispconfig/interface/admin/lib/lang/pt_language_import.lng new file mode 100644 index 0000000000000000000000000000000000000000..0d0967b491b86f191ea8970fe369606c27a47215 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pt_language_import.lng @@ -0,0 +1,9 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/pt_language_list.lng b/interface/ispconfig/interface/admin/lib/lang/pt_language_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..649cd9d2fa6dd3417af23331c2f6a0706ee9e48d --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pt_language_list.lng @@ -0,0 +1,8 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/pt_remote_user.lng b/interface/ispconfig/interface/admin/lib/lang/pt_remote_user.lng new file mode 100644 index 0000000000000000000000000000000000000000..1db8400502eb68c8d342268fdc15dbcda669b00b --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pt_remote_user.lng @@ -0,0 +1,43 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/pt_remote_user_list.lng b/interface/ispconfig/interface/admin/lib/lang/pt_remote_user_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..850b5ed2ebecee77e614bcfc9f5167e991b9244f --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pt_remote_user_list.lng @@ -0,0 +1,8 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/pt_server.lng b/interface/ispconfig/interface/admin/lib/lang/pt_server.lng new file mode 100644 index 0000000000000000000000000000000000000000..a7cc7cbfab2f3419e5fe52a30447ce8789e3884b --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pt_server.lng @@ -0,0 +1,14 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/pt_server_config.lng b/interface/ispconfig/interface/admin/lib/lang/pt_server_config.lng new file mode 100644 index 0000000000000000000000000000000000000000..8c281b919c38bd16c92348a2c0667eeb939c4bcd --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pt_server_config.lng @@ -0,0 +1,69 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/pt_server_config_list.lng b/interface/ispconfig/interface/admin/lib/lang/pt_server_config_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..551867db8ebf6a01058d2a5d53b9138ae1e96540 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pt_server_config_list.lng @@ -0,0 +1,5 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/pt_server_ip.lng b/interface/ispconfig/interface/admin/lib/lang/pt_server_ip.lng new file mode 100644 index 0000000000000000000000000000000000000000..3fab2638633f3ae7ccbef8ff72c2ec168ce3eb12 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pt_server_ip.lng @@ -0,0 +1,8 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/pt_server_ip_list.lng b/interface/ispconfig/interface/admin/lib/lang/pt_server_ip_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..a9c4ffe2c05f1a8f6c6fb75b95f35a63ef12e2cd --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pt_server_ip_list.lng @@ -0,0 +1,7 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/pt_server_list.lng b/interface/ispconfig/interface/admin/lib/lang/pt_server_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..e3c3c8ad6f8bec624e4247ff3e645a411de5a920 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pt_server_list.lng @@ -0,0 +1,12 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/pt_software_package_list.lng b/interface/ispconfig/interface/admin/lib/lang/pt_software_package_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..cba1c698eb7b482c4f4acd39b6378f619c8ae5a8 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pt_software_package_list.lng @@ -0,0 +1,8 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/pt_software_repo.lng b/interface/ispconfig/interface/admin/lib/lang/pt_software_repo.lng new file mode 100644 index 0000000000000000000000000000000000000000..257e0b5b8167752acf9fddc13344c8db437a4eec --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pt_software_repo.lng @@ -0,0 +1,8 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/pt_software_repo_list.lng b/interface/ispconfig/interface/admin/lib/lang/pt_software_repo_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..5b60ee24dd1cdb30072b6c8ce10bd6a023224ac8 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pt_software_repo_list.lng @@ -0,0 +1,7 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/pt_software_update_list.lng b/interface/ispconfig/interface/admin/lib/lang/pt_software_update_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..163731ba7ca1bb97da4a08021f2e8281e3a1f209 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pt_software_update_list.lng @@ -0,0 +1,9 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/pt_system_config.lng b/interface/ispconfig/interface/admin/lib/lang/pt_system_config.lng new file mode 100644 index 0000000000000000000000000000000000000000..9a662a9a28f1d0afebee1403bf6d40f5db32720e --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pt_system_config.lng @@ -0,0 +1,16 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/pt_users.lng b/interface/ispconfig/interface/admin/lib/lang/pt_users.lng new file mode 100644 index 0000000000000000000000000000000000000000..fdf07aa3e95a8e7534856c58a27ef1f09e27c0ef --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pt_users.lng @@ -0,0 +1,29 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/pt_users_list.lng b/interface/ispconfig/interface/admin/lib/lang/pt_users_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..6ebec0a12a28ee66f619bc454f13a57eea7b5c0f --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pt_users_list.lng @@ -0,0 +1,10 @@ +AVISO: Não modifique ou edite qualquer configuração de utilizador aqui. Use o módulo de cliente ou revendedor. Modificar ou alterar utilizadors e grupos aqui pode resultar na perda de dados!'; +?> + diff --git a/interface/ispconfig/interface/admin/lib/lang/ro.lng b/interface/ispconfig/interface/admin/lib/lang/ro.lng new file mode 100644 index 0000000000000000000000000000000000000000..77d07ab2dd60576785d32ee237b5990354bc2b56 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ro.lng @@ -0,0 +1,40 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ro_firewall.lng b/interface/ispconfig/interface/admin/lib/lang/ro_firewall.lng new file mode 100644 index 0000000000000000000000000000000000000000..e626345d3c1ee3bbce74ffd70c36fcc7ff3297c2 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ro_firewall.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ro_firewall_list.lng b/interface/ispconfig/interface/admin/lib/lang/ro_firewall_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..24a34be1c121271493b5c469f3defce76a660523 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ro_firewall_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ro_groups.lng b/interface/ispconfig/interface/admin/lib/lang/ro_groups.lng new file mode 100644 index 0000000000000000000000000000000000000000..61c3dc538d47a4daad960cc7be1d4fca220b5a06 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ro_groups.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ro_groups_list.lng b/interface/ispconfig/interface/admin/lib/lang/ro_groups_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..f1d8e2c1a33b92ad997cc3373de412aacf5202dc --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ro_groups_list.lng @@ -0,0 +1,7 @@ +WARNING: Do not edit or modify any user settings here. Use the Client- and Reseller settings in the Client module instead. Modifying or changing Users or groups here may cause data loss!'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/ro_language_add.lng b/interface/ispconfig/interface/admin/lib/lang/ro_language_add.lng new file mode 100644 index 0000000000000000000000000000000000000000..dc6b2d1b725f9fc83a09377176200713adf99cb0 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ro_language_add.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ro_language_complete.lng b/interface/ispconfig/interface/admin/lib/lang/ro_language_complete.lng new file mode 100644 index 0000000000000000000000000000000000000000..db7c05bb2d24bad9c50cce5c00f0eb8997cf2dd0 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ro_language_complete.lng @@ -0,0 +1,7 @@ +This adds missing strings from the english master language files to the selected language.'; +$wb['language_select_txt'] = 'Select language'; +$wb['btn_save_txt'] = 'Merge files now'; +$wb['btn_cancel_txt'] = 'Back'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/ro_language_edit.lng b/interface/ispconfig/interface/admin/lib/lang/ro_language_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..4c50e883e6933c8a9449319b4524216e9adac9f5 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ro_language_edit.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ro_language_export.lng b/interface/ispconfig/interface/admin/lib/lang/ro_language_export.lng new file mode 100644 index 0000000000000000000000000000000000000000..f45d47b17c7e0e208e49a14fdabe76ed41f52367 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ro_language_export.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ro_language_import.lng b/interface/ispconfig/interface/admin/lib/lang/ro_language_import.lng new file mode 100644 index 0000000000000000000000000000000000000000..fefae80d037cac068fbada7947ee2a70c3eaf704 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ro_language_import.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ro_language_list.lng b/interface/ispconfig/interface/admin/lib/lang/ro_language_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..1c784edf6d06b268c72b43ab0e4c14e8e325905a --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ro_language_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ro_remote_user.lng b/interface/ispconfig/interface/admin/lib/lang/ro_remote_user.lng new file mode 100644 index 0000000000000000000000000000000000000000..cc9335bc52638b05b2a4419cbb6415daebbca52e --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ro_remote_user.lng @@ -0,0 +1,42 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ro_remote_user_list.lng b/interface/ispconfig/interface/admin/lib/lang/ro_remote_user_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..56c6fac4be29b7a8bbc856383c7044edd82214f4 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ro_remote_user_list.lng @@ -0,0 +1,8 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/ro_server.lng b/interface/ispconfig/interface/admin/lib/lang/ro_server.lng new file mode 100644 index 0000000000000000000000000000000000000000..1b42f22c89bb1d1b31c43935eb77ab24fd28db77 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ro_server.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ro_server_config.lng b/interface/ispconfig/interface/admin/lib/lang/ro_server_config.lng new file mode 100644 index 0000000000000000000000000000000000000000..36899fd02038e58efdba1bdc456fbf39f155b252 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ro_server_config.lng @@ -0,0 +1,68 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ro_server_config_list.lng b/interface/ispconfig/interface/admin/lib/lang/ro_server_config_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..636c2e050a026856a624bbd1ef3613df64544ba7 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ro_server_config_list.lng @@ -0,0 +1,4 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ro_server_ip.lng b/interface/ispconfig/interface/admin/lib/lang/ro_server_ip.lng new file mode 100644 index 0000000000000000000000000000000000000000..6d451f5b20bcee9480a6d5fccbc9c38bb974b113 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ro_server_ip.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ro_server_ip_list.lng b/interface/ispconfig/interface/admin/lib/lang/ro_server_ip_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..4e9831666375ce75e76a260a79c98a79594b6808 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ro_server_ip_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ro_server_list.lng b/interface/ispconfig/interface/admin/lib/lang/ro_server_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..5cea9d216aa508e608b8166f75ceca708c626519 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ro_server_list.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ro_software_package_list.lng b/interface/ispconfig/interface/admin/lib/lang/ro_software_package_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..3bcf7bcea902d03c0d9cf211c15cb9c52a08993b --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ro_software_package_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ro_software_repo.lng b/interface/ispconfig/interface/admin/lib/lang/ro_software_repo.lng new file mode 100644 index 0000000000000000000000000000000000000000..574dd1162989badc8499f5af31451a43673bf4da --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ro_software_repo.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ro_software_repo_list.lng b/interface/ispconfig/interface/admin/lib/lang/ro_software_repo_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..b7a219ffa8e2f6d389fabdc5386286a24fc2a11a --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ro_software_repo_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ro_software_update_list.lng b/interface/ispconfig/interface/admin/lib/lang/ro_software_update_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..fc96ffa182e1f5fe86296ff3663a0360b01bbb4b --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ro_software_update_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ro_system_config.lng b/interface/ispconfig/interface/admin/lib/lang/ro_system_config.lng new file mode 100644 index 0000000000000000000000000000000000000000..e7f5d9365e01f4adcfe52c7c7aba0075a096283d --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ro_system_config.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ro_users.lng b/interface/ispconfig/interface/admin/lib/lang/ro_users.lng new file mode 100644 index 0000000000000000000000000000000000000000..8e70364aa7e32dfaa3066c953250a7af61b1bdfe --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ro_users.lng @@ -0,0 +1,28 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ro_users_list.lng b/interface/ispconfig/interface/admin/lib/lang/ro_users_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..16d8179fa43a405441017551a6c515c75a9caa39 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ro_users_list.lng @@ -0,0 +1,9 @@ +WARNING: Do not edit or modify any user settings here. Use the Client- and Reseller settings in the Client module instead. Modifying or changing Users or groups here may cause data loss!'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/ru.lng b/interface/ispconfig/interface/admin/lib/lang/ru.lng new file mode 100644 index 0000000000000000000000000000000000000000..19d632edf4908ce990bb093f5b3387605e61c5a6 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ru.lng @@ -0,0 +1,41 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/ru_firewall.lng b/interface/ispconfig/interface/admin/lib/lang/ru_firewall.lng new file mode 100644 index 0000000000000000000000000000000000000000..dfe0c10d10a7b8160a8721cb9f2f1cd34a3051b5 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ru_firewall.lng @@ -0,0 +1,12 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/ru_firewall_list.lng b/interface/ispconfig/interface/admin/lib/lang/ru_firewall_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..fc2fffad4d3cf429ca1e8b4f2d999cc137b27484 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ru_firewall_list.lng @@ -0,0 +1,9 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/ru_groups.lng b/interface/ispconfig/interface/admin/lib/lang/ru_groups.lng new file mode 100644 index 0000000000000000000000000000000000000000..d377f5f88532ce2e1a5e0eefe9aea3ef4a4eab73 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ru_groups.lng @@ -0,0 +1,6 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/ru_groups_list.lng b/interface/ispconfig/interface/admin/lib/lang/ru_groups_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..1495e6900b70b869aa22c51bf575f373e7f45e2c --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ru_groups_list.lng @@ -0,0 +1,8 @@ +ВНИМАНИЕ:Не удаляйте и не меняйте никаких настроек здесь. Используйте настройки клиента и реселлера в модуле КЛИЕНТ. Изменение пользователей или групп здесь может вызвать потерю данных!'; +?> + diff --git a/interface/ispconfig/interface/admin/lib/lang/ru_language_add.lng b/interface/ispconfig/interface/admin/lib/lang/ru_language_add.lng new file mode 100644 index 0000000000000000000000000000000000000000..5d1d154c87865bb9fbf24ff12ef1cac2fc1c0101 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ru_language_add.lng @@ -0,0 +1,9 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/ru_language_complete.lng b/interface/ispconfig/interface/admin/lib/lang/ru_language_complete.lng new file mode 100644 index 0000000000000000000000000000000000000000..c7ade3cd7fbf3e25b19980d4de68b546ccbcfa77 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ru_language_complete.lng @@ -0,0 +1,8 @@ +Это добавит пропущенные строки из мастер-языка.'; +?> + diff --git a/interface/ispconfig/interface/admin/lib/lang/ru_language_edit.lng b/interface/ispconfig/interface/admin/lib/lang/ru_language_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..b5cbb166940688981d87c88a0f7671e8dc06e539 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ru_language_edit.lng @@ -0,0 +1,9 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/ru_language_export.lng b/interface/ispconfig/interface/admin/lib/lang/ru_language_export.lng new file mode 100644 index 0000000000000000000000000000000000000000..9a4a929afaa05dcbef394c237154da2651acc94f --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ru_language_export.lng @@ -0,0 +1,7 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/ru_language_import.lng b/interface/ispconfig/interface/admin/lib/lang/ru_language_import.lng new file mode 100644 index 0000000000000000000000000000000000000000..f0b767e4da5760e4d0beadc448210dd09cbeb405 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ru_language_import.lng @@ -0,0 +1,9 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/ru_language_list.lng b/interface/ispconfig/interface/admin/lib/lang/ru_language_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..72561a7aff2e2c93c1ba003e70a095ca4e4c62a6 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ru_language_list.lng @@ -0,0 +1,8 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/ru_remote_user.lng b/interface/ispconfig/interface/admin/lib/lang/ru_remote_user.lng new file mode 100644 index 0000000000000000000000000000000000000000..ceee7b9ee719516d698f9698572bafc3e6b648a3 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ru_remote_user.lng @@ -0,0 +1,43 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/ru_remote_user_list.lng b/interface/ispconfig/interface/admin/lib/lang/ru_remote_user_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..f1bcdf968152da693c8cbeef33b53360fe1dd9d6 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ru_remote_user_list.lng @@ -0,0 +1,8 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/ru_server.lng b/interface/ispconfig/interface/admin/lib/lang/ru_server.lng new file mode 100644 index 0000000000000000000000000000000000000000..5575e658247d7007f950fd24b9320002311776a3 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ru_server.lng @@ -0,0 +1,14 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/ru_server_config.lng b/interface/ispconfig/interface/admin/lib/lang/ru_server_config.lng new file mode 100644 index 0000000000000000000000000000000000000000..c0530b62c518d853786929e842055ea2ac892bd4 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ru_server_config.lng @@ -0,0 +1,69 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/ru_server_config_list.lng b/interface/ispconfig/interface/admin/lib/lang/ru_server_config_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..351caaf57fbfbbee559f35e11dabe0ddd7b52bd6 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ru_server_config_list.lng @@ -0,0 +1,5 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/ru_server_ip.lng b/interface/ispconfig/interface/admin/lib/lang/ru_server_ip.lng new file mode 100644 index 0000000000000000000000000000000000000000..a835da047c9eca8fb083db090aa14292a76b234f --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ru_server_ip.lng @@ -0,0 +1,8 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/ru_server_ip_list.lng b/interface/ispconfig/interface/admin/lib/lang/ru_server_ip_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..8e06c0a91d132ce9eb0f9b24cf6327411f9acf9e --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ru_server_ip_list.lng @@ -0,0 +1,7 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/ru_server_list.lng b/interface/ispconfig/interface/admin/lib/lang/ru_server_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..4290a697923a53a84e050396c2f4f20e69848199 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ru_server_list.lng @@ -0,0 +1,12 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/ru_software_package_list.lng b/interface/ispconfig/interface/admin/lib/lang/ru_software_package_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..7c4fbd8ba985d453281ead4b2cf0cb4280f0cbac --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ru_software_package_list.lng @@ -0,0 +1,8 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/ru_software_repo.lng b/interface/ispconfig/interface/admin/lib/lang/ru_software_repo.lng new file mode 100644 index 0000000000000000000000000000000000000000..7d5abbcf9dbb3c8a53c57f34938f0038c1be4dbb --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ru_software_repo.lng @@ -0,0 +1,8 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/ru_software_repo_list.lng b/interface/ispconfig/interface/admin/lib/lang/ru_software_repo_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..7989ba49e044a9d703bb0aadfb32805ce6ee777a --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ru_software_repo_list.lng @@ -0,0 +1,7 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/ru_software_update_list.lng b/interface/ispconfig/interface/admin/lib/lang/ru_software_update_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..41fcbd4140e70c6239924b00a179c7e51de811de --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ru_software_update_list.lng @@ -0,0 +1,9 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/ru_system_config.lng b/interface/ispconfig/interface/admin/lib/lang/ru_system_config.lng new file mode 100644 index 0000000000000000000000000000000000000000..823cb744599908ff6a697f1d19dfec84c3c4e2b5 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ru_system_config.lng @@ -0,0 +1,16 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/ru_users.lng b/interface/ispconfig/interface/admin/lib/lang/ru_users.lng new file mode 100644 index 0000000000000000000000000000000000000000..b29c02035d1a42fc2bdbac26e6cd6d5263c4effa --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ru_users.lng @@ -0,0 +1,29 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/ru_users_list.lng b/interface/ispconfig/interface/admin/lib/lang/ru_users_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..62f17c600366a1cb3662ba307d39785b9b870539 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ru_users_list.lng @@ -0,0 +1,10 @@ +ВНИМАНИЕ:Не удаляйте и не меняйте никаких настроек здесь. Используйте настройки клиента и реселлера в модуле КЛИЕНТ. Изменение пользователей или групп здесь может вызвать потерю данных!'; +?> + diff --git a/interface/ispconfig/interface/admin/lib/lang/se.lng b/interface/ispconfig/interface/admin/lib/lang/se.lng new file mode 100644 index 0000000000000000000000000000000000000000..4b86cbba61edca96dc677543c17731e2ed1f9044 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/se.lng @@ -0,0 +1,40 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/se_firewall.lng b/interface/ispconfig/interface/admin/lib/lang/se_firewall.lng new file mode 100644 index 0000000000000000000000000000000000000000..e626345d3c1ee3bbce74ffd70c36fcc7ff3297c2 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/se_firewall.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/se_firewall_list.lng b/interface/ispconfig/interface/admin/lib/lang/se_firewall_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..24a34be1c121271493b5c469f3defce76a660523 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/se_firewall_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/se_groups.lng b/interface/ispconfig/interface/admin/lib/lang/se_groups.lng new file mode 100644 index 0000000000000000000000000000000000000000..cfe8565070b56de1f30a8450fc57a269c40d3bec --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/se_groups.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/se_groups_list.lng b/interface/ispconfig/interface/admin/lib/lang/se_groups_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..5b025e08a9898a815576d84f09d1ab6190dad6cf --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/se_groups_list.lng @@ -0,0 +1,7 @@ +WARNING: Do not edit or modify any user settings here. Use the Client- and Reseller settings in the Client module instead. Modifying or changing Users or groups here may cause data loss!'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/se_language_add.lng b/interface/ispconfig/interface/admin/lib/lang/se_language_add.lng new file mode 100644 index 0000000000000000000000000000000000000000..27bb0eeb6a5e1a92561746c147a911df34e35e6f --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/se_language_add.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/se_language_complete.lng b/interface/ispconfig/interface/admin/lib/lang/se_language_complete.lng new file mode 100644 index 0000000000000000000000000000000000000000..b5200ff9df30536d461edf601236bc2e91112af7 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/se_language_complete.lng @@ -0,0 +1,7 @@ +This adds missing strings from the english master language files to the selected language.'; +$wb['language_select_txt'] = 'Select language'; +$wb['btn_save_txt'] = 'Merge files now'; +$wb['btn_cancel_txt'] = 'Back'; +$wb['list_desc_txt'] = 'Merge the selected language file with the english master language file.
This adds missing strings from the english master language files to the selected language.'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/se_language_edit.lng b/interface/ispconfig/interface/admin/lib/lang/se_language_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..4c50e883e6933c8a9449319b4524216e9adac9f5 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/se_language_edit.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/se_language_export.lng b/interface/ispconfig/interface/admin/lib/lang/se_language_export.lng new file mode 100644 index 0000000000000000000000000000000000000000..f45d47b17c7e0e208e49a14fdabe76ed41f52367 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/se_language_export.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/se_language_import.lng b/interface/ispconfig/interface/admin/lib/lang/se_language_import.lng new file mode 100644 index 0000000000000000000000000000000000000000..4c31ec3de3606dcb7aebf451f711ff2dd41a8981 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/se_language_import.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/se_language_list.lng b/interface/ispconfig/interface/admin/lib/lang/se_language_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..1c784edf6d06b268c72b43ab0e4c14e8e325905a --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/se_language_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/se_remote_user.lng b/interface/ispconfig/interface/admin/lib/lang/se_remote_user.lng new file mode 100644 index 0000000000000000000000000000000000000000..cc9335bc52638b05b2a4419cbb6415daebbca52e --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/se_remote_user.lng @@ -0,0 +1,42 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/se_remote_user_list.lng b/interface/ispconfig/interface/admin/lib/lang/se_remote_user_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..152a75fba4c8917a1829b6960df7291e583d34a7 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/se_remote_user_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/se_server.lng b/interface/ispconfig/interface/admin/lib/lang/se_server.lng new file mode 100644 index 0000000000000000000000000000000000000000..f1c044bb6cb64117a6a4ead564bfe36456b1c5ad --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/se_server.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/se_server_config.lng b/interface/ispconfig/interface/admin/lib/lang/se_server_config.lng new file mode 100644 index 0000000000000000000000000000000000000000..16803a9f5cdd6bf7f712f631d086785bf7b369b0 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/se_server_config.lng @@ -0,0 +1,68 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/se_server_config_list.lng b/interface/ispconfig/interface/admin/lib/lang/se_server_config_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..636c2e050a026856a624bbd1ef3613df64544ba7 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/se_server_config_list.lng @@ -0,0 +1,4 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/se_server_ip.lng b/interface/ispconfig/interface/admin/lib/lang/se_server_ip.lng new file mode 100644 index 0000000000000000000000000000000000000000..6d451f5b20bcee9480a6d5fccbc9c38bb974b113 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/se_server_ip.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/se_server_ip_list.lng b/interface/ispconfig/interface/admin/lib/lang/se_server_ip_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..81ae8f01d6e8c9e1fc8e0029ece7fc5462338006 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/se_server_ip_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/se_server_list.lng b/interface/ispconfig/interface/admin/lib/lang/se_server_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..ff7bd6e9dd03349dccc629de0d853326bf440aad --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/se_server_list.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/se_software_package_list.lng b/interface/ispconfig/interface/admin/lib/lang/se_software_package_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..03917cabce20eb163fd64a168a2c8bbaf58599e6 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/se_software_package_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/se_software_repo.lng b/interface/ispconfig/interface/admin/lib/lang/se_software_repo.lng new file mode 100644 index 0000000000000000000000000000000000000000..574dd1162989badc8499f5af31451a43673bf4da --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/se_software_repo.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/se_software_repo_list.lng b/interface/ispconfig/interface/admin/lib/lang/se_software_repo_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..b7a219ffa8e2f6d389fabdc5386286a24fc2a11a --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/se_software_repo_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/se_software_update_list.lng b/interface/ispconfig/interface/admin/lib/lang/se_software_update_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..ebf4e6fbc544390ef8ea9357a33d184062568e27 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/se_software_update_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/se_system_config.lng b/interface/ispconfig/interface/admin/lib/lang/se_system_config.lng new file mode 100644 index 0000000000000000000000000000000000000000..e7f5d9365e01f4adcfe52c7c7aba0075a096283d --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/se_system_config.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/se_users.lng b/interface/ispconfig/interface/admin/lib/lang/se_users.lng new file mode 100644 index 0000000000000000000000000000000000000000..3708eff32380055a7d728dd8d054d8c4e4747ec2 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/se_users.lng @@ -0,0 +1,28 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/se_users_list.lng b/interface/ispconfig/interface/admin/lib/lang/se_users_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..de5d63e2fd42777c08eae4e7a6b34d82382262ae --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/se_users_list.lng @@ -0,0 +1,9 @@ +WARNING: Do not edit or modify any user settings here. Use the Client- and Reseller settings in the Client module instead. Modifying or changing Users or groups here may cause data loss!'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/sk.lng b/interface/ispconfig/interface/admin/lib/lang/sk.lng new file mode 100644 index 0000000000000000000000000000000000000000..a4eab14901213f8f428249c53d750178d5585aa3 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/sk.lng @@ -0,0 +1,40 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/sk_firewall.lng b/interface/ispconfig/interface/admin/lib/lang/sk_firewall.lng new file mode 100644 index 0000000000000000000000000000000000000000..581b4384ce03ff7cc3544d39856704d546ff08ad --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/sk_firewall.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/sk_firewall_list.lng b/interface/ispconfig/interface/admin/lib/lang/sk_firewall_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..657d6ca1456f00487aefdec52f36684c206bbc2e --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/sk_firewall_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/sk_groups.lng b/interface/ispconfig/interface/admin/lib/lang/sk_groups.lng new file mode 100644 index 0000000000000000000000000000000000000000..f43077cea25407a98f854486dcd537d91764cfd2 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/sk_groups.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/sk_groups_list.lng b/interface/ispconfig/interface/admin/lib/lang/sk_groups_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..1b067b7f83a820dc67665907ef67d500c227a02d --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/sk_groups_list.lng @@ -0,0 +1,7 @@ +WARNING: Do not edit or modify any user settings here. Use the Client- and Reseller settings in the Client module instead. Modifying or changing Users or groups here may cause data loss!'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/sk_language_add.lng b/interface/ispconfig/interface/admin/lib/lang/sk_language_add.lng new file mode 100644 index 0000000000000000000000000000000000000000..5b21d003d442aca419546e9fccda0cd003cb1f3e --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/sk_language_add.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/sk_language_complete.lng b/interface/ispconfig/interface/admin/lib/lang/sk_language_complete.lng new file mode 100644 index 0000000000000000000000000000000000000000..4b076136cd66eb902aa6e2526c7252055651aaca --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/sk_language_complete.lng @@ -0,0 +1,7 @@ + dop??a chbajce re?azce z anglickho sboru jazyka do zvolenho jazyka.'; +$wb['language_select_txt'] = 'Vyber jazyk'; +$wb['btn_save_txt'] = 'Zl?i? sbory teraz'; +$wb['btn_cancel_txt'] = 'Sp?'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/sk_language_edit.lng b/interface/ispconfig/interface/admin/lib/lang/sk_language_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..51c2c0a4048f5c50e8b2b91adc2b8ef69751fc2a --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/sk_language_edit.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/sk_language_export.lng b/interface/ispconfig/interface/admin/lib/lang/sk_language_export.lng new file mode 100644 index 0000000000000000000000000000000000000000..6bdfbc1948f318c0d6e7b692b61cee7f6308b3fc --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/sk_language_export.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/sk_language_import.lng b/interface/ispconfig/interface/admin/lib/lang/sk_language_import.lng new file mode 100644 index 0000000000000000000000000000000000000000..94c708af31a5669908c909b2fa0c397d42bdc43f --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/sk_language_import.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/sk_language_list.lng b/interface/ispconfig/interface/admin/lib/lang/sk_language_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..034b23aa8c09749e8bf94067f08376842a77293e --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/sk_language_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/sk_remote_user.lng b/interface/ispconfig/interface/admin/lib/lang/sk_remote_user.lng new file mode 100644 index 0000000000000000000000000000000000000000..fae2654b4c9da47722d0f8ecd88148401849673a --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/sk_remote_user.lng @@ -0,0 +1,42 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/sk_remote_user_list.lng b/interface/ispconfig/interface/admin/lib/lang/sk_remote_user_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..7e4661d7a2109e3e1bbf45639997d753ee74494a --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/sk_remote_user_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/sk_server.lng b/interface/ispconfig/interface/admin/lib/lang/sk_server.lng new file mode 100644 index 0000000000000000000000000000000000000000..667996c8b5c217553da7d981826890a6b45b7da2 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/sk_server.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/sk_server_config.lng b/interface/ispconfig/interface/admin/lib/lang/sk_server_config.lng new file mode 100644 index 0000000000000000000000000000000000000000..2fc861857d2bd45f2f4ed56e0dad376e0a8dcc25 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/sk_server_config.lng @@ -0,0 +1,68 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/sk_server_config_list.lng b/interface/ispconfig/interface/admin/lib/lang/sk_server_config_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..73e7bac4e903727f5db2b497f98028007ea07e91 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/sk_server_config_list.lng @@ -0,0 +1,4 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/sk_server_ip.lng b/interface/ispconfig/interface/admin/lib/lang/sk_server_ip.lng new file mode 100644 index 0000000000000000000000000000000000000000..f6dfa75feae180a11cf3ba3e4d2a33eaebfc892e --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/sk_server_ip.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/sk_server_ip_list.lng b/interface/ispconfig/interface/admin/lib/lang/sk_server_ip_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..de065f7078fa7788bea721d75350cd1e6f1ed239 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/sk_server_ip_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/sk_server_list.lng b/interface/ispconfig/interface/admin/lib/lang/sk_server_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..aff432880cbd720d6cf890f097e945dcf1135a53 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/sk_server_list.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/sk_software_package_list.lng b/interface/ispconfig/interface/admin/lib/lang/sk_software_package_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..bcb6acbac678e9af4c6d7893c096c12c38eb3a26 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/sk_software_package_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/sk_software_repo.lng b/interface/ispconfig/interface/admin/lib/lang/sk_software_repo.lng new file mode 100644 index 0000000000000000000000000000000000000000..a3cb3feeb617961b353b7143353637f0cad0f04d --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/sk_software_repo.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/sk_software_repo_list.lng b/interface/ispconfig/interface/admin/lib/lang/sk_software_repo_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..52d468a160950b61fbbcf1fb151b828241e6487f --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/sk_software_repo_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/sk_software_update_list.lng b/interface/ispconfig/interface/admin/lib/lang/sk_software_update_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..01d07727fa17e0b0cec2e90cc81ee1c0895f8824 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/sk_software_update_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/sk_system_config.lng b/interface/ispconfig/interface/admin/lib/lang/sk_system_config.lng new file mode 100644 index 0000000000000000000000000000000000000000..90049de8e2d4172db2092a32b47ee2b591becfbf --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/sk_system_config.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/sk_users.lng b/interface/ispconfig/interface/admin/lib/lang/sk_users.lng new file mode 100644 index 0000000000000000000000000000000000000000..4376aa19f8c3b3d51984665f2eacd3e25a01ca4a --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/sk_users.lng @@ -0,0 +1,28 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/sk_users_list.lng b/interface/ispconfig/interface/admin/lib/lang/sk_users_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..a04f716211c95f1449c566b42d2e3a0c06bcf0d6 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/sk_users_list.lng @@ -0,0 +1,9 @@ +WARNING: Do not edit or modify any user settings here. Use the Client- and Reseller settings in the Client module instead. Modifying or changing Users or groups here may cause data loss!'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/tr.lng b/interface/ispconfig/interface/admin/lib/lang/tr.lng new file mode 100644 index 0000000000000000000000000000000000000000..7e47b6c69bf4e2f07e4ce3ea3290cff6decb58a3 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/tr.lng @@ -0,0 +1,40 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/tr_firewall.lng b/interface/ispconfig/interface/admin/lib/lang/tr_firewall.lng new file mode 100644 index 0000000000000000000000000000000000000000..d379841b11e31fe3a82f6cd9632d74ea3f7613df --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/tr_firewall.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/tr_firewall_list.lng b/interface/ispconfig/interface/admin/lib/lang/tr_firewall_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..5fcff63964605ccf654c8904c27fe5d231d32efd --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/tr_firewall_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/tr_groups.lng b/interface/ispconfig/interface/admin/lib/lang/tr_groups.lng new file mode 100644 index 0000000000000000000000000000000000000000..5bad5a7e711e85d3ef35cb4a1c68508016f5e88c --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/tr_groups.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/tr_groups_list.lng b/interface/ispconfig/interface/admin/lib/lang/tr_groups_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..5e7f0ebc255240f0b29cab252cf50d07f010ccfb --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/tr_groups_list.lng @@ -0,0 +1,7 @@ +WARNING: Do not edit or modify any user settings here. Use the Client- and Reseller settings in the Client module instead. Modifying or changing Users or groups here may cause data loss!'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/tr_language_add.lng b/interface/ispconfig/interface/admin/lib/lang/tr_language_add.lng new file mode 100644 index 0000000000000000000000000000000000000000..fa712eba810fe1ee87e2dbe26b18d7038b64fad5 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/tr_language_add.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/tr_language_complete.lng b/interface/ispconfig/interface/admin/lib/lang/tr_language_complete.lng new file mode 100644 index 0000000000000000000000000000000000000000..176d93b2371e3da34a7c7f39d9eb52eef50d2f25 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/tr_language_complete.lng @@ -0,0 +1,7 @@ +Bu olay kayıp metinleri ingilizce dil dosyasından seçili dil dosyasına ekler'; +$wb['language_select_txt'] = 'Dil seç'; +$wb['btn_save_txt'] = 'Dosyaları şimdi birleştir'; +$wb['btn_cancel_txt'] = 'Geri'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/tr_language_edit.lng b/interface/ispconfig/interface/admin/lib/lang/tr_language_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..412b1b495d7f28afd7fbcde8a0709ef008a9ca04 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/tr_language_edit.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/tr_language_export.lng b/interface/ispconfig/interface/admin/lib/lang/tr_language_export.lng new file mode 100644 index 0000000000000000000000000000000000000000..d0205cb948a37531af345df1fce09ba55860e800 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/tr_language_export.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/tr_language_import.lng b/interface/ispconfig/interface/admin/lib/lang/tr_language_import.lng new file mode 100644 index 0000000000000000000000000000000000000000..2caaa079860fe95ece2be4d87563e75d5d24e1d2 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/tr_language_import.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/tr_language_list.lng b/interface/ispconfig/interface/admin/lib/lang/tr_language_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..833ce5955d17f7748e2e841ed392188d6edacd1c --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/tr_language_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/tr_remote_user.lng b/interface/ispconfig/interface/admin/lib/lang/tr_remote_user.lng new file mode 100644 index 0000000000000000000000000000000000000000..5d918effa8a526f47f790309f1e4c5fbc24f807f --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/tr_remote_user.lng @@ -0,0 +1,42 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/tr_remote_user_list.lng b/interface/ispconfig/interface/admin/lib/lang/tr_remote_user_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..eec9ef59e9370fdf6d00dce480d9e40da7b9c6a3 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/tr_remote_user_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/tr_server.lng b/interface/ispconfig/interface/admin/lib/lang/tr_server.lng new file mode 100644 index 0000000000000000000000000000000000000000..73ae1df70ff178353b8a43c31369d7111325465a --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/tr_server.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/tr_server_config.lng b/interface/ispconfig/interface/admin/lib/lang/tr_server_config.lng new file mode 100644 index 0000000000000000000000000000000000000000..40f08d527382bdd1b89a9a16c1e0f633e88b6814 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/tr_server_config.lng @@ -0,0 +1,68 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/tr_server_config_list.lng b/interface/ispconfig/interface/admin/lib/lang/tr_server_config_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..b3c74bd5f4f9d6378449d01188626fcb86663393 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/tr_server_config_list.lng @@ -0,0 +1,4 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/tr_server_ip.lng b/interface/ispconfig/interface/admin/lib/lang/tr_server_ip.lng new file mode 100644 index 0000000000000000000000000000000000000000..7112f4ef18692b0182a23834556220ec1c5e6f69 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/tr_server_ip.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/tr_server_ip_list.lng b/interface/ispconfig/interface/admin/lib/lang/tr_server_ip_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..c931986bd02a5936a9cb34305f1043da6bb8f6e0 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/tr_server_ip_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/tr_server_list.lng b/interface/ispconfig/interface/admin/lib/lang/tr_server_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..7d689ced9123fdf2bf83056f881212804bc1b68e --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/tr_server_list.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/tr_software_package_list.lng b/interface/ispconfig/interface/admin/lib/lang/tr_software_package_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..46726f740405ec4405fd6fc2d6c711c85e8ccde9 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/tr_software_package_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/tr_software_repo.lng b/interface/ispconfig/interface/admin/lib/lang/tr_software_repo.lng new file mode 100644 index 0000000000000000000000000000000000000000..67ce387eb3c3d73eb0a9aab7825d600bd6f36188 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/tr_software_repo.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/tr_software_repo_list.lng b/interface/ispconfig/interface/admin/lib/lang/tr_software_repo_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..a37f2afe2d521d7e9f3005cd8a1c713b151cede1 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/tr_software_repo_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/tr_software_update_list.lng b/interface/ispconfig/interface/admin/lib/lang/tr_software_update_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..3f77e54864675078da8813f6a48e99264f445b5c --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/tr_software_update_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/tr_system_config.lng b/interface/ispconfig/interface/admin/lib/lang/tr_system_config.lng new file mode 100644 index 0000000000000000000000000000000000000000..980811dfc504b5cd39670fa971101386ec434de2 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/tr_system_config.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/tr_users.lng b/interface/ispconfig/interface/admin/lib/lang/tr_users.lng new file mode 100644 index 0000000000000000000000000000000000000000..3b8f059610eef50acf377bd703bdd873a7b32035 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/tr_users.lng @@ -0,0 +1,28 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/tr_users_list.lng b/interface/ispconfig/interface/admin/lib/lang/tr_users_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..8d1e03850e5158cd9a85f9bdc009991956203470 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/tr_users_list.lng @@ -0,0 +1,9 @@ +WARNING: Do not edit or modify any user settings here. Use the Client- and Reseller settings in the Client module instead. Modifying or changing Users or groups here may cause data loss!'; +?> diff --git a/interface/ispconfig/interface/admin/lib/module.conf.php b/interface/ispconfig/interface/admin/lib/module.conf.php new file mode 100644 index 0000000000000000000000000000000000000000..b6a6c57dd76b4bf516f7705c9740a20d5f93645a --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/module.conf.php @@ -0,0 +1,174 @@ + 'Add user', + 'target' => 'content', + 'link' => 'admin/users_edit.php'); + +$items[] = array( 'title' => 'Edit user', + 'target' => 'content', + 'link' => 'admin/users_list.php'); + + +$module['nav'][] = array( 'title' => 'CP Users', + 'open' => 1, + 'items' => $items); + + +// cleanup +unset($items); +/* +$items[] = array( 'title' => 'Add group', + 'target' => 'content', + 'link' => 'admin/groups_edit.php'); + +$items[] = array( 'title' => 'Edit group', + 'target' => 'content', + 'link' => 'admin/groups_list.php'); + + +$module['nav'][] = array( 'title' => 'Groups', + 'open' => 1, + 'items' => $items); + + +// cleanup +unset($items); +*/ +/* +$items[] = array( 'title' => 'Add server', + 'target' => 'content', + 'link' => 'admin/server_edit.php'); +*/ +$items[] = array( 'title' => 'Server Services', + 'target' => 'content', + 'link' => 'admin/server_list.php'); + +$items[] = array( 'title' => 'Server Config', + 'target' => 'content', + 'link' => 'admin/server_config_list.php'); + +/* +$items[] = array( 'title' => 'Add Server IP', + 'target' => 'content', + 'link' => 'admin/server_ip_edit.php'); +*/ +$items[] = array( 'title' => 'Edit Server IP', + 'target' => 'content', + 'link' => 'admin/server_ip_list.php'); + + +$items[] = array( 'title' => 'Interface Config', + 'target' => 'content', + 'link' => 'admin/system_config_edit.php?id=1'); + +$module['nav'][] = array( 'title' => 'System', + 'open' => 1, + 'items' => $items); +// cleanup +unset($items); + + +$items[] = array( 'title' => 'Firewall', + 'target' => 'content', + 'link' => 'admin/firewall_list.php'); + + +$module['nav'][] = array( 'title' => 'Firewall', + 'open' => 1, + 'items' => $items); + + +// cleanup +unset($items); + + +$items[] = array( 'title' => 'Repositories', + 'target' => 'content', + 'link' => 'admin/software_repo_list.php'); + +$items[] = array( 'title' => 'Packages', + 'target' => 'content', + 'link' => 'admin/software_package_list.php'); + +$items[] = array( 'title' => 'Updates', + 'target' => 'content', + 'link' => 'admin/software_update_list.php'); + +$module['nav'][] = array( 'title' => 'Software', + 'open' => 1, + 'items' => $items); + + +// cleanup +unset($items); + +$items[] = array( 'title' => 'Languages', + 'target' => 'content', + 'link' => 'admin/language_list.php'); + +$items[] = array( 'title' => 'New Language', + 'target' => 'content', + 'link' => 'admin/language_add.php'); + +$items[] = array( 'title' => 'Merge', + 'target' => 'content', + 'link' => 'admin/language_complete.php'); + +$items[] = array( 'title' => 'Export', + 'target' => 'content', + 'link' => 'admin/language_export.php'); + +$items[] = array( 'title' => 'Import', + 'target' => 'content', + 'link' => 'admin/language_import.php'); + +$module['nav'][] = array( 'title' => 'Language Editor', + 'open' => 1, + 'items' => $items); + + +// cleanup +unset($items); + +$items[] = array( 'title' => 'Add user', + 'target' => 'content', + 'link' => 'admin/remote_user_edit.php'); + +$items[] = array( 'title' => 'Edit user', + 'target' => 'content', + 'link' => 'admin/remote_user_list.php'); + + +$module['nav'][] = array( 'title' => 'Remote Users', + 'open' => 1, + 'items' => $items); + +// cleanup +unset($items); + +// Getting the admin options from other modules +$modules = explode(',', $_SESSION['s']['user']['modules']); +if(is_array($modules)) { + foreach($modules as $mt) { + if(is_file($mt.'/lib/admin.conf.php')) { + $options = array(); + include_once(ISPC_WEB_PATH."/$mt/lib/admin.conf.php"); + if(is_array($options)) { + foreach($options as $opt) { + $module['nav'][] = $opt; + } + } + } + } +} + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/list/firewall.list.php b/interface/ispconfig/interface/admin/list/firewall.list.php new file mode 100644 index 0000000000000000000000000000000000000000..ba3fb0633e11928396122978869fcf2254ad5214 --- /dev/null +++ b/interface/ispconfig/interface/admin/list/firewall.list.php @@ -0,0 +1,93 @@ + "active", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array('y' => "
Yes
",'n' => "
No
")); + +$liste["item"][] = array( 'field' => "server_id", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE {AUTHSQL} AND db_server = 1 ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'width' => "", + 'value' => ""); + + +$liste["item"][] = array( 'field' => "tcp_port", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + + +$liste["item"][] = array( 'field' => "udp_port", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/list/groups.list.php b/interface/ispconfig/interface/admin/list/groups.list.php new file mode 100644 index 0000000000000000000000000000000000000000..c5e8c4d118d2aca482f46fa7ae5c9c3265ebbc5c --- /dev/null +++ b/interface/ispconfig/interface/admin/list/groups.list.php @@ -0,0 +1,61 @@ + 'name', + 'datatype' => 'VARCHAR', + 'op' => 'like', + 'prefix' => '%', + 'suffix' => '%', + 'width' => ''); + +$liste['item'][] = array( 'field' => 'description', + 'datatype' => 'VARCHAR', + 'op' => 'like', + 'prefix' => '%', + 'suffix' => '%', + 'width' => ''); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/list/remote_user.list.php b/interface/ispconfig/interface/admin/list/remote_user.list.php new file mode 100644 index 0000000000000000000000000000000000000000..31ef652a9947fcc86bac6acc7330eb0a354e6039 --- /dev/null +++ b/interface/ispconfig/interface/admin/list/remote_user.list.php @@ -0,0 +1,65 @@ + 'remote_userid', + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'op' => '=', + 'prefix' => '', + 'suffix' => '', + 'width' => '', + 'datasource' => array( + 'type' => 'SQL', + 'querystring' => 'SELECT remote_userid,remote_username FROM remote_user WHERE {AUTHSQL} ORDER BY remote_username', + 'keyfield' => 'remote_userid', + 'valuefield' => 'remote_userid' + ), + 'value' => '' + ); + +$liste['item'][] = array( + 'field' => 'remote_username', + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'op' => 'like', + 'prefix' => '%', + 'suffix' => '%', + 'width' => '', + 'value' => '' + ); + +?> + diff --git a/interface/ispconfig/interface/admin/list/server.list.php b/interface/ispconfig/interface/admin/list/server.list.php new file mode 100644 index 0000000000000000000000000000000000000000..90bccf1eccc658391f62dd49d8a03f748e0e4eae --- /dev/null +++ b/interface/ispconfig/interface/admin/list/server.list.php @@ -0,0 +1,110 @@ + 'server_name', + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'op' => 'like', + 'prefix' => '%', + 'suffix' => '%', + 'width' => '', + 'value' => ''); + +$liste['item'][] = array( 'field' => 'mail_server', + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'op' => 'like', + 'prefix' => '%', + 'suffix' => '%', + 'width' => '', + 'value' => array('1' => "
Yes
",'0' => "
No
")); + +$liste['item'][] = array( 'field' => 'web_server', + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'op' => 'like', + 'prefix' => '%', + 'suffix' => '%', + 'width' => '', + 'value' => array('1' => "
Yes
",'0' => "
No
")); + +$liste['item'][] = array( 'field' => 'dns_server', + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'op' => 'like', + 'prefix' => '%', + 'suffix' => '%', + 'width' => '', + 'value' => array('1' => "
Yes
",'0' => "
No
")); + +$liste['item'][] = array( 'field' => 'file_server', + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'op' => 'like', + 'prefix' => '%', + 'suffix' => '%', + 'width' => '', + 'value' => array('1' => "
Yes
",'0' => "
No
")); + +$liste['item'][] = array( 'field' => 'db_server', + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'op' => 'like', + 'prefix' => '%', + 'suffix' => '%', + 'width' => '', + 'value' => array('1' => "
Yes
",'0' => "
No
")); + +$liste['item'][] = array( 'field' => 'vserver_server', + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'op' => 'like', + 'prefix' => '%', + 'suffix' => '%', + 'width' => '', + 'value' => array('1' => "
Yes
",'0' => "
No
")); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/list/server_config.list.php b/interface/ispconfig/interface/admin/list/server_config.list.php new file mode 100644 index 0000000000000000000000000000000000000000..c0c20e500cc9c1396b9755ac4d327e9c8d3d433a --- /dev/null +++ b/interface/ispconfig/interface/admin/list/server_config.list.php @@ -0,0 +1,60 @@ + "server_name", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/list/server_ip.list.php b/interface/ispconfig/interface/admin/list/server_ip.list.php new file mode 100644 index 0000000000000000000000000000000000000000..aacebc0b7fca325d08a607f9383a7f84c463ea30 --- /dev/null +++ b/interface/ispconfig/interface/admin/list/server_ip.list.php @@ -0,0 +1,68 @@ + 'server_id', + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'op' => 'like', + 'prefix' => '%', + 'suffix' => '%', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'width' => '', + 'value' => ''); + +$liste['item'][] = array( 'field' => 'ip_address', + 'datatype' => 'VARCHAR', + 'op' => '=', + 'prefix' => '', + 'suffix' => '', + 'width' => ''); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/list/software_repo.list.php b/interface/ispconfig/interface/admin/list/software_repo.list.php new file mode 100644 index 0000000000000000000000000000000000000000..a9be62deb2c618410d89cfceb506ac6c8fceb788 --- /dev/null +++ b/interface/ispconfig/interface/admin/list/software_repo.list.php @@ -0,0 +1,78 @@ + "active", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array('y' => "
Yes
",'n' => "
No
")); + +$liste["item"][] = array( 'field' => "repo_name", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + + +$liste["item"][] = array( 'field' => "repo_url", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/list/users.list.php b/interface/ispconfig/interface/admin/list/users.list.php new file mode 100644 index 0000000000000000000000000000000000000000..f53e03be6a349a3bfe2c684d52be83e8f6fb34f7 --- /dev/null +++ b/interface/ispconfig/interface/admin/list/users.list.php @@ -0,0 +1,75 @@ + 'username', + 'datatype' => 'VARCHAR', + 'op' => 'like', + 'prefix' => '%', + 'suffix' => '%', + 'width' => ''); + +$liste['item'][] = array( 'field' => 'vorname', + 'datatype' => 'VARCHAR', + 'op' => 'like', + 'prefix' => '%', + 'suffix' => '%', + 'width' => ''); + +$liste['item'][] = array( 'field' => 'name', + 'datatype' => 'VARCHAR', + 'op' => 'like', + 'prefix' => '%', + 'suffix' => '%', + 'width' => ''); + +$liste['item'][] = array( 'field' => 'ort', + 'datatype' => 'VARCHAR', + 'op' => 'like', + 'prefix' => '%', + 'suffix' => '%', + 'width' => ''); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/login_as.php b/interface/ispconfig/interface/admin/login_as.php new file mode 100644 index 0000000000000000000000000000000000000000..0745c62cdc381cc1185cba3a42f86cfb956b7d5f --- /dev/null +++ b/interface/ispconfig/interface/admin/login_as.php @@ -0,0 +1,84 @@ +auth->check_module_permissions('admin'); + +/* for security reasons ONLY the admin can login as other user */ +if ($_SESSION["s"]["user"]["typ"] != 'admin') { + die ("You don't have the right to login as other user!"); +} + +/* get the id of the user (must be int!) */ +if (!isset($_GET['id']) && !isset($_GET['cid'])){ + die ("No user selected!"); +} + +if(isset($_GET['id'])) { + $userId = intval($_GET['id']); + $backlink = 'admin/users_list.php'; +} else { + $client_id = intval($_GET['cid']); + $tmp_client = $app->db->queryOneRecord("SELECT username FROM client WHERE client_id = $client_id"); + $tmp_sys_user = $app->db->queryOneRecord("SELECT userid FROM sys_user WHERE username = '".$app->db->quote($tmp_client['username'])."'"); + $userId = $tmp_sys_user['userid']; + unset($tmp_client); + unset($tmp_sys_user); + $backlink = 'client/client_list.php'; +} + +/* + * Get the data to login as user x + */ +$dbData = $app->db->queryOneRecord( + "SELECT username, passwort FROM sys_user WHERE userid = " . $userId); + +/* + * Now generate the login-Form + */ +echo ' +



+ Do you want to login as user ' . $dbData['username'] . '?
+ If you do so, you can "go back" by clicking at logout.
+
+ + +
+ + +
+ + +
+'; +?> diff --git a/interface/ispconfig/interface/admin/remote_user_del.php b/interface/ispconfig/interface/admin/remote_user_del.php new file mode 100644 index 0000000000000000000000000000000000000000..74352ca6cfbe3d2476d6310f557b12e22a8288a2 --- /dev/null +++ b/interface/ispconfig/interface/admin/remote_user_del.php @@ -0,0 +1,62 @@ +auth->check_module_permissions('admin'); + +$app->uses('tpl,tform'); +$app->load('tform_actions'); + +// Create a class page_action that extends the tform_actions base class + +class page_action extends tform_actions { + + + // Customisations for the page actions will be defined here + +} +$page = new page_action; +$page->onDelete(); + +?> diff --git a/interface/ispconfig/interface/admin/remote_user_edit.php b/interface/ispconfig/interface/admin/remote_user_edit.php new file mode 100644 index 0000000000000000000000000000000000000000..5a3fc70003f10c1b64e9153ab555d52134ff6830 --- /dev/null +++ b/interface/ispconfig/interface/admin/remote_user_edit.php @@ -0,0 +1,43 @@ +uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +// Create a class page_action that extends the tform_actions base class +class page_action extends tform_actions { + + //* Customisations for the page actions will be defined here + function onShow() { + global $app; + + // Translate the items, very bad trick... :( because the language file is not loaded yet when the form file gets parsed + foreach($app->tform->formDef["tabs"]['remote_user']['fields']['remote_functions']['value'] as $key => $val) { + $app->tform->formDef["tabs"]['remote_user']['fields']['remote_functions']['value'][$key] = $app->tform->lng($val).'
'; + } + + parent::onShow(); + } + +} + +// Create the new page object +$page = new page_action(); + +// Start the page rendering and action handling +$page->onLoad(); + +?> diff --git a/interface/ispconfig/interface/admin/remote_user_list.php b/interface/ispconfig/interface/admin/remote_user_list.php new file mode 100644 index 0000000000000000000000000000000000000000..6976112af7d16a47919157ae7b59f716441a37f0 --- /dev/null +++ b/interface/ispconfig/interface/admin/remote_user_list.php @@ -0,0 +1,24 @@ +uses('listform_actions'); + +// Optional limit +// $app->listform_actions->SQLExtWhere = 'type = 'alias''; + +// Start the form rendering and action ahndling +$app->listform_actions->onLoad(); + +?> diff --git a/interface/ispconfig/interface/admin/server_config_del.php b/interface/ispconfig/interface/admin/server_config_del.php new file mode 100644 index 0000000000000000000000000000000000000000..8c0d0ab7754fac80206d2e2dc56cd6628ab71c75 --- /dev/null +++ b/interface/ispconfig/interface/admin/server_config_del.php @@ -0,0 +1,51 @@ +auth->check_module_permissions('admin'); + +$app->uses("tform_actions"); +$app->tform_actions->onDelete(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/server_config_edit.php b/interface/ispconfig/interface/admin/server_config_edit.php new file mode 100644 index 0000000000000000000000000000000000000000..bb853b5e8c176f30635d436bebc89a7646c74693 --- /dev/null +++ b/interface/ispconfig/interface/admin/server_config_edit.php @@ -0,0 +1,95 @@ +auth->check_module_permissions('admin'); + +// Loading classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onShowEdit() { + global $app, $conf; + + if($_SESSION["s"]["user"]["typ"] != 'admin') die('This function needs admin priveliges'); + + if($app->tform->errorMessage == '') { + $app->uses('ini_parser,getconf'); + + $section = $this->active_tab; + $server_id = $this->id; + + $this->dataRecord = $app->getconf->get_server_config($server_id,$section); + } + + $record = $app->tform->getHTML($this->dataRecord, $this->active_tab,'EDIT'); + + $record['id'] = $this->id; + $app->tpl->setVar($record); + } + + function onUpdateSave($sql) { + global $app; + + if($_SESSION["s"]["user"]["typ"] != 'admin') die('This function needs admin priveliges'); + $app->uses('ini_parser,getconf'); + + $section = $app->tform->getCurrentTab(); + $server_id = $this->id; + + $server_config_array = $app->getconf->get_server_config($server_id); + $server_config_array[$section] = $app->tform->encode($this->dataRecord,$section); + $server_config_str = $app->ini_parser->get_ini_string($server_config_array); + + $app->db->datalogUpdate('server', "config = '".$app->db->quote($server_config_str)."'", 'server_id', $server_id); + } + +} + +$app->tform_actions = new page_action; +$app->tform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/server_config_list.php b/interface/ispconfig/interface/admin/server_config_list.php new file mode 100644 index 0000000000000000000000000000000000000000..5edfba4d432c5f4aebde173aa5e50a7981f9555c --- /dev/null +++ b/interface/ispconfig/interface/admin/server_config_list.php @@ -0,0 +1,53 @@ +auth->check_module_permissions('admin'); + +$app->uses('listform_actions'); +//$app->listform_actions->SQLExtWhere = "wb = 'W'"; + +$app->listform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/server_del.php b/interface/ispconfig/interface/admin/server_del.php new file mode 100644 index 0000000000000000000000000000000000000000..373bb7d408d88a6043156678f1080488c9106c80 --- /dev/null +++ b/interface/ispconfig/interface/admin/server_del.php @@ -0,0 +1,51 @@ +auth->check_module_permissions('admin'); + +$app->uses("tform_actions"); +$app->tform_actions->onDelete(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/server_edit.php b/interface/ispconfig/interface/admin/server_edit.php new file mode 100644 index 0000000000000000000000000000000000000000..376b0f026f4694f87727c19d07d304c2d9fc6977 --- /dev/null +++ b/interface/ispconfig/interface/admin/server_edit.php @@ -0,0 +1,86 @@ +auth->check_module_permissions('admin'); + +// Loading classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onShowEnd() { + global $app, $conf; + + // Getting Servers + $sql = "SELECT server_id,server_name FROM server WHERE 1 ORDER BY server_name"; + $mirror_servers = $app->db->queryAllRecords($sql); + $mirror_server_select = ''; + if(is_array($mirror_servers)) { + foreach( $mirror_servers as $mirror_server) { + $selected = ($mirror_server["server_id"] == $this->dataRecord['mirror_server_id'])?'SELECTED':''; + $mirror_server_select .= "\r\n"; + } + } + $app->tpl->setVar("mirror_server_id",$mirror_server_select); + + parent::onShowEnd(); + } + + function onSubmit() { + global $app; + + //* We do not want to mirror the the server itself + if($this->id == $this->dataRecord['mirror_server_id']) $this->dataRecord['mirror_server_id'] = 0; + + parent::onSubmit(); + + } + +} + +$page = new page_action; +$page->onLoad(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/server_ip_del.php b/interface/ispconfig/interface/admin/server_ip_del.php new file mode 100644 index 0000000000000000000000000000000000000000..38da1706caf02cc145b59f11f8b8983616cb5195 --- /dev/null +++ b/interface/ispconfig/interface/admin/server_ip_del.php @@ -0,0 +1,51 @@ +auth->check_module_permissions('admin'); + +$app->uses("tform_actions"); +$app->tform_actions->onDelete(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/server_ip_edit.php b/interface/ispconfig/interface/admin/server_ip_edit.php new file mode 100644 index 0000000000000000000000000000000000000000..eee5b35a56051baaa455362ddbeac456e34f00cf --- /dev/null +++ b/interface/ispconfig/interface/admin/server_ip_edit.php @@ -0,0 +1,73 @@ +auth->check_module_permissions('admin'); + +// Loading classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onBeforeUpdate() { + global $app, $conf; + + //* Check if the server has been changed + // We do this only for the admin or reseller users, as normal clients can not change the server ID anyway + if($_SESSION["s"]["user"]["typ"] == 'admin' || $app->auth->has_clients($_SESSION['s']['user']['userid'])) { + $rec = $app->db->queryOneRecord("SELECT server_id from server_ip WHERE server_ip_id = ".$this->id); + if($rec['server_id'] != $this->dataRecord["server_id"]) { + //* Add a error message and switch back to old server + $app->tform->errorMessage .= $app->lng('The Server can not be changed.'); + $this->dataRecord["server_id"] = $rec['server_id']; + } + unset($rec); + } + } +} + +$page = new page_action; +$page->onLoad(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/server_ip_list.php b/interface/ispconfig/interface/admin/server_ip_list.php new file mode 100644 index 0000000000000000000000000000000000000000..28c3f85cbeab3a0e287792651ea145df757195f2 --- /dev/null +++ b/interface/ispconfig/interface/admin/server_ip_list.php @@ -0,0 +1,54 @@ +auth->check_module_permissions('admin'); + +$app->uses('listform_actions'); + +$app->listform_actions->SQLOrderBy = "ORDER BY server_id, ip_address"; + +$app->listform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/server_list.php b/interface/ispconfig/interface/admin/server_list.php new file mode 100644 index 0000000000000000000000000000000000000000..458aee0eadb924201ad4c9c41961ae78f062a416 --- /dev/null +++ b/interface/ispconfig/interface/admin/server_list.php @@ -0,0 +1,51 @@ +auth->check_module_permissions('admin'); + +$app->uses('listform_actions'); +$app->listform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/software_package_list.php b/interface/ispconfig/interface/admin/software_package_list.php new file mode 100644 index 0000000000000000000000000000000000000000..a44463dd07f4cc962e76bf0e24d247350c3c029d --- /dev/null +++ b/interface/ispconfig/interface/admin/software_package_list.php @@ -0,0 +1,169 @@ +auth->check_module_permissions('admin'); + +//* This is only allowed for administrators +if(!$app->auth->is_admin()) die('only allowed for administrators.'); + +//* Get the latest packages from the repositorys and insert them in the local database +$packages_added = 0; +$repos = $app->db->queryAllRecords("SELECT software_repo_id, repo_url, repo_username, repo_password FROM software_repo WHERE active = 'y'"); +if(is_array($repos)) { + foreach($repos as $repo) { + $client = new SoapClient(null, array('location' => $repo['repo_url'], + 'uri' => $repo['repo_url'])); + + $packages = $client->get_packages($repo['repo_username'], $repo['repo_password']); + if(is_array($packages)) { + foreach($packages as $p) { + $package_name = $app->db->quote($p['name']); + $tmp = $app->db->queryOneRecord("SELECT package_id FROM software_package WHERE package_name = '$package_name'"); + if(empty($tmp['package_id'])) { + + $package_title = $app->db->quote($p['title']); + $package_description = $app->db->quote($p['description']); + $software_repo_id = intval($repo['software_repo_id']); + $package_type = $app->db->quote($p['type']); + + $sql = "INSERT INTO software_package (software_repo_id, package_name, package_title, package_description,package_type) VALUES ($software_repo_id, '$package_name', '$package_title', '$package_description','$package_type')"; + $app->db->query($sql); + $packages_added++; + } + } + } + + $packages = $app->db->queryAllRecords("SELECT software_package.package_name, v1, v2, v3, v4 FROM software_package LEFT JOIN software_update ON ( software_package.package_name = software_update.package_name ) GROUP BY package_name ORDER BY v1 DESC , v2 DESC , v3 DESC , v4 DESC"); + if(is_array($packages)) { + foreach($packages as $p) { + + $version = $p['v1'].'.'.$p['v2'].'.'.$p['v3'].'.'.$p['v4']; + $updates = $client->get_updates($p['package_name'], $version,$repo['repo_username'], $repo['repo_password']); + + if(is_array($updates)) { + foreach($updates as $u) { + + $version_array = explode('.',$u['version']); + $v1 = intval($version_array[0]); + $v2 = intval($version_array[1]); + $v3 = intval($version_array[2]); + $v4 = intval($version_array[3]); + + $package_name = $app->db->quote($u['package_name']); + $software_repo_id = intval($repo['software_repo_id']); + $update_url = $app->db->quote($u['url']); + $update_md5 = $app->db->quote($u['md5']); + $update_dependencies = (isset($u['dependencies']))?$app->db->quote($u['dependencies']):''; + $update_title = $app->db->quote($u['title']); + $type = $app->db->quote($u['type']); + + // Check that we do not have this update in the database yet + $sql = "SELECT * FROM software_update WHERE package_name = '$package_name' and v1 = '$v1' and v2 = '$v2' and v3 = '$v3' and v4 = '$v4'"; + $tmp = $app->db->queryOneRecord($sql); + if(!isset($tmp['software_update_id'])) { + // Insert the update in the datbase + $sql = "INSERT INTO software_update (software_repo_id, package_name, update_url, update_md5, update_dependencies, update_title, v1, v2, v3, v4, type) + VALUES ($software_repo_id, '$package_name', '$update_url', '$update_md5', '$update_dependencies', '$update_title', '$v1', '$v2', '$v3', '$v4', '$type')"; + //die($sql); + $app->db->query($sql); + } + + } + } + } + } + } +} + +//* Install packages, if GET Request +if(isset($_GET['action']) && $_GET['action'] == 'install' && $_GET['package'] != '' && $_GET['server_id'] > 0) { + $package_name = $app->db->quote($_GET['package']); + $server_id = intval($_GET['server_id']); + $sql = "SELECT software_update_id, package_name, update_title FROM software_update WHERE type = 'full' AND package_name = '$package_name' ORDER BY v1 DESC, v2 DESC, v3 DESC, v4 DESC LIMIT 0,1"; + $tmp = $app->db->queryOneRecord($sql); + $software_update_id = $tmp['software_update_id']; + + $insert_data = "(package_name, server_id, software_update_id, status) VALUES ('$package_name', '$server_id', '$software_update_id','installing')"; + // $insert_data = "(package_name, server_id, software_update_id, status) VALUES ('$package_name', '$server_id', '$software_update_id','installed')"; + $app->db->datalogInsert('software_update_inst', $insert_data, 'software_update_inst_id'); + +} + + + +// Show the list in the interface +// Loading the template +$app->uses('tpl'); +$app->tpl->newTemplate("form.tpl.htm"); +$app->tpl->setInclude('content_tpl','templates/software_package_list.htm'); + + +$servers = $app->db->queryAllRecords('SELECT server_id, server_name FROM server ORDER BY server_name'); +$packages = $app->db->queryAllRecords('SELECT * FROM software_package'); +if(is_array($packages)) { + foreach($packages as $key => $p) { + $installed_txt = ''; + foreach($servers as $s) { + $inst = $app->db->queryOneRecord("SELECT * FROM software_update, software_update_inst WHERE software_update_inst.software_update_id = software_update.software_update_id AND software_update_inst.package_name = '".addslashes($p["package_name"])."' AND server_id = '".$s["server_id"]."'"); + $version = $inst['v1'].'.'.$inst['v2'].'.'.$inst['v3'].'.'.$inst['v4']; + + if($inst['status'] == 'installed') { + $installed_txt .= $s['server_name'].": Installed version $version
"; + } elseif ($inst['status'] == 'installing') { + $installed_txt .= $s['server_name'].": Installation in progress
"; + } elseif ($inst['status'] == 'failed') { + $installed_txt .= $s['server_name'].": Installation failed
"; + } elseif ($inst['status'] == 'deleting') { + $installed_txt .= $s['server_name'].": Deletion in progress
"; + } else { + $installed_txt .= $s['server_name'].": Install now
"; + } + } + $packages[$key]['installed'] = $installed_txt; + } +} + + + +$app->tpl->setLoop('records',$packages); + +include_once('lib/lang/en_software_package_list.lng'); +$app->tpl->setVar($wb); + + +$app->tpl_defaults(); +$app->tpl->pparse(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/software_repo_del.php b/interface/ispconfig/interface/admin/software_repo_del.php new file mode 100644 index 0000000000000000000000000000000000000000..6ee0e9d5007fbec2cae316d0e2ed89da8a2f3810 --- /dev/null +++ b/interface/ispconfig/interface/admin/software_repo_del.php @@ -0,0 +1,51 @@ +auth->check_module_permissions('admin'); + +$app->uses("tform_actions"); +$app->tform_actions->onDelete(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/software_repo_edit.php b/interface/ispconfig/interface/admin/software_repo_edit.php new file mode 100644 index 0000000000000000000000000000000000000000..4839812d81016a897146b7fdf1ef6c78e0c73352 --- /dev/null +++ b/interface/ispconfig/interface/admin/software_repo_edit.php @@ -0,0 +1,58 @@ +auth->check_module_permissions('admin'); + +// Loading classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + +} + +$page = new page_action; +$page->onLoad(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/software_repo_list.php b/interface/ispconfig/interface/admin/software_repo_list.php new file mode 100644 index 0000000000000000000000000000000000000000..0f7bd8ac799a3da074017fd61e1895c159b870e8 --- /dev/null +++ b/interface/ispconfig/interface/admin/software_repo_list.php @@ -0,0 +1,52 @@ +auth->check_module_permissions('admin'); + +$app->uses('listform_actions'); + +$app->listform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/software_update_list.php b/interface/ispconfig/interface/admin/software_update_list.php new file mode 100644 index 0000000000000000000000000000000000000000..4c7da37e6265330052b6a1c011c9833fcfa03dbc --- /dev/null +++ b/interface/ispconfig/interface/admin/software_update_list.php @@ -0,0 +1,222 @@ +auth->check_module_permissions('admin'); + +//* This is only allowed for administrators +if(!$app->auth->is_admin()) die('only allowed for administrators.'); + +//* Get the latest updates from the repositorys and insert them in the local database +$updates_added = 0; +$repos = $app->db->queryAllRecords("SELECT software_repo_id, repo_url, repo_username, repo_password FROM software_repo WHERE active = 'y'"); +if(is_array($repos)) { + foreach($repos as $repo) { + + /* + SELECT software_package.package_name, v1, v2, v3, v4 + FROM software_package + LEFT JOIN software_update ON ( software_package.package_name = software_update.package_name ) + LEFT JOIN software_update_inst ON ( software_update.software_update_id = software_update_inst.software_update_id ) + GROUP BY package_name + ORDER BY v1 DESC , v2 DESC , v3 DESC , v4 DESC + */ + + $client = new SoapClient(null, array('location' => $repo['repo_url'], + 'uri' => $repo['repo_url'])); + + $packages = $app->db->queryAllRecords("SELECT software_package.package_name, v1, v2, v3, v4 FROM software_package LEFT JOIN software_update ON ( software_package.package_name = software_update.package_name ) GROUP BY package_name ORDER BY v1 DESC , v2 DESC , v3 DESC , v4 DESC"); + if(is_array($packages)) { + foreach($packages as $p) { + + $version = $p['v1'].'.'.$p['v2'].'.'.$p['v3'].'.'.$p['v4']; + $updates = $client->get_updates($p['package_name'], $version,$repo['repo_username'], $repo['repo_password']); + + if(is_array($updates)) { + foreach($updates as $u) { + + $version_array = explode('.',$u['version']); + $v1 = intval($version_array[0]); + $v2 = intval($version_array[1]); + $v3 = intval($version_array[2]); + $v4 = intval($version_array[3]); + + $package_name = $app->db->quote($u['package_name']); + $software_repo_id = intval($repo['software_repo_id']); + $update_url = $app->db->quote($u['url']); + $update_md5 = $app->db->quote($u['md5']); + $update_dependencies = (isset($u['dependencies']))?$app->db->quote($u['dependencies']):''; + $update_title = $app->db->quote($u['title']); + $type = $app->db->quote($u['type']); + + // Check that we do not have this update in the database yet + $sql = "SELECT * FROM software_update WHERE package_name = '$package_name' and v1 = '$v1' and v2 = '$v2' and v3 = '$v3' and v4 = '$v4'"; + $tmp = $app->db->queryOneRecord($sql); + if(!isset($tmp['software_update_id'])) { + // Insert the update in the datbase + $sql = "INSERT INTO software_update (software_repo_id, package_name, update_url, update_md5, update_dependencies, update_title, v1, v2, v3, v4, type) + VALUES ($software_repo_id, '$package_name', '$update_url', '$update_md5', '$update_dependencies', '$update_title', '$v1', '$v2', '$v3', '$v4', '$type')"; + //die($sql); + $app->db->query($sql); + } + + } + } + } + } + } +} + + +//* Install packages, if GET Request +if(isset($_GET['action']) && $_GET['action'] == 'install' && $_GET['package'] != '' && $_GET['server_id'] > 0) { + $package_name = $app->db->quote($_GET['package']); + $server_id = intval($_GET['server_id']); + $software_update_id = intval($_GET['id']); + + $insert_data = "(package_name, server_id, software_update_id, status) VALUES ('$package_name', '$server_id', '$software_update_id','installing')"; + // $insert_data = "(package_name, server_id, software_update_id, status) VALUES ('$package_name', '$server_id', '$software_update_id','installed')"; + $app->db->datalogInsert('software_update_inst', $insert_data, 'software_update_inst_id'); + +} + + + +// Show the list in the interface +// Loading the template +$app->uses('tpl'); +$app->tpl->newTemplate("form.tpl.htm"); +$app->tpl->setInclude('content_tpl','templates/software_update_list.htm'); + +/* +SELECT software_package.package_name, software_package.package_title, software_update.update_title, v1, v2, v3, v4, software_update_inst.status + FROM software_package + LEFT JOIN software_update ON ( software_package.package_name = software_update.package_name ) + LEFT JOIN software_update_inst ON ( software_update.software_update_id = software_update_inst.software_update_id ) +GROUP BY software_update.software_update_id + ORDER BY v1 DESC , v2 DESC , v3 DESC , v4 DESC +*/ + + + +if(isset($_POST["server_id"]) && $_POST["server_id"] > 0) { + $server_id = intval($_POST["server_id"]); +} else { + $server_id = 1; +} + +$servers = $app->db->queryAllRecords('SELECT server_id, server_name FROM server ORDER BY server_name'); +foreach($servers as $key => $server) { + if($server['server_id'] == $server_id) { + $servers[$key]['selected'] = 'selected'; + } else { + $servers[$key]['selected'] = ''; + } +} + +$app->tpl->setLoop('servers',$servers); + +$sql = "SELECT v1, v2, v3, v4, software_update.update_title, software_update.software_update_id, software_update.package_name, v1, v2, v3, v4, software_update_inst.status + FROM software_update LEFT JOIN software_update_inst ON ( software_update.software_update_id = software_update_inst.software_update_id ) + WHERE server_id = $server_id + GROUP BY software_update.package_name + ORDER BY software_update.package_name ASC, v1 DESC , v2 DESC , v3 DESC , v4 DESC"; + +$installed_packages = $app->db->queryAllRecords($sql); + + +$records_out = array(); + +if(is_array($installed_packages)) { + foreach($installed_packages as $ip) { + + // Get version number of the latest installed version + $sql = "SELECT v1, v2, v3, v4 FROM software_update, software_update_inst WHERE software_update.software_update_id = software_update_inst.software_update_id AND server_id = 1 ORDER BY v1 DESC , v2 DESC , v3 DESC , v4 DESC LIMIT 0,1"; + $lu = $app->db->queryOneRecord($sql); + + // Get all installable updates + $sql = "SELECT * FROM software_update WHERE v1 >= $lu[v1] AND v2 >= $lu[v2] AND v3 >= $lu[v3] AND v4 >= $lu[v4] AND package_name = '$ip[package_name]' ORDER BY v1 DESC , v2 DESC , v3 DESC , v4 DESC"; + $updates = $app->db->queryAllRecords($sql); + //die($sql); + + if(is_array($updates)) { + // Delete the last record as it is already installed + unset($updates[count($updates)-1]); + + foreach($updates as $key => $u) { + $version = $u['v1'].'.'.$u['v2'].'.'.$u['v3'].'.'.$u['v4']; + $installed_txt = "Install Update
"; + $records_out[] = array('version' => $version, 'update_title' => $u["update_title"], 'installed' => $installed_txt); + + } + } + } +} + +/* +$updates = $app->db->queryAllRecords('SELECT software_update.update_title, software_update.software_update_id, software_update.package_name, v1, v2, v3, v4, software_update_inst.status + FROM software_update LEFT JOIN software_update_inst ON ( software_update.software_update_id = software_update_inst.software_update_id ) + WHERE server_id = '.$server_id.' + GROUP BY software_update.package_name + ORDER BY software_update.package_name ASC, v1 DESC , v2 DESC , v3 DESC , v4 DESC'); + +if(is_array($updates)) { + foreach($updates as $key => $u) { + $installed_txt = ''; + + $version = $u['v1'].'.'.$u['v2'].'.'.$u['v3'].'.'.$u['v4']; + $updates[$key]['version'] = $version; + if($u['status'] == 'installed' || $u['status'] == 'installing' || $u['status'] == 'deleting') { + $installed_txt .= "Installed version $version
"; + } else { + $installed_txt .= "Install now
"; + } + $updates[$key]['installed'] = $installed_txt; + + } +} +*/ + + + +$app->tpl->setLoop('records',$records_out); + +include_once('lib/lang/en_software_update_list.lng'); +$app->tpl->setVar($wb); + + +$app->tpl_defaults(); +$app->tpl->pparse(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/system_config_edit.php b/interface/ispconfig/interface/admin/system_config_edit.php new file mode 100644 index 0000000000000000000000000000000000000000..14b7fcbc03b8facf57592eb231c1d41835cccc9c --- /dev/null +++ b/interface/ispconfig/interface/admin/system_config_edit.php @@ -0,0 +1,97 @@ +auth->check_module_permissions('admin'); + +// Loading classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onShowEdit() { + global $app, $conf; + + if($_SESSION["s"]["user"]["typ"] != 'admin') die('This function needs admin priveliges'); + + if($app->tform->errorMessage == '') { + $app->uses('ini_parser,getconf'); + + $section = $this->active_tab; + $server_id = $this->id; + + $this->dataRecord = $app->getconf->get_global_config($section); + + } + + $record = $app->tform->getHTML($this->dataRecord, $this->active_tab,'EDIT'); + + $record['warning'] = $app->tform->lng('warning'); + $record['id'] = $this->id; + $app->tpl->setVar($record); + } + + function onUpdateSave($sql) { + global $app; + + if($_SESSION["s"]["user"]["typ"] != 'admin') die('This function needs admin priveliges'); + $app->uses('ini_parser,getconf'); + + $section = $app->tform->getCurrentTab(); + + $server_config_array = $app->getconf->get_global_config(); + $server_config_array[$section] = $app->tform->encode($this->dataRecord,$section); + $server_config_str = $app->ini_parser->get_ini_string($server_config_array); + + $sql = "UPDATE sys_ini SET config = '".$app->db->quote($server_config_str)."' WHERE sysini_id = 1"; + $app->db->query($sql); + } + +} + +$app->tform_actions = new page_action; +$app->tform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/templates/firewall_edit.htm b/interface/ispconfig/interface/admin/templates/firewall_edit.htm new file mode 100644 index 0000000000000000000000000000000000000000..554f7d0a0c3fb862305357634e3c5fe07e8eb7de --- /dev/null +++ b/interface/ispconfig/interface/admin/templates/firewall_edit.htm @@ -0,0 +1,38 @@ +

+

+ +
+ +
+
+
+ + +
+
+ + +
+
+ + +
+
+

{tmpl_var name='active_txt'}

+
+ {tmpl_var name='active'} +
+
+
+ + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/admin/templates/firewall_list.htm b/interface/ispconfig/interface/admin/templates/firewall_list.htm new file mode 100644 index 0000000000000000000000000000000000000000..53228c8af5f92f50a59b565568df0e878cc49992 --- /dev/null +++ b/interface/ispconfig/interface/admin/templates/firewall_list.htm @@ -0,0 +1,60 @@ +

+

+ +
+ +
+
{tmpl_var name="toolsarea_head_txt"} +
+ +
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
{tmpl_var name="active"}{tmpl_var name="server_id"}{tmpl_var name="tcp_port"}{tmpl_var name="udp_port"} + +
+
+
+ +
diff --git a/interface/ispconfig/interface/admin/templates/groups_edit.htm b/interface/ispconfig/interface/admin/templates/groups_edit.htm new file mode 100644 index 0000000000000000000000000000000000000000..6a3434714fa7ffc38d4586f8d62f070a501aac98 --- /dev/null +++ b/interface/ispconfig/interface/admin/templates/groups_edit.htm @@ -0,0 +1,26 @@ +

+

+ +
+ +
+
+
+ + +
+
+ + +
+
+ + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/admin/templates/groups_list.htm b/interface/ispconfig/interface/admin/templates/groups_list.htm new file mode 100644 index 0000000000000000000000000000000000000000..0ae6ccb75e5bfecfb9b90722206af6ab4def3206 --- /dev/null +++ b/interface/ispconfig/interface/admin/templates/groups_list.htm @@ -0,0 +1,55 @@ +

+

+ +
+ +
+
{tmpl_var name="toolsarea_head_txt"} +
+ +

+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
{tmpl_var name="name"}{tmpl_var name="description"} + +
+
+
+ +
diff --git a/interface/ispconfig/interface/admin/templates/language_add.htm b/interface/ispconfig/interface/admin/templates/language_add.htm new file mode 100644 index 0000000000000000000000000000000000000000..d2254c2890b239fb6664fe7e8865b6dd5a7a239d --- /dev/null +++ b/interface/ispconfig/interface/admin/templates/language_add.htm @@ -0,0 +1,29 @@ +

+

+ +
+ +
+
Language Add +
+ + +
+
+ + +

{tmpl_var name='language_new_hint_txt'}

+
+
+ + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/admin/templates/language_complete.htm b/interface/ispconfig/interface/admin/templates/language_complete.htm new file mode 100644 index 0000000000000000000000000000000000000000..f3492bb6e88f9a47bdc83f4a46997ed8d1546031 --- /dev/null +++ b/interface/ispconfig/interface/admin/templates/language_complete.htm @@ -0,0 +1,29 @@ +

+

+ +
+ + +
+
+ +
+
+ +
+
Language Complete +
+ + +
+
+ +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/admin/templates/language_edit.htm b/interface/ispconfig/interface/admin/templates/language_edit.htm new file mode 100644 index 0000000000000000000000000000000000000000..a0ef32ec7f8ad3d4c70970f26651e6cdf291078f --- /dev/null +++ b/interface/ispconfig/interface/admin/templates/language_edit.htm @@ -0,0 +1,29 @@ +

+

+ +
+ +
+
Language File Edit: {tmpl_var name="file_path"} + + + + + + + + +
+ + + + + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/admin/templates/language_export.htm b/interface/ispconfig/interface/admin/templates/language_export.htm new file mode 100644 index 0000000000000000000000000000000000000000..95c05208eb84934a84f3f99b8e44e8dd1f3e8522 --- /dev/null +++ b/interface/ispconfig/interface/admin/templates/language_export.htm @@ -0,0 +1,28 @@ +

+

+ +
+ +
+
Language Export +
+ + +
+
+ + +

+
+ + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/admin/templates/language_import.htm b/interface/ispconfig/interface/admin/templates/language_import.htm new file mode 100644 index 0000000000000000000000000000000000000000..70f44ce2f8a776af5db4d6b3e8757c74fff87369 --- /dev/null +++ b/interface/ispconfig/interface/admin/templates/language_import.htm @@ -0,0 +1,41 @@ +

+

+ +
+ +
+
Language Import +
+ + +
+
+

{tmpl_var name='language_overwrite_txt'}

+
+ +
+
+
+

{tmpl_var name='ignore_version_txt'}

+
+ +
+
+
+ + +

+
+ +

ERROR

+
+ + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/admin/templates/language_list.htm b/interface/ispconfig/interface/admin/templates/language_list.htm new file mode 100644 index 0000000000000000000000000000000000000000..9568bef10eb60d84a16d161ffa58fdf608b35cc1 --- /dev/null +++ b/interface/ispconfig/interface/admin/templates/language_list.htm @@ -0,0 +1,47 @@ +

+

+ +
+ +
+
Tools +
+
+ + +
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + +
{tmpl_var name="module"}{tmpl_var name="lang_file"}{tmpl_var name="lang_file_date"}
+
+
+ +
diff --git a/interface/ispconfig/interface/admin/templates/remote_user_edit.htm b/interface/ispconfig/interface/admin/templates/remote_user_edit.htm new file mode 100644 index 0000000000000000000000000000000000000000..5d2c4785cf25d3327ba8bf4490998cdd1e186acc --- /dev/null +++ b/interface/ispconfig/interface/admin/templates/remote_user_edit.htm @@ -0,0 +1,41 @@ +

+

+ +
+ +
+
+
+ +
{tmpl_var name='username_prefix'}
+ +
+ +
+ + +
+
+

{tmpl_var name='password_strength_txt'}

+
+

 

+
+
+

{tmpl_var name='function_txt'}

+
+   {tmpl_var name='remote_functions'} +
+
+ +
+ + + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/admin/templates/remote_user_list.htm b/interface/ispconfig/interface/admin/templates/remote_user_list.htm new file mode 100644 index 0000000000000000000000000000000000000000..972581f73cd143fa2ce9ee48c21718d3c79ec51f --- /dev/null +++ b/interface/ispconfig/interface/admin/templates/remote_user_list.htm @@ -0,0 +1,54 @@ +

+

+
+
+ +
+ +
+ +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
{tmpl_var name="remote_userid"}{tmpl_var name="remote_username"} + +
+
+
+ +
+ diff --git a/interface/ispconfig/interface/admin/templates/server_config_cron_edit.htm b/interface/ispconfig/interface/admin/templates/server_config_cron_edit.htm new file mode 100644 index 0000000000000000000000000000000000000000..066693ed83089e005f0ce1834c04af5f17ade95c --- /dev/null +++ b/interface/ispconfig/interface/admin/templates/server_config_cron_edit.htm @@ -0,0 +1,30 @@ +

+

+ +
+ +
+
+
+ + +
+
+ + +
+
+ + +
+
+ + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/admin/templates/server_config_dns_edit.htm b/interface/ispconfig/interface/admin/templates/server_config_dns_edit.htm new file mode 100644 index 0000000000000000000000000000000000000000..63fae8a03b81b58fa4bfc7aef85d6d8b20b9d25d --- /dev/null +++ b/interface/ispconfig/interface/admin/templates/server_config_dns_edit.htm @@ -0,0 +1,38 @@ +

+

+ +
+ +
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/admin/templates/server_config_fastcgi_edit.htm b/interface/ispconfig/interface/admin/templates/server_config_fastcgi_edit.htm new file mode 100644 index 0000000000000000000000000000000000000000..8551d87abb5530b7e6670f5479416a6e95d6924c --- /dev/null +++ b/interface/ispconfig/interface/admin/templates/server_config_fastcgi_edit.htm @@ -0,0 +1,46 @@ +

+

+ +
+ +
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/admin/templates/server_config_getmail_edit.htm b/interface/ispconfig/interface/admin/templates/server_config_getmail_edit.htm new file mode 100644 index 0000000000000000000000000000000000000000..fc86eb4cadc443a292910d4bf4f846c7c2b0225f --- /dev/null +++ b/interface/ispconfig/interface/admin/templates/server_config_getmail_edit.htm @@ -0,0 +1,22 @@ +

+

+ +
+ +
+
+
+ + +
+
+ + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/admin/templates/server_config_jailkit_edit.htm b/interface/ispconfig/interface/admin/templates/server_config_jailkit_edit.htm new file mode 100644 index 0000000000000000000000000000000000000000..320fb875429a886a2522319e34fdc788ab3cd2e6 --- /dev/null +++ b/interface/ispconfig/interface/admin/templates/server_config_jailkit_edit.htm @@ -0,0 +1,34 @@ +

+

+ +
+ +
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/admin/templates/server_config_list.htm b/interface/ispconfig/interface/admin/templates/server_config_list.htm new file mode 100644 index 0000000000000000000000000000000000000000..487a39708e0048e383dfccd8b572c18be8417784 --- /dev/null +++ b/interface/ispconfig/interface/admin/templates/server_config_list.htm @@ -0,0 +1,40 @@ +

+

+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
 
{tmpl_var name="server_name"} + +
+
+
+ +
diff --git a/interface/ispconfig/interface/admin/templates/server_config_mail_edit.htm b/interface/ispconfig/interface/admin/templates/server_config_mail_edit.htm new file mode 100644 index 0000000000000000000000000000000000000000..4f35abcc9255ca772a7218fba9b49b7df63184c0 --- /dev/null +++ b/interface/ispconfig/interface/admin/templates/server_config_mail_edit.htm @@ -0,0 +1,84 @@ +

+

+ +
+ +
+
+
+ + +
+
+ + +
+
+ + +
+
+

{tmpl_var name='pop3_imap_daemon_txt'}

+
+ +
+
+
+

{tmpl_var name='mail_filter_syntax_txt'}

+
+ +
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/admin/templates/server_config_server_edit.htm b/interface/ispconfig/interface/admin/templates/server_config_server_edit.htm new file mode 100644 index 0000000000000000000000000000000000000000..361b2c7bdf8a7b0074e7443a6eb9d18a62f9efa1 --- /dev/null +++ b/interface/ispconfig/interface/admin/templates/server_config_server_edit.htm @@ -0,0 +1,51 @@ +

+

+ +
+ +
+
+
+

{tmpl_var name='auto_network_configuration_txt'}

+
+ {tmpl_var name='auto_network_configuration'} +
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +

{tmpl_var name='nameservers_hint_txt'}

+
+
+ + +
+
+ + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/admin/templates/server_config_vlogger_edit.htm b/interface/ispconfig/interface/admin/templates/server_config_vlogger_edit.htm new file mode 100644 index 0000000000000000000000000000000000000000..bf6a82ab31f92c3e3a53f348af2d93b468962b6f --- /dev/null +++ b/interface/ispconfig/interface/admin/templates/server_config_vlogger_edit.htm @@ -0,0 +1,22 @@ +

+

+ +
+ +
+
+
+ + +
+
+ + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/admin/templates/server_config_web_edit.htm b/interface/ispconfig/interface/admin/templates/server_config_web_edit.htm new file mode 100644 index 0000000000000000000000000000000000000000..6ab287b9f37e0273c97d77bcdd19e13d9ebc98f6 --- /dev/null +++ b/interface/ispconfig/interface/admin/templates/server_config_web_edit.htm @@ -0,0 +1,74 @@ +

+

+ +
+ +
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+

{tmpl_var name='security_level_txt'}

+
+ +
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/admin/templates/server_edit_config.htm b/interface/ispconfig/interface/admin/templates/server_edit_config.htm new file mode 100644 index 0000000000000000000000000000000000000000..02f6ef34d35b0378a86611afd51166aa2a37c750 --- /dev/null +++ b/interface/ispconfig/interface/admin/templates/server_edit_config.htm @@ -0,0 +1,22 @@ +

+

+ +
+ +
+
+
+ + +
+
+ + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/admin/templates/server_edit_services.htm b/interface/ispconfig/interface/admin/templates/server_edit_services.htm new file mode 100644 index 0000000000000000000000000000000000000000..470a10ef1486d2df58124250693e0b435ac3c4b8 --- /dev/null +++ b/interface/ispconfig/interface/admin/templates/server_edit_services.htm @@ -0,0 +1,70 @@ +

+

+ +
+ +
+
+
+ + +
+
+

{tmpl_var name='mail_server_txt'}

+
+ {tmpl_var name='mail_server'} +
+
+
+

{tmpl_var name='web_server_txt'}

+
+ {tmpl_var name='web_server'} +
+
+
+

{tmpl_var name='dns_server_txt'}

+
+ {tmpl_var name='dns_server'} +
+
+
+

{tmpl_var name='file_server_txt'}

+
+ {tmpl_var name='file_server'} +
+
+
+

{tmpl_var name='db_server_txt'}

+
+ {tmpl_var name='db_server'} +
+
+
+

{tmpl_var name='vserver_server_txt'}

+
+ {tmpl_var name='vserver_server'} +
+
+
+ + +
+
+ + +
+
+ + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/admin/templates/server_ip_edit.htm b/interface/ispconfig/interface/admin/templates/server_ip_edit.htm new file mode 100644 index 0000000000000000000000000000000000000000..1ebe8bd91a02df425f50f70b02be17d46bd50b46 --- /dev/null +++ b/interface/ispconfig/interface/admin/templates/server_ip_edit.htm @@ -0,0 +1,34 @@ +

+

+ +
+ +
+
+
+ + +
+
+ + +
+
+

{tmpl_var name='virtualhost_txt'}

+
+ {tmpl_var name='virtualhost'} +
+
+
+ + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/admin/templates/server_ip_list.htm b/interface/ispconfig/interface/admin/templates/server_ip_list.htm new file mode 100644 index 0000000000000000000000000000000000000000..f35e84a06213c350a4ffcb7a76f6fc6c72f84320 --- /dev/null +++ b/interface/ispconfig/interface/admin/templates/server_ip_list.htm @@ -0,0 +1,53 @@ +

+

+ +
+ +
+
{tmpl_var name="toolsarea_head_txt"} +
+ +
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
{tmpl_var name="server_id"}{tmpl_var name="ip_address"} + +
+
+
+ +
diff --git a/interface/ispconfig/interface/admin/templates/server_list.htm b/interface/ispconfig/interface/admin/templates/server_list.htm new file mode 100644 index 0000000000000000000000000000000000000000..acfa541409f06b9cfd98dad475164d4972ecda5d --- /dev/null +++ b/interface/ispconfig/interface/admin/templates/server_list.htm @@ -0,0 +1,58 @@ +

+

+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
{tmpl_var name="server_name"}{tmpl_var name="mail_server"}{tmpl_var name="web_server"}{tmpl_var name="dns_server"}{tmpl_var name="file_server"}{tmpl_var name="db_server"}{tmpl_var name="vserver_server"} + +
+
+
+ +
diff --git a/interface/ispconfig/interface/admin/templates/software_package_list.htm b/interface/ispconfig/interface/admin/templates/software_package_list.htm new file mode 100644 index 0000000000000000000000000000000000000000..dd465ac6b28985a38582e1cbfb2ec65a2d7ceaa3 --- /dev/null +++ b/interface/ispconfig/interface/admin/templates/software_package_list.htm @@ -0,0 +1,34 @@ +

+

+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + +
{tmpl_var name="installed"}{tmpl_var name="package_title"}{tmpl_var name="package_description"}
+
+
+ +
diff --git a/interface/ispconfig/interface/admin/templates/software_repo_edit.htm b/interface/ispconfig/interface/admin/templates/software_repo_edit.htm new file mode 100644 index 0000000000000000000000000000000000000000..af335ecf5cf7df3cec20ff177e35c266ef3e47d6 --- /dev/null +++ b/interface/ispconfig/interface/admin/templates/software_repo_edit.htm @@ -0,0 +1,40 @@ +

+

+ +
+ +
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+

{tmpl_var name='active_txt'}

+
+ {tmpl_var name='active'} +
+
+
+ + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/admin/templates/software_repo_list.htm b/interface/ispconfig/interface/admin/templates/software_repo_list.htm new file mode 100644 index 0000000000000000000000000000000000000000..05adca9d9f4f1d9cb5223d59d9a9af1656884549 --- /dev/null +++ b/interface/ispconfig/interface/admin/templates/software_repo_list.htm @@ -0,0 +1,56 @@ +

+

+ +
+ +
+
{tmpl_var name="toolsarea_head_txt"} +
+ +
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
{tmpl_var name="active"}{tmpl_var name="repo_name"}{tmpl_var name="repo_url"} + +
+
+
+ +
diff --git a/interface/ispconfig/interface/admin/templates/software_update_list.htm b/interface/ispconfig/interface/admin/templates/software_update_list.htm new file mode 100644 index 0000000000000000000000000000000000000000..10a0acf12b5e77c4e17d92b839449272e10b23f3 --- /dev/null +++ b/interface/ispconfig/interface/admin/templates/software_update_list.htm @@ -0,0 +1,49 @@ +

+

+ +
+ +
+
Tools +
+
+ + +
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + +
{tmpl_var name="installed"}{tmpl_var name="update_title"}{tmpl_var name="version"}
+
+
+ +
diff --git a/interface/ispconfig/interface/admin/templates/system_config_mail_edit.htm b/interface/ispconfig/interface/admin/templates/system_config_mail_edit.htm new file mode 100644 index 0000000000000000000000000000000000000000..b905e2d089ab6b008ad048c68ef33732983c3f82 --- /dev/null +++ b/interface/ispconfig/interface/admin/templates/system_config_mail_edit.htm @@ -0,0 +1,28 @@ +

+

+ +
+ +
+
+
+

{tmpl_var name='mailboxlist_webmail_link_txt'}

+
+ {tmpl_var name='mailboxlist_webmail_link'} +
+
+
+ + +
+
+ + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/admin/templates/system_config_sites_edit.htm b/interface/ispconfig/interface/admin/templates/system_config_sites_edit.htm new file mode 100644 index 0000000000000000000000000000000000000000..c819776525a581ff0c5eb19d5d3edd7036226765 --- /dev/null +++ b/interface/ispconfig/interface/admin/templates/system_config_sites_edit.htm @@ -0,0 +1,44 @@ +

+

+ +
+ +
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+

{tmpl_var name='dblist_phpmyadmin_link_txt'}

+
+ {tmpl_var name='dblist_phpmyadmin_link'} +
+
+
+ + +
+
+ + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/admin/templates/users_groups_edit.htm b/interface/ispconfig/interface/admin/templates/users_groups_edit.htm new file mode 100644 index 0000000000000000000000000000000000000000..004c7dbd6ec5f97fe2d402d6de86cd07bb25b2ab --- /dev/null +++ b/interface/ispconfig/interface/admin/templates/users_groups_edit.htm @@ -0,0 +1,30 @@ +

+

+ +
+ +
+
+
+ + +
+
+

{tmpl_var name='groups_txt'}

+
+ {tmpl_var name='groups'} +
+
+
+ + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/admin/templates/users_list.htm b/interface/ispconfig/interface/admin/templates/users_list.htm new file mode 100644 index 0000000000000000000000000000000000000000..6634201a7c8df44065188dc3d4de3464b15ab212 --- /dev/null +++ b/interface/ispconfig/interface/admin/templates/users_list.htm @@ -0,0 +1,61 @@ +

+

+ +
+ +
+
{tmpl_var name="toolsarea_head_txt"} +
+ +

+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
{tmpl_var name="username"}{tmpl_var name="vorname"}{tmpl_var name="name"}{tmpl_var name="ort"} + +
+
+
+ +
diff --git a/interface/ispconfig/interface/admin/templates/users_user_edit.htm b/interface/ispconfig/interface/admin/templates/users_user_edit.htm new file mode 100644 index 0000000000000000000000000000000000000000..ce0017823f02b9e0507cc431b2088839c4d41e55 --- /dev/null +++ b/interface/ispconfig/interface/admin/templates/users_user_edit.htm @@ -0,0 +1,67 @@ +

+

+ +
+ +
+
+
+ + +
+
+ + +
+
+

{tmpl_var name='password_strength_txt'}

+
+

 

+
+
+

{tmpl_var name='modules_txt'}

+
+ {tmpl_var name='modules'} +
+
+
+ + +
+
+

{tmpl_var name='app_theme_txt'}

+
+ {tmpl_var name='app_theme'} +
+
+
+

{tmpl_var name='typ_txt'}

+
+ {tmpl_var name='typ'} +
+
+
+

{tmpl_var name='active_txt'}

+
+ {tmpl_var name='active'} +
+
+
+ + +
+
+ + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/admin/users_del.php b/interface/ispconfig/interface/admin/users_del.php new file mode 100644 index 0000000000000000000000000000000000000000..97c3154c88a796cd564ec71b461fea26c51e48d1 --- /dev/null +++ b/interface/ispconfig/interface/admin/users_del.php @@ -0,0 +1,51 @@ +auth->check_module_permissions('admin'); + +$app->uses("tform_actions"); +$app->tform_actions->onDelete(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/users_edit.php b/interface/ispconfig/interface/admin/users_edit.php new file mode 100644 index 0000000000000000000000000000000000000000..4344e3c9554983b1a722d1ed101e0ae8a1f1e6e8 --- /dev/null +++ b/interface/ispconfig/interface/admin/users_edit.php @@ -0,0 +1,74 @@ +auth->check_module_permissions('admin'); + +// Loading classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onBeforeInsert() { + global $app, $conf; + + if(!in_array($this->dataRecord['startmodule'],$this->dataRecord['modules'])) { + $app->tform->errorMessage .= $app->tform->wordbook['startmodule_err']; + } + } + + function onBeforeUpdate() { + global $app, $conf; + + if(@is_array($this->dataRecord['modules']) && !in_array($this->dataRecord['startmodule'],$this->dataRecord['modules'])) { + $app->tform->errorMessage .= $app->tform->wordbook['startmodule_err']; + } + } + +} + +$page = new page_action; +$page->onLoad(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/users_list.php b/interface/ispconfig/interface/admin/users_list.php new file mode 100644 index 0000000000000000000000000000000000000000..d2e2c8675922a33bbd381c45aa8b29c23e3cc191 --- /dev/null +++ b/interface/ispconfig/interface/admin/users_list.php @@ -0,0 +1,52 @@ +auth->check_module_permissions('admin'); + +$app->uses('listform_actions'); +$app->listform_actions->SQLOrderBy = 'ORDER BY username'; +$app->listform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/capp.php b/interface/ispconfig/interface/capp.php new file mode 100644 index 0000000000000000000000000000000000000000..354652ce37052055109fb5923641c52a9debcfe8 --- /dev/null +++ b/interface/ispconfig/interface/capp.php @@ -0,0 +1,56 @@ +error($app->lng(301)); + +// lade Moduldaten in Session +if(is_file($mod."/lib/module.conf.php")) { + include_once($mod."/lib/module.conf.php"); + $_SESSION["s"]["module"] = $module; + echo "HEADER_REDIRECT:".$_SESSION["s"]["module"]["startpage"]; +} else { + $app->error($app->lng(302)); +} +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/client/client_del.php b/interface/ispconfig/interface/client/client_del.php new file mode 100644 index 0000000000000000000000000000000000000000..db1790c062a3ae71d1351a6f11ac8481349cf421 --- /dev/null +++ b/interface/ispconfig/interface/client/client_del.php @@ -0,0 +1,166 @@ +auth->check_module_permissions('client'); + +$app->uses('tpl,tform'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onDelete() { + global $app, $conf,$list_def_file,$tform_def_file; + + if($_POST["confirm"] == 'yes') { + parent::onDelete(); + } else { + + $app->uses('tpl'); + $app->tpl->newTemplate("form.tpl.htm"); + $app->tpl->setInclude('content_tpl', 'templates/client_del.htm'); + + include_once($list_def_file); + + // Loading tform framework + if(!is_object($app->tform)) $app->uses('tform'); + + // Load table definition from file + $app->tform->loadFormDef($tform_def_file); + + $this->id = intval($_REQUEST["id"]); + + $this->dataRecord = $app->tform->getDataRecord($this->id); + $client_id = intval($this->dataRecord['client_id']); + //$parent_client_id = intval($this->dataRecord['parent_client_id']); + //$parent_user = $app->db->queryOneRecord("SELECT userid FROM sys_user WHERE client_id = $parent_client_id"); + $client_group = $app->db->queryOneRecord("SELECT groupid FROM sys_group WHERE client_id = $client_id"); + + // Get all records (sub-clients, mail, web, etc....) of this client. + $tables = 'client,dns_rr,dns_soa,ftp_user,mail_access,mail_content_filter,mail_domain,mail_forwarding,mail_get,mail_user,mail_user_filter,shell_user,spamfilter_users,support_message,web_database,web_domain,web_traffic'; + $tables_array = explode(',',$tables); + $client_group_id = intval($client_group['groupid']); + $table_list = array(); + if($client_group_id > 1) { + foreach($tables_array as $table) { + if($table != '') { + $records = $app->db->queryAllRecords("SELECT * FROM $table WHERE sys_groupid = ".$client_group_id); + $number = count($records); + if($number > 0) $table_list[] = array('table' => $table."(".$number.")"); + } + } + } + + $app->tpl->setVar('id',$this->id); + $app->tpl->setLoop('records', $table_list); + + //* load language file + $lng_file = 'lib/lang/'.$_SESSION['s']['language'].'_client_del.lng'; + include($lng_file); + $app->tpl->setVar($wb); + + $app->tpl_defaults(); + $app->tpl->pparse(); + } + } + + + + + function onAfterDelete() { + global $app, $conf; + + $client_id = intval($this->dataRecord['client_id']); + + if($client_id > 0) { + // remove the group of the client from the resellers group + $parent_client_id = intval($this->dataRecord['parent_client_id']); + $parent_user = $app->db->queryOneRecord("SELECT userid FROM sys_user WHERE client_id = $parent_client_id"); + $client_group = $app->db->queryOneRecord("SELECT groupid FROM sys_group WHERE client_id = $client_id"); + $app->auth->remove_group_from_user($parent_user['userid'],$client_group['groupid']); + + // delete the group of the client + $app->db->query("DELETE FROM sys_group WHERE client_id = $client_id"); + + // delete the sys user(s) of the client + $app->db->query("DELETE FROM sys_user WHERE client_id = $client_id"); + + // Delete all records (sub-clients, mail, web, etc....) of this client. + $tables = 'client,dns_rr,dns_soa,ftp_user,mail_access,mail_content_filter,mail_domain,mail_forwarding,mail_get,mail_user,mail_user_filter,shell_user,spamfilter_users,support_message,web_database,web_domain,web_traffic'; + $tables_array = explode(',',$tables); + $client_group_id = intval($client_group['groupid']); + if($client_group_id > 1) { + foreach($tables_array as $table) { + if($table != '') { + $records = $app->db->queryAllRecords("SELECT * FROM $table WHERE sys_groupid = ".$client_group_id); + // find the primary ID of the table + $table_info = $app->db->tableInfo($table); + $index_field = ''; + foreach($table_info as $tmp) { + if($tmp['option'] == 'primary') $index_field = $tmp['name']; + } + // Delete the records + if($index_field != '') { + if(is_array($records)) { + foreach($records as $rec) { + $app->db->datalogDelete($table, $index_field, $rec[$index_field]); + } + } + } + + } + } + } + + + + } + + } +} + +$page = new page_action; +$page->onDelete() + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/client/client_edit.php b/interface/ispconfig/interface/client/client_edit.php new file mode 100644 index 0000000000000000000000000000000000000000..9073ec9c2e82d84d1c3fe8bd962089ae8728aa44 --- /dev/null +++ b/interface/ispconfig/interface/client/client_edit.php @@ -0,0 +1,228 @@ +auth->check_module_permissions('client'); + +// Loading classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + + function onShowNew() { + global $app, $conf; + + // we will check only users, not admins + if($_SESSION["s"]["user"]["typ"] == 'user') { + + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_client FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Check if the user may add another website. + if($client["limit_client"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(client_id) as number FROM client WHERE sys_groupid = $client_group_id"); + if($tmp["number"] >= $client["limit_client"]) { + $app->error($app->tform->wordbook["limit_client_txt"]); + } + } + } + + parent::onShowNew(); + } + + + function onSubmit() { + global $app, $conf; + + // we will check only users, not admins + if($_SESSION["s"]["user"]["typ"] == 'user' && $this->id == 0) { + + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_client FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Check if the user may add another website. + if($client["limit_client"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(client_id) as number FROM client WHERE sys_groupid = $client_group_id"); + if($tmp["number"] >= $client["limit_client"]) { + $app->error($app->tform->wordbook["limit_client_txt"]); + } + } + } + + parent::onSubmit(); + } + + + function onShowEnd() { + + global $app; + + $sql = "SELECT template_id,template_name FROM client_template WHERE template_type = 'a'"; + $tpls = $app->db->queryAllRecords($sql); + $option = ''; + $tpl = array(); + foreach($tpls as $item){ + $option .= ''; + $tpl[$item['template_id']] = $item['template_name']; + } + $app->tpl->setVar('tpl_add_select',$option); + + $sql = "SELECT template_additional FROM client WHERE client_id = " . $this->id; + $result = $app->db->queryOneRecord($sql); + $tplAdd = explode("/", $result['template_additional']); + $text = ''; + foreach($tplAdd as $item){ + if (trim($item) != ''){ + if ($text != '') $text .= '
'; + $text .= $tpl[$item]; + } + } + + $app->tpl->setVar('template_additional_list', $text); + + parent::onShowEnd(); + + } + + /* + This function is called automatically right after + the data was successful inserted in the database. + */ + function onAfterInsert() { + global $app; + // Create the group for the client + $groupid = $app->db->datalogInsert('sys_group', "(name,description,client_id) VALUES ('".mysql_real_escape_string($this->dataRecord["username"])."','',".$this->id.")", 'groupid'); + $groups = $groupid; + + $username = $app->db->quote($this->dataRecord["username"]); + $password = $app->db->quote($this->dataRecord["password"]); + $modules = ISPC_INTERFACE_MODULES_ENABLED; + if($this->dataRecord["limit_client"] > 0) $modules .= ',client'; + $startmodule = 'mail'; + $usertheme = $app->db->quote($this->dataRecord["usertheme"]); + $type = 'user'; + $active = 1; + $language = $app->db->quote($this->dataRecord["language"]); + + // Create the controlpaneluser for the client + $sql = "INSERT INTO sys_user (username,passwort,modules,startmodule,app_theme,typ,active,language,groups,default_group,client_id) + VALUES ('$username',md5('$password'),'$modules','$startmodule','$usertheme','$type','$active','$language',$groups,$groupid,".$this->id.")"; + $app->db->query($sql); + + //* If the user who inserted the client is a reseller (not admin), we will have to add this new client group + //* to his groups, so he can administrate the records of this client. + if($_SESSION['s']['user']['typ'] == 'user') { + $app->auth->add_group_to_user($_SESSION['s']['user']['userid'],$groupid); + $app->db->query("UPDATE client SET parent_client_id = ".intval($_SESSION['s']['user']['client_id'])." WHERE client_id = ".$this->id); + } + + $app->db->query("UPDATE client SET created_at = ".time()." WHERE client_id = ".$this->id); + + /* If there is a client-template, process it */ + applyClientTemplates($this->id); + + parent::onAfterInsert(); + } + + + /* + This function is called automatically right after + the data was successful updated in the database. + */ + function onAfterUpdate() { + global $app; + + // username changed + if(isset($this->dataRecord['username']) && $this->dataRecord['username'] != '' && $this->oldDataRecord['username'] != $this->dataRecord['username']) { + $username = $app->db->quote($this->dataRecord["username"]); + $client_id = $this->id; + $sql = "UPDATE sys_user SET username = '$username' WHERE client_id = $client_id"; + $app->db->query($sql); + + $tmp = $app->db->queryOneRecord("SELECT * FROM sys_group WHERE client_id = $client_id"); + $app->db->datalogUpdate("sys_group", "name = '$username'", 'groupid', $tmp['groupid']); + unset($tmp); + } + + // password changed + if(isset($this->dataRecord["password"]) && $this->dataRecord["password"] != '') { + $password = $app->db->quote($this->dataRecord["password"]); + $client_id = $this->id; + $sql = "UPDATE sys_user SET passwort = md5('$password') WHERE client_id = $client_id"; + $app->db->query($sql); + } + + // language changed + if(isset($this->dataRecord['language']) && $this->dataRecord['language'] != '' && $this->oldDataRecord['language'] != $this->dataRecord['language']) { + $language = $app->db->quote($this->dataRecord["language"]); + $client_id = $this->id; + $sql = "UPDATE sys_user SET language = '$language' WHERE client_id = $client_id"; + $app->db->query($sql); + } + + // reseller status changed + if(isset($this->dataRecord["limit_client"]) && $this->dataRecord["limit_client"] != $this->oldDataRecord["limit_client"]) { + $modules = ISPC_INTERFACE_MODULES_ENABLED; + if($this->dataRecord["limit_client"] > 0) $modules .= ',client'; + $modules = $app->db->quote($modules); + $client_id = $this->id; + $sql = "UPDATE sys_user SET modules = '$modules' WHERE client_id = $client_id"; + $app->db->query($sql); + } + /* + * If there is a client-template, process it */ + applyClientTemplates($this->id); + + parent::onAfterUpdate(); + } +} + +$page = new page_action; +$page->onLoad(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/client/client_list.php b/interface/ispconfig/interface/client/client_list.php new file mode 100644 index 0000000000000000000000000000000000000000..dd98e29a1e4994f7e94204d9605c2371cdf1b0ed --- /dev/null +++ b/interface/ispconfig/interface/client/client_list.php @@ -0,0 +1,25 @@ +auth->check_module_permissions('client'); + +$app->uses('listform_actions'); + +$app->listform_actions->SQLOrderBy = 'ORDER BY company_name, contact_name, client_id'; +$app->listform_actions->SQLExtWhere = "limit_client = 0"; +$app->listform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/client/client_template_del.php b/interface/ispconfig/interface/client/client_template_del.php new file mode 100644 index 0000000000000000000000000000000000000000..6d8e8348f5be4461c3a1e4edcec37dfbde4c2599 --- /dev/null +++ b/interface/ispconfig/interface/client/client_template_del.php @@ -0,0 +1,67 @@ +auth->check_module_permissions('client'); +if(!$_SESSION["s"]["user"]["typ"] == 'admin') die('Client-Templates are for Admins only.'); + +$app->uses('tpl,tform'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + function onBeforeDelete() { + global $app; + + $rec = $app->db->queryOneRecord("SELECT count(client_id) as number FROM client WHERE template_master = ".$this->id." OR template_additional like '%/".$this->id."/%'"); + if($rec['number'] > 0) { + $app->error($app->tform->lng('template_del_aborted_txt')); + } + + } +} + +$page = new page_action; +$page->onDelete() + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/client/client_template_edit.php b/interface/ispconfig/interface/client/client_template_edit.php new file mode 100644 index 0000000000000000000000000000000000000000..f032ded7c1854c85167e848bd3ba04e5a14d4fba --- /dev/null +++ b/interface/ispconfig/interface/client/client_template_edit.php @@ -0,0 +1,97 @@ +auth->check_module_permissions('client'); +if(!$_SESSION["s"]["user"]["typ"] == 'admin') die('Client-Templates are only for Admins.'); + +// Loading classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onBeforeUpdate() { + global $app; + + if(isset($this->dataRecord['template_type'])) { + //* Check if the template_type has been changed + $rec = $app->db->queryOneRecord("SELECT template_type from client_template WHERE template_id = ".$this->id); + if($rec['template_type'] != $this->dataRecord['template_type']) { + //* Add a error message and switch back to old server + $app->tform->errorMessage .= $app->lng('The template type can not be changed.'); + $this->dataRecord['template_type'] = $rec['template_type']; + } + unset($rec); + } + } + + + /* + This function is called automatically right after + the data was successful updated in the database. + */ + function onAfterUpdate() { + global $app; + + /* + * the template has changed. apply the new data to all clients + */ + if ($this->dataRecord["template_type"] == 'm'){ + $sql = "SELECT client_id FROM client WHERE template_master = " . $this->id; + } else { + $sql = "SELECT client_id FROM client WHERE template_additional LIKE '%/" . $this->id . '/%"'; + } + $clients = $app->db->queryAllRecords($sql); + if (is_array($clients)){ + foreach ($clients as $client){ + applyClientTemplates($client['client_id']); + } + } + } +} + +$page = new page_action; +$page->onLoad(); +?> diff --git a/interface/ispconfig/interface/client/client_template_list.php b/interface/ispconfig/interface/client/client_template_list.php new file mode 100644 index 0000000000000000000000000000000000000000..d9a9163749ef83c76cc6ac86122c2e7ed85912d3 --- /dev/null +++ b/interface/ispconfig/interface/client/client_template_list.php @@ -0,0 +1,21 @@ +auth->check_module_permissions('client'); +if(!$_SESSION["s"]["user"]["typ"] == 'admin') die('Client-Templates are only for Admins.'); + +$app->uses('listform_actions'); +$app->listform_actions->onLoad(); +?> diff --git a/interface/ispconfig/interface/client/form/client.tform.php b/interface/ispconfig/interface/client/form/client.tform.php new file mode 100644 index 0000000000000000000000000000000000000000..01f616e53fe5f0c8eab796334e6533752b51428e --- /dev/null +++ b/interface/ispconfig/interface/client/form/client.tform.php @@ -0,0 +1,785 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +//* Languages +$language_list = array(); +$handle = @opendir(ISPC_ROOT_PATH.'/lib/lang'); +while ($file = @readdir ($handle)) { + if ($file != '.' && $file != '..') { + if(@is_file(ISPC_ROOT_PATH.'/lib/lang/'.$file) and substr($file,-4,4) == '.lng') { + $tmp = substr($file, 0, 2); + $language_list[$tmp] = $tmp; + } + } +} + +//* Load themes +$themes_list = array(); +$handle = @opendir(ISPC_THEMES_PATH); +while ($file = @readdir ($handle)) { + if (substr($file, 0, 1) != '.') { + if(@is_dir(ISPC_THEMES_PATH."/$file")) { + $themes_list[$file] = $file; + } + } +} + +$form["tabs"]['address'] = array ( + 'title' => "Address", + 'width' => 100, + 'template' => "templates/client_edit_address.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'company_name' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'contact_name' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'contact_error_empty'), + ), + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'username' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'username_error_empty'), + 1 => array ( 'type' => 'CUSTOM', + 'class' => 'validate_client', + 'function' => 'username_unique', + 'errmsg'=> 'username_error_unique'), + 2 => array ( 'type' => 'REGEX', + 'regex' => '/^[\w\.\-\_]{0,64}$/', + 'errmsg'=> 'username_error_regex'), + ), + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'password' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'PASSWORD', + 'encryption'=> 'CRYPT', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'language' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => $conf["language"], + 'value' => $language_list, + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'usertheme' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => 'default', + 'value' => $themes_list, + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'street' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'zip' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'city' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'state' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'country' => array ( + 'datatype' => 'VARCHAR', + + 'formtype' => 'SELECT', + 'default' => 'DE', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT iso,printable_name FROM country ORDER BY printable_name', + 'keyfield'=> 'iso', + 'valuefield'=> 'printable_name' + ), + 'value' => '' + ), + 'telephone' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'mobile' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'fax' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'email' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'internet' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => 'http://', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'icq' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'notes' => array ( + 'datatype' => 'TEXT', + 'formtype' => 'TEXTAREA', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '', + 'maxlength' => '', + 'rows' => '10', + 'cols' => '30' + ), + ################################## + # END Datatable fields + ################################## + ) +); + +$form["tabs"]['limits'] = array ( + 'title' => "Limits", + 'width' => 80, + 'template' => "templates/client_edit_limits.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'template_master' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '1', + 'datasource' => array ( 'type' => 'CUSTOM', + 'class'=> 'custom_datasource', + 'function'=> 'master_templates' + ), + 'value' => '' + ), + 'template_additional' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + ), + 'default_mailserver' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '1', + 'datasource' => array ( 'type' => 'CUSTOM', + 'class'=> 'custom_datasource', + 'function'=> 'client_servers' + ), + 'value' => '', + 'name' => 'default_mailserver' + ), + 'limit_maildomain' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_maildomain_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_mailbox' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_mailbox_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_mailalias' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_mailalias_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_mailaliasdomain' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_mailaliasdomain_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_mailforward' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_mailforward_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_mailcatchall' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_mailcatchall_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_mailrouting' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_mailrouting_error_notint'), + ), + 'default' => '0', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_mailfilter' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_mailfilter_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_fetchmail' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_mailfetchmail_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_mailquota' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_mailquota_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_spamfilter_wblist' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_spamfilter_wblist_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_spamfilter_user' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_spamfilter_user_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_spamfilter_policy' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_spamfilter_policy_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'default_webserver' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '1', + 'datasource' => array ( 'type' => 'CUSTOM', + 'class'=> 'custom_datasource', + 'function'=> 'client_servers' + ), + 'value' => '', + 'name' => 'default_webserver' + ), + 'limit_web_domain' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_web_domain_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_web_quota' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_web_quota_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'web_php_options' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOXARRAY', + 'default' => '', + 'separator' => ',', + 'valuelimit' => 'client:web_php_options', + 'value' => array('no' => 'Disabled', 'fast-cgi' => 'Fast-CGI', 'cgi' => 'CGI', 'mod' => 'Mod-PHP', 'suphp' => 'SuPHP') + ), + 'limit_web_aliasdomain' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_web_aliasdomain_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_web_subdomain' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_web_subdomain_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_ftp_user' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_ftp_user_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_shell_user' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_shell_user_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'ssh_chroot' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOXARRAY', + 'default' => '', + 'separator' => ',', + 'valuelimit' => 'client:ssh_chroot', + 'value' => array('no' => 'None', 'jailkit' => 'Jailkit') + ), + 'default_dnsserver' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '1', + 'datasource' => array ( 'type' => 'CUSTOM', + 'class'=> 'custom_datasource', + 'function'=> 'client_servers' + ), + 'value' => '', + 'name' => 'default_dnsserver' + ), + 'limit_dns_zone' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_dns_zone_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_dns_record' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_dns_record_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_client' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_client_error_notint'), + ), + 'default' => '0', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'default_dbserver' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '1', + 'datasource' => array ( 'type' => 'CUSTOM', + 'class'=> 'custom_datasource', + 'function'=> 'client_servers' + ), + 'value' => '', + 'name' => 'default_dbserver' + ), + 'limit_database' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_database_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_cron' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_cron_error_notint'), + ), + 'default' => '0', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_cron_type' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => '', + 'value' => array('full' => 'Full Cron','chrooted' => 'Chrooted Cron','url' => 'URL Cron') + ), + 'limit_cron_frequency' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_cron_error_frequency'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_traffic_quota' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_traffic_quota_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + ################################## + # END Datatable fields + ################################## + ) +); + +/* +$form["tabs"]['ipaddress'] = array ( + 'title' => "IP Addresses", + 'width' => 100, + 'template' => "templates/client_edit_ipaddress.htm", + 'fields' => array ( + ################################## + # Beginn Datatable fields + ################################## + 'ip_address' => array ( + 'datatype' => 'TEXT', + 'formtype' => 'CHECKBOXARRAY', + 'default' => '', + 'value' => array('192.168.0.1' => '192.168.0.1', '192.168.0.2' => '192.168.0.2'), + 'separator' => ';' + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); +*/ + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/client/form/client_template.tform.php b/interface/ispconfig/interface/client/form/client_template.tform.php new file mode 100644 index 0000000000000000000000000000000000000000..d1db4bae01e60d51944db7f19c80aaef8035797c --- /dev/null +++ b/interface/ispconfig/interface/client/form/client_template.tform.php @@ -0,0 +1,482 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +//* Languages +$language_list = array(); +$handle = @opendir(ISPC_ROOT_PATH.'/lib/lang'); +while ($file = @readdir ($handle)) { + if ($file != '.' && $file != '..') { + if(@is_file(ISPC_ROOT_PATH.'/lib/lang/'.$file) and substr($file,-4,4) == '.lng') { + $tmp = substr($file, 0, 2); + $language_list[$tmp] = $tmp; + } + } +} + +$form["tabs"]['template'] = array ( + 'title' => "Template", + 'width' => 80, + 'template' => "templates/client_template_edit_template.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'template_type' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => 'm', + 'value' => array('m' => "Main Template",'a' => "Additional Template"), + ), + 'template_name' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'error_template_name_empty'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + ################################## + # END Datatable fields + ################################## + ) +); + +$form["tabs"]['limits'] = array ( + 'title' => "Limits", + 'width' => 80, + 'template' => "templates/client_template_edit_limits.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'limit_maildomain' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_maildomain_error_notint'), + ), + 'default' => '0', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_mailbox' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_mailbox_error_notint'), + ), + 'default' => '0', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_mailalias' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_mailalias_error_notint'), + ), + 'default' => '0', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_mailaliasdomain' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_mailaliasdomain_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_mailforward' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_mailforward_error_notint'), + ), + 'default' => '0', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_mailcatchall' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_mailcatchall_error_notint'), + ), + 'default' => '0', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_mailrouting' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_mailrouting_error_notint'), + ), + 'default' => '0', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_mailfilter' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_mailfilter_error_notint'), + ), + 'default' => '0', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_fetchmail' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_mailfetchmail_error_notint'), + ), + 'default' => '0', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_mailquota' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_mailquota_error_notint'), + ), + 'default' => '0', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_spamfilter_wblist' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_spamfilter_wblist_error_notint'), + ), + 'default' => '0', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_spamfilter_user' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_spamfilter_user_error_notint'), + ), + 'default' => '0', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_spamfilter_policy' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_spamfilter_policy_error_notint'), + ), + 'default' => '0', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_web_domain' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_web_domain_error_notint'), + ), + 'default' => '0', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_web_quota' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_web_quota_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_web_aliasdomain' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_web_aliasdomain_error_notint'), + ), + 'default' => '0', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_web_subdomain' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_web_subdomain_error_notint'), + ), + 'default' => '0', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_ftp_user' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_ftp_user_error_notint'), + ), + 'default' => '0', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_shell_user' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_shell_user_error_notint'), + ), + 'default' => '0', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_dns_zone' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_dns_zone_error_notint'), + ), + 'default' => '0', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_dns_record' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_dns_record_error_notint'), + ), + 'default' => '0', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + /* + 'limit_client' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_client_error_notint'), + ), + 'default' => '0', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + */ + 'limit_database' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_database_error_notint'), + ), + 'default' => '0', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_cron' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_cron_error_notint'), + ), + 'default' => '0', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_cron_type' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => '', + 'value' => array('full' => 'Full Cron','chrooted' => 'Chrooted Cron','url' => 'URL Cron') + ), + 'limit_cron_frequency' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_cron_error_frequency'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_traffic_quota' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_traffic_quota_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + ################################## + # END Datatable fields + ################################## + ) +); + +?> diff --git a/interface/ispconfig/interface/client/form/reseller.tform.php b/interface/ispconfig/interface/client/form/reseller.tform.php new file mode 100644 index 0000000000000000000000000000000000000000..a987a9f9824682e812f0814d68cc05f3b8ac2ac8 --- /dev/null +++ b/interface/ispconfig/interface/client/form/reseller.tform.php @@ -0,0 +1,761 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +//* Languages +$language_list = array(); +$handle = @opendir(ISPC_ROOT_PATH.'/lib/lang'); +while ($file = @readdir ($handle)) { + if ($file != '.' && $file != '..') { + if(@is_file(ISPC_ROOT_PATH.'/lib/lang/'.$file) and substr($file,-4,4) == '.lng') { + $tmp = substr($file, 0, 2); + $language_list[$tmp] = $tmp; + } + } +} + +$form["tabs"]['address'] = array ( + 'title' => "Address", + 'width' => 100, + 'template' => "templates/reseller_edit_address.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'company_name' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'contact_name' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'contact_error_empty'), + ), + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'username' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'username_error_empty'), + 1 => array ( 'type' => 'CUSTOM', + 'class' => 'validate_client', + 'function' => 'username_unique', + 'errmsg'=> 'username_error_unique'), + 2 => array ( 'type' => 'REGEX', + 'regex' => '/^[\w\.\-\_]{0,64}$/', + 'errmsg'=> 'username_error_regex'), + ), + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'password' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'PASSWORD', + 'encryption'=> 'CRYPT', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'language' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => $conf["language"], + 'value' => $language_list, + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'usertheme' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => 'default', + 'value' => array('default' => 'default'), + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'street' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'zip' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'city' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'state' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'country' => array ( + 'datatype' => 'VARCHAR', + + 'formtype' => 'SELECT', + 'default' => 'DE', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT iso,printable_name FROM country ORDER BY printable_name', + 'keyfield'=> 'iso', + 'valuefield'=> 'printable_name' + ), + 'value' => '' + ), + 'telephone' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'mobile' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'fax' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'email' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'internet' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => 'http://', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'icq' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'notes' => array ( + 'datatype' => 'TEXT', + 'formtype' => 'TEXTAREA', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '', + 'maxlength' => '', + 'rows' => '10', + 'cols' => '30' + ), + ################################## + # END Datatable fields + ################################## + ) +); + +$form["tabs"]['limits'] = array ( + 'title' => "Limits", + 'width' => 80, + 'template' => "templates/reseller_edit_limits.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'template_master' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '1', + 'datasource' => array ( 'type' => 'CUSTOM', + 'class'=> 'custom_datasource', + 'function'=> 'master_templates' + ), + 'value' => '' + ), + 'template_additional' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + ), + 'default_mailserver' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '1', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE mail_server = 1 AND {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'value' => '' + ), + 'limit_maildomain' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_maildomain_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_mailbox' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_mailbox_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_mailalias' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_mailalias_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_mailforward' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_mailforward_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_mailcatchall' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_mailcatchall_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_mailrouting' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_mailrouting_error_notint'), + ), + 'default' => '0', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_mailfilter' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_mailfilter_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_fetchmail' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_mailfetchmail_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_mailquota' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_mailquota_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_spamfilter_wblist' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_spamfilter_wblist_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_spamfilter_user' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_spamfilter_user_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_spamfilter_policy' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_spamfilter_policy_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'default_webserver' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '1', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE web_server = 1 AND {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'value' => '' + ), + 'limit_web_domain' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_web_domain_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_web_quota' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_web_quota_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'web_php_options' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOXARRAY', + 'default' => '', + 'separator' => ',', + 'value' => array('no' => 'Disabled', 'fast-cgi' => 'Fast-CGI', 'cgi' => 'CGI', 'mod' => 'Mod-PHP', 'suphp' => 'SuPHP') + ), + 'limit_web_aliasdomain' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_web_aliasdomain_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_web_subdomain' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_web_subdomain_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_ftp_user' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_ftp_user_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_shell_user' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_shell_user_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'ssh_chroot' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOXARRAY', + 'default' => '', + 'separator' => ',', + 'value' => array('no' => 'None', 'jailkit' => 'Jailkit') + ), + 'default_dnsserver' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '1', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE dns_server = 1 AND {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'value' => '' + ), + 'limit_dns_zone' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_dns_zone_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_dns_record' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_dns_record_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_client' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_client_error_notint'), + 1 => array ( 'type' => 'CUSTOM', + 'class' => 'validate_reseller', + 'function' => 'limit_client'), + ), + 'default' => '1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'default_dbserver' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '1', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE db_server = 1 AND {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'value' => '' + ), + 'limit_database' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_database_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_cron' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_cron_error_notint'), + ), + 'default' => '0', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_cron_type' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => '', + 'value' => array('full' => 'Full Cron','chrooted' => 'Chrooted Cron','url' => 'URL Cron') + ), + 'limit_cron_frequency' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_cron_error_frequency'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_traffic_quota' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_traffic_quota_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + ################################## + # END Datatable fields + ################################## + ) +); + +/* +$form["tabs"]['ipaddress'] = array ( + 'title' => "IP Addresses", + 'width' => 100, + 'template' => "templates/client_edit_ipaddress.htm", + 'fields' => array ( + ################################## + # Beginn Datatable fields + ################################## + 'ip_address' => array ( + 'datatype' => 'TEXT', + 'formtype' => 'CHECKBOXARRAY', + 'default' => '', + 'value' => array('192.168.0.1' => '192.168.0.1', '192.168.0.2' => '192.168.0.2'), + 'separator' => ';' + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); +*/ + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/client/lib/admin.conf.php b/interface/ispconfig/interface/client/lib/admin.conf.php new file mode 100644 index 0000000000000000000000000000000000000000..a45d4403455c5c46f438046f088398e241cbc3d9 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/admin.conf.php @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/client/lib/lang/bg.lng b/interface/ispconfig/interface/client/lib/lang/bg.lng new file mode 100644 index 0000000000000000000000000000000000000000..f835dfd5fc70cd787cbf9ef32ef0d5dd7bd82d56 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/bg.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/bg_client.lng b/interface/ispconfig/interface/client/lib/lang/bg_client.lng new file mode 100644 index 0000000000000000000000000000000000000000..35b3519da0ebda64cb06e60419303d9a986635f2 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/bg_client.lng @@ -0,0 +1,94 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/bg_client_del.lng b/interface/ispconfig/interface/client/lib/lang/bg_client_del.lng new file mode 100644 index 0000000000000000000000000000000000000000..a826d64e146cd9085debb382f71c3357966bb1f6 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/bg_client_del.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/bg_client_template.lng b/interface/ispconfig/interface/client/lib/lang/bg_client_template.lng new file mode 100644 index 0000000000000000000000000000000000000000..2f6e9ba3031c85fe389da5958785f8408ba7cf51 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/bg_client_template.lng @@ -0,0 +1,57 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/bg_client_template_list.lng b/interface/ispconfig/interface/client/lib/lang/bg_client_template_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..b93a5f97bc98d1fa5883a22aa7909e442afa4410 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/bg_client_template_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/bg_clients_list.lng b/interface/ispconfig/interface/client/lib/lang/bg_clients_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..f412b780273e1defe95f345385cf68acc2d068e8 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/bg_clients_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/bg_reseller.lng b/interface/ispconfig/interface/client/lib/lang/bg_reseller.lng new file mode 100644 index 0000000000000000000000000000000000000000..f0dc7ca054e45e156343f46ef22c695cda68e467 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/bg_reseller.lng @@ -0,0 +1,93 @@ + 0'; +$wb['limit_web_quota_txt'] = 'Web Quota'; +$wb['limit_traffic_quota_txt'] = 'Traffic Quota'; +$wb['limit_trafficquota_error_notint'] = 'Traffic Quota must be a number.'; +?> diff --git a/interface/ispconfig/interface/client/lib/lang/bg_resellers_list.lng b/interface/ispconfig/interface/client/lib/lang/bg_resellers_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..34d0896699bf185e54fad7f98965c70f14804aa6 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/bg_resellers_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/br.lng b/interface/ispconfig/interface/client/lib/lang/br.lng new file mode 100644 index 0000000000000000000000000000000000000000..3dcb5e34344c20e0099317bd21f343dc0fbddd0c --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/br.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/br_client.lng b/interface/ispconfig/interface/client/lib/lang/br_client.lng new file mode 100644 index 0000000000000000000000000000000000000000..6e2b67cfa3bbf86502efc4969a50f282c28798f1 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/br_client.lng @@ -0,0 +1,94 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/br_client_del.lng b/interface/ispconfig/interface/client/lib/lang/br_client_del.lng new file mode 100644 index 0000000000000000000000000000000000000000..57788b035608359ddc35635998dd4c5f89da5a79 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/br_client_del.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/br_client_template.lng b/interface/ispconfig/interface/client/lib/lang/br_client_template.lng new file mode 100644 index 0000000000000000000000000000000000000000..b3b15e25060dfde5e7ef4d1068fc27edd1537207 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/br_client_template.lng @@ -0,0 +1,57 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/br_client_template_list.lng b/interface/ispconfig/interface/client/lib/lang/br_client_template_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..231f7fdea0ec51ca5cad4a6b7d6593c4f5901b1e --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/br_client_template_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/br_clients_list.lng b/interface/ispconfig/interface/client/lib/lang/br_clients_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..a6d54ecc839984140dd9d311b98b979b77203f5d --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/br_clients_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/br_reseller.lng b/interface/ispconfig/interface/client/lib/lang/br_reseller.lng new file mode 100644 index 0000000000000000000000000000000000000000..a9724bf4849917e45f5eebe1dd6602d6e6d77ae9 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/br_reseller.lng @@ -0,0 +1,93 @@ + 0'; +$wb['limit_web_quota_txt'] = 'Cota Web'; +$wb['limit_traffic_quota_txt'] = 'Cota de Tráfego'; +$wb['limit_trafficquota_error_notint'] = 'Traffic Quota must be a number.'; +?> diff --git a/interface/ispconfig/interface/client/lib/lang/br_resellers_list.lng b/interface/ispconfig/interface/client/lib/lang/br_resellers_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..053d7229d402192e66aa2120728e68f6f7fdf340 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/br_resellers_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/de.lng b/interface/ispconfig/interface/client/lib/lang/de.lng new file mode 100644 index 0000000000000000000000000000000000000000..2ab45de2f37e4f5c85cc3654edb48d17de5e750c --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/de.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/de_client.lng b/interface/ispconfig/interface/client/lib/lang/de_client.lng new file mode 100644 index 0000000000000000000000000000000000000000..6237798fb449de6005d1e356a0db93fec5e19b06 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/de_client.lng @@ -0,0 +1,94 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/de_client_del.lng b/interface/ispconfig/interface/client/lib/lang/de_client_del.lng new file mode 100644 index 0000000000000000000000000000000000000000..4fb2aacdbff02ce5c19c524b4e5dd645f2c06a57 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/de_client_del.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/de_client_template.lng b/interface/ispconfig/interface/client/lib/lang/de_client_template.lng new file mode 100644 index 0000000000000000000000000000000000000000..1fcce0050acdd355abf060712445e487dfd036b0 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/de_client_template.lng @@ -0,0 +1,57 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/de_client_template_list.lng b/interface/ispconfig/interface/client/lib/lang/de_client_template_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..98195fed1b50e85617a85be98336f6d440f1fa65 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/de_client_template_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/de_clients_list.lng b/interface/ispconfig/interface/client/lib/lang/de_clients_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..515d7dbe0faf8c7b02cdffae2661ae2295ecaf1e --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/de_clients_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/de_reseller.lng b/interface/ispconfig/interface/client/lib/lang/de_reseller.lng new file mode 100644 index 0000000000000000000000000000000000000000..f3a3ec87b87376519c9fe9cdab7a77a26c1ef1cf --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/de_reseller.lng @@ -0,0 +1,93 @@ + 0 sein'; +$wb['limit_web_quota_txt'] = 'Web Quota'; +$wb['limit_traffic_quota_txt'] = 'Traffic Quota'; +$wb['limit_trafficquota_error_notint'] = 'Traffic Quota muss eine Zahl sein.'; +?> diff --git a/interface/ispconfig/interface/client/lib/lang/de_resellers_list.lng b/interface/ispconfig/interface/client/lib/lang/de_resellers_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..f6f736cf3ab3aea6dc6c283abe89f7aaa51830be --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/de_resellers_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/en.lng b/interface/ispconfig/interface/client/lib/lang/en.lng new file mode 100644 index 0000000000000000000000000000000000000000..2c598f3e2da4a9d1f842d0fb52c8e5f335b6d519 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/en.lng @@ -0,0 +1,14 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/client/lib/lang/en_client.lng b/interface/ispconfig/interface/client/lib/lang/en_client.lng new file mode 100644 index 0000000000000000000000000000000000000000..e87ba45e073c66489d2e0bdcb5adf9e307bf44f8 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/en_client.lng @@ -0,0 +1,97 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/en_client_del.lng b/interface/ispconfig/interface/client/lib/lang/en_client_del.lng new file mode 100644 index 0000000000000000000000000000000000000000..4d16af6afcad05244a1d2073b5db46ecf9420314 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/en_client_del.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/en_client_template.lng b/interface/ispconfig/interface/client/lib/lang/en_client_template.lng new file mode 100644 index 0000000000000000000000000000000000000000..39726634eec45ab87035b9ddf7a988a392bb18fd --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/en_client_template.lng @@ -0,0 +1,61 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/client/lib/lang/en_client_template_list.lng b/interface/ispconfig/interface/client/lib/lang/en_client_template_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..ac5218686174910f4725855b6c6959a3733513fa --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/en_client_template_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/en_clients_list.lng b/interface/ispconfig/interface/client/lib/lang/en_clients_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..86671aef4f9abe2544f57c17233a4b2286273b25 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/en_clients_list.lng @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/client/lib/lang/en_reseller.lng b/interface/ispconfig/interface/client/lib/lang/en_reseller.lng new file mode 100644 index 0000000000000000000000000000000000000000..2b06c33d30a6d778219b54f0a0ccb8f6c043bfe5 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/en_reseller.lng @@ -0,0 +1,96 @@ + 0'; +$wb["limit_web_quota_txt"] = 'Web Quota'; +$wb["limit_traffic_quota_txt"] = 'Traffic Quota'; +$wb["limit_trafficquota_error_notint"] = 'Traffic Quota must be a number.'; +?> diff --git a/interface/ispconfig/interface/client/lib/lang/en_resellers_list.lng b/interface/ispconfig/interface/client/lib/lang/en_resellers_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..523a467c58c5578c65492edc1a313fc0aa612369 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/en_resellers_list.lng @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/client/lib/lang/es.lng b/interface/ispconfig/interface/client/lib/lang/es.lng new file mode 100644 index 0000000000000000000000000000000000000000..f1b1d758e3364c08e8961df721ed24e9d70e79fb --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/es.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/es_client.lng b/interface/ispconfig/interface/client/lib/lang/es_client.lng new file mode 100644 index 0000000000000000000000000000000000000000..e42a548181d98833f0015dc80e65e700183134cd --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/es_client.lng @@ -0,0 +1,94 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/es_client_del.lng b/interface/ispconfig/interface/client/lib/lang/es_client_del.lng new file mode 100644 index 0000000000000000000000000000000000000000..a826d64e146cd9085debb382f71c3357966bb1f6 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/es_client_del.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/es_client_template.lng b/interface/ispconfig/interface/client/lib/lang/es_client_template.lng new file mode 100644 index 0000000000000000000000000000000000000000..3e51956c89e458442c3dd7e0930586002a625571 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/es_client_template.lng @@ -0,0 +1,57 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/es_client_template_list.lng b/interface/ispconfig/interface/client/lib/lang/es_client_template_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..9bbe98d0f135069c762184845cec216a4af2b9b2 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/es_client_template_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/es_clients_list.lng b/interface/ispconfig/interface/client/lib/lang/es_clients_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..1b3999311ed38b3e25cd15ce6ee1f0391f04fb2c --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/es_clients_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/es_reseller.lng b/interface/ispconfig/interface/client/lib/lang/es_reseller.lng new file mode 100644 index 0000000000000000000000000000000000000000..f0dc7ca054e45e156343f46ef22c695cda68e467 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/es_reseller.lng @@ -0,0 +1,93 @@ + 0'; +$wb['limit_web_quota_txt'] = 'Web Quota'; +$wb['limit_traffic_quota_txt'] = 'Traffic Quota'; +$wb['limit_trafficquota_error_notint'] = 'Traffic Quota must be a number.'; +?> diff --git a/interface/ispconfig/interface/client/lib/lang/es_resellers_list.lng b/interface/ispconfig/interface/client/lib/lang/es_resellers_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..797d9d07a2e533c5a1111554529ef83a1180c15b --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/es_resellers_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/fi.lng b/interface/ispconfig/interface/client/lib/lang/fi.lng new file mode 100644 index 0000000000000000000000000000000000000000..9b7a982f9ac571068149bf97fa2d2e67c05ba965 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/fi.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/fi_client.lng b/interface/ispconfig/interface/client/lib/lang/fi_client.lng new file mode 100644 index 0000000000000000000000000000000000000000..87842b1c3ba874b4ffcee09dfd8c8a34816af8c5 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/fi_client.lng @@ -0,0 +1,94 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/fi_client_del.lng b/interface/ispconfig/interface/client/lib/lang/fi_client_del.lng new file mode 100644 index 0000000000000000000000000000000000000000..a826d64e146cd9085debb382f71c3357966bb1f6 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/fi_client_del.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/fi_client_template.lng b/interface/ispconfig/interface/client/lib/lang/fi_client_template.lng new file mode 100644 index 0000000000000000000000000000000000000000..e3b55ddaffd7af2b700ff32d8933538893101ab4 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/fi_client_template.lng @@ -0,0 +1,57 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/fi_client_template_list.lng b/interface/ispconfig/interface/client/lib/lang/fi_client_template_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..094c3c70c93600556fa834ac9744ca59cd82e7ed --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/fi_client_template_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/fi_clients_list.lng b/interface/ispconfig/interface/client/lib/lang/fi_clients_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..8b20cc4cca56052442ad62b665a86b77271ebdfe --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/fi_clients_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/fi_reseller.lng b/interface/ispconfig/interface/client/lib/lang/fi_reseller.lng new file mode 100644 index 0000000000000000000000000000000000000000..f0dc7ca054e45e156343f46ef22c695cda68e467 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/fi_reseller.lng @@ -0,0 +1,93 @@ + 0'; +$wb['limit_web_quota_txt'] = 'Web Quota'; +$wb['limit_traffic_quota_txt'] = 'Traffic Quota'; +$wb['limit_trafficquota_error_notint'] = 'Traffic Quota must be a number.'; +?> diff --git a/interface/ispconfig/interface/client/lib/lang/fi_resellers_list.lng b/interface/ispconfig/interface/client/lib/lang/fi_resellers_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..34d0896699bf185e54fad7f98965c70f14804aa6 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/fi_resellers_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/fr.lng b/interface/ispconfig/interface/client/lib/lang/fr.lng new file mode 100644 index 0000000000000000000000000000000000000000..b8f4d8f50d804e934464090c2912f5e53818c136 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/fr.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/fr_client.lng b/interface/ispconfig/interface/client/lib/lang/fr_client.lng new file mode 100644 index 0000000000000000000000000000000000000000..7afb6e0cfb90d7c8c55b0ff5413134d0aafbb5f2 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/fr_client.lng @@ -0,0 +1,94 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/fr_client_del.lng b/interface/ispconfig/interface/client/lib/lang/fr_client_del.lng new file mode 100644 index 0000000000000000000000000000000000000000..a826d64e146cd9085debb382f71c3357966bb1f6 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/fr_client_del.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/fr_client_template.lng b/interface/ispconfig/interface/client/lib/lang/fr_client_template.lng new file mode 100644 index 0000000000000000000000000000000000000000..d984acc1475894fde94db17a60f645aa750867e2 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/fr_client_template.lng @@ -0,0 +1,57 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/fr_client_template_list.lng b/interface/ispconfig/interface/client/lib/lang/fr_client_template_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..3405427d2090c175490ce98d5259c59793ee7fb3 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/fr_client_template_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/fr_clients_list.lng b/interface/ispconfig/interface/client/lib/lang/fr_clients_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..e5a0c1727f5c1940020dfd0984f7e8392c009e83 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/fr_clients_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/fr_reseller.lng b/interface/ispconfig/interface/client/lib/lang/fr_reseller.lng new file mode 100644 index 0000000000000000000000000000000000000000..24926d45481076f0955df1d4175e8ed419886567 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/fr_reseller.lng @@ -0,0 +1,93 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/fr_resellers_list.lng b/interface/ispconfig/interface/client/lib/lang/fr_resellers_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..e5a0c1727f5c1940020dfd0984f7e8392c009e83 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/fr_resellers_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/hu.lng b/interface/ispconfig/interface/client/lib/lang/hu.lng new file mode 100644 index 0000000000000000000000000000000000000000..74a7c722d3ddd676b45c109c485a75841cc49fe0 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/hu.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/hu_client.lng b/interface/ispconfig/interface/client/lib/lang/hu_client.lng new file mode 100644 index 0000000000000000000000000000000000000000..35be91f2c9395b21fd1bc6288552d71157708d70 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/hu_client.lng @@ -0,0 +1,94 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/hu_client_del.lng b/interface/ispconfig/interface/client/lib/lang/hu_client_del.lng new file mode 100644 index 0000000000000000000000000000000000000000..a826d64e146cd9085debb382f71c3357966bb1f6 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/hu_client_del.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/hu_client_template.lng b/interface/ispconfig/interface/client/lib/lang/hu_client_template.lng new file mode 100644 index 0000000000000000000000000000000000000000..45930a08404fb70181afed0546e32903403a8083 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/hu_client_template.lng @@ -0,0 +1,57 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/hu_client_template_list.lng b/interface/ispconfig/interface/client/lib/lang/hu_client_template_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..b93a5f97bc98d1fa5883a22aa7909e442afa4410 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/hu_client_template_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/hu_clients_list.lng b/interface/ispconfig/interface/client/lib/lang/hu_clients_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..09105a01aeeae58ebc4f27c1638d58c570a25a90 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/hu_clients_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/hu_reseller.lng b/interface/ispconfig/interface/client/lib/lang/hu_reseller.lng new file mode 100644 index 0000000000000000000000000000000000000000..f0dc7ca054e45e156343f46ef22c695cda68e467 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/hu_reseller.lng @@ -0,0 +1,93 @@ + 0'; +$wb['limit_web_quota_txt'] = 'Web Quota'; +$wb['limit_traffic_quota_txt'] = 'Traffic Quota'; +$wb['limit_trafficquota_error_notint'] = 'Traffic Quota must be a number.'; +?> diff --git a/interface/ispconfig/interface/client/lib/lang/hu_resellers_list.lng b/interface/ispconfig/interface/client/lib/lang/hu_resellers_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..34d0896699bf185e54fad7f98965c70f14804aa6 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/hu_resellers_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/it.lng b/interface/ispconfig/interface/client/lib/lang/it.lng new file mode 100644 index 0000000000000000000000000000000000000000..17552563eb548238683022b30cb47423c0e2801a --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/it.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/it_client.lng b/interface/ispconfig/interface/client/lib/lang/it_client.lng new file mode 100644 index 0000000000000000000000000000000000000000..7dbc06cd927ff511ed2978db94ee8a4e01d59bfb --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/it_client.lng @@ -0,0 +1,94 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/it_client_del.lng b/interface/ispconfig/interface/client/lib/lang/it_client_del.lng new file mode 100644 index 0000000000000000000000000000000000000000..a826d64e146cd9085debb382f71c3357966bb1f6 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/it_client_del.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/it_client_template.lng b/interface/ispconfig/interface/client/lib/lang/it_client_template.lng new file mode 100644 index 0000000000000000000000000000000000000000..abc74f493e51fc5c3c7f92cff94469f71a7a7f41 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/it_client_template.lng @@ -0,0 +1,57 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/it_client_template_list.lng b/interface/ispconfig/interface/client/lib/lang/it_client_template_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..03aa10e5c912eb9da59a1cd1c65c937e7363f72c --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/it_client_template_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/it_clients_list.lng b/interface/ispconfig/interface/client/lib/lang/it_clients_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..d3bd8cdb720d14ffee1dea91947723dd36deea2e --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/it_clients_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/it_reseller.lng b/interface/ispconfig/interface/client/lib/lang/it_reseller.lng new file mode 100644 index 0000000000000000000000000000000000000000..f0dc7ca054e45e156343f46ef22c695cda68e467 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/it_reseller.lng @@ -0,0 +1,93 @@ + 0'; +$wb['limit_web_quota_txt'] = 'Web Quota'; +$wb['limit_traffic_quota_txt'] = 'Traffic Quota'; +$wb['limit_trafficquota_error_notint'] = 'Traffic Quota must be a number.'; +?> diff --git a/interface/ispconfig/interface/client/lib/lang/it_resellers_list.lng b/interface/ispconfig/interface/client/lib/lang/it_resellers_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..34d0896699bf185e54fad7f98965c70f14804aa6 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/it_resellers_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/ja.lng b/interface/ispconfig/interface/client/lib/lang/ja.lng new file mode 100644 index 0000000000000000000000000000000000000000..a6edbc1687527bd8fb51eaec42464657db638ab2 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/ja.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/ja_client.lng b/interface/ispconfig/interface/client/lib/lang/ja_client.lng new file mode 100644 index 0000000000000000000000000000000000000000..2289f94ac1e2740b11f8faefc1e9d74d30d178fd --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/ja_client.lng @@ -0,0 +1,94 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/ja_client_del.lng b/interface/ispconfig/interface/client/lib/lang/ja_client_del.lng new file mode 100644 index 0000000000000000000000000000000000000000..a826d64e146cd9085debb382f71c3357966bb1f6 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/ja_client_del.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/ja_client_template.lng b/interface/ispconfig/interface/client/lib/lang/ja_client_template.lng new file mode 100644 index 0000000000000000000000000000000000000000..0291b2e4aa2282541b57ac867e9d81c618a2d27f --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/ja_client_template.lng @@ -0,0 +1,57 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/ja_client_template_list.lng b/interface/ispconfig/interface/client/lib/lang/ja_client_template_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..05d3358c4e4ec45c8dd7127ede4c1c2d95ee0385 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/ja_client_template_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/ja_clients_list.lng b/interface/ispconfig/interface/client/lib/lang/ja_clients_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..f5b39e15046676af1473b1f86fb097d552ed293a --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/ja_clients_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/ja_reseller.lng b/interface/ispconfig/interface/client/lib/lang/ja_reseller.lng new file mode 100644 index 0000000000000000000000000000000000000000..fbb4380f895549fe6d8f845ef01695422e0c14ba --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/ja_reseller.lng @@ -0,0 +1,93 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/ja_resellers_list.lng b/interface/ispconfig/interface/client/lib/lang/ja_resellers_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..2f6e6ec9453a24282774ac7a0f2931c36b555274 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/ja_resellers_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/nl.lng b/interface/ispconfig/interface/client/lib/lang/nl.lng new file mode 100644 index 0000000000000000000000000000000000000000..0071fa28f75b5e2c324dc261c56c9cf19fb2b8dc --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/nl.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/nl_client.lng b/interface/ispconfig/interface/client/lib/lang/nl_client.lng new file mode 100644 index 0000000000000000000000000000000000000000..a50da4538139486ec979c4824fa53859434979df --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/nl_client.lng @@ -0,0 +1,94 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/nl_client_del.lng b/interface/ispconfig/interface/client/lib/lang/nl_client_del.lng new file mode 100644 index 0000000000000000000000000000000000000000..a896cbd3cde99f261d9f9b970d69553e011b11ca --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/nl_client_del.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/nl_client_template.lng b/interface/ispconfig/interface/client/lib/lang/nl_client_template.lng new file mode 100644 index 0000000000000000000000000000000000000000..2abcc0cf61f6e5c12291c4f8ddac56d7e52559e4 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/nl_client_template.lng @@ -0,0 +1,57 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/nl_client_template_list.lng b/interface/ispconfig/interface/client/lib/lang/nl_client_template_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..333aeb5bb5fec5a685d5c2b69d9378faa786bffc --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/nl_client_template_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/nl_clients_list.lng b/interface/ispconfig/interface/client/lib/lang/nl_clients_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..0309a475ddbe2ea06b09c4f754e5ee9db606ac0a --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/nl_clients_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/nl_reseller.lng b/interface/ispconfig/interface/client/lib/lang/nl_reseller.lng new file mode 100644 index 0000000000000000000000000000000000000000..4fa2bdcf6b13ae43aa57baa84f43021853325a0e --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/nl_reseller.lng @@ -0,0 +1,93 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/nl_resellers_list.lng b/interface/ispconfig/interface/client/lib/lang/nl_resellers_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..dd5fd53db06a1b7de19e75fa2d9de10c0f8d4065 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/nl_resellers_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/pl.lng b/interface/ispconfig/interface/client/lib/lang/pl.lng new file mode 100644 index 0000000000000000000000000000000000000000..771c3b2c20863a8a1ccc6c26015e59f929789b6a --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/pl.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/pl_client.lng b/interface/ispconfig/interface/client/lib/lang/pl_client.lng new file mode 100644 index 0000000000000000000000000000000000000000..42f73b83b79858962f592581a6ec33b4fe57e885 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/pl_client.lng @@ -0,0 +1,94 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/pl_client_del.lng b/interface/ispconfig/interface/client/lib/lang/pl_client_del.lng new file mode 100644 index 0000000000000000000000000000000000000000..a826d64e146cd9085debb382f71c3357966bb1f6 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/pl_client_del.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/pl_client_template.lng b/interface/ispconfig/interface/client/lib/lang/pl_client_template.lng new file mode 100644 index 0000000000000000000000000000000000000000..5c7c0f8579b905b9ed5325e5e38d2221e0aab498 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/pl_client_template.lng @@ -0,0 +1,57 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/pl_client_template_list.lng b/interface/ispconfig/interface/client/lib/lang/pl_client_template_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..06a39761f9af7d4a0191b4ed73b0b3a22b0d5541 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/pl_client_template_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/pl_clients_list.lng b/interface/ispconfig/interface/client/lib/lang/pl_clients_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..81f0bd8552b0cee801c453d67b0ead9ff15d49e1 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/pl_clients_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/pl_reseller.lng b/interface/ispconfig/interface/client/lib/lang/pl_reseller.lng new file mode 100644 index 0000000000000000000000000000000000000000..f08ca1c9efcf5c6f19348d4e1350a9a05daea133 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/pl_reseller.lng @@ -0,0 +1,93 @@ + 0'; +$wb['limit_web_quota_txt'] = 'Web Quota'; +$wb['limit_traffic_quota_txt'] = 'Traffic Quota'; +$wb['limit_trafficquota_error_notint'] = 'Traffic Quota must be a number.'; +?> diff --git a/interface/ispconfig/interface/client/lib/lang/pl_resellers_list.lng b/interface/ispconfig/interface/client/lib/lang/pl_resellers_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..51abc411a5f00ee3d8ad1ebe98679235e1dfcd32 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/pl_resellers_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/pt.lng b/interface/ispconfig/interface/client/lib/lang/pt.lng new file mode 100644 index 0000000000000000000000000000000000000000..e8313728ebc238720b9e1a4b77d70a7dbc5017af --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/pt.lng @@ -0,0 +1,14 @@ + + diff --git a/interface/ispconfig/interface/client/lib/lang/pt_client.lng b/interface/ispconfig/interface/client/lib/lang/pt_client.lng new file mode 100644 index 0000000000000000000000000000000000000000..0f7d32ab49a1a867213bfaa3ded35d904960d6be --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/pt_client.lng @@ -0,0 +1,95 @@ + + diff --git a/interface/ispconfig/interface/client/lib/lang/pt_client_del.lng b/interface/ispconfig/interface/client/lib/lang/pt_client_del.lng new file mode 100644 index 0000000000000000000000000000000000000000..769975296615569129f0992dd565221e755a0034 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/pt_client_del.lng @@ -0,0 +1,7 @@ + + diff --git a/interface/ispconfig/interface/client/lib/lang/pt_client_template.lng b/interface/ispconfig/interface/client/lib/lang/pt_client_template.lng new file mode 100644 index 0000000000000000000000000000000000000000..153cc5bd0d059dd3db42446ecd6754054811c292 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/pt_client_template.lng @@ -0,0 +1,58 @@ + + diff --git a/interface/ispconfig/interface/client/lib/lang/pt_client_template_list.lng b/interface/ispconfig/interface/client/lib/lang/pt_client_template_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..0587b04f328e7ee189685ea9a32f0075f872549a --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/pt_client_template_list.lng @@ -0,0 +1,6 @@ + + diff --git a/interface/ispconfig/interface/client/lib/lang/pt_clients_list.lng b/interface/ispconfig/interface/client/lib/lang/pt_clients_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..53ceab0536a2a1cf8ff538d9e65d02f013737e40 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/pt_clients_list.lng @@ -0,0 +1,10 @@ + + diff --git a/interface/ispconfig/interface/client/lib/lang/pt_reseller.lng b/interface/ispconfig/interface/client/lib/lang/pt_reseller.lng new file mode 100644 index 0000000000000000000000000000000000000000..9aa64e0a7e51ee7893ddbe40979a8d200f1170ed --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/pt_reseller.lng @@ -0,0 +1,94 @@ + 0'; +$wb['limit_web_quota_txt'] = 'Cota Web'; +$wb['limit_traffic_quota_txt'] = 'Cota de Tráfego'; +$wb['limit_trafficquota_error_notint'] = 'Traffic Quota must be a number.'; +?> + diff --git a/interface/ispconfig/interface/client/lib/lang/pt_resellers_list.lng b/interface/ispconfig/interface/client/lib/lang/pt_resellers_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..8df917d4f242ab3d475339009e9fdaacab4ab7d5 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/pt_resellers_list.lng @@ -0,0 +1,10 @@ + + diff --git a/interface/ispconfig/interface/client/lib/lang/ro.lng b/interface/ispconfig/interface/client/lib/lang/ro.lng new file mode 100644 index 0000000000000000000000000000000000000000..38bbbb50198d0b378cacc071c5820946c71a06f8 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/ro.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/ro_client.lng b/interface/ispconfig/interface/client/lib/lang/ro_client.lng new file mode 100644 index 0000000000000000000000000000000000000000..6dbfadb43fd827847ab2fa2cec7355249d59df21 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/ro_client.lng @@ -0,0 +1,94 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/ro_client_del.lng b/interface/ispconfig/interface/client/lib/lang/ro_client_del.lng new file mode 100644 index 0000000000000000000000000000000000000000..4d16af6afcad05244a1d2073b5db46ecf9420314 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/ro_client_del.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/ro_client_template.lng b/interface/ispconfig/interface/client/lib/lang/ro_client_template.lng new file mode 100644 index 0000000000000000000000000000000000000000..276e0817c76a6149f44fe655f422c99bf5ae7ded --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/ro_client_template.lng @@ -0,0 +1,57 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/ro_client_template_list.lng b/interface/ispconfig/interface/client/lib/lang/ro_client_template_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..b19f5d43cd3a16d9366b5be4a9c066738cfc9cd3 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/ro_client_template_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/ro_clients_list.lng b/interface/ispconfig/interface/client/lib/lang/ro_clients_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..33bde68e1e995334a0e442cefaa9e375b00cd748 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/ro_clients_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/ro_reseller.lng b/interface/ispconfig/interface/client/lib/lang/ro_reseller.lng new file mode 100644 index 0000000000000000000000000000000000000000..2b06c33d30a6d778219b54f0a0ccb8f6c043bfe5 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/ro_reseller.lng @@ -0,0 +1,96 @@ + 0'; +$wb["limit_web_quota_txt"] = 'Web Quota'; +$wb["limit_traffic_quota_txt"] = 'Traffic Quota'; +$wb["limit_trafficquota_error_notint"] = 'Traffic Quota must be a number.'; +?> diff --git a/interface/ispconfig/interface/client/lib/lang/ro_resellers_list.lng b/interface/ispconfig/interface/client/lib/lang/ro_resellers_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..523a467c58c5578c65492edc1a313fc0aa612369 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/ro_resellers_list.lng @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/client/lib/lang/ru.lng b/interface/ispconfig/interface/client/lib/lang/ru.lng new file mode 100644 index 0000000000000000000000000000000000000000..a2679b2a6d7ca3db7dbd4e14339e65eeacccdced --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/ru.lng @@ -0,0 +1,14 @@ + + diff --git a/interface/ispconfig/interface/client/lib/lang/ru_client.lng b/interface/ispconfig/interface/client/lib/lang/ru_client.lng new file mode 100644 index 0000000000000000000000000000000000000000..e1a38d4e7b0ac49585bf82bd14a06e0d215897b7 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/ru_client.lng @@ -0,0 +1,95 @@ + + diff --git a/interface/ispconfig/interface/client/lib/lang/ru_client_del.lng b/interface/ispconfig/interface/client/lib/lang/ru_client_del.lng new file mode 100644 index 0000000000000000000000000000000000000000..d792617208994e0f2da7a541bb6762227bfa88f7 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/ru_client_del.lng @@ -0,0 +1,7 @@ + + diff --git a/interface/ispconfig/interface/client/lib/lang/ru_client_template.lng b/interface/ispconfig/interface/client/lib/lang/ru_client_template.lng new file mode 100644 index 0000000000000000000000000000000000000000..d630f345799a44986361e2673ee30f485a5bff56 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/ru_client_template.lng @@ -0,0 +1,58 @@ + + diff --git a/interface/ispconfig/interface/client/lib/lang/ru_client_template_list.lng b/interface/ispconfig/interface/client/lib/lang/ru_client_template_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..9aab2f589e2815402f056ece125f895a623b8264 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/ru_client_template_list.lng @@ -0,0 +1,6 @@ + + diff --git a/interface/ispconfig/interface/client/lib/lang/ru_clients_list.lng b/interface/ispconfig/interface/client/lib/lang/ru_clients_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..3621300ae19684eeb91148ed0dc0a6cb976b8d88 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/ru_clients_list.lng @@ -0,0 +1,10 @@ + + diff --git a/interface/ispconfig/interface/client/lib/lang/ru_reseller.lng b/interface/ispconfig/interface/client/lib/lang/ru_reseller.lng new file mode 100644 index 0000000000000000000000000000000000000000..0976344814a58af3fb92e94539fe1fd8bb071be2 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/ru_reseller.lng @@ -0,0 +1,94 @@ + 0'; +$wb['limit_web_quota_txt'] = 'Квота Web'; +$wb['limit_traffic_quota_txt'] = 'Квота трафика'; +$wb['limit_trafficquota_error_notint'] = 'Квота трафика должна быть числом.'; +?> + diff --git a/interface/ispconfig/interface/client/lib/lang/ru_resellers_list.lng b/interface/ispconfig/interface/client/lib/lang/ru_resellers_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..3d8976721c254765015927211ee6d890cd05a144 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/ru_resellers_list.lng @@ -0,0 +1,10 @@ + + diff --git a/interface/ispconfig/interface/client/lib/lang/se.lng b/interface/ispconfig/interface/client/lib/lang/se.lng new file mode 100644 index 0000000000000000000000000000000000000000..38bbbb50198d0b378cacc071c5820946c71a06f8 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/se.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/se_client.lng b/interface/ispconfig/interface/client/lib/lang/se_client.lng new file mode 100644 index 0000000000000000000000000000000000000000..2bcea5cc468fa4cd3a7b398f6938d28afc17856b --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/se_client.lng @@ -0,0 +1,94 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/se_client_del.lng b/interface/ispconfig/interface/client/lib/lang/se_client_del.lng new file mode 100644 index 0000000000000000000000000000000000000000..a826d64e146cd9085debb382f71c3357966bb1f6 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/se_client_del.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/se_client_template.lng b/interface/ispconfig/interface/client/lib/lang/se_client_template.lng new file mode 100644 index 0000000000000000000000000000000000000000..2f6e9ba3031c85fe389da5958785f8408ba7cf51 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/se_client_template.lng @@ -0,0 +1,57 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/se_client_template_list.lng b/interface/ispconfig/interface/client/lib/lang/se_client_template_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..b93a5f97bc98d1fa5883a22aa7909e442afa4410 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/se_client_template_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/se_clients_list.lng b/interface/ispconfig/interface/client/lib/lang/se_clients_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..81f0bd8552b0cee801c453d67b0ead9ff15d49e1 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/se_clients_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/se_reseller.lng b/interface/ispconfig/interface/client/lib/lang/se_reseller.lng new file mode 100644 index 0000000000000000000000000000000000000000..f0dc7ca054e45e156343f46ef22c695cda68e467 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/se_reseller.lng @@ -0,0 +1,93 @@ + 0'; +$wb['limit_web_quota_txt'] = 'Web Quota'; +$wb['limit_traffic_quota_txt'] = 'Traffic Quota'; +$wb['limit_trafficquota_error_notint'] = 'Traffic Quota must be a number.'; +?> diff --git a/interface/ispconfig/interface/client/lib/lang/se_resellers_list.lng b/interface/ispconfig/interface/client/lib/lang/se_resellers_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..34d0896699bf185e54fad7f98965c70f14804aa6 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/se_resellers_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/sk.lng b/interface/ispconfig/interface/client/lib/lang/sk.lng new file mode 100644 index 0000000000000000000000000000000000000000..fea38589dce6f280a78fca64686e6cf61c12bf25 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/sk.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/sk_client.lng b/interface/ispconfig/interface/client/lib/lang/sk_client.lng new file mode 100644 index 0000000000000000000000000000000000000000..6daf5769afd4a48f98ea1cb87422d8888e7075d8 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/sk_client.lng @@ -0,0 +1,94 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/sk_client_del.lng b/interface/ispconfig/interface/client/lib/lang/sk_client_del.lng new file mode 100644 index 0000000000000000000000000000000000000000..a826d64e146cd9085debb382f71c3357966bb1f6 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/sk_client_del.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/sk_client_template.lng b/interface/ispconfig/interface/client/lib/lang/sk_client_template.lng new file mode 100644 index 0000000000000000000000000000000000000000..938c436465f45c2f6dc98cd8ed5468ee8c12278b --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/sk_client_template.lng @@ -0,0 +1,57 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/sk_client_template_list.lng b/interface/ispconfig/interface/client/lib/lang/sk_client_template_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..6160cc834b837476794a669200bf54eb900195a2 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/sk_client_template_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/sk_clients_list.lng b/interface/ispconfig/interface/client/lib/lang/sk_clients_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..780be1c6e99cfebd9f12e880b48cf5aedb777075 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/sk_clients_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/sk_reseller.lng b/interface/ispconfig/interface/client/lib/lang/sk_reseller.lng new file mode 100644 index 0000000000000000000000000000000000000000..5b17a8067f51e62ee65cd822fbc307bec1a96809 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/sk_reseller.lng @@ -0,0 +1,93 @@ + 0'; +$wb['limit_web_quota_txt'] = 'Web Quota'; +$wb['limit_traffic_quota_txt'] = 'Traffic Quota'; +$wb['limit_trafficquota_error_notint'] = 'Traffic Quota must be a number.'; +?> diff --git a/interface/ispconfig/interface/client/lib/lang/sk_resellers_list.lng b/interface/ispconfig/interface/client/lib/lang/sk_resellers_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..2fbaecd19cfbed46de499a729dbfcaec8e91e3f2 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/sk_resellers_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/tr.lng b/interface/ispconfig/interface/client/lib/lang/tr.lng new file mode 100644 index 0000000000000000000000000000000000000000..f8f1e5072e015ea27f47f2bdbbb315da73162e8e --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/tr.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/tr_client.lng b/interface/ispconfig/interface/client/lib/lang/tr_client.lng new file mode 100644 index 0000000000000000000000000000000000000000..35e6cd57dfd059140270983c7a50175aa9806794 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/tr_client.lng @@ -0,0 +1,94 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/tr_client_del.lng b/interface/ispconfig/interface/client/lib/lang/tr_client_del.lng new file mode 100644 index 0000000000000000000000000000000000000000..a826d64e146cd9085debb382f71c3357966bb1f6 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/tr_client_del.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/tr_client_template.lng b/interface/ispconfig/interface/client/lib/lang/tr_client_template.lng new file mode 100644 index 0000000000000000000000000000000000000000..2d038e0bcfb0a3e4b8c961cdee780c6733a529d8 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/tr_client_template.lng @@ -0,0 +1,57 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/tr_client_template_list.lng b/interface/ispconfig/interface/client/lib/lang/tr_client_template_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..af5c1c74e590497ac55b8e97510053658929fc09 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/tr_client_template_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/tr_clients_list.lng b/interface/ispconfig/interface/client/lib/lang/tr_clients_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..9c0215a248e7d7bdffa43f13b339c6dcf91ecdb4 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/tr_clients_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/tr_reseller.lng b/interface/ispconfig/interface/client/lib/lang/tr_reseller.lng new file mode 100644 index 0000000000000000000000000000000000000000..63077c02c2ce0d2054700f7d33e0dee4d40dc9ab --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/tr_reseller.lng @@ -0,0 +1,93 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/tr_resellers_list.lng b/interface/ispconfig/interface/client/lib/lang/tr_resellers_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..ccb8fd154155cf9eaffc3752fd180cceea0b4594 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/tr_resellers_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/client/lib/module.conf.php b/interface/ispconfig/interface/client/lib/module.conf.php new file mode 100644 index 0000000000000000000000000000000000000000..543fc892d70766ef891722e066c5d5059a08f275 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/module.conf.php @@ -0,0 +1,63 @@ + "Add Client", + 'target' => 'content', + 'link' => 'client/client_edit.php'); + +$items[] = array( 'title' => "Edit Client", + 'target' => 'content', + 'link' => 'client/client_list.php'); + +if($_SESSION["s"]["user"]["typ"] == 'admin'){ + $items[] = array( 'title' => "Edit Client-Templates", + 'target' => 'content', + 'link' => 'client/client_template_list.php'); +} + +$module["nav"][] = array( 'title' => 'Clients', + 'open' => 1, + 'items' => $items); + +unset($items); + + +if($_SESSION["s"]["user"]["typ"] == 'admin'){ + +$items[] = array( 'title' => "Add Reseller", + 'target' => 'content', + 'link' => 'client/reseller_edit.php'); + +$items[] = array( 'title' => "Edit Reseller", + 'target' => 'content', + 'link' => 'client/reseller_list.php'); + +$module["nav"][] = array( 'title' => 'Resellers', + 'open' => 1, + 'items' => $items); +} + + + + + + + + + + + + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/client/list/client.list.php b/interface/ispconfig/interface/client/list/client.list.php new file mode 100644 index 0000000000000000000000000000000000000000..3ace4fb181d428dde996e860b01a166802d4dab9 --- /dev/null +++ b/interface/ispconfig/interface/client/list/client.list.php @@ -0,0 +1,87 @@ + "company_name", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "contact_name", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "city", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "country", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/client/list/client_template.list.php b/interface/ispconfig/interface/client/list/client_template.list.php new file mode 100644 index 0000000000000000000000000000000000000000..679759e414ed560d90570d1c75735cc461503b57 --- /dev/null +++ b/interface/ispconfig/interface/client/list/client_template.list.php @@ -0,0 +1,65 @@ + "template_type", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array('m' => "Main Template",'a' => "Additional Template")); + +$liste["item"][] = array( 'field' => "template_name", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); +?> diff --git a/interface/ispconfig/interface/client/list/reseller.list.php b/interface/ispconfig/interface/client/list/reseller.list.php new file mode 100644 index 0000000000000000000000000000000000000000..6d08cc8c807e079fe1b82c6d9cacb1cdb4a2071a --- /dev/null +++ b/interface/ispconfig/interface/client/list/reseller.list.php @@ -0,0 +1,87 @@ + "company_name", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "contact_name", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "city", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "country", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/client/reseller_del.php b/interface/ispconfig/interface/client/reseller_del.php new file mode 100644 index 0000000000000000000000000000000000000000..855652a73bbde0e93467a9e7085f72908f5603fc --- /dev/null +++ b/interface/ispconfig/interface/client/reseller_del.php @@ -0,0 +1,92 @@ +auth->check_module_permissions('client'); + +if($_SESSION["s"]["user"]["typ"] != 'admin') die('Access only for administrators.'); + +$app->uses('tpl,tform'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onBeforeDelete() { + global $app, $conf; + + $client_id = intval($this->dataRecord['client_id']); + + $tmp = $app->db->queryOneRecord("SELECT count(client_id) as number FROM client WHERE parent_client_id = ".$client_id); + if($tmp["number"] > 0) $app->error($app->lng('error_has_clients')); + + } + + function onAfterDelete() { + global $app, $conf; + + $client_id = intval($this->dataRecord['client_id']); + + if($client_id > 0) { + // TODO: Delete all records (sub-clients, mail, web, etc....) of this client. + + // remove the group of the client from the resellers group + $parent_client_id = intval($this->dataRecord['parent_client_id']); + $parent_user = $app->db->queryOneRecord("SELECT userid FROM sys_user WHERE client_id = $parent_client_id"); + $client_group = $app->db->queryOneRecord("SELECT groupid FROM sys_group WHERE client_id = $client_id"); + $app->auth->remove_group_from_user($parent_user['userid'],$client_group['groupid']); + + // delete the group of the client + $app->db->query("DELETE FROM sys_group WHERE client_id = $client_id"); + + // delete the sys user(s) of the client + $app->db->query("DELETE FROM sys_user WHERE client_id = $client_id"); + } + + } +} + +$page = new page_action; +$page->onDelete() + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/client/reseller_edit.php b/interface/ispconfig/interface/client/reseller_edit.php new file mode 100644 index 0000000000000000000000000000000000000000..949baae2959239a04eb8a788aabd55f27a0ddeb1 --- /dev/null +++ b/interface/ispconfig/interface/client/reseller_edit.php @@ -0,0 +1,222 @@ +auth->check_module_permissions('client'); + +if($_SESSION["s"]["user"]["typ"] != 'admin') die('Access only for administrators.'); + +// Loading classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + + function onShowNew() { + global $app, $conf; + + // we will check only users, not admins + if($_SESSION["s"]["user"]["typ"] == 'user') { + + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_client FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Check if the user may add another website. + if($client["limit_client"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(client_id) as number FROM client WHERE sys_groupid = $client_group_id"); + if($tmp["number"] >= $client["limit_client"]) { + $app->error($app->tform->wordbook["limit_client_txt"]); + } + } + } + + parent::onShowNew(); + } + + + function onSubmit() { + global $app, $conf; + + // we will check only users, not admins + if($_SESSION["s"]["user"]["typ"] == 'user' && $this->id == 0) { + + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_client FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Check if the user may add another website. + if($client["limit_client"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(client_id) as number FROM client WHERE sys_groupid = $client_group_id"); + if($tmp["number"] >= $client["limit_client"]) { + $app->error($app->tform->wordbook["limit_client_txt"]); + } + } + } + + parent::onSubmit(); + } + + + function onShowEnd() { + + global $app; + + $sql = "SELECT template_id,template_name FROM client_template WHERE template_type = 'a'"; + $tpls = $app->db->queryAllRecords($sql); + $option = ''; + $tpl = array(); + foreach($tpls as $item){ + $option .= ''; + $tpl[$item['template_id']] = $item['template_name']; + } + $app->tpl->setVar('tpl_add_select',$option); + + $sql = "SELECT template_additional FROM client WHERE client_id = " . $this->id; + $result = $app->db->queryOneRecord($sql); + $tplAdd = explode("/", $result['template_additional']); + $text = ''; + foreach($tplAdd as $item){ + if (trim($item) != ''){ + if ($text != '') $text .= '
'; + $text .= $tpl[$item]; + } + } + + $app->tpl->setVar('template_additional_list', $text); + + parent::onShowEnd(); + + } + + /* + This function is called automatically right after + the data was successful inserted in the database. + */ + function onAfterInsert() { + global $app; + // Create the group for the reseller + $groupid = $app->db->datalogInsert('sys_group', "(name,description,client_id) VALUES ('".mysql_real_escape_string($this->dataRecord["username"])."','',".$this->id.")", 'groupid'); + $groups = $groupid; + + $username = $app->db->quote($this->dataRecord["username"]); + $password = $app->db->quote($this->dataRecord["password"]); + $modules = ISPC_INTERFACE_MODULES_ENABLED.',client'; + $startmodule = 'client'; + $usertheme = $app->db->quote($this->dataRecord["usertheme"]); + $type = 'user'; + $active = 1; + $language = $app->db->quote($this->dataRecord["language"]); + + // Create the controlpaneluser for the reseller + $sql = "INSERT INTO sys_user (username,passwort,modules,startmodule,app_theme,typ,active,language,groups,default_group,client_id) + VALUES ('$username',md5('$password'),'$modules','$startmodule','$usertheme','$type','$active','$language',$groups,$groupid,".$this->id.")"; + $app->db->query($sql); + + //* set the number of clients to 1 + $app->db->query("UPDATE client SET limit_client = 1 WHERE client_id = ".$this->id); + + /* If there is a client-template, process it */ + applyClientTemplates($this->id); + + parent::onAfterInsert(); + } + + + /* + This function is called automatically right after + the data was successful updated in the database. + */ + function onAfterUpdate() { + global $app; + + // username changed + if(isset($this->dataRecord['username']) && $this->dataRecord['username'] != '' && $this->oldDataRecord['username'] != $this->dataRecord['username']) { + $username = $app->db->quote($this->dataRecord["username"]); + $client_id = $this->id; + $sql = "UPDATE sys_user SET username = '$username' WHERE client_id = $client_id"; + $app->db->query($sql); + + $tmp = $app->db->queryOneRecord("SELECT * FROM sys_group WHERE client_id = $client_id"); + $app->db->datalogUpdate("sys_group", "name = '$username'", 'groupid', $tmp['groupid']); + unset($tmp); + } + + // password changed + if(isset($this->dataRecord["password"]) && $this->dataRecord["password"] != '') { + $password = $app->db->quote($this->dataRecord["password"]); + $client_id = $this->id; + $sql = "UPDATE sys_user SET passwort = md5('$password') WHERE client_id = $client_id"; + $app->db->query($sql); + } + + // language changed + if(isset($this->dataRecord['language']) && $this->dataRecord['language'] != '' && $this->oldDataRecord['language'] != $this->dataRecord['language']) { + $language = $app->db->quote($this->dataRecord["language"]); + $client_id = $this->id; + $sql = "UPDATE sys_user SET language = '$language' WHERE client_id = $client_id"; + $app->db->query($sql); + } + + // reseller status changed + if(isset($this->dataRecord["limit_client"]) && $this->dataRecord["limit_client"] != $this->oldDataRecord["limit_client"]) { + $modules = ISPC_INTERFACE_MODULES_ENABLED.',client'; + $modules = $app->db->quote($modules); + $client_id = $this->id; + $sql = "UPDATE sys_user SET modules = '$modules' WHERE client_id = $client_id"; + $app->db->query($sql); + } + /* + * If there is a client-template, process it */ + applyClientTemplates($this->id); + + parent::onAfterUpdate(); + } +} + +$page = new page_action; +$page->onLoad(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/client/reseller_list.php b/interface/ispconfig/interface/client/reseller_list.php new file mode 100644 index 0000000000000000000000000000000000000000..49a8c85166754f9517508add7896379e3245967d --- /dev/null +++ b/interface/ispconfig/interface/client/reseller_list.php @@ -0,0 +1,55 @@ +auth->check_module_permissions('client'); + +if($_SESSION["s"]["user"]["typ"] != 'admin') die('Access only for administrators.'); + +$app->uses('listform_actions'); + +$app->listform_actions->SQLOrderBy = 'ORDER BY company_name, contact_name, client_id'; +$app->listform_actions->SQLExtWhere = "(limit_client > 0 or limit_client = -1)"; +$app->listform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/client/templates/client_del.htm b/interface/ispconfig/interface/client/templates/client_del.htm new file mode 100644 index 0000000000000000000000000000000000000000..1167b30e3eff515f4b533b55f6fa3657dc3e7097 --- /dev/null +++ b/interface/ispconfig/interface/client/templates/client_del.htm @@ -0,0 +1,25 @@ +

+

+ +
+ +
+ +
+ :

+ + , + +
+ + + + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/client/templates/client_edit_address.htm b/interface/ispconfig/interface/client/templates/client_edit_address.htm new file mode 100644 index 0000000000000000000000000000000000000000..6d2625028c6ab088819d3b96a3d4ad088aeebb26 --- /dev/null +++ b/interface/ispconfig/interface/client/templates/client_edit_address.htm @@ -0,0 +1,101 @@ +

+

+ +
+ +
+
Address +
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+

{tmpl_var name='password_strength_txt'}

+
+

 

+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/client/templates/client_edit_limits.htm b/interface/ispconfig/interface/client/templates/client_edit_limits.htm new file mode 100644 index 0000000000000000000000000000000000000000..200629eb35047c4f6bae5d7f1fa94369f82b256a --- /dev/null +++ b/interface/ispconfig/interface/client/templates/client_edit_limits.htm @@ -0,0 +1,190 @@ +

+

+ +
+ + +
+
{tmpl_var name="toolsarea_head_txt"} +
+ + +
+
+
+
+ +
+
Limits + +
+ + +
+
+ + +


{tmpl_var name='template_additional_list'}
+ +
+
+   +
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ +  MB +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ +  MB +
+
+

{tmpl_var name='web_php_options_txt'}

+
+ {tmpl_var name='web_php_options'} +
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+

{tmpl_var name='ssh_chroot_txt'}

+
+ {tmpl_var name='ssh_chroot'} +
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ +  MB +
+
+ + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/client/templates/client_template_edit_limits.htm b/interface/ispconfig/interface/client/templates/client_template_edit_limits.htm new file mode 100644 index 0000000000000000000000000000000000000000..390f1f5b02297bed68e8ac549cd6e5f5941cb0cc --- /dev/null +++ b/interface/ispconfig/interface/client/templates/client_template_edit_limits.htm @@ -0,0 +1,124 @@ +

+

+ +
+ +
+
Limits +
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ +  MB +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ +  MB +
+
+ + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/client/templates/client_template_edit_template.htm b/interface/ispconfig/interface/client/templates/client_template_edit_template.htm new file mode 100644 index 0000000000000000000000000000000000000000..6c9d905340c747b10454ae98010cc0f732e336eb --- /dev/null +++ b/interface/ispconfig/interface/client/templates/client_template_edit_template.htm @@ -0,0 +1,28 @@ +

+

+ +
+ +
+
Template +
+ + +
+
+ + +
+
+ + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/client/templates/client_template_list.htm b/interface/ispconfig/interface/client/templates/client_template_list.htm new file mode 100644 index 0000000000000000000000000000000000000000..5892a9614701c0e86ff3b7a7afd3e8b87faacc90 --- /dev/null +++ b/interface/ispconfig/interface/client/templates/client_template_list.htm @@ -0,0 +1,53 @@ +

+

+ +
+ +
+
{tmpl_var name="toolsarea_head_txt"} +
+ +
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
{tmpl_var name="template_type"}{tmpl_var name="template_name"} + +
+
+
+ +
\ No newline at end of file diff --git a/interface/ispconfig/interface/client/templates/clients_list.htm b/interface/ispconfig/interface/client/templates/clients_list.htm new file mode 100644 index 0000000000000000000000000000000000000000..f8447712d4231b636f62e4882962fea1b80b96a9 --- /dev/null +++ b/interface/ispconfig/interface/client/templates/clients_list.htm @@ -0,0 +1,63 @@ +

+

+ +
+ +
+
{tmpl_var name="toolsarea_head_txt"} +
+ +
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
{tmpl_var name="client_id"}{tmpl_var name="company_name"}{tmpl_var name="contact_name"}{tmpl_var name="city"}{tmpl_var name="country"} + +
+
+
+ +
diff --git a/interface/ispconfig/interface/client/templates/reseller_edit_address.htm b/interface/ispconfig/interface/client/templates/reseller_edit_address.htm new file mode 100644 index 0000000000000000000000000000000000000000..798fdf98ad7357f365099807fcf2f832897b1254 --- /dev/null +++ b/interface/ispconfig/interface/client/templates/reseller_edit_address.htm @@ -0,0 +1,101 @@ +

+

+ +
+ +
+
Address +
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+

{tmpl_var name='password_strength_txt'}

+
+

 

+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/client/templates/reseller_edit_limits.htm b/interface/ispconfig/interface/client/templates/reseller_edit_limits.htm new file mode 100644 index 0000000000000000000000000000000000000000..8acaf4bd78e7c8a7cce00dbc27215e13fc18e7db --- /dev/null +++ b/interface/ispconfig/interface/client/templates/reseller_edit_limits.htm @@ -0,0 +1,179 @@ +

+

+ +
+ +
+
Limits + +
+ + +
+
+ + + {tmpl_var name='template_additional_list'} + +
+
+   +
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ +  MB +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ +  MB +
+
+

{tmpl_var name='web_php_options_txt'}

+
+ {tmpl_var name='web_php_options'} +
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+

{tmpl_var name='ssh_chroot_txt'}

+
+ {tmpl_var name='ssh_chroot'} +
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ +  MB +
+
+ + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/client/templates/resellers_list.htm b/interface/ispconfig/interface/client/templates/resellers_list.htm new file mode 100644 index 0000000000000000000000000000000000000000..fbe90a6f99ef79edd40febbb03b1f4e7f67f05db --- /dev/null +++ b/interface/ispconfig/interface/client/templates/resellers_list.htm @@ -0,0 +1,63 @@ +

+

+ +
+ +
+
{tmpl_var name="toolsarea_head_txt"} +
+ +
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
{tmpl_var name="client_id"}{tmpl_var name="company_name"}{tmpl_var name="contact_name"}{tmpl_var name="city"}{tmpl_var name="country"} + +
+
+
+ +
diff --git a/interface/ispconfig/interface/client/tools.inc.php b/interface/ispconfig/interface/client/tools.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..c9bfdead3a1d4eb8aedc223f46b87034d2d46016 --- /dev/null +++ b/interface/ispconfig/interface/client/tools.inc.php @@ -0,0 +1,88 @@ +db->queryOneRecord($sql); + $masterTemplateId = $record['template_master']; + $additionalTemplateStr = $record['template_additional']; + + /* + * if the master-Template is custom there is NO changing + */ + if ($masterTemplateId > 0){ + $sql = "SELECT * FROM client_template WHERE template_id = " . intval($masterTemplateId); + $limits = $app->db->queryOneRecord($sql); + } else { + $limits = $page->dataRecord; + } + + /* + * Process the additional tempaltes here (add them to the limits + * if != -1) + */ + $addTpl = explode('/', $additionalTemplateStr); + foreach ($addTpl as $item){ + if (trim($item) != ''){ + $sql = "SELECT * FROM client_template WHERE template_id = " . intval($item); + $addLimits = $app->db->queryOneRecord($sql); + /* maybe the template is deleted in the meantime */ + if (is_array($addLimits)){ + foreach($addLimits as $k => $v){ + if ($limits[$k] > -1){ + if ($v == -1) { + $limits[$k] = -1; + } + else { + $limits[$k] += $v; + } + } + } + } + } + } + + /* + * Write all back to the database + */ + $update = ''; + foreach($limits as $k => $v){ + if (strpos($k, 'limit') !== false && !is_array($v)){ + if ($update != '') $update .= ', '; + $update .= '`' . $k . "`='" . $v . "'"; + } + } + $sql = 'UPDATE client SET ' . $update . " WHERE client_id = " . intval($clientId); + $app->db->query($sql); +} +?> diff --git a/interface/ispconfig/interface/content.php b/interface/ispconfig/interface/content.php new file mode 100644 index 0000000000000000000000000000000000000000..bcc4525ac96e84af151006f58c1a666a4e46c228 --- /dev/null +++ b/interface/ispconfig/interface/content.php @@ -0,0 +1,83 @@ +render(); + if($page->status == 'OK') { + echo $content; + } elseif($page->status == 'REDIRECT') { + $target_parts = explode(':',$page->target); + $module = $target_parts[0]; + $page = $target_parts[1]; + if(!preg_match("/^[a-z]{2,20}$/i", $module)) die('target module name contains unallowed chars.'); + if(!preg_match("/^[a-z]{2,20}$/i", $page)) die('target page name contains unallowed chars.'); + + if(is_file(ISPC_WEB_PATH."/$module/$page.php")) { + include_once(ISPC_WEB_PATH."/$module/$page.php"); + + $classname = $module.'_'.$page; + $page = new $classname(); + + $content = $page->render(); + if($page->status == 'OK') { + echo $content; + } + } + + } + +} elseif (is_array($_SESSION["s"]['user']) or is_array($_SESSION["s"]["module"])) { + // If the user is logged in, we try to load the default page of the module + die('- error -'); +} else { + die('Page does not exist.'); +} + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/designer/form_edit.php b/interface/ispconfig/interface/designer/form_edit.php new file mode 100644 index 0000000000000000000000000000000000000000..ad89ae350cf0e1018b8397949810a42923322cd3 --- /dev/null +++ b/interface/ispconfig/interface/designer/form_edit.php @@ -0,0 +1,152 @@ +auth->check_module_permissions('designer'); + +// Lade Template +$app->uses('tpl'); +$app->tpl->newTemplate("form.tpl.htm"); +$app->tpl->setInclude('content_tpl','templates/form_edit.htm'); + +// Importing variables +$module_name = $_REQUEST["module_name"]; +$form_name = $_REQUEST["form_name"]; + +// Checking imported variables +if(!preg_match('/^[A-Za-z0-9_]{1,50}$/',$module_name)) die("module_name contains invalid chars."); +if(!preg_match('/^[A-Za-z0-9_]{0,50}$/',$form_name)) die("form_name contains invalid chars."); + +$id = $form_name; + +if(count($_POST) > 1) { + // Bestimme aktion + if($id != '') { + $action = 'UPDATE'; + } else { + $action = 'INSERT'; + } + + + if($error == '') { + + $filename = "../".$module_name."/form/".$form_name.".tform.php"; + $form_new = $_POST["form"]; + + if(@is_file($filename)) { + include_once($filename); + $tabs = $form["tabs"]; + unset($form["tabs"]); + $form_new["tabs"] = $tabs; + } + + $file_content = ""; + + die($file_content); + + // writing module.conf + if (!$handle = fopen($filename, 'w')) { + print "Cannot open file ($filename)"; + exit; + } + + if (!fwrite($handle, $file_content)) { + print "Cannot write to file ($filename)"; + exit; + } + + fclose($handle); + + // zu Liste springen + header("Location: form_list.php"); + exit; + + } else { + $app->tpl->setVar("error","Fehler:
".$error); + $app->tpl->setVar($_POST); + } +} + +if($id != '') { +// Datensatz besteht bereits + // bestehenden Datensatz anzeigen + if($error == '') { + // es liegt ein Fehler vor + include_once("../".$module_name."/form/".$form_name.".tform.php"); + //$tabs = $form["tabs"]; + unset($form["tabs"]); + $record = $form; + $record["form_name"] = $form_name; + $record["module_name"] = $module_name; + $record["auth_preset_userid"] = $form["auth_preset"]["userid"]; + $record["auth_preset_groupid"] = $form["auth_preset"]["groupid"]; + $record["auth_preset_perm_user"] = $form["auth_preset"]["perm_user"]; + $record["auth_preset_perm_group"] = $form["auth_preset"]["perm_group"]; + $record["auth_preset_perm_other"] = $form["auth_preset"]["perm_other"]; + } else { + // ein Fehler + $record = $_POST; + //$navi = $_POST["nav"]; + unset($_POST["tabs"]); + } + $record["readonly"] = 'style="background-color: #EEEEEE;" readonly'; +} else { +// neuer datensatz + if($error == '') { + // es liegt kein Fehler vor + // Pewsets + $record["template"] = "module.tpl.htm"; + } else { + // ein Fehler + $record = $_POST; + unset($_POST["tabs"]); + + } + $record["readonly"] = ''; +} + +$record["id"] = $form_name; + +$app->tpl->setVar($record); + +include_once("lib/lang/".$_SESSION["s"]["language"]."_form_edit.lng"); +$app->tpl->setVar($wb); + +// Defaultwerte setzen +$app->tpl_defaults(); + +// Template parsen +$app->tpl->pparse(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/designer/form_list.php b/interface/ispconfig/interface/designer/form_list.php new file mode 100644 index 0000000000000000000000000000000000000000..c0d0a3d311aca8a566eebed20cd1179daf58ec07 --- /dev/null +++ b/interface/ispconfig/interface/designer/form_list.php @@ -0,0 +1,89 @@ +auth->check_module_permissions('designer'); + +$app->uses('tpl'); + +$app->tpl->newTemplate('form.tpl.htm'); +$app->tpl->setInclude('content_tpl', 'templates/form_list.htm'); + +function getinfo($file, $form_file, $bgcolor) { + $module_name = $file; + include(ISPC_WEB_PATH."/$file/form/$form_file"); + return array( 'name' => $form['name'], + 'title' => $form['title'], + 'description' => $form['description'], + 'module_name' => $module_name, + 'bgcolor' => $bgcolor + ); +} + +// lese Module aus +$bgcolor = '#FFFFFF'; +$modules_list = array(); +$handle = @opendir(ISPC_WEB_PATH); +while ($file = @readdir ($handle)) { + if ($file != '.' && $file != '..') { + if(@is_dir(ISPC_WEB_PATH."/$file")) { + if(is_file(ISPC_WEB_PATH.'/'.$file.'/lib/module.conf.php') and $file != 'login') { + if(@is_dir(ISPC_WEB_PATH."/$file/form")) { + $handle2 = opendir(ISPC_WEB_PATH."/$file/form"); + while ($form_file = @readdir ($handle2)) { + if (substr($form_file,0,1) != ".") { + //echo ISPC_ROOT_PATH."/web/".$file."/form/$form_file
"; + //include_once(ISPC_ROOT_PATH."/web/".$file."/form/$form_file"); + // Farbwechsel + $bgcolor = ($bgcolor == '#FFFFFF') ? '#EEEEEE' : '#FFFFFF'; + $modules_list[] = getinfo($file, $form_file, $bgcolor); + + } + } + } + } + } + } +} + +$app->tpl->setLoop('records', $modules_list); + +//* load language file +$lng_file = 'lib/lang/'.$_SESSION['s']['language'].'_form_list.lng'; +include($lng_file); +$app->tpl->setVar($wb); + +$app->tpl_defaults(); +$app->tpl->pparse(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/designer/form_show.php b/interface/ispconfig/interface/designer/form_show.php new file mode 100644 index 0000000000000000000000000000000000000000..c90178b4f564a73ae8c927abbdfe2d4555ee929c --- /dev/null +++ b/interface/ispconfig/interface/designer/form_show.php @@ -0,0 +1,119 @@ +auth->check_module_permissions('designer'); + +if($_SESSION["s"]["user"]["typ"] != "admin") die("Admin permissions required."); + +$app->uses('tpl'); + +$app->tpl->newTemplate("form.tpl.htm"); +$app->tpl->setInclude('content_tpl','templates/form_show.htm'); + + +// TODO: Check ID for malicius chars +$module_name = $_REQUEST["module_name"]; +$form_name = $_REQUEST["form_name"]; + +if(!preg_match('/^[A-Za-z0-9_]{1,50}$/',$module_name)) die("module_name contains invalid chars."); +if(!preg_match('/^[A-Za-z0-9_]{1,50}$/',$form_name)) die("form_name contains invalid chars."); + +include_once("../".$module_name."/form/".$form_name.".tform.php"); +$tabs = $form["tabs"]; +unset($form["tabs"]); +$record = $form; +$record["form_name"] = $form_name; +$record["module_name"] = $module_name; + +// loading language file +$lng_file = "lib/lang/".$_SESSION["s"]["language"]."_form_show.lng"; +include($lng_file); +$app->tpl->setVar($wb); + +// baue Tabs navi +$content = ""; +$n1 = 0; +$n2 = 0; +if(is_array($tabs)) { +foreach($tabs as $tab_id => $tab) { + $content .= " + + + + + + "; + //$content .= "\r\n"; + foreach($tab["fields"] as $field_id => $field) { + //$content .= "\r\n"; + //$content .= "\r\n"; + //$content .= "\r\n"; + $content .= " + + + "; + $n2++; + } + $content .= " +
$tab[title] + + + + + +
Bereich:
Titel:
Ziel:       
Link:       
$field_id + + + + +
 
+ + "; + $n1++; +} +} + +$record["nav"] = $content; + + +$app->tpl->setVar($record); + + +$app->tpl->setLoop('records',$modules_list); + +$app->tpl_defaults(); +$app->tpl->pparse(); + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/designer/index.php b/interface/ispconfig/interface/designer/index.php new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/interface/ispconfig/interface/designer/lib/admin.conf.php b/interface/ispconfig/interface/designer/lib/admin.conf.php new file mode 100644 index 0000000000000000000000000000000000000000..8dce5a57346d86280d73e7590a26388958388195 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/admin.conf.php @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/designer/lib/lang/bg.lng b/interface/ispconfig/interface/designer/lib/lang/bg.lng new file mode 100644 index 0000000000000000000000000000000000000000..acb6c3546c6150b4edbafb782d3ed85c499210b5 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/bg.lng @@ -0,0 +1,2 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/bg_form_edit.lng b/interface/ispconfig/interface/designer/lib/lang/bg_form_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..2138e041640dc2dca30f7f24d18b782349498756 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/bg_form_edit.lng @@ -0,0 +1,24 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/bg_form_list.lng b/interface/ispconfig/interface/designer/lib/lang/bg_form_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..4a053a3c58fb4186b039aa8b0219b4a2061ec222 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/bg_form_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/bg_form_show.lng b/interface/ispconfig/interface/designer/lib/lang/bg_form_show.lng new file mode 100644 index 0000000000000000000000000000000000000000..78cf0edda16df8e16b0ae80eb399eddfd1426afb --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/bg_form_show.lng @@ -0,0 +1,18 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/bg_module_edit.lng b/interface/ispconfig/interface/designer/lib/lang/bg_module_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..50f0309f7017595c06a65df18d9fc4dbbdc8e5b6 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/bg_module_edit.lng @@ -0,0 +1,12 @@ +Description

Modulename: Name of the module directory. Only numbers, chars and underscore allowed.
Moduletitle: Will be shown in the (upper) main navigation.
Template file: Template file of the module. Currently'; +?> diff --git a/interface/ispconfig/interface/designer/lib/lang/bg_module_list.lng b/interface/ispconfig/interface/designer/lib/lang/bg_module_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..31209a0757cdbb09e8a213b71fbdbcab16dc3429 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/bg_module_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/bg_module_nav_edit.lng b/interface/ispconfig/interface/designer/lib/lang/bg_module_nav_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..7698aac73814678727fddac0e435001e8742b7f8 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/bg_module_nav_edit.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/bg_module_nav_item_edit.lng b/interface/ispconfig/interface/designer/lib/lang/bg_module_nav_item_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..9a928f5cb6dd41dbed0557a6a0073fcf21a8d0c6 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/bg_module_nav_item_edit.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/bg_module_show.lng b/interface/ispconfig/interface/designer/lib/lang/bg_module_show.lng new file mode 100644 index 0000000000000000000000000000000000000000..3cbe96358f0947c9e8d6d13e19e78bbfabc8c2f9 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/bg_module_show.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/br.lng b/interface/ispconfig/interface/designer/lib/lang/br.lng new file mode 100644 index 0000000000000000000000000000000000000000..acb6c3546c6150b4edbafb782d3ed85c499210b5 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/br.lng @@ -0,0 +1,2 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/br_form_edit.lng b/interface/ispconfig/interface/designer/lib/lang/br_form_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..7d7534a4ee77f45f46e75296cee1e1fa55f9faa7 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/br_form_edit.lng @@ -0,0 +1,24 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/br_form_list.lng b/interface/ispconfig/interface/designer/lib/lang/br_form_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..b16ce554b0e6240d22d41c107cbd05f3e3fd47b3 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/br_form_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/br_form_show.lng b/interface/ispconfig/interface/designer/lib/lang/br_form_show.lng new file mode 100644 index 0000000000000000000000000000000000000000..5b68a316518de6c4000cfa6ca6d6ad0fdc83d588 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/br_form_show.lng @@ -0,0 +1,18 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/br_module_edit.lng b/interface/ispconfig/interface/designer/lib/lang/br_module_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..34471acd297184a4db31fb68e219adfda91a919e --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/br_module_edit.lng @@ -0,0 +1,22 @@ +Descrição +

+Nome do Módulo: Nome do diretório do módulo. Somente números, letras e underscores são permitidos.
+Título do Módulo: Será exibido em caixa alta no menu de navegação.
+Arquivo de Gabarito: Arquivo de Gabarito do Módulo Disponível: modulo.tpl.htm e modulo_tree.tpl.htm. O padrão é modulo.tpl.htm.
+Frame de Navegação: Se modulo_tree.tpl.htm foi selecionado como arquivo de gabarito, insira aqui o caminho do script para o frame a esquerda.
+Página Padrão: Esta página será exibida quando o módulo for aberto.
+Tamanho da Aba: Tamanho das abas na navegação principal. Este campo fica em branco por padrão. Você pode informar valores absolutos em pixels (ex.: 20) ou valores relativos (ex.: 20%).
+Dica: Todos os caminhos são relativos ao diretório web. +'; +?> diff --git a/interface/ispconfig/interface/designer/lib/lang/br_module_list.lng b/interface/ispconfig/interface/designer/lib/lang/br_module_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..822263a4ad64f7cc82fee8ab785b132726a3045d --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/br_module_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/br_module_nav_edit.lng b/interface/ispconfig/interface/designer/lib/lang/br_module_nav_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..c5e3266a7b91b685168d1c7593f56a33db9f4dad --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/br_module_nav_edit.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/br_module_nav_item_edit.lng b/interface/ispconfig/interface/designer/lib/lang/br_module_nav_item_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..5eafa775af58b0bce4215ef02c8a5e4e7ef8a076 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/br_module_nav_item_edit.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/br_module_show.lng b/interface/ispconfig/interface/designer/lib/lang/br_module_show.lng new file mode 100644 index 0000000000000000000000000000000000000000..1fb18007143161558febd71f4e727bf99aa17f07 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/br_module_show.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/de.lng b/interface/ispconfig/interface/designer/lib/lang/de.lng new file mode 100644 index 0000000000000000000000000000000000000000..acb6c3546c6150b4edbafb782d3ed85c499210b5 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/de.lng @@ -0,0 +1,2 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/de_form_edit.lng b/interface/ispconfig/interface/designer/lib/lang/de_form_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..74bf458d90993f4879d2fe10e8696e1d5d8adf5e --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/de_form_edit.lng @@ -0,0 +1,24 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/de_form_list.lng b/interface/ispconfig/interface/designer/lib/lang/de_form_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..998a64f702453ede0420223dfbd5a47550b8025a --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/de_form_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/de_form_show.lng b/interface/ispconfig/interface/designer/lib/lang/de_form_show.lng new file mode 100644 index 0000000000000000000000000000000000000000..b19fd34457ed9ca267e19a01ad9605368536d752 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/de_form_show.lng @@ -0,0 +1,18 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/de_module_edit.lng b/interface/ispconfig/interface/designer/lib/lang/de_module_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..6eacd64b1de87cab59ed74c470cc351f9f20e243 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/de_module_edit.lng @@ -0,0 +1,12 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/de_module_list.lng b/interface/ispconfig/interface/designer/lib/lang/de_module_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..60406302030a4d1572afa43eae185ba4878643b5 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/de_module_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/de_module_nav_edit.lng b/interface/ispconfig/interface/designer/lib/lang/de_module_nav_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..d5142f03cb3f38a0864004394226834bb7f396c1 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/de_module_nav_edit.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/de_module_nav_item_edit.lng b/interface/ispconfig/interface/designer/lib/lang/de_module_nav_item_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..8c0c33c1a6d71681c20266f550f18a4eff17e86d --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/de_module_nav_item_edit.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/de_module_show.lng b/interface/ispconfig/interface/designer/lib/lang/de_module_show.lng new file mode 100644 index 0000000000000000000000000000000000000000..f4b2ad11f8a610372f2c5f502abf2d1d41279150 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/de_module_show.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/en.lng b/interface/ispconfig/interface/designer/lib/lang/en.lng new file mode 100644 index 0000000000000000000000000000000000000000..15c5adc7fae9b7dab7ba2410a6cabc4361f76852 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/en.lng @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/designer/lib/lang/en_form_edit.lng b/interface/ispconfig/interface/designer/lib/lang/en_form_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..f55e0f4caf455adc002e966b538c23dd87779b90 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/en_form_edit.lng @@ -0,0 +1,26 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/designer/lib/lang/en_form_list.lng b/interface/ispconfig/interface/designer/lib/lang/en_form_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..21a76877d7af2bdfebce90c3a11edbd160c838e9 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/en_form_list.lng @@ -0,0 +1,7 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/designer/lib/lang/en_form_show.lng b/interface/ispconfig/interface/designer/lib/lang/en_form_show.lng new file mode 100644 index 0000000000000000000000000000000000000000..54b14f6e180ccc50c4a64ac91eddf4620a8f7f89 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/en_form_show.lng @@ -0,0 +1,18 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/designer/lib/lang/en_module_edit.lng b/interface/ispconfig/interface/designer/lib/lang/en_module_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..285a363df3b47940024ed92de554dbda1edad777 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/en_module_edit.lng @@ -0,0 +1,23 @@ +Description +

+Modulename: Name of the module directory. Only numbers, chars and underscore allowed.
+Moduletitle: Will be shown in the (upper) main navigation.
+Template file: Template file of the module. Currently available: module.tpl.htm and module_tree.tpl.htm. Default is module.tpl.htm.
+NaviFrame: If module_tree.tpl.htm selected as template file, enter here the path to the script file for the left frame.
+Default page: These page will be shown when the module is opened.
+Tab width: Width of the Tabs in the main navigation. The field is empty by default. You can enter values absolute in pixel (e.g 20) or relative (e.g 20%).
+Hint: All paths are relative to the directory "web". +'; + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/designer/lib/lang/en_module_list.lng b/interface/ispconfig/interface/designer/lib/lang/en_module_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..45260fd9a84a91187ce8688af1a2c4ea6de6ca6a --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/en_module_list.lng @@ -0,0 +1,5 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/designer/lib/lang/en_module_nav_edit.lng b/interface/ispconfig/interface/designer/lib/lang/en_module_nav_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..3600238f74cfd416275c0647fbfe48b436d3feb8 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/en_module_nav_edit.lng @@ -0,0 +1,6 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/designer/lib/lang/en_module_nav_item_edit.lng b/interface/ispconfig/interface/designer/lib/lang/en_module_nav_item_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..56eee32deb6c5a708dc7e5961e6cb13c6d01839c --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/en_module_nav_item_edit.lng @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/designer/lib/lang/en_module_show.lng b/interface/ispconfig/interface/designer/lib/lang/en_module_show.lng new file mode 100644 index 0000000000000000000000000000000000000000..e76f5f332af1ad2447b741ee96c3cd3f173f3ad7 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/en_module_show.lng @@ -0,0 +1,17 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/designer/lib/lang/es.lng b/interface/ispconfig/interface/designer/lib/lang/es.lng new file mode 100644 index 0000000000000000000000000000000000000000..acb6c3546c6150b4edbafb782d3ed85c499210b5 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/es.lng @@ -0,0 +1,2 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/es_form_edit.lng b/interface/ispconfig/interface/designer/lib/lang/es_form_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..c5312559bbf511191f1bbac03d6ac8a03d5df969 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/es_form_edit.lng @@ -0,0 +1,24 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/es_form_list.lng b/interface/ispconfig/interface/designer/lib/lang/es_form_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..3334d0b29448a633561a4dacac33ac7dc1432c85 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/es_form_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/es_form_show.lng b/interface/ispconfig/interface/designer/lib/lang/es_form_show.lng new file mode 100644 index 0000000000000000000000000000000000000000..4cac14529bc76429b369fd4432915064162b0895 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/es_form_show.lng @@ -0,0 +1,18 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/es_module_edit.lng b/interface/ispconfig/interface/designer/lib/lang/es_module_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..c126365a5457445f04ed17799675944926f71a12 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/es_module_edit.lng @@ -0,0 +1,12 @@ +Descripción

Nombre del módulo: Nombre del directorio del módulo. Sólo se permiten números, carácteres y subrayados.
Título del módulo: Se mostrará en la barra de navegación principal.
Fichero de plantilla: Fichero de la plantilla del módulo. Disponibles actualmente: module.tpl.htm y module_tree.tpl.htm. Por defecto: module.tpl.htm.
Marco de navegación: Si el fichero de plantilla module_tree.tpl.htm está seleccionado, introduzca aquí la ruta al fichero del script del marco de la izquierda.
Página por defecto: Esta página se mostrará cuando el módulo se abra.
Ancho de pestaña: Ancho de las pestañas en la barra de navegación. El campo está vacío por defecto. Puede introducir valores absolutos en píxeles (p.ej. 20) o relativos (p.ej. 20%).
Pista: Todas las rutas son relativas al directorio.'; +?> diff --git a/interface/ispconfig/interface/designer/lib/lang/es_module_list.lng b/interface/ispconfig/interface/designer/lib/lang/es_module_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..2805a07bc9c3b0c8897fe4f4708455f7f5f83f85 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/es_module_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/es_module_nav_edit.lng b/interface/ispconfig/interface/designer/lib/lang/es_module_nav_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..22688b6e1783197683eedd97c9be333488b12c59 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/es_module_nav_edit.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/es_module_nav_item_edit.lng b/interface/ispconfig/interface/designer/lib/lang/es_module_nav_item_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..ec39e5f8994f04a5e862126ce8f4135f33f6138d --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/es_module_nav_item_edit.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/es_module_show.lng b/interface/ispconfig/interface/designer/lib/lang/es_module_show.lng new file mode 100644 index 0000000000000000000000000000000000000000..1f1199de532466f36f200fb917072aab4a394e28 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/es_module_show.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/fi.lng b/interface/ispconfig/interface/designer/lib/lang/fi.lng new file mode 100644 index 0000000000000000000000000000000000000000..acb6c3546c6150b4edbafb782d3ed85c499210b5 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/fi.lng @@ -0,0 +1,2 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/fi_form_edit.lng b/interface/ispconfig/interface/designer/lib/lang/fi_form_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..c9a13038a4823d3ab77e498fcd30b8b8c207a289 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/fi_form_edit.lng @@ -0,0 +1,24 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/fi_form_list.lng b/interface/ispconfig/interface/designer/lib/lang/fi_form_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..9052c8f0c9df08704dbe523cb814417fde52e72f --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/fi_form_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/fi_form_show.lng b/interface/ispconfig/interface/designer/lib/lang/fi_form_show.lng new file mode 100644 index 0000000000000000000000000000000000000000..247a95be59142ae9fb6b753a051489050dbe072e --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/fi_form_show.lng @@ -0,0 +1,18 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/fi_module_edit.lng b/interface/ispconfig/interface/designer/lib/lang/fi_module_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..8bb4a5c09e01eee3acf7929732d100d337b121d8 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/fi_module_edit.lng @@ -0,0 +1,22 @@ +Kuvaus +

+Modulename: Ohjelmaosion kansion nimi. Vain numerot,kirjaimet ja alaviiva on sallittu.
+Moduletitle: Tulee näkymään ylemmässä päävalikossa.
+Template file: Ohjelmaosion mallitiedosto. Käytettävissä tällä hetkellä: module.tpl.htm ja module_tree.tpl.htm. Oletus on module.tpl.htm.
+NaviFrame: Jos module_tree.tpl.htm valittiin mallitiedostoksi, kirjoita tähän vasemman kehyksen skriptitiedoston polku.
+Default page: Tämä sivu näytetetään kun ohjelmaosio avataan.
+Tab width: Päälikon painikkeiden leveys. Kenttä on oletuksenä tyhjä. Voit antaa arvon pikseleinää tai prosentteina. (esim. 20 tai 20%).
+Vihje: Kaikki polut ovat suhteellisia web-kansioon, eivät absoluuttisia. +'; +?> diff --git a/interface/ispconfig/interface/designer/lib/lang/fi_module_list.lng b/interface/ispconfig/interface/designer/lib/lang/fi_module_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..f07c9a377bd2fc6807478f1579497f43fdf6c789 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/fi_module_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/fi_module_nav_edit.lng b/interface/ispconfig/interface/designer/lib/lang/fi_module_nav_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..b7c03eafb0c89d8e12b9a5cda7a611ec155c7c5d --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/fi_module_nav_edit.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/fi_module_nav_item_edit.lng b/interface/ispconfig/interface/designer/lib/lang/fi_module_nav_item_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..5f32d5848145dbb98e8f4dbdf0e07d9cac896b37 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/fi_module_nav_item_edit.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/fi_module_show.lng b/interface/ispconfig/interface/designer/lib/lang/fi_module_show.lng new file mode 100644 index 0000000000000000000000000000000000000000..066d92f583925a1c0c59aea57ae91e1014b22992 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/fi_module_show.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/fr.lng b/interface/ispconfig/interface/designer/lib/lang/fr.lng new file mode 100644 index 0000000000000000000000000000000000000000..acb6c3546c6150b4edbafb782d3ed85c499210b5 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/fr.lng @@ -0,0 +1,2 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/fr_form_edit.lng b/interface/ispconfig/interface/designer/lib/lang/fr_form_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..4ef20b0b296449f1bdda8bd02e1f87804c378407 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/fr_form_edit.lng @@ -0,0 +1,24 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/fr_form_list.lng b/interface/ispconfig/interface/designer/lib/lang/fr_form_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..b20b8472799f446db3bb35e09a0fae0c9cea27ef --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/fr_form_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/fr_form_show.lng b/interface/ispconfig/interface/designer/lib/lang/fr_form_show.lng new file mode 100644 index 0000000000000000000000000000000000000000..9c9580ce16718645f51c44b40d6d411ff2804a9c --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/fr_form_show.lng @@ -0,0 +1,18 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/fr_module_edit.lng b/interface/ispconfig/interface/designer/lib/lang/fr_module_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..c2eab9481b31d6f05126d90bcea77286fbe63276 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/fr_module_edit.lng @@ -0,0 +1,14 @@ +Description
Nom du Module: Nom du rpertoire du module. Seulement nombres, lettres et underscore sont autoriss.Titre du Module: Seras affich dans le menu de navigation (suprieur).Fichier Template: Fichier Template du module. Disponible actuellement: module.tpl.htm et module_tree.tpl.htm. Par dfaut module.tpl.htm.Frame de Navigation: Si module_tree.tpl.htm est choisi comme fichier template, entrer ici le chemin vers le script de la frame de gauche.Page par Dfaut: Cette page seras affiche quand le module seras ouvert.Largeur tableau: Largeur des tableau dans la frame principale. Le champ est vide par defaut. Vous pouvez entrer une valeur absolue en pixel (e.g 20) ou relative (e.g 20%).Note: Tous les paths sont relatifs par rapport au dossier web. +'; +?> diff --git a/interface/ispconfig/interface/designer/lib/lang/fr_module_list.lng b/interface/ispconfig/interface/designer/lib/lang/fr_module_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..5389ac9453155705e8c72a8238ee19c8d2b0fede --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/fr_module_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/fr_module_nav_edit.lng b/interface/ispconfig/interface/designer/lib/lang/fr_module_nav_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..423588c935baf01c002281310d29b8e5d7cd6657 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/fr_module_nav_edit.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/fr_module_nav_item_edit.lng b/interface/ispconfig/interface/designer/lib/lang/fr_module_nav_item_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..ada5f4ee8113811c4a6a469869de42e9790d4f00 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/fr_module_nav_item_edit.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/fr_module_show.lng b/interface/ispconfig/interface/designer/lib/lang/fr_module_show.lng new file mode 100644 index 0000000000000000000000000000000000000000..da09511d759c1f4d4e922f0de764ff007e6b2153 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/fr_module_show.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/hu.lng b/interface/ispconfig/interface/designer/lib/lang/hu.lng new file mode 100644 index 0000000000000000000000000000000000000000..acb6c3546c6150b4edbafb782d3ed85c499210b5 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/hu.lng @@ -0,0 +1,2 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/hu_form_edit.lng b/interface/ispconfig/interface/designer/lib/lang/hu_form_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..54fe173ecad0aa36c916cdf2c7c8c3611c43c45c --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/hu_form_edit.lng @@ -0,0 +1,24 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/hu_form_list.lng b/interface/ispconfig/interface/designer/lib/lang/hu_form_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..47432257fd972592d3b506b64e970910d9d0517b --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/hu_form_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/hu_form_show.lng b/interface/ispconfig/interface/designer/lib/lang/hu_form_show.lng new file mode 100644 index 0000000000000000000000000000000000000000..12be609a1fb4de4e463b2bc5d8bc9be2b9c12267 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/hu_form_show.lng @@ -0,0 +1,18 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/hu_module_edit.lng b/interface/ispconfig/interface/designer/lib/lang/hu_module_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..592ccd76bc803ce0a50ce438001b92ec68000a2e --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/hu_module_edit.lng @@ -0,0 +1,22 @@ +Description +

+Modulename: Name of the module directory. Only numbers, chars and underscore allowed.
+Moduletitle: Will be shown in the (upper) main navigation.
+Template file: Template file of the module. Currently available: module.tpl.htm and module_tree.tpl.htm. Default is module.tpl.htm.
+NaviFrame: If module_tree.tpl.htm selected as template file, enter here the path to the script file for the left frame.
+Default page: These page will be shown when the module is opened.
+Tab width: Width of the Tabs in the main navigation. The field is empty by default. You can enter values absolute in pixel (e.g 20) or relative (e.g 20%).
+Hint: All paths are relative to the directory web. +'; +?> diff --git a/interface/ispconfig/interface/designer/lib/lang/hu_module_list.lng b/interface/ispconfig/interface/designer/lib/lang/hu_module_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..bc9ebed5807f2dc7a411c9102c9c55dca2e4acec --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/hu_module_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/hu_module_nav_edit.lng b/interface/ispconfig/interface/designer/lib/lang/hu_module_nav_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..fa5f15aa9e6072a077de378f309bf9e44010ceaa --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/hu_module_nav_edit.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/hu_module_nav_item_edit.lng b/interface/ispconfig/interface/designer/lib/lang/hu_module_nav_item_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..23f7d1592ab86b82a3d29ee7e895fca1f46b26b6 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/hu_module_nav_item_edit.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/hu_module_show.lng b/interface/ispconfig/interface/designer/lib/lang/hu_module_show.lng new file mode 100644 index 0000000000000000000000000000000000000000..357fca1498a00dfd67879c21985a49d08400fee6 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/hu_module_show.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/it.lng b/interface/ispconfig/interface/designer/lib/lang/it.lng new file mode 100644 index 0000000000000000000000000000000000000000..acb6c3546c6150b4edbafb782d3ed85c499210b5 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/it.lng @@ -0,0 +1,2 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/it_form_edit.lng b/interface/ispconfig/interface/designer/lib/lang/it_form_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..54fe173ecad0aa36c916cdf2c7c8c3611c43c45c --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/it_form_edit.lng @@ -0,0 +1,24 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/it_form_list.lng b/interface/ispconfig/interface/designer/lib/lang/it_form_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..47432257fd972592d3b506b64e970910d9d0517b --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/it_form_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/it_form_show.lng b/interface/ispconfig/interface/designer/lib/lang/it_form_show.lng new file mode 100644 index 0000000000000000000000000000000000000000..12be609a1fb4de4e463b2bc5d8bc9be2b9c12267 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/it_form_show.lng @@ -0,0 +1,18 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/it_module_edit.lng b/interface/ispconfig/interface/designer/lib/lang/it_module_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..592ccd76bc803ce0a50ce438001b92ec68000a2e --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/it_module_edit.lng @@ -0,0 +1,22 @@ +Description +

+Modulename: Name of the module directory. Only numbers, chars and underscore allowed.
+Moduletitle: Will be shown in the (upper) main navigation.
+Template file: Template file of the module. Currently available: module.tpl.htm and module_tree.tpl.htm. Default is module.tpl.htm.
+NaviFrame: If module_tree.tpl.htm selected as template file, enter here the path to the script file for the left frame.
+Default page: These page will be shown when the module is opened.
+Tab width: Width of the Tabs in the main navigation. The field is empty by default. You can enter values absolute in pixel (e.g 20) or relative (e.g 20%).
+Hint: All paths are relative to the directory web. +'; +?> diff --git a/interface/ispconfig/interface/designer/lib/lang/it_module_list.lng b/interface/ispconfig/interface/designer/lib/lang/it_module_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..bc9ebed5807f2dc7a411c9102c9c55dca2e4acec --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/it_module_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/it_module_nav_edit.lng b/interface/ispconfig/interface/designer/lib/lang/it_module_nav_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..fa5f15aa9e6072a077de378f309bf9e44010ceaa --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/it_module_nav_edit.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/it_module_nav_item_edit.lng b/interface/ispconfig/interface/designer/lib/lang/it_module_nav_item_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..23f7d1592ab86b82a3d29ee7e895fca1f46b26b6 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/it_module_nav_item_edit.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/it_module_show.lng b/interface/ispconfig/interface/designer/lib/lang/it_module_show.lng new file mode 100644 index 0000000000000000000000000000000000000000..e295047b0e651aefabd81fa644d9467520b900fb --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/it_module_show.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/ja.lng b/interface/ispconfig/interface/designer/lib/lang/ja.lng new file mode 100644 index 0000000000000000000000000000000000000000..acb6c3546c6150b4edbafb782d3ed85c499210b5 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/ja.lng @@ -0,0 +1,2 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/ja_form_edit.lng b/interface/ispconfig/interface/designer/lib/lang/ja_form_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..130ca07889506eebba2a4a2d21aa405071b2b3fc --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/ja_form_edit.lng @@ -0,0 +1,24 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/ja_form_list.lng b/interface/ispconfig/interface/designer/lib/lang/ja_form_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..47432257fd972592d3b506b64e970910d9d0517b --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/ja_form_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/ja_form_show.lng b/interface/ispconfig/interface/designer/lib/lang/ja_form_show.lng new file mode 100644 index 0000000000000000000000000000000000000000..37017fa4a895bcf318bb11deaeb51473ebec49a0 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/ja_form_show.lng @@ -0,0 +1,18 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/ja_module_edit.lng b/interface/ispconfig/interface/designer/lib/lang/ja_module_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..592ccd76bc803ce0a50ce438001b92ec68000a2e --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/ja_module_edit.lng @@ -0,0 +1,22 @@ +Description +

+Modulename: Name of the module directory. Only numbers, chars and underscore allowed.
+Moduletitle: Will be shown in the (upper) main navigation.
+Template file: Template file of the module. Currently available: module.tpl.htm and module_tree.tpl.htm. Default is module.tpl.htm.
+NaviFrame: If module_tree.tpl.htm selected as template file, enter here the path to the script file for the left frame.
+Default page: These page will be shown when the module is opened.
+Tab width: Width of the Tabs in the main navigation. The field is empty by default. You can enter values absolute in pixel (e.g 20) or relative (e.g 20%).
+Hint: All paths are relative to the directory web. +'; +?> diff --git a/interface/ispconfig/interface/designer/lib/lang/ja_module_list.lng b/interface/ispconfig/interface/designer/lib/lang/ja_module_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..bc9ebed5807f2dc7a411c9102c9c55dca2e4acec --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/ja_module_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/ja_module_nav_edit.lng b/interface/ispconfig/interface/designer/lib/lang/ja_module_nav_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..fa5f15aa9e6072a077de378f309bf9e44010ceaa --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/ja_module_nav_edit.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/ja_module_nav_item_edit.lng b/interface/ispconfig/interface/designer/lib/lang/ja_module_nav_item_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..23f7d1592ab86b82a3d29ee7e895fca1f46b26b6 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/ja_module_nav_item_edit.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/ja_module_show.lng b/interface/ispconfig/interface/designer/lib/lang/ja_module_show.lng new file mode 100644 index 0000000000000000000000000000000000000000..6fe8d45bee9a92a0eca4ba03bcd353b60eec50dc --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/ja_module_show.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/nl.lng b/interface/ispconfig/interface/designer/lib/lang/nl.lng new file mode 100644 index 0000000000000000000000000000000000000000..acb6c3546c6150b4edbafb782d3ed85c499210b5 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/nl.lng @@ -0,0 +1,2 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/nl_form_edit.lng b/interface/ispconfig/interface/designer/lib/lang/nl_form_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..bdc7642379edf376f4ccb94b7e687ee0ad3e0f68 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/nl_form_edit.lng @@ -0,0 +1,24 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/nl_form_list.lng b/interface/ispconfig/interface/designer/lib/lang/nl_form_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..2da97250464f17f7f6a30d7942704569bd7b494c --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/nl_form_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/nl_form_show.lng b/interface/ispconfig/interface/designer/lib/lang/nl_form_show.lng new file mode 100644 index 0000000000000000000000000000000000000000..1c82ea156116f2d479e4476e467a3d2b02bb820e --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/nl_form_show.lng @@ -0,0 +1,18 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/nl_module_edit.lng b/interface/ispconfig/interface/designer/lib/lang/nl_module_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..f4234dc28b098c405053f8eb65a2aa67e89534c0 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/nl_module_edit.lng @@ -0,0 +1,22 @@ +Description +

+Modulename: Naam van de module directory. Alleen cijfers, letters en underscore zijn toegestaan.
+Moduletitle: Zal worden getoond in de hoofdnavigatie (bovenaan).
+Template file: Template bestand van de module. Momenteel beschikbaar: module.tpl.htm en module_tree.tpl.htm. Standaard is de module.tpl.htm.
+NaviFrame: Als de module_tree.tpl.htm geselecteerd is als template bestand, geef het pad op dat verwijst naar het scriptbestand voor het linker frame.
+Default page: Deze pagina wordt getoont wanneer de module is geopend.
+Tab width: Tabbreedte in de hoofdnavigatie. Het veld is standaard leeg. U kunt absolute waarden opgeven in pixels (bijv. 20) of relatieve (bijv. 20%).
+Hint: Alle paden zijn relatief aan de directorie web. +'; +?> diff --git a/interface/ispconfig/interface/designer/lib/lang/nl_module_list.lng b/interface/ispconfig/interface/designer/lib/lang/nl_module_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..19ea5e94412eda34aca475d8a7b2a88ab34e7c83 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/nl_module_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/nl_module_nav_edit.lng b/interface/ispconfig/interface/designer/lib/lang/nl_module_nav_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..504b7f754b7cb0e436093c54c837174719c03f7b --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/nl_module_nav_edit.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/nl_module_nav_item_edit.lng b/interface/ispconfig/interface/designer/lib/lang/nl_module_nav_item_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..4c2bddd617c493b2e8f118ad6d132a17903b58d8 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/nl_module_nav_item_edit.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/nl_module_show.lng b/interface/ispconfig/interface/designer/lib/lang/nl_module_show.lng new file mode 100644 index 0000000000000000000000000000000000000000..8f605e40fd526a318dbddd4fd75f7d92b6524e02 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/nl_module_show.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/pl.lng b/interface/ispconfig/interface/designer/lib/lang/pl.lng new file mode 100644 index 0000000000000000000000000000000000000000..acb6c3546c6150b4edbafb782d3ed85c499210b5 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/pl.lng @@ -0,0 +1,2 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/pl_form_edit.lng b/interface/ispconfig/interface/designer/lib/lang/pl_form_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..ee4f4c4100e9e738dc9b2f5c7f5594484ee56437 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/pl_form_edit.lng @@ -0,0 +1,24 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/pl_form_list.lng b/interface/ispconfig/interface/designer/lib/lang/pl_form_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..ac8572277cb0fbbd23843e783026585f5e1f2007 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/pl_form_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/pl_form_show.lng b/interface/ispconfig/interface/designer/lib/lang/pl_form_show.lng new file mode 100644 index 0000000000000000000000000000000000000000..db62af16b9cf666744f2013b0e99fb698e1f62d2 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/pl_form_show.lng @@ -0,0 +1,18 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/pl_module_edit.lng b/interface/ispconfig/interface/designer/lib/lang/pl_module_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..691e55052ff0394ab589f7f1ed28743d83deb1aa --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/pl_module_edit.lng @@ -0,0 +1,22 @@ +Opis +

+Nazwa modułu: Nazwa katalogu z modułem. Tylko liczby, litery (bez polskich) i podkreślenie są dozwolone.
+Tytuł modułu: Będzie wyświetlaby w głównym menu nawigacyjnym.
+Plik szablonu: Plik szablonu modułu. Aktualnie dostępne: module.tpl.htm oraz module_tree.tpl.htm. Domyślnie jest module.tpl.htm.
+Ramka nawigacyjna: Jeśli module_tree.tpl.htm wybrano jako plik szablonu, wpisz tutaj ścieżkę do pliku ze skryptem dla lewej ramki.
+Strona domyślna: Ta strona będzie otwierana na początku podczas otwarcia modułu.
+Szerokość zakładki: Szerokość zakładek w głownym menu nawigacyjnym. To pole jest domyślnie puste. Możesz podać wartość w pikselach (np.: 20) lub procentach (np.: 20%).
+Podpowiedź: Wszystkie ścieżki są względne według strony www.. +'; +?> diff --git a/interface/ispconfig/interface/designer/lib/lang/pl_module_list.lng b/interface/ispconfig/interface/designer/lib/lang/pl_module_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..308d1c688bc14a1cf611cb4c876126a5c2e4a43c --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/pl_module_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/pl_module_nav_edit.lng b/interface/ispconfig/interface/designer/lib/lang/pl_module_nav_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..5ace229a908caaabf6496cf3b0e31abf7e5a8a6d --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/pl_module_nav_edit.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/pl_module_nav_item_edit.lng b/interface/ispconfig/interface/designer/lib/lang/pl_module_nav_item_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..779b3b4b3b418efa60072e2a7d9480b68a80606c --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/pl_module_nav_item_edit.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/pl_module_show.lng b/interface/ispconfig/interface/designer/lib/lang/pl_module_show.lng new file mode 100644 index 0000000000000000000000000000000000000000..9b98c4948239a2b8d5717ade5e90a2d8e2ca10ec --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/pl_module_show.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/pt.lng b/interface/ispconfig/interface/designer/lib/lang/pt.lng new file mode 100644 index 0000000000000000000000000000000000000000..29f4a51efebb370aeb04c5144a604ca2c04e02be --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/pt.lng @@ -0,0 +1,3 @@ + + diff --git a/interface/ispconfig/interface/designer/lib/lang/pt_form_edit.lng b/interface/ispconfig/interface/designer/lib/lang/pt_form_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..75869ca5c525bd217640d67c0fc70ef1a68e442f --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/pt_form_edit.lng @@ -0,0 +1,25 @@ + + diff --git a/interface/ispconfig/interface/designer/lib/lang/pt_form_list.lng b/interface/ispconfig/interface/designer/lib/lang/pt_form_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..01d0f28e9b96c9b1adfe751eb4fb4ebf04584083 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/pt_form_list.lng @@ -0,0 +1,8 @@ + + diff --git a/interface/ispconfig/interface/designer/lib/lang/pt_form_show.lng b/interface/ispconfig/interface/designer/lib/lang/pt_form_show.lng new file mode 100644 index 0000000000000000000000000000000000000000..76e7487900d8503763704af40e087b5d9defbdce --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/pt_form_show.lng @@ -0,0 +1,19 @@ + + diff --git a/interface/ispconfig/interface/designer/lib/lang/pt_module_edit.lng b/interface/ispconfig/interface/designer/lib/lang/pt_module_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..b04975d26a12d1c86e7ac73a9f66483d5e288ebf --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/pt_module_edit.lng @@ -0,0 +1,23 @@ +Descrição +

+Nome do Módulo: Nome da pasta do módulo. Apenas números, letras e underscores são permitidos.
+Título do Módulo: Será exibido em caixa alta no menu de navegação.
+Ficheiro de Template: Ficheiros de Template do Módulo Disponível: modulo.tpl.htm e modulo_tree.tpl.htm. O padrão é modulo.tpl.htm.
+Frame de Navegação: Se modulo_tree.tpl.htm foi seleccionado como ficheiro de template, insira aqui a pasta do script para o frame a esquerda.
+Página Padrão: Esta página será exibida quando o módulo for aberto.
+Tamanho da Aba: Tamanho das abas na navegação principal. Este campo fica em branco por padrão. Pode fornecer valores absolutos em pixels (ex.: 20) ou valores relativos (ex.: 20%).
+Dica: Todos as pastas são relativas à pasta web. +'; +?> + diff --git a/interface/ispconfig/interface/designer/lib/lang/pt_module_list.lng b/interface/ispconfig/interface/designer/lib/lang/pt_module_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..8b8f24775510746de6338d2a6587fa52eadde7a7 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/pt_module_list.lng @@ -0,0 +1,6 @@ + + diff --git a/interface/ispconfig/interface/designer/lib/lang/pt_module_nav_edit.lng b/interface/ispconfig/interface/designer/lib/lang/pt_module_nav_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..3a98235985cd8b28306582e23ddc4889fd2b1118 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/pt_module_nav_edit.lng @@ -0,0 +1,7 @@ + + diff --git a/interface/ispconfig/interface/designer/lib/lang/pt_module_nav_item_edit.lng b/interface/ispconfig/interface/designer/lib/lang/pt_module_nav_item_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..4cb7df1afc9e803fb0708dc3c61c7c2f04e7d155 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/pt_module_nav_item_edit.lng @@ -0,0 +1,9 @@ + + diff --git a/interface/ispconfig/interface/designer/lib/lang/pt_module_show.lng b/interface/ispconfig/interface/designer/lib/lang/pt_module_show.lng new file mode 100644 index 0000000000000000000000000000000000000000..606181de601f0bf1950e00d96050d027654da8e0 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/pt_module_show.lng @@ -0,0 +1,17 @@ + + diff --git a/interface/ispconfig/interface/designer/lib/lang/ro.lng b/interface/ispconfig/interface/designer/lib/lang/ro.lng new file mode 100644 index 0000000000000000000000000000000000000000..acb6c3546c6150b4edbafb782d3ed85c499210b5 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/ro.lng @@ -0,0 +1,2 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/ro_form_edit.lng b/interface/ispconfig/interface/designer/lib/lang/ro_form_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..a99b975f03f43ad743b1e21c52e96884b22a30f3 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/ro_form_edit.lng @@ -0,0 +1,24 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/ro_form_list.lng b/interface/ispconfig/interface/designer/lib/lang/ro_form_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..49b9d5eaf0994ed10e6f4a1011ed462d9e8e4278 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/ro_form_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/ro_form_show.lng b/interface/ispconfig/interface/designer/lib/lang/ro_form_show.lng new file mode 100644 index 0000000000000000000000000000000000000000..9cc5e71d9239c5b13292f73b495d023f3aa85f7d --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/ro_form_show.lng @@ -0,0 +1,18 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/ro_module_edit.lng b/interface/ispconfig/interface/designer/lib/lang/ro_module_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..327550f2039adc3c2ad1c62aaa95c8d169a5f196 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/ro_module_edit.lng @@ -0,0 +1,12 @@ +Description

Modulename: Name of the module directory. Only numbers, chars and underscore allowed.
Moduletitle: Will be shown in the (upper) main navigation.
Template file: Template file of the module. Currently available: module.tpl.htm and module_tree.tpl.htm. Default is module.tpl.htm.
NaviFrame: If module_tree.tpl.htm selected as template file, enter here the path to the script file for the left frame.
Default page: These page will be shown when the module is opened.
Tab width: Width of the Tabs in the main navigation. The field is empty by default. You can enter values absolute in pixel (e.g 20) or relative (e.g 20%).
Hint: All paths are relative to the directory '; +?> diff --git a/interface/ispconfig/interface/designer/lib/lang/ro_module_list.lng b/interface/ispconfig/interface/designer/lib/lang/ro_module_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..c53b556a4f0d9ad534fe6b1d5444a99ba3d72d1c --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/ro_module_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/ro_module_nav_edit.lng b/interface/ispconfig/interface/designer/lib/lang/ro_module_nav_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..ee6bf54268bca384e45cf593711745ec060a8504 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/ro_module_nav_edit.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/ro_module_nav_item_edit.lng b/interface/ispconfig/interface/designer/lib/lang/ro_module_nav_item_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..9b7d60df91b0c00ab79eb21a17c48a9230c7fb62 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/ro_module_nav_item_edit.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/ro_module_show.lng b/interface/ispconfig/interface/designer/lib/lang/ro_module_show.lng new file mode 100644 index 0000000000000000000000000000000000000000..2fb748c3d463c5bdf3a0d834f2634c32e1ec6004 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/ro_module_show.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/ru.lng b/interface/ispconfig/interface/designer/lib/lang/ru.lng new file mode 100644 index 0000000000000000000000000000000000000000..29f4a51efebb370aeb04c5144a604ca2c04e02be --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/ru.lng @@ -0,0 +1,3 @@ + + diff --git a/interface/ispconfig/interface/designer/lib/lang/ru_form_edit.lng b/interface/ispconfig/interface/designer/lib/lang/ru_form_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..f1f67688b1f452169d65b80e8e31d71d8774a6fe --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/ru_form_edit.lng @@ -0,0 +1,25 @@ + + diff --git a/interface/ispconfig/interface/designer/lib/lang/ru_form_list.lng b/interface/ispconfig/interface/designer/lib/lang/ru_form_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..d29fdbe86501d77253c826797e8a5e32c47f695f --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/ru_form_list.lng @@ -0,0 +1,8 @@ + + diff --git a/interface/ispconfig/interface/designer/lib/lang/ru_form_show.lng b/interface/ispconfig/interface/designer/lib/lang/ru_form_show.lng new file mode 100644 index 0000000000000000000000000000000000000000..204f86635c9ac2d313f723f0f163f5e27c562f92 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/ru_form_show.lng @@ -0,0 +1,19 @@ + + diff --git a/interface/ispconfig/interface/designer/lib/lang/ru_module_edit.lng b/interface/ispconfig/interface/designer/lib/lang/ru_module_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..0b6078410ce63edcf9551a6c0b4e2f25cdb6f569 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/ru_module_edit.lng @@ -0,0 +1,23 @@ +Описание +

+Имя модуля: Имя директории модуля. Допустимо использовать латинские символы, числа и подчеркивание.
+Заголовок модуля: Будет отображаться вверху радом с навигацией.
+Файл шаблона: Файл шаблона для модуля. Сейчас доступны: module.tpl.htm и module_tree.tpl.htm. По-умолчанию стоит module.tpl.htm.
+Навигационный фрейм: Если module_tree.tpl.htm выбран как шаблон, введите здесь путь до скрипта для левого фрейма.
+Страница по-умолчанию: Эта страница будет показана, когда открывается модуль.
+Ширина таба: Ширина таба в главной навигации. По-умолчанию поле пустое. Вы можете ввести значение в пикселях или в процентах.
+Подсказка: Все пути в директории web относительные. +'; +?> + diff --git a/interface/ispconfig/interface/designer/lib/lang/ru_module_list.lng b/interface/ispconfig/interface/designer/lib/lang/ru_module_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..e305b40149302e013b433cf9c8facb9e38df12d2 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/ru_module_list.lng @@ -0,0 +1,6 @@ + + diff --git a/interface/ispconfig/interface/designer/lib/lang/ru_module_nav_edit.lng b/interface/ispconfig/interface/designer/lib/lang/ru_module_nav_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..ad02af8e7f579f97a7f8022c27eaef3f0298ef2b --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/ru_module_nav_edit.lng @@ -0,0 +1,7 @@ + + diff --git a/interface/ispconfig/interface/designer/lib/lang/ru_module_nav_item_edit.lng b/interface/ispconfig/interface/designer/lib/lang/ru_module_nav_item_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..f42aafdb821ca16872961d387d1b90f5d426d43e --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/ru_module_nav_item_edit.lng @@ -0,0 +1,9 @@ + + diff --git a/interface/ispconfig/interface/designer/lib/lang/ru_module_show.lng b/interface/ispconfig/interface/designer/lib/lang/ru_module_show.lng new file mode 100644 index 0000000000000000000000000000000000000000..ddb1a5f84508bcadf787c5817d575f6e85f5d0b7 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/ru_module_show.lng @@ -0,0 +1,17 @@ + + diff --git a/interface/ispconfig/interface/designer/lib/lang/se.lng b/interface/ispconfig/interface/designer/lib/lang/se.lng new file mode 100644 index 0000000000000000000000000000000000000000..acb6c3546c6150b4edbafb782d3ed85c499210b5 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/se.lng @@ -0,0 +1,2 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/se_form_edit.lng b/interface/ispconfig/interface/designer/lib/lang/se_form_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..d047ad393d50387a80f3e399229f5b83785d8b20 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/se_form_edit.lng @@ -0,0 +1,24 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/se_form_list.lng b/interface/ispconfig/interface/designer/lib/lang/se_form_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..8e9268e4af986c39f288c6fd3fbc4df7733f4e25 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/se_form_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/se_form_show.lng b/interface/ispconfig/interface/designer/lib/lang/se_form_show.lng new file mode 100644 index 0000000000000000000000000000000000000000..ebd3dd9cf6bd2121289ef35e2a1bfc572da68a1b --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/se_form_show.lng @@ -0,0 +1,18 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/se_module_edit.lng b/interface/ispconfig/interface/designer/lib/lang/se_module_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..ee8361d13bc77cc585108a81f0d39a1c817903ed --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/se_module_edit.lng @@ -0,0 +1,22 @@ +Description +

+Modulename: Namn p modul mappen. Endast siffror, bokstver och understreck r tilltna.
+Moduletitle: Kommer att visas i (vre) huvud navigerigsramen.
+Template file: Mall fil fr modulen. Just nu finns: module.tpl.htm och module_tree.tpl.htm. Standard r module.tpl.htm.
+NaviFrame: Om module module_tree.tpl.htm vljs som mall file, skriv hr skvgen till skriptfilen fr den vnstra ramen.
+Default page: Dessa sidor kommer att visas nr modulen ppnas.
+Tab width: Bredd p Flikarna i huvud navigerings ramen. Detta flt r tomt som standard. Du kan skriva in ett absolutvrde i pixlar (ex. 20) eller relativt vrde (ex. 20%).
+Hint: Alla skvgar r relativa till mappen web. +'; +?> diff --git a/interface/ispconfig/interface/designer/lib/lang/se_module_list.lng b/interface/ispconfig/interface/designer/lib/lang/se_module_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..0fe0187b76286b1a994374265a504f76b24388b8 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/se_module_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/se_module_nav_edit.lng b/interface/ispconfig/interface/designer/lib/lang/se_module_nav_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..17e1563ef931f553188f8d9c09c4e9170911488d --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/se_module_nav_edit.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/se_module_nav_item_edit.lng b/interface/ispconfig/interface/designer/lib/lang/se_module_nav_item_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..3bbbfbd1a82357404a709969632a61d828f5241c --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/se_module_nav_item_edit.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/se_module_show.lng b/interface/ispconfig/interface/designer/lib/lang/se_module_show.lng new file mode 100644 index 0000000000000000000000000000000000000000..c58df7ac449c44ed5fd795ecf2c43570c7b2c325 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/se_module_show.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/sk.lng b/interface/ispconfig/interface/designer/lib/lang/sk.lng new file mode 100644 index 0000000000000000000000000000000000000000..acb6c3546c6150b4edbafb782d3ed85c499210b5 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/sk.lng @@ -0,0 +1,2 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/sk_form_edit.lng b/interface/ispconfig/interface/designer/lib/lang/sk_form_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..3c72e8819b50c5cfec1331284884ed43bde20807 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/sk_form_edit.lng @@ -0,0 +1,24 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/sk_form_list.lng b/interface/ispconfig/interface/designer/lib/lang/sk_form_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..0e0c2cb278b9e0d531b8ce4d4cbac63810b17a24 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/sk_form_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/sk_form_show.lng b/interface/ispconfig/interface/designer/lib/lang/sk_form_show.lng new file mode 100644 index 0000000000000000000000000000000000000000..042e106001a4088d51dd29e51b56912e51520102 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/sk_form_show.lng @@ -0,0 +1,18 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/sk_module_edit.lng b/interface/ispconfig/interface/designer/lib/lang/sk_module_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..320bd142911be25dc031757d4aa0b5715140b909 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/sk_module_edit.lng @@ -0,0 +1,12 @@ + Popis

Modulename: Nzov modulu adresr. Len ?sla, znaky a podtrtko povolen.
Moduletitle: sa objav v (hornej) navigciu.
ablna sboru: ablna sboru modulu. V s?asnej dobe s k dispozcii'; +?> diff --git a/interface/ispconfig/interface/designer/lib/lang/sk_module_list.lng b/interface/ispconfig/interface/designer/lib/lang/sk_module_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..4d9cd1e2ccfeb983a274d4cd4b55290fb89f4222 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/sk_module_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/sk_module_nav_edit.lng b/interface/ispconfig/interface/designer/lib/lang/sk_module_nav_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..69d4d161c18e09ef48ed0c85ff7a6fa8220ab1d9 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/sk_module_nav_edit.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/sk_module_nav_item_edit.lng b/interface/ispconfig/interface/designer/lib/lang/sk_module_nav_item_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..23f7d1592ab86b82a3d29ee7e895fca1f46b26b6 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/sk_module_nav_item_edit.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/sk_module_show.lng b/interface/ispconfig/interface/designer/lib/lang/sk_module_show.lng new file mode 100644 index 0000000000000000000000000000000000000000..3d62509ea8355f5307ab8d3a0817ce2c196bb6e7 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/sk_module_show.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/tr.lng b/interface/ispconfig/interface/designer/lib/lang/tr.lng new file mode 100644 index 0000000000000000000000000000000000000000..acb6c3546c6150b4edbafb782d3ed85c499210b5 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/tr.lng @@ -0,0 +1,2 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/tr_form_edit.lng b/interface/ispconfig/interface/designer/lib/lang/tr_form_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..8288ce84b895b6469fd87a121788a79ed0eab58b --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/tr_form_edit.lng @@ -0,0 +1,24 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/tr_form_list.lng b/interface/ispconfig/interface/designer/lib/lang/tr_form_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..54aa1f45340982eec7bd51825236c02d72c19ffb --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/tr_form_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/tr_form_show.lng b/interface/ispconfig/interface/designer/lib/lang/tr_form_show.lng new file mode 100644 index 0000000000000000000000000000000000000000..8efa1df5a5c60689daea01090b60683e92218217 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/tr_form_show.lng @@ -0,0 +1,18 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/tr_module_edit.lng b/interface/ispconfig/interface/designer/lib/lang/tr_module_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..92bf93d2cac9f3cd7001e20f0a2e314a27c314b3 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/tr_module_edit.lng @@ -0,0 +1,22 @@ +Açıklama +

+Modül adı: Modül klasörünün adı. Sadece sayı, rakam ve alttan çizgi kullanabilirsiniz.
+Modül başlığı: Üst ana menüde gösterilecek olan isim.
+Şablon dosyası: Şablon dosyası veya modülü. Şu anda geçerli olan dosyalar: module.tpl.htm ve module_tree.tpl.htm. Varsayılan dosya: module.tpl.htm.
+NaviFrame: Eğer module_tree.tpl.htm dosyası şablon dosyası olarak seçilirse, buraya sol frame için betik dosyası yolu girebilirsiniz.
+Varsayılan sayfa: Modül açıldığı zaman görünecek sayfa.
+Sekme Genişliği: Temel navigasyonun genişliği. Bu alan varsayılan olarak boştur. Siz bir piksel değeri(20 gibi) veya bir oran(20%) değeri girebilirsiniz.
+İşaret: Tüm yollar web klasörüyle ilişkilidir.. +'; +?> diff --git a/interface/ispconfig/interface/designer/lib/lang/tr_module_list.lng b/interface/ispconfig/interface/designer/lib/lang/tr_module_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..08c57875fdb6001cf3385e084103accd923ab35c --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/tr_module_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/tr_module_nav_edit.lng b/interface/ispconfig/interface/designer/lib/lang/tr_module_nav_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..fd10993d6e03dc6afb36a6b944124dd307765303 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/tr_module_nav_edit.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/tr_module_nav_item_edit.lng b/interface/ispconfig/interface/designer/lib/lang/tr_module_nav_item_edit.lng new file mode 100644 index 0000000000000000000000000000000000000000..06fe57e84fa3cdb90e5ed85c3fb2771a71eaa16b --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/tr_module_nav_item_edit.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/tr_module_show.lng b/interface/ispconfig/interface/designer/lib/lang/tr_module_show.lng new file mode 100644 index 0000000000000000000000000000000000000000..a40c0743b5e795f547afe64aff4e88092970767a --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/tr_module_show.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/designer/lib/module.conf.php b/interface/ispconfig/interface/designer/lib/module.conf.php new file mode 100644 index 0000000000000000000000000000000000000000..16e13c5e81266b36ff30bc2c2182d427237b9448 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/module.conf.php @@ -0,0 +1,95 @@ + 'designer', + 'title' => 'BE Designer', + 'template' => 'module.tpl.htm', + 'navframe_page' => '', + 'startpage' => 'designer/module_list.php', + 'tab_width' => '', + 'nav' => + array ( + 0 => + array ( + 'title' => 'Modules', + 'open' => '1', + 'items' => + array ( + 0 => + array ( + 'title' => 'Add', + 'target' => 'content', + 'link' => 'designer/module_edit.php', + ), + 1 => + array ( + 'title' => 'Edit', + 'target' => 'content', + 'link' => 'designer/module_list.php', + ), + ), + ), + /* + 1 => + array ( + 'title' => 'Formulare', + 'open' => '1', + 'items' => + array ( + 2 => + array ( + 'title' => 'Add', + 'target' => 'content', + 'link' => 'designer/form_edit.php', + ), + 3 => + array ( + 'title' => 'Edit', + 'target' => 'content', + 'link' => 'designer/form_list.php', + ), + ), + ), + 2 => + array ( + 'title' => 'Lists', + 'open' => '1', + 'items' => + array ( + 4 => + array ( + 'title' => 'Add', + 'target' => 'content', + 'link' => 'designer/list_edit.php', + ), + 5 => + array ( + 'title' => 'Edit', + 'target' => 'content', + 'link' => 'designer/list_list.php', + ), + ), + ), + 3 => + array ( + 'title' => 'Languages', + 'open' => '1', + 'items' => + array ( + 6 => + array ( + 'title' => 'Add', + 'target' => 'content', + 'link' => 'designer/lang_edit.php', + ), + 7 => + array ( + 'title' => 'Edit', + 'target' => 'content', + 'link' => 'designer/lang_list.php', + ), + ), + ), + */ + ), +) +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/designer/module_edit.php b/interface/ispconfig/interface/designer/module_edit.php new file mode 100644 index 0000000000000000000000000000000000000000..9d0a556f478da3872230f55c508c81bdeb64d2c9 --- /dev/null +++ b/interface/ispconfig/interface/designer/module_edit.php @@ -0,0 +1,183 @@ +auth->check_module_permissions('designer'); + +// Lade Template +$app->uses('tpl'); +$app->tpl->newTemplate("form.tpl.htm"); +$app->tpl->setInclude('content_tpl','templates/module_edit.htm'); + +// ID importieren +$id = $_REQUEST["id"]; +if(!preg_match('/^[A-Za-z0-9_]{0,50}$/',$id)) die("id contains invalid chars."); + +if(count($_POST) > 1) { + // Bestimme aktion + if($id != '') { + $action = 'UPDATE'; + } else { + $action = 'INSERT'; + } + + + if($error == '') { + + $id = $_POST["module"]["name"]; + if(!preg_match('/^[A-Za-z0-9_]{0,50}$/',$id)) die("id contains invalid chars."); + + $filename = "../".$id."/lib/module.conf.php"; + $module_new = $_POST["module"]; + + if(@is_file($filename)) { + include_once($filename); + $navi = $module["nav"]; + unset($module); + $module_new["nav"] = $navi; + } + + $m = ""; + + // creating the module directories + if(!@is_dir("../".$id)) mkdir("../".$id) or die("Cannot make directory: ../".$id); + if(!@is_dir("../".$id."/lib")) mkdir("../".$id."/lib") or die("Cannot make directory: ../".$id."/lib"); + if(!@is_dir("../".$id."/lib/lang")) mkdir("../".$id."/lib/lang") or die("Cannot make directory: ../".$id."/lib/lang"); + if(!@is_dir("../".$id."/form")) mkdir("../".$id."/form") or die("Cannot make directory: ../".$id."/form"); + if(!@is_dir("../".$id."/list")) mkdir("../".$id."/list") or die("Cannot make directory: ../".$id."/list"); + if(!@is_dir("../".$id."/templates")) mkdir("../".$id."/templates") or die("Cannot make directory: ../".$id."/templates"); + + // writing module.conf + if (!$handle = fopen($filename, 'w')) { + print "Cannot open file ($filename)"; + exit; + } + + if (!fwrite($handle, $m)) { + print "Cannot write to file ($filename)"; + exit; + } + + fclose($handle); + + // writing admin conf + $admin_conf_filename = "../".$id."/lib/admin.conf.php"; + if(!is_file($admin_conf_filename)) { + if (!$handle = fopen($admin_conf_filename, 'w')) { + print "Cannot open file ($admin_conf_filename)"; + exit; + } + + if (!fwrite($handle, "")) { + print "Cannot write to file ($admin_conf_filename)"; + exit; + } + + fclose($handle); + } + + // zu Liste springen + header("Location: module_list.php"); + exit; + + } else { + $app->tpl->setVar("error","Fehler:
".$error); + $app->tpl->setVar($_POST); + } +} + +if($id != '') { +// Datensatz besteht bereits + // bestehenden Datensatz anzeigen + if($error == '') { + // es liegt ein Fehler vor + include_once("../".$id."/lib/module.conf.php"); + //$navi = $module["nav"]; + unset($module["nav"]); + $record = $module; + } else { + // ein Fehler + $record = $_POST; + //$navi = $_POST["nav"]; + unset($_POST["nav"]); + } + $record["readonly"] = 'style="background-color: #EEEEEE;" readonly'; +} else { +// neuer datensatz + if($error == '') { + // es liegt ein Fehler vor + $record["template"] = "module.tpl.htm"; + } else { + // ein Fehler + $record = $_POST; + //$navi = $_POST["nav"]; + unset($_POST["nav"]); + + } + $record["readonly"] = ''; +} + +$record["id"] = $id; + +/* +// baue Modul navi +$content = ""; +$n1 = 0; +$n2 = 0; +foreach($navi as $section) { + $content .= "Bereich:\r\n"; + foreach($section["items"] as $item) { + $content .= "Titel:\r\n"; + $content .= "Ziel:       \r\n"; + $content .= "Link:       \r\n"; + $n2++; + } + $n1++; +} + +$record["nav"] = $content; +*/ + +$app->tpl->setVar($record); + +include_once("lib/lang/".$_SESSION["s"]["language"]."_module_edit.lng"); +$app->tpl->setVar($wb); + +// Defaultwerte setzen +$app->tpl_defaults(); + +// Template parsen +$app->tpl->pparse(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/designer/module_list.php b/interface/ispconfig/interface/designer/module_list.php new file mode 100644 index 0000000000000000000000000000000000000000..4806f079dcaa75d65a56570599d92b7a04c56514 --- /dev/null +++ b/interface/ispconfig/interface/designer/module_list.php @@ -0,0 +1,69 @@ +auth->check_module_permissions('designer'); + +$app->uses('tpl'); + +$app->tpl->newTemplate('form.tpl.htm'); +$app->tpl->setInclude('content_tpl','templates/module_list.htm'); + +//* Pick out modules +$bgcolor = '#FFFFFF'; +$modules_list = array(); +$handle = @opendir(ISPC_WEB_PATH); +while ($file = @readdir ($handle)) { + if ($file != '.' && $file != '..') { + if(@is_dir(ISPC_WEB_PATH."/$file")) { + if(is_file(ISPC_WEB_PATH."/$file/lib/module.conf.php") and $file != 'login') { + include_once(ISPC_WEB_PATH."/$file/lib/module.conf.php"); + $modules_list[] = array( 'module' => $module['name'], + 'title' => $module['title'], + 'bgcolor' => ($bgcolor == '#FFFFFF') ? '#EEEEEE' : '#FFFFFF' + ); + } + } + } +} + +$app->tpl->setLoop('records', $modules_list); + +//* loading language file +$lng_file = 'lib/lang/'.$_SESSION['s']['language'].'_module_list.lng'; +include($lng_file); +$app->tpl->setVar($wb); + +$app->tpl_defaults(); +$app->tpl->pparse(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/designer/module_nav_del.php b/interface/ispconfig/interface/designer/module_nav_del.php new file mode 100644 index 0000000000000000000000000000000000000000..dfbe761bbac4bbdf14920d3e3105a4c678c2091f --- /dev/null +++ b/interface/ispconfig/interface/designer/module_nav_del.php @@ -0,0 +1,80 @@ +auth->check_module_permissions('designer'); + +// Lade Template +$app->uses('tpl'); +$app->tpl->newTemplate("form.tpl.htm"); +$app->tpl->setInclude('content_tpl','templates/module_nav_edit.htm'); + +// ID importieren +$module_name = $_REQUEST["module_name"]; +$nav_id = $_REQUEST["nav_id"]; + +if(!preg_match('/^[A-Za-z0-9_]{1,50}$/',$module_name)) die("module_name contains invalid chars."); +if(!preg_match('/^[A-Za-z0-9_]{0,50}$/',$nav_id)) die("nav_id contains invalid chars."); + +if(empty($module_name)) die("module is empty."); + +if($nav_id != '') { + + $filename = "../".$module_name."/lib/module.conf.php"; + + if(!@is_file($filename)) die("File not found: $filename"); + include_once($filename); + + unset($module["nav"][$nav_id]); + + $m = ""; + + // writing module.conf + if (!$handle = fopen($filename, 'w')) { + print "Cannot open file ($filename)"; + exit; + } + if (!fwrite($handle, $m)) { + print "Cannot write to file ($filename)"; + exit; + } + + fclose($handle); + + + // zu Liste springen + header("Location: module_show.php?id=$module_name"); + exit; +} +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/designer/module_nav_edit.php b/interface/ispconfig/interface/designer/module_nav_edit.php new file mode 100644 index 0000000000000000000000000000000000000000..d97cd5e4bc1ac74ba5ca3646752f212d3f9a94a6 --- /dev/null +++ b/interface/ispconfig/interface/designer/module_nav_edit.php @@ -0,0 +1,146 @@ +auth->check_module_permissions('designer'); + +//* Load template +$app->uses('tpl'); +$app->tpl->newTemplate('form.tpl.htm'); +$app->tpl->setInclude('content_tpl', 'templates/module_nav_edit.htm'); + +// TODO: Check module and nav_id for malicius chars, nav_id can be empty or any number, even 0 +$module_name = $_REQUEST['module_name']; +$nav_id = $_REQUEST['nav_id']; + +//** Sanity checks of module +if(!preg_match('/^[A-Za-z0-9_]{1,50}$/', $module_name)){ + die('module_name contains invalid chars.'); +} +if(!preg_match('/^[A-Za-z0-9_]{0,50}$/', $nav_id)){ + die('nav_id contains invalid chars.'); +} +if(empty($module_name)){ + die('module is empty.'); +} + +if(count($_POST) > 0) { + //* Determine Action + $action = ($nav_id != '') ? 'UPDATE' : 'INSERT'; + $error = ''; + + // TODO: Check variables + + if($error == '') { + + $filename = '../'.$module_name.'/lib/module.conf.php'; + + if(!@is_file($filename)){ + die("File not found: $filename"); + } + include_once($filename); + + $items = ($action == 'UPDATE') ? $module['nav'][$nav_id]['items'] : array(); + + $tmp = array('title' => $_POST['nav']['title'], + 'open' => 1, + 'items' => $items); + + if($action == 'UPDATE') { + $module['nav'][$nav_id] = $tmp; + } else { + $module['nav'][] = $tmp; + } + + $m = ""; + + //* writing module.conf + if (!$handle = fopen($filename, 'w')) { + die("Cannot open file ($filename)"); + } + + if (!fwrite($handle, $m)) { + die("Cannot write to file ($filename)"); + } + + fclose($handle); + + + //* Jump to list + header('Location: module_show.php?id='.urlencode($module_name)); + exit; + + } else { + $app->tpl->setVar('error', 'Fehler:
'.$error); + $app->tpl->setVar($_POST); + } +} + +if($nav_id != '') { + //* Data record exists + if($error == '') { + include_once('../'.$module_name.'/lib/module.conf.php'); + $record = $module['nav'][$nav_id]; + } else { + //* error + $record = $_POST; + } + //$record["readonly"] = 'style="background-color: #EEEEEE;" readonly'; +} else { + //* New data record + if($error == '') { + //* es liegt kein Fehler vor + } else { + //* error + $record = $_POST; + + } + //$record["readonly"] = ''; +} + +$record['nav_id'] = $nav_id; +$record['module_name'] = $module_name; + +$app->tpl->setVar($record); + +include_once('lib/lang/'.$_SESSION['s']['language'].'_module_nav_edit.lng'); +$app->tpl->setVar($wb); + +$app->tpl_defaults(); +$app->tpl->pparse(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/designer/module_nav_flip.php b/interface/ispconfig/interface/designer/module_nav_flip.php new file mode 100644 index 0000000000000000000000000000000000000000..f20dd630671e7c564e4263c2c07cd7e045cb1608 --- /dev/null +++ b/interface/ispconfig/interface/designer/module_nav_flip.php @@ -0,0 +1,91 @@ +auth->check_module_permissions('designer'); + +// Lade Template +$app->uses('tpl'); +$app->tpl->newTemplate("form.tpl.htm"); +$app->tpl->setInclude('content_tpl','templates/module_nav_edit.htm'); + +// ID importieren +$module_name = $_REQUEST["module_name"]; +$nav_id = $_REQUEST["nav_id"]; +$dir = $_REQUEST["dir"]; + +if(!preg_match('/^[A-Za-z0-9_]{1,50}$/',$module_name)) die("module_name contains invalid chars."); +if(!preg_match('/^[A-Za-z0-9_]{0,50}$/',$nav_id)) die("nav_id contains invalid chars."); + +if(empty($module_name)) die("module is empty."); + +if($nav_id != '') { + + $filename = "../".$module_name."/lib/module.conf.php"; + + if(!@is_file($filename)) die("File not found: $filename"); + include_once($filename); + + if($dir == 'up' and $nav_id > 0) { + $tmp = $module["nav"][$nav_id - 1]; + $module["nav"][$nav_id - 1] = $module["nav"][$nav_id]; + $module["nav"][$nav_id] = $tmp; + } + + if($dir == 'down' and $nav_id < count($module["nav"]) -1) { + $tmp = $module["nav"][$nav_id + 1]; + $module["nav"][$nav_id + 1] = $module["nav"][$nav_id]; + $module["nav"][$nav_id] = $tmp; + } + + $m = ""; + + // writing module.conf + if (!$handle = fopen($filename, 'w')) { + print "Cannot open file ($filename)"; + exit; + } + if (!fwrite($handle, $m)) { + print "Cannot write to file ($filename)"; + exit; + } + + fclose($handle); + + + // zu Liste springen + echo "HEADER_REDIRECT:designer/module_show.php?id=$module_name"; + exit; +} +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/designer/module_nav_item_del.php b/interface/ispconfig/interface/designer/module_nav_item_del.php new file mode 100644 index 0000000000000000000000000000000000000000..d941f5bb8ac3e1b9b3c5cd900fc2e523d570a602 --- /dev/null +++ b/interface/ispconfig/interface/designer/module_nav_item_del.php @@ -0,0 +1,82 @@ +auth->check_module_permissions('designer'); + +// Lade Template +$app->uses('tpl'); +$app->tpl->newTemplate("form.tpl.htm"); +$app->tpl->setInclude('content_tpl','templates/module_nav_edit.htm'); + +// ID importieren +$module_name = $_REQUEST["module_name"]; +$nav_id = $_REQUEST["nav_id"]; +$item_id = $_REQUEST["item_id"]; + +if(!preg_match('/^[A-Za-z0-9_]{1,50}$/',$module_name)) die("module_name contains invalid chars."); +if(!preg_match('/^[A-Za-z0-9_]{1,50}$/',$nav_id)) die("nav_id contains invalid chars."); +if(!preg_match('/^[A-Za-z0-9_]{0,50}$/',$item_id)) die("item_id contains invalid chars."); + +if(empty($module_name)) die("module is empty."); + +if($nav_id != '') { + + $filename = "../".$module_name."/lib/module.conf.php"; + + if(!@is_file($filename)) die("File not found: $filename"); + include_once($filename); + + unset($module["nav"][$nav_id]["items"][$item_id]); + + $m = ""; + + // writing module.conf + if (!$handle = fopen($filename, 'w')) { + print "Cannot open file ($filename)"; + exit; + } + if (!fwrite($handle, $m)) { + print "Cannot write to file ($filename)"; + exit; + } + + fclose($handle); + + + // zu Liste springen + header("Location: module_show.php?id=$module_name"); + exit; +} +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/designer/module_nav_item_edit.php b/interface/ispconfig/interface/designer/module_nav_item_edit.php new file mode 100644 index 0000000000000000000000000000000000000000..d270d99b408d7325e86662a4db64eac64e668c07 --- /dev/null +++ b/interface/ispconfig/interface/designer/module_nav_item_edit.php @@ -0,0 +1,150 @@ +auth->check_module_permissions('designer'); + +// Lade Template +$app->uses('tpl'); +$app->tpl->newTemplate("form.tpl.htm"); +$app->tpl->setInclude('content_tpl','templates/module_nav_item_edit.htm'); + +// ID importieren +$module_name = $_REQUEST["module_name"]; +$nav_id = $_REQUEST["nav_id"]; +$item_id = $_REQUEST["item_id"]; + +if(!preg_match('/^[A-Za-z0-9_]{1,50}$/',$module_name)) die("module_name contains invalid chars."); +if(!preg_match('/^[A-Za-z0-9_]{1,50}$/',$nav_id)) die("nav_id contains invalid chars."); +if(!preg_match('/^[A-Za-z0-9_]{0,50}$/',$item_id)) die("item_id contains invalid chars."); + +if(empty($module_name)) die("module is empty."); + +if(count($_POST) > 0) { + // Bestimme aktion + if($item_id != '') { + $action = 'UPDATE'; + } else { + $action = 'INSERT'; + } + + $error = ''; + + // TODO: Check variables + + + if($error == '') { + + $filename = "../".$module_name."/lib/module.conf.php"; + + if(!@is_file($filename)) die("File not found: $filename"); + include_once($filename); + + $tmp = array('title' =>$_POST["title"], + 'target' => $_POST["target"], + 'link' => $_POST["link"]); + + if($action == 'UPDATE') { + $module["nav"][$nav_id]["items"][$item_id] = $tmp; + } else { + $module["nav"][$nav_id]["items"][] = $tmp; + } + + $m = ""; + + // writing module.conf + if (!$handle = fopen($filename, 'w')) { + print "Cannot open file ($filename)"; + exit; + } + + if (!fwrite($handle, $m)) { + print "Cannot write to file ($filename)"; + exit; + } + + fclose($handle); + + + // zu Liste springen + header("Location: module_show.php?id=$module_name"); + exit; + + } else { + $app->tpl->setVar("error","Fehler:
".$error); + $app->tpl->setVar($_POST); + } +} + +if($item_id != '') { +// Datensatz besteht bereits + // bestehenden Datensatz anzeigen + if($error == '') { + // es liegt ein Fehler vor + include_once("../".$module_name."/lib/module.conf.php"); + $record = $module["nav"][$nav_id]["items"][$item_id]; + } else { + // ein Fehler + $record = $_POST; + } + //$record["readonly"] = 'style="background-color: #EEEEEE;" readonly'; +} else { +// neuer datensatz + if($error == '') { + // es liegt kein Fehler vor + $record["target"] = "content"; + } else { + // ein Fehler + $record = $_POST; + + } + //$record["readonly"] = ''; +} + +$record["item_id"] = $item_id; +$record["nav_id"] = $nav_id; +$record["module_name"] = $module_name; + +$app->tpl->setVar($record); + +include_once("lib/lang/".$_SESSION["s"]["language"]."_module_nav_item_edit.lng"); +$app->tpl->setVar($wb); + +// Defaultwerte setzen +$app->tpl_defaults(); + +// Template parsen +$app->tpl->pparse(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/designer/module_nav_item_flip.php b/interface/ispconfig/interface/designer/module_nav_item_flip.php new file mode 100644 index 0000000000000000000000000000000000000000..21bc68cee4fd913eb6738b423bdfb3c0c1f3780e --- /dev/null +++ b/interface/ispconfig/interface/designer/module_nav_item_flip.php @@ -0,0 +1,93 @@ +auth->check_module_permissions('designer'); + +// Lade Template +$app->uses('tpl'); +$app->tpl->newTemplate("form.tpl.htm"); +$app->tpl->setInclude('content_tpl','templates/module_nav_edit.htm'); + +// ID importieren +$module_name = $_REQUEST["module_name"]; +$nav_id = $_REQUEST["nav_id"]; +$item_id = $_REQUEST["item_id"]; +$dir = $_REQUEST["dir"]; + +if(!preg_match('/^[A-Za-z0-9_]{1,50}$/',$module_name)) die("module_name contains invalid chars."); +if(!preg_match('/^[A-Za-z0-9_]{1,50}$/',$nav_id)) die("nav_id contains invalid chars."); +if(!preg_match('/^[A-Za-z0-9_]{0,50}$/',$item_id)) die("item_id contains invalid chars."); + +if(empty($module_name)) die("module is empty."); + +if($nav_id != '') { + + $filename = "../".$module_name."/lib/module.conf.php"; + + if(!@is_file($filename)) die("File not found: $filename"); + include_once($filename); + + if($dir == 'up' and $item_id > 0) { + $tmp = $module["nav"][$nav_id]["items"][$item_id - 1]; + $module["nav"][$nav_id]["items"][$item_id -1] = $module["nav"][$nav_id]["items"][$item_id]; + $module["nav"][$nav_id]["items"][$item_id] = $tmp; + } + + if($dir == 'down' and $item_id < count($module["nav"][$nav_id]["items"]) -1) { + $tmp = $module["nav"][$nav_id]["items"][$item_id + 1]; + $module["nav"][$nav_id]["items"][$item_id + 1] = $module["nav"][$nav_id]["items"][$item_id]; + $module["nav"][$nav_id]["items"][$item_id] = $tmp; + } + + $m = ""; + + // writing module.conf + if (!$handle = fopen($filename, 'w')) { + print "Cannot open file ($filename)"; + exit; + } + if (!fwrite($handle, $m)) { + print "Cannot write to file ($filename)"; + exit; + } + + fclose($handle); + + + // zu Liste springen + header("Location: module_show.php?id=$module_name"); + exit; +} +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/designer/module_show.php b/interface/ispconfig/interface/designer/module_show.php new file mode 100644 index 0000000000000000000000000000000000000000..a8a3b3e651fdcc96fac5676ec7553e692eecc1d4 --- /dev/null +++ b/interface/ispconfig/interface/designer/module_show.php @@ -0,0 +1,113 @@ +auth->check_module_permissions('designer'); + +if($_SESSION["s"]["user"]["typ"] != "admin") die("Admin permissions required."); + +$app->uses('tpl'); + +$app->tpl->newTemplate("form.tpl.htm"); +$app->tpl->setInclude('content_tpl','templates/module_show.htm'); + + +$module_name = $_REQUEST["id"]; +if(!preg_match('/^[A-Za-z0-9_]{0,50}$/',$module_name)) die("id contains invalid chars."); + +include_once("../".$module_name."/lib/module.conf.php"); +$navi = $module["nav"]; +unset($module["nav"]); +$record = $module; + +// loading language file +$lng_file = "lib/lang/".$_SESSION["s"]["user"]["language"]."_module_show.lng"; +include($lng_file); +$app->tpl->setVar($wb); + +// baue Modul navi +$content = ""; +$n1 = 0; +$n2 = 0; +if(is_array($navi)) { +foreach($navi as $nav_id => $section) { + $content .= " + + + + + + "; + //$content .= "\r\n"; + foreach($section["items"] as $item_id => $item) { + //$content .= "\r\n"; + //$content .= "\r\n"; + //$content .= "\r\n"; + $content .= " + + + "; + $n2++; + } + $content .= " +
$section[title] +
+
+
+
+
+
Bereich:
Titel:
Ziel:       
Link:       
$item[title] +
+
+
+
+
 
+ + "; + $n1++; +} +} + +$record["nav"] = $content; + + +$app->tpl->setVar($record); + + +$app->tpl->setLoop('records',$modules_list); + +$app->tpl_defaults(); +$app->tpl->pparse(); + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/designer/templates/form_edit.htm b/interface/ispconfig/interface/designer/templates/form_edit.htm new file mode 100644 index 0000000000000000000000000000000000000000..4d1c991ab19f7a33b3a25d941f1af414a4c1017f --- /dev/null +++ b/interface/ispconfig/interface/designer/templates/form_edit.htm @@ -0,0 +1,79 @@ +
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
:
:
:
:
:
:
: yes / no
:
:
: yes / no
 
:
:
: r = read, i = insert, u = update, d = delete
: r = read, i = insert, u = update, d = delete
: r = read, i = insert, u = update, d = delete
 
  + +
+ + +
\ No newline at end of file diff --git a/interface/ispconfig/interface/designer/templates/form_list.htm b/interface/ispconfig/interface/designer/templates/form_list.htm new file mode 100644 index 0000000000000000000000000000000000000000..57506e8d4613cc3e8f0d37f657f84d0040a0dedb --- /dev/null +++ b/interface/ispconfig/interface/designer/templates/form_list.htm @@ -0,0 +1,24 @@ +
+

+ + + + + + + + + + + + + + + + + + + + +
 
{tmpl_var name="name"}{tmpl_var name="title"}{tmpl_var name="module_name"}{tmpl_var name="description"}[Delete]
+
\ No newline at end of file diff --git a/interface/ispconfig/interface/designer/templates/form_show.htm b/interface/ispconfig/interface/designer/templates/form_show.htm new file mode 100644 index 0000000000000000000000000000000000000000..b10407018c0f4d5d7d513116105a969871b5d42a --- /dev/null +++ b/interface/ispconfig/interface/designer/templates/form_show.htm @@ -0,0 +1,61 @@ + +
+

+
{tmpl_var name='form_txt'} + + + + + + + + + + + + + + + + + + + + + + + +
:{tmpl_var name='title'}
:{tmpl_var name='form_name'}
:{tmpl_var name='module_name'}
:{tmpl_var name='description'}
 
+ + +
+
+ + + + + + + + +
 
 
+
\ No newline at end of file diff --git a/interface/ispconfig/interface/designer/templates/module_edit.htm b/interface/ispconfig/interface/designer/templates/module_edit.htm new file mode 100644 index 0000000000000000000000000000000000000000..2464f5f7e32aa198963b024cfa2985b2e00d7d18 --- /dev/null +++ b/interface/ispconfig/interface/designer/templates/module_edit.htm @@ -0,0 +1,43 @@ +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
:
:
:
:
:
:
  +
 
+
+
 
+ \ No newline at end of file diff --git a/interface/ispconfig/interface/designer/templates/module_list.htm b/interface/ispconfig/interface/designer/templates/module_list.htm new file mode 100644 index 0000000000000000000000000000000000000000..1198d1c8c5693f83674443673fc31eae47ba8f63 --- /dev/null +++ b/interface/ispconfig/interface/designer/templates/module_list.htm @@ -0,0 +1,18 @@ +

+ + + + + + + + + + + + + + + + +
 
{tmpl_var name="module"}{tmpl_var name="title"}[Delete]
\ No newline at end of file diff --git a/interface/ispconfig/interface/designer/templates/module_nav_edit.htm b/interface/ispconfig/interface/designer/templates/module_nav_edit.htm new file mode 100644 index 0000000000000000000000000000000000000000..5c46350b317517d6ad13566c114c0ea47673e7b3 --- /dev/null +++ b/interface/ispconfig/interface/designer/templates/module_nav_edit.htm @@ -0,0 +1,24 @@ +

+ + + + + + + + + + + + + + + + + +
:
  +
 
+
+
 
+ + \ No newline at end of file diff --git a/interface/ispconfig/interface/designer/templates/module_nav_item_edit.htm b/interface/ispconfig/interface/designer/templates/module_nav_item_edit.htm new file mode 100644 index 0000000000000000000000000000000000000000..7ddcd19c0fbe6710c2bc044b0e528263c5e47b3b --- /dev/null +++ b/interface/ispconfig/interface/designer/templates/module_nav_item_edit.htm @@ -0,0 +1,33 @@ +

+ + + + + + + + + + + + + + + + + + + + + + + + + +
:
:
:
  +
 
+
+
 
+ + + \ No newline at end of file diff --git a/interface/ispconfig/interface/designer/templates/module_show.htm b/interface/ispconfig/interface/designer/templates/module_show.htm new file mode 100644 index 0000000000000000000000000000000000000000..8b261720feed3666c32b1d474007fc8973c89119 --- /dev/null +++ b/interface/ispconfig/interface/designer/templates/module_show.htm @@ -0,0 +1,31 @@ +

+
{tmpl_var name='module_txt'} + + + + + + + + + + + + + + + +
:{tmpl_var name='title'}
:{tmpl_var name='name'}
 
+
+
+
+
+ + + + + + + + +
 
 
\ No newline at end of file diff --git a/interface/ispconfig/interface/designer/templates/paging.tpl.htm b/interface/ispconfig/interface/designer/templates/paging.tpl.htm new file mode 100644 index 0000000000000000000000000000000000000000..cb8270404709c841e85e8ddbdf5dd725a98b4e08 --- /dev/null +++ b/interface/ispconfig/interface/designer/templates/paging.tpl.htm @@ -0,0 +1,9 @@ +[ |<< ] + + [<< Zurck] + + Seite {tmpl_var name="next_page"} von {tmpl_var name="max_pages"} + + [Weiter >>] + + [ >>| ] \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/dns_a_edit.php b/interface/ispconfig/interface/dns/dns_a_edit.php new file mode 100644 index 0000000000000000000000000000000000000000..3bd8dec2043ecb58bbb96a31e20d57f7c4b4eeee --- /dev/null +++ b/interface/ispconfig/interface/dns/dns_a_edit.php @@ -0,0 +1,144 @@ +auth->check_module_permissions('dns'); + +// Loading classes +$app->uses('tpl,tform,tform_actions,validate_dns'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onShowNew() { + global $app, $conf; + + // we will check only users, not admins + if($_SESSION["s"]["user"]["typ"] == 'user') { + + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_dns_record FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Check if the user may add another mailbox. + if($client["limit_dns_record"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM dns_rr WHERE sys_groupid = $client_group_id"); + if($tmp["number"] >= $client["limit_dns_record"]) { + $app->error($app->tform->wordbook["limit_dns_record_txt"]); + } + } + } + + parent::onShowNew(); + } + + function onSubmit() { + global $app, $conf; + + // Get the parent soa record of the domain + $soa = $app->db->queryOneRecord("SELECT * FROM dns_soa WHERE id = '".intval($_POST["zone"])."' AND ".$app->tform->getAuthSQL('r')); + + // Check if Domain belongs to user + if($soa["id"] != $_POST["zone"]) $app->tform->errorMessage .= $app->tform->wordbook["no_zone_perm"]; + + // Check the client limits, if user is not the admin + if($_SESSION["s"]["user"]["typ"] != 'admin') { // if user is not admin + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_dns_record FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Check if the user may add another mailbox. + if($this->id == 0 && $client["limit_dns_record"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM dns_rr WHERE sys_groupid = $client_group_id"); + if($tmp["number"] >= $client["limit_dns_record"]) { + $app->error($app->tform->wordbook["limit_dns_record_txt"]); + } + } + } // end if user is not admin + + //* Check for duplicates where IP and hostname are the same + $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM dns_rr WHERE type = 'A' AND name = '".$this->dataRecord["name"]."' AND zone = '".$this->dataRecord["zone"]."' and data = '".$this->dataRecord["data"]."' and id != ".$this->id); + if($tmp['number'] > 0) $app->tform->errorMessage .= $app->tform->lng("data_error_duplicate")."
"; + unset($tmp); + + + // Set the server ID of the rr record to the same server ID as the parent record. + $this->dataRecord["server_id"] = $soa["server_id"]; + + // Update the serial number and timestamp of the RR record + $soa = $app->db->queryOneRecord("SELECT serial FROM dns_rr WHERE id = ".$this->id); + $this->dataRecord["serial"] = $app->validate_dns->increase_serial($soa["serial"]); + $this->dataRecord["stamp"] = date('Y-m-d H:i:s'); + + parent::onSubmit(); + } + + function onAfterInsert() { + global $app, $conf; + + //* Set the sys_groupid of the rr record to be the same then the sys_groupid of the soa record + $soa = $app->db->queryOneRecord("SELECT sys_groupid,serial FROM dns_soa WHERE id = '".intval($this->dataRecord["zone"])."' AND ".$app->tform->getAuthSQL('r')); + $app->db->datalogUpdate('dns_rr', "sys_groupid = ".$soa['sys_groupid'], 'id', $this->id); + + //* Update the serial number of the SOA record + $soa_id = intval($_POST["zone"]); + $serial = $app->validate_dns->increase_serial($soa["serial"]); + $app->db->datalogUpdate('dns_soa', "serial = $serial", 'id', $soa_id); + } + + function onAfterUpdate() { + global $app, $conf; + + //* Update the serial number of the SOA record + $soa = $app->db->queryOneRecord("SELECT serial FROM dns_soa WHERE id = '".intval($this->dataRecord["zone"])."' AND ".$app->tform->getAuthSQL('r')); + $soa_id = intval($_POST["zone"]); + $serial = $app->validate_dns->increase_serial($soa["serial"]); + $app->db->datalogUpdate('dns_soa', "serial = $serial", 'id', $soa_id); + } + +} + +$page = new page_action; +$page->onLoad(); + +?> diff --git a/interface/ispconfig/interface/dns/dns_a_list.php b/interface/ispconfig/interface/dns/dns_a_list.php new file mode 100644 index 0000000000000000000000000000000000000000..681e1583955d5673b856489075c5d2ddb5db7e88 --- /dev/null +++ b/interface/ispconfig/interface/dns/dns_a_list.php @@ -0,0 +1,24 @@ +auth->check_module_permissions('dns'); + +$app->uses('listform_actions'); +$app->listform_actions->SQLExtWhere = "type = 'A'"; + +$app->listform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/dns_aaaa_edit.php b/interface/ispconfig/interface/dns/dns_aaaa_edit.php new file mode 100644 index 0000000000000000000000000000000000000000..97a3565ebbc7ea6f00b81a0b4374cdee9d746ec5 --- /dev/null +++ b/interface/ispconfig/interface/dns/dns_aaaa_edit.php @@ -0,0 +1,139 @@ +auth->check_module_permissions('dns'); + +// Loading classes +$app->uses('tpl,tform,tform_actions,validate_dns'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onShowNew() { + global $app, $conf; + + // we will check only users, not admins + if($_SESSION["s"]["user"]["typ"] == 'user') { + + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_dns_record FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Check if the user may add another mailbox. + if($client["limit_dns_record"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM dns_rr WHERE sys_groupid = $client_group_id"); + if($tmp["number"] >= $client["limit_dns_record"]) { + $app->error($app->tform->wordbook["limit_dns_record_txt"]); + } + } + } + + parent::onShowNew(); + } + + function onSubmit() { + global $app, $conf; + + // Get the parent soa record of the domain + $soa = $app->db->queryOneRecord("SELECT * FROM dns_soa WHERE id = '".intval($_POST["zone"])."' AND ".$app->tform->getAuthSQL('r')); + + // Check if Domain belongs to user + if($soa["id"] != $_POST["zone"]) $app->tform->errorMessage .= $app->tform->wordbook["no_zone_perm"]; + + // Check the client limits, if user is not the admin + if($_SESSION["s"]["user"]["typ"] != 'admin') { // if user is not admin + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_dns_record FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Check if the user may add another mailbox. + if($this->id == 0 && $client["limit_dns_record"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM dns_rr WHERE sys_groupid = $client_group_id"); + if($tmp["number"] >= $client["limit_dns_record"]) { + $app->error($app->tform->wordbook["limit_dns_record_txt"]); + } + } + } // end if user is not admin + + + // Set the server ID of the rr record to the same server ID as the parent record. + $this->dataRecord["server_id"] = $soa["server_id"]; + + // Update the serial number and timestamp of the RR record + $soa = $app->db->queryOneRecord("SELECT serial FROM dns_rr WHERE id = ".$this->id); + $this->dataRecord["serial"] = $app->validate_dns->increase_serial($soa["serial"]); + $this->dataRecord["stamp"] = date('Y-m-d H:i:s'); + + parent::onSubmit(); + } + + function onAfterInsert() { + global $app, $conf; + + //* Set the sys_groupid of the rr record to be the same then the sys_groupid of the soa record + $soa = $app->db->queryOneRecord("SELECT sys_groupid,serial FROM dns_soa WHERE id = '".intval($this->dataRecord["zone"])."' AND ".$app->tform->getAuthSQL('r')); + $app->db->datalogUpdate('dns_rr', "sys_groupid = ".$soa['sys_groupid'], 'id', $this->id); + + //* Update the serial number of the SOA record + $soa_id = intval($_POST["zone"]); + $serial = $app->validate_dns->increase_serial($soa["serial"]); + $app->db->datalogUpdate('dns_soa', "serial = $serial", 'id', $soa_id); + } + + function onAfterUpdate() { + global $app, $conf; + + //* Update the serial number of the SOA record + $soa = $app->db->queryOneRecord("SELECT serial FROM dns_soa WHERE id = '".intval($this->dataRecord["zone"])."' AND ".$app->tform->getAuthSQL('r')); + $soa_id = intval($_POST["zone"]); + $serial = $app->validate_dns->increase_serial($soa["serial"]); + $app->db->datalogUpdate('dns_soa', "serial = $serial", 'id', $soa_id); + } + +} + +$page = new page_action; +$page->onLoad(); + +?> diff --git a/interface/ispconfig/interface/dns/dns_alias_edit.php b/interface/ispconfig/interface/dns/dns_alias_edit.php new file mode 100644 index 0000000000000000000000000000000000000000..676d439a6664ea88de2bae27b45bae953de3cdeb --- /dev/null +++ b/interface/ispconfig/interface/dns/dns_alias_edit.php @@ -0,0 +1,138 @@ +auth->check_module_permissions('dns'); + +// Loading classes +$app->uses('tpl,tform,tform_actions,validate_dns'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onShowNew() { + global $app, $conf; + + // we will check only users, not admins + if($_SESSION["s"]["user"]["typ"] == 'user') { + + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_dns_record FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Check if the user may add another mailbox. + if($client["limit_dns_record"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM dns_rr WHERE sys_groupid = $client_group_id"); + if($tmp["number"] >= $client["limit_dns_record"]) { + $app->error($app->tform->wordbook["limit_dns_record_txt"]); + } + } + } + + parent::onShowNew(); + } + + function onSubmit() { + global $app, $conf; + + // Get the parent soa record of the domain + $soa = $app->db->queryOneRecord("SELECT * FROM dns_soa WHERE id = '".intval($_POST["zone"])."' AND ".$app->tform->getAuthSQL('r')); + + // Check if Domain belongs to user + if($soa["id"] != $_POST["zone"]) $app->tform->errorMessage .= $app->tform->wordbook["no_zone_perm"]; + + // Check the client limits, if user is not the admin + if($_SESSION["s"]["user"]["typ"] != 'admin') { // if user is not admin + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_dns_record FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Check if the user may add another mailbox. + if($client["limit_dns_record"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM dns_rr WHERE sys_groupid = $client_group_id"); + if($tmp["number"] >= $client["limit_dns_record"]) { + $app->error($app->tform->wordbook["limit_dns_record_txt"]); + } + } + } // end if user is not admin + + + // Set the server ID of the rr record to the same server ID as the parent record. + $this->dataRecord["server_id"] = $soa["server_id"]; + + // Update the serial number and timestamp of the RR record + $soa = $app->db->queryOneRecord("SELECT serial FROM dns_rr WHERE id = ".$this->id); + $this->dataRecord["serial"] = $app->validate_dns->increase_serial($soa["serial"]); + $this->dataRecord["stamp"] = date('Y-m-d H:i:s'); + + parent::onSubmit(); + } + + function onAfterInsert() { + global $app, $conf; + + //* Set the sys_groupid of the rr record to be the same then the sys_groupid of the soa record + $soa = $app->db->queryOneRecord("SELECT sys_groupid,serial FROM dns_soa WHERE id = '".intval($this->dataRecord["zone"])."' AND ".$app->tform->getAuthSQL('r')); + $app->db->datalogUpdate('dns_rr', "sys_groupid = ".$soa['sys_groupid'], 'id', $this->id); + + //* Update the serial number of the SOA record + $soa_id = intval($_POST["zone"]); + $serial = $app->validate_dns->increase_serial($soa["serial"]); + $app->db->datalogUpdate('dns_soa', "serial = $serial", 'id', $soa_id); + } + + function onAfterUpdate() { + global $app, $conf; + + //* Update the serial number of the SOA record + $soa = $app->db->queryOneRecord("SELECT serial FROM dns_soa WHERE id = '".intval($this->dataRecord["zone"])."' AND ".$app->tform->getAuthSQL('r')); + $soa_id = intval($_POST["zone"]); + $serial = $app->validate_dns->increase_serial($soa["serial"]); + $app->db->datalogUpdate('dns_soa', "serial = $serial", 'id', $soa_id); + } +} + +$page = new page_action; +$page->onLoad(); + +?> diff --git a/interface/ispconfig/interface/dns/dns_cname_edit.php b/interface/ispconfig/interface/dns/dns_cname_edit.php new file mode 100644 index 0000000000000000000000000000000000000000..96e645348309e026b3ef30147f58d85259e4b855 --- /dev/null +++ b/interface/ispconfig/interface/dns/dns_cname_edit.php @@ -0,0 +1,138 @@ +auth->check_module_permissions('dns'); + +// Loading classes +$app->uses('tpl,tform,tform_actions,validate_dns'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onShowNew() { + global $app, $conf; + + // we will check only users, not admins + if($_SESSION["s"]["user"]["typ"] == 'user') { + + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_dns_record FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Check if the user may add another mailbox. + if($client["limit_dns_record"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM dns_rr WHERE sys_groupid = $client_group_id"); + if($tmp["number"] >= $client["limit_dns_record"]) { + $app->error($app->tform->wordbook["limit_dns_record_txt"]); + } + } + } + + parent::onShowNew(); + } + + function onSubmit() { + global $app, $conf; + + // Get the parent soa record of the domain + $soa = $app->db->queryOneRecord("SELECT * FROM dns_soa WHERE id = '".intval($_POST["zone"])."' AND ".$app->tform->getAuthSQL('r')); + + // Check if Domain belongs to user + if($soa["id"] != $_POST["zone"]) $app->tform->errorMessage .= $app->tform->wordbook["no_zone_perm"]; + + // Check the client limits, if user is not the admin + if($_SESSION["s"]["user"]["typ"] != 'admin') { // if user is not admin + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_dns_record FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Check if the user may add another mailbox. + if($this->id == 0 && $client["limit_dns_record"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM dns_rr WHERE sys_groupid = $client_group_id"); + if($tmp["number"] >= $client["limit_dns_record"]) { + $app->error($app->tform->wordbook["limit_dns_record_txt"]); + } + } + } // end if user is not admin + + + // Set the server ID of the rr record to the same server ID as the parent record. + $this->dataRecord["server_id"] = $soa["server_id"]; + + // Update the serial number and timestamp of the RR record + $soa = $app->db->queryOneRecord("SELECT serial FROM dns_rr WHERE id = ".$this->id); + $this->dataRecord["serial"] = $app->validate_dns->increase_serial($soa["serial"]); + $this->dataRecord["stamp"] = date('Y-m-d H:i:s'); + + parent::onSubmit(); + } + + function onAfterInsert() { + global $app, $conf; + + //* Set the sys_groupid of the rr record to be the same then the sys_groupid of the soa record + $soa = $app->db->queryOneRecord("SELECT sys_groupid,serial FROM dns_soa WHERE id = '".intval($this->dataRecord["zone"])."' AND ".$app->tform->getAuthSQL('r')); + $app->db->datalogUpdate('dns_rr', "sys_groupid = ".$soa['sys_groupid'], 'id', $this->id); + + //* Update the serial number of the SOA record + $soa_id = intval($_POST["zone"]); + $serial = $app->validate_dns->increase_serial($soa["serial"]); + $app->db->datalogUpdate('dns_soa', "serial = $serial", 'id', $soa_id); + } + + function onAfterUpdate() { + global $app, $conf; + + //* Update the serial number of the SOA record + $soa = $app->db->queryOneRecord("SELECT serial FROM dns_soa WHERE id = '".intval($this->dataRecord["zone"])."' AND ".$app->tform->getAuthSQL('r')); + $soa_id = intval($_POST["zone"]); + $serial = $app->validate_dns->increase_serial($soa["serial"]); + $app->db->datalogUpdate('dns_soa', "serial = $serial", 'id', $soa_id); + } +} + +$page = new page_action; +$page->onLoad(); + +?> diff --git a/interface/ispconfig/interface/dns/dns_hinfo_edit.php b/interface/ispconfig/interface/dns/dns_hinfo_edit.php new file mode 100644 index 0000000000000000000000000000000000000000..cafbedef918e2c3a3bd4ccb60945a783b101fa39 --- /dev/null +++ b/interface/ispconfig/interface/dns/dns_hinfo_edit.php @@ -0,0 +1,138 @@ +auth->check_module_permissions('dns'); + +// Loading classes +$app->uses('tpl,tform,tform_actions,validate_dns'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onShowNew() { + global $app, $conf; + + // we will check only users, not admins + if($_SESSION["s"]["user"]["typ"] == 'user') { + + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_dns_record FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Check if the user may add another mailbox. + if($client["limit_dns_record"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM dns_rr WHERE sys_groupid = $client_group_id"); + if($tmp["number"] >= $client["limit_dns_record"]) { + $app->error($app->tform->wordbook["limit_dns_record_txt"]); + } + } + } + + parent::onShowNew(); + } + + function onSubmit() { + global $app, $conf; + + // Get the parent soa record of the domain + $soa = $app->db->queryOneRecord("SELECT * FROM dns_soa WHERE id = '".intval($_POST["zone"])."' AND ".$app->tform->getAuthSQL('r')); + + // Check if Domain belongs to user + if($soa["id"] != $_POST["zone"]) $app->tform->errorMessage .= $app->tform->wordbook["no_zone_perm"]; + + // Check the client limits, if user is not the admin + if($_SESSION["s"]["user"]["typ"] != 'admin') { // if user is not admin + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_dns_record FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Check if the user may add another mailbox. + if($this->id == 0 && $client["limit_dns_record"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM dns_rr WHERE sys_groupid = $client_group_id"); + if($tmp["number"] >= $client["limit_dns_record"]) { + $app->error($app->tform->wordbook["limit_dns_record_txt"]); + } + } + } // end if user is not admin + + + // Set the server ID of the rr record to the same server ID as the parent record. + $this->dataRecord["server_id"] = $soa["server_id"]; + + // Update the serial number and timestamp of the RR record + $soa = $app->db->queryOneRecord("SELECT serial FROM dns_rr WHERE id = ".$this->id); + $this->dataRecord["serial"] = $app->validate_dns->increase_serial($soa["serial"]); + $this->dataRecord["stamp"] = date('Y-m-d H:i:s'); + + parent::onSubmit(); + } + + function onAfterInsert() { + global $app, $conf; + + //* Set the sys_groupid of the rr record to be the same then the sys_groupid of the soa record + $soa = $app->db->queryOneRecord("SELECT sys_groupid,serial FROM dns_soa WHERE id = '".intval($this->dataRecord["zone"])."' AND ".$app->tform->getAuthSQL('r')); + $app->db->datalogUpdate('dns_rr', "sys_groupid = ".$soa['sys_groupid'], 'id', $this->id); + + //* Update the serial number of the SOA record + $soa_id = intval($_POST["zone"]); + $serial = $app->validate_dns->increase_serial($soa["serial"]); + $app->db->datalogUpdate('dns_soa', "serial = $serial", 'id', $soa_id); + } + + function onAfterUpdate() { + global $app, $conf; + + //* Update the serial number of the SOA record + $soa = $app->db->queryOneRecord("SELECT serial FROM dns_soa WHERE id = '".intval($this->dataRecord["zone"])."' AND ".$app->tform->getAuthSQL('r')); + $soa_id = intval($_POST["zone"]); + $serial = $app->validate_dns->increase_serial($soa["serial"]); + $app->db->datalogUpdate('dns_soa', "serial = $serial", 'id', $soa_id); + } +} + +$page = new page_action; +$page->onLoad(); + +?> diff --git a/interface/ispconfig/interface/dns/dns_mx_edit.php b/interface/ispconfig/interface/dns/dns_mx_edit.php new file mode 100644 index 0000000000000000000000000000000000000000..889d795e1b2225b17c8d5a72b865d77bb425b84c --- /dev/null +++ b/interface/ispconfig/interface/dns/dns_mx_edit.php @@ -0,0 +1,138 @@ +auth->check_module_permissions('dns'); + +// Loading classes +$app->uses('tpl,tform,tform_actions,validate_dns'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onShowNew() { + global $app, $conf; + + // we will check only users, not admins + if($_SESSION["s"]["user"]["typ"] == 'user') { + + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_dns_record FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Check if the user may add another mailbox. + if($client["limit_dns_record"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM dns_rr WHERE sys_groupid = $client_group_id"); + if($tmp["number"] >= $client["limit_dns_record"]) { + $app->error($app->tform->wordbook["limit_dns_record_txt"]); + } + } + } + + parent::onShowNew(); + } + + function onSubmit() { + global $app, $conf; + + // Get the parent soa record of the domain + $soa = $app->db->queryOneRecord("SELECT * FROM dns_soa WHERE id = '".intval($_POST["zone"])."' AND ".$app->tform->getAuthSQL('r')); + + // Check if Domain belongs to user + if($soa["id"] != $_POST["zone"]) $app->tform->errorMessage .= $app->tform->wordbook["no_zone_perm"]; + + // Check the client limits, if user is not the admin + if($_SESSION["s"]["user"]["typ"] != 'admin') { // if user is not admin + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_dns_record FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Check if the user may add another mailbox. + if($this->id == 0 && $client["limit_dns_record"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM dns_rr WHERE sys_groupid = $client_group_id"); + if($tmp["number"] >= $client["limit_dns_record"]) { + $app->error($app->tform->wordbook["limit_dns_record_txt"]); + } + } + } // end if user is not admin + + + // Set the server ID of the rr record to the same server ID as the parent record. + $this->dataRecord["server_id"] = $soa["server_id"]; + + // Update the serial number and timestamp of the RR record + $soa = $app->db->queryOneRecord("SELECT serial FROM dns_rr WHERE id = ".$this->id); + $this->dataRecord["serial"] = $app->validate_dns->increase_serial($soa["serial"]); + $this->dataRecord["stamp"] = date('Y-m-d H:i:s'); + + parent::onSubmit(); + } + + function onAfterInsert() { + global $app, $conf; + + //* Set the sys_groupid of the rr record to be the same then the sys_groupid of the soa record + $soa = $app->db->queryOneRecord("SELECT sys_groupid,serial FROM dns_soa WHERE id = '".intval($this->dataRecord["zone"])."' AND ".$app->tform->getAuthSQL('r')); + $app->db->datalogUpdate('dns_rr', "sys_groupid = ".$soa['sys_groupid'], 'id', $this->id); + + //* Update the serial number of the SOA record + $soa_id = intval($_POST["zone"]); + $serial = $app->validate_dns->increase_serial($soa["serial"]); + $app->db->datalogUpdate('dns_soa', "serial = $serial", 'id', $soa_id); + } + + function onAfterUpdate() { + global $app, $conf; + + //* Update the serial number of the SOA record + $soa = $app->db->queryOneRecord("SELECT serial FROM dns_soa WHERE id = '".intval($this->dataRecord["zone"])."' AND ".$app->tform->getAuthSQL('r')); + $soa_id = intval($_POST["zone"]); + $serial = $app->validate_dns->increase_serial($soa["serial"]); + $app->db->datalogUpdate('dns_soa', "serial = $serial", 'id', $soa_id); + } +} + +$page = new page_action; +$page->onLoad(); + +?> diff --git a/interface/ispconfig/interface/dns/dns_ns_edit.php b/interface/ispconfig/interface/dns/dns_ns_edit.php new file mode 100644 index 0000000000000000000000000000000000000000..5fa65c9d00066cef40cae83363af7f7ca85bcbfc --- /dev/null +++ b/interface/ispconfig/interface/dns/dns_ns_edit.php @@ -0,0 +1,138 @@ +auth->check_module_permissions('dns'); + +// Loading classes +$app->uses('tpl,tform,tform_actions,validate_dns'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onShowNew() { + global $app, $conf; + + // we will check only users, not admins + if($_SESSION["s"]["user"]["typ"] == 'user') { + + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_dns_record FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Check if the user may add another mailbox. + if($client["limit_dns_record"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM dns_rr WHERE sys_groupid = $client_group_id"); + if($tmp["number"] >= $client["limit_dns_record"]) { + $app->error($app->tform->wordbook["limit_dns_record_txt"]); + } + } + } + + parent::onShowNew(); + } + + function onSubmit() { + global $app, $conf; + + // Get the parent soa record of the domain + $soa = $app->db->queryOneRecord("SELECT * FROM dns_soa WHERE id = '".intval($_POST["zone"])."' AND ".$app->tform->getAuthSQL('r')); + + // Check if Domain belongs to user + if($soa["id"] != $_POST["zone"]) $app->tform->errorMessage .= $app->tform->wordbook["no_zone_perm"]; + + // Check the client limits, if user is not the admin + if($_SESSION["s"]["user"]["typ"] != 'admin') { // if user is not admin + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_dns_record FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Check if the user may add another mailbox. + if($this->id == 0 && $client["limit_dns_record"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM dns_rr WHERE sys_groupid = $client_group_id"); + if($tmp["number"] >= $client["limit_dns_record"]) { + $app->error($app->tform->wordbook["limit_dns_record_txt"]); + } + } + } // end if user is not admin + + + // Set the server ID of the rr record to the same server ID as the parent record. + $this->dataRecord["server_id"] = $soa["server_id"]; + + // Update the serial number and timestamp of the RR record + $soa = $app->db->queryOneRecord("SELECT serial FROM dns_rr WHERE id = ".$this->id); + $this->dataRecord["serial"] = $app->validate_dns->increase_serial($soa["serial"]); + $this->dataRecord["stamp"] = date('Y-m-d H:i:s'); + + parent::onSubmit(); + } + + function onAfterInsert() { + global $app, $conf; + + //* Set the sys_groupid of the rr record to be the same then the sys_groupid of the soa record + $soa = $app->db->queryOneRecord("SELECT sys_groupid,serial FROM dns_soa WHERE id = '".intval($this->dataRecord["zone"])."' AND ".$app->tform->getAuthSQL('r')); + $app->db->datalogUpdate('dns_rr', "sys_groupid = ".$soa['sys_groupid'], 'id', $this->id); + + //* Update the serial number of the SOA record + $soa_id = intval($_POST["zone"]); + $serial = $app->validate_dns->increase_serial($soa["serial"]); + $app->db->datalogUpdate('dns_soa', "serial = $serial", 'id', $soa_id); + } + + function onAfterUpdate() { + global $app, $conf; + + //* Update the serial number of the SOA record + $soa = $app->db->queryOneRecord("SELECT serial FROM dns_soa WHERE id = '".intval($this->dataRecord["zone"])."' AND ".$app->tform->getAuthSQL('r')); + $soa_id = intval($_POST["zone"]); + $serial = $app->validate_dns->increase_serial($soa["serial"]); + $app->db->datalogUpdate('dns_soa', "serial = $serial", 'id', $soa_id); + } +} + +$page = new page_action; +$page->onLoad(); + +?> diff --git a/interface/ispconfig/interface/dns/dns_ptr_edit.php b/interface/ispconfig/interface/dns/dns_ptr_edit.php new file mode 100644 index 0000000000000000000000000000000000000000..04f1b2ef4163e5f537ac8f9422c01ba82143f4dc --- /dev/null +++ b/interface/ispconfig/interface/dns/dns_ptr_edit.php @@ -0,0 +1,138 @@ +auth->check_module_permissions('dns'); + +// Loading classes +$app->uses('tpl,tform,tform_actions,validate_dns'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onShowNew() { + global $app, $conf; + + // we will check only users, not admins + if($_SESSION["s"]["user"]["typ"] == 'user') { + + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_dns_record FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Check if the user may add another mailbox. + if($client["limit_dns_record"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM dns_rr WHERE sys_groupid = $client_group_id"); + if($tmp["number"] >= $client["limit_dns_record"]) { + $app->error($app->tform->wordbook["limit_dns_record_txt"]); + } + } + } + + parent::onShowNew(); + } + + function onSubmit() { + global $app, $conf; + + // Get the parent soa record of the domain + $soa = $app->db->queryOneRecord("SELECT * FROM dns_soa WHERE id = '".intval($_POST["zone"])."' AND ".$app->tform->getAuthSQL('r')); + + // Check if Domain belongs to user + if($soa["id"] != $_POST["zone"]) $app->tform->errorMessage .= $app->tform->wordbook["no_zone_perm"]; + + // Check the client limits, if user is not the admin + if($_SESSION["s"]["user"]["typ"] != 'admin') { // if user is not admin + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_dns_record FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Check if the user may add another mailbox. + if($this->id == 0 && $client["limit_dns_record"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM dns_rr WHERE sys_groupid = $client_group_id"); + if($tmp["number"] >= $client["limit_dns_record"]) { + $app->error($app->tform->wordbook["limit_dns_record_txt"]); + } + } + } // end if user is not admin + + + // Set the server ID of the rr record to the same server ID as the parent record. + $this->dataRecord["server_id"] = $soa["server_id"]; + + // Update the serial number and timestamp of the RR record + $soa = $app->db->queryOneRecord("SELECT serial FROM dns_rr WHERE id = ".$this->id); + $this->dataRecord["serial"] = $app->validate_dns->increase_serial($soa["serial"]); + $this->dataRecord["stamp"] = date('Y-m-d H:i:s'); + + parent::onSubmit(); + } + + function onAfterInsert() { + global $app, $conf; + + //* Set the sys_groupid of the rr record to be the same then the sys_groupid of the soa record + $soa = $app->db->queryOneRecord("SELECT sys_groupid,serial FROM dns_soa WHERE id = '".intval($this->dataRecord["zone"])."' AND ".$app->tform->getAuthSQL('r')); + $app->db->datalogUpdate('dns_rr', "sys_groupid = ".$soa['sys_groupid'], 'id', $this->id); + + //* Update the serial number of the SOA record + $soa_id = intval($_POST["zone"]); + $serial = $app->validate_dns->increase_serial($soa["serial"]); + $app->db->datalogUpdate('dns_soa', "serial = $serial", 'id', $soa_id); + } + + function onAfterUpdate() { + global $app, $conf; + + //* Update the serial number of the SOA record + $soa = $app->db->queryOneRecord("SELECT serial FROM dns_soa WHERE id = '".intval($this->dataRecord["zone"])."' AND ".$app->tform->getAuthSQL('r')); + $soa_id = intval($_POST["zone"]); + $serial = $app->validate_dns->increase_serial($soa["serial"]); + $app->db->datalogUpdate('dns_soa', "serial = $serial", 'id', $soa_id); + } +} + +$page = new page_action; +$page->onLoad(); + +?> diff --git a/interface/ispconfig/interface/dns/dns_rp_edit.php b/interface/ispconfig/interface/dns/dns_rp_edit.php new file mode 100644 index 0000000000000000000000000000000000000000..10c61122f45de4f08eff8aee5ec1a8cf08a9a493 --- /dev/null +++ b/interface/ispconfig/interface/dns/dns_rp_edit.php @@ -0,0 +1,138 @@ +auth->check_module_permissions('dns'); + +// Loading classes +$app->uses('tpl,tform,tform_actions,validate_dns'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onShowNew() { + global $app, $conf; + + // we will check only users, not admins + if($_SESSION["s"]["user"]["typ"] == 'user') { + + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_dns_record FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Check if the user may add another mailbox. + if($client["limit_dns_record"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM dns_rr WHERE sys_groupid = $client_group_id"); + if($tmp["number"] >= $client["limit_dns_record"]) { + $app->error($app->tform->wordbook["limit_dns_record_txt"]); + } + } + } + + parent::onShowNew(); + } + + function onSubmit() { + global $app, $conf; + + // Get the parent soa record of the domain + $soa = $app->db->queryOneRecord("SELECT * FROM dns_soa WHERE id = '".intval($_POST["zone"])."' AND ".$app->tform->getAuthSQL('r')); + + // Check if Domain belongs to user + if($soa["id"] != $_POST["zone"]) $app->tform->errorMessage .= $app->tform->wordbook["no_zone_perm"]; + + // Check the client limits, if user is not the admin + if($_SESSION["s"]["user"]["typ"] != 'admin') { // if user is not admin + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_dns_record FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Check if the user may add another mailbox. + if($this->id == 0 && $client["limit_dns_record"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM dns_rr WHERE sys_groupid = $client_group_id"); + if($tmp["number"] >= $client["limit_dns_record"]) { + $app->error($app->tform->wordbook["limit_dns_record_txt"]); + } + } + } // end if user is not admin + + + // Set the server ID of the rr record to the same server ID as the parent record. + $this->dataRecord["server_id"] = $soa["server_id"]; + + // Update the serial number and timestamp of the RR record + $soa = $app->db->queryOneRecord("SELECT serial FROM dns_rr WHERE id = ".$this->id); + $this->dataRecord["serial"] = $app->validate_dns->increase_serial($soa["serial"]); + $this->dataRecord["stamp"] = date('Y-m-d H:i:s'); + + parent::onSubmit(); + } + + function onAfterInsert() { + global $app, $conf; + + //* Set the sys_groupid of the rr record to be the same then the sys_groupid of the soa record + $soa = $app->db->queryOneRecord("SELECT sys_groupid,serial FROM dns_soa WHERE id = '".intval($this->dataRecord["zone"])."' AND ".$app->tform->getAuthSQL('r')); + $app->db->datalogUpdate('dns_rr', "sys_groupid = ".$soa['sys_groupid'], 'id', $this->id); + + //* Update the serial number of the SOA record + $soa_id = intval($_POST["zone"]); + $serial = $app->validate_dns->increase_serial($soa["serial"]); + $app->db->datalogUpdate('dns_soa', "serial = $serial", 'id', $soa_id); + } + + function onAfterUpdate() { + global $app, $conf; + + //* Update the serial number of the SOA record + $soa = $app->db->queryOneRecord("SELECT serial FROM dns_soa WHERE id = '".intval($this->dataRecord["zone"])."' AND ".$app->tform->getAuthSQL('r')); + $soa_id = intval($_POST["zone"]); + $serial = $app->validate_dns->increase_serial($soa["serial"]); + $app->db->datalogUpdate('dns_soa', "serial = $serial", 'id', $soa_id); + } +} + +$page = new page_action; +$page->onLoad(); + +?> diff --git a/interface/ispconfig/interface/dns/dns_rr_del.php b/interface/ispconfig/interface/dns/dns_rr_del.php new file mode 100644 index 0000000000000000000000000000000000000000..7a0b92d14514d7b9ef1e158cf027da0b5e51eb48 --- /dev/null +++ b/interface/ispconfig/interface/dns/dns_rr_del.php @@ -0,0 +1,51 @@ +auth->check_module_permissions('dns'); + +$app->uses("tform_actions"); +$app->tform_actions->onDelete(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/dns_soa_del.php b/interface/ispconfig/interface/dns/dns_soa_del.php new file mode 100644 index 0000000000000000000000000000000000000000..38e35bd67c2e2b91b07ac1d9dad9381947a5c63f --- /dev/null +++ b/interface/ispconfig/interface/dns/dns_soa_del.php @@ -0,0 +1,69 @@ +auth->check_module_permissions('dns'); + +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onBeforeDelete() { + global $app; $conf; + + if($app->tform->checkPerm($this->id,'d') == false) $app->error($app->lng('error_no_delete_permission')); + + // Delete all records that belog to this zone. + $records = $app->db->queryAllRecords("SELECT id FROM dns_rr WHERE zone = '".intval($this->id)."'"); + foreach($records as $rec) { + $app->db->datalogDelete('dns_rr','id',$rec['id']); + } + } +} + +$page = new page_action; +$page->onDelete(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/dns_soa_edit.php b/interface/ispconfig/interface/dns/dns_soa_edit.php new file mode 100644 index 0000000000000000000000000000000000000000..6bfad69124663f3b22b4c6edb4ce4587002adaf3 --- /dev/null +++ b/interface/ispconfig/interface/dns/dns_soa_edit.php @@ -0,0 +1,222 @@ +auth->check_module_permissions('dns'); + +// Loading classes +$app->uses('tpl,tform,tform_actions,validate_dns'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onShowNew() { + global $app, $conf; + + // we will check only users, not admins + if($_SESSION["s"]["user"]["typ"] == 'user') { + if(!$app->tform->checkClientLimit('limit_dns_zone')) { + $app->error($app->tform->wordbook["limit_dns_zone_txt"]); + } + if(!$app->tform->checkResellerLimit('limit_dns_zone')) { + $app->error('Reseller: '.$app->tform->wordbook["limit_dns_zone_txt"]); + } + } + + parent::onShowNew(); + } + + function onShowEnd() { + global $app, $conf; + + // If user is admin, we will allow him to select to whom this record belongs + if($_SESSION["s"]["user"]["typ"] == 'admin') { + // Getting Domains of the user + $sql = "SELECT groupid, name FROM sys_group WHERE client_id > 0 ORDER by name"; + $clients = $app->db->queryAllRecords($sql); + $client_select = ''; + if($_SESSION["s"]["user"]["typ"] == 'admin') $client_select .= ""; + $tmp_data_record = $app->tform->getDataRecord($this->id); + if(is_array($clients)) { + foreach( $clients as $client) { + $selected = ($client["groupid"] == @$tmp_data_record["sys_groupid"])?'SELECTED':''; + $client_select .= "\r\n"; + } + } + $app->tpl->setVar("client_group_id",$client_select); + } else if($app->auth->has_clients($_SESSION['s']['user']['userid'])) { + + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT client.client_id, client.contact_name FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Fill the client select field + $sql = "SELECT groupid, name FROM sys_group, client WHERE sys_group.client_id = client.client_id AND client.parent_client_id = ".$client['client_id']." ORDER BY name"; + $clients = $app->db->queryAllRecords($sql); + $tmp = $app->db->queryOneRecord("SELECT groupid FROM sys_group WHERE client_id = ".$client['client_id']); + $client_select = ''; + $tmp_data_record = $app->tform->getDataRecord($this->id); + if(is_array($clients)) { + foreach( $clients as $client) { + $selected = @($client["groupid"] == $tmp_data_record["sys_groupid"])?'SELECTED':''; + $client_select .= "\r\n"; + } + } + $app->tpl->setVar("client_group_id",$client_select); + + } + + parent::onShowEnd(); + } + + function onSubmit() { + global $app, $conf; + + if($_SESSION["s"]["user"]["typ"] != 'admin') { + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_dns_zone, default_dnsserver FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // When the record is updated + if($this->id > 0) { + // restore the server ID if the user is not admin and record is edited + $tmp = $app->db->queryOneRecord("SELECT server_id FROM dns_soa WHERE id = ".intval($this->id)); + $this->dataRecord["server_id"] = $tmp["server_id"]; + unset($tmp); + // When the record is inserted + } else { + // set the server ID to the default dnsserver of the client + $this->dataRecord["server_id"] = $client["default_dnsserver"]; + + // Check if the user may add another maildomain. + if($client["limit_dns_zone"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM dns_soa WHERE sys_groupid = $client_group_id"); + if($tmp["number"] >= $client["limit_dns_zone"]) { + $app->error($app->tform->wordbook["limit_dns_zone_txt"]); + } + } + } + } + + /* + // Update the serial number of the SOA record + $soa = $app->db->queryOneRecord("SELECT serial FROM dns_soa WHERE id = ".$this->id); + $this->dataRecord["serial"] = $app->validate_dns->increase_serial($soa["serial"]); + */ + + + //* Check if soa, ns and mbox have a dot at the end + if(strlen($this->dataRecord["origin"]) > 0 && substr($this->dataRecord["origin"],-1,1) != '.') $this->dataRecord["origin"] .= '.'; + if(strlen($this->dataRecord["ns"]) > 0 && substr($this->dataRecord["ns"],-1,1) != '.') $this->dataRecord["ns"] .= '.'; + if(strlen($this->dataRecord["mbox"]) > 0 && substr($this->dataRecord["mbox"],-1,1) != '.') $this->dataRecord["mbox"] .= '.'; + + //* Replace @ in mbox + if(stristr($this->dataRecord["mbox"],'@')) { + $this->dataRecord["mbox"] = str_replace('@','.',$this->dataRecord["mbox"]); + } + + + parent::onSubmit(); + } + + function onAfterInsert() { + global $app, $conf; + + // make sure that the record belongs to the client group and not the admin group when a dmin inserts it + if($_SESSION["s"]["user"]["typ"] == 'admin' && isset($this->dataRecord["client_group_id"])) { + $client_group_id = intval($this->dataRecord["client_group_id"]); + $app->db->query("UPDATE dns_soa SET sys_groupid = $client_group_id WHERE id = ".$this->id); + // And we want to update all rr records too, that belong to this record + $app->db->query("UPDATE dns_rr SET sys_groupid = $client_group_id WHERE zone = ".$this->id); + } + if($app->auth->has_clients($_SESSION['s']['user']['userid']) && isset($this->dataRecord["client_group_id"])) { + $client_group_id = intval($this->dataRecord["client_group_id"]); + $app->db->query("UPDATE dns_soa SET sys_groupid = $client_group_id WHERE id = ".$this->id); + // And we want to update all rr records too, that belong to this record + $app->db->query("UPDATE dns_rr SET sys_groupid = $client_group_id WHERE zone = ".$this->id); + } + + } + + function onAfterUpdate() { + global $app, $conf; + + $tmp = $app->db->diffrec($this->oldDataRecord,$app->tform->getDataRecord($this->id)); + if($tmp['diff_num'] > 0) { + // Update the serial number of the SOA record + $soa = $app->db->queryOneRecord("SELECT serial FROM dns_soa WHERE id = ".$this->id); + $app->db->query("UPDATE dns_soa SET serial = '".$app->validate_dns->increase_serial($soa["serial"])."' WHERE id = ".$this->id); + } + + // make sure that the record belongs to the client group and not the admin group when a dmin inserts it + if($_SESSION["s"]["user"]["typ"] == 'admin' && isset($this->dataRecord["client_group_id"])) { + $client_group_id = intval($this->dataRecord["client_group_id"]); + $app->db->query("UPDATE dns_soa SET sys_groupid = $client_group_id WHERE id = ".$this->id); + // And we want to update all rr records too, that belong to this record + $app->db->query("UPDATE dns_rr SET sys_groupid = $client_group_id WHERE zone = ".$this->id); + } + if($app->auth->has_clients($_SESSION['s']['user']['userid']) && isset($this->dataRecord["client_group_id"])) { + $client_group_id = intval($this->dataRecord["client_group_id"]); + $app->db->query("UPDATE dns_soa SET sys_groupid = $client_group_id WHERE id = ".$this->id); + // And we want to update all rr records too, that belong to this record + $app->db->query("UPDATE dns_rr SET sys_groupid = $client_group_id WHERE zone = ".$this->id); + } + + //** When the client group has changed, change also the owner of the record if the owner is not the admin user + if($this->oldDataRecord["client_group_id"] != $this->dataRecord["client_group_id"] && $this->dataRecord["sys_userid"] != 1) { + $client_group_id = intval($this->dataRecord["client_group_id"]); + $tmp = $app->db->queryOneREcord("SELECT userid FROM sys_user WHERE default_group = ".$client_group_id); + if($tmp["userid"] > 0) { + $app->db->query("UPDATE dns_soa SET sys_userid = ".$tmp["userid"]." WHERE id = ".$this->id); + $app->db->query("UPDATE dns_rr SET sys_userid = ".$tmp["userid"]." WHERE zone = ".$this->id); + } + } + + } + +} + +$page = new page_action; +$page->onLoad(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/dns_soa_list.php b/interface/ispconfig/interface/dns/dns_soa_list.php new file mode 100644 index 0000000000000000000000000000000000000000..7b2981a5b23f021a6a50f297078867e71ff02593 --- /dev/null +++ b/interface/ispconfig/interface/dns/dns_soa_list.php @@ -0,0 +1,25 @@ +auth->check_module_permissions('dns'); + +$app->uses('listform_actions'); +// $app->listform_actions->SQLExtWhere = "access = 'REJECT'"; + +$app->listform_actions->SQLOrderBy = 'ORDER BY origin'; +$app->listform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/dns_srv_edit.php b/interface/ispconfig/interface/dns/dns_srv_edit.php new file mode 100644 index 0000000000000000000000000000000000000000..15af1e207b73d000d7eec62bfc57cbaa0891b7d5 --- /dev/null +++ b/interface/ispconfig/interface/dns/dns_srv_edit.php @@ -0,0 +1,138 @@ +auth->check_module_permissions('dns'); + +// Loading classes +$app->uses('tpl,tform,tform_actions,validate_dns'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onShowNew() { + global $app, $conf; + + // we will check only users, not admins + if($_SESSION["s"]["user"]["typ"] == 'user') { + + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_dns_record FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Check if the user may add another mailbox. + if($client["limit_dns_record"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM dns_rr WHERE sys_groupid = $client_group_id"); + if($tmp["number"] >= $client["limit_dns_record"]) { + $app->error($app->tform->wordbook["limit_dns_record_txt"]); + } + } + } + + parent::onShowNew(); + } + + function onSubmit() { + global $app, $conf; + + // Get the parent soa record of the domain + $soa = $app->db->queryOneRecord("SELECT * FROM dns_soa WHERE id = '".intval($_POST["zone"])."' AND ".$app->tform->getAuthSQL('r')); + + // Check if Domain belongs to user + if($soa["id"] != $_POST["zone"]) $app->tform->errorMessage .= $app->tform->wordbook["no_zone_perm"]; + + // Check the client limits, if user is not the admin + if($_SESSION["s"]["user"]["typ"] != 'admin') { // if user is not admin + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_dns_record FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Check if the user may add another mailbox. + if($this->id == 0 && $client["limit_dns_record"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM dns_rr WHERE sys_groupid = $client_group_id"); + if($tmp["number"] >= $client["limit_dns_record"]) { + $app->error($app->tform->wordbook["limit_dns_record_txt"]); + } + } + } // end if user is not admin + + + // Set the server ID of the rr record to the same server ID as the parent record. + $this->dataRecord["server_id"] = $soa["server_id"]; + + // Update the serial number and timestamp of the RR record + $soa = $app->db->queryOneRecord("SELECT serial FROM dns_rr WHERE id = ".$this->id); + $this->dataRecord["serial"] = $app->validate_dns->increase_serial($soa["serial"]); + $this->dataRecord["stamp"] = date('Y-m-d H:i:s'); + + parent::onSubmit(); + } + + function onAfterInsert() { + global $app, $conf; + + //* Set the sys_groupid of the rr record to be the same then the sys_groupid of the soa record + $soa = $app->db->queryOneRecord("SELECT sys_groupid,serial FROM dns_soa WHERE id = '".intval($this->dataRecord["zone"])."' AND ".$app->tform->getAuthSQL('r')); + $app->db->datalogUpdate('dns_rr', "sys_groupid = ".$soa['sys_groupid'], 'id', $this->id); + + //* Update the serial number of the SOA record + $soa_id = intval($_POST["zone"]); + $serial = $app->validate_dns->increase_serial($soa["serial"]); + $app->db->datalogUpdate('dns_soa', "serial = $serial", 'id', $soa_id); + } + + function onAfterUpdate() { + global $app, $conf; + + //* Update the serial number of the SOA record + $soa = $app->db->queryOneRecord("SELECT serial FROM dns_soa WHERE id = '".intval($this->dataRecord["zone"])."' AND ".$app->tform->getAuthSQL('r')); + $soa_id = intval($_POST["zone"]); + $serial = $app->validate_dns->increase_serial($soa["serial"]); + $app->db->datalogUpdate('dns_soa', "serial = $serial", 'id', $soa_id); + } +} + +$page = new page_action; +$page->onLoad(); + +?> diff --git a/interface/ispconfig/interface/dns/dns_template_del.php b/interface/ispconfig/interface/dns/dns_template_del.php new file mode 100644 index 0000000000000000000000000000000000000000..5aa1ff748f9ad52f48e5017da17c1accd309920e --- /dev/null +++ b/interface/ispconfig/interface/dns/dns_template_del.php @@ -0,0 +1,58 @@ +auth->check_module_permissions('dns'); + +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + +} + +$page = new page_action; +$page->onDelete(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/dns_template_edit.php b/interface/ispconfig/interface/dns/dns_template_edit.php new file mode 100644 index 0000000000000000000000000000000000000000..7d84d5ca8ea6736139e1b0ebf06eda97aed9bca6 --- /dev/null +++ b/interface/ispconfig/interface/dns/dns_template_edit.php @@ -0,0 +1,60 @@ +auth->check_module_permissions('dns'); + +// Loading classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +if($_SESSION["s"]["user"]["typ"] != 'admin') die('Access denied for non admin users.'); + +class page_action extends tform_actions { + +} + +$page = new page_action; +$page->onLoad(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/dns_template_list.php b/interface/ispconfig/interface/dns/dns_template_list.php new file mode 100644 index 0000000000000000000000000000000000000000..4cde9a01330b2008f37c1b897f5ca05567ed02f2 --- /dev/null +++ b/interface/ispconfig/interface/dns/dns_template_list.php @@ -0,0 +1,24 @@ +auth->check_module_permissions('dns'); + +$app->uses('listform_actions'); +// $app->listform_actions->SQLExtWhere = "access = 'REJECT'"; + +$app->listform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/dns_txt_edit.php b/interface/ispconfig/interface/dns/dns_txt_edit.php new file mode 100644 index 0000000000000000000000000000000000000000..2d5cecdc98784173ee31a9ac5d0eabd267bc99eb --- /dev/null +++ b/interface/ispconfig/interface/dns/dns_txt_edit.php @@ -0,0 +1,138 @@ +auth->check_module_permissions('dns'); + +// Loading classes +$app->uses('tpl,tform,tform_actions,validate_dns'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onShowNew() { + global $app, $conf; + + // we will check only users, not admins + if($_SESSION["s"]["user"]["typ"] == 'user') { + + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_dns_record FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Check if the user may add another mailbox. + if($client["limit_dns_record"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM dns_rr WHERE sys_groupid = $client_group_id"); + if($tmp["number"] >= $client["limit_dns_record"]) { + $app->error($app->tform->wordbook["limit_dns_record_txt"]); + } + } + } + + parent::onShowNew(); + } + + function onSubmit() { + global $app, $conf; + + // Get the parent soa record of the domain + $soa = $app->db->queryOneRecord("SELECT * FROM dns_soa WHERE id = '".intval($_POST["zone"])."' AND ".$app->tform->getAuthSQL('r')); + + // Check if Domain belongs to user + if($soa["id"] != $_POST["zone"]) $app->tform->errorMessage .= $app->tform->wordbook["no_zone_perm"]; + + // Check the client limits, if user is not the admin + if($_SESSION["s"]["user"]["typ"] != 'admin') { // if user is not admin + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_dns_record FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Check if the user may add another mailbox. + if($this->id == 0 && $client["limit_dns_record"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM dns_rr WHERE sys_groupid = $client_group_id"); + if($tmp["number"] >= $client["limit_dns_record"]) { + $app->error($app->tform->wordbook["limit_dns_record_txt"]); + } + } + } // end if user is not admin + + + // Set the server ID of the rr record to the same server ID as the parent record. + $this->dataRecord["server_id"] = $soa["server_id"]; + + // Update the serial number and timestamp of the RR record + $soa = $app->db->queryOneRecord("SELECT serial FROM dns_rr WHERE id = ".$this->id); + $this->dataRecord["serial"] = $app->validate_dns->increase_serial($soa["serial"]); + $this->dataRecord["stamp"] = date('Y-m-d H:i:s'); + + parent::onSubmit(); + } + + function onAfterInsert() { + global $app, $conf; + + //* Set the sys_groupid of the rr record to be the same then the sys_groupid of the soa record + $soa = $app->db->queryOneRecord("SELECT sys_groupid,serial FROM dns_soa WHERE id = '".intval($this->dataRecord["zone"])."' AND ".$app->tform->getAuthSQL('r')); + $app->db->datalogUpdate('dns_rr', "sys_groupid = ".$soa['sys_groupid'], 'id', $this->id); + + //* Update the serial number of the SOA record + $soa_id = intval($_POST["zone"]); + $serial = $app->validate_dns->increase_serial($soa["serial"]); + $app->db->datalogUpdate('dns_soa', "serial = $serial", 'id', $soa_id); + } + + function onAfterUpdate() { + global $app, $conf; + + //* Update the serial number of the SOA record + $soa = $app->db->queryOneRecord("SELECT serial FROM dns_soa WHERE id = '".intval($this->dataRecord["zone"])."' AND ".$app->tform->getAuthSQL('r')); + $soa_id = intval($_POST["zone"]); + $serial = $app->validate_dns->increase_serial($soa["serial"]); + $app->db->datalogUpdate('dns_soa', "serial = $serial", 'id', $soa_id); + } +} + +$page = new page_action; +$page->onLoad(); + +?> diff --git a/interface/ispconfig/interface/dns/dns_wizard.php b/interface/ispconfig/interface/dns/dns_wizard.php new file mode 100644 index 0000000000000000000000000000000000000000..2c985eb94132f7d604ccd12ac94fe29f710fe42b --- /dev/null +++ b/interface/ispconfig/interface/dns/dns_wizard.php @@ -0,0 +1,274 @@ +auth->check_module_permissions('dns'); + + +// Loading the template +$app->uses('tpl,validate_dns'); +$app->tpl->newTemplate("form.tpl.htm"); +$app->tpl->setInclude('content_tpl','templates/dns_wizard.htm'); +$app->load_language_file('/web/dns/lib/lang/'.$_SESSION['s']['language'].'_dns_wizard.lng'); + +// import variables +$template_id = (isset($_POST['template_id']))?intval($_POST['template_id']):0; +$sys_groupid = (isset($_POST['client_group_id']))?intval($_POST['client_group_id']):0; + +// get the correct server_id +if($_SESSION['s']['user']['typ'] == 'admin') { + $server_id = (isset($_POST['server_id']))?intval($_POST['server_id']):1; +} else { + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT default_dnsserver FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + $server_id = $client["default_dnsserver"]; +} + + +// Load the templates +$records = $app->db->queryAllRecords("SELECT * FROM dns_template WHERE visible = 'Y'"); +$template_id_option = ''; +$n = 0; +foreach($records as $rec){ + $checked = ($rec['template_id'] == $template_id)?' SELECTED':''; + $template_id_option .= ''; + if($n == 0 && $template_id == 0) $template_id = $rec['template_id']; + $n++; +} +unset($n); +$app->tpl->setVar("template_id_option",$template_id_option); + +// If the user is administrator +if($_SESSION['s']['user']['typ'] == 'admin') { + + // Load the list of servers + $records = $app->db->queryAllRecords("SELECT server_id, server_name FROM server WHERE dns_server = 1 ORDER BY server_name"); + $server_id_option = ''; + foreach($records as $rec){ + $checked = ($rec['server_id'] == $server_id)?' SELECTED':''; + $server_id_option .= ''; + } + $app->tpl->setVar("server_id",$server_id_option); + + // load the list of clients + $sql = "SELECT groupid, name FROM sys_group WHERE client_id > 0 ORDER BY name"; + $clients = $app->db->queryAllRecords($sql); + $client_select = ''; + if($_SESSION["s"]["user"]["typ"] == 'admin') $client_select .= ""; + if(is_array($clients)) { + foreach( $clients as $client) { + $selected = ($client["groupid"] == $sys_groupid)?'SELECTED':''; + $client_select .= "\r\n"; + } + } + + $app->tpl->setVar("client_group_id",$client_select); +} + +if ($_SESSION["s"]["user"]["typ"] != 'admin' && $app->auth->has_clients($_SESSION['s']['user']['userid'])) { + + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT client.client_id, contact_name FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + + // load the list of clients + $sql = "SELECT groupid, name FROM sys_group, client WHERE sys_group.client_id = client.client_id AND client.parent_client_id = ".$client['client_id']; + $clients = $app->db->queryAllRecords($sql); + $tmp = $app->db->queryOneRecord("SELECT groupid FROM sys_group WHERE client_id = ".$client['client_id']); + $client_select = ''; + if(is_array($clients)) { + foreach( $clients as $client) { + $selected = ($client["groupid"] == $sys_groupid)?'SELECTED':''; + $client_select .= "\r\n"; + } + } + + $app->tpl->setVar("client_group_id",$client_select); +} + + +$template_record = $app->db->queryOneRecord("SELECT * FROM dns_template WHERE template_id = '$template_id'"); +$fields = explode(',',$template_record['fields']); +if(is_array($fields)) { + foreach($fields as $field) { + $app->tpl->setVar($field."_VISIBLE",1); + $field = strtolower($field); + $app->tpl->setVar($field,$_POST[$field]); + } +} + +if($_POST['create'] == 1) { + + $error = ''; + + if(isset($_POST['domain']) && $_POST['domain'] == '') $error .= $app->lng('error_domain_empty').'
'; + if(isset($_POST['ip']) && $_POST['ip'] == '') $error .= $app->lng('error_ip_empty').'
'; + if(isset($_POST['ns1']) && $_POST['ns1'] == '') $error .= $app->lng('error_ns1_empty').'
'; + if(isset($_POST['ns2']) && $_POST['ns2'] == '') $error .= $app->lng('error_ns2_empty').'
'; + if(isset($_POST['email']) && $_POST['email'] == '') $error .= $app->lng('error_email_empty').'
'; + + if(isset($_POST['domain']) && !preg_match('/^[\w\.\-]{2,64}\.[a-zA-Z]{2,10}[\.]{0,1}$/',$_POST['domain'])) $error .= $app->lng('error_domain_regex').'
'; + if(isset($_POST['ns1']) && !preg_match('/^[\w\.\-]{2,64}\.[a-zA-Z]{2,10}[\.]{0,1}$/',$_POST['ns1'])) $error .= $app->lng('error_ns1_regex').'
'; + if(isset($_POST['ns2']) && !preg_match('/^[\w\.\-]{2,64}\.[a-zA-Z]{2,10}[\.]{0,1}$/',$_POST['ns2'])) $error .= $app->lng('error_ns2_regex').'
'; + if(isset($_POST['email']) && !preg_match('/^\w+[\w.-]*\w+@\w+[\w.-]*\w+\.[a-z]{2,10}$/i',$_POST['email'])) $error .= $app->lng('error_email_regex').'
'; + + // make sure that the record belongs to the clinet group and not the admin group when a dmin inserts it + if($_SESSION["s"]["user"]["typ"] == 'admin' && isset($_POST['client_group_id'])) { + $sys_groupid = intval($_POST['client_group_id']); + } elseif($app->auth->has_clients($_SESSION['s']['user']['userid']) && isset($_POST['client_group_id'])) { + $sys_groupid = intval($_POST['client_group_id']); + } else { + $sys_groupid = $_SESSION["s"]["user"]["default_group"]; + } + + $tform_def_file = "form/dns_soa.tform.php"; + $app->uses('tform'); + $app->tform->loadFormDef($tform_def_file); + + if($_SESSION['s']['user']['typ'] != 'admin') { + if(!$app->tform->checkClientLimit('limit_dns_zone')) { + $error .= $app->tform->wordbook["limit_dns_zone_txt"]; + } + if(!$app->tform->checkResellerLimit('limit_dns_zone')) { + $error .= $app->tform->wordbook["limit_dns_zone_txt"]; + } + } + + + // replace template placeholders + $tpl_content = $template_record['template']; + if($_POST['domain'] != '') $tpl_content = str_replace('{DOMAIN}',$_POST['domain'],$tpl_content); + if($_POST['ip'] != '') $tpl_content = str_replace('{IP}',$_POST['ip'],$tpl_content); + if($_POST['ns1'] != '') $tpl_content = str_replace('{NS1}',$_POST['ns1'],$tpl_content); + if($_POST['ns2'] != '') $tpl_content = str_replace('{NS2}',$_POST['ns2'],$tpl_content); + if($_POST['email'] != '') $tpl_content = str_replace('{EMAIL}',$_POST['email'],$tpl_content); + + // Parse the template + $tpl_rows = explode("\n",$tpl_content); + $section = ''; + $vars = array(); + $dns_rr = array(); + foreach($tpl_rows as $row) { + $row = trim($row); + if(substr($row,0,1) == '[') { + if($row == '[ZONE]') { + $section = 'zone'; + } elseif($row == '[DNS_RECORDS]') { + $section = 'dns_records'; + } else { + die('Unknown section type'); + } + } else { + if($row != '') { + // Handle zone section + if($section == 'zone') { + $parts = explode('=',$row); + $key = trim($parts[0]); + $val = trim($parts[1]); + if($key != '') $vars[$key] = $val; + } + // Handle DNS Record rows + if($section == 'dns_records') { + $parts = explode('|',$row); + $dns_rr[] = array( + 'name' => $app->db->quote($parts[1]), + 'type' => $app->db->quote($parts[0]), + 'data' => $app->db->quote($parts[2]), + 'aux' => $app->db->quote($parts[3]), + 'ttl' => $app->db->quote($parts[4]) + ); + } + } + } + + } // end foreach + + if($vars['origin'] == '') $error .= $app->lng('error_origin_empty').'
'; + if($vars['ns'] == '') $error .= $app->lng('error_ns_empty').'
'; + if($vars['mbox'] == '') $error .= $app->lng('error_mbox_empty').'
'; + if($vars['refresh'] == '') $error .= $app->lng('error_refresh_empty').'
'; + if($vars['retry'] == '') $error .= $app->lng('error_retry_empty').'
'; + if($vars['expire'] == '') $error .= $app->lng('error_expire_empty').'
'; + if($vars['minimum'] == '') $error .= $app->lng('error_minimum_empty').'
'; + if($vars['ttl'] == '') $error .= $app->lng('error_ttl_empty').'
'; + + if($error == '') { + // Insert the soa record + $sys_userid = $_SESSION['s']['user']['userid']; + $origin = $app->db->quote($vars['origin']); + $ns = $app->db->quote($vars['ns']); + $mbox = $app->db->quote(str_replace('@','.',$vars['mbox'])); + $refresh = $app->db->quote($vars['refresh']); + $retry = $app->db->quote($vars['retry']); + $expire = $app->db->quote($vars['expire']); + $minimum = $app->db->quote($vars['minimum']); + $ttl = $app->db->quote($vars['ttl']); + $xfer = $app->db->quote($vars['xfer']); + $serial = $app->validate_dns->increase_serial(0); + + $insert_data = "(`sys_userid`, `sys_groupid`, `sys_perm_user`, `sys_perm_group`, `sys_perm_other`, `server_id`, `origin`, `ns`, `mbox`, `serial`, `refresh`, `retry`, `expire`, `minimum`, `ttl`, `active`, `xfer`) VALUES + ('$sys_userid', '$sys_groupid', 'riud', 'riud', '', '$server_id', '$origin', '$ns', '$mbox', '$serial', '$refresh', '$retry', '$expire', '$minimum', '$ttl', 'Y', '$xfer')"; + $dns_soa_id = $app->db->datalogInsert('dns_soa', $insert_data, 'id'); + + // Insert the dns_rr records + if(is_array($dns_rr) && $dns_soa_id > 0) { + foreach($dns_rr as $rr) { + $insert_data = "(`sys_userid`, `sys_groupid`, `sys_perm_user`, `sys_perm_group`, `sys_perm_other`, `server_id`, `zone`, `name`, `type`, `data`, `aux`, `ttl`, `active`) VALUES + ('$sys_userid', '$sys_groupid', 'riud', 'riud', '', '$server_id', '$dns_soa_id', '$rr[name]', '$rr[type]', '$rr[data]', '$rr[aux]', '$rr[ttl]', 'Y')"; + $dns_rr_id = $app->db->datalogInsert('dns_rr', $insert_data, 'id'); + } + } + + header("Location: dns_soa_list.php"); + exit; + + } else { + $app->tpl->setVar("error",$error); + } + +} + + + +$app->tpl->setVar("title",'DNS Wizard'); + +$lng_file = 'lib/lang/'.$_SESSION['s']['language'].'_dns_wizard.lng'; +include($lng_file); +$app->tpl->setVar($wb); + +$app->tpl_defaults(); +$app->tpl->pparse(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/form/dns_a.tform.php b/interface/ispconfig/interface/dns/form/dns_a.tform.php new file mode 100644 index 0000000000000000000000000000000000000000..5cb7475709e94177588d0cad5afcd58f2bfdd0fc --- /dev/null +++ b/interface/ispconfig/interface/dns/form/dns_a.tform.php @@ -0,0 +1,159 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['dns'] = array ( + 'title' => "DNS A", + 'width' => 100, + 'template' => "templates/dns_a_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'zone' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => @intval($_REQUEST["zone"]), + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'name' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'REGEX', + 'regex' => '/^[\w\.\-\*]{0,64}$/', + 'errmsg'=> 'name_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'type' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => 'A', + 'value' => '', + 'width' => '5', + 'maxlength' => '5' + ), + 'data' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'data_error_empty'), + 1 => array ( 'type' => 'REGEX', + 'regex' => '/^([1-9]{1}|[1-9]\d|[1]\d\d|2[0-4]\d|25[0-5])\.(\d{1}|[1-9]\d|[1]\d\d|2[0-4]\d|25[0-5])\.(\d{1}|[1-9]\d|[1]\d\d|2[0-4]\d|25[0-5])\.(\d{1}|[1-9]\d|[1]\d\d|2[0-4]\d|25[0-5])$/', + 'errmsg'=> 'data_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + /* + 'aux' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '0', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + */ + 'ttl' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '86400', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + 'active' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'Y', + 'value' => array(0 => 'N',1 => 'Y') + ), + 'stamp' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'serial' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/form/dns_aaaa.tform.php b/interface/ispconfig/interface/dns/form/dns_aaaa.tform.php new file mode 100644 index 0000000000000000000000000000000000000000..0a9e02123a73612d14d867a011ed1a5c49994a13 --- /dev/null +++ b/interface/ispconfig/interface/dns/form/dns_aaaa.tform.php @@ -0,0 +1,159 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['dns'] = array ( + 'title' => "DNS AAAA", + 'width' => 100, + 'template' => "templates/dns_aaaa_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'zone' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => @intval($_REQUEST["zone"]), + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'name' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'REGEX', + 'regex' => '/^[\w\.\-\*]{0,64}$/', + 'errmsg'=> 'name_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'type' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => 'AAAA', + 'value' => '', + 'width' => '5', + 'maxlength' => '5' + ), + 'data' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'data_error_empty'), + 1 => array ( 'type' => 'REGEX', + 'regex' => '/^\s*((([0-9A-Fa-f]{1,4}:){7}(([0-9A-Fa-f]{1,4})|:))|(([0-9A-Fa-f]{1,4}:){6}(:|((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})|(:[0-9A-Fa-f]{1,4})))|(([0-9A-Fa-f]{1,4}:){5}((:((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|((:[0-9A-Fa-f]{1,4}){1,2})))|(([0-9A-Fa-f]{1,4}:){4}(:[0-9A-Fa-f]{1,4}){0,1}((:((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|((:[0-9A-Fa-f]{1,4}){1,2})))|(([0-9A-Fa-f]{1,4}:){3}(:[0-9A-Fa-f]{1,4}){0,2}((:((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|((:[0-9A-Fa-f]{1,4}){1,2})))|(([0-9A-Fa-f]{1,4}:){2}(:[0-9A-Fa-f]{1,4}){0,3}((:((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|((:[0-9A-Fa-f]{1,4}){1,2})))|(([0-9A-Fa-f]{1,4}:)(:[0-9A-Fa-f]{1,4}){0,4}((:((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|((:[0-9A-Fa-f]{1,4}){1,2})))|(:(:[0-9A-Fa-f]{1,4}){0,5}((:((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|((:[0-9A-Fa-f]{1,4}){1,2})))|(((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})))(%.+)?\s*$/', + 'errmsg'=> 'data_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + /* + 'aux' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '0', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + */ + 'ttl' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '86400', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + 'active' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'Y', + 'value' => array(0 => 'N',1 => 'Y') + ), + 'stamp' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'serial' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/form/dns_alias.tform.php b/interface/ispconfig/interface/dns/form/dns_alias.tform.php new file mode 100644 index 0000000000000000000000000000000000000000..37ebc7793c52bd1ed5b2c8d944fafa89ee57e6cf --- /dev/null +++ b/interface/ispconfig/interface/dns/form/dns_alias.tform.php @@ -0,0 +1,161 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['dns'] = array ( + 'title' => "DNS ALIAS", + 'width' => 100, + 'template' => "templates/dns_alias_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'zone' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => @intval($_REQUEST["zone"]), + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'name' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'name_error_empty'), + 1 => array ( 'type' => 'REGEX', + 'regex' => '/^[\w\.\-]{1,64}$/', + 'errmsg'=> 'name_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'type' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => 'ALIAS', + 'value' => '', + 'width' => '5', + 'maxlength' => '5' + ), + 'data' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'data_error_empty'), + 1 => array ( 'type' => 'REGEX', + 'regex' => '/^[\w\.\-]{1,64}$/', + 'errmsg'=> 'data_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + /* + 'aux' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '0', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + */ + 'ttl' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '86400', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + 'active' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'Y', + 'value' => array(0 => 'N',1 => 'Y') + ), + 'stamp' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'serial' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/form/dns_cname.tform.php b/interface/ispconfig/interface/dns/form/dns_cname.tform.php new file mode 100644 index 0000000000000000000000000000000000000000..6409b975070006a29c9a9f4b37eac3b77b7724aa --- /dev/null +++ b/interface/ispconfig/interface/dns/form/dns_cname.tform.php @@ -0,0 +1,159 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['dns'] = array ( + 'title' => "DNS CNAME", + 'width' => 100, + 'template' => "templates/dns_cname_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'zone' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => @intval($_REQUEST["zone"]), + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'name' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'REGEX', + 'regex' => '/^[\w\.\-\*]{0,64}$/', + 'errmsg'=> 'name_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'type' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => 'CNAME', + 'value' => '', + 'width' => '5', + 'maxlength' => '5' + ), + 'data' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'data_error_empty'), + 1 => array ( 'type' => 'REGEX', + 'regex' => '/^[\w\.\-]{1,64}$/', + 'errmsg'=> 'data_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + /* + 'aux' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '0', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + */ + 'ttl' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '86400', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + 'active' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'Y', + 'value' => array(0 => 'N',1 => 'Y') + ), + 'stamp' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'serial' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/form/dns_hinfo.tform.php b/interface/ispconfig/interface/dns/form/dns_hinfo.tform.php new file mode 100644 index 0000000000000000000000000000000000000000..fd8facf2c8ec2323c24d197f3c58d037bd3c3ebe --- /dev/null +++ b/interface/ispconfig/interface/dns/form/dns_hinfo.tform.php @@ -0,0 +1,158 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['dns'] = array ( + 'title' => "DNS HINFO", + 'width' => 100, + 'template' => "templates/dns_hinfo_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'zone' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => @intval($_REQUEST["zone"]), + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'name' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'name_error_empty'), + 1 => array ( 'type' => 'REGEX', + 'regex' => '/^[\w\.\-]{1,64}$/', + 'errmsg'=> 'name_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'type' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => 'HINFO', + 'value' => '', + 'width' => '5', + 'maxlength' => '5' + ), + 'data' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'data_error_empty'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + /* + 'aux' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '0', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + */ + 'ttl' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '86400', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + 'active' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'Y', + 'value' => array(0 => 'N',1 => 'Y') + ), + 'stamp' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'serial' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/form/dns_mx.tform.php b/interface/ispconfig/interface/dns/form/dns_mx.tform.php new file mode 100644 index 0000000000000000000000000000000000000000..7a30d4e418543559c9b14af96f99fd96093a99fd --- /dev/null +++ b/interface/ispconfig/interface/dns/form/dns_mx.tform.php @@ -0,0 +1,159 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['dns'] = array ( + 'title' => "DNS mx", + 'width' => 100, + 'template' => "templates/dns_mx_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'zone' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => @intval($_REQUEST["zone"]), + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'name' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'REGEX', + 'regex' => '/^[\w\.\-]{0,255}$/', + 'errmsg'=> 'name_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'type' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => 'MX', + 'value' => '', + 'width' => '5', + 'maxlength' => '5' + ), + 'data' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'data_error_empty'), + 1 => array ( 'type' => 'REGEX', + 'regex' => '/^[\w\.\-]{1,255}$/', + 'errmsg'=> 'data_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + + 'aux' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '10', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + + 'ttl' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '86400', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + 'active' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'Y', + 'value' => array(0 => 'N',1 => 'Y') + ), + 'stamp' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'serial' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/form/dns_ns.tform.php b/interface/ispconfig/interface/dns/form/dns_ns.tform.php new file mode 100644 index 0000000000000000000000000000000000000000..2229bac377a49a1b698dfad986fb4e1a1c2d7fc7 --- /dev/null +++ b/interface/ispconfig/interface/dns/form/dns_ns.tform.php @@ -0,0 +1,159 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['dns'] = array ( + 'title' => "DNS ns", + 'width' => 100, + 'template' => "templates/dns_ns_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'zone' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => @intval($_REQUEST["zone"]), + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'name' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'REGEX', + 'regex' => '/^[\w\.\-]{0,64}$/', + 'errmsg'=> 'name_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'type' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => 'NS', + 'value' => '', + 'width' => '5', + 'maxlength' => '5' + ), + 'data' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'data_error_empty'), + 1 => array ( 'type' => 'REGEX', + 'regex' => '/^[\w\.\-]{1,64}$/', + 'errmsg'=> 'data_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + /* + 'aux' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '0', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + */ + 'ttl' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '86400', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + 'active' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'Y', + 'value' => array(0 => 'N',1 => 'Y') + ), + 'stamp' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'serial' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/form/dns_ptr.tform.php b/interface/ispconfig/interface/dns/form/dns_ptr.tform.php new file mode 100644 index 0000000000000000000000000000000000000000..c7521e7f841aaffb0d24f37f4c918594ac959d83 --- /dev/null +++ b/interface/ispconfig/interface/dns/form/dns_ptr.tform.php @@ -0,0 +1,159 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['dns'] = array ( + 'title' => "DNS ptr", + 'width' => 100, + 'template' => "templates/dns_ptr_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'zone' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => @intval($_REQUEST["zone"]), + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'name' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'REGEX', + 'regex' => '/^[\w\.\-]{1,64}$/', + 'errmsg'=> 'name_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'type' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => 'PTR', + 'value' => '', + 'width' => '5', + 'maxlength' => '5' + ), + 'data' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'data_error_empty'), + 1 => array ( 'type' => 'REGEX', + 'regex' => '/^[\w\.\-]{1,64}$/', + 'errmsg'=> 'data_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + /* + 'aux' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '0', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + */ + 'ttl' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '86400', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + 'active' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'Y', + 'value' => array(0 => 'N',1 => 'Y') + ), + 'stamp' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'serial' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/form/dns_rp.tform.php b/interface/ispconfig/interface/dns/form/dns_rp.tform.php new file mode 100644 index 0000000000000000000000000000000000000000..02a43196f8fd015a89099959a864a3d6c76dacf5 --- /dev/null +++ b/interface/ispconfig/interface/dns/form/dns_rp.tform.php @@ -0,0 +1,159 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['dns'] = array ( + 'title' => "DNS RP", + 'width' => 100, + 'template' => "templates/dns_rp_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'zone' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => @intval($_REQUEST["zone"]), + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'name' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'REGEX', + 'regex' => '/^[\w\.\-]{0,64}$/', + 'errmsg'=> 'name_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'type' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => 'RP', + 'value' => '', + 'width' => '5', + 'maxlength' => '5' + ), + 'data' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'data_error_empty'), + 1 => array ( 'type' => 'REGEX', + 'regex' => '/^[\w\.\-\s]{1,128}$/', + 'errmsg'=> 'data_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + /* + 'aux' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '0', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + */ + 'ttl' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '86400', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + 'active' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'Y', + 'value' => array(0 => 'N',1 => 'Y') + ), + 'stamp' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'serial' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/form/dns_soa.tform.php b/interface/ispconfig/interface/dns/form/dns_soa.tform.php new file mode 100644 index 0000000000000000000000000000000000000000..605679f16054dcbafe700287062686759b305dc7 --- /dev/null +++ b/interface/ispconfig/interface/dns/form/dns_soa.tform.php @@ -0,0 +1,230 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['dns_soa'] = array ( + 'title' => "DNS Zone", + 'width' => 100, + 'template' => "templates/dns_soa_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE mirror_server_id = 0 AND dns_server = 1 AND {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'server_id_error_empty'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'origin' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'origin_error_empty'), + 1 => array ( 'type' => 'UNIQUE', + 'errmsg'=> 'origin_error_unique'), + 2 => array ( 'type' => 'REGEX', + 'regex' => '/^[\w\.\-\/]{2,255}\.[a-zA-Z]{2,10}[\.]{0,1}$/', + 'errmsg'=> 'origin_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'ns' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'REGEX', + 'regex' => '/^[\w\.\-]{1,64}$/', + 'errmsg'=> 'ns_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'mbox' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'mbox_error_empty'), + 1 => array ( 'type' => 'REGEX', + 'regex' => '/^[[a-zA-Z0-9\.\-]{0,64}\.$/', + 'errmsg'=> 'mbox_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'serial' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + 'refresh' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '28800', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + 'retry' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '7200', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + 'expire' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '604800', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + 'minimum' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '86400', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + 'ttl' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '86400', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + 'xfer' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'also_notify' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'update_acl' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'active' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'Y', + 'value' => array(0 => 'N',1 => 'Y') + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + +$form["tabs"]['dns_records'] = array ( + 'title' => "Records", + 'width' => 100, + 'template' => "templates/dns_records_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + + ################################## + # ENDE Datatable fields + ################################## + ), + 'plugins' => array ( + 'dns_records' => array ( + 'class' => 'plugin_listview', + 'options' => array( + 'listdef' => 'list/dns_a.list.php', + 'sqlextwhere' => "zone = ".@intval(@$_REQUEST['id']), + 'sql_order_by' => "ORDER BY type, name" + ) + ) + ) +); + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/form/dns_srv.tform.php b/interface/ispconfig/interface/dns/form/dns_srv.tform.php new file mode 100644 index 0000000000000000000000000000000000000000..4cc2f55c2a01559f53c3f18787a67c0ec8e3a9ab --- /dev/null +++ b/interface/ispconfig/interface/dns/form/dns_srv.tform.php @@ -0,0 +1,159 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['dns'] = array ( + 'title' => "DNS SRV", + 'width' => 100, + 'template' => "templates/dns_srv_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'zone' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => @intval($_REQUEST["zone"]), + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'name' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'REGEX', + 'regex' => '/^[\w\.\-]{0,64}$/', + 'errmsg'=> 'name_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'type' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => 'SRV', + 'value' => '', + 'width' => '5', + 'maxlength' => '5' + ), + 'data' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'data_error_empty'), + 1 => array ( 'type' => 'REGEX', + 'regex' => '/^[\w\.\-]{0,64}\s[\w\.\-]{0,64}\s[\w\.\-]{0,64}$/', + 'errmsg'=> 'srv_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + /* + 'aux' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '0', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + */ + 'ttl' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '86400', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + 'active' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'Y', + 'value' => array(0 => 'N',1 => 'Y') + ), + 'stamp' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'serial' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/form/dns_template.tform.php b/interface/ispconfig/interface/dns/form/dns_template.tform.php new file mode 100644 index 0000000000000000000000000000000000000000..a648fd43c705b5699f046d6baae1537abdb4ce77 --- /dev/null +++ b/interface/ispconfig/interface/dns/form/dns_template.tform.php @@ -0,0 +1,101 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['template'] = array ( + 'title' => "DNS Template", + 'width' => 100, + 'template' => "templates/dns_template_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'name' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'name_error_empty'), + ), + 'default' => '', + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + 'fields' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOXARRAY', + 'default' => '', + 'separator' => ',', + 'value' => array('DOMAIN' => 'Domain','IP' => 'IP Address','NS1' => 'NS 1','NS2' => 'NS 2','EMAIL' => 'Email') + ), + 'template' => array ( + 'datatype' => 'TEXT', + 'formtype' => 'TEXTAREA', + 'default' => '', + 'value' => '', + 'cols' => '40', + 'rows' => '15' + ), + 'visible' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'Y', + 'value' => array(0 => 'N',1 => 'Y') + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/form/dns_txt.tform.php b/interface/ispconfig/interface/dns/form/dns_txt.tform.php new file mode 100644 index 0000000000000000000000000000000000000000..153bcc8eaabc0a0e149ea3ea4a13482ff52ee19b --- /dev/null +++ b/interface/ispconfig/interface/dns/form/dns_txt.tform.php @@ -0,0 +1,156 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['dns'] = array ( + 'title' => "DNS TXT", + 'width' => 100, + 'template' => "templates/dns_txt_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'zone' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => @intval($_REQUEST["zone"]), + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'name' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'REGEX', + 'regex' => '/^[\w\.\-]{0,64}$/', + 'errmsg'=> 'name_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'type' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => 'TXT', + 'value' => '', + 'width' => '5', + 'maxlength' => '5' + ), + 'data' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'data_error_empty'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + /* + 'aux' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '0', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + */ + 'ttl' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '86400', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + 'active' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'Y', + 'value' => array(0 => 'N',1 => 'Y') + ), + 'stamp' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'serial' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/lib/admin.conf.php b/interface/ispconfig/interface/dns/lib/admin.conf.php new file mode 100644 index 0000000000000000000000000000000000000000..a45d4403455c5c46f438046f088398e241cbc3d9 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/admin.conf.php @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/lib/lang/bg.lng b/interface/ispconfig/interface/dns/lib/lang/bg.lng new file mode 100644 index 0000000000000000000000000000000000000000..36def8e93d3ba7fdd8be805098f12a23eda90593 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/bg.lng @@ -0,0 +1,20 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/bg_dns_a.lng b/interface/ispconfig/interface/dns/lib/lang/bg_dns_a.lng new file mode 100644 index 0000000000000000000000000000000000000000..88021395116d1d0cf878a58514d3314492c9b9a8 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/bg_dns_a.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/bg_dns_a_list.lng b/interface/ispconfig/interface/dns/lib/lang/bg_dns_a_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..87c9cd8185000323da69e78800acdb0f8ac85413 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/bg_dns_a_list.lng @@ -0,0 +1,14 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/bg_dns_aaaa.lng b/interface/ispconfig/interface/dns/lib/lang/bg_dns_aaaa.lng new file mode 100644 index 0000000000000000000000000000000000000000..31ef0da1509439e879fecc0fb721370eab8e0d12 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/bg_dns_aaaa.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/bg_dns_alias.lng b/interface/ispconfig/interface/dns/lib/lang/bg_dns_alias.lng new file mode 100644 index 0000000000000000000000000000000000000000..827e5a89e86e078da9cb97ecb2bc4f5f9fd05272 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/bg_dns_alias.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/bg_dns_cname.lng b/interface/ispconfig/interface/dns/lib/lang/bg_dns_cname.lng new file mode 100644 index 0000000000000000000000000000000000000000..827e5a89e86e078da9cb97ecb2bc4f5f9fd05272 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/bg_dns_cname.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/bg_dns_hinfo.lng b/interface/ispconfig/interface/dns/lib/lang/bg_dns_hinfo.lng new file mode 100644 index 0000000000000000000000000000000000000000..0d90bcf40b582b1a534b157d4108f9dfad48da8e --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/bg_dns_hinfo.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/bg_dns_mx.lng b/interface/ispconfig/interface/dns/lib/lang/bg_dns_mx.lng new file mode 100644 index 0000000000000000000000000000000000000000..648827f04e34cb5e980ef95e06fbc29c9c39593e --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/bg_dns_mx.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/bg_dns_ns.lng b/interface/ispconfig/interface/dns/lib/lang/bg_dns_ns.lng new file mode 100644 index 0000000000000000000000000000000000000000..713ec28581af3acffceb7942d73834512d4e0d98 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/bg_dns_ns.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/bg_dns_ptr.lng b/interface/ispconfig/interface/dns/lib/lang/bg_dns_ptr.lng new file mode 100644 index 0000000000000000000000000000000000000000..c02638406828e181872e78791dba25ff7bed4dad --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/bg_dns_ptr.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/bg_dns_rp.lng b/interface/ispconfig/interface/dns/lib/lang/bg_dns_rp.lng new file mode 100644 index 0000000000000000000000000000000000000000..d38efd1633fda6ca92aeb34765f765dba1e3f1fc --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/bg_dns_rp.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/bg_dns_soa.lng b/interface/ispconfig/interface/dns/lib/lang/bg_dns_soa.lng new file mode 100644 index 0000000000000000000000000000000000000000..e63ffb70f668497a316be0e77dd408874502ca93 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/bg_dns_soa.lng @@ -0,0 +1,26 @@ +these IPs (comma separated list)'; +$wb['active_txt'] = 'Active'; +$wb['limit_dns_zone_txt'] = 'The max. number of DNS zones for your account is reached.'; +$wb['client_txt'] = 'Client'; +$wb['no_zone_perm'] = 'You do not have the permission to add a record to this DNS zone.'; +$wb['server_id_error_empty'] = 'No server selected'; +$wb['origin_error_empty'] = 'Zone empty.'; +$wb['origin_error_unique'] = 'There is already a record for this zone.'; +$wb['origin_error_regex'] = 'Zone has a invalid format.'; +$wb['ns_error_regex'] = 'NS has a invalid format.'; +$wb['mbox_error_empty'] = 'Email is empty.'; +$wb['mbox_error_regex'] = 'Email format invalid.'; +$wb['also_notify_txt'] = 'Also Notify'; +$wb['update_acl_txt'] = 'Update ACL'; +?> diff --git a/interface/ispconfig/interface/dns/lib/lang/bg_dns_soa_list.lng b/interface/ispconfig/interface/dns/lib/lang/bg_dns_soa_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..42bb32920ccbd370c1ffb932dbd0178b84637d73 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/bg_dns_soa_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/bg_dns_srv.lng b/interface/ispconfig/interface/dns/lib/lang/bg_dns_srv.lng new file mode 100644 index 0000000000000000000000000000000000000000..d4ea60be9760c7a5764ac69fef6cb9b51ff5d339 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/bg_dns_srv.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/bg_dns_template.lng b/interface/ispconfig/interface/dns/lib/lang/bg_dns_template.lng new file mode 100644 index 0000000000000000000000000000000000000000..3a09e3bb71b6fc2ba62aa40fce668fc2dd86ffe8 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/bg_dns_template.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/bg_dns_template_list.lng b/interface/ispconfig/interface/dns/lib/lang/bg_dns_template_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..8d9d730e5031ef939eff8da85b9f426b82d13b88 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/bg_dns_template_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/bg_dns_txt.lng b/interface/ispconfig/interface/dns/lib/lang/bg_dns_txt.lng new file mode 100644 index 0000000000000000000000000000000000000000..8e6c417d0d8474bc698d2a0e920334732e979d0e --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/bg_dns_txt.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/bg_dns_wizard.lng b/interface/ispconfig/interface/dns/lib/lang/bg_dns_wizard.lng new file mode 100644 index 0000000000000000000000000000000000000000..ffceabb53acd2e84b2339c325707ce5dbbd2022d --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/bg_dns_wizard.lng @@ -0,0 +1,29 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/br.lng b/interface/ispconfig/interface/dns/lib/lang/br.lng new file mode 100644 index 0000000000000000000000000000000000000000..de70fdb275219ee4a5607617e23e45805b7cd22c --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/br.lng @@ -0,0 +1,20 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/br_dns_a.lng b/interface/ispconfig/interface/dns/lib/lang/br_dns_a.lng new file mode 100644 index 0000000000000000000000000000000000000000..137af7c18757624a9cb18b379f753dd116e8688e --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/br_dns_a.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/br_dns_a_list.lng b/interface/ispconfig/interface/dns/lib/lang/br_dns_a_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..b231c8342df6f00104dadaec3146cecef35f92fe --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/br_dns_a_list.lng @@ -0,0 +1,14 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/br_dns_aaaa.lng b/interface/ispconfig/interface/dns/lib/lang/br_dns_aaaa.lng new file mode 100644 index 0000000000000000000000000000000000000000..17e77b215a3e6d814c4ee934cd4a0b82aea11ace --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/br_dns_aaaa.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/br_dns_alias.lng b/interface/ispconfig/interface/dns/lib/lang/br_dns_alias.lng new file mode 100644 index 0000000000000000000000000000000000000000..d026ddfaa5e261ebb109cd0de9b46b91a5f675cc --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/br_dns_alias.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/br_dns_cname.lng b/interface/ispconfig/interface/dns/lib/lang/br_dns_cname.lng new file mode 100644 index 0000000000000000000000000000000000000000..881cb637614470cf087978914938fcbd2e17b35d --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/br_dns_cname.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/br_dns_hinfo.lng b/interface/ispconfig/interface/dns/lib/lang/br_dns_hinfo.lng new file mode 100644 index 0000000000000000000000000000000000000000..ac6e13b0650499ca7762b5feb40303b99ea0bd11 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/br_dns_hinfo.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/br_dns_mx.lng b/interface/ispconfig/interface/dns/lib/lang/br_dns_mx.lng new file mode 100644 index 0000000000000000000000000000000000000000..0dfd536a2781e485bc32d1e2e24f8bc6901d72bb --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/br_dns_mx.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/br_dns_ns.lng b/interface/ispconfig/interface/dns/lib/lang/br_dns_ns.lng new file mode 100644 index 0000000000000000000000000000000000000000..ef9966fca174c1dfeef3477bfe43512ae48c78bd --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/br_dns_ns.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/br_dns_ptr.lng b/interface/ispconfig/interface/dns/lib/lang/br_dns_ptr.lng new file mode 100644 index 0000000000000000000000000000000000000000..728ea0731a63dfd6789806b184846c66c5352057 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/br_dns_ptr.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/br_dns_rp.lng b/interface/ispconfig/interface/dns/lib/lang/br_dns_rp.lng new file mode 100644 index 0000000000000000000000000000000000000000..d1854700f5c522ac0c3b14f2120f848f1cb67679 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/br_dns_rp.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/br_dns_soa.lng b/interface/ispconfig/interface/dns/lib/lang/br_dns_soa.lng new file mode 100644 index 0000000000000000000000000000000000000000..486d05afb32edc5bd50740952999799b53e84a79 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/br_dns_soa.lng @@ -0,0 +1,26 @@ +estes IPs (lista separada por ponto e vírgula)'; +$wb['active_txt'] = 'Ativo'; +$wb['limit_dns_zone_txt'] = 'O número máximo de zonas DNS para sua conta foi atingido.'; +$wb['client_txt'] = 'Cliente'; +$wb['no_zone_perm'] = 'Você não tem permição para adcionar registros a está zona DNS.'; +$wb['server_id_error_empty'] = 'Servidor não selecionado'; +$wb['origin_error_empty'] = 'Zona vazia.'; +$wb['origin_error_unique'] = 'Este registro já existe nesta zona.'; +$wb['origin_error_regex'] = 'Formato de zona inválido.'; +$wb['ns_error_regex'] = 'NS tem um formato inválido.'; +$wb['mbox_error_empty'] = 'Correio está em branco.'; +$wb['mbox_error_regex'] = 'Correio com formato inválido.'; +$wb['also_notify_txt'] = 'Also Notify'; +$wb['update_acl_txt'] = 'Atualizar ACL'; +?> diff --git a/interface/ispconfig/interface/dns/lib/lang/br_dns_soa_list.lng b/interface/ispconfig/interface/dns/lib/lang/br_dns_soa_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..ef0c93fa2f42652c625ff2243b0948613e728ad1 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/br_dns_soa_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/br_dns_srv.lng b/interface/ispconfig/interface/dns/lib/lang/br_dns_srv.lng new file mode 100644 index 0000000000000000000000000000000000000000..8a389f58d95e7430f857e1ffbb97196f8dbb203f --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/br_dns_srv.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/br_dns_template.lng b/interface/ispconfig/interface/dns/lib/lang/br_dns_template.lng new file mode 100644 index 0000000000000000000000000000000000000000..9d7331b79551cb30afbda2c99e1ae9bc49dec0b7 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/br_dns_template.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/br_dns_template_list.lng b/interface/ispconfig/interface/dns/lib/lang/br_dns_template_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..a4602aec97ad3ed69a3731e5ae6e9650433bb4a2 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/br_dns_template_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/br_dns_txt.lng b/interface/ispconfig/interface/dns/lib/lang/br_dns_txt.lng new file mode 100644 index 0000000000000000000000000000000000000000..f73ada31df537a20663441a841661e76b3095012 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/br_dns_txt.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/br_dns_wizard.lng b/interface/ispconfig/interface/dns/lib/lang/br_dns_wizard.lng new file mode 100644 index 0000000000000000000000000000000000000000..6a94ec29dbb194bac049071ec292478b63cca5cc --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/br_dns_wizard.lng @@ -0,0 +1,29 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/de.lng b/interface/ispconfig/interface/dns/lib/lang/de.lng new file mode 100644 index 0000000000000000000000000000000000000000..319b221fba94cb03abdb71153ef3e2bfb2e4f06b --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/de.lng @@ -0,0 +1,20 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/de_dns_a.lng b/interface/ispconfig/interface/dns/lib/lang/de_dns_a.lng new file mode 100644 index 0000000000000000000000000000000000000000..ea6d021781d13c1fa2a27606b0f2c2732451fa15 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/de_dns_a.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/de_dns_a_list.lng b/interface/ispconfig/interface/dns/lib/lang/de_dns_a_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..0481c2b67a73d0c63d315ac96d502bb7a454ce52 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/de_dns_a_list.lng @@ -0,0 +1,14 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/de_dns_aaaa.lng b/interface/ispconfig/interface/dns/lib/lang/de_dns_aaaa.lng new file mode 100644 index 0000000000000000000000000000000000000000..768e67056890533fbcfcdff59ee103a9eb7f2715 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/de_dns_aaaa.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/de_dns_alias.lng b/interface/ispconfig/interface/dns/lib/lang/de_dns_alias.lng new file mode 100644 index 0000000000000000000000000000000000000000..9475644b21a5b18958b40ff1265e6b31277405f9 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/de_dns_alias.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/de_dns_cname.lng b/interface/ispconfig/interface/dns/lib/lang/de_dns_cname.lng new file mode 100644 index 0000000000000000000000000000000000000000..4c3d5a0a5c190b98b9894eac61bd827ec11ad27b --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/de_dns_cname.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/de_dns_hinfo.lng b/interface/ispconfig/interface/dns/lib/lang/de_dns_hinfo.lng new file mode 100644 index 0000000000000000000000000000000000000000..245480f3b7c2447868c3ff70169be0a1a180a08a --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/de_dns_hinfo.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/de_dns_mx.lng b/interface/ispconfig/interface/dns/lib/lang/de_dns_mx.lng new file mode 100644 index 0000000000000000000000000000000000000000..ab21cc49874a707f46afc4b9d1ae1a98babe1112 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/de_dns_mx.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/de_dns_ns.lng b/interface/ispconfig/interface/dns/lib/lang/de_dns_ns.lng new file mode 100644 index 0000000000000000000000000000000000000000..845da9dc1eb8747f55cd15b92cd7337b0b56b5cd --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/de_dns_ns.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/de_dns_ptr.lng b/interface/ispconfig/interface/dns/lib/lang/de_dns_ptr.lng new file mode 100644 index 0000000000000000000000000000000000000000..aee4155968595be066ce9d726e3c6504e36d1e98 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/de_dns_ptr.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/de_dns_rp.lng b/interface/ispconfig/interface/dns/lib/lang/de_dns_rp.lng new file mode 100644 index 0000000000000000000000000000000000000000..86f3fc02bf4ad796f21a66b94b5d5ee70479c90b --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/de_dns_rp.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/de_dns_soa.lng b/interface/ispconfig/interface/dns/lib/lang/de_dns_soa.lng new file mode 100644 index 0000000000000000000000000000000000000000..d619a3ccedfa97969b2e71f0de9658027af6d1bb --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/de_dns_soa.lng @@ -0,0 +1,26 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/de_dns_soa_list.lng b/interface/ispconfig/interface/dns/lib/lang/de_dns_soa_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..92f098c844f1be78e9341e0ee81300edcd2bc34f --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/de_dns_soa_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/de_dns_srv.lng b/interface/ispconfig/interface/dns/lib/lang/de_dns_srv.lng new file mode 100644 index 0000000000000000000000000000000000000000..352e9598c48a12c723135348de8c421ef6d9e390 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/de_dns_srv.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/de_dns_template.lng b/interface/ispconfig/interface/dns/lib/lang/de_dns_template.lng new file mode 100644 index 0000000000000000000000000000000000000000..33d1090cbaa7f556a9caf3f8e8225c9c6807a80c --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/de_dns_template.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/de_dns_template_list.lng b/interface/ispconfig/interface/dns/lib/lang/de_dns_template_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..45f0c5c5af3656864fb82c40de07cf1f682f19f4 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/de_dns_template_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/de_dns_txt.lng b/interface/ispconfig/interface/dns/lib/lang/de_dns_txt.lng new file mode 100644 index 0000000000000000000000000000000000000000..182e9945ab0856cba07138558fd4b8e79d21a98c --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/de_dns_txt.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/de_dns_wizard.lng b/interface/ispconfig/interface/dns/lib/lang/de_dns_wizard.lng new file mode 100644 index 0000000000000000000000000000000000000000..6f1bfbe3a615a077fcf3fd5f189b5bc1ccac8336 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/de_dns_wizard.lng @@ -0,0 +1,29 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/en.lng b/interface/ispconfig/interface/dns/lib/lang/en.lng new file mode 100644 index 0000000000000000000000000000000000000000..c4a5beaada1950d996766bda0196ed0e55f89bea --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/en.lng @@ -0,0 +1,22 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/lib/lang/en_dns_a.lng b/interface/ispconfig/interface/dns/lib/lang/en_dns_a.lng new file mode 100644 index 0000000000000000000000000000000000000000..599de5cf9361157efaf7fec8e2b5268514e37bce --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/en_dns_a.lng @@ -0,0 +1,16 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/lib/lang/en_dns_a_list.lng b/interface/ispconfig/interface/dns/lib/lang/en_dns_a_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..88a2366a53d8b9f7e8f241d3c7d0d7b5d32a055c --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/en_dns_a_list.lng @@ -0,0 +1,14 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/lib/lang/en_dns_aaaa.lng b/interface/ispconfig/interface/dns/lib/lang/en_dns_aaaa.lng new file mode 100644 index 0000000000000000000000000000000000000000..c56d55863bee2496b2fefa05a229e4893d732b39 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/en_dns_aaaa.lng @@ -0,0 +1,15 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/lib/lang/en_dns_alias.lng b/interface/ispconfig/interface/dns/lib/lang/en_dns_alias.lng new file mode 100644 index 0000000000000000000000000000000000000000..46f73a38784509f309184d8392ffc255b99468a1 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/en_dns_alias.lng @@ -0,0 +1,15 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/lib/lang/en_dns_cname.lng b/interface/ispconfig/interface/dns/lib/lang/en_dns_cname.lng new file mode 100644 index 0000000000000000000000000000000000000000..46f73a38784509f309184d8392ffc255b99468a1 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/en_dns_cname.lng @@ -0,0 +1,15 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/lib/lang/en_dns_hinfo.lng b/interface/ispconfig/interface/dns/lib/lang/en_dns_hinfo.lng new file mode 100644 index 0000000000000000000000000000000000000000..0fb7f4597ce132a1b20e6b759b06759171a15481 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/en_dns_hinfo.lng @@ -0,0 +1,15 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/lib/lang/en_dns_mx.lng b/interface/ispconfig/interface/dns/lib/lang/en_dns_mx.lng new file mode 100644 index 0000000000000000000000000000000000000000..d0bee5eba35ea8ad8d90153ee0552d647ebeee43 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/en_dns_mx.lng @@ -0,0 +1,16 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/lib/lang/en_dns_ns.lng b/interface/ispconfig/interface/dns/lib/lang/en_dns_ns.lng new file mode 100644 index 0000000000000000000000000000000000000000..9e0e1e149efe6c2012d3dceb8709eda045dd5ac8 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/en_dns_ns.lng @@ -0,0 +1,15 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/lib/lang/en_dns_ptr.lng b/interface/ispconfig/interface/dns/lib/lang/en_dns_ptr.lng new file mode 100644 index 0000000000000000000000000000000000000000..1219a96e1f57be52bff5cb5c6442e73cca6e2583 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/en_dns_ptr.lng @@ -0,0 +1,15 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/lib/lang/en_dns_rp.lng b/interface/ispconfig/interface/dns/lib/lang/en_dns_rp.lng new file mode 100644 index 0000000000000000000000000000000000000000..e705d9fff07b4f9ef5748d3cc324febba48cf4ba --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/en_dns_rp.lng @@ -0,0 +1,15 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/lib/lang/en_dns_soa.lng b/interface/ispconfig/interface/dns/lib/lang/en_dns_soa.lng new file mode 100644 index 0000000000000000000000000000000000000000..3c9a5b0a525441d5de91bc8820eecd0106ddd303 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/en_dns_soa.lng @@ -0,0 +1,26 @@ +these IPs (comma separated list)'; +$wb["active_txt"] = 'Active'; +$wb["limit_dns_zone_txt"] = 'The max. number of DNS zones for your account is reached.'; +$wb["client_txt"] = 'Client'; +$wb["no_zone_perm"] = 'You do not have the permission to add a record to this DNS zone.'; +$wb["server_id_error_empty"] = 'No server selected'; +$wb["origin_error_empty"] = 'Zone empty.'; +$wb["origin_error_unique"] = 'There is already a record for this zone.'; +$wb["origin_error_regex"] = 'Zone has a invalid format.'; +$wb["ns_error_regex"] = 'NS has a invalid format.'; +$wb["mbox_error_empty"] = 'Email is empty.'; +$wb["mbox_error_regex"] = 'Email format invalid.'; +$wb["also_notify_txt"] = 'Also Notify'; +$wb["update_acl_txt"] = 'Update ACL'; +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/lib/lang/en_dns_soa_list.lng b/interface/ispconfig/interface/dns/lib/lang/en_dns_soa_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..6213bdb1dc5b7c77750682be0664245c216c0db0 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/en_dns_soa_list.lng @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/lib/lang/en_dns_srv.lng b/interface/ispconfig/interface/dns/lib/lang/en_dns_srv.lng new file mode 100644 index 0000000000000000000000000000000000000000..d0dcd1eb2636b365110f855be3c28ebaab2c2f2b --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/en_dns_srv.lng @@ -0,0 +1,16 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/lib/lang/en_dns_template.lng b/interface/ispconfig/interface/dns/lib/lang/en_dns_template.lng new file mode 100644 index 0000000000000000000000000000000000000000..37643e11926ee198f77d9ab54f79468dcb72ec83 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/en_dns_template.lng @@ -0,0 +1,6 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/lib/lang/en_dns_template_list.lng b/interface/ispconfig/interface/dns/lib/lang/en_dns_template_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..33460a20ac5f93c02d6fc4baeb677f5c9c708809 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/en_dns_template_list.lng @@ -0,0 +1,6 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/lib/lang/en_dns_txt.lng b/interface/ispconfig/interface/dns/lib/lang/en_dns_txt.lng new file mode 100644 index 0000000000000000000000000000000000000000..af43605901f4851ea84455037cedcca175a3794b --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/en_dns_txt.lng @@ -0,0 +1,15 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/lib/lang/en_dns_wizard.lng b/interface/ispconfig/interface/dns/lib/lang/en_dns_wizard.lng new file mode 100644 index 0000000000000000000000000000000000000000..2f9f91421f1ff171ad0050f41f9427e5305ec305 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/en_dns_wizard.lng @@ -0,0 +1,30 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/lib/lang/es.lng b/interface/ispconfig/interface/dns/lib/lang/es.lng new file mode 100644 index 0000000000000000000000000000000000000000..4fd59f49dde8a5d4b4548b583385fc6181187b7f --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/es.lng @@ -0,0 +1,20 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/es_dns_a.lng b/interface/ispconfig/interface/dns/lib/lang/es_dns_a.lng new file mode 100644 index 0000000000000000000000000000000000000000..36f318c8682b086535fc195e1a30bbb6eb206b9c --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/es_dns_a.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/es_dns_a_list.lng b/interface/ispconfig/interface/dns/lib/lang/es_dns_a_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..1cbe6d305a225d084f32bcd6d757dbc6d89eaa88 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/es_dns_a_list.lng @@ -0,0 +1,14 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/es_dns_aaaa.lng b/interface/ispconfig/interface/dns/lib/lang/es_dns_aaaa.lng new file mode 100644 index 0000000000000000000000000000000000000000..15ee1d2f352841c6cac74574ed4b06d993041488 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/es_dns_aaaa.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/es_dns_alias.lng b/interface/ispconfig/interface/dns/lib/lang/es_dns_alias.lng new file mode 100644 index 0000000000000000000000000000000000000000..705b5cf0d90b2074a51de922b62fb44cea26d73b --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/es_dns_alias.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/es_dns_cname.lng b/interface/ispconfig/interface/dns/lib/lang/es_dns_cname.lng new file mode 100644 index 0000000000000000000000000000000000000000..7c3f7b7f12c12b555408f593f908395035897061 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/es_dns_cname.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/es_dns_hinfo.lng b/interface/ispconfig/interface/dns/lib/lang/es_dns_hinfo.lng new file mode 100644 index 0000000000000000000000000000000000000000..d5412cac47ecb1fdf9c46d2c6e52f6890fcd77c8 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/es_dns_hinfo.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/es_dns_mx.lng b/interface/ispconfig/interface/dns/lib/lang/es_dns_mx.lng new file mode 100644 index 0000000000000000000000000000000000000000..e7c377d66591ab9d7cc4261f79a99dfcc8719a90 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/es_dns_mx.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/es_dns_ns.lng b/interface/ispconfig/interface/dns/lib/lang/es_dns_ns.lng new file mode 100644 index 0000000000000000000000000000000000000000..568700987301aebe51c353e88a72d5d9a838b377 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/es_dns_ns.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/es_dns_ptr.lng b/interface/ispconfig/interface/dns/lib/lang/es_dns_ptr.lng new file mode 100644 index 0000000000000000000000000000000000000000..f8ef426e4a81b2772a005e3d67c260e526d0d561 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/es_dns_ptr.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/es_dns_rp.lng b/interface/ispconfig/interface/dns/lib/lang/es_dns_rp.lng new file mode 100644 index 0000000000000000000000000000000000000000..fece32a2bad9d34c945d9747c5df4b120bbabc81 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/es_dns_rp.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/es_dns_soa.lng b/interface/ispconfig/interface/dns/lib/lang/es_dns_soa.lng new file mode 100644 index 0000000000000000000000000000000000000000..c4143bc6331148752b7e5998f7cd0a1284b20dcd --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/es_dns_soa.lng @@ -0,0 +1,26 @@ +estas IPs (lista separada por comas)'; +$wb['active_txt'] = 'Activar'; +$wb['limit_dns_zone_txt'] = 'Se ha alcanzado el número máximo de zonas DNS para esta cuenta.'; +$wb['client_txt'] = 'Cliente'; +$wb['no_zone_perm'] = 'No tiene permisos para añadir registros a esta zona DNS.'; +$wb['server_id_error_empty'] = 'No se ha seleccionado el servidor.'; +$wb['origin_error_empty'] = 'Zona vacía.'; +$wb['origin_error_unique'] = 'Ya hay un registro para esta zona.'; +$wb['origin_error_regex'] = 'Formato de zona no válido.'; +$wb['ns_error_regex'] = 'Formato de NS no válido.'; +$wb['mbox_error_empty'] = 'Correo vacío.'; +$wb['mbox_error_regex'] = 'Formato de correo no válido.'; +$wb['also_notify_txt'] = 'Also Notify'; +$wb['update_acl_txt'] = 'Update ACL'; +?> diff --git a/interface/ispconfig/interface/dns/lib/lang/es_dns_soa_list.lng b/interface/ispconfig/interface/dns/lib/lang/es_dns_soa_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..ab942dd50fe1c9c6f1cdd75356bf4d1a8f6e2c70 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/es_dns_soa_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/es_dns_srv.lng b/interface/ispconfig/interface/dns/lib/lang/es_dns_srv.lng new file mode 100644 index 0000000000000000000000000000000000000000..8e524ee4d689aa34a2d09a05c2587c097483a2c0 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/es_dns_srv.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/es_dns_template.lng b/interface/ispconfig/interface/dns/lib/lang/es_dns_template.lng new file mode 100644 index 0000000000000000000000000000000000000000..79ac234a0fa7a029ce6512be305ebfeef5f2e858 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/es_dns_template.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/es_dns_template_list.lng b/interface/ispconfig/interface/dns/lib/lang/es_dns_template_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..388a4c156b8b839af2a17d07457e8a64c2730b5f --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/es_dns_template_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/es_dns_txt.lng b/interface/ispconfig/interface/dns/lib/lang/es_dns_txt.lng new file mode 100644 index 0000000000000000000000000000000000000000..55bde142d09b2c2cfaec7204078819ca5f69cafb --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/es_dns_txt.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/es_dns_wizard.lng b/interface/ispconfig/interface/dns/lib/lang/es_dns_wizard.lng new file mode 100644 index 0000000000000000000000000000000000000000..0713bcc0a8c64f1fefe48c923a36917a708a913c --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/es_dns_wizard.lng @@ -0,0 +1,29 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/fi.lng b/interface/ispconfig/interface/dns/lib/lang/fi.lng new file mode 100644 index 0000000000000000000000000000000000000000..bdca8cd965ca51cf3c7cb2f25c9d7b5a3fc40494 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/fi.lng @@ -0,0 +1,20 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/fi_dns_a.lng b/interface/ispconfig/interface/dns/lib/lang/fi_dns_a.lng new file mode 100644 index 0000000000000000000000000000000000000000..3a4af610e5c96fd09455aa8f1fcee2e919327848 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/fi_dns_a.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/fi_dns_a_list.lng b/interface/ispconfig/interface/dns/lib/lang/fi_dns_a_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..0cc82874bab543ed5fab1a4ad671561aad3d0874 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/fi_dns_a_list.lng @@ -0,0 +1,14 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/fi_dns_aaaa.lng b/interface/ispconfig/interface/dns/lib/lang/fi_dns_aaaa.lng new file mode 100644 index 0000000000000000000000000000000000000000..b87d7ac296ec5fc9c5c5070115bae730f7df16db --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/fi_dns_aaaa.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/fi_dns_alias.lng b/interface/ispconfig/interface/dns/lib/lang/fi_dns_alias.lng new file mode 100644 index 0000000000000000000000000000000000000000..20da599c72e46cc81013cab4fa9f24611c7542b4 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/fi_dns_alias.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/fi_dns_cname.lng b/interface/ispconfig/interface/dns/lib/lang/fi_dns_cname.lng new file mode 100644 index 0000000000000000000000000000000000000000..a58f0d2f2cf1ef58839ec6dc57b83007f194f9c8 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/fi_dns_cname.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/fi_dns_hinfo.lng b/interface/ispconfig/interface/dns/lib/lang/fi_dns_hinfo.lng new file mode 100644 index 0000000000000000000000000000000000000000..ea2fb93a39c6aad638f6af52d593d32220d71f4e --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/fi_dns_hinfo.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/fi_dns_mx.lng b/interface/ispconfig/interface/dns/lib/lang/fi_dns_mx.lng new file mode 100644 index 0000000000000000000000000000000000000000..e4b4a60d56741f7b40c09f324705df47944cb1e8 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/fi_dns_mx.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/fi_dns_ns.lng b/interface/ispconfig/interface/dns/lib/lang/fi_dns_ns.lng new file mode 100644 index 0000000000000000000000000000000000000000..8f97c53cb27dfcd9306e6b4b776b09dd57d82520 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/fi_dns_ns.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/fi_dns_ptr.lng b/interface/ispconfig/interface/dns/lib/lang/fi_dns_ptr.lng new file mode 100644 index 0000000000000000000000000000000000000000..9885c2be9d8619af40ed6c4bcd2844448f7f5f4e --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/fi_dns_ptr.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/fi_dns_rp.lng b/interface/ispconfig/interface/dns/lib/lang/fi_dns_rp.lng new file mode 100644 index 0000000000000000000000000000000000000000..d47cdcfbdd063ea29c11a0ddd0fa76cf34f01c74 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/fi_dns_rp.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/fi_dns_soa.lng b/interface/ispconfig/interface/dns/lib/lang/fi_dns_soa.lng new file mode 100644 index 0000000000000000000000000000000000000000..7e70915d723d88aabcab0676f7535036971b9a94 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/fi_dns_soa.lng @@ -0,0 +1,26 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/fi_dns_soa_list.lng b/interface/ispconfig/interface/dns/lib/lang/fi_dns_soa_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..95d104443ad6411eef09abe2340ad9a1adf56d12 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/fi_dns_soa_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/fi_dns_srv.lng b/interface/ispconfig/interface/dns/lib/lang/fi_dns_srv.lng new file mode 100644 index 0000000000000000000000000000000000000000..68f4c859eb84aee0f9d31f29970ad2ded2c72edf --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/fi_dns_srv.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/fi_dns_template.lng b/interface/ispconfig/interface/dns/lib/lang/fi_dns_template.lng new file mode 100644 index 0000000000000000000000000000000000000000..b34a92d6a9e45fc952fadedf5defae9602e60b1f --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/fi_dns_template.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/fi_dns_template_list.lng b/interface/ispconfig/interface/dns/lib/lang/fi_dns_template_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..47c8924237e420d826acb1600abc66f2a68921c8 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/fi_dns_template_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/fi_dns_txt.lng b/interface/ispconfig/interface/dns/lib/lang/fi_dns_txt.lng new file mode 100644 index 0000000000000000000000000000000000000000..d1235ba07a181fdc1617572b1616fdde9154a7a9 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/fi_dns_txt.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/fi_dns_wizard.lng b/interface/ispconfig/interface/dns/lib/lang/fi_dns_wizard.lng new file mode 100644 index 0000000000000000000000000000000000000000..dba630674f9e6184bf7e28a0b432662d1d6b8abc --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/fi_dns_wizard.lng @@ -0,0 +1,29 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/fr.lng b/interface/ispconfig/interface/dns/lib/lang/fr.lng new file mode 100644 index 0000000000000000000000000000000000000000..fe6ece558f5387fe054cddbb2ec294be92c2264e --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/fr.lng @@ -0,0 +1,20 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/fr_dns_a.lng b/interface/ispconfig/interface/dns/lib/lang/fr_dns_a.lng new file mode 100644 index 0000000000000000000000000000000000000000..731c3e4fa8bfcef8b1ba977924d76f25011dac9b --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/fr_dns_a.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/fr_dns_a_list.lng b/interface/ispconfig/interface/dns/lib/lang/fr_dns_a_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..0817826152d3fe599ee0002dbfc93f401d26bb01 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/fr_dns_a_list.lng @@ -0,0 +1,14 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/fr_dns_aaaa.lng b/interface/ispconfig/interface/dns/lib/lang/fr_dns_aaaa.lng new file mode 100644 index 0000000000000000000000000000000000000000..503795f0e414be4e09b700e1a0c65ea0c6b3fd18 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/fr_dns_aaaa.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/fr_dns_alias.lng b/interface/ispconfig/interface/dns/lib/lang/fr_dns_alias.lng new file mode 100644 index 0000000000000000000000000000000000000000..1ae97aecdf48494a5e01b4aab71ea11ab07aae3e --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/fr_dns_alias.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/fr_dns_cname.lng b/interface/ispconfig/interface/dns/lib/lang/fr_dns_cname.lng new file mode 100644 index 0000000000000000000000000000000000000000..87fc49ea0e6f7fadba52233cf0f3c1c97f5c324b --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/fr_dns_cname.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/fr_dns_hinfo.lng b/interface/ispconfig/interface/dns/lib/lang/fr_dns_hinfo.lng new file mode 100644 index 0000000000000000000000000000000000000000..f26ed7dd5bda9db2a90ac3e07fb46c698cff16bb --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/fr_dns_hinfo.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/fr_dns_mx.lng b/interface/ispconfig/interface/dns/lib/lang/fr_dns_mx.lng new file mode 100644 index 0000000000000000000000000000000000000000..e3904207a9254ea2db6312f3d0a5b78ba6b60fdf --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/fr_dns_mx.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/fr_dns_ns.lng b/interface/ispconfig/interface/dns/lib/lang/fr_dns_ns.lng new file mode 100644 index 0000000000000000000000000000000000000000..a6edc6eaa56342357d7f727ead19130d2e42da76 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/fr_dns_ns.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/fr_dns_ptr.lng b/interface/ispconfig/interface/dns/lib/lang/fr_dns_ptr.lng new file mode 100644 index 0000000000000000000000000000000000000000..4318e000ebf4268f16ad2102aa232bbf52b64836 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/fr_dns_ptr.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/fr_dns_rp.lng b/interface/ispconfig/interface/dns/lib/lang/fr_dns_rp.lng new file mode 100644 index 0000000000000000000000000000000000000000..fe37f3e79db3cff21432bac4c303a8d2df4fea22 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/fr_dns_rp.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/fr_dns_soa.lng b/interface/ispconfig/interface/dns/lib/lang/fr_dns_soa.lng new file mode 100644 index 0000000000000000000000000000000000000000..28c81c41c8d4c565c5cb4e3a6f6c9eecb9545920 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/fr_dns_soa.lng @@ -0,0 +1,26 @@ +ces IP (liste séparée par des virgules)'; +$wb['active_txt'] = 'Actif'; +$wb['client_txt'] = 'Client'; +$wb['no_zone_perm'] = 'Vous navez pas la permissions dajouter un enregistrement dans cette zone DNS.'; +$wb['server_id_error_empty'] = 'Pas de serveur sélectionné'; +$wb['origin_error_empty'] = 'Zone vide.'; +$wb['origin_error_unique'] = 'Il y a déja un enregistrement pour cette zone.'; +$wb['origin_error_regex'] = 'La zone est dun format invalide.'; +$wb['ns_error_regex'] = 'Le serveur de nom est dun format invalide.'; +$wb['mbox_error_empty'] = 'Ladresse e-mail est vide.'; +$wb['mbox_error_regex'] = 'Ladresse e-mail est dun format invalide.'; +$wb['limit_dns_zone_txt'] = 'The max. number of DNS zones for your account is reached.'; +$wb['also_notify_txt'] = 'Also Notify'; +$wb['update_acl_txt'] = 'Update ACL'; +?> diff --git a/interface/ispconfig/interface/dns/lib/lang/fr_dns_soa_list.lng b/interface/ispconfig/interface/dns/lib/lang/fr_dns_soa_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..a828044a045725068cdc164588c53c87763347f7 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/fr_dns_soa_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/fr_dns_srv.lng b/interface/ispconfig/interface/dns/lib/lang/fr_dns_srv.lng new file mode 100644 index 0000000000000000000000000000000000000000..de8776354d5e1647023e6d22a29e9ef5ba87e628 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/fr_dns_srv.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/fr_dns_template.lng b/interface/ispconfig/interface/dns/lib/lang/fr_dns_template.lng new file mode 100644 index 0000000000000000000000000000000000000000..1202cfd76840adc991a7ebd7148c396b30395c3a --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/fr_dns_template.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/fr_dns_template_list.lng b/interface/ispconfig/interface/dns/lib/lang/fr_dns_template_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..52455b2ca428f449fdb9131dd724d376f1d89a34 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/fr_dns_template_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/fr_dns_txt.lng b/interface/ispconfig/interface/dns/lib/lang/fr_dns_txt.lng new file mode 100644 index 0000000000000000000000000000000000000000..2126a3f247078899d01dab3138ca3a0de4f22e7e --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/fr_dns_txt.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/fr_dns_wizard.lng b/interface/ispconfig/interface/dns/lib/lang/fr_dns_wizard.lng new file mode 100644 index 0000000000000000000000000000000000000000..b828acd2cc6bae20fc653aedc06fcf75568eef32 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/fr_dns_wizard.lng @@ -0,0 +1,29 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/hu.lng b/interface/ispconfig/interface/dns/lib/lang/hu.lng new file mode 100644 index 0000000000000000000000000000000000000000..36def8e93d3ba7fdd8be805098f12a23eda90593 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/hu.lng @@ -0,0 +1,20 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/hu_dns_a.lng b/interface/ispconfig/interface/dns/lib/lang/hu_dns_a.lng new file mode 100644 index 0000000000000000000000000000000000000000..88021395116d1d0cf878a58514d3314492c9b9a8 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/hu_dns_a.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/hu_dns_a_list.lng b/interface/ispconfig/interface/dns/lib/lang/hu_dns_a_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..acab15029778695ffc34a07e2a290080a0cb77cb --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/hu_dns_a_list.lng @@ -0,0 +1,14 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/hu_dns_aaaa.lng b/interface/ispconfig/interface/dns/lib/lang/hu_dns_aaaa.lng new file mode 100644 index 0000000000000000000000000000000000000000..31ef0da1509439e879fecc0fb721370eab8e0d12 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/hu_dns_aaaa.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/hu_dns_alias.lng b/interface/ispconfig/interface/dns/lib/lang/hu_dns_alias.lng new file mode 100644 index 0000000000000000000000000000000000000000..827e5a89e86e078da9cb97ecb2bc4f5f9fd05272 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/hu_dns_alias.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/hu_dns_cname.lng b/interface/ispconfig/interface/dns/lib/lang/hu_dns_cname.lng new file mode 100644 index 0000000000000000000000000000000000000000..827e5a89e86e078da9cb97ecb2bc4f5f9fd05272 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/hu_dns_cname.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/hu_dns_hinfo.lng b/interface/ispconfig/interface/dns/lib/lang/hu_dns_hinfo.lng new file mode 100644 index 0000000000000000000000000000000000000000..0d90bcf40b582b1a534b157d4108f9dfad48da8e --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/hu_dns_hinfo.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/hu_dns_mx.lng b/interface/ispconfig/interface/dns/lib/lang/hu_dns_mx.lng new file mode 100644 index 0000000000000000000000000000000000000000..648827f04e34cb5e980ef95e06fbc29c9c39593e --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/hu_dns_mx.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/hu_dns_ns.lng b/interface/ispconfig/interface/dns/lib/lang/hu_dns_ns.lng new file mode 100644 index 0000000000000000000000000000000000000000..713ec28581af3acffceb7942d73834512d4e0d98 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/hu_dns_ns.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/hu_dns_ptr.lng b/interface/ispconfig/interface/dns/lib/lang/hu_dns_ptr.lng new file mode 100644 index 0000000000000000000000000000000000000000..c02638406828e181872e78791dba25ff7bed4dad --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/hu_dns_ptr.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/hu_dns_rp.lng b/interface/ispconfig/interface/dns/lib/lang/hu_dns_rp.lng new file mode 100644 index 0000000000000000000000000000000000000000..d38efd1633fda6ca92aeb34765f765dba1e3f1fc --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/hu_dns_rp.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/hu_dns_soa.lng b/interface/ispconfig/interface/dns/lib/lang/hu_dns_soa.lng new file mode 100644 index 0000000000000000000000000000000000000000..e63ffb70f668497a316be0e77dd408874502ca93 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/hu_dns_soa.lng @@ -0,0 +1,26 @@ +these IPs (comma separated list)'; +$wb['active_txt'] = 'Active'; +$wb['limit_dns_zone_txt'] = 'The max. number of DNS zones for your account is reached.'; +$wb['client_txt'] = 'Client'; +$wb['no_zone_perm'] = 'You do not have the permission to add a record to this DNS zone.'; +$wb['server_id_error_empty'] = 'No server selected'; +$wb['origin_error_empty'] = 'Zone empty.'; +$wb['origin_error_unique'] = 'There is already a record for this zone.'; +$wb['origin_error_regex'] = 'Zone has a invalid format.'; +$wb['ns_error_regex'] = 'NS has a invalid format.'; +$wb['mbox_error_empty'] = 'Email is empty.'; +$wb['mbox_error_regex'] = 'Email format invalid.'; +$wb['also_notify_txt'] = 'Also Notify'; +$wb['update_acl_txt'] = 'Update ACL'; +?> diff --git a/interface/ispconfig/interface/dns/lib/lang/hu_dns_soa_list.lng b/interface/ispconfig/interface/dns/lib/lang/hu_dns_soa_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..42bb32920ccbd370c1ffb932dbd0178b84637d73 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/hu_dns_soa_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/hu_dns_srv.lng b/interface/ispconfig/interface/dns/lib/lang/hu_dns_srv.lng new file mode 100644 index 0000000000000000000000000000000000000000..d4ea60be9760c7a5764ac69fef6cb9b51ff5d339 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/hu_dns_srv.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/hu_dns_template.lng b/interface/ispconfig/interface/dns/lib/lang/hu_dns_template.lng new file mode 100644 index 0000000000000000000000000000000000000000..3a09e3bb71b6fc2ba62aa40fce668fc2dd86ffe8 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/hu_dns_template.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/hu_dns_template_list.lng b/interface/ispconfig/interface/dns/lib/lang/hu_dns_template_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..8d9d730e5031ef939eff8da85b9f426b82d13b88 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/hu_dns_template_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/hu_dns_txt.lng b/interface/ispconfig/interface/dns/lib/lang/hu_dns_txt.lng new file mode 100644 index 0000000000000000000000000000000000000000..8e6c417d0d8474bc698d2a0e920334732e979d0e --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/hu_dns_txt.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/hu_dns_wizard.lng b/interface/ispconfig/interface/dns/lib/lang/hu_dns_wizard.lng new file mode 100644 index 0000000000000000000000000000000000000000..ffceabb53acd2e84b2339c325707ce5dbbd2022d --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/hu_dns_wizard.lng @@ -0,0 +1,29 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/it.lng b/interface/ispconfig/interface/dns/lib/lang/it.lng new file mode 100644 index 0000000000000000000000000000000000000000..36def8e93d3ba7fdd8be805098f12a23eda90593 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/it.lng @@ -0,0 +1,20 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/it_dns_a.lng b/interface/ispconfig/interface/dns/lib/lang/it_dns_a.lng new file mode 100644 index 0000000000000000000000000000000000000000..88021395116d1d0cf878a58514d3314492c9b9a8 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/it_dns_a.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/it_dns_a_list.lng b/interface/ispconfig/interface/dns/lib/lang/it_dns_a_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..87c9cd8185000323da69e78800acdb0f8ac85413 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/it_dns_a_list.lng @@ -0,0 +1,14 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/it_dns_aaaa.lng b/interface/ispconfig/interface/dns/lib/lang/it_dns_aaaa.lng new file mode 100644 index 0000000000000000000000000000000000000000..31ef0da1509439e879fecc0fb721370eab8e0d12 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/it_dns_aaaa.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/it_dns_alias.lng b/interface/ispconfig/interface/dns/lib/lang/it_dns_alias.lng new file mode 100644 index 0000000000000000000000000000000000000000..827e5a89e86e078da9cb97ecb2bc4f5f9fd05272 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/it_dns_alias.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/it_dns_cname.lng b/interface/ispconfig/interface/dns/lib/lang/it_dns_cname.lng new file mode 100644 index 0000000000000000000000000000000000000000..827e5a89e86e078da9cb97ecb2bc4f5f9fd05272 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/it_dns_cname.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/it_dns_hinfo.lng b/interface/ispconfig/interface/dns/lib/lang/it_dns_hinfo.lng new file mode 100644 index 0000000000000000000000000000000000000000..0d90bcf40b582b1a534b157d4108f9dfad48da8e --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/it_dns_hinfo.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/it_dns_mx.lng b/interface/ispconfig/interface/dns/lib/lang/it_dns_mx.lng new file mode 100644 index 0000000000000000000000000000000000000000..648827f04e34cb5e980ef95e06fbc29c9c39593e --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/it_dns_mx.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/it_dns_ns.lng b/interface/ispconfig/interface/dns/lib/lang/it_dns_ns.lng new file mode 100644 index 0000000000000000000000000000000000000000..713ec28581af3acffceb7942d73834512d4e0d98 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/it_dns_ns.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/it_dns_ptr.lng b/interface/ispconfig/interface/dns/lib/lang/it_dns_ptr.lng new file mode 100644 index 0000000000000000000000000000000000000000..c02638406828e181872e78791dba25ff7bed4dad --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/it_dns_ptr.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/it_dns_rp.lng b/interface/ispconfig/interface/dns/lib/lang/it_dns_rp.lng new file mode 100644 index 0000000000000000000000000000000000000000..d38efd1633fda6ca92aeb34765f765dba1e3f1fc --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/it_dns_rp.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/it_dns_soa.lng b/interface/ispconfig/interface/dns/lib/lang/it_dns_soa.lng new file mode 100644 index 0000000000000000000000000000000000000000..e63ffb70f668497a316be0e77dd408874502ca93 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/it_dns_soa.lng @@ -0,0 +1,26 @@ +these IPs (comma separated list)'; +$wb['active_txt'] = 'Active'; +$wb['limit_dns_zone_txt'] = 'The max. number of DNS zones for your account is reached.'; +$wb['client_txt'] = 'Client'; +$wb['no_zone_perm'] = 'You do not have the permission to add a record to this DNS zone.'; +$wb['server_id_error_empty'] = 'No server selected'; +$wb['origin_error_empty'] = 'Zone empty.'; +$wb['origin_error_unique'] = 'There is already a record for this zone.'; +$wb['origin_error_regex'] = 'Zone has a invalid format.'; +$wb['ns_error_regex'] = 'NS has a invalid format.'; +$wb['mbox_error_empty'] = 'Email is empty.'; +$wb['mbox_error_regex'] = 'Email format invalid.'; +$wb['also_notify_txt'] = 'Also Notify'; +$wb['update_acl_txt'] = 'Update ACL'; +?> diff --git a/interface/ispconfig/interface/dns/lib/lang/it_dns_soa_list.lng b/interface/ispconfig/interface/dns/lib/lang/it_dns_soa_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..42bb32920ccbd370c1ffb932dbd0178b84637d73 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/it_dns_soa_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/it_dns_srv.lng b/interface/ispconfig/interface/dns/lib/lang/it_dns_srv.lng new file mode 100644 index 0000000000000000000000000000000000000000..d4ea60be9760c7a5764ac69fef6cb9b51ff5d339 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/it_dns_srv.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/it_dns_template.lng b/interface/ispconfig/interface/dns/lib/lang/it_dns_template.lng new file mode 100644 index 0000000000000000000000000000000000000000..3a09e3bb71b6fc2ba62aa40fce668fc2dd86ffe8 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/it_dns_template.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/it_dns_template_list.lng b/interface/ispconfig/interface/dns/lib/lang/it_dns_template_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..8d9d730e5031ef939eff8da85b9f426b82d13b88 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/it_dns_template_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/it_dns_txt.lng b/interface/ispconfig/interface/dns/lib/lang/it_dns_txt.lng new file mode 100644 index 0000000000000000000000000000000000000000..8e6c417d0d8474bc698d2a0e920334732e979d0e --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/it_dns_txt.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/it_dns_wizard.lng b/interface/ispconfig/interface/dns/lib/lang/it_dns_wizard.lng new file mode 100644 index 0000000000000000000000000000000000000000..ffceabb53acd2e84b2339c325707ce5dbbd2022d --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/it_dns_wizard.lng @@ -0,0 +1,29 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/ja.lng b/interface/ispconfig/interface/dns/lib/lang/ja.lng new file mode 100644 index 0000000000000000000000000000000000000000..f96696bc841a285acc3ef5aff56984c212418b52 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ja.lng @@ -0,0 +1,20 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/ja_dns_a.lng b/interface/ispconfig/interface/dns/lib/lang/ja_dns_a.lng new file mode 100644 index 0000000000000000000000000000000000000000..50f551627c7a0b15bb906d9c197e2e513de41633 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ja_dns_a.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/ja_dns_a_list.lng b/interface/ispconfig/interface/dns/lib/lang/ja_dns_a_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..e2297bbbb0eb61a44bc9c82369092102e849e52f --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ja_dns_a_list.lng @@ -0,0 +1,14 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/ja_dns_aaaa.lng b/interface/ispconfig/interface/dns/lib/lang/ja_dns_aaaa.lng new file mode 100644 index 0000000000000000000000000000000000000000..2ca0650fe5c0de84bce1154dcd324df7bca888b9 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ja_dns_aaaa.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/ja_dns_alias.lng b/interface/ispconfig/interface/dns/lib/lang/ja_dns_alias.lng new file mode 100644 index 0000000000000000000000000000000000000000..4e469a104fad52c53745dda25d38c9ffaf65270d --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ja_dns_alias.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/ja_dns_cname.lng b/interface/ispconfig/interface/dns/lib/lang/ja_dns_cname.lng new file mode 100644 index 0000000000000000000000000000000000000000..4e469a104fad52c53745dda25d38c9ffaf65270d --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ja_dns_cname.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/ja_dns_hinfo.lng b/interface/ispconfig/interface/dns/lib/lang/ja_dns_hinfo.lng new file mode 100644 index 0000000000000000000000000000000000000000..a0df197ca301bfd4be00b059daafbfb99b261b46 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ja_dns_hinfo.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/ja_dns_mx.lng b/interface/ispconfig/interface/dns/lib/lang/ja_dns_mx.lng new file mode 100644 index 0000000000000000000000000000000000000000..648827f04e34cb5e980ef95e06fbc29c9c39593e --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ja_dns_mx.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/ja_dns_ns.lng b/interface/ispconfig/interface/dns/lib/lang/ja_dns_ns.lng new file mode 100644 index 0000000000000000000000000000000000000000..b9070d8318fe251ce288666632548f1d94e53c8d --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ja_dns_ns.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/ja_dns_ptr.lng b/interface/ispconfig/interface/dns/lib/lang/ja_dns_ptr.lng new file mode 100644 index 0000000000000000000000000000000000000000..8f5f3da20677d75e552da0308380a2888951bf62 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ja_dns_ptr.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/ja_dns_rp.lng b/interface/ispconfig/interface/dns/lib/lang/ja_dns_rp.lng new file mode 100644 index 0000000000000000000000000000000000000000..c43a721e6062137bd2a2610bc2c25c05cf8a9bcd --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ja_dns_rp.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/ja_dns_soa.lng b/interface/ispconfig/interface/dns/lib/lang/ja_dns_soa.lng new file mode 100644 index 0000000000000000000000000000000000000000..d00e8afb65129b07d7da35c29679c696b579abf7 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ja_dns_soa.lng @@ -0,0 +1,26 @@ +(, で区切ってください)'; +$wb['active_txt'] = '有効'; +$wb['limit_dns_zone_txt'] = 'DNSゾーンが最大数に達しました。'; +$wb['client_txt'] = 'クライアント'; +$wb['no_zone_perm'] = 'このDNSゾーンにレコードを追加する権限がありません。'; +$wb['server_id_error_empty'] = 'サーバーを選択してください。'; +$wb['origin_error_empty'] = 'Zone を指定してください。'; +$wb['origin_error_unique'] = '同名の Zone が既に存在します。'; +$wb['origin_error_regex'] = 'Zone名が不正な文字を含んでいます。'; +$wb['ns_error_regex'] = 'NS が不正な文字を含んでいます。'; +$wb['mbox_error_empty'] = 'メールアドレスを指定してください'; +$wb['mbox_error_regex'] = 'メールアドレスの形式が不正です。'; +$wb['also_notify_txt'] = 'Also Notify'; +$wb['update_acl_txt'] = 'Update ACL'; +?> diff --git a/interface/ispconfig/interface/dns/lib/lang/ja_dns_soa_list.lng b/interface/ispconfig/interface/dns/lib/lang/ja_dns_soa_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..d6660d9e00d6d1ff3e2cdc98774c31f5474144c7 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ja_dns_soa_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/ja_dns_srv.lng b/interface/ispconfig/interface/dns/lib/lang/ja_dns_srv.lng new file mode 100644 index 0000000000000000000000000000000000000000..94a7f37865ef223ae03237d220c84944182d0f1b --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ja_dns_srv.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/ja_dns_template.lng b/interface/ispconfig/interface/dns/lib/lang/ja_dns_template.lng new file mode 100644 index 0000000000000000000000000000000000000000..7c05ae1cc4fc62dac1fb6d48124a9690212854fb --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ja_dns_template.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/ja_dns_template_list.lng b/interface/ispconfig/interface/dns/lib/lang/ja_dns_template_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..2ed5746fa455600e6fb401aa14cf9a4bbb93e693 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ja_dns_template_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/ja_dns_txt.lng b/interface/ispconfig/interface/dns/lib/lang/ja_dns_txt.lng new file mode 100644 index 0000000000000000000000000000000000000000..3af17ab2553fd34f5db626f239dc1cfa60434ebc --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ja_dns_txt.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/ja_dns_wizard.lng b/interface/ispconfig/interface/dns/lib/lang/ja_dns_wizard.lng new file mode 100644 index 0000000000000000000000000000000000000000..508911da644035ad6f87d254c96fd4e6090524ea --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ja_dns_wizard.lng @@ -0,0 +1,29 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/nl.lng b/interface/ispconfig/interface/dns/lib/lang/nl.lng new file mode 100644 index 0000000000000000000000000000000000000000..56e5386c5347d7cb68b087aa59624513fb2be46d --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/nl.lng @@ -0,0 +1,20 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/nl_dns_a.lng b/interface/ispconfig/interface/dns/lib/lang/nl_dns_a.lng new file mode 100644 index 0000000000000000000000000000000000000000..32bab7464b27bd1c04e214eee07bededb7413b2d --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/nl_dns_a.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/nl_dns_a_list.lng b/interface/ispconfig/interface/dns/lib/lang/nl_dns_a_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..9ffacd242cc258da36334e0c36e4bef2432d0348 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/nl_dns_a_list.lng @@ -0,0 +1,14 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/nl_dns_aaaa.lng b/interface/ispconfig/interface/dns/lib/lang/nl_dns_aaaa.lng new file mode 100644 index 0000000000000000000000000000000000000000..c40ae84d93ff60bccdc74e24cf5e4be2d8bc1300 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/nl_dns_aaaa.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/nl_dns_alias.lng b/interface/ispconfig/interface/dns/lib/lang/nl_dns_alias.lng new file mode 100644 index 0000000000000000000000000000000000000000..2f9cccf72da697aadf0c4196edd657fc829a2574 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/nl_dns_alias.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/nl_dns_cname.lng b/interface/ispconfig/interface/dns/lib/lang/nl_dns_cname.lng new file mode 100644 index 0000000000000000000000000000000000000000..c5891e427e108eb8dff1157ed70447e120f5c741 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/nl_dns_cname.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/nl_dns_hinfo.lng b/interface/ispconfig/interface/dns/lib/lang/nl_dns_hinfo.lng new file mode 100644 index 0000000000000000000000000000000000000000..a7287c4236e0bb512076d2b50f946c80219feadb --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/nl_dns_hinfo.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/nl_dns_mx.lng b/interface/ispconfig/interface/dns/lib/lang/nl_dns_mx.lng new file mode 100644 index 0000000000000000000000000000000000000000..f93195c1b997f4bcc606008df44471675448270d --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/nl_dns_mx.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/nl_dns_ns.lng b/interface/ispconfig/interface/dns/lib/lang/nl_dns_ns.lng new file mode 100644 index 0000000000000000000000000000000000000000..75a91b41d654faf3dc6231c6a185ae5d2323bb54 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/nl_dns_ns.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/nl_dns_ptr.lng b/interface/ispconfig/interface/dns/lib/lang/nl_dns_ptr.lng new file mode 100644 index 0000000000000000000000000000000000000000..4bd156388de5c0b04f47213646ee554d6cdcbef5 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/nl_dns_ptr.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/nl_dns_rp.lng b/interface/ispconfig/interface/dns/lib/lang/nl_dns_rp.lng new file mode 100644 index 0000000000000000000000000000000000000000..1195406a1e6eb6f38f1703b725e6a79f3204bd7d --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/nl_dns_rp.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/nl_dns_soa.lng b/interface/ispconfig/interface/dns/lib/lang/nl_dns_soa.lng new file mode 100644 index 0000000000000000000000000000000000000000..e1d149aec9985385fb3919fb02d789751bcd5813 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/nl_dns_soa.lng @@ -0,0 +1,26 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/nl_dns_soa_list.lng b/interface/ispconfig/interface/dns/lib/lang/nl_dns_soa_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..e6474cb1b53caf3073b6201e4ac58c2fc07181ea --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/nl_dns_soa_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/nl_dns_srv.lng b/interface/ispconfig/interface/dns/lib/lang/nl_dns_srv.lng new file mode 100644 index 0000000000000000000000000000000000000000..202d62d4804dd8000173c33eddb9049457074c77 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/nl_dns_srv.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/nl_dns_template.lng b/interface/ispconfig/interface/dns/lib/lang/nl_dns_template.lng new file mode 100644 index 0000000000000000000000000000000000000000..a6f8e0e9b15450ff5ce9e789b995d8e52fd3680b --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/nl_dns_template.lng @@ -0,0 +1,6 @@ +
Voorbeeld (in nieuw venster)'; +$wb['visible_txt'] = 'Geactiveerd voor DNS wizard?'; +?> diff --git a/interface/ispconfig/interface/dns/lib/lang/nl_dns_template_list.lng b/interface/ispconfig/interface/dns/lib/lang/nl_dns_template_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..6ca214c55dcf6a7fe59cd2ab1676de4df12ce735 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/nl_dns_template_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/nl_dns_txt.lng b/interface/ispconfig/interface/dns/lib/lang/nl_dns_txt.lng new file mode 100644 index 0000000000000000000000000000000000000000..94dbb3f474a89000daa3ed1db183eede633ca004 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/nl_dns_txt.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/nl_dns_wizard.lng b/interface/ispconfig/interface/dns/lib/lang/nl_dns_wizard.lng new file mode 100644 index 0000000000000000000000000000000000000000..e7093f01e9a6ae6bf8c2ffea458998cf95c8e41f --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/nl_dns_wizard.lng @@ -0,0 +1,29 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/pl.lng b/interface/ispconfig/interface/dns/lib/lang/pl.lng new file mode 100644 index 0000000000000000000000000000000000000000..0a3f1a9fbe22fd7fc42ab2879016ebf2c2598e8f --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/pl.lng @@ -0,0 +1,20 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/pl_dns_a.lng b/interface/ispconfig/interface/dns/lib/lang/pl_dns_a.lng new file mode 100644 index 0000000000000000000000000000000000000000..4ad0a7c41a003c124a7db4c2bb7f45acc309a1e1 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/pl_dns_a.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/pl_dns_a_list.lng b/interface/ispconfig/interface/dns/lib/lang/pl_dns_a_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..3d0db059b0f9945f7270daad3661ec34f0fce134 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/pl_dns_a_list.lng @@ -0,0 +1,14 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/pl_dns_aaaa.lng b/interface/ispconfig/interface/dns/lib/lang/pl_dns_aaaa.lng new file mode 100644 index 0000000000000000000000000000000000000000..983fae1a8c68172cd0126fad52d69ae066b0e1f3 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/pl_dns_aaaa.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/pl_dns_alias.lng b/interface/ispconfig/interface/dns/lib/lang/pl_dns_alias.lng new file mode 100644 index 0000000000000000000000000000000000000000..a950805e3b4378caa7b4d4162242f4580ace4909 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/pl_dns_alias.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/pl_dns_cname.lng b/interface/ispconfig/interface/dns/lib/lang/pl_dns_cname.lng new file mode 100644 index 0000000000000000000000000000000000000000..92cb4ac97dc20f604080d52cd632c8e7bf00b415 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/pl_dns_cname.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/pl_dns_hinfo.lng b/interface/ispconfig/interface/dns/lib/lang/pl_dns_hinfo.lng new file mode 100644 index 0000000000000000000000000000000000000000..53b6da2265ca00e50f987b646e556435b8de04a5 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/pl_dns_hinfo.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/pl_dns_mx.lng b/interface/ispconfig/interface/dns/lib/lang/pl_dns_mx.lng new file mode 100644 index 0000000000000000000000000000000000000000..4a3936a1b4a03a728d9d5fa2a37ad49cea18ba80 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/pl_dns_mx.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/pl_dns_ns.lng b/interface/ispconfig/interface/dns/lib/lang/pl_dns_ns.lng new file mode 100644 index 0000000000000000000000000000000000000000..18d7efd6cd3d6310b129234e6e2152d24b540602 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/pl_dns_ns.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/pl_dns_ptr.lng b/interface/ispconfig/interface/dns/lib/lang/pl_dns_ptr.lng new file mode 100644 index 0000000000000000000000000000000000000000..eae39817a0b36242ea5805da88414b963054eb7d --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/pl_dns_ptr.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/pl_dns_rp.lng b/interface/ispconfig/interface/dns/lib/lang/pl_dns_rp.lng new file mode 100644 index 0000000000000000000000000000000000000000..ece9346e32e6d704726fc4c9d528a73cd40bee19 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/pl_dns_rp.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/pl_dns_soa.lng b/interface/ispconfig/interface/dns/lib/lang/pl_dns_soa.lng new file mode 100644 index 0000000000000000000000000000000000000000..868615e081ee625e332c7e7123ac2a371f0bc42b --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/pl_dns_soa.lng @@ -0,0 +1,26 @@ +tych adresów IP (adresy rozdzielaj przecinkiem)'; +$wb['active_txt'] = 'Aktywny'; +$wb['limit_dns_zone_txt'] = 'Maksymalna ilość stref DNS dla Twojego konta została przekroczona.'; +$wb['client_txt'] = 'Klient'; +$wb['no_zone_perm'] = 'Nie masz uprawnień, aby dodać nowy wpis dla tej strefy DNS.'; +$wb['server_id_error_empty'] = 'Nie wybrano serwera'; +$wb['origin_error_empty'] = 'Strefa jest pusta.'; +$wb['origin_error_unique'] = 'Istnieje już wpis dla tej strefy.'; +$wb['origin_error_regex'] = 'Strefa ma niepoprawny format.'; +$wb['ns_error_regex'] = 'NS ma niepoprawny format.'; +$wb['mbox_error_empty'] = 'E-mail jest pusty.'; +$wb['mbox_error_regex'] = 'E-mail ma niepoprawny format.'; +$wb['also_notify_txt'] = 'Also Notify'; +$wb['update_acl_txt'] = 'Update ACL'; +?> diff --git a/interface/ispconfig/interface/dns/lib/lang/pl_dns_soa_list.lng b/interface/ispconfig/interface/dns/lib/lang/pl_dns_soa_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..126209edaeb45f3a59e8b0ef93af6900a6919ad4 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/pl_dns_soa_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/pl_dns_srv.lng b/interface/ispconfig/interface/dns/lib/lang/pl_dns_srv.lng new file mode 100644 index 0000000000000000000000000000000000000000..633962132a342e27a8a467f614d0553f56735079 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/pl_dns_srv.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/pl_dns_template.lng b/interface/ispconfig/interface/dns/lib/lang/pl_dns_template.lng new file mode 100644 index 0000000000000000000000000000000000000000..f3e756357728ab5538d7c01600bc25c23439c1bc --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/pl_dns_template.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/pl_dns_template_list.lng b/interface/ispconfig/interface/dns/lib/lang/pl_dns_template_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..7deac3b2fa01cc7f62d7b9865abe0b969912a5d0 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/pl_dns_template_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/pl_dns_txt.lng b/interface/ispconfig/interface/dns/lib/lang/pl_dns_txt.lng new file mode 100644 index 0000000000000000000000000000000000000000..628d5c047edd2cf74335530a1704eeca49b3936f --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/pl_dns_txt.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/pl_dns_wizard.lng b/interface/ispconfig/interface/dns/lib/lang/pl_dns_wizard.lng new file mode 100644 index 0000000000000000000000000000000000000000..a5d6a90997b9b3b30433bff90dcbfc75e35fc056 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/pl_dns_wizard.lng @@ -0,0 +1,29 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/pt.lng b/interface/ispconfig/interface/dns/lib/lang/pt.lng new file mode 100644 index 0000000000000000000000000000000000000000..9f1ccffb47923267eb1b3b9af44ac83bbfeb736f --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/pt.lng @@ -0,0 +1,21 @@ + + diff --git a/interface/ispconfig/interface/dns/lib/lang/pt_dns_a.lng b/interface/ispconfig/interface/dns/lib/lang/pt_dns_a.lng new file mode 100644 index 0000000000000000000000000000000000000000..3774b1a74291f2359a166cc26e073596f86ef609 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/pt_dns_a.lng @@ -0,0 +1,17 @@ + + diff --git a/interface/ispconfig/interface/dns/lib/lang/pt_dns_a_list.lng b/interface/ispconfig/interface/dns/lib/lang/pt_dns_a_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..d7d55f21a224b89f4b3ed68cc082e0b14e09d896 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/pt_dns_a_list.lng @@ -0,0 +1,15 @@ + + diff --git a/interface/ispconfig/interface/dns/lib/lang/pt_dns_aaaa.lng b/interface/ispconfig/interface/dns/lib/lang/pt_dns_aaaa.lng new file mode 100644 index 0000000000000000000000000000000000000000..4b4524b6055a785bc1a16484b63e65f43a860eea --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/pt_dns_aaaa.lng @@ -0,0 +1,16 @@ + + diff --git a/interface/ispconfig/interface/dns/lib/lang/pt_dns_alias.lng b/interface/ispconfig/interface/dns/lib/lang/pt_dns_alias.lng new file mode 100644 index 0000000000000000000000000000000000000000..d7e91e6857a869c209f1b4528ebd666aed99cc58 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/pt_dns_alias.lng @@ -0,0 +1,16 @@ + + diff --git a/interface/ispconfig/interface/dns/lib/lang/pt_dns_cname.lng b/interface/ispconfig/interface/dns/lib/lang/pt_dns_cname.lng new file mode 100644 index 0000000000000000000000000000000000000000..bb75bcc21d20c31da64add144dbbba7acbb5bf5a --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/pt_dns_cname.lng @@ -0,0 +1,16 @@ + + diff --git a/interface/ispconfig/interface/dns/lib/lang/pt_dns_hinfo.lng b/interface/ispconfig/interface/dns/lib/lang/pt_dns_hinfo.lng new file mode 100644 index 0000000000000000000000000000000000000000..66829172781bd952145a0edffe2601e00c863451 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/pt_dns_hinfo.lng @@ -0,0 +1,16 @@ + + diff --git a/interface/ispconfig/interface/dns/lib/lang/pt_dns_mx.lng b/interface/ispconfig/interface/dns/lib/lang/pt_dns_mx.lng new file mode 100644 index 0000000000000000000000000000000000000000..d8b59a7659cda9718f578e2f4de65af853fac1f0 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/pt_dns_mx.lng @@ -0,0 +1,17 @@ + + diff --git a/interface/ispconfig/interface/dns/lib/lang/pt_dns_ns.lng b/interface/ispconfig/interface/dns/lib/lang/pt_dns_ns.lng new file mode 100644 index 0000000000000000000000000000000000000000..2e16d94de9de995bcd0c7e173fbd4c382fd29dec --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/pt_dns_ns.lng @@ -0,0 +1,16 @@ + + diff --git a/interface/ispconfig/interface/dns/lib/lang/pt_dns_ptr.lng b/interface/ispconfig/interface/dns/lib/lang/pt_dns_ptr.lng new file mode 100644 index 0000000000000000000000000000000000000000..298872ad1f20c916ff739dd9b8cc9867ef0d21fc --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/pt_dns_ptr.lng @@ -0,0 +1,16 @@ + + diff --git a/interface/ispconfig/interface/dns/lib/lang/pt_dns_rp.lng b/interface/ispconfig/interface/dns/lib/lang/pt_dns_rp.lng new file mode 100644 index 0000000000000000000000000000000000000000..ba45e858ce74c6a387b9d5527870815fb796822f --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/pt_dns_rp.lng @@ -0,0 +1,16 @@ + + diff --git a/interface/ispconfig/interface/dns/lib/lang/pt_dns_soa.lng b/interface/ispconfig/interface/dns/lib/lang/pt_dns_soa.lng new file mode 100644 index 0000000000000000000000000000000000000000..5d10de28d60359a9be993c78830749a84e2f44fe --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/pt_dns_soa.lng @@ -0,0 +1,27 @@ +estes IPs (lista separada por ponto e vírgula)'; +$wb['active_txt'] = 'Activo'; +$wb['limit_dns_zone_txt'] = 'O número máximo de zonas DNS para a conta foi atingido.'; +$wb['client_txt'] = 'Cliente'; +$wb['no_zone_perm'] = 'Não tem permissão para adicionar registos a está zona DNS.'; +$wb['server_id_error_empty'] = 'Servidor não seleccionado'; +$wb['origin_error_empty'] = 'Zona vazia.'; +$wb['origin_error_unique'] = 'Este registo já existe nesta zona.'; +$wb['origin_error_regex'] = 'Formato de zona inválido.'; +$wb['ns_error_regex'] = 'NS tem um formato inválido.'; +$wb['mbox_error_empty'] = 'Correio está em branco.'; +$wb['mbox_error_regex'] = 'Correio com formato inválido.'; +$wb['also_notify_txt'] = 'Also Notify'; +$wb['update_acl_txt'] = 'Actualizar ACL'; +?> + diff --git a/interface/ispconfig/interface/dns/lib/lang/pt_dns_soa_list.lng b/interface/ispconfig/interface/dns/lib/lang/pt_dns_soa_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..1345fafe3c724cdb52b2a2173c0a6934957cc0c4 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/pt_dns_soa_list.lng @@ -0,0 +1,10 @@ + + diff --git a/interface/ispconfig/interface/dns/lib/lang/pt_dns_srv.lng b/interface/ispconfig/interface/dns/lib/lang/pt_dns_srv.lng new file mode 100644 index 0000000000000000000000000000000000000000..853bcf5aabf0a3bc26bdfb15d102b25b9d1b3518 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/pt_dns_srv.lng @@ -0,0 +1,17 @@ + + diff --git a/interface/ispconfig/interface/dns/lib/lang/pt_dns_template.lng b/interface/ispconfig/interface/dns/lib/lang/pt_dns_template.lng new file mode 100644 index 0000000000000000000000000000000000000000..9ee4e72228d1fd2572cb1947cb2a87297d8ce831 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/pt_dns_template.lng @@ -0,0 +1,7 @@ + + diff --git a/interface/ispconfig/interface/dns/lib/lang/pt_dns_template_list.lng b/interface/ispconfig/interface/dns/lib/lang/pt_dns_template_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..1c89fd5156b89795c437d85cd76cd31b92cf6ea9 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/pt_dns_template_list.lng @@ -0,0 +1,7 @@ + + diff --git a/interface/ispconfig/interface/dns/lib/lang/pt_dns_txt.lng b/interface/ispconfig/interface/dns/lib/lang/pt_dns_txt.lng new file mode 100644 index 0000000000000000000000000000000000000000..8e731078ac92bce2939eb048a3fb57a652e5a03e --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/pt_dns_txt.lng @@ -0,0 +1,16 @@ + + diff --git a/interface/ispconfig/interface/dns/lib/lang/pt_dns_wizard.lng b/interface/ispconfig/interface/dns/lib/lang/pt_dns_wizard.lng new file mode 100644 index 0000000000000000000000000000000000000000..8e1663c1e2828c1801319c7f08e8d0c9a7f69fba --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/pt_dns_wizard.lng @@ -0,0 +1,30 @@ + + diff --git a/interface/ispconfig/interface/dns/lib/lang/ro.lng b/interface/ispconfig/interface/dns/lib/lang/ro.lng new file mode 100644 index 0000000000000000000000000000000000000000..908f2aa49873f71728520fc0773ac63d430728b6 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ro.lng @@ -0,0 +1,20 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/ro_dns_a.lng b/interface/ispconfig/interface/dns/lib/lang/ro_dns_a.lng new file mode 100644 index 0000000000000000000000000000000000000000..617c9d6ba49ac511cf74deb9ff0c592be8c59e7f --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ro_dns_a.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/ro_dns_a_list.lng b/interface/ispconfig/interface/dns/lib/lang/ro_dns_a_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..a17f698eaea4dccbb0a47f0c6a61d02fe645abe0 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ro_dns_a_list.lng @@ -0,0 +1,14 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/ro_dns_aaaa.lng b/interface/ispconfig/interface/dns/lib/lang/ro_dns_aaaa.lng new file mode 100644 index 0000000000000000000000000000000000000000..c56d55863bee2496b2fefa05a229e4893d732b39 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ro_dns_aaaa.lng @@ -0,0 +1,15 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/lib/lang/ro_dns_alias.lng b/interface/ispconfig/interface/dns/lib/lang/ro_dns_alias.lng new file mode 100644 index 0000000000000000000000000000000000000000..defa63ac0ad356f2cfe93ec34b90b6dae5d85009 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ro_dns_alias.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/ro_dns_cname.lng b/interface/ispconfig/interface/dns/lib/lang/ro_dns_cname.lng new file mode 100644 index 0000000000000000000000000000000000000000..199d1f4310bc77eb919778399a538628027f26b0 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ro_dns_cname.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/ro_dns_hinfo.lng b/interface/ispconfig/interface/dns/lib/lang/ro_dns_hinfo.lng new file mode 100644 index 0000000000000000000000000000000000000000..598f7ab1a0c7e2c184a13468ffb2d6e5b7b6f72c --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ro_dns_hinfo.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/ro_dns_mx.lng b/interface/ispconfig/interface/dns/lib/lang/ro_dns_mx.lng new file mode 100644 index 0000000000000000000000000000000000000000..3c5b54892718fb30487dd43410e1e2e7f10041c3 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ro_dns_mx.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/ro_dns_ns.lng b/interface/ispconfig/interface/dns/lib/lang/ro_dns_ns.lng new file mode 100644 index 0000000000000000000000000000000000000000..0bf8e7ed3f864c1b8e1920b39f23fef8c2ca049d --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ro_dns_ns.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/ro_dns_ptr.lng b/interface/ispconfig/interface/dns/lib/lang/ro_dns_ptr.lng new file mode 100644 index 0000000000000000000000000000000000000000..cda046dd9d508c82adb30532e595ceadae39a7b4 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ro_dns_ptr.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/ro_dns_rp.lng b/interface/ispconfig/interface/dns/lib/lang/ro_dns_rp.lng new file mode 100644 index 0000000000000000000000000000000000000000..b77bab2e2f4111916b0df8fbbea434d501f0bfc3 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ro_dns_rp.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/ro_dns_soa.lng b/interface/ispconfig/interface/dns/lib/lang/ro_dns_soa.lng new file mode 100644 index 0000000000000000000000000000000000000000..a70d730b32354d0fc13f6135cf608b9082195e00 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ro_dns_soa.lng @@ -0,0 +1,26 @@ +aceste IP-uri (comma separated list)'; +$wb['active_txt'] = 'Active'; +$wb['limit_dns_zone_txt'] = 'numar max DNS zone pentru contul dumnevoastra a fost atins.'; +$wb['client_txt'] = 'Client'; +$wb['no_zone_perm'] = 'Nu aveti permisiunea de a adauga aceasta inregistrare in zona DNS .'; +$wb['server_id_error_empty'] = 'Nu a fost ales serverul'; +$wb['origin_error_empty'] = 'Zone goale'; +$wb['origin_error_unique'] = 'Exista deja o inregistrare pentru aceasta zona'; +$wb['origin_error_regex'] = 'Zona are un format invalid'; +$wb['ns_error_regex'] = 'NS are un format invalid'; +$wb['mbox_error_empty'] = 'Email-ul este gol'; +$wb['mbox_error_regex'] = 'Format email invalid.'; +$wb['also_notify_txt'] = 'Also Notify'; +$wb['update_acl_txt'] = 'Update ACL'; +?> diff --git a/interface/ispconfig/interface/dns/lib/lang/ro_dns_soa_list.lng b/interface/ispconfig/interface/dns/lib/lang/ro_dns_soa_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..e17045622f7dec74a00de9137b58ff77603f5cd3 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ro_dns_soa_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/ro_dns_srv.lng b/interface/ispconfig/interface/dns/lib/lang/ro_dns_srv.lng new file mode 100644 index 0000000000000000000000000000000000000000..a8b501156f3a72a3b30237affa80b4ab2e915932 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ro_dns_srv.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/ro_dns_template.lng b/interface/ispconfig/interface/dns/lib/lang/ro_dns_template.lng new file mode 100644 index 0000000000000000000000000000000000000000..f097bb3a0085359889aa24e5e5c23f996370e1d7 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ro_dns_template.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/ro_dns_template_list.lng b/interface/ispconfig/interface/dns/lib/lang/ro_dns_template_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..0a14156d2eadf800b3578da81baef21a67861101 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ro_dns_template_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/ro_dns_txt.lng b/interface/ispconfig/interface/dns/lib/lang/ro_dns_txt.lng new file mode 100644 index 0000000000000000000000000000000000000000..b3f781da0823ad88484d5f90920f226d2047bad4 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ro_dns_txt.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/ro_dns_wizard.lng b/interface/ispconfig/interface/dns/lib/lang/ro_dns_wizard.lng new file mode 100644 index 0000000000000000000000000000000000000000..71d3497c6fd1078c0d6f8f69c7e13cb4082f0235 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ro_dns_wizard.lng @@ -0,0 +1,29 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/ru.lng b/interface/ispconfig/interface/dns/lib/lang/ru.lng new file mode 100644 index 0000000000000000000000000000000000000000..b47936efb4a9a40845d1aaa1d30a395acc34582d --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ru.lng @@ -0,0 +1,21 @@ + + diff --git a/interface/ispconfig/interface/dns/lib/lang/ru_dns_a.lng b/interface/ispconfig/interface/dns/lib/lang/ru_dns_a.lng new file mode 100644 index 0000000000000000000000000000000000000000..81647b9a1717495867a278410a7e69d173472d9e --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ru_dns_a.lng @@ -0,0 +1,17 @@ + + diff --git a/interface/ispconfig/interface/dns/lib/lang/ru_dns_a_list.lng b/interface/ispconfig/interface/dns/lib/lang/ru_dns_a_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..803d4d685f804ac3352891b2e7934bf6643bdc29 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ru_dns_a_list.lng @@ -0,0 +1,15 @@ + + diff --git a/interface/ispconfig/interface/dns/lib/lang/ru_dns_aaaa.lng b/interface/ispconfig/interface/dns/lib/lang/ru_dns_aaaa.lng new file mode 100644 index 0000000000000000000000000000000000000000..869206924cfb11b29dce6e96fb7518c45b3e13b8 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ru_dns_aaaa.lng @@ -0,0 +1,16 @@ + + diff --git a/interface/ispconfig/interface/dns/lib/lang/ru_dns_alias.lng b/interface/ispconfig/interface/dns/lib/lang/ru_dns_alias.lng new file mode 100644 index 0000000000000000000000000000000000000000..784f99ea3721d4124476c6abf139119f6f48a6b4 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ru_dns_alias.lng @@ -0,0 +1,16 @@ + + diff --git a/interface/ispconfig/interface/dns/lib/lang/ru_dns_cname.lng b/interface/ispconfig/interface/dns/lib/lang/ru_dns_cname.lng new file mode 100644 index 0000000000000000000000000000000000000000..6089373fe750d5d84483c98105200559541c502d --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ru_dns_cname.lng @@ -0,0 +1,16 @@ + + diff --git a/interface/ispconfig/interface/dns/lib/lang/ru_dns_hinfo.lng b/interface/ispconfig/interface/dns/lib/lang/ru_dns_hinfo.lng new file mode 100644 index 0000000000000000000000000000000000000000..986891e8097622c5e4e2d931f490aba0faa72a45 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ru_dns_hinfo.lng @@ -0,0 +1,16 @@ + + diff --git a/interface/ispconfig/interface/dns/lib/lang/ru_dns_mx.lng b/interface/ispconfig/interface/dns/lib/lang/ru_dns_mx.lng new file mode 100644 index 0000000000000000000000000000000000000000..d1bcbb2d13bf7a03e647a795a8c1712e10d52783 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ru_dns_mx.lng @@ -0,0 +1,17 @@ + + diff --git a/interface/ispconfig/interface/dns/lib/lang/ru_dns_ns.lng b/interface/ispconfig/interface/dns/lib/lang/ru_dns_ns.lng new file mode 100644 index 0000000000000000000000000000000000000000..8e9f7d611a1a0beb3a61469b6ddfbf4ab4960270 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ru_dns_ns.lng @@ -0,0 +1,16 @@ + + diff --git a/interface/ispconfig/interface/dns/lib/lang/ru_dns_ptr.lng b/interface/ispconfig/interface/dns/lib/lang/ru_dns_ptr.lng new file mode 100644 index 0000000000000000000000000000000000000000..2e5e0007c953c13eeb18868cd78cf048fe006ab9 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ru_dns_ptr.lng @@ -0,0 +1,16 @@ + + diff --git a/interface/ispconfig/interface/dns/lib/lang/ru_dns_rp.lng b/interface/ispconfig/interface/dns/lib/lang/ru_dns_rp.lng new file mode 100644 index 0000000000000000000000000000000000000000..22015068f77117962b9863e659b998054535cb19 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ru_dns_rp.lng @@ -0,0 +1,16 @@ + + diff --git a/interface/ispconfig/interface/dns/lib/lang/ru_dns_soa.lng b/interface/ispconfig/interface/dns/lib/lang/ru_dns_soa.lng new file mode 100644 index 0000000000000000000000000000000000000000..03dfdeb4c4fd5a4837f9af949b5e7ad45cad007b --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ru_dns_soa.lng @@ -0,0 +1,27 @@ + + diff --git a/interface/ispconfig/interface/dns/lib/lang/ru_dns_soa_list.lng b/interface/ispconfig/interface/dns/lib/lang/ru_dns_soa_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..250f49a9931c08aa053c20599327e09e3d2f6d5d --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ru_dns_soa_list.lng @@ -0,0 +1,10 @@ + + diff --git a/interface/ispconfig/interface/dns/lib/lang/ru_dns_srv.lng b/interface/ispconfig/interface/dns/lib/lang/ru_dns_srv.lng new file mode 100644 index 0000000000000000000000000000000000000000..dece24af952917e7cfc16e03adf8ea034d27d316 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ru_dns_srv.lng @@ -0,0 +1,17 @@ + + diff --git a/interface/ispconfig/interface/dns/lib/lang/ru_dns_template.lng b/interface/ispconfig/interface/dns/lib/lang/ru_dns_template.lng new file mode 100644 index 0000000000000000000000000000000000000000..9b9b0c177905deb7111d37c2465ef8e41d73099b --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ru_dns_template.lng @@ -0,0 +1,7 @@ + + diff --git a/interface/ispconfig/interface/dns/lib/lang/ru_dns_template_list.lng b/interface/ispconfig/interface/dns/lib/lang/ru_dns_template_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..b9c4fc38e49b7b75899868917dfbb43005020362 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ru_dns_template_list.lng @@ -0,0 +1,7 @@ + + diff --git a/interface/ispconfig/interface/dns/lib/lang/ru_dns_txt.lng b/interface/ispconfig/interface/dns/lib/lang/ru_dns_txt.lng new file mode 100644 index 0000000000000000000000000000000000000000..98e342f9a5f1d1c0777c0f3a550bfe551e18338d --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ru_dns_txt.lng @@ -0,0 +1,16 @@ + + diff --git a/interface/ispconfig/interface/dns/lib/lang/ru_dns_wizard.lng b/interface/ispconfig/interface/dns/lib/lang/ru_dns_wizard.lng new file mode 100644 index 0000000000000000000000000000000000000000..62f27590943ce6320da8802272e20b1e82e3f087 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ru_dns_wizard.lng @@ -0,0 +1,30 @@ + + diff --git a/interface/ispconfig/interface/dns/lib/lang/se.lng b/interface/ispconfig/interface/dns/lib/lang/se.lng new file mode 100644 index 0000000000000000000000000000000000000000..36def8e93d3ba7fdd8be805098f12a23eda90593 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/se.lng @@ -0,0 +1,20 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/se_dns_a.lng b/interface/ispconfig/interface/dns/lib/lang/se_dns_a.lng new file mode 100644 index 0000000000000000000000000000000000000000..88021395116d1d0cf878a58514d3314492c9b9a8 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/se_dns_a.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/se_dns_a_list.lng b/interface/ispconfig/interface/dns/lib/lang/se_dns_a_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..87c9cd8185000323da69e78800acdb0f8ac85413 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/se_dns_a_list.lng @@ -0,0 +1,14 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/se_dns_aaaa.lng b/interface/ispconfig/interface/dns/lib/lang/se_dns_aaaa.lng new file mode 100644 index 0000000000000000000000000000000000000000..31ef0da1509439e879fecc0fb721370eab8e0d12 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/se_dns_aaaa.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/se_dns_alias.lng b/interface/ispconfig/interface/dns/lib/lang/se_dns_alias.lng new file mode 100644 index 0000000000000000000000000000000000000000..827e5a89e86e078da9cb97ecb2bc4f5f9fd05272 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/se_dns_alias.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/se_dns_cname.lng b/interface/ispconfig/interface/dns/lib/lang/se_dns_cname.lng new file mode 100644 index 0000000000000000000000000000000000000000..827e5a89e86e078da9cb97ecb2bc4f5f9fd05272 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/se_dns_cname.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/se_dns_hinfo.lng b/interface/ispconfig/interface/dns/lib/lang/se_dns_hinfo.lng new file mode 100644 index 0000000000000000000000000000000000000000..0d90bcf40b582b1a534b157d4108f9dfad48da8e --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/se_dns_hinfo.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/se_dns_mx.lng b/interface/ispconfig/interface/dns/lib/lang/se_dns_mx.lng new file mode 100644 index 0000000000000000000000000000000000000000..648827f04e34cb5e980ef95e06fbc29c9c39593e --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/se_dns_mx.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/se_dns_ns.lng b/interface/ispconfig/interface/dns/lib/lang/se_dns_ns.lng new file mode 100644 index 0000000000000000000000000000000000000000..713ec28581af3acffceb7942d73834512d4e0d98 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/se_dns_ns.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/se_dns_ptr.lng b/interface/ispconfig/interface/dns/lib/lang/se_dns_ptr.lng new file mode 100644 index 0000000000000000000000000000000000000000..c02638406828e181872e78791dba25ff7bed4dad --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/se_dns_ptr.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/se_dns_rp.lng b/interface/ispconfig/interface/dns/lib/lang/se_dns_rp.lng new file mode 100644 index 0000000000000000000000000000000000000000..d38efd1633fda6ca92aeb34765f765dba1e3f1fc --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/se_dns_rp.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/se_dns_soa.lng b/interface/ispconfig/interface/dns/lib/lang/se_dns_soa.lng new file mode 100644 index 0000000000000000000000000000000000000000..e63ffb70f668497a316be0e77dd408874502ca93 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/se_dns_soa.lng @@ -0,0 +1,26 @@ +these IPs (comma separated list)'; +$wb['active_txt'] = 'Active'; +$wb['limit_dns_zone_txt'] = 'The max. number of DNS zones for your account is reached.'; +$wb['client_txt'] = 'Client'; +$wb['no_zone_perm'] = 'You do not have the permission to add a record to this DNS zone.'; +$wb['server_id_error_empty'] = 'No server selected'; +$wb['origin_error_empty'] = 'Zone empty.'; +$wb['origin_error_unique'] = 'There is already a record for this zone.'; +$wb['origin_error_regex'] = 'Zone has a invalid format.'; +$wb['ns_error_regex'] = 'NS has a invalid format.'; +$wb['mbox_error_empty'] = 'Email is empty.'; +$wb['mbox_error_regex'] = 'Email format invalid.'; +$wb['also_notify_txt'] = 'Also Notify'; +$wb['update_acl_txt'] = 'Update ACL'; +?> diff --git a/interface/ispconfig/interface/dns/lib/lang/se_dns_soa_list.lng b/interface/ispconfig/interface/dns/lib/lang/se_dns_soa_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..42bb32920ccbd370c1ffb932dbd0178b84637d73 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/se_dns_soa_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/se_dns_srv.lng b/interface/ispconfig/interface/dns/lib/lang/se_dns_srv.lng new file mode 100644 index 0000000000000000000000000000000000000000..d4ea60be9760c7a5764ac69fef6cb9b51ff5d339 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/se_dns_srv.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/se_dns_template.lng b/interface/ispconfig/interface/dns/lib/lang/se_dns_template.lng new file mode 100644 index 0000000000000000000000000000000000000000..3a09e3bb71b6fc2ba62aa40fce668fc2dd86ffe8 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/se_dns_template.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/se_dns_template_list.lng b/interface/ispconfig/interface/dns/lib/lang/se_dns_template_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..8d9d730e5031ef939eff8da85b9f426b82d13b88 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/se_dns_template_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/se_dns_txt.lng b/interface/ispconfig/interface/dns/lib/lang/se_dns_txt.lng new file mode 100644 index 0000000000000000000000000000000000000000..8e6c417d0d8474bc698d2a0e920334732e979d0e --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/se_dns_txt.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/se_dns_wizard.lng b/interface/ispconfig/interface/dns/lib/lang/se_dns_wizard.lng new file mode 100644 index 0000000000000000000000000000000000000000..ffceabb53acd2e84b2339c325707ce5dbbd2022d --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/se_dns_wizard.lng @@ -0,0 +1,29 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/sk.lng b/interface/ispconfig/interface/dns/lib/lang/sk.lng new file mode 100644 index 0000000000000000000000000000000000000000..a7f9836185dfde402d6f82105906d2d7bc41b3c1 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/sk.lng @@ -0,0 +1,20 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/sk_dns_a.lng b/interface/ispconfig/interface/dns/lib/lang/sk_dns_a.lng new file mode 100644 index 0000000000000000000000000000000000000000..ce9974d2f9d4fdedc3dc64207d0d4426e1b8dbb9 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/sk_dns_a.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/sk_dns_a_list.lng b/interface/ispconfig/interface/dns/lib/lang/sk_dns_a_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..d1124a9531a3115bddc7c99beff5b10602049e97 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/sk_dns_a_list.lng @@ -0,0 +1,14 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/sk_dns_aaaa.lng b/interface/ispconfig/interface/dns/lib/lang/sk_dns_aaaa.lng new file mode 100644 index 0000000000000000000000000000000000000000..03dfe3fc66aed3090e06c629f5d25182be918e79 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/sk_dns_aaaa.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/sk_dns_alias.lng b/interface/ispconfig/interface/dns/lib/lang/sk_dns_alias.lng new file mode 100644 index 0000000000000000000000000000000000000000..a7b4cb228fe1909b4a83cea8b64fa582d8497925 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/sk_dns_alias.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/sk_dns_cname.lng b/interface/ispconfig/interface/dns/lib/lang/sk_dns_cname.lng new file mode 100644 index 0000000000000000000000000000000000000000..dc768706bff7d81789e38c1b7673a4efb06ca8e5 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/sk_dns_cname.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/sk_dns_hinfo.lng b/interface/ispconfig/interface/dns/lib/lang/sk_dns_hinfo.lng new file mode 100644 index 0000000000000000000000000000000000000000..33b814fe2cb7c79e7f9c2baadb66b1bf20c3c8f9 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/sk_dns_hinfo.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/sk_dns_mx.lng b/interface/ispconfig/interface/dns/lib/lang/sk_dns_mx.lng new file mode 100644 index 0000000000000000000000000000000000000000..d179568ae191c134e1bd07095be1f1233448c0ed --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/sk_dns_mx.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/sk_dns_ns.lng b/interface/ispconfig/interface/dns/lib/lang/sk_dns_ns.lng new file mode 100644 index 0000000000000000000000000000000000000000..5df4592ebc417dc4310ac77f11631432bdc8000b --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/sk_dns_ns.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/sk_dns_ptr.lng b/interface/ispconfig/interface/dns/lib/lang/sk_dns_ptr.lng new file mode 100644 index 0000000000000000000000000000000000000000..cac489d0541f1b5e76233fd3cd2fd6dd068bdedf --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/sk_dns_ptr.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/sk_dns_rp.lng b/interface/ispconfig/interface/dns/lib/lang/sk_dns_rp.lng new file mode 100644 index 0000000000000000000000000000000000000000..582b61c124b7682405a541fb8ac12864d84d424a --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/sk_dns_rp.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/sk_dns_soa.lng b/interface/ispconfig/interface/dns/lib/lang/sk_dns_soa.lng new file mode 100644 index 0000000000000000000000000000000000000000..98de52e15a5cf04ef97d01ee7a96a0547f2d2a50 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/sk_dns_soa.lng @@ -0,0 +1,26 @@ +tieto IP (comma separated list)'; +$wb['active_txt'] = 'Actvova?'; +$wb['limit_dns_zone_txt'] = 'Max. po?et zn DNS pre v ?et je dosiahnut.'; +$wb['client_txt'] = 'Klient'; +$wb['no_zone_perm'] = 'Nemte oprvnenie prida? zznam do tejto zny DNS.'; +$wb['server_id_error_empty'] = 'iaden vybran server'; +$wb['origin_error_empty'] = 'Prazdna zna.'; +$wb['origin_error_unique'] = 'V s?asnosti u existuje zznam pre tto znu.'; +$wb['origin_error_regex'] = 'Zna m neplatn formt.'; +$wb['ns_error_regex'] = 'NS m neplatn formt.'; +$wb['mbox_error_empty'] = 'Email je przdny.'; +$wb['mbox_error_regex'] = 'Email m neplatn formt.'; +$wb['also_notify_txt'] = 'Also Notify'; +$wb['update_acl_txt'] = 'Update ACL'; +?> diff --git a/interface/ispconfig/interface/dns/lib/lang/sk_dns_soa_list.lng b/interface/ispconfig/interface/dns/lib/lang/sk_dns_soa_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..91a9788029c4632bfd9f75537737d33bee76fc57 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/sk_dns_soa_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/sk_dns_srv.lng b/interface/ispconfig/interface/dns/lib/lang/sk_dns_srv.lng new file mode 100644 index 0000000000000000000000000000000000000000..7f867d3af6f5ede33ebfc31aca6154042b8abdb8 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/sk_dns_srv.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/sk_dns_template.lng b/interface/ispconfig/interface/dns/lib/lang/sk_dns_template.lng new file mode 100644 index 0000000000000000000000000000000000000000..4dd637f582dcf7537574183f51c78dc0076daedc --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/sk_dns_template.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/sk_dns_template_list.lng b/interface/ispconfig/interface/dns/lib/lang/sk_dns_template_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..0a7c5d7e9c18fc2cf6c024e20820d33d69cd86b0 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/sk_dns_template_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/sk_dns_txt.lng b/interface/ispconfig/interface/dns/lib/lang/sk_dns_txt.lng new file mode 100644 index 0000000000000000000000000000000000000000..e0137c0dca773e5ccd9b4dd70cc84b063341b92c --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/sk_dns_txt.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/sk_dns_wizard.lng b/interface/ispconfig/interface/dns/lib/lang/sk_dns_wizard.lng new file mode 100644 index 0000000000000000000000000000000000000000..7c845c7e9da12c97ac889de0c8dfd50c3c2b64cf --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/sk_dns_wizard.lng @@ -0,0 +1,29 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/tr.lng b/interface/ispconfig/interface/dns/lib/lang/tr.lng new file mode 100644 index 0000000000000000000000000000000000000000..36def8e93d3ba7fdd8be805098f12a23eda90593 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/tr.lng @@ -0,0 +1,20 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/tr_dns_a.lng b/interface/ispconfig/interface/dns/lib/lang/tr_dns_a.lng new file mode 100644 index 0000000000000000000000000000000000000000..097833f028ac58776c3d4470675c9f9335df808d --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/tr_dns_a.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/tr_dns_a_list.lng b/interface/ispconfig/interface/dns/lib/lang/tr_dns_a_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..77dcb83975f14a10fc5aae8ce3f9f508bed7c28f --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/tr_dns_a_list.lng @@ -0,0 +1,14 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/tr_dns_aaaa.lng b/interface/ispconfig/interface/dns/lib/lang/tr_dns_aaaa.lng new file mode 100644 index 0000000000000000000000000000000000000000..3bcf2506184bce80bc634f5374835fb01ed63c2c --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/tr_dns_aaaa.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/tr_dns_alias.lng b/interface/ispconfig/interface/dns/lib/lang/tr_dns_alias.lng new file mode 100644 index 0000000000000000000000000000000000000000..da1e6e61678d84b64715a8faa55f5d1303402c91 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/tr_dns_alias.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/tr_dns_cname.lng b/interface/ispconfig/interface/dns/lib/lang/tr_dns_cname.lng new file mode 100644 index 0000000000000000000000000000000000000000..d74cfebc994400efcb84e1d6dd7860e68592f6b8 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/tr_dns_cname.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/tr_dns_hinfo.lng b/interface/ispconfig/interface/dns/lib/lang/tr_dns_hinfo.lng new file mode 100644 index 0000000000000000000000000000000000000000..7585d136530fd97318092c917c2724609c749254 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/tr_dns_hinfo.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/tr_dns_mx.lng b/interface/ispconfig/interface/dns/lib/lang/tr_dns_mx.lng new file mode 100644 index 0000000000000000000000000000000000000000..201f686ec5df19b0f27e6e99204a580632ce2ed6 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/tr_dns_mx.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/tr_dns_ns.lng b/interface/ispconfig/interface/dns/lib/lang/tr_dns_ns.lng new file mode 100644 index 0000000000000000000000000000000000000000..0a5ef933831c1e1ca9022350f28bb251a39fd09f --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/tr_dns_ns.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/tr_dns_ptr.lng b/interface/ispconfig/interface/dns/lib/lang/tr_dns_ptr.lng new file mode 100644 index 0000000000000000000000000000000000000000..e34394522f3194b3228e7519c499457c9d2ed1d1 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/tr_dns_ptr.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/tr_dns_rp.lng b/interface/ispconfig/interface/dns/lib/lang/tr_dns_rp.lng new file mode 100644 index 0000000000000000000000000000000000000000..f444fb0e17e15d8d262eb3751c4879b395499cf5 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/tr_dns_rp.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/tr_dns_soa.lng b/interface/ispconfig/interface/dns/lib/lang/tr_dns_soa.lng new file mode 100644 index 0000000000000000000000000000000000000000..756ea05d2a2a67147be971bac0cd82cc1be55a42 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/tr_dns_soa.lng @@ -0,0 +1,26 @@ +these IPs (comma separated list)'; +$wb['active_txt'] = 'Aktif'; +$wb['limit_dns_zone_txt'] = 'Hesabınızdaki max. DNS zone kaydına ulaşıldı.'; +$wb['client_txt'] = 'Müşteri'; +$wb['no_zone_perm'] = 'Bu DNS Zone kaydını eklemek için yetkiniz yok.'; +$wb['server_id_error_empty'] = 'Seçili sunucu yok'; +$wb['origin_error_empty'] = 'Zone boş.'; +$wb['origin_error_unique'] = 'Bu zone için bir kayıt zaten var.'; +$wb['origin_error_regex'] = 'Zone geçersiz formatta.'; +$wb['ns_error_regex'] = 'NS geçersiz formatta.'; +$wb['mbox_error_empty'] = 'Email boş.'; +$wb['mbox_error_regex'] = 'Email geçersiz formatta.'; +$wb['also_notify_txt'] = 'Also Notify'; +$wb['update_acl_txt'] = 'Update ACL'; +?> diff --git a/interface/ispconfig/interface/dns/lib/lang/tr_dns_soa_list.lng b/interface/ispconfig/interface/dns/lib/lang/tr_dns_soa_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..4670b20f56cdf267f128776fac4a969ca6a2ef12 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/tr_dns_soa_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/tr_dns_srv.lng b/interface/ispconfig/interface/dns/lib/lang/tr_dns_srv.lng new file mode 100644 index 0000000000000000000000000000000000000000..c56d06edaf3fe4882fff21f69947ea2a6d4c080c --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/tr_dns_srv.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/tr_dns_template.lng b/interface/ispconfig/interface/dns/lib/lang/tr_dns_template.lng new file mode 100644 index 0000000000000000000000000000000000000000..1c973fa6d6f9fe223828a3d0a5765251134df9a1 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/tr_dns_template.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/tr_dns_template_list.lng b/interface/ispconfig/interface/dns/lib/lang/tr_dns_template_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..9bc064c76321cae9ed7ea9145501de0e27357f94 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/tr_dns_template_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/tr_dns_txt.lng b/interface/ispconfig/interface/dns/lib/lang/tr_dns_txt.lng new file mode 100644 index 0000000000000000000000000000000000000000..b2475219e92715d0fb9cb383b0f0b7e5683aa344 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/tr_dns_txt.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/tr_dns_wizard.lng b/interface/ispconfig/interface/dns/lib/lang/tr_dns_wizard.lng new file mode 100644 index 0000000000000000000000000000000000000000..dbd4d5a882b8b29db5f27721d7589adf0e839edb --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/tr_dns_wizard.lng @@ -0,0 +1,29 @@ + diff --git a/interface/ispconfig/interface/dns/lib/module.conf.php b/interface/ispconfig/interface/dns/lib/module.conf.php new file mode 100644 index 0000000000000000000000000000000000000000..ae7e8c456c72320351ed89d1edfdc873bce8a2c8 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/module.conf.php @@ -0,0 +1,57 @@ + "Add DNS Zone", + 'target' => 'content', + 'link' => 'dns/dns_wizard.php'); + +if($_SESSION["s"]["user"]["typ"] == 'admin') { + + $items[] = array( 'title' => "Templates", + 'target' => 'content', + 'link' => 'dns/dns_template_list.php'); +} + + +$module["nav"][] = array( 'title' => 'DNS Wizard', + 'open' => 1, + 'items' => $items); + + +unset($items); + +/* + Email accounts menu +*/ + + +$items[] = array( 'title' => "Zones", + 'target' => 'content', + 'link' => 'dns/dns_soa_list.php'); +/* +$items[] = array( 'title' => "A-Records", + 'target' => 'content', + 'link' => 'dns/dns_a_list.php'); +*/ + + +$module["nav"][] = array( 'title' => 'DNS', + 'open' => 1, + 'items' => $items); + +unset($items); + + + + + + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/list/dns_a.list.php b/interface/ispconfig/interface/dns/list/dns_a.list.php new file mode 100644 index 0000000000000000000000000000000000000000..54470cfc1221f9704be013fe6e39bd15814165bf --- /dev/null +++ b/interface/ispconfig/interface/dns/list/dns_a.list.php @@ -0,0 +1,127 @@ + "active", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array('y' => "
Yes
",'n' => "
No
")); + + +$liste["item"][] = array( 'field' => "server_id", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "zone", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT id,origin FROM dns_soa WHERE {AUTHSQL} ORDER BY origin', + 'keyfield'=> 'id', + 'valuefield'=> 'origin' + ), + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "name", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "data", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "aux", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + + +$liste["item"][] = array( 'field' => "type", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "like", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array('A'=>'A','AAAA' => 'AAAA','ALIAS'=>'ALIAS','CNAME'=>'CNAME','HINFO'=>'HINFO','MX'=>'MX','NS'=>'NS','PTR'=>'PTR','RP'=>'RP','SRV'=>'SRV','TXT'=>'TXT')); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/list/dns_soa.list.php b/interface/ispconfig/interface/dns/list/dns_soa.list.php new file mode 100644 index 0000000000000000000000000000000000000000..3e5fae6a98436d9e2f1b0393e25718a9a41e734f --- /dev/null +++ b/interface/ispconfig/interface/dns/list/dns_soa.list.php @@ -0,0 +1,111 @@ + "active", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array('y' => "
Yes
",'n' => "
No
")); + + +$liste["item"][] = array( 'field' => "server_id", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'datasource' => array ( 'type' => 'CUSTOM', + 'class'=> 'custom_datasource', + 'function'=> 'dns_servers' + ), + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "origin", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + + +$liste["item"][] = array( 'field' => "ns", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + + +$liste["item"][] = array( 'field' => "mbox", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + + + + + + + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/list/dns_template.list.php b/interface/ispconfig/interface/dns/list/dns_template.list.php new file mode 100644 index 0000000000000000000000000000000000000000..11a1919b11a7f9489274241f94012e5909daef5c --- /dev/null +++ b/interface/ispconfig/interface/dns/list/dns_template.list.php @@ -0,0 +1,80 @@ + "visible", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array('Y' => "
Yes
",'N' => "
No
")); + + +$liste["item"][] = array( 'field' => "name", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + + + + + + + + + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/templates/dns_a_edit.htm b/interface/ispconfig/interface/dns/templates/dns_a_edit.htm new file mode 100644 index 0000000000000000000000000000000000000000..4bf2bd259f775f711c421b0997f8fe570df8939d --- /dev/null +++ b/interface/ispconfig/interface/dns/templates/dns_a_edit.htm @@ -0,0 +1,39 @@ +

+

+ +
+ +
+
+
+ + +

{tmpl_var name='name_hint_txt'}

+
+
+ + +
+
+ + +
+
+

{tmpl_var name='active_txt'}

+
+ {tmpl_var name='active'} +
+
+
+ + + + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/dns/templates/dns_a_list.htm b/interface/ispconfig/interface/dns/templates/dns_a_list.htm new file mode 100644 index 0000000000000000000000000000000000000000..19d35c21b6c077337659c6b7749c9fbe20dde3c3 --- /dev/null +++ b/interface/ispconfig/interface/dns/templates/dns_a_list.htm @@ -0,0 +1,85 @@ +
+
{tmpl_var name="toolsarea_head_txt"} +
+ + + + + + + + + + + +
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
{tmpl_var name="type"}{tmpl_var name="name"}{tmpl_var name="data"}{tmpl_var name="aux"} + +
+
+
diff --git a/interface/ispconfig/interface/dns/templates/dns_aaaa_edit.htm b/interface/ispconfig/interface/dns/templates/dns_aaaa_edit.htm new file mode 100644 index 0000000000000000000000000000000000000000..85085327a2abaf82f672da377f838c940459f1b3 --- /dev/null +++ b/interface/ispconfig/interface/dns/templates/dns_aaaa_edit.htm @@ -0,0 +1,39 @@ +

+

+ +
+ +
+
+
+ + +

{tmpl_var name='name_hint_txt'}

+
+
+ + +
+
+ + +
+
+

{tmpl_var name='active_txt'}

+
+ {tmpl_var name='active'} +
+
+
+ + + + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/dns/templates/dns_alias_edit.htm b/interface/ispconfig/interface/dns/templates/dns_alias_edit.htm new file mode 100644 index 0000000000000000000000000000000000000000..4300af42c243beeb00328931f5f07a4753d4a514 --- /dev/null +++ b/interface/ispconfig/interface/dns/templates/dns_alias_edit.htm @@ -0,0 +1,38 @@ +

+

+ +
+ +
+
+
+ + +
+
+ + +
+
+ + +
+
+

{tmpl_var name='active_txt'}

+
+ {tmpl_var name='active'} +
+
+
+ + + + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/dns/templates/dns_cname_edit.htm b/interface/ispconfig/interface/dns/templates/dns_cname_edit.htm new file mode 100644 index 0000000000000000000000000000000000000000..103b743fc8a7f71a5945e5e32185b364aebb7fb4 --- /dev/null +++ b/interface/ispconfig/interface/dns/templates/dns_cname_edit.htm @@ -0,0 +1,38 @@ +

+

+ +
+ +
+
+
+ + +
+
+ + +
+
+ + +
+
+

{tmpl_var name='active_txt'}

+
+ {tmpl_var name='active'} +
+
+
+ + + + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/dns/templates/dns_hinfo_edit.htm b/interface/ispconfig/interface/dns/templates/dns_hinfo_edit.htm new file mode 100644 index 0000000000000000000000000000000000000000..9029111193d9f7952d09f69f3e7a92daf4ca5b2e --- /dev/null +++ b/interface/ispconfig/interface/dns/templates/dns_hinfo_edit.htm @@ -0,0 +1,38 @@ +

+

+ +
+ +
+
+
+ + +
+
+ + +
+
+ + +
+
+

{tmpl_var name='active_txt'}

+
+ {tmpl_var name='active'} +
+
+
+ + + + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/dns/templates/dns_mx_edit.htm b/interface/ispconfig/interface/dns/templates/dns_mx_edit.htm new file mode 100644 index 0000000000000000000000000000000000000000..f8547245d38a9348a04f749c82676bfb5f10bd6d --- /dev/null +++ b/interface/ispconfig/interface/dns/templates/dns_mx_edit.htm @@ -0,0 +1,42 @@ +

+

+ +
+ +
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+

{tmpl_var name='active_txt'}

+
+ {tmpl_var name='active'} +
+
+
+ + + + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/dns/templates/dns_ns_edit.htm b/interface/ispconfig/interface/dns/templates/dns_ns_edit.htm new file mode 100644 index 0000000000000000000000000000000000000000..9141b3b1e3ee4ab3c0dd46e2f86a8d098af2b4b2 --- /dev/null +++ b/interface/ispconfig/interface/dns/templates/dns_ns_edit.htm @@ -0,0 +1,38 @@ +

+

+ +
+ +
+
+
+ + +
+
+ + +
+
+ + +
+
+

{tmpl_var name='active_txt'}

+
+ {tmpl_var name='active'} +
+
+
+ + + + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/dns/templates/dns_ptr_edit.htm b/interface/ispconfig/interface/dns/templates/dns_ptr_edit.htm new file mode 100644 index 0000000000000000000000000000000000000000..58901cdc951ef8086dab6386804ba358f7c6a6bf --- /dev/null +++ b/interface/ispconfig/interface/dns/templates/dns_ptr_edit.htm @@ -0,0 +1,38 @@ +

+

+ +
+ +
+
+
+ + +
+
+ + +
+
+ + +
+
+

{tmpl_var name='active_txt'}

+
+ {tmpl_var name='active'} +
+
+
+ + + + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/dns/templates/dns_records_edit.htm b/interface/ispconfig/interface/dns/templates/dns_records_edit.htm new file mode 100644 index 0000000000000000000000000000000000000000..1feb3f970cf9f3069aac00dc5f4d51c0e7001b9a --- /dev/null +++ b/interface/ispconfig/interface/dns/templates/dns_records_edit.htm @@ -0,0 +1,12 @@ +

+

+ +
+ + {tmpl_var name='dns_records'} + +
+ +
+ +
diff --git a/interface/ispconfig/interface/dns/templates/dns_rp_edit.htm b/interface/ispconfig/interface/dns/templates/dns_rp_edit.htm new file mode 100644 index 0000000000000000000000000000000000000000..93f1e89e9840167b17a6ed6917d3246e7d3aeffb --- /dev/null +++ b/interface/ispconfig/interface/dns/templates/dns_rp_edit.htm @@ -0,0 +1,38 @@ +

+

+ +
+ +
+
+
+ + +
+
+ + +
+
+ + +
+
+

{tmpl_var name='active_txt'}

+
+ {tmpl_var name='active'} +
+
+
+ + + + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/dns/templates/dns_soa_edit.htm b/interface/ispconfig/interface/dns/templates/dns_soa_edit.htm new file mode 100644 index 0000000000000000000000000000000000000000..ef855a8364e4cf9ae4cc145324948ceac6152664 --- /dev/null +++ b/interface/ispconfig/interface/dns/templates/dns_soa_edit.htm @@ -0,0 +1,95 @@ +

+

+ +
+ +
+
DNS Zone + +
+ + +
+
+ + +
+
+ +
+ + +
+
+
+ + +

e.g. domain.tld.

+
+
+ + +

e.g. ns1.domain.tld.

+
+
+ + +

e.g. webmaster.domain.tld.

+
+
+ +  Seconds +
+
+ +  Seconds +
+
+ +  Seconds +
+
+ +  Seconds +
+
+ +  Seconds +
+
+ + +
+
+ + +
+
+ + +
+ +
+

{tmpl_var name='active_txt'}

+
+ {tmpl_var name='active'} +
+
+
+ + + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/dns/templates/dns_soa_list.htm b/interface/ispconfig/interface/dns/templates/dns_soa_list.htm new file mode 100644 index 0000000000000000000000000000000000000000..46d0160ca01a6b5db6a3a66761685e0d100ebee5 --- /dev/null +++ b/interface/ispconfig/interface/dns/templates/dns_soa_list.htm @@ -0,0 +1,62 @@ +

+

+ +
+ +
+
{tmpl_var name="toolsarea_head_txt"} +
+ +
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
{tmpl_var name="server_id"}{tmpl_var name="origin"}{tmpl_var name="ns"}{tmpl_var name="mbox"} + +
+
+
+ +
diff --git a/interface/ispconfig/interface/dns/templates/dns_srv_edit.htm b/interface/ispconfig/interface/dns/templates/dns_srv_edit.htm new file mode 100644 index 0000000000000000000000000000000000000000..bfa35fd7f10f4e57a693105256cd5663c63ce028 --- /dev/null +++ b/interface/ispconfig/interface/dns/templates/dns_srv_edit.htm @@ -0,0 +1,38 @@ +

+

+ +
+ +
+
+
+ + +
+
+ + +
+
+ + +
+
+

{tmpl_var name='active_txt'}

+
+ {tmpl_var name='active'} +
+
+
+ + + + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/dns/templates/dns_template_edit.htm b/interface/ispconfig/interface/dns/templates/dns_template_edit.htm new file mode 100644 index 0000000000000000000000000000000000000000..34cf3b1e09dc64ca163d36445a1e835b563e3ce5 --- /dev/null +++ b/interface/ispconfig/interface/dns/templates/dns_template_edit.htm @@ -0,0 +1,38 @@ +

+

+ +
+ +
+
+
+ + +
+
+

{tmpl_var name='fields_txt'}

+
+ {tmpl_var name='fields'} +
+
+
+ + +
+
+

{tmpl_var name='visible_txt'}

+
+ {tmpl_var name='visible'} +
+
+
+ + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/dns/templates/dns_template_list.htm b/interface/ispconfig/interface/dns/templates/dns_template_list.htm new file mode 100644 index 0000000000000000000000000000000000000000..a698a9738e6901f8fc79e8f0525bba5a4989ad31 --- /dev/null +++ b/interface/ispconfig/interface/dns/templates/dns_template_list.htm @@ -0,0 +1,53 @@ +

+

+ +
+ +
+
{tmpl_var name="toolsarea_head_txt"} +
+ +
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
{tmpl_var name="visible"}{tmpl_var name="name"} + +
+
+
+ +
diff --git a/interface/ispconfig/interface/dns/templates/dns_txt_edit.htm b/interface/ispconfig/interface/dns/templates/dns_txt_edit.htm new file mode 100644 index 0000000000000000000000000000000000000000..d1408a9dc9f3e24fa1cb448b53c2ac5716f1bc13 --- /dev/null +++ b/interface/ispconfig/interface/dns/templates/dns_txt_edit.htm @@ -0,0 +1,38 @@ +

+

+ +
+ +
+
+
+ + +
+
+ + +
+
+ + +
+
+

{tmpl_var name='active_txt'}

+
+ {tmpl_var name='active'} +
+
+
+ + + + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/dns/templates/dns_wizard.htm b/interface/ispconfig/interface/dns/templates/dns_wizard.htm new file mode 100644 index 0000000000000000000000000000000000000000..f8cd6021f2f2219722501fd9eadfa63d01e5c517 --- /dev/null +++ b/interface/ispconfig/interface/dns/templates/dns_wizard.htm @@ -0,0 +1,80 @@ +

+

+ + +

ERROR

+
+ +
+ +
+
DNS Zone +
+ + +
+ +
+ + +
+
+ + +
+
+ +
+ + +
+
+ +
+ + +
+
+ +
+ + +
+
+ +
+ + +
+
+ +
+ + +
+
+ +
+ + +
+
+
+ + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/help/form/support_message.tform.php b/interface/ispconfig/interface/help/form/support_message.tform.php new file mode 100644 index 0000000000000000000000000000000000000000..b48dce242b9d59ee5869764815b206829632246d --- /dev/null +++ b/interface/ispconfig/interface/help/form/support_message.tform.php @@ -0,0 +1,120 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + + +//* Begin of the form definition of the first tab. The name of the tab is called "message". We refer +//* to this name in the $form["tab_default"] setting above. +$form["tabs"]['message'] = array ( + 'title' => "Message", // Title of the Tab + 'width' => 100, // Tab width + 'template' => "templates/support_message_edit.htm", // Template file name + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'recipient_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT userid,username FROM sys_user WHERE {AUTHSQL} ORDER BY username', + 'keyfield' => 'userid', + 'valuefield' => 'username' + ), + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'recipient_id_is_not_integer'), + ), + 'value' => '' + ), + 'sender_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT userid,username FROM sys_user WHERE {AUTHSQL} ORDER BY username', + 'keyfield' => 'userid', + 'valuefield' => 'username' + ), + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'recipient_id_is_not_integer'), + ), + 'value' => '' + ), + 'subject' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'subject_is_empty'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'message' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXTAREA', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'message_is_empty'), + ), + 'default' => '', + 'value' => '', + 'cols' => '30', + 'rows' => '10', + 'maxlength' => '255' + ), + 'tstamp' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => time(), + 'value' => '', + 'width' => '30', + 'maxlength' => '30' + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/help/index.php b/interface/ispconfig/interface/help/index.php new file mode 100644 index 0000000000000000000000000000000000000000..36a23159b0b179cea28df72f1089692de984bb3f --- /dev/null +++ b/interface/ispconfig/interface/help/index.php @@ -0,0 +1,16 @@ + + + +ISPConfig Help + + + +
+

 

+

 

+

 

+

 

+

 

+
+ + \ No newline at end of file diff --git a/interface/ispconfig/interface/help/lib/admin.conf.php b/interface/ispconfig/interface/help/lib/admin.conf.php new file mode 100644 index 0000000000000000000000000000000000000000..58a17b038a8aaf71b2c026aff55210dff4d872b0 --- /dev/null +++ b/interface/ispconfig/interface/help/lib/admin.conf.php @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/help/lib/lang/bg.lng b/interface/ispconfig/interface/help/lib/lang/bg.lng new file mode 100644 index 0000000000000000000000000000000000000000..b93106e6c9b4378fd007216a4ed7221e3e6250e3 --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/bg.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/bg_support_message.lng b/interface/ispconfig/interface/help/lib/lang/bg_support_message.lng new file mode 100644 index 0000000000000000000000000000000000000000..b6d979ad0b7108340db1610e4b15b7016bd970a5 --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/bg_support_message.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/bg_support_message_list.lng b/interface/ispconfig/interface/help/lib/lang/bg_support_message_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..1a5c21c50cc7b0c6720890b94cca4d4940447936 --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/bg_support_message_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/br.lng b/interface/ispconfig/interface/help/lib/lang/br.lng new file mode 100644 index 0000000000000000000000000000000000000000..3f45599aae7b3471e15bb6fccc3ebe5ca7f6aad0 --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/br.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/br_support_message.lng b/interface/ispconfig/interface/help/lib/lang/br_support_message.lng new file mode 100644 index 0000000000000000000000000000000000000000..99dcf309fad2b123bd8a1d8c3ffb5e40ce40b789 --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/br_support_message.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/br_support_message_list.lng b/interface/ispconfig/interface/help/lib/lang/br_support_message_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..d5ba958293d5dbfcc22e1600fcb5a8fb8b3e8ba4 --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/br_support_message_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/de.lng b/interface/ispconfig/interface/help/lib/lang/de.lng new file mode 100644 index 0000000000000000000000000000000000000000..2627e48e9baa925c4ac59e03f26d1883fd85332f --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/de.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/de_support_message.lng b/interface/ispconfig/interface/help/lib/lang/de_support_message.lng new file mode 100644 index 0000000000000000000000000000000000000000..b026b17a87ed87086f960e9964e63e8ae6b2a0d8 --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/de_support_message.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/de_support_message_list.lng b/interface/ispconfig/interface/help/lib/lang/de_support_message_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..72734756a043e7c96fca57466297184af07dbc6d --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/de_support_message_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/en.lng b/interface/ispconfig/interface/help/lib/lang/en.lng new file mode 100644 index 0000000000000000000000000000000000000000..369cbb9a8434cf3a28d993a5b7357fc6315a6647 --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/en.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/en_support_message.lng b/interface/ispconfig/interface/help/lib/lang/en_support_message.lng new file mode 100644 index 0000000000000000000000000000000000000000..25e3221e7a70fe2cbc022291f7cff276bdde551d --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/en_support_message.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/en_support_message_list.lng b/interface/ispconfig/interface/help/lib/lang/en_support_message_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..9f2b3fd377c1f95af6eb7d5d5be3d5b8360abfeb --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/en_support_message_list.lng @@ -0,0 +1,6 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/help/lib/lang/es.lng b/interface/ispconfig/interface/help/lib/lang/es.lng new file mode 100644 index 0000000000000000000000000000000000000000..dc4e98582cc0e935e8e019d311234ce4f979d36d --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/es.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/es_support_message.lng b/interface/ispconfig/interface/help/lib/lang/es_support_message.lng new file mode 100644 index 0000000000000000000000000000000000000000..80a7d97cb542bdb1e9758a0d702e7892acf915fc --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/es_support_message.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/es_support_message_list.lng b/interface/ispconfig/interface/help/lib/lang/es_support_message_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..0ff8eb931ff8ca07cce4b34c9dfa269abfa6f8b0 --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/es_support_message_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/fi.lng b/interface/ispconfig/interface/help/lib/lang/fi.lng new file mode 100644 index 0000000000000000000000000000000000000000..cd13f9c03ac55b65a7fbc9996f4888bdb409b230 --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/fi.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/fi_support_message.lng b/interface/ispconfig/interface/help/lib/lang/fi_support_message.lng new file mode 100644 index 0000000000000000000000000000000000000000..1e693bc6ed1bda1a24ebe2e85e62b659eea16787 --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/fi_support_message.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/fi_support_message_list.lng b/interface/ispconfig/interface/help/lib/lang/fi_support_message_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..4bbc1de7997da15cacbb0cf6aa0d108d0df5a39e --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/fi_support_message_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/fr.lng b/interface/ispconfig/interface/help/lib/lang/fr.lng new file mode 100644 index 0000000000000000000000000000000000000000..1242806782f7c2ad39ddd5044cb8ef29afc36ca7 --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/fr.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/fr_support_message.lng b/interface/ispconfig/interface/help/lib/lang/fr_support_message.lng new file mode 100644 index 0000000000000000000000000000000000000000..690a9125458e4c4d0763068b5dfe7d19d7fa6cc8 --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/fr_support_message.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/fr_support_message_list.lng b/interface/ispconfig/interface/help/lib/lang/fr_support_message_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..ac63d3f6e2a919f8e5e8b44f41f6a9c65f9c36c6 --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/fr_support_message_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/hu.lng b/interface/ispconfig/interface/help/lib/lang/hu.lng new file mode 100644 index 0000000000000000000000000000000000000000..0dc1ac1a36d7be3b555555637db8fdbaf09b7962 --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/hu.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/hu_support_message.lng b/interface/ispconfig/interface/help/lib/lang/hu_support_message.lng new file mode 100644 index 0000000000000000000000000000000000000000..65a327645e1d1a1210c83f21eb12cb3952f3c690 --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/hu_support_message.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/hu_support_message_list.lng b/interface/ispconfig/interface/help/lib/lang/hu_support_message_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..7e71ebc1e54a0efab8c24514e5480238912027ae --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/hu_support_message_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/it.lng b/interface/ispconfig/interface/help/lib/lang/it.lng new file mode 100644 index 0000000000000000000000000000000000000000..a5da077c900bffff4e847c2929977b62475674a4 --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/it.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/it_support_message.lng b/interface/ispconfig/interface/help/lib/lang/it_support_message.lng new file mode 100644 index 0000000000000000000000000000000000000000..240e6f20df95eb2718ea8adbb5164ee0a372e289 --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/it_support_message.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/it_support_message_list.lng b/interface/ispconfig/interface/help/lib/lang/it_support_message_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..95f3558a2c469e7b978b8b776684aac1918b9652 --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/it_support_message_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/ja.lng b/interface/ispconfig/interface/help/lib/lang/ja.lng new file mode 100644 index 0000000000000000000000000000000000000000..57fa64e0f469b8335218f2da2de2179f76bc7f68 --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/ja.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/ja_support_message.lng b/interface/ispconfig/interface/help/lib/lang/ja_support_message.lng new file mode 100644 index 0000000000000000000000000000000000000000..b4e6e02278295cfcc36406cc0eee507f98f37ad9 --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/ja_support_message.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/ja_support_message_list.lng b/interface/ispconfig/interface/help/lib/lang/ja_support_message_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..0a68de95be64d3a221842f5907735160db62940e --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/ja_support_message_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/nl.lng b/interface/ispconfig/interface/help/lib/lang/nl.lng new file mode 100644 index 0000000000000000000000000000000000000000..170c3d6ad361484d429941b8c9e0fc8d7f589242 --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/nl.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/nl_support_message.lng b/interface/ispconfig/interface/help/lib/lang/nl_support_message.lng new file mode 100644 index 0000000000000000000000000000000000000000..d2aed4cb6c636e44011295924b612b0d3be4c0cd --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/nl_support_message.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/nl_support_message_list.lng b/interface/ispconfig/interface/help/lib/lang/nl_support_message_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..0d7b2cb74bd9516378777100312970f2c209665c --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/nl_support_message_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/pl.lng b/interface/ispconfig/interface/help/lib/lang/pl.lng new file mode 100644 index 0000000000000000000000000000000000000000..51ca7ccc8c93d24d6cb5184335cf915cb4957037 --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/pl.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/pl_support_message.lng b/interface/ispconfig/interface/help/lib/lang/pl_support_message.lng new file mode 100644 index 0000000000000000000000000000000000000000..b21539af2f907e15354f0344a9aa334ca7d5ac3c --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/pl_support_message.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/pl_support_message_list.lng b/interface/ispconfig/interface/help/lib/lang/pl_support_message_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..bc3285694b816cdfd17997548828a5f1c9225b8a --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/pl_support_message_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/pt.lng b/interface/ispconfig/interface/help/lib/lang/pt.lng new file mode 100644 index 0000000000000000000000000000000000000000..adace22c82874490a56500045f509dc5a0b8e8f5 --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/pt.lng @@ -0,0 +1,10 @@ + + diff --git a/interface/ispconfig/interface/help/lib/lang/pt_support_message.lng b/interface/ispconfig/interface/help/lib/lang/pt_support_message.lng new file mode 100644 index 0000000000000000000000000000000000000000..ce48ca9d28166d29c72d7c439732496dc1895424 --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/pt_support_message.lng @@ -0,0 +1,8 @@ + + diff --git a/interface/ispconfig/interface/help/lib/lang/pt_support_message_list.lng b/interface/ispconfig/interface/help/lib/lang/pt_support_message_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..ffd7d85cecb7edabbd5eb429f78888d5b0410cfc --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/pt_support_message_list.lng @@ -0,0 +1,7 @@ + + diff --git a/interface/ispconfig/interface/help/lib/lang/ro.lng b/interface/ispconfig/interface/help/lib/lang/ro.lng new file mode 100644 index 0000000000000000000000000000000000000000..b97df1de6ab13e4caea4715747689038dbdcff95 --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/ro.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/ro_support_message.lng b/interface/ispconfig/interface/help/lib/lang/ro_support_message.lng new file mode 100644 index 0000000000000000000000000000000000000000..8769c852709ebcb539bc5ae974b8c5e805196e84 --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/ro_support_message.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/ro_support_message_list.lng b/interface/ispconfig/interface/help/lib/lang/ro_support_message_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..34aebb87776dfd340d6f88e830f81c2e229baa44 --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/ro_support_message_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/ru.lng b/interface/ispconfig/interface/help/lib/lang/ru.lng new file mode 100644 index 0000000000000000000000000000000000000000..be5e01da81f314eee1fd61f05295f7f96b03bf78 --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/ru.lng @@ -0,0 +1,10 @@ + + diff --git a/interface/ispconfig/interface/help/lib/lang/ru_support_message.lng b/interface/ispconfig/interface/help/lib/lang/ru_support_message.lng new file mode 100644 index 0000000000000000000000000000000000000000..d59eb1f55e494b65f1ad4a77836e7e2a0701200d --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/ru_support_message.lng @@ -0,0 +1,8 @@ + + diff --git a/interface/ispconfig/interface/help/lib/lang/ru_support_message_list.lng b/interface/ispconfig/interface/help/lib/lang/ru_support_message_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..679d55c3401df7281fabca606db3749392809c9a --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/ru_support_message_list.lng @@ -0,0 +1,7 @@ + + diff --git a/interface/ispconfig/interface/help/lib/lang/se.lng b/interface/ispconfig/interface/help/lib/lang/se.lng new file mode 100644 index 0000000000000000000000000000000000000000..16a245dc0552c11e1860cf0be3bdbd8c8de211ad --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/se.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/se_support_message.lng b/interface/ispconfig/interface/help/lib/lang/se_support_message.lng new file mode 100644 index 0000000000000000000000000000000000000000..25e3221e7a70fe2cbc022291f7cff276bdde551d --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/se_support_message.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/se_support_message_list.lng b/interface/ispconfig/interface/help/lib/lang/se_support_message_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..d6bc2aac339b1ece715b3343e209c2621de220aa --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/se_support_message_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/sk.lng b/interface/ispconfig/interface/help/lib/lang/sk.lng new file mode 100644 index 0000000000000000000000000000000000000000..f359d0c4af513fd7da5cb11725333103d54f457a --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/sk.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/sk_support_message.lng b/interface/ispconfig/interface/help/lib/lang/sk_support_message.lng new file mode 100644 index 0000000000000000000000000000000000000000..08d0eae6cbeb9c18eb768dd46712ee592b384100 --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/sk_support_message.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/sk_support_message_list.lng b/interface/ispconfig/interface/help/lib/lang/sk_support_message_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..9d432bf89761ff8db635b47279fda36f1c01f5e3 --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/sk_support_message_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/tr.lng b/interface/ispconfig/interface/help/lib/lang/tr.lng new file mode 100644 index 0000000000000000000000000000000000000000..b38ed5ff7da69ce2bd1495cd7c2710cd1490d7c0 --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/tr.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/tr_support_message.lng b/interface/ispconfig/interface/help/lib/lang/tr_support_message.lng new file mode 100644 index 0000000000000000000000000000000000000000..25e3221e7a70fe2cbc022291f7cff276bdde551d --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/tr_support_message.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/tr_support_message_list.lng b/interface/ispconfig/interface/help/lib/lang/tr_support_message_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..acdb363da6401561fa1e6f932379680d706f0b76 --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/tr_support_message_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/help/lib/module.conf.php b/interface/ispconfig/interface/help/lib/module.conf.php new file mode 100644 index 0000000000000000000000000000000000000000..9211aed0665e5dfa5458f0758766b3c8d4c32891 --- /dev/null +++ b/interface/ispconfig/interface/help/lib/module.conf.php @@ -0,0 +1,60 @@ + 'Send message', + 'target' => 'content', + 'link' => 'help/support_message_edit.php'); + +//* Add a menu item with the label 'View messages' +$items[] = array( 'title' => 'View messages', + 'target' => 'content', + 'link' => 'help/support_message_list.php'); + + +//* Add the menu items defined above to a menu section labeled 'Support' +$module['nav'][] = array( 'title' => 'Support', + 'open' => 1, + 'items' => $items); + + +if($_SESSION['s']['user']['typ'] == 'admin') { +//* make sure that the items array is empty +$items = array(); + +//* Add a menu item with the label 'View messages' +$items[] = array( 'title' => 'Version', + 'target' => 'content', + 'link' => 'help/version.php'); + + +//* Add the menu items defined above to a menu section labeled 'Support' +$module['nav'][] = array( 'title' => 'About ISPConfig', + 'open' => 1, + 'items' => $items); + +} + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/help/list/support_message.list.php b/interface/ispconfig/interface/help/list/support_message.list.php new file mode 100644 index 0000000000000000000000000000000000000000..c6975d2cbf3b63ac71758a99665c79b91d177c96 --- /dev/null +++ b/interface/ispconfig/interface/help/list/support_message.list.php @@ -0,0 +1,62 @@ + 'sender_id', + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'op' => '=', + 'prefix' => '', + 'suffix' => '', + 'width' => '', + 'datasource'=> array ( 'type' => 'SQL', + 'querystring' => 'SELECT userid,username FROM sys_user WHERE {AUTHSQL} ORDER BY username', + 'keyfield' => 'userid', + 'valuefield' => 'username' + ), + 'value' => ''); + +$liste['item'][] = array( 'field' => 'subject', + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'op' => 'like', + 'prefix' => '%', + 'suffix' => '%', + 'width' => '', + 'value' => ''); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/help/support_message_del.php b/interface/ispconfig/interface/help/support_message_del.php new file mode 100644 index 0000000000000000000000000000000000000000..16db6040a0820cf401564b6cea17359c029ec5df --- /dev/null +++ b/interface/ispconfig/interface/help/support_message_del.php @@ -0,0 +1,48 @@ +auth->check_module_permissions('help'); + +//* Load the form +$app->uses('tform_actions'); +$app->tform_actions->onDelete(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/help/support_message_edit.php b/interface/ispconfig/interface/help/support_message_edit.php new file mode 100644 index 0000000000000000000000000000000000000000..8223a00008dd417d38a890876a7d5b7d445e4c8b --- /dev/null +++ b/interface/ispconfig/interface/help/support_message_edit.php @@ -0,0 +1,71 @@ +auth->check_module_permissions('help'); + +//* Loading the templating and form classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +//* Creating a class page_action that extends the tform_actions base class +class page_action extends tform_actions { + + //* Custom onSubmit Event handler + function onSubmit() + { + global $app, $conf; + + //* If the current user is not the admin user + if($_SESSION['s']['user']['typ'] != 'admin') { + //* Set the admin as recipient + $this->dataRecord['recipient_id'] = 1; + } + + //* Set the sender_id field to the ID of the current user + $this->dataRecord['sender_id'] = $_SESSION['s']['user']['userid']; + + //* call the onSubmit function of the parent class + parent::onSubmit(); + } + + //* Custom onShow Event handler + function onShow() + { + global $app, $conf; + + //* We do not want that messages get edited, so we switch to a + //* read only template if a existing message is loaded + if($this->id > 0) { + $app->tform->formDef['tabs']['message']['template'] = 'templates/support_message_view.htm'; + } + + //* call the onShow function of the parent class + parent::onShow(); + } + + function onAfterInsert() + { + global $app, $conf; + + if($_SESSION['s']['user']['typ'] == 'admin') { + $app->db->query("UPDATE support_message SET sys_userid = ".$this->dataRecord['recipient_id']." WHERE support_message_id = ".$this->id); + } + + } + +} + +//* Create the new page object +$page = new page_action(); + +//* Start the page rendering and action handling +$page->onLoad(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/help/support_message_list.php b/interface/ispconfig/interface/help/support_message_list.php new file mode 100644 index 0000000000000000000000000000000000000000..c03bcde77a2a5f28cd61e503f367a83afed890a3 --- /dev/null +++ b/interface/ispconfig/interface/help/support_message_list.php @@ -0,0 +1,20 @@ +auth->check_module_permissions('help'); + +//* Loading the class +$app->uses('listform_actions'); + +//* Optional limit +$app->listform_actions->SQLExtWhere = "recipient_id = ".$_SESSION['s']['user']['userid']; + +//* Start the form rendering and action ahndling +$app->listform_actions->onLoad(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/help/templates/support_message_edit.htm b/interface/ispconfig/interface/help/templates/support_message_edit.htm new file mode 100644 index 0000000000000000000000000000000000000000..305a47a2b980423687fea179e33003f08a86ea5c --- /dev/null +++ b/interface/ispconfig/interface/help/templates/support_message_edit.htm @@ -0,0 +1,33 @@ +

+

+ +
+ +
+
Message +
+ + +
+
+ + +
+
+ + +
+
+ + + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/help/templates/support_message_list.htm b/interface/ispconfig/interface/help/templates/support_message_list.htm new file mode 100644 index 0000000000000000000000000000000000000000..02662ad29aa6a6719f5796c9b0f232bedeeb28e2 --- /dev/null +++ b/interface/ispconfig/interface/help/templates/support_message_list.htm @@ -0,0 +1,53 @@ +

+

+ +
+ +
+
{tmpl_var name="toolsarea_head_txt"} +
+ +
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
{tmpl_var name="sender_id"}{tmpl_var name="subject"} + +
+
+
+ +
diff --git a/interface/ispconfig/interface/help/templates/support_message_view.htm b/interface/ispconfig/interface/help/templates/support_message_view.htm new file mode 100644 index 0000000000000000000000000000000000000000..37cb1e4b3fd9153a38319a9b7df0c036757d3dfb --- /dev/null +++ b/interface/ispconfig/interface/help/templates/support_message_view.htm @@ -0,0 +1,26 @@ +

+

+ +
+ +
+
Message +
+ + +
+
+ + +
+
+ + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/help/version.php b/interface/ispconfig/interface/help/version.php new file mode 100644 index 0000000000000000000000000000000000000000..45120f80080ce61a9ad1a28335227d83e7c2ee72 --- /dev/null +++ b/interface/ispconfig/interface/help/version.php @@ -0,0 +1,50 @@ +auth->check_module_permissions('admin'); + +echo '

 

 

'.$app->lng('ISPConfig Version:').' '.ISPC_APP_VERSION.'

'; + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/index.htm b/interface/ispconfig/interface/index.htm new file mode 100644 index 0000000000000000000000000000000000000000..39606dbb3710e1939027c58888cc37edf4c8d956 --- /dev/null +++ b/interface/ispconfig/interface/index.htm @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/interface/ispconfig/interface/index.php b/interface/ispconfig/interface/index.php new file mode 100644 index 0000000000000000000000000000000000000000..9c312824e616462cfbbe5d53c314e9f04d470291 --- /dev/null +++ b/interface/ispconfig/interface/index.php @@ -0,0 +1,41 @@ +uses('tpl'); +$app->tpl->newTemplate('main.tpl.htm'); + +$app->tpl_defaults(); +$app->tpl->pparse(); +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/js/scrigo.js.php b/interface/ispconfig/interface/js/scrigo.js.php new file mode 100644 index 0000000000000000000000000000000000000000..1d468de5d662642391fab798082b983d3396b874 --- /dev/null +++ b/interface/ispconfig/interface/js/scrigo.js.php @@ -0,0 +1,503 @@ + + +redirect = ''; + +function loadContentfRefresh(pagename) { + var pageContentCallbackRefresh = { + success: function(o) { + document.getElementById('pageContent').innerHTML = o.responseText; + }, + failure: function(o) { + alert('Ajax Request was not successful.'+pagename); + } + } + + if(document.getElementById('refreshinterval').value > 0) { + var pageContentObject2 = YAHOO.util.Connect.asyncRequest('GET', pagename+"&refresh="+document.getElementById('refreshinterval').value, pageContentCallbackRefresh); + setTimeout( "loadContentRefresh('"+pagename+"&refresh="+document.getElementById('refreshinterval').value+"')", document.getElementById('refreshinterval').value*1000 ); + } +} + +function capp(module) { + var cappCallback = { + success: function(o) { + if(o.responseText != '') { + if(o.responseText.indexOf('HEADER_REDIRECT:') > -1) { + var parts = o.responseText.split(':'); + loadContent(parts[1]); + } else { + alert(o.responseText); + } + } + loadMenus(); + }, + failure: function(o) { + alert('Ajax Request was not successful.'); + } + } + var submitFormObj = YAHOO.util.Connect.asyncRequest('GET', 'capp.php?mod='+module, cappCallback); +} + +function submitLoginForm(formname) { + + var submitFormCallback = { + success: function(o) { + if(o.responseText.indexOf('HEADER_REDIRECT:') > -1) { + var parts = o.responseText.split(':'); + //alert(parts[1]); + loadContent(parts[1]); + //redirect = parts[1]; + //window.setTimeout('loadContent(redirect)', 1000); + } else if (o.responseText.indexOf('LOGIN_REDIRECT:') > -1) { + // Go to the login page + document.location.href = 'index.php'; + } else { + document.getElementById('pageContent').innerHTML = o.responseText; + } + loadMenus(); + }, + failure: function(o) { + alert('Ajax Request was not successful.'); + } + } + + //* Validate form. TODO: username and password with strip(); + var frm = document.getElementById(formname); + var userNameObj = frm.username; + if(userNameObj.value == ''){ + userNameObj.focus(); + return; + } + var passwordObj = frm.passwort; + if(passwordObj.value == ''){ + passwordObj.focus(); + return; + } + YAHOO.util.Connect.setForm(formname); + var submitFormObj = YAHOO.util.Connect.asyncRequest('POST', 'content.php', submitFormCallback); + /* + if(redirect != '') { + loadContent(redirect); + redirect = ''; + } + document.getElementById('footer').innerHTML = 'Powered by ISPConfig'; + */ + +} + +function submitForm(formname,target) { + + var submitFormCallback = { + success: function(o) { + if(o.responseText.indexOf('HEADER_REDIRECT:') > -1) { + var parts = o.responseText.split(':'); + //alert(parts[1]); + loadContent(parts[1]); + //redirect = parts[1]; + //window.setTimeout('loadContent(redirect)', 1000); + } else { + document.getElementById('pageContent').innerHTML = o.responseText; + } + }, + failure: function(o) { + var parts = o.responseText.split(':'); + alert('Ajax Request was not successful. '+parts[1]); + } + } + + YAHOO.util.Connect.setForm(formname); + var submitFormObj = YAHOO.util.Connect.asyncRequest('POST', target, submitFormCallback); + /* + if(redirect != '') { + loadContent(redirect); + redirect = ''; + } + */ +} + +function submitUploadForm(formname,target) { + + var submitFormCallback = { + success: function(o) { + if(o.responseText.indexOf('HEADER_REDIRECT:') > -1) { + var parts = o.responseText.split(':'); + //alert(parts[1]); + loadContent(parts[1]); + //redirect = parts[1]; + //window.setTimeout('loadContent(redirect)', 1000); + } else { + document.getElementById('pageContent').innerHTML = o.responseText; + } + }, + upload: function(o) { + if(o.responseText.indexOf('HEADER_REDIRECT:') > -1) { + var parts = o.responseText.split(':'); + //alert(parts[1]); + loadContent(parts[1]); + //redirect = parts[1]; + //window.setTimeout('loadContent(redirect)', 1000); + } else { + document.getElementById('pageContent').innerHTML = o.responseText; + } + }, + failure: function(o) { + alert('Ajax Request was not successful. 1'); + } + } + + YAHOO.util.Connect.setForm(formname,true); + var submitFormObj = YAHOO.util.Connect.asyncRequest('POST', target, submitFormCallback); + /* + if(redirect != '') { + loadContent(redirect); + redirect = ''; + } + */ +} + +function loadContent(pagename) { + var pageContentCallback2 = { + success: function(o) { + if(o.responseText.indexOf('HEADER_REDIRECT:') > -1) { + var parts = o.responseText.split(':'); + loadContent(parts[1]); + } else if (o.responseText.indexOf('URL_REDIRECT:') > -1) { + var newUrl= o.responseText.substr(o.responseText.indexOf('URL_REDIRECT:') + "URL_REDIRECT:".length); + document.location.href = newUrl; + } else { + document.getElementById('pageContent').innerHTML = o.responseText; + } + }, + failure: function(o) { + alert('Ajax Request was not successful.'); + } + } + + + var pageContentObject2 = YAHOO.util.Connect.asyncRequest('GET', pagename, pageContentCallback2); +} + + +function loadInitContent() { + + var pageContentCallback = { + success: function(o) { + if(o.responseText.indexOf('HEADER_REDIRECT:') > -1) { + var parts = o.responseText.split(":"); + loadContent(parts[1]); + } else { + document.getElementById('pageContent').innerHTML = o.responseText; + } + + /* + var items = document.getElementsByTagName('input'); + for(i=0;i,<\" ")) { + points += 1; + } + + if (points == 0) { + if (length >= 5 && length <=6) { + pass_result(1); + } else if (length >= 7 && length <=8) { + pass_result(2); + } else { + pass_result(3); + } + } else if (points == 1) { + if (length >= 5 && length <=6) { + pass_result(2); + } else if (length >= 7 && length <=10) { + pass_result(3); + } else { + pass_result(4); + } + } else if (points == 2) { + if (length >= 5 && length <=8) { + pass_result(3); + } else if (length >= 9 && length <=10) { + pass_result(4); + } else { + pass_result(5); + } + } else if (points == 3) { + if (length >= 5 && length <=6) { + pass_result(3); + } else if (length >= 7 && length <=8) { + pass_result(4); + } else { + pass_result(5); + } + } else if (points >= 4) { + if (length >= 5 && length <=6) { + pass_result(4); + } else { + pass_result(5); + } + } +} + + + +function pass_result(points, message) { + if (points == 0) { + width = 10; + } else { + width = points*20; + } + document.getElementById("passBar").innerHTML = '
'; + document.getElementById("passText").innerHTML = pass_messages[points]['text']; +} +function pass_contains(pass, check) { + for (i = 0; i < pass.length; i++) { + if (check.indexOf(pass.charAt(i)) > -1) { + return true; + } + } + return false; +} + +function addAdditionalTemplate(){ + var tpl_add = document.getElementById('template_additional').value; + + var tpl_list = document.getElementById('template_additional_list').innerHTML; + var addTemplate = document.getElementById('tpl_add_select').value.split('|',2); + var addTplId = addTemplate[0]; + var addTplText = addTemplate[1]; + if(addTplId > 0) { + var newVal = tpl_add + '/' + addTplId + '/'; + newVal = newVal.replace('//', '/'); + var newList = tpl_list + '
' + addTplText; + newList = newList.replace('

', '
'); + document.getElementById('template_additional').value = newVal; + document.getElementById('template_additional_list').innerHTML = newList; + alert('additional template ' + addTplText + ' added to customer'); + } else { + alert('no additional template selcted'); + } +} + +function delAdditionalTemplate(){ + var tpl_add = document.getElementById('template_additional').value; + if(tpl_add != '') { + var tpl_list = document.getElementById('template_additional_list').innerHTML; + var addTemplate = document.getElementById('tpl_add_select').value.split('|',2); + var addTplId = addTemplate[0]; + var addTplText = addTemplate[1]; + var newVal = tpl_add; + newVal = newVal.replace(addTplId, ''); + newVal = newVal.replace('//', '/'); + var newList = tpl_list.replace(addTplText, ''); + newList = newList.replace('

', '
'); + document.getElementById('template_additional').value = newVal; + document.getElementById('template_additional_list').innerHTML = newList; + alert('additional template ' + addTplText + ' deleted from customer'); + } else { + alert('no additional template selcted'); + } + +} diff --git a/interface/ispconfig/interface/js/uni-form/jquery.js b/interface/ispconfig/interface/js/uni-form/jquery.js new file mode 100644 index 0000000000000000000000000000000000000000..7090c1c53dcdab74f9ce3eca5b3e8fa3402d26c3 --- /dev/null +++ b/interface/ispconfig/interface/js/uni-form/jquery.js @@ -0,0 +1 @@ +eval(function(p,a,c,k,e,d){e=function(c){return(c35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--){d[e(c)]=k[c]||e(c)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('7(1C 1w.6=="T"){1w.T=1w.T;B 6=u(a,c){7(1w==q)v 1p 6(a,c);a=a||17;7(6.1t(a))v 1p 6(17)[6.E.27?"27":"2O"](a);7(1C a=="23"){B m=/^[^<]*(<(.|\\s)+>)[^>]*$/.2Q(a);7(m)a=6.3k([m[1]]);J v 1p 6(c).2o(a)}v q.6r(a.1l==2y&&a||(a.3Y||a.I&&a!=1w&&!a.24&&a[0]!=T&&a[0].24)&&6.3M(a)||[a])};7(1C $!="T")6.2S$=$;B $=6;6.E=6.8p={3Y:"1.1.2",8q:u(){v q.I},I:0,2b:u(1T){v 1T==T?6.3M(q):q[1T]},2r:u(a){B L=6(a);L.6p=q;v L},6r:u(a){q.I=0;[].1g.14(q,a);v q},K:u(E,1E){v 6.K(q,E,1E)},2h:u(1c){B 4c=-1;q.K(u(i){7(q==1c)4c=i});v 4c},1I:u(1Y,O,C){B 1c=1Y;7(1Y.1l==3t)7(O==T)v q.I&&6[C||"1I"](q[0],1Y)||T;J{1c={};1c[1Y]=O}v q.K(u(2h){P(B H 1x 1c)6.1I(C?q.1q:q,H,6.H(q,1c[H],C,2h,H))})},1m:u(1Y,O){v q.1I(1Y,O,"30")},2L:u(e){7(1C e=="23")v q.3u().3r(17.8t(e));B t="";6.K(e||q,u(){6.K(q.2I,u(){7(q.24!=8)t+=q.24!=1?q.60:6.E.2L([q])})});v t},2K:u(){B a=6.3k(1A);v q.K(u(){B b=a[0].3l(U);q.11.2X(b,q);22(b.1b)b=b.1b;b.4C(q)})},3r:u(){v q.3j(1A,U,1,u(a){q.4C(a)})},5i:u(){v q.3j(1A,U,-1,u(a){q.2X(a,q.1b)})},5j:u(){v q.3j(1A,12,1,u(a){q.11.2X(a,q)})},5t:u(){v q.3j(1A,12,-1,u(a){q.11.2X(a,q.2e)})},4g:u(){v q.6p||6([])},2o:u(t){v q.2r(6.31(q,u(a){v 6.2o(t,a)}),t)},4Y:u(4N){v q.2r(6.31(q,u(a){B a=a.3l(4N!=T?4N:U);a.$1H=16;v a}))},1D:u(t){v q.2r(6.1t(t)&&6.2q(q,u(2z,2h){v t.14(2z,[2h])})||6.3z(t,q))},2g:u(t){v q.2r(t.1l==3t&&6.3z(t,q,U)||6.2q(q,u(a){v(t.1l==2y||t.3Y)?6.3y(a,t)<0:a!=t}))},1M:u(t){v q.2r(6.2k(q.2b(),t.1l==3t?6(t).2b():t.I!=T&&(!t.1f||t.1f=="8v")?t:[t]))},4l:u(1s){v 1s?6.1D(1s,q).r.I>0:12},1a:u(1a){v 1a==T?(q.I?q[0].O:16):q.1I("O",1a)},4U:u(1a){v 1a==T?(q.I?q[0].2t:16):q.3u().3r(1a)},3j:u(1E,1P,3Z,E){B 4Y=q.I>1;B a=6.3k(1E);7(3Z<0)a.8w();v q.K(u(){B 1c=q;7(1P&&6.1f(q,"1P")&&6.1f(a[0],"3m"))1c=q.5J("20")[0]||q.4C(17.6n("20"));6.K(a,u(){E.14(1c,[4Y?q.3l(U):q])})})}};6.1z=6.E.1z=u(){B 1O=1A[0],a=1;7(1A.I==1){1O=q;a=0}B H;22(H=1A[a++])P(B i 1x H)1O[i]=H[i];v 1O};6.1z({8x:u(){7(6.2S$)$=6.2S$;v 6},1t:u(E){v!!E&&1C E!="23"&&!E.1f&&1C E[0]=="T"&&/u/i.1n(E+"")},4B:u(D){v D.66&&D.5I&&!D.5I.64},1f:u(D,Y){v D.1f&&D.1f.3K()==Y.3K()},K:u(1c,E,1E){7(1c.I==T)P(B i 1x 1c)E.14(1c[i],1E||[i,1c[i]]);J P(B i=0,6q=1c.I;i<6q;i++)7(E.14(1c[i],1E||[i,1c[i]])===12)3O;v 1c},H:u(D,O,C,2h,H){7(6.1t(O))O=O.3n(D,[2h]);B 6s=/z-?2h|7P-?8A|1d|58|8B-?28/i;v O&&O.1l==3Q&&C=="30"&&!6s.1n(H)?O+"4S":O},19:{1M:u(D,c){6.K(c.3o(/\\s+/),u(i,Q){7(!6.19.2V(D.19,Q))D.19+=(D.19?" ":"")+Q})},2f:u(D,c){D.19=c?6.2q(D.19.3o(/\\s+/),u(Q){v!6.19.2V(c,Q)}).6t(" "):""},2V:u(t,c){t=t.19||t;c=c.1R(/([\\.\\\\\\+\\*\\?\\[\\^\\]\\$\\(\\)\\{\\}\\=\\!\\<\\>\\|\\:])/g,"\\\\$1");v t&&1p 4v("(^|\\\\s)"+c+"(\\\\s|$)").1n(t)}},4d:u(e,o,f){P(B i 1x o){e.1q["1N"+i]=e.1q[i];e.1q[i]=o[i]}f.14(e,[]);P(B i 1x o)e.1q[i]=e.1q["1N"+i]},1m:u(e,p){7(p=="28"||p=="3V"){B 1N={},46,3P,d=["7d","8C","8D","8E"];6.K(d,u(){1N["8F"+q]=0;1N["8G"+q+"8H"]=0});6.4d(e,1N,u(){7(6.1m(e,"1h")!="1Z"){46=e.8I;3P=e.8J}J{e=6(e.3l(U)).2o(":4j").5l("2Z").4g().1m({4n:"1G",45:"8K",1h:"2D",7I:"0",8M:"0"}).5z(e.11)[0];B 3d=6.1m(e.11,"45");7(3d==""||3d=="4b")e.11.1q.45="6x";46=e.6y;3P=e.6z;7(3d==""||3d=="4b")e.11.1q.45="4b";e.11.33(e)}});v p=="28"?46:3P}v 6.30(e,p)},30:u(D,H,53){B L;7(H=="1d"&&6.W.1j)v 6.1I(D.1q,"1d");7(H=="4h"||H=="2v")H=6.W.1j?"3T":"2v";7(!53&&D.1q[H])L=D.1q[H];J 7(17.44&&17.44.4W){7(H=="2v"||H=="3T")H="4h";H=H.1R(/([A-Z])/g,"-$1").4m();B Q=17.44.4W(D,16);7(Q)L=Q.55(H);J 7(H=="1h")L="1Z";J 6.4d(D,{1h:"2D"},u(){B c=17.44.4W(q,"");L=c&&c.55(H)||""})}J 7(D.51){B 56=H.1R(/\\-(\\w)/g,u(m,c){v c.3K()});L=D.51[H]||D.51[56]}v L},3k:u(a){B r=[];6.K(a,u(i,1r){7(!1r)v;7(1r.1l==3Q)1r=1r.6C();7(1C 1r=="23"){B s=6.35(1r),1V=17.6n("1V"),2i=[];B 2K=!s.18("<1u")&&[1,"<42>",""]||(!s.18("<6D")||!s.18("<20")||!s.18("<6E"))&&[1,"<1P>",""]||!s.18("<3m")&&[2,"<1P><20>",""]||(!s.18("<6F")||!s.18("<6G"))&&[3,"<1P><20><3m>",""]||[0,"",""];1V.2t=2K[1]+s+2K[2];22(2K[0]--)1V=1V.1b;7(6.W.1j){7(!s.18("<1P")&&s.18("<20")<0)2i=1V.1b&&1V.1b.2I;J 7(2K[1]=="<1P>"&&s.18("<20")<0)2i=1V.2I;P(B n=2i.I-1;n>=0;--n)7(6.1f(2i[n],"20")&&!2i[n].2I.I)2i[n].11.33(2i[n])}1r=[];P(B i=0,l=1V.2I.I;im[3]-0",2a:"m[3]-0==i",5q:"m[3]-0==i",2u:"i==0",2T:"i==r.I-1",5R:"i%2==0",5S:"i%2","2a-3s":"6.2a(a.11.1b,m[3],\'2e\',a)==a","2u-3s":"6.2a(a.11.1b,1,\'2e\')==a","2T-3s":"6.2a(a.11.7n,1,\'5s\')==a","7p-3s":"6.2B(a.11.1b).I==1",5u:"a.1b",3u:"!a.1b",5v:"6.E.2L.14([a]).18(m[3])>=0",3i:\'a.C!="1G"&&6.1m(a,"1h")!="1Z"&&6.1m(a,"4n")!="1G"\',1G:\'a.C=="1G"||6.1m(a,"1h")=="1Z"||6.1m(a,"4n")=="1G"\',7v:"!a.2W",2W:"a.2W",2Z:"a.2Z",2Y:"a.2Y||6.1I(a,\'2Y\')",2L:"a.C==\'2L\'",4j:"a.C==\'4j\'",5x:"a.C==\'5x\'",4G:"a.C==\'4G\'",5y:"a.C==\'5y\'",4R:"a.C==\'4R\'",5A:"a.C==\'5A\'",5B:"a.C==\'5B\'",3x:\'a.C=="3x"||6.1f(a,"3x")\',5C:"/5C|42|7A|3x/i.1n(a.1f)"},".":"6.19.2V(a,m[2])","@":{"=":"z==m[4]","!=":"z!=m[4]","^=":"z&&!z.18(m[4])","$=":"z&&z.2U(z.I - m[4].I,m[4].I)==m[4]","*=":"z&&z.18(m[4])>=0","":"z",4u:u(m){v["",m[1],m[3],m[2],m[5]]},5P:"z=a[m[3]];7(!z||/5E|3e/.1n(m[3]))z=6.1I(a,m[3]);"},"[":"6.2o(m[2],a).I"},5M:[/^\\[ *(@)([a-2m-3C-]*) *([!*$^=]*) *(\'?"?)(.*?)\\4 *\\]/i,/^(\\[)\\s*(.*?(\\[.*?\\])?[^[]*?)\\s*\\]/,/^(:)([a-2m-3C-]*)\\("?\'?(.*?(\\(.*?\\))?[^(]*?)"?\'?\\)/i,/^([:.#]*)([a-2m-3C*-]*)/i],1Q:[/^(\\/?\\.\\.)/,"a.11",/^(>|\\/)/,"6.2B(a.1b)",/^(\\+)/,"6.2a(a,2,\'2e\')",/^(~)/,u(a){B s=6.2B(a.11.1b);v s.3N(6.3y(a,s)+1)}],3z:u(1s,1U,2g){B 1N,Q=[];22(1s&&1s!=1N){1N=1s;B f=6.1D(1s,1U,2g);1s=f.t.1R(/^\\s*,\\s*/,"");Q=2g?1U=f.r:6.2k(Q,f.r)}v Q},2o:u(t,1B){7(1C t!="23")v[t];7(1B&&!1B.24)1B=16;1B=1B||17;7(!t.18("//")){1B=1B.4H;t=t.2U(2,t.I)}J 7(!t.18("/")){1B=1B.4H;t=t.2U(1,t.I);7(t.18("/")>=1)t=t.2U(t.18("/"),t.I)}B L=[1B],2c=[],2T=16;22(t&&2T!=t){B r=[];2T=t;t=6.35(t).1R(/^\\/\\//i,"");B 3B=12;B 1J=/^[\\/>]\\s*([a-2m-9*-]+)/i;B m=1J.2Q(t);7(m){6.K(L,u(){P(B c=q.1b;c;c=c.2e)7(c.24==1&&(6.1f(c,m[1])||m[1]=="*"))r.1g(c)});L=r;t=t.1R(1J,"");7(t.18(" ")==0)5F;3B=U}J{P(B i=0;i<6.1Q.I;i+=2){B 1J=6.1Q[i];B m=1J.2Q(t);7(m){r=L=6.31(L,6.1t(6.1Q[i+1])?6.1Q[i+1]:u(a){v 40(6.1Q[i+1])});t=6.35(t.1R(1J,""));3B=U;3O}}}7(t&&!3B){7(!t.18(",")){7(L[0]==1B)L.4L();6.2k(2c,L);r=L=[1B];t=" "+t.2U(1,t.I)}J{B 34=/^([a-2m-3C-]+)(#)([a-2m-9\\\\*2S-]*)/i;B m=34.2Q(t);7(m){m=[0,m[2],m[3],m[1]]}J{34=/^([#.]?)([a-2m-9\\\\*2S-]*)/i;m=34.2Q(t)}7(m[1]=="#"&&L[L.I-1].4X){B 2l=L[L.I-1].4X(m[2]);7(6.W.1j&&2l&&2l.2J!=m[2])2l=6(\'[@2J="\'+m[2]+\'"]\',L[L.I-1])[0];L=r=2l&&(!m[3]||6.1f(2l,m[3]))?[2l]:[]}J{7(m[1]==".")B 4r=1p 4v("(^|\\\\s)"+m[2]+"(\\\\s|$)");6.K(L,u(){B 3E=m[1]!=""||m[0]==""?"*":m[2];7(6.1f(q,"7J")&&3E=="*")3E="3g";6.2k(r,m[1]!=""&&L.I!=1?6.4x(q,[],m[1],m[2],4r):q.5J(3E))});7(m[1]=="."&&L.I==1)r=6.2q(r,u(e){v 4r.1n(e.19)});7(m[1]=="#"&&L.I==1){B 5K=r;r=[];6.K(5K,u(){7(q.36("2J")==m[2]){r=[q];v 12}})}L=r}t=t.1R(34,"")}}7(t){B 1a=6.1D(t,r);L=r=1a.r;t=6.35(1a.t)}}7(L&&L[0]==1B)L.4L();6.2k(2c,L);v 2c},1D:u(t,r,2g){22(t&&/^[a-z[({<*:.#]/i.1n(t)){B p=6.5M,m;6.K(p,u(i,1J){m=1J.2Q(t);7(m){t=t.7M(m[0].I);7(6.1s[m[1]].4u)m=6.1s[m[1]].4u(m);v 12}});7(m[1]==":"&&m[2]=="2g")r=6.1D(m[3],r,U).r;J 7(m[1]=="."){B 1J=1p 4v("(^|\\\\s)"+m[2]+"(\\\\s|$)");r=6.2q(r,u(e){v 1J.1n(e.19||"")},2g)}J{B f=6.1s[m[1]];7(1C f!="23")f=6.1s[m[1]][m[2]];40("f = u(a,i){"+(6.1s[m[1]].5P||"")+"v "+f+"}");r=6.2q(r,f,2g)}}v{r:r,t:t}},4x:u(o,r,1Q,Y,1J){P(B s=o.1b;s;s=s.2e)7(s.24==1){B 1M=U;7(1Q==".")1M=s.19&&1J.1n(s.19);J 7(1Q=="#")1M=s.36("2J")==Y;7(1M)r.1g(s);7(1Q=="#"&&r.I)3O;7(s.1b)6.4x(s,r,1Q,Y,1J)}v r},4z:u(D){B 4A=[];B Q=D.11;22(Q&&Q!=17){4A.1g(Q);Q=Q.11}v 4A},2a:u(Q,1i,3Z,D){1i=1i||1;B 1T=0;P(;Q;Q=Q[3Z]){7(Q.24==1)1T++;7(1T==1i||1i=="5R"&&1T%2==0&&1T>1&&Q==D||1i=="5S"&&1T%2==1&&Q==D)v Q}},2B:u(n,D){B r=[];P(;n;n=n.2e){7(n.24==1&&(!D||n!=D))r.1g(n)}v r}});6.G={1M:u(S,C,1o,F){7(6.W.1j&&S.3L!=T)S=1w;7(F)1o.F=F;7(!1o.2A)1o.2A=q.2A++;7(!S.$1H)S.$1H={};B 38=S.$1H[C];7(!38){38=S.$1H[C]={};7(S["39"+C])38[0]=S["39"+C]}38[1o.2A]=1o;S["39"+C]=q.5Y;7(!q.1k[C])q.1k[C]=[];q.1k[C].1g(S)},2A:1,1k:{},2f:u(S,C,1o){7(S.$1H){B i,j,k;7(C&&C.C){1o=C.1o;C=C.C}7(C&&S.$1H[C])7(1o)5U S.$1H[C][1o.2A];J P(i 1x S.$1H[C])5U S.$1H[C][i];J P(j 1x S.$1H)q.2f(S,j);P(k 1x S.$1H[C])7(k){k=U;3O}7(!k)S["39"+C]=16}},1S:u(C,F,S){F=6.3M(F||[]);7(!S)6.K(q.1k[C]||[],u(){6.G.1S(C,F,q)});J{B 1o=S["39"+C],1a,E=6.1t(S[C]);7(1o){F.61(q.2j({C:C,1O:S}));7((1a=1o.14(S,F))!==12)q.4F=U}7(E&&1a!==12)S[C]();q.4F=12}},5Y:u(G){7(1C 6=="T"||6.G.4F)v;G=6.G.2j(G||1w.G||{});B 3R;B c=q.$1H[G.C];B 1E=[].3N.3n(1A,1);1E.61(G);P(B j 1x c){1E[0].1o=c[j];1E[0].F=c[j].F;7(c[j].14(q,1E)===12){G.2n();G.2H();3R=12}}7(6.W.1j)G.1O=G.2n=G.2H=G.1o=G.F=16;v 3R},2j:u(G){7(!G.1O&&G.63)G.1O=G.63;7(G.65==T&&G.67!=T){B e=17.4H,b=17.64;G.65=G.67+(e.68||b.68);G.7Y=G.7Z+(e.6c||b.6c)}7(6.W.2N&&G.1O.24==3){B 3a=G;G=6.1z({},3a);G.1O=3a.1O.11;G.2n=u(){v 3a.2n()};G.2H=u(){v 3a.2H()}}7(!G.2n)G.2n=u(){q.3R=12};7(!G.2H)G.2H=u(){q.82=U};v G}};6.E.1z({3U:u(C,F,E){v q.K(u(){6.G.1M(q,C,E||F,F)})},6u:u(C,F,E){v q.K(u(){6.G.1M(q,C,u(G){6(q).6f(G);v(E||F).14(q,1A)},F)})},6f:u(C,E){v q.K(u(){6.G.2f(q,C,E)})},1S:u(C,F){v q.K(u(){6.G.1S(C,F,q)})},3X:u(){B a=1A;v q.6j(u(e){q.4M=q.4M==0?1:0;e.2n();v a[q.4M].14(q,[e])||12})},83:u(f,g){u 4O(e){B p=(e.C=="41"?e.84:e.85)||e.86;22(p&&p!=q)2G{p=p.11}2w(e){p=q};7(p==q)v 12;v(e.C=="41"?f:g).14(q,[e])}v q.41(4O).6k(4O)},27:u(f){7(6.3W)f.14(17,[6]);J{6.3c.1g(u(){v f.14(q,[6])})}v q}});6.1z({3W:12,3c:[],27:u(){7(!6.3W){6.3W=U;7(6.3c){6.K(6.3c,u(){q.14(17)});6.3c=16}7(6.W.3h||6.W.3f)17.87("6o",6.27,12)}}});1p u(){6.K(("88,8a,2O,8b,8d,52,6j,8e,"+"8f,8g,8h,41,6k,8j,42,"+"4R,8k,8l,8m,2C").3o(","),u(i,o){6.E[o]=u(f){v f?q.3U(o,f):q.1S(o)}});7(6.W.3h||6.W.3f)17.8n("6o",6.27,12);J 7(6.W.1j){17.8o("<8r"+"8s 2J=62 8u=U "+"3e=//:><\\/2d>");B 2d=17.4X("62");7(2d)2d.37=u(){7(q.3D!="1X")v;q.11.33(q);6.27()};2d=16}J 7(6.W.2N)6.50=3L(u(){7(17.3D=="8y"||17.3D=="1X"){4p(6.50);6.50=16;6.27()}},10);6.G.1M(1w,"2O",6.27)};7(6.W.1j)6(1w).6u("52",u(){B 1k=6.G.1k;P(B C 1x 1k){B 4Z=1k[C],i=4Z.I;7(i&&C!=\'52\')6w 6.G.2f(4Z[i-1],C);22(--i)}});6.E.1z({6A:u(V,21,M){q.2O(V,21,M,1)},2O:u(V,21,M,1W){7(6.1t(V))v q.3U("2O",V);M=M||u(){};B C="5d";7(21)7(6.1t(21)){M=21;21=16}J{21=6.3g(21);C="5V"}B 4e=q;6.3v({V:V,C:C,F:21,1W:1W,1X:u(2P,15){7(15=="2M"||!1W&&15=="5L")4e.1I("2t",2P.3G).4V().K(M,[2P.3G,15,2P]);J M.14(4e,[2P.3G,15,2P])}});v q},6B:u(){v 6.3g(q)},4V:u(){v q.2o("2d").K(u(){7(q.3e)6.59(q.3e);J 6.4a(q.2L||q.6H||q.2t||"")}).4g()}});7(!1w.3p)3p=u(){v 1p 6I("6K.6M")};6.K("5m,5Q,5O,5W,5N,5H".3o(","),u(i,o){6.E[o]=u(f){v q.3U(o,f)}});6.1z({2b:u(V,F,M,C,1W){7(6.1t(F)){M=F;F=16}v 6.3v({V:V,F:F,2M:M,4t:C,1W:1W})},6Q:u(V,F,M,C){v 6.2b(V,F,M,C,1)},59:u(V,M){v 6.2b(V,16,M,"2d")},6S:u(V,F,M){v 6.2b(V,F,M,"6m")},6U:u(V,F,M,C){7(6.1t(F)){M=F;F={}}v 6.3v({C:"5V",V:V,F:F,2M:M,4t:C})},6X:u(29){6.3q.29=29},6Y:u(5c){6.1z(6.3q,5c)},3q:{1k:U,C:"5d",29:0,5r:"70/x-73-3w-77",5h:U,48:U,F:16},3S:{},3v:u(s){s=6.1z({},6.3q,s);7(s.F){7(s.5h&&1C s.F!="23")s.F=6.3g(s.F);7(s.C.4m()=="2b"){s.V+=((s.V.18("?")>-1)?"&":"?")+s.F;s.F=16}}7(s.1k&&!6.4E++)6.G.1S("5m");B 4y=12;B N=1p 3p();N.7j(s.C,s.V,s.48);7(s.F)N.3A("7l-7m",s.5r);7(s.1W)N.3A("7o-4K-7q",6.3S[s.V]||"7s, 7t 7w 7x 4o:4o:4o 7z");N.3A("X-7B-7C","3p");7(N.7E)N.3A("7F","7G");7(s.5G)s.5G(N);7(s.1k)6.G.1S("5H",[N,s]);B 37=u(4s){7(N&&(N.3D==4||4s=="29")){4y=U;7(3I){4p(3I);3I=16}B 15;2G{15=6.5Z(N)&&4s!="29"?s.1W&&6.69(N,s.V)?"5L":"2M":"2C";7(15!="2C"){B 3F;2G{3F=N.4P("6b-4K")}2w(e){}7(s.1W&&3F)6.3S[s.V]=3F;B F=6.6i(N,s.4t);7(s.2M)s.2M(F,15);7(s.1k)6.G.1S("5N",[N,s])}J 6.3J(s,N,15)}2w(e){15="2C";6.3J(s,N,15,e)}7(s.1k)6.G.1S("5O",[N,s]);7(s.1k&&!--6.4E)6.G.1S("5Q");7(s.1X)s.1X(N,15);7(s.48)N=16}};B 3I=3L(37,13);7(s.29>0)57(u(){7(N){N.7N();7(!4y)37("29")}},s.29);2G{N.7Q(s.F)}2w(e){6.3J(s,N,16,e)}7(!s.48)37();v N},3J:u(s,N,15,e){7(s.2C)s.2C(N,15,e);7(s.1k)6.G.1S("5W",[N,s,e])},4E:0,5Z:u(r){2G{v!r.15&&7V.7W=="4G:"||(r.15>=5X&&r.15<7X)||r.15==6d||6.W.2N&&r.15==T}2w(e){}v 12},69:u(N,V){2G{B 6e=N.4P("6b-4K");v N.15==6d||6e==6.3S[V]||6.W.2N&&N.15==T}2w(e){}v 12},6i:u(r,C){B 4Q=r.4P("8c-C");B F=!C&&4Q&&4Q.18("N")>=0;F=C=="N"||F?r.8i:r.3G;7(C=="2d")6.4a(F);7(C=="6m")40("F = "+F);7(C=="4U")6("<1V>").4U(F).4V();v F},3g:u(a){B s=[];7(a.1l==2y||a.3Y)6.K(a,u(){s.1g(2x(q.Y)+"="+2x(q.O))});J P(B j 1x a)7(a[j]&&a[j].1l==2y)6.K(a[j],u(){s.1g(2x(j)+"="+2x(q))});J s.1g(2x(j)+"="+2x(a[j]));v s.6t("&")},4a:u(F){7(1w.54)1w.54(F);J 7(6.W.2N)1w.57(F,0);J 40.3n(1w,F)}});6.E.1z({1L:u(R,M){B 1G=q.1D(":1G");R?1G.26({28:"1L",3V:"1L",1d:"1L"},R,M):1G.K(u(){q.1q.1h=q.2E?q.2E:"";7(6.1m(q,"1h")=="1Z")q.1q.1h="2D"});v q},1K:u(R,M){B 3i=q.1D(":3i");R?3i.26({28:"1K",3V:"1K",1d:"1K"},R,M):3i.K(u(){q.2E=q.2E||6.1m(q,"1h");7(q.2E=="1Z")q.2E="2D";q.1q.1h="1Z"});v q},5g:6.E.3X,3X:u(E,4I){B 1E=1A;v 6.1t(E)&&6.1t(4I)?q.5g(E,4I):q.K(u(){6(q)[6(q).4l(":1G")?"1L":"1K"].14(6(q),1E)})},7a:u(R,M){v q.26({28:"1L"},R,M)},7c:u(R,M){v q.26({28:"1K"},R,M)},7f:u(R,M){v q.K(u(){B 5k=6(q).4l(":1G")?"1L":"1K";6(q).26({28:5k},R,M)})},7r:u(R,M){v q.26({1d:"1L"},R,M)},7u:u(R,M){v q.26({1d:"1K"},R,M)},7y:u(R,43,M){v q.26({1d:43},R,M)},26:u(H,R,1v,M){v q.1F(u(){q.2F=6.1z({},H);B 1u=6.R(R,1v,M);P(B p 1x H){B e=1p 6.3b(q,1u,p);7(H[p].1l==3Q)e.2s(e.Q(),H[p]);J e[H[p]](H)}})},1F:u(C,E){7(!E){E=C;C="3b"}v q.K(u(){7(!q.1F)q.1F={};7(!q.1F[C])q.1F[C]=[];q.1F[C].1g(E);7(q.1F[C].I==1)E.14(q)})}});6.1z({R:u(R,1v,E){B 1u=R&&R.1l==7K?R:{1X:E||!E&&1v||6.1t(R)&&R,25:R,1v:E&&1v||1v&&1v.1l!=4w&&1v};1u.25=(1u.25&&1u.25.1l==3Q?1u.25:{7R:7S,7T:5X}[1u.25])||7U;1u.1N=1u.1X;1u.1X=u(){6.6a(q,"3b");7(6.1t(1u.1N))1u.1N.14(q)};v 1u},1v:{},1F:{},6a:u(D,C){C=C||"3b";7(D.1F&&D.1F[C]){D.1F[C].4L();B f=D.1F[C][0];7(f)f.14(D)}},3b:u(D,1e,H){B z=q;B y=D.1q;B 4D=6.1m(D,"1h");y.5T="1G";z.a=u(){7(1e.49)1e.49.14(D,[z.2p]);7(H=="1d")6.1I(y,"1d",z.2p);J 7(6l(z.2p))y[H]=6l(z.2p)+"4S";y.1h="2D"};z.6v=u(){v 4T(6.1m(D,H))};z.Q=u(){B r=4T(6.30(D,H));v r&&r>-8z?r:z.6v()};z.2s=u(4f,43){z.4J=(1p 5o()).5w();z.2p=4f;z.a();z.4q=3L(u(){z.49(4f,43)},13)};z.1L=u(){7(!D.1y)D.1y={};D.1y[H]=q.Q();1e.1L=U;z.2s(0,D.1y[H]);7(H!="1d")y[H]="5a"};z.1K=u(){7(!D.1y)D.1y={};D.1y[H]=q.Q();1e.1K=U;z.2s(D.1y[H],0)};z.3X=u(){7(!D.1y)D.1y={};D.1y[H]=q.Q();7(4D=="1Z"){1e.1L=U;7(H!="1d")y[H]="5a";z.2s(0,D.1y[H])}J{1e.1K=U;z.2s(D.1y[H],0)}};z.49=u(32,47){B t=(1p 5o()).5w();7(t>1e.25+z.4J){4p(z.4q);z.4q=16;z.2p=47;z.a();7(D.2F)D.2F[H]=U;B 2c=U;P(B i 1x D.2F)7(D.2F[i]!==U)2c=12;7(2c){y.5T="";y.1h=4D;7(6.1m(D,"1h")=="1Z")y.1h="2D";7(1e.1K)y.1h="1Z";7(1e.1K||1e.1L)P(B p 1x D.2F)7(p=="1d")6.1I(y,p,D.1y[p]);J y[p]=""}7(2c&&6.1t(1e.1X))1e.1X.14(D)}J{B n=t-q.4J;B p=n/1e.25;z.2p=1e.1v&&6.1v[1e.1v]?6.1v[1e.1v](p,n,32,(47-32),1e.25):((-6h.7O(p*6h.8L)/2)+0.5)*(47-32)+32;z.a()}}}})}',62,545,'||||||jQuery|if|||||||||||||||||||this||||function|return||||||var|type|elem|fn|data|event|prop|length|else|each|ret|callback|xml|value|for|cur|speed|element|undefined|true|url|browser||name|||parentNode|false||apply|status|null|document|indexOf|className|val|firstChild|obj|opacity|options|nodeName|push|display|result|msie|global|constructor|css|test|handler|new|style|arg|expr|isFunction|opt|easing|window|in|orig|extend|arguments|context|typeof|filter|args|queue|hidden|events|attr|re|hide|show|add|old|target|table|token|replace|trigger|num|elems|div|ifModified|complete|key|none|tbody|params|while|string|nodeType|duration|animate|ready|height|timeout|nth|get|done|script|nextSibling|remove|not|index|tb|fix|merge|oid|z0|preventDefault|find|now|grep|pushStack|custom|innerHTML|first|cssFloat|catch|encodeURIComponent|Array|el|guid|sibling|error|block|oldblock|curAnim|try|stopPropagation|childNodes|id|wrap|text|success|safari|load|res|exec|al|_|last|substr|has|disabled|insertBefore|selected|checked|curCSS|map|firstNum|removeChild|re2|trim|getAttribute|onreadystatechange|handlers|on|originalEvent|fx|readyList|parPos|src|opera|param|mozilla|visible|domManip|clean|cloneNode|tr|call|split|XMLHttpRequest|ajaxSettings|append|child|String|empty|ajax|form|button|inArray|multiFilter|setRequestHeader|foundToken|9_|readyState|tag|modRes|responseText|second|ival|handleError|toUpperCase|setInterval|makeArray|slice|break|oWidth|Number|returnValue|lastModified|styleFloat|bind|width|isReady|toggle|jquery|dir|eval|mouseover|select|to|defaultView|position|oHeight|lastNum|async|step|globalEval|static|pos|swap|self|from|end|float|alpha|radio|inv|is|toLowerCase|visibility|00|clearInterval|timer|rec|isTimeout|dataType|_resort|RegExp|Function|getAll|requestDone|parents|matched|isXMLDoc|appendChild|oldDisplay|active|triggered|file|documentElement|fn2|startTime|Modified|shift|lastToggle|deep|handleHover|getResponseHeader|ct|submit|px|parseFloat|html|evalScripts|getComputedStyle|getElementById|clone|els|safariTimer|currentStyle|unload|force|execScript|getPropertyValue|newProp|setTimeout|zoom|getScript|1px|sl|settings|GET|rl|check|_toggle|processData|prepend|before|state|removeAttr|ajaxStart|lt|Date|gt|eq|contentType|previousSibling|after|parent|contains|getTime|checkbox|password|appendTo|image|reset|input|webkit|href|continue|beforeSend|ajaxSend|ownerDocument|getElementsByTagName|tmp|notmodified|parse|ajaxSuccess|ajaxComplete|_prefix|ajaxStop|even|odd|overflow|delete|POST|ajaxError|200|handle|httpSuccess|nodeValue|unshift|__ie_init|srcElement|body|pageX|tagName|clientX|scrollLeft|httpNotModified|dequeue|Last|scrollTop|304|xmlRes|unbind|100|Math|httpData|click|mouseout|parseInt|json|createElement|DOMContentLoaded|prevObject|ol|setArray|exclude|join|one|max|do|relative|clientHeight|clientWidth|loadIfModified|serialize|toString|thead|tfoot|td|th|textContent|ActiveXObject|htmlFor|Microsoft|class|XMLHTTP|readOnly|gi|match|getIfModified|9999|getJSON|getAttributeNode|post|setAttribute|ig|ajaxTimeout|ajaxSetup|concat|application|userAgent|compatible|www|compatMode|CSS1Compat|next|urlencoded|siblings|children|slideDown|prependTo|slideUp|Top|insertAfter|slideToggle|removeAttribute|addClass|removeClass|open|toggleClass|Content|Type|lastChild|If|only|Since|fadeIn|Thu|01|fadeOut|enabled|Jan|1970|fadeTo|GMT|textarea|Requested|With|prev|overrideMimeType|Connection|close|boxModel|right|object|Object|navigator|substring|abort|cos|font|send|slow|600|fast|400|location|protocol|300|pageY|clientY|method|action|cancelBubble|hover|fromElement|toElement|relatedTarget|removeEventListener|blur|readonly|focus|resize|content|scroll|dblclick|mousedown|mouseup|mousemove|responseXML|change|keydown|keypress|keyup|addEventListener|write|prototype|size|scr|ipt|createTextNode|defer|FORM|reverse|noConflict|loaded|10000|weight|line|Bottom|Right|Left|padding|border|Width|offsetHeight|offsetWidth|absolute|PI|left'.split('|'),0,{})) diff --git a/interface/ispconfig/interface/js/uni-form/uni-form.jquery.js b/interface/ispconfig/interface/js/uni-form/uni-form.jquery.js new file mode 100644 index 0000000000000000000000000000000000000000..e09e63a4f58aef4ac04fa7b956d6480f20c3196e --- /dev/null +++ b/interface/ispconfig/interface/js/uni-form/uni-form.jquery.js @@ -0,0 +1,106 @@ +jQuery.fn.uniform = function(settings) { + settings = jQuery.extend({ + valid_class : 'valid', + invalid_class : 'invalid', + focused_class : 'focused', + holder_class : 'ctrlHolder', + field_selector : 'input, select, textarea' + }, settings); + + return this.each(function() { + var form = jQuery(this); + + // Focus specific control holder + var focusControlHolder = function(element) { + var parent = element.parent(); + + while(typeof(parent) == 'object') { + if(parent) { + if(parent[0] && (parent[0].className.indexOf(settings.holder_class) >= 0)) { + parent.addClass(settings.focused_class); + return; + } // if + } // if + parent = jQuery(parent.parent()); + } // while + }; + + // Select form fields and attach them higlighter functionality + form.find(settings.field_selector).focus(function() { + form.find('.' + settings.focused_class).removeClass(settings.focused_class); + focusControlHolder(jQuery(this)); + }).blur(function() { + form.find('.' + settings.focused_class).removeClass(settings.focused_class); + }); + }); +}; + +// Auto set on page load... +$(document).ready(function() { + jQuery('form.uniForm').uniform(); +}); + +function AR_ResetDates() +{ + if ($("#autoresponder:checked").val() == null) { + $("form.uniForm select").each( + function(){ + $(this).val( $("#" + $(this).attr("id") + " option:first").val() ); + } + ); + } +} + +function AR_SetNow() +{ + DateTime_SetValues('autoresponder_start_date'); + + now = new Date(); + end_date = new Date(now.getFullYear(), now.getMonth(), now.getDate()+2, 0, 0); + + DateTime_SetValues('autoresponder_end_date', end_date); +} + +function DateTime_SetValues(datetime_id, date_obj) +{ + var selects = ['day', 'month', 'year', 'hour', 'minute', 'second']; + + if ( (typeof(date_obj) == 'object') && (typeof(date_obj.getDate()) == 'number') ) { + var now = date_obj; + } else { + var now = new Date(); + } + + jQuery.each(selects, function() { + var unit_name = this.toString(); + var unit_value = ''; + + switch(unit_name) + { + case 'day': + unit_value = now.getDate(); + break; + case 'month': + unit_value = now.getMonth() + 1; + if(unit_value < 10) unit_value = '0'+unit_value; + break; + case 'year': + unit_value = now.getFullYear(); + break; + case 'hour': + unit_value = now.getHours(); + break; + case 'minute': + unit_value = Math.round(parseInt(now.getMinutes())/5)*5; + break; + case 'second': + unit_value = now.getSeconds(); + break; + } + + unit_obj = $("#"+ datetime_id + "_" + unit_name); + if (unit_obj.val() !== null) { + unit_obj.val(unit_value); + } + }); +} \ No newline at end of file diff --git a/interface/ispconfig/interface/js/yui/animation/README b/interface/ispconfig/interface/js/yui/animation/README new file mode 100644 index 0000000000000000000000000000000000000000..a3160f62d8a1e53b2ccd5dd5bdd182d5b1c6bedc --- /dev/null +++ b/interface/ispconfig/interface/js/yui/animation/README @@ -0,0 +1,45 @@ +Animation Release Notes + +*** version 2.2.0 ** + +* Fixed AnimMgr.stop() when called without tween + +*** version 0.12.2 *** + +* raised AnimMgr.fps to 1000 + +*** version 0.12.1 *** +* minified version no longer strips line breaks + +*** version 0.12.0 *** + +* added boolean finish argument to Anim.stop() + +*** version 0.11.3 *** + +* no changes + +*** version 0.11.1 *** + +* changed "prototype" shorthand to "proto" (workaround firefox < 1.5 scoping +bug) + +*** version 0.11.0 *** + +* ColorAnim subclass added +* Motion and Scroll now inherit from ColorAnim +* getDefaultUnit method added +* defaultUnit and defaultUnits deprecated +* getDefault and setDefault methods deprecated + +*** version 0.10.0 *** + +* Scroll now handles relative ("by") animation correctly + +* Now converts "auto" values of "from" to appropriate initial values + +*** version 0.9.0 *** + +* Initial release + + diff --git a/interface/ispconfig/interface/js/yui/animation/animation-debug.js b/interface/ispconfig/interface/js/yui/animation/animation-debug.js new file mode 100644 index 0000000000000000000000000000000000000000..43061953e3b7ff90ee184b85e392dfdee39ac773 --- /dev/null +++ b/interface/ispconfig/interface/js/yui/animation/animation-debug.js @@ -0,0 +1,1361 @@ +/* +Copyright (c) 2007, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.2.0 +*/ +/* +Copyright (c) 2006, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +*/ + +/** + * The animation module provides allows effects to be added to HTMLElements. + * @module animation + * @requires yahoo, event, dom + */ + +/** + * + * Base animation class that provides the interface for building animated effects. + *

Usage: var myAnim = new YAHOO.util.Anim(el, { width: { from: 10, to: 100 } }, 1, YAHOO.util.Easing.easeOut);

+ * @class Anim + * @namespace YAHOO.util + * @requires YAHOO.util.AnimMgr + * @requires YAHOO.util.Easing + * @requires YAHOO.util.Dom + * @requires YAHOO.util.Event + * @requires YAHOO.util.CustomEvent + * @constructor + * @param {String | HTMLElement} el Reference to the element that will be animated + * @param {Object} attributes The attribute(s) to be animated. + * Each attribute is an object with at minimum a "to" or "by" member defined. + * Additional optional members are "from" (defaults to current value), "units" (defaults to "px"). + * All attribute names use camelCase. + * @param {Number} duration (optional, defaults to 1 second) Length of animation (frames or seconds), defaults to time-based + * @param {Function} method (optional, defaults to YAHOO.util.Easing.easeNone) Computes the values that are applied to the attributes per frame (generally a YAHOO.util.Easing method) + */ + +YAHOO.util.Anim = function(el, attributes, duration, method) { + if (el) { + this.init(el, attributes, duration, method); + } +}; + +YAHOO.util.Anim.prototype = { + /** + * Provides a readable name for the Anim instance. + * @method toString + * @return {String} + */ + toString: function() { + var el = this.getEl(); + var id = el.id || el.tagName; + return ("Anim " + id); + }, + + patterns: { // cached for performance + noNegatives: /width|height|opacity|padding/i, // keep at zero or above + offsetAttribute: /^((width|height)|(top|left))$/, // use offsetValue as default + defaultUnit: /width|height|top$|bottom$|left$|right$/i, // use 'px' by default + offsetUnit: /\d+(em|%|en|ex|pt|in|cm|mm|pc)$/i // IE may return these, so convert these to offset + }, + + /** + * Returns the value computed by the animation's "method". + * @method doMethod + * @param {String} attr The name of the attribute. + * @param {Number} start The value this attribute should start from for this animation. + * @param {Number} end The value this attribute should end at for this animation. + * @return {Number} The Value to be applied to the attribute. + */ + doMethod: function(attr, start, end) { + return this.method(this.currentFrame, start, end - start, this.totalFrames); + }, + + /** + * Applies a value to an attribute. + * @method setAttribute + * @param {String} attr The name of the attribute. + * @param {Number} val The value to be applied to the attribute. + * @param {String} unit The unit ('px', '%', etc.) of the value. + */ + setAttribute: function(attr, val, unit) { + if ( this.patterns.noNegatives.test(attr) ) { + val = (val > 0) ? val : 0; + } + + YAHOO.util.Dom.setStyle(this.getEl(), attr, val + unit); + }, + + /** + * Returns current value of the attribute. + * @method getAttribute + * @param {String} attr The name of the attribute. + * @return {Number} val The current value of the attribute. + */ + getAttribute: function(attr) { + var el = this.getEl(); + var val = YAHOO.util.Dom.getStyle(el, attr); + + if (val !== 'auto' && !this.patterns.offsetUnit.test(val)) { + return parseFloat(val); + } + + var a = this.patterns.offsetAttribute.exec(attr) || []; + var pos = !!( a[3] ); // top or left + var box = !!( a[2] ); // width or height + + // use offsets for width/height and abs pos top/left + if ( box || (YAHOO.util.Dom.getStyle(el, 'position') == 'absolute' && pos) ) { + val = el['offset' + a[0].charAt(0).toUpperCase() + a[0].substr(1)]; + } else { // default to zero for other 'auto' + val = 0; + } + + return val; + }, + + /** + * Returns the unit to use when none is supplied. + * @method getDefaultUnit + * @param {attr} attr The name of the attribute. + * @return {String} The default unit to be used. + */ + getDefaultUnit: function(attr) { + if ( this.patterns.defaultUnit.test(attr) ) { + return 'px'; + } + + return ''; + }, + + /** + * Sets the actual values to be used during the animation. Should only be needed for subclass use. + * @method setRuntimeAttribute + * @param {Object} attr The attribute object + * @private + */ + setRuntimeAttribute: function(attr) { + var start; + var end; + var attributes = this.attributes; + + this.runtimeAttributes[attr] = {}; + + var isset = function(prop) { + return (typeof prop !== 'undefined'); + }; + + if ( !isset(attributes[attr]['to']) && !isset(attributes[attr]['by']) ) { + return false; // note return; nothing to animate to + } + + start = ( isset(attributes[attr]['from']) ) ? attributes[attr]['from'] : this.getAttribute(attr); + + // To beats by, per SMIL 2.1 spec + if ( isset(attributes[attr]['to']) ) { + end = attributes[attr]['to']; + } else if ( isset(attributes[attr]['by']) ) { + if (start.constructor == Array) { + end = []; + for (var i = 0, len = start.length; i < len; ++i) { + end[i] = start[i] + attributes[attr]['by'][i]; + } + } else { + end = start + attributes[attr]['by']; + } + } + + this.runtimeAttributes[attr].start = start; + this.runtimeAttributes[attr].end = end; + + // set units if needed + this.runtimeAttributes[attr].unit = ( isset(attributes[attr].unit) ) ? attributes[attr]['unit'] : this.getDefaultUnit(attr); + }, + + /** + * Constructor for Anim instance. + * @method init + * @param {String | HTMLElement} el Reference to the element that will be animated + * @param {Object} attributes The attribute(s) to be animated. + * Each attribute is an object with at minimum a "to" or "by" member defined. + * Additional optional members are "from" (defaults to current value), "units" (defaults to "px"). + * All attribute names use camelCase. + * @param {Number} duration (optional, defaults to 1 second) Length of animation (frames or seconds), defaults to time-based + * @param {Function} method (optional, defaults to YAHOO.util.Easing.easeNone) Computes the values that are applied to the attributes per frame (generally a YAHOO.util.Easing method) + */ + init: function(el, attributes, duration, method) { + /** + * Whether or not the animation is running. + * @property isAnimated + * @private + * @type Boolean + */ + var isAnimated = false; + + /** + * A Date object that is created when the animation begins. + * @property startTime + * @private + * @type Date + */ + var startTime = null; + + /** + * The number of frames this animation was able to execute. + * @property actualFrames + * @private + * @type Int + */ + var actualFrames = 0; + + /** + * The element to be animated. + * @property el + * @private + * @type HTMLElement + */ + el = YAHOO.util.Dom.get(el); + + /** + * The collection of attributes to be animated. + * Each attribute must have at least a "to" or "by" defined in order to animate. + * If "to" is supplied, the animation will end with the attribute at that value. + * If "by" is supplied, the animation will end at that value plus its starting value. + * If both are supplied, "to" is used, and "by" is ignored. + * Optional additional member include "from" (the value the attribute should start animating from, defaults to current value), and "unit" (the units to apply to the values). + * @property attributes + * @type Object + */ + this.attributes = attributes || {}; + + /** + * The length of the animation. Defaults to "1" (second). + * @property duration + * @type Number + */ + this.duration = duration || 1; + + /** + * The method that will provide values to the attribute(s) during the animation. + * Defaults to "YAHOO.util.Easing.easeNone". + * @property method + * @type Function + */ + this.method = method || YAHOO.util.Easing.easeNone; + + /** + * Whether or not the duration should be treated as seconds. + * Defaults to true. + * @property useSeconds + * @type Boolean + */ + this.useSeconds = true; // default to seconds + + /** + * The location of the current animation on the timeline. + * In time-based animations, this is used by AnimMgr to ensure the animation finishes on time. + * @property currentFrame + * @type Int + */ + this.currentFrame = 0; + + /** + * The total number of frames to be executed. + * In time-based animations, this is used by AnimMgr to ensure the animation finishes on time. + * @property totalFrames + * @type Int + */ + this.totalFrames = YAHOO.util.AnimMgr.fps; + + + /** + * Returns a reference to the animated element. + * @method getEl + * @return {HTMLElement} + */ + this.getEl = function() { return el; }; + + /** + * Checks whether the element is currently animated. + * @method isAnimated + * @return {Boolean} current value of isAnimated. + */ + this.isAnimated = function() { + return isAnimated; + }; + + /** + * Returns the animation start time. + * @method getStartTime + * @return {Date} current value of startTime. + */ + this.getStartTime = function() { + return startTime; + }; + + this.runtimeAttributes = {}; + + var logger = {}; + logger.log = function() {YAHOO.log.apply(window, arguments)}; + + logger.log('creating new instance of ' + this); + + /** + * Starts the animation by registering it with the animation manager. + * @method animate + */ + this.animate = function() { + if ( this.isAnimated() ) { + return false; + } + + this.currentFrame = 0; + + this.totalFrames = ( this.useSeconds ) ? Math.ceil(YAHOO.util.AnimMgr.fps * this.duration) : this.duration; + + YAHOO.util.AnimMgr.registerElement(this); + }; + + /** + * Stops the animation. Normally called by AnimMgr when animation completes. + * @method stop + * @param {Boolean} finish (optional) If true, animation will jump to final frame. + */ + this.stop = function(finish) { + if (finish) { + this.currentFrame = this.totalFrames; + this._onTween.fire(); + } + YAHOO.util.AnimMgr.stop(this); + }; + + var onStart = function() { + this.onStart.fire(); + + this.runtimeAttributes = {}; + for (var attr in this.attributes) { + this.setRuntimeAttribute(attr); + } + + isAnimated = true; + actualFrames = 0; + startTime = new Date(); + }; + + /** + * Feeds the starting and ending values for each animated attribute to doMethod once per frame, then applies the resulting value to the attribute(s). + * @private + */ + + var onTween = function() { + var data = { + duration: new Date() - this.getStartTime(), + currentFrame: this.currentFrame + }; + + data.toString = function() { + return ( + 'duration: ' + data.duration + + ', currentFrame: ' + data.currentFrame + ); + }; + + this.onTween.fire(data); + + var runtimeAttributes = this.runtimeAttributes; + + for (var attr in runtimeAttributes) { + this.setAttribute(attr, this.doMethod(attr, runtimeAttributes[attr].start, runtimeAttributes[attr].end), runtimeAttributes[attr].unit); + } + + actualFrames += 1; + }; + + var onComplete = function() { + var actual_duration = (new Date() - startTime) / 1000 ; + + var data = { + duration: actual_duration, + frames: actualFrames, + fps: actualFrames / actual_duration + }; + + data.toString = function() { + return ( + 'duration: ' + data.duration + + ', frames: ' + data.frames + + ', fps: ' + data.fps + ); + }; + + isAnimated = false; + actualFrames = 0; + this.onComplete.fire(data); + }; + + /** + * Custom event that fires after onStart, useful in subclassing + * @private + */ + this._onStart = new YAHOO.util.CustomEvent('_start', this, true); + + /** + * Custom event that fires when animation begins + * Listen via subscribe method (e.g. myAnim.onStart.subscribe(someFunction) + * @event onStart + */ + this.onStart = new YAHOO.util.CustomEvent('start', this); + + /** + * Custom event that fires between each frame + * Listen via subscribe method (e.g. myAnim.onTween.subscribe(someFunction) + * @event onTween + */ + this.onTween = new YAHOO.util.CustomEvent('tween', this); + + /** + * Custom event that fires after onTween + * @private + */ + this._onTween = new YAHOO.util.CustomEvent('_tween', this, true); + + /** + * Custom event that fires when animation ends + * Listen via subscribe method (e.g. myAnim.onComplete.subscribe(someFunction) + * @event onComplete + */ + this.onComplete = new YAHOO.util.CustomEvent('complete', this); + /** + * Custom event that fires after onComplete + * @private + */ + this._onComplete = new YAHOO.util.CustomEvent('_complete', this, true); + + this._onStart.subscribe(onStart); + this._onTween.subscribe(onTween); + this._onComplete.subscribe(onComplete); + } +}; + +/** + * Handles animation queueing and threading. + * Used by Anim and subclasses. + * @class AnimMgr + * @namespace YAHOO.util + */ +YAHOO.util.AnimMgr = new function() { + /** + * Reference to the animation Interval. + * @property thread + * @private + * @type Int + */ + var thread = null; + + /** + * The current queue of registered animation objects. + * @property queue + * @private + * @type Array + */ + var queue = []; + + /** + * The number of active animations. + * @property tweenCount + * @private + * @type Int + */ + var tweenCount = 0; + + /** + * Base frame rate (frames per second). + * Arbitrarily high for better x-browser calibration (slower browsers drop more frames). + * @property fps + * @type Int + * + */ + this.fps = 1000; + + /** + * Interval delay in milliseconds, defaults to fastest possible. + * @property delay + * @type Int + * + */ + this.delay = 1; + + /** + * Adds an animation instance to the animation queue. + * All animation instances must be registered in order to animate. + * @method registerElement + * @param {object} tween The Anim instance to be be registered + */ + this.registerElement = function(tween) { + queue[queue.length] = tween; + tweenCount += 1; + tween._onStart.fire(); + this.start(); + }; + + /** + * removes an animation instance from the animation queue. + * All animation instances must be registered in order to animate. + * @method unRegister + * @param {object} tween The Anim instance to be be registered + * @param {Int} index The index of the Anim instance + * @private + */ + this.unRegister = function(tween, index) { + tween._onComplete.fire(); + index = index || getIndex(tween); + if (index != -1) { + queue.splice(index, 1); + } + + tweenCount -= 1; + if (tweenCount <= 0) { + this.stop(); + } + }; + + /** + * Starts the animation thread. + * Only one thread can run at a time. + * @method start + */ + this.start = function() { + if (thread === null) { + thread = setInterval(this.run, this.delay); + } + }; + + /** + * Stops the animation thread or a specific animation instance. + * @method stop + * @param {object} tween A specific Anim instance to stop (optional) + * If no instance given, Manager stops thread and all animations. + */ + this.stop = function(tween) { + if (!tween) { + clearInterval(thread); + + for (var i = 0, len = queue.length; i < len; ++i) { + if ( queue[0].isAnimated() ) { + this.unRegister(queue[0], 0); + } + } + + queue = []; + thread = null; + tweenCount = 0; + } + else { + this.unRegister(tween); + } + }; + + /** + * Called per Interval to handle each animation frame. + * @method run + */ + this.run = function() { + for (var i = 0, len = queue.length; i < len; ++i) { + var tween = queue[i]; + if ( !tween || !tween.isAnimated() ) { continue; } + + if (tween.currentFrame < tween.totalFrames || tween.totalFrames === null) + { + tween.currentFrame += 1; + + if (tween.useSeconds) { + correctFrame(tween); + } + tween._onTween.fire(); + } + else { YAHOO.util.AnimMgr.stop(tween, i); } + } + }; + + var getIndex = function(anim) { + for (var i = 0, len = queue.length; i < len; ++i) { + if (queue[i] == anim) { + return i; // note return; + } + } + return -1; + }; + + /** + * On the fly frame correction to keep animation on time. + * @method correctFrame + * @private + * @param {Object} tween The Anim instance being corrected. + */ + var correctFrame = function(tween) { + var frames = tween.totalFrames; + var frame = tween.currentFrame; + var expected = (tween.currentFrame * tween.duration * 1000 / tween.totalFrames); + var elapsed = (new Date() - tween.getStartTime()); + var tweak = 0; + + if (elapsed < tween.duration * 1000) { // check if falling behind + tweak = Math.round((elapsed / expected - 1) * tween.currentFrame); + } else { // went over duration, so jump to end + tweak = frames - (frame + 1); + } + if (tweak > 0 && isFinite(tweak)) { // adjust if needed + if (tween.currentFrame + tweak >= frames) {// dont go past last frame + tweak = frames - (frame + 1); + } + + tween.currentFrame += tweak; + } + }; +}; +/** + * Used to calculate Bezier splines for any number of control points. + * @class Bezier + * @namespace YAHOO.util + * + */ +YAHOO.util.Bezier = new function() { + /** + * Get the current position of the animated element based on t. + * Each point is an array of "x" and "y" values (0 = x, 1 = y) + * At least 2 points are required (start and end). + * First point is start. Last point is end. + * Additional control points are optional. + * @method getPosition + * @param {Array} points An array containing Bezier points + * @param {Number} t A number between 0 and 1 which is the basis for determining current position + * @return {Array} An array containing int x and y member data + */ + this.getPosition = function(points, t) { + var n = points.length; + var tmp = []; + + for (var i = 0; i < n; ++i){ + tmp[i] = [points[i][0], points[i][1]]; // save input + } + + for (var j = 1; j < n; ++j) { + for (i = 0; i < n - j; ++i) { + tmp[i][0] = (1 - t) * tmp[i][0] + t * tmp[parseInt(i + 1, 10)][0]; + tmp[i][1] = (1 - t) * tmp[i][1] + t * tmp[parseInt(i + 1, 10)][1]; + } + } + + return [ tmp[0][0], tmp[0][1] ]; + + }; +}; +(function() { +/** + * Anim subclass for color transitions. + *

Usage: var myAnim = new Y.ColorAnim(el, { backgroundColor: { from: '#FF0000', to: '#FFFFFF' } }, 1, Y.Easing.easeOut); Color values can be specified with either 112233, #112233, + * [255,255,255], or rgb(255,255,255)

+ * @class ColorAnim + * @namespace YAHOO.util + * @requires YAHOO.util.Anim + * @requires YAHOO.util.AnimMgr + * @requires YAHOO.util.Easing + * @requires YAHOO.util.Bezier + * @requires YAHOO.util.Dom + * @requires YAHOO.util.Event + * @constructor + * @extends YAHOO.util.Anim + * @param {HTMLElement | String} el Reference to the element that will be animated + * @param {Object} attributes The attribute(s) to be animated. + * Each attribute is an object with at minimum a "to" or "by" member defined. + * Additional optional members are "from" (defaults to current value), "units" (defaults to "px"). + * All attribute names use camelCase. + * @param {Number} duration (optional, defaults to 1 second) Length of animation (frames or seconds), defaults to time-based + * @param {Function} method (optional, defaults to YAHOO.util.Easing.easeNone) Computes the values that are applied to the attributes per frame (generally a YAHOO.util.Easing method) + */ + YAHOO.util.ColorAnim = function(el, attributes, duration, method) { + YAHOO.util.ColorAnim.superclass.constructor.call(this, el, attributes, duration, method); + }; + + YAHOO.extend(YAHOO.util.ColorAnim, YAHOO.util.Anim); + + // shorthand + var Y = YAHOO.util; + var superclass = Y.ColorAnim.superclass; + var proto = Y.ColorAnim.prototype; + + proto.toString = function() { + var el = this.getEl(); + var id = el.id || el.tagName; + return ("ColorAnim " + id); + }; + + proto.patterns.color = /color$/i; + proto.patterns.rgb = /^rgb\(([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\)$/i; + proto.patterns.hex = /^#?([0-9A-F]{2})([0-9A-F]{2})([0-9A-F]{2})$/i; + proto.patterns.hex3 = /^#?([0-9A-F]{1})([0-9A-F]{1})([0-9A-F]{1})$/i; + proto.patterns.transparent = /^transparent|rgba\(0, 0, 0, 0\)$/; // need rgba for safari + + /** + * Attempts to parse the given string and return a 3-tuple. + * @method parseColor + * @param {String} s The string to parse. + * @return {Array} The 3-tuple of rgb values. + */ + proto.parseColor = function(s) { + if (s.length == 3) { return s; } + + var c = this.patterns.hex.exec(s); + if (c && c.length == 4) { + return [ parseInt(c[1], 16), parseInt(c[2], 16), parseInt(c[3], 16) ]; + } + + c = this.patterns.rgb.exec(s); + if (c && c.length == 4) { + return [ parseInt(c[1], 10), parseInt(c[2], 10), parseInt(c[3], 10) ]; + } + + c = this.patterns.hex3.exec(s); + if (c && c.length == 4) { + return [ parseInt(c[1] + c[1], 16), parseInt(c[2] + c[2], 16), parseInt(c[3] + c[3], 16) ]; + } + + return null; + }; + + proto.getAttribute = function(attr) { + var el = this.getEl(); + if ( this.patterns.color.test(attr) ) { + var val = YAHOO.util.Dom.getStyle(el, attr); + + if (this.patterns.transparent.test(val)) { // bgcolor default + var parent = el.parentNode; // try and get from an ancestor + val = Y.Dom.getStyle(parent, attr); + + while (parent && this.patterns.transparent.test(val)) { + parent = parent.parentNode; + val = Y.Dom.getStyle(parent, attr); + if (parent.tagName.toUpperCase() == 'HTML') { + val = '#fff'; + } + } + } + } else { + val = superclass.getAttribute.call(this, attr); + } + + return val; + }; + + proto.doMethod = function(attr, start, end) { + var val; + + if ( this.patterns.color.test(attr) ) { + val = []; + for (var i = 0, len = start.length; i < len; ++i) { + val[i] = superclass.doMethod.call(this, attr, start[i], end[i]); + } + + val = 'rgb('+Math.floor(val[0])+','+Math.floor(val[1])+','+Math.floor(val[2])+')'; + } + else { + val = superclass.doMethod.call(this, attr, start, end); + } + + return val; + }; + + proto.setRuntimeAttribute = function(attr) { + superclass.setRuntimeAttribute.call(this, attr); + + if ( this.patterns.color.test(attr) ) { + var attributes = this.attributes; + var start = this.parseColor(this.runtimeAttributes[attr].start); + var end = this.parseColor(this.runtimeAttributes[attr].end); + // fix colors if going "by" + if ( typeof attributes[attr]['to'] === 'undefined' && typeof attributes[attr]['by'] !== 'undefined' ) { + end = this.parseColor(attributes[attr].by); + + for (var i = 0, len = start.length; i < len; ++i) { + end[i] = start[i] + end[i]; + } + } + + this.runtimeAttributes[attr].start = start; + this.runtimeAttributes[attr].end = end; + } + }; +})(); +/* +TERMS OF USE - EASING EQUATIONS +Open source under the BSD License. +Copyright 2001 Robert Penner All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + * Neither the name of the author nor the names of contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/** + * Singleton that determines how an animation proceeds from start to end. + * @class Easing + * @namespace YAHOO.util +*/ + +YAHOO.util.Easing = { + + /** + * Uniform speed between points. + * @method easeNone + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + easeNone: function (t, b, c, d) { + return c*t/d + b; + }, + + /** + * Begins slowly and accelerates towards end. (quadratic) + * @method easeIn + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + easeIn: function (t, b, c, d) { + return c*(t/=d)*t + b; + }, + + /** + * Begins quickly and decelerates towards end. (quadratic) + * @method easeOut + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + easeOut: function (t, b, c, d) { + return -c *(t/=d)*(t-2) + b; + }, + + /** + * Begins slowly and decelerates towards end. (quadratic) + * @method easeBoth + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + easeBoth: function (t, b, c, d) { + if ((t/=d/2) < 1) { + return c/2*t*t + b; + } + + return -c/2 * ((--t)*(t-2) - 1) + b; + }, + + /** + * Begins slowly and accelerates towards end. (quartic) + * @method easeInStrong + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + easeInStrong: function (t, b, c, d) { + return c*(t/=d)*t*t*t + b; + }, + + /** + * Begins quickly and decelerates towards end. (quartic) + * @method easeOutStrong + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + easeOutStrong: function (t, b, c, d) { + return -c * ((t=t/d-1)*t*t*t - 1) + b; + }, + + /** + * Begins slowly and decelerates towards end. (quartic) + * @method easeBothStrong + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + easeBothStrong: function (t, b, c, d) { + if ((t/=d/2) < 1) { + return c/2*t*t*t*t + b; + } + + return -c/2 * ((t-=2)*t*t*t - 2) + b; + }, + + /** + * Snap in elastic effect. + * @method elasticIn + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @param {Number} a Amplitude (optional) + * @param {Number} p Period (optional) + * @return {Number} The computed value for the current animation frame + */ + + elasticIn: function (t, b, c, d, a, p) { + if (t == 0) { + return b; + } + if ( (t /= d) == 1 ) { + return b+c; + } + if (!p) { + p=d*.3; + } + + if (!a || a < Math.abs(c)) { + a = c; + var s = p/4; + } + else { + var s = p/(2*Math.PI) * Math.asin (c/a); + } + + return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b; + }, + + /** + * Snap out elastic effect. + * @method elasticOut + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @param {Number} a Amplitude (optional) + * @param {Number} p Period (optional) + * @return {Number} The computed value for the current animation frame + */ + elasticOut: function (t, b, c, d, a, p) { + if (t == 0) { + return b; + } + if ( (t /= d) == 1 ) { + return b+c; + } + if (!p) { + p=d*.3; + } + + if (!a || a < Math.abs(c)) { + a = c; + var s = p / 4; + } + else { + var s = p/(2*Math.PI) * Math.asin (c/a); + } + + return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b; + }, + + /** + * Snap both elastic effect. + * @method elasticBoth + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @param {Number} a Amplitude (optional) + * @param {Number} p Period (optional) + * @return {Number} The computed value for the current animation frame + */ + elasticBoth: function (t, b, c, d, a, p) { + if (t == 0) { + return b; + } + + if ( (t /= d/2) == 2 ) { + return b+c; + } + + if (!p) { + p = d*(.3*1.5); + } + + if ( !a || a < Math.abs(c) ) { + a = c; + var s = p/4; + } + else { + var s = p/(2*Math.PI) * Math.asin (c/a); + } + + if (t < 1) { + return -.5*(a*Math.pow(2,10*(t-=1)) * + Math.sin( (t*d-s)*(2*Math.PI)/p )) + b; + } + return a*Math.pow(2,-10*(t-=1)) * + Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b; + }, + + + /** + * Backtracks slightly, then reverses direction and moves to end. + * @method backIn + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @param {Number} s Overshoot (optional) + * @return {Number} The computed value for the current animation frame + */ + backIn: function (t, b, c, d, s) { + if (typeof s == 'undefined') { + s = 1.70158; + } + return c*(t/=d)*t*((s+1)*t - s) + b; + }, + + /** + * Overshoots end, then reverses and comes back to end. + * @method backOut + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @param {Number} s Overshoot (optional) + * @return {Number} The computed value for the current animation frame + */ + backOut: function (t, b, c, d, s) { + if (typeof s == 'undefined') { + s = 1.70158; + } + return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b; + }, + + /** + * Backtracks slightly, then reverses direction, overshoots end, + * then reverses and comes back to end. + * @method backBoth + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @param {Number} s Overshoot (optional) + * @return {Number} The computed value for the current animation frame + */ + backBoth: function (t, b, c, d, s) { + if (typeof s == 'undefined') { + s = 1.70158; + } + + if ((t /= d/2 ) < 1) { + return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b; + } + return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b; + }, + + /** + * Bounce off of start. + * @method bounceIn + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + bounceIn: function (t, b, c, d) { + return c - YAHOO.util.Easing.bounceOut(d-t, 0, c, d) + b; + }, + + /** + * Bounces off end. + * @method bounceOut + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + bounceOut: function (t, b, c, d) { + if ((t/=d) < (1/2.75)) { + return c*(7.5625*t*t) + b; + } else if (t < (2/2.75)) { + return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b; + } else if (t < (2.5/2.75)) { + return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b; + } + return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b; + }, + + /** + * Bounces off start and end. + * @method bounceBoth + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + bounceBoth: function (t, b, c, d) { + if (t < d/2) { + return YAHOO.util.Easing.bounceIn(t*2, 0, c, d) * .5 + b; + } + return YAHOO.util.Easing.bounceOut(t*2-d, 0, c, d) * .5 + c*.5 + b; + } +}; + +(function() { +/** + * Anim subclass for moving elements along a path defined by the "points" + * member of "attributes". All "points" are arrays with x, y coordinates. + *

Usage: var myAnim = new YAHOO.util.Motion(el, { points: { to: [800, 800] } }, 1, YAHOO.util.Easing.easeOut);

+ * @class Motion + * @namespace YAHOO.util + * @requires YAHOO.util.Anim + * @requires YAHOO.util.AnimMgr + * @requires YAHOO.util.Easing + * @requires YAHOO.util.Bezier + * @requires YAHOO.util.Dom + * @requires YAHOO.util.Event + * @requires YAHOO.util.CustomEvent + * @constructor + * @extends YAHOO.util.Anim + * @param {String | HTMLElement} el Reference to the element that will be animated + * @param {Object} attributes The attribute(s) to be animated. + * Each attribute is an object with at minimum a "to" or "by" member defined. + * Additional optional members are "from" (defaults to current value), "units" (defaults to "px"). + * All attribute names use camelCase. + * @param {Number} duration (optional, defaults to 1 second) Length of animation (frames or seconds), defaults to time-based + * @param {Function} method (optional, defaults to YAHOO.util.Easing.easeNone) Computes the values that are applied to the attributes per frame (generally a YAHOO.util.Easing method) + */ + YAHOO.util.Motion = function(el, attributes, duration, method) { + if (el) { // dont break existing subclasses not using YAHOO.extend + YAHOO.util.Motion.superclass.constructor.call(this, el, attributes, duration, method); + } + }; + + YAHOO.extend(YAHOO.util.Motion, YAHOO.util.ColorAnim); + + // shorthand + var Y = YAHOO.util; + var superclass = Y.Motion.superclass; + var proto = Y.Motion.prototype; + + proto.toString = function() { + var el = this.getEl(); + var id = el.id || el.tagName; + return ("Motion " + id); + }; + + proto.patterns.points = /^points$/i; + + proto.setAttribute = function(attr, val, unit) { + if ( this.patterns.points.test(attr) ) { + unit = unit || 'px'; + superclass.setAttribute.call(this, 'left', val[0], unit); + superclass.setAttribute.call(this, 'top', val[1], unit); + } else { + superclass.setAttribute.call(this, attr, val, unit); + } + }; + + proto.getAttribute = function(attr) { + if ( this.patterns.points.test(attr) ) { + var val = [ + superclass.getAttribute.call(this, 'left'), + superclass.getAttribute.call(this, 'top') + ]; + } else { + val = superclass.getAttribute.call(this, attr); + } + + return val; + }; + + proto.doMethod = function(attr, start, end) { + var val = null; + + if ( this.patterns.points.test(attr) ) { + var t = this.method(this.currentFrame, 0, 100, this.totalFrames) / 100; + val = Y.Bezier.getPosition(this.runtimeAttributes[attr], t); + } else { + val = superclass.doMethod.call(this, attr, start, end); + } + return val; + }; + + proto.setRuntimeAttribute = function(attr) { + if ( this.patterns.points.test(attr) ) { + var el = this.getEl(); + var attributes = this.attributes; + var start; + var control = attributes['points']['control'] || []; + var end; + var i, len; + + if (control.length > 0 && !(control[0] instanceof Array) ) { // could be single point or array of points + control = [control]; + } else { // break reference to attributes.points.control + var tmp = []; + for (i = 0, len = control.length; i< len; ++i) { + tmp[i] = control[i]; + } + control = tmp; + } + + if (Y.Dom.getStyle(el, 'position') == 'static') { // default to relative + Y.Dom.setStyle(el, 'position', 'relative'); + } + + if ( isset(attributes['points']['from']) ) { + Y.Dom.setXY(el, attributes['points']['from']); // set position to from point + } + else { Y.Dom.setXY( el, Y.Dom.getXY(el) ); } // set it to current position + + start = this.getAttribute('points'); // get actual top & left + + // TO beats BY, per SMIL 2.1 spec + if ( isset(attributes['points']['to']) ) { + end = translateValues.call(this, attributes['points']['to'], start); + + var pageXY = Y.Dom.getXY(this.getEl()); + for (i = 0, len = control.length; i < len; ++i) { + control[i] = translateValues.call(this, control[i], start); + } + + + } else if ( isset(attributes['points']['by']) ) { + end = [ start[0] + attributes['points']['by'][0], start[1] + attributes['points']['by'][1] ]; + + for (i = 0, len = control.length; i < len; ++i) { + control[i] = [ start[0] + control[i][0], start[1] + control[i][1] ]; + } + } + + this.runtimeAttributes[attr] = [start]; + + if (control.length > 0) { + this.runtimeAttributes[attr] = this.runtimeAttributes[attr].concat(control); + } + + this.runtimeAttributes[attr][this.runtimeAttributes[attr].length] = end; + } + else { + superclass.setRuntimeAttribute.call(this, attr); + } + }; + + var translateValues = function(val, start) { + var pageXY = Y.Dom.getXY(this.getEl()); + val = [ val[0] - pageXY[0] + start[0], val[1] - pageXY[1] + start[1] ]; + + return val; + }; + + var isset = function(prop) { + return (typeof prop !== 'undefined'); + }; +})(); +(function() { +/** + * Anim subclass for scrolling elements to a position defined by the "scroll" + * member of "attributes". All "scroll" members are arrays with x, y scroll positions. + *

Usage: var myAnim = new YAHOO.util.Scroll(el, { scroll: { to: [0, 800] } }, 1, YAHOO.util.Easing.easeOut);

+ * @class Scroll + * @namespace YAHOO.util + * @requires YAHOO.util.Anim + * @requires YAHOO.util.AnimMgr + * @requires YAHOO.util.Easing + * @requires YAHOO.util.Bezier + * @requires YAHOO.util.Dom + * @requires YAHOO.util.Event + * @requires YAHOO.util.CustomEvent + * @extends YAHOO.util.Anim + * @constructor + * @param {String or HTMLElement} el Reference to the element that will be animated + * @param {Object} attributes The attribute(s) to be animated. + * Each attribute is an object with at minimum a "to" or "by" member defined. + * Additional optional members are "from" (defaults to current value), "units" (defaults to "px"). + * All attribute names use camelCase. + * @param {Number} duration (optional, defaults to 1 second) Length of animation (frames or seconds), defaults to time-based + * @param {Function} method (optional, defaults to YAHOO.util.Easing.easeNone) Computes the values that are applied to the attributes per frame (generally a YAHOO.util.Easing method) + */ + YAHOO.util.Scroll = function(el, attributes, duration, method) { + if (el) { // dont break existing subclasses not using YAHOO.extend + YAHOO.util.Scroll.superclass.constructor.call(this, el, attributes, duration, method); + } + }; + + YAHOO.extend(YAHOO.util.Scroll, YAHOO.util.ColorAnim); + + // shorthand + var Y = YAHOO.util; + var superclass = Y.Scroll.superclass; + var proto = Y.Scroll.prototype; + + proto.toString = function() { + var el = this.getEl(); + var id = el.id || el.tagName; + return ("Scroll " + id); + }; + + proto.doMethod = function(attr, start, end) { + var val = null; + + if (attr == 'scroll') { + val = [ + this.method(this.currentFrame, start[0], end[0] - start[0], this.totalFrames), + this.method(this.currentFrame, start[1], end[1] - start[1], this.totalFrames) + ]; + + } else { + val = superclass.doMethod.call(this, attr, start, end); + } + return val; + }; + + proto.getAttribute = function(attr) { + var val = null; + var el = this.getEl(); + + if (attr == 'scroll') { + val = [ el.scrollLeft, el.scrollTop ]; + } else { + val = superclass.getAttribute.call(this, attr); + } + + return val; + }; + + proto.setAttribute = function(attr, val, unit) { + var el = this.getEl(); + + if (attr == 'scroll') { + el.scrollLeft = val[0]; + el.scrollTop = val[1]; + } else { + superclass.setAttribute.call(this, attr, val, unit); + } + }; +})(); +YAHOO.register("animation", YAHOO.util.Anim, {version: "2.2.0", build: "127"}); diff --git a/interface/ispconfig/interface/js/yui/animation/animation-min.js b/interface/ispconfig/interface/js/yui/animation/animation-min.js new file mode 100644 index 0000000000000000000000000000000000000000..ba5a9b15de452698a7c71d4935ea9872c41d171b --- /dev/null +++ b/interface/ispconfig/interface/js/yui/animation/animation-min.js @@ -0,0 +1,75 @@ +/* +Copyright (c) 2007, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.2.0 +*/ + +YAHOO.util.Anim=function(el,attributes,duration,method){if(el){this.init(el,attributes,duration,method);}};YAHOO.util.Anim.prototype={toString:function(){var el=this.getEl();var id=el.id||el.tagName;return("Anim "+id);},patterns:{noNegatives:/width|height|opacity|padding/i,offsetAttribute:/^((width|height)|(top|left))$/,defaultUnit:/width|height|top$|bottom$|left$|right$/i,offsetUnit:/\d+(em|%|en|ex|pt|in|cm|mm|pc)$/i},doMethod:function(attr,start,end){return this.method(this.currentFrame,start,end-start,this.totalFrames);},setAttribute:function(attr,val,unit){if(this.patterns.noNegatives.test(attr)){val=(val>0)?val:0;} +YAHOO.util.Dom.setStyle(this.getEl(),attr,val+unit);},getAttribute:function(attr){var el=this.getEl();var val=YAHOO.util.Dom.getStyle(el,attr);if(val!=='auto'&&!this.patterns.offsetUnit.test(val)){return parseFloat(val);} +var a=this.patterns.offsetAttribute.exec(attr)||[];var pos=!!(a[3]);var box=!!(a[2]);if(box||(YAHOO.util.Dom.getStyle(el,'position')=='absolute'&&pos)){val=el['offset'+a[0].charAt(0).toUpperCase()+a[0].substr(1)];}else{val=0;} +return val;},getDefaultUnit:function(attr){if(this.patterns.defaultUnit.test(attr)){return'px';} +return'';},setRuntimeAttribute:function(attr){var start;var end;var attributes=this.attributes;this.runtimeAttributes[attr]={};var isset=function(prop){return(typeof prop!=='undefined');};if(!isset(attributes[attr]['to'])&&!isset(attributes[attr]['by'])){return false;} +start=(isset(attributes[attr]['from']))?attributes[attr]['from']:this.getAttribute(attr);if(isset(attributes[attr]['to'])){end=attributes[attr]['to'];}else if(isset(attributes[attr]['by'])){if(start.constructor==Array){end=[];for(var i=0,len=start.length;i0&&isFinite(tweak)){if(tween.currentFrame+tweak>=frames){tweak=frames-(frame+1);} +tween.currentFrame+=tweak;}};};YAHOO.util.Bezier=new function(){this.getPosition=function(points,t){var n=points.length;var tmp=[];for(var i=0;i0&&!(control[0]instanceof Array)){control=[control];}else{var tmp=[];for(i=0,len=control.length;i0){this.runtimeAttributes[attr]=this.runtimeAttributes[attr].concat(control);} +this.runtimeAttributes[attr][this.runtimeAttributes[attr].length]=end;} +else{superclass.setRuntimeAttribute.call(this,attr);}};var translateValues=function(val,start){var pageXY=Y.Dom.getXY(this.getEl());val=[val[0]-pageXY[0]+start[0],val[1]-pageXY[1]+start[1]];return val;};var isset=function(prop){return(typeof prop!=='undefined');};})();(function(){YAHOO.util.Scroll=function(el,attributes,duration,method){if(el){YAHOO.util.Scroll.superclass.constructor.call(this,el,attributes,duration,method);}};YAHOO.extend(YAHOO.util.Scroll,YAHOO.util.ColorAnim);var Y=YAHOO.util;var superclass=Y.Scroll.superclass;var proto=Y.Scroll.prototype;proto.toString=function(){var el=this.getEl();var id=el.id||el.tagName;return("Scroll "+id);};proto.doMethod=function(attr,start,end){var val=null;if(attr=='scroll'){val=[this.method(this.currentFrame,start[0],end[0]-start[0],this.totalFrames),this.method(this.currentFrame,start[1],end[1]-start[1],this.totalFrames)];}else{val=superclass.doMethod.call(this,attr,start,end);} +return val;};proto.getAttribute=function(attr){var val=null;var el=this.getEl();if(attr=='scroll'){val=[el.scrollLeft,el.scrollTop];}else{val=superclass.getAttribute.call(this,attr);} +return val;};proto.setAttribute=function(attr,val,unit){var el=this.getEl();if(attr=='scroll'){el.scrollLeft=val[0];el.scrollTop=val[1];}else{superclass.setAttribute.call(this,attr,val,unit);}};})();YAHOO.register("animation",YAHOO.util.Anim,{version:"2.2.0",build:"127"}); \ No newline at end of file diff --git a/interface/ispconfig/interface/js/yui/animation/animation.js b/interface/ispconfig/interface/js/yui/animation/animation.js new file mode 100644 index 0000000000000000000000000000000000000000..a70b84183c5208fa59f1a8c8a59dcd03e852e65a --- /dev/null +++ b/interface/ispconfig/interface/js/yui/animation/animation.js @@ -0,0 +1,1358 @@ +/* +Copyright (c) 2007, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.2.0 +*/ +/* +Copyright (c) 2006, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +*/ + +/** + * The animation module provides allows effects to be added to HTMLElements. + * @module animation + * @requires yahoo, event, dom + */ + +/** + * + * Base animation class that provides the interface for building animated effects. + *

Usage: var myAnim = new YAHOO.util.Anim(el, { width: { from: 10, to: 100 } }, 1, YAHOO.util.Easing.easeOut);

+ * @class Anim + * @namespace YAHOO.util + * @requires YAHOO.util.AnimMgr + * @requires YAHOO.util.Easing + * @requires YAHOO.util.Dom + * @requires YAHOO.util.Event + * @requires YAHOO.util.CustomEvent + * @constructor + * @param {String | HTMLElement} el Reference to the element that will be animated + * @param {Object} attributes The attribute(s) to be animated. + * Each attribute is an object with at minimum a "to" or "by" member defined. + * Additional optional members are "from" (defaults to current value), "units" (defaults to "px"). + * All attribute names use camelCase. + * @param {Number} duration (optional, defaults to 1 second) Length of animation (frames or seconds), defaults to time-based + * @param {Function} method (optional, defaults to YAHOO.util.Easing.easeNone) Computes the values that are applied to the attributes per frame (generally a YAHOO.util.Easing method) + */ + +YAHOO.util.Anim = function(el, attributes, duration, method) { + if (el) { + this.init(el, attributes, duration, method); + } +}; + +YAHOO.util.Anim.prototype = { + /** + * Provides a readable name for the Anim instance. + * @method toString + * @return {String} + */ + toString: function() { + var el = this.getEl(); + var id = el.id || el.tagName; + return ("Anim " + id); + }, + + patterns: { // cached for performance + noNegatives: /width|height|opacity|padding/i, // keep at zero or above + offsetAttribute: /^((width|height)|(top|left))$/, // use offsetValue as default + defaultUnit: /width|height|top$|bottom$|left$|right$/i, // use 'px' by default + offsetUnit: /\d+(em|%|en|ex|pt|in|cm|mm|pc)$/i // IE may return these, so convert these to offset + }, + + /** + * Returns the value computed by the animation's "method". + * @method doMethod + * @param {String} attr The name of the attribute. + * @param {Number} start The value this attribute should start from for this animation. + * @param {Number} end The value this attribute should end at for this animation. + * @return {Number} The Value to be applied to the attribute. + */ + doMethod: function(attr, start, end) { + return this.method(this.currentFrame, start, end - start, this.totalFrames); + }, + + /** + * Applies a value to an attribute. + * @method setAttribute + * @param {String} attr The name of the attribute. + * @param {Number} val The value to be applied to the attribute. + * @param {String} unit The unit ('px', '%', etc.) of the value. + */ + setAttribute: function(attr, val, unit) { + if ( this.patterns.noNegatives.test(attr) ) { + val = (val > 0) ? val : 0; + } + + YAHOO.util.Dom.setStyle(this.getEl(), attr, val + unit); + }, + + /** + * Returns current value of the attribute. + * @method getAttribute + * @param {String} attr The name of the attribute. + * @return {Number} val The current value of the attribute. + */ + getAttribute: function(attr) { + var el = this.getEl(); + var val = YAHOO.util.Dom.getStyle(el, attr); + + if (val !== 'auto' && !this.patterns.offsetUnit.test(val)) { + return parseFloat(val); + } + + var a = this.patterns.offsetAttribute.exec(attr) || []; + var pos = !!( a[3] ); // top or left + var box = !!( a[2] ); // width or height + + // use offsets for width/height and abs pos top/left + if ( box || (YAHOO.util.Dom.getStyle(el, 'position') == 'absolute' && pos) ) { + val = el['offset' + a[0].charAt(0).toUpperCase() + a[0].substr(1)]; + } else { // default to zero for other 'auto' + val = 0; + } + + return val; + }, + + /** + * Returns the unit to use when none is supplied. + * @method getDefaultUnit + * @param {attr} attr The name of the attribute. + * @return {String} The default unit to be used. + */ + getDefaultUnit: function(attr) { + if ( this.patterns.defaultUnit.test(attr) ) { + return 'px'; + } + + return ''; + }, + + /** + * Sets the actual values to be used during the animation. Should only be needed for subclass use. + * @method setRuntimeAttribute + * @param {Object} attr The attribute object + * @private + */ + setRuntimeAttribute: function(attr) { + var start; + var end; + var attributes = this.attributes; + + this.runtimeAttributes[attr] = {}; + + var isset = function(prop) { + return (typeof prop !== 'undefined'); + }; + + if ( !isset(attributes[attr]['to']) && !isset(attributes[attr]['by']) ) { + return false; // note return; nothing to animate to + } + + start = ( isset(attributes[attr]['from']) ) ? attributes[attr]['from'] : this.getAttribute(attr); + + // To beats by, per SMIL 2.1 spec + if ( isset(attributes[attr]['to']) ) { + end = attributes[attr]['to']; + } else if ( isset(attributes[attr]['by']) ) { + if (start.constructor == Array) { + end = []; + for (var i = 0, len = start.length; i < len; ++i) { + end[i] = start[i] + attributes[attr]['by'][i]; + } + } else { + end = start + attributes[attr]['by']; + } + } + + this.runtimeAttributes[attr].start = start; + this.runtimeAttributes[attr].end = end; + + // set units if needed + this.runtimeAttributes[attr].unit = ( isset(attributes[attr].unit) ) ? attributes[attr]['unit'] : this.getDefaultUnit(attr); + }, + + /** + * Constructor for Anim instance. + * @method init + * @param {String | HTMLElement} el Reference to the element that will be animated + * @param {Object} attributes The attribute(s) to be animated. + * Each attribute is an object with at minimum a "to" or "by" member defined. + * Additional optional members are "from" (defaults to current value), "units" (defaults to "px"). + * All attribute names use camelCase. + * @param {Number} duration (optional, defaults to 1 second) Length of animation (frames or seconds), defaults to time-based + * @param {Function} method (optional, defaults to YAHOO.util.Easing.easeNone) Computes the values that are applied to the attributes per frame (generally a YAHOO.util.Easing method) + */ + init: function(el, attributes, duration, method) { + /** + * Whether or not the animation is running. + * @property isAnimated + * @private + * @type Boolean + */ + var isAnimated = false; + + /** + * A Date object that is created when the animation begins. + * @property startTime + * @private + * @type Date + */ + var startTime = null; + + /** + * The number of frames this animation was able to execute. + * @property actualFrames + * @private + * @type Int + */ + var actualFrames = 0; + + /** + * The element to be animated. + * @property el + * @private + * @type HTMLElement + */ + el = YAHOO.util.Dom.get(el); + + /** + * The collection of attributes to be animated. + * Each attribute must have at least a "to" or "by" defined in order to animate. + * If "to" is supplied, the animation will end with the attribute at that value. + * If "by" is supplied, the animation will end at that value plus its starting value. + * If both are supplied, "to" is used, and "by" is ignored. + * Optional additional member include "from" (the value the attribute should start animating from, defaults to current value), and "unit" (the units to apply to the values). + * @property attributes + * @type Object + */ + this.attributes = attributes || {}; + + /** + * The length of the animation. Defaults to "1" (second). + * @property duration + * @type Number + */ + this.duration = duration || 1; + + /** + * The method that will provide values to the attribute(s) during the animation. + * Defaults to "YAHOO.util.Easing.easeNone". + * @property method + * @type Function + */ + this.method = method || YAHOO.util.Easing.easeNone; + + /** + * Whether or not the duration should be treated as seconds. + * Defaults to true. + * @property useSeconds + * @type Boolean + */ + this.useSeconds = true; // default to seconds + + /** + * The location of the current animation on the timeline. + * In time-based animations, this is used by AnimMgr to ensure the animation finishes on time. + * @property currentFrame + * @type Int + */ + this.currentFrame = 0; + + /** + * The total number of frames to be executed. + * In time-based animations, this is used by AnimMgr to ensure the animation finishes on time. + * @property totalFrames + * @type Int + */ + this.totalFrames = YAHOO.util.AnimMgr.fps; + + + /** + * Returns a reference to the animated element. + * @method getEl + * @return {HTMLElement} + */ + this.getEl = function() { return el; }; + + /** + * Checks whether the element is currently animated. + * @method isAnimated + * @return {Boolean} current value of isAnimated. + */ + this.isAnimated = function() { + return isAnimated; + }; + + /** + * Returns the animation start time. + * @method getStartTime + * @return {Date} current value of startTime. + */ + this.getStartTime = function() { + return startTime; + }; + + this.runtimeAttributes = {}; + + + + /** + * Starts the animation by registering it with the animation manager. + * @method animate + */ + this.animate = function() { + if ( this.isAnimated() ) { + return false; + } + + this.currentFrame = 0; + + this.totalFrames = ( this.useSeconds ) ? Math.ceil(YAHOO.util.AnimMgr.fps * this.duration) : this.duration; + + YAHOO.util.AnimMgr.registerElement(this); + }; + + /** + * Stops the animation. Normally called by AnimMgr when animation completes. + * @method stop + * @param {Boolean} finish (optional) If true, animation will jump to final frame. + */ + this.stop = function(finish) { + if (finish) { + this.currentFrame = this.totalFrames; + this._onTween.fire(); + } + YAHOO.util.AnimMgr.stop(this); + }; + + var onStart = function() { + this.onStart.fire(); + + this.runtimeAttributes = {}; + for (var attr in this.attributes) { + this.setRuntimeAttribute(attr); + } + + isAnimated = true; + actualFrames = 0; + startTime = new Date(); + }; + + /** + * Feeds the starting and ending values for each animated attribute to doMethod once per frame, then applies the resulting value to the attribute(s). + * @private + */ + + var onTween = function() { + var data = { + duration: new Date() - this.getStartTime(), + currentFrame: this.currentFrame + }; + + data.toString = function() { + return ( + 'duration: ' + data.duration + + ', currentFrame: ' + data.currentFrame + ); + }; + + this.onTween.fire(data); + + var runtimeAttributes = this.runtimeAttributes; + + for (var attr in runtimeAttributes) { + this.setAttribute(attr, this.doMethod(attr, runtimeAttributes[attr].start, runtimeAttributes[attr].end), runtimeAttributes[attr].unit); + } + + actualFrames += 1; + }; + + var onComplete = function() { + var actual_duration = (new Date() - startTime) / 1000 ; + + var data = { + duration: actual_duration, + frames: actualFrames, + fps: actualFrames / actual_duration + }; + + data.toString = function() { + return ( + 'duration: ' + data.duration + + ', frames: ' + data.frames + + ', fps: ' + data.fps + ); + }; + + isAnimated = false; + actualFrames = 0; + this.onComplete.fire(data); + }; + + /** + * Custom event that fires after onStart, useful in subclassing + * @private + */ + this._onStart = new YAHOO.util.CustomEvent('_start', this, true); + + /** + * Custom event that fires when animation begins + * Listen via subscribe method (e.g. myAnim.onStart.subscribe(someFunction) + * @event onStart + */ + this.onStart = new YAHOO.util.CustomEvent('start', this); + + /** + * Custom event that fires between each frame + * Listen via subscribe method (e.g. myAnim.onTween.subscribe(someFunction) + * @event onTween + */ + this.onTween = new YAHOO.util.CustomEvent('tween', this); + + /** + * Custom event that fires after onTween + * @private + */ + this._onTween = new YAHOO.util.CustomEvent('_tween', this, true); + + /** + * Custom event that fires when animation ends + * Listen via subscribe method (e.g. myAnim.onComplete.subscribe(someFunction) + * @event onComplete + */ + this.onComplete = new YAHOO.util.CustomEvent('complete', this); + /** + * Custom event that fires after onComplete + * @private + */ + this._onComplete = new YAHOO.util.CustomEvent('_complete', this, true); + + this._onStart.subscribe(onStart); + this._onTween.subscribe(onTween); + this._onComplete.subscribe(onComplete); + } +}; + +/** + * Handles animation queueing and threading. + * Used by Anim and subclasses. + * @class AnimMgr + * @namespace YAHOO.util + */ +YAHOO.util.AnimMgr = new function() { + /** + * Reference to the animation Interval. + * @property thread + * @private + * @type Int + */ + var thread = null; + + /** + * The current queue of registered animation objects. + * @property queue + * @private + * @type Array + */ + var queue = []; + + /** + * The number of active animations. + * @property tweenCount + * @private + * @type Int + */ + var tweenCount = 0; + + /** + * Base frame rate (frames per second). + * Arbitrarily high for better x-browser calibration (slower browsers drop more frames). + * @property fps + * @type Int + * + */ + this.fps = 1000; + + /** + * Interval delay in milliseconds, defaults to fastest possible. + * @property delay + * @type Int + * + */ + this.delay = 1; + + /** + * Adds an animation instance to the animation queue. + * All animation instances must be registered in order to animate. + * @method registerElement + * @param {object} tween The Anim instance to be be registered + */ + this.registerElement = function(tween) { + queue[queue.length] = tween; + tweenCount += 1; + tween._onStart.fire(); + this.start(); + }; + + /** + * removes an animation instance from the animation queue. + * All animation instances must be registered in order to animate. + * @method unRegister + * @param {object} tween The Anim instance to be be registered + * @param {Int} index The index of the Anim instance + * @private + */ + this.unRegister = function(tween, index) { + tween._onComplete.fire(); + index = index || getIndex(tween); + if (index != -1) { + queue.splice(index, 1); + } + + tweenCount -= 1; + if (tweenCount <= 0) { + this.stop(); + } + }; + + /** + * Starts the animation thread. + * Only one thread can run at a time. + * @method start + */ + this.start = function() { + if (thread === null) { + thread = setInterval(this.run, this.delay); + } + }; + + /** + * Stops the animation thread or a specific animation instance. + * @method stop + * @param {object} tween A specific Anim instance to stop (optional) + * If no instance given, Manager stops thread and all animations. + */ + this.stop = function(tween) { + if (!tween) { + clearInterval(thread); + + for (var i = 0, len = queue.length; i < len; ++i) { + if ( queue[0].isAnimated() ) { + this.unRegister(queue[0], 0); + } + } + + queue = []; + thread = null; + tweenCount = 0; + } + else { + this.unRegister(tween); + } + }; + + /** + * Called per Interval to handle each animation frame. + * @method run + */ + this.run = function() { + for (var i = 0, len = queue.length; i < len; ++i) { + var tween = queue[i]; + if ( !tween || !tween.isAnimated() ) { continue; } + + if (tween.currentFrame < tween.totalFrames || tween.totalFrames === null) + { + tween.currentFrame += 1; + + if (tween.useSeconds) { + correctFrame(tween); + } + tween._onTween.fire(); + } + else { YAHOO.util.AnimMgr.stop(tween, i); } + } + }; + + var getIndex = function(anim) { + for (var i = 0, len = queue.length; i < len; ++i) { + if (queue[i] == anim) { + return i; // note return; + } + } + return -1; + }; + + /** + * On the fly frame correction to keep animation on time. + * @method correctFrame + * @private + * @param {Object} tween The Anim instance being corrected. + */ + var correctFrame = function(tween) { + var frames = tween.totalFrames; + var frame = tween.currentFrame; + var expected = (tween.currentFrame * tween.duration * 1000 / tween.totalFrames); + var elapsed = (new Date() - tween.getStartTime()); + var tweak = 0; + + if (elapsed < tween.duration * 1000) { // check if falling behind + tweak = Math.round((elapsed / expected - 1) * tween.currentFrame); + } else { // went over duration, so jump to end + tweak = frames - (frame + 1); + } + if (tweak > 0 && isFinite(tweak)) { // adjust if needed + if (tween.currentFrame + tweak >= frames) {// dont go past last frame + tweak = frames - (frame + 1); + } + + tween.currentFrame += tweak; + } + }; +}; +/** + * Used to calculate Bezier splines for any number of control points. + * @class Bezier + * @namespace YAHOO.util + * + */ +YAHOO.util.Bezier = new function() { + /** + * Get the current position of the animated element based on t. + * Each point is an array of "x" and "y" values (0 = x, 1 = y) + * At least 2 points are required (start and end). + * First point is start. Last point is end. + * Additional control points are optional. + * @method getPosition + * @param {Array} points An array containing Bezier points + * @param {Number} t A number between 0 and 1 which is the basis for determining current position + * @return {Array} An array containing int x and y member data + */ + this.getPosition = function(points, t) { + var n = points.length; + var tmp = []; + + for (var i = 0; i < n; ++i){ + tmp[i] = [points[i][0], points[i][1]]; // save input + } + + for (var j = 1; j < n; ++j) { + for (i = 0; i < n - j; ++i) { + tmp[i][0] = (1 - t) * tmp[i][0] + t * tmp[parseInt(i + 1, 10)][0]; + tmp[i][1] = (1 - t) * tmp[i][1] + t * tmp[parseInt(i + 1, 10)][1]; + } + } + + return [ tmp[0][0], tmp[0][1] ]; + + }; +}; +(function() { +/** + * Anim subclass for color transitions. + *

Usage: var myAnim = new Y.ColorAnim(el, { backgroundColor: { from: '#FF0000', to: '#FFFFFF' } }, 1, Y.Easing.easeOut); Color values can be specified with either 112233, #112233, + * [255,255,255], or rgb(255,255,255)

+ * @class ColorAnim + * @namespace YAHOO.util + * @requires YAHOO.util.Anim + * @requires YAHOO.util.AnimMgr + * @requires YAHOO.util.Easing + * @requires YAHOO.util.Bezier + * @requires YAHOO.util.Dom + * @requires YAHOO.util.Event + * @constructor + * @extends YAHOO.util.Anim + * @param {HTMLElement | String} el Reference to the element that will be animated + * @param {Object} attributes The attribute(s) to be animated. + * Each attribute is an object with at minimum a "to" or "by" member defined. + * Additional optional members are "from" (defaults to current value), "units" (defaults to "px"). + * All attribute names use camelCase. + * @param {Number} duration (optional, defaults to 1 second) Length of animation (frames or seconds), defaults to time-based + * @param {Function} method (optional, defaults to YAHOO.util.Easing.easeNone) Computes the values that are applied to the attributes per frame (generally a YAHOO.util.Easing method) + */ + YAHOO.util.ColorAnim = function(el, attributes, duration, method) { + YAHOO.util.ColorAnim.superclass.constructor.call(this, el, attributes, duration, method); + }; + + YAHOO.extend(YAHOO.util.ColorAnim, YAHOO.util.Anim); + + // shorthand + var Y = YAHOO.util; + var superclass = Y.ColorAnim.superclass; + var proto = Y.ColorAnim.prototype; + + proto.toString = function() { + var el = this.getEl(); + var id = el.id || el.tagName; + return ("ColorAnim " + id); + }; + + proto.patterns.color = /color$/i; + proto.patterns.rgb = /^rgb\(([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\)$/i; + proto.patterns.hex = /^#?([0-9A-F]{2})([0-9A-F]{2})([0-9A-F]{2})$/i; + proto.patterns.hex3 = /^#?([0-9A-F]{1})([0-9A-F]{1})([0-9A-F]{1})$/i; + proto.patterns.transparent = /^transparent|rgba\(0, 0, 0, 0\)$/; // need rgba for safari + + /** + * Attempts to parse the given string and return a 3-tuple. + * @method parseColor + * @param {String} s The string to parse. + * @return {Array} The 3-tuple of rgb values. + */ + proto.parseColor = function(s) { + if (s.length == 3) { return s; } + + var c = this.patterns.hex.exec(s); + if (c && c.length == 4) { + return [ parseInt(c[1], 16), parseInt(c[2], 16), parseInt(c[3], 16) ]; + } + + c = this.patterns.rgb.exec(s); + if (c && c.length == 4) { + return [ parseInt(c[1], 10), parseInt(c[2], 10), parseInt(c[3], 10) ]; + } + + c = this.patterns.hex3.exec(s); + if (c && c.length == 4) { + return [ parseInt(c[1] + c[1], 16), parseInt(c[2] + c[2], 16), parseInt(c[3] + c[3], 16) ]; + } + + return null; + }; + + proto.getAttribute = function(attr) { + var el = this.getEl(); + if ( this.patterns.color.test(attr) ) { + var val = YAHOO.util.Dom.getStyle(el, attr); + + if (this.patterns.transparent.test(val)) { // bgcolor default + var parent = el.parentNode; // try and get from an ancestor + val = Y.Dom.getStyle(parent, attr); + + while (parent && this.patterns.transparent.test(val)) { + parent = parent.parentNode; + val = Y.Dom.getStyle(parent, attr); + if (parent.tagName.toUpperCase() == 'HTML') { + val = '#fff'; + } + } + } + } else { + val = superclass.getAttribute.call(this, attr); + } + + return val; + }; + + proto.doMethod = function(attr, start, end) { + var val; + + if ( this.patterns.color.test(attr) ) { + val = []; + for (var i = 0, len = start.length; i < len; ++i) { + val[i] = superclass.doMethod.call(this, attr, start[i], end[i]); + } + + val = 'rgb('+Math.floor(val[0])+','+Math.floor(val[1])+','+Math.floor(val[2])+')'; + } + else { + val = superclass.doMethod.call(this, attr, start, end); + } + + return val; + }; + + proto.setRuntimeAttribute = function(attr) { + superclass.setRuntimeAttribute.call(this, attr); + + if ( this.patterns.color.test(attr) ) { + var attributes = this.attributes; + var start = this.parseColor(this.runtimeAttributes[attr].start); + var end = this.parseColor(this.runtimeAttributes[attr].end); + // fix colors if going "by" + if ( typeof attributes[attr]['to'] === 'undefined' && typeof attributes[attr]['by'] !== 'undefined' ) { + end = this.parseColor(attributes[attr].by); + + for (var i = 0, len = start.length; i < len; ++i) { + end[i] = start[i] + end[i]; + } + } + + this.runtimeAttributes[attr].start = start; + this.runtimeAttributes[attr].end = end; + } + }; +})(); +/* +TERMS OF USE - EASING EQUATIONS +Open source under the BSD License. +Copyright 2001 Robert Penner All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + * Neither the name of the author nor the names of contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/** + * Singleton that determines how an animation proceeds from start to end. + * @class Easing + * @namespace YAHOO.util +*/ + +YAHOO.util.Easing = { + + /** + * Uniform speed between points. + * @method easeNone + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + easeNone: function (t, b, c, d) { + return c*t/d + b; + }, + + /** + * Begins slowly and accelerates towards end. (quadratic) + * @method easeIn + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + easeIn: function (t, b, c, d) { + return c*(t/=d)*t + b; + }, + + /** + * Begins quickly and decelerates towards end. (quadratic) + * @method easeOut + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + easeOut: function (t, b, c, d) { + return -c *(t/=d)*(t-2) + b; + }, + + /** + * Begins slowly and decelerates towards end. (quadratic) + * @method easeBoth + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + easeBoth: function (t, b, c, d) { + if ((t/=d/2) < 1) { + return c/2*t*t + b; + } + + return -c/2 * ((--t)*(t-2) - 1) + b; + }, + + /** + * Begins slowly and accelerates towards end. (quartic) + * @method easeInStrong + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + easeInStrong: function (t, b, c, d) { + return c*(t/=d)*t*t*t + b; + }, + + /** + * Begins quickly and decelerates towards end. (quartic) + * @method easeOutStrong + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + easeOutStrong: function (t, b, c, d) { + return -c * ((t=t/d-1)*t*t*t - 1) + b; + }, + + /** + * Begins slowly and decelerates towards end. (quartic) + * @method easeBothStrong + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + easeBothStrong: function (t, b, c, d) { + if ((t/=d/2) < 1) { + return c/2*t*t*t*t + b; + } + + return -c/2 * ((t-=2)*t*t*t - 2) + b; + }, + + /** + * Snap in elastic effect. + * @method elasticIn + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @param {Number} a Amplitude (optional) + * @param {Number} p Period (optional) + * @return {Number} The computed value for the current animation frame + */ + + elasticIn: function (t, b, c, d, a, p) { + if (t == 0) { + return b; + } + if ( (t /= d) == 1 ) { + return b+c; + } + if (!p) { + p=d*.3; + } + + if (!a || a < Math.abs(c)) { + a = c; + var s = p/4; + } + else { + var s = p/(2*Math.PI) * Math.asin (c/a); + } + + return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b; + }, + + /** + * Snap out elastic effect. + * @method elasticOut + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @param {Number} a Amplitude (optional) + * @param {Number} p Period (optional) + * @return {Number} The computed value for the current animation frame + */ + elasticOut: function (t, b, c, d, a, p) { + if (t == 0) { + return b; + } + if ( (t /= d) == 1 ) { + return b+c; + } + if (!p) { + p=d*.3; + } + + if (!a || a < Math.abs(c)) { + a = c; + var s = p / 4; + } + else { + var s = p/(2*Math.PI) * Math.asin (c/a); + } + + return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b; + }, + + /** + * Snap both elastic effect. + * @method elasticBoth + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @param {Number} a Amplitude (optional) + * @param {Number} p Period (optional) + * @return {Number} The computed value for the current animation frame + */ + elasticBoth: function (t, b, c, d, a, p) { + if (t == 0) { + return b; + } + + if ( (t /= d/2) == 2 ) { + return b+c; + } + + if (!p) { + p = d*(.3*1.5); + } + + if ( !a || a < Math.abs(c) ) { + a = c; + var s = p/4; + } + else { + var s = p/(2*Math.PI) * Math.asin (c/a); + } + + if (t < 1) { + return -.5*(a*Math.pow(2,10*(t-=1)) * + Math.sin( (t*d-s)*(2*Math.PI)/p )) + b; + } + return a*Math.pow(2,-10*(t-=1)) * + Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b; + }, + + + /** + * Backtracks slightly, then reverses direction and moves to end. + * @method backIn + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @param {Number} s Overshoot (optional) + * @return {Number} The computed value for the current animation frame + */ + backIn: function (t, b, c, d, s) { + if (typeof s == 'undefined') { + s = 1.70158; + } + return c*(t/=d)*t*((s+1)*t - s) + b; + }, + + /** + * Overshoots end, then reverses and comes back to end. + * @method backOut + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @param {Number} s Overshoot (optional) + * @return {Number} The computed value for the current animation frame + */ + backOut: function (t, b, c, d, s) { + if (typeof s == 'undefined') { + s = 1.70158; + } + return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b; + }, + + /** + * Backtracks slightly, then reverses direction, overshoots end, + * then reverses and comes back to end. + * @method backBoth + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @param {Number} s Overshoot (optional) + * @return {Number} The computed value for the current animation frame + */ + backBoth: function (t, b, c, d, s) { + if (typeof s == 'undefined') { + s = 1.70158; + } + + if ((t /= d/2 ) < 1) { + return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b; + } + return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b; + }, + + /** + * Bounce off of start. + * @method bounceIn + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + bounceIn: function (t, b, c, d) { + return c - YAHOO.util.Easing.bounceOut(d-t, 0, c, d) + b; + }, + + /** + * Bounces off end. + * @method bounceOut + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + bounceOut: function (t, b, c, d) { + if ((t/=d) < (1/2.75)) { + return c*(7.5625*t*t) + b; + } else if (t < (2/2.75)) { + return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b; + } else if (t < (2.5/2.75)) { + return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b; + } + return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b; + }, + + /** + * Bounces off start and end. + * @method bounceBoth + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + bounceBoth: function (t, b, c, d) { + if (t < d/2) { + return YAHOO.util.Easing.bounceIn(t*2, 0, c, d) * .5 + b; + } + return YAHOO.util.Easing.bounceOut(t*2-d, 0, c, d) * .5 + c*.5 + b; + } +}; + +(function() { +/** + * Anim subclass for moving elements along a path defined by the "points" + * member of "attributes". All "points" are arrays with x, y coordinates. + *

Usage: var myAnim = new YAHOO.util.Motion(el, { points: { to: [800, 800] } }, 1, YAHOO.util.Easing.easeOut);

+ * @class Motion + * @namespace YAHOO.util + * @requires YAHOO.util.Anim + * @requires YAHOO.util.AnimMgr + * @requires YAHOO.util.Easing + * @requires YAHOO.util.Bezier + * @requires YAHOO.util.Dom + * @requires YAHOO.util.Event + * @requires YAHOO.util.CustomEvent + * @constructor + * @extends YAHOO.util.Anim + * @param {String | HTMLElement} el Reference to the element that will be animated + * @param {Object} attributes The attribute(s) to be animated. + * Each attribute is an object with at minimum a "to" or "by" member defined. + * Additional optional members are "from" (defaults to current value), "units" (defaults to "px"). + * All attribute names use camelCase. + * @param {Number} duration (optional, defaults to 1 second) Length of animation (frames or seconds), defaults to time-based + * @param {Function} method (optional, defaults to YAHOO.util.Easing.easeNone) Computes the values that are applied to the attributes per frame (generally a YAHOO.util.Easing method) + */ + YAHOO.util.Motion = function(el, attributes, duration, method) { + if (el) { // dont break existing subclasses not using YAHOO.extend + YAHOO.util.Motion.superclass.constructor.call(this, el, attributes, duration, method); + } + }; + + YAHOO.extend(YAHOO.util.Motion, YAHOO.util.ColorAnim); + + // shorthand + var Y = YAHOO.util; + var superclass = Y.Motion.superclass; + var proto = Y.Motion.prototype; + + proto.toString = function() { + var el = this.getEl(); + var id = el.id || el.tagName; + return ("Motion " + id); + }; + + proto.patterns.points = /^points$/i; + + proto.setAttribute = function(attr, val, unit) { + if ( this.patterns.points.test(attr) ) { + unit = unit || 'px'; + superclass.setAttribute.call(this, 'left', val[0], unit); + superclass.setAttribute.call(this, 'top', val[1], unit); + } else { + superclass.setAttribute.call(this, attr, val, unit); + } + }; + + proto.getAttribute = function(attr) { + if ( this.patterns.points.test(attr) ) { + var val = [ + superclass.getAttribute.call(this, 'left'), + superclass.getAttribute.call(this, 'top') + ]; + } else { + val = superclass.getAttribute.call(this, attr); + } + + return val; + }; + + proto.doMethod = function(attr, start, end) { + var val = null; + + if ( this.patterns.points.test(attr) ) { + var t = this.method(this.currentFrame, 0, 100, this.totalFrames) / 100; + val = Y.Bezier.getPosition(this.runtimeAttributes[attr], t); + } else { + val = superclass.doMethod.call(this, attr, start, end); + } + return val; + }; + + proto.setRuntimeAttribute = function(attr) { + if ( this.patterns.points.test(attr) ) { + var el = this.getEl(); + var attributes = this.attributes; + var start; + var control = attributes['points']['control'] || []; + var end; + var i, len; + + if (control.length > 0 && !(control[0] instanceof Array) ) { // could be single point or array of points + control = [control]; + } else { // break reference to attributes.points.control + var tmp = []; + for (i = 0, len = control.length; i< len; ++i) { + tmp[i] = control[i]; + } + control = tmp; + } + + if (Y.Dom.getStyle(el, 'position') == 'static') { // default to relative + Y.Dom.setStyle(el, 'position', 'relative'); + } + + if ( isset(attributes['points']['from']) ) { + Y.Dom.setXY(el, attributes['points']['from']); // set position to from point + } + else { Y.Dom.setXY( el, Y.Dom.getXY(el) ); } // set it to current position + + start = this.getAttribute('points'); // get actual top & left + + // TO beats BY, per SMIL 2.1 spec + if ( isset(attributes['points']['to']) ) { + end = translateValues.call(this, attributes['points']['to'], start); + + var pageXY = Y.Dom.getXY(this.getEl()); + for (i = 0, len = control.length; i < len; ++i) { + control[i] = translateValues.call(this, control[i], start); + } + + + } else if ( isset(attributes['points']['by']) ) { + end = [ start[0] + attributes['points']['by'][0], start[1] + attributes['points']['by'][1] ]; + + for (i = 0, len = control.length; i < len; ++i) { + control[i] = [ start[0] + control[i][0], start[1] + control[i][1] ]; + } + } + + this.runtimeAttributes[attr] = [start]; + + if (control.length > 0) { + this.runtimeAttributes[attr] = this.runtimeAttributes[attr].concat(control); + } + + this.runtimeAttributes[attr][this.runtimeAttributes[attr].length] = end; + } + else { + superclass.setRuntimeAttribute.call(this, attr); + } + }; + + var translateValues = function(val, start) { + var pageXY = Y.Dom.getXY(this.getEl()); + val = [ val[0] - pageXY[0] + start[0], val[1] - pageXY[1] + start[1] ]; + + return val; + }; + + var isset = function(prop) { + return (typeof prop !== 'undefined'); + }; +})(); +(function() { +/** + * Anim subclass for scrolling elements to a position defined by the "scroll" + * member of "attributes". All "scroll" members are arrays with x, y scroll positions. + *

Usage: var myAnim = new YAHOO.util.Scroll(el, { scroll: { to: [0, 800] } }, 1, YAHOO.util.Easing.easeOut);

+ * @class Scroll + * @namespace YAHOO.util + * @requires YAHOO.util.Anim + * @requires YAHOO.util.AnimMgr + * @requires YAHOO.util.Easing + * @requires YAHOO.util.Bezier + * @requires YAHOO.util.Dom + * @requires YAHOO.util.Event + * @requires YAHOO.util.CustomEvent + * @extends YAHOO.util.Anim + * @constructor + * @param {String or HTMLElement} el Reference to the element that will be animated + * @param {Object} attributes The attribute(s) to be animated. + * Each attribute is an object with at minimum a "to" or "by" member defined. + * Additional optional members are "from" (defaults to current value), "units" (defaults to "px"). + * All attribute names use camelCase. + * @param {Number} duration (optional, defaults to 1 second) Length of animation (frames or seconds), defaults to time-based + * @param {Function} method (optional, defaults to YAHOO.util.Easing.easeNone) Computes the values that are applied to the attributes per frame (generally a YAHOO.util.Easing method) + */ + YAHOO.util.Scroll = function(el, attributes, duration, method) { + if (el) { // dont break existing subclasses not using YAHOO.extend + YAHOO.util.Scroll.superclass.constructor.call(this, el, attributes, duration, method); + } + }; + + YAHOO.extend(YAHOO.util.Scroll, YAHOO.util.ColorAnim); + + // shorthand + var Y = YAHOO.util; + var superclass = Y.Scroll.superclass; + var proto = Y.Scroll.prototype; + + proto.toString = function() { + var el = this.getEl(); + var id = el.id || el.tagName; + return ("Scroll " + id); + }; + + proto.doMethod = function(attr, start, end) { + var val = null; + + if (attr == 'scroll') { + val = [ + this.method(this.currentFrame, start[0], end[0] - start[0], this.totalFrames), + this.method(this.currentFrame, start[1], end[1] - start[1], this.totalFrames) + ]; + + } else { + val = superclass.doMethod.call(this, attr, start, end); + } + return val; + }; + + proto.getAttribute = function(attr) { + var val = null; + var el = this.getEl(); + + if (attr == 'scroll') { + val = [ el.scrollLeft, el.scrollTop ]; + } else { + val = superclass.getAttribute.call(this, attr); + } + + return val; + }; + + proto.setAttribute = function(attr, val, unit) { + var el = this.getEl(); + + if (attr == 'scroll') { + el.scrollLeft = val[0]; + el.scrollTop = val[1]; + } else { + superclass.setAttribute.call(this, attr, val, unit); + } + }; +})(); +YAHOO.register("animation", YAHOO.util.Anim, {version: "2.2.0", build: "127"}); diff --git a/interface/ispconfig/interface/js/yui/autocomplete/README b/interface/ispconfig/interface/js/yui/autocomplete/README new file mode 100644 index 0000000000000000000000000000000000000000..6ab63439b62ba56f55e4b5f8699f34e876234380 --- /dev/null +++ b/interface/ispconfig/interface/js/yui/autocomplete/README @@ -0,0 +1,77 @@ +AutoComplete Release Notes + +*** version 2.2.0 *** + +* No changes. + + + +*** version 0.12.2 *** + +* No changes. + + + +*** version 0.12.1 *** + +* No longer trigger typeAhead feature when user is backspacing on input text. + + + +*** version 0.12.0 *** + +* The following constants must be defined as static class properties and are no longer +available as instance properties: + +YAHOO.widget.DataSource.ERROR_DATANULL +YAHOO.widget.DataSource.ERROR_DATAPARSE +YAHOO.widget.DS_XHR.TYPE_JSON +YAHOO.widget.DS_XHR.TYPE_XML +YAHOO.widget.DS_XHR.TYPE_FLAT +YAHOO.widget.DS_XHR.ERROR_DATAXHR + +* The property minQueryLength now supports zero and negative number values for +DS_JSFunction and DS_XHR objects, to enable null or empty string queries and to disable +AutoComplete functionality altogether, respectively. + +* Enabling the alwaysShowContainer feature will no longer send containerExpandEvent or +containerCollapseEvent. + + + +**** version 0.11.3 *** + +* The iFrameSrc property has been deprecated. Implementers no longer need to +specify an https URL to avoid IE security warnings when working with sites over +SSL. + + + +*** version 0.11.0 *** + +* The method getListIds() has been deprecated for getListItems(), which returns +an array of DOM references. + +* All classnames have been prefixed with "yui-ac-". + +* Container elements should no longer have CSS property "display" set to "none". + +* The useIFrame property can now be set after instantiation. + +* On some browsers, the unmatchedItemSelectEvent may not be fired properly when +delimiter characters are defined. + +* On some browsers, defining delimiter characters while enabling forceSelection +may result in unexpected behavior. + + + +*** version 0.10.0 *** + +* Initial release + +* In order to enable the useIFrame property, it should be set in the +constructor. + +* On some browsers, defining delimiter characters while enabling forceSelection +may result in unexpected behavior. diff --git a/interface/ispconfig/interface/js/yui/autocomplete/autocomplete-debug.js b/interface/ispconfig/interface/js/yui/autocomplete/autocomplete-debug.js new file mode 100644 index 0000000000000000000000000000000000000000..70c0b94eab3d8780df58a641a897fa7d51b990d4 --- /dev/null +++ b/interface/ispconfig/interface/js/yui/autocomplete/autocomplete-debug.js @@ -0,0 +1,3100 @@ +/* +Copyright (c) 2007, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.2.0 +*/ + /** + * The AutoComplete control provides the front-end logic for text-entry suggestion and + * completion functionality. + * + * @module autocomplete + * @requires yahoo, dom, event, datasource + * @optional animation, connection + * @namespace YAHOO.widget + * @title AutoComplete Widget + */ + +/****************************************************************************/ +/****************************************************************************/ +/****************************************************************************/ + +/** + * The AutoComplete class provides the customizable functionality of a plug-and-play DHTML + * auto completion widget. Some key features: + *
    + *
  • Navigate with up/down arrow keys and/or mouse to pick a selection
  • + *
  • The drop down container can "roll down" or "fly out" via configurable + * animation
  • + *
  • UI look-and-feel customizable through CSS, including container + * attributes, borders, position, fonts, etc
  • + *
+ * + * @class AutoComplete + * @constructor + * @param elInput {HTMLElement} DOM element reference of an input field. + * @param elInput {String} String ID of an input field. + * @param elContainer {HTMLElement} DOM element reference of an existing DIV. + * @param elContainer {String} String ID of an existing DIV. + * @param oDataSource {YAHOO.widget.DataSource} DataSource instance. + * @param oConfigs {Object} (optional) Object literal of configuration params. + */ +YAHOO.widget.AutoComplete = function(elInput,elContainer,oDataSource,oConfigs) { + if(elInput && elContainer && oDataSource) { + // Validate DataSource + if (oDataSource && (oDataSource instanceof YAHOO.widget.DataSource)) { + this.dataSource = oDataSource; + } + else { + YAHOO.log("Could not instantiate AutoComplete due to an invalid DataSource", "error", this.toString()); + return; + } + + // Validate input element + if(YAHOO.util.Dom.inDocument(elInput)) { + if(typeof elInput == "string") { + this._sName = "instance" + YAHOO.widget.AutoComplete._nIndex + " " + elInput; + this._oTextbox = document.getElementById(elInput); + } + else { + this._sName = (elInput.id) ? + "instance" + YAHOO.widget.AutoComplete._nIndex + " " + elInput.id: + "instance" + YAHOO.widget.AutoComplete._nIndex; + this._oTextbox = elInput; + } + } + else { + YAHOO.log("Could not instantiate AutoComplete due to an invalid input element", "error", this.toString()); + return; + } + + // Validate container element + if(YAHOO.util.Dom.inDocument(elContainer)) { + if(typeof elContainer == "string") { + this._oContainer = document.getElementById(elContainer); + } + else { + this._oContainer = elContainer; + } + if(this._oContainer.style.display == "none") { + YAHOO.log("The container may not display properly if display is set to \"none\" in CSS", "warn", this.toString()); + } + } + else { + YAHOO.log("Could not instantiate AutoComplete due to an invalid container element", "error", this.toString()); + return; + } + + // Set any config params passed in to override defaults + if (typeof oConfigs == "object") { + for(var sConfig in oConfigs) { + if (sConfig) { + this[sConfig] = oConfigs[sConfig]; + } + } + } + + // Initialization sequence + this._initContainer(); + this._initProps(); + this._initList(); + this._initContainerHelpers(); + + // Set up events + var oSelf = this; + var oTextbox = this._oTextbox; + // Events are actually for the content module within the container + var oContent = this._oContainer._oContent; + + // Dom events + YAHOO.util.Event.addListener(oTextbox,"keyup",oSelf._onTextboxKeyUp,oSelf); + YAHOO.util.Event.addListener(oTextbox,"keydown",oSelf._onTextboxKeyDown,oSelf); + YAHOO.util.Event.addListener(oTextbox,"focus",oSelf._onTextboxFocus,oSelf); + YAHOO.util.Event.addListener(oTextbox,"blur",oSelf._onTextboxBlur,oSelf); + YAHOO.util.Event.addListener(oContent,"mouseover",oSelf._onContainerMouseover,oSelf); + YAHOO.util.Event.addListener(oContent,"mouseout",oSelf._onContainerMouseout,oSelf); + YAHOO.util.Event.addListener(oContent,"scroll",oSelf._onContainerScroll,oSelf); + YAHOO.util.Event.addListener(oContent,"resize",oSelf._onContainerResize,oSelf); + if(oTextbox.form) { + YAHOO.util.Event.addListener(oTextbox.form,"submit",oSelf._onFormSubmit,oSelf); + } + YAHOO.util.Event.addListener(oTextbox,"keypress",oSelf._onTextboxKeyPress,oSelf); + + // Custom events + this.textboxFocusEvent = new YAHOO.util.CustomEvent("textboxFocus", this); + this.textboxKeyEvent = new YAHOO.util.CustomEvent("textboxKey", this); + this.dataRequestEvent = new YAHOO.util.CustomEvent("dataRequest", this); + this.dataReturnEvent = new YAHOO.util.CustomEvent("dataReturn", this); + this.dataErrorEvent = new YAHOO.util.CustomEvent("dataError", this); + this.containerExpandEvent = new YAHOO.util.CustomEvent("containerExpand", this); + this.typeAheadEvent = new YAHOO.util.CustomEvent("typeAhead", this); + this.itemMouseOverEvent = new YAHOO.util.CustomEvent("itemMouseOver", this); + this.itemMouseOutEvent = new YAHOO.util.CustomEvent("itemMouseOut", this); + this.itemArrowToEvent = new YAHOO.util.CustomEvent("itemArrowTo", this); + this.itemArrowFromEvent = new YAHOO.util.CustomEvent("itemArrowFrom", this); + this.itemSelectEvent = new YAHOO.util.CustomEvent("itemSelect", this); + this.unmatchedItemSelectEvent = new YAHOO.util.CustomEvent("unmatchedItemSelect", this); + this.selectionEnforceEvent = new YAHOO.util.CustomEvent("selectionEnforce", this); + this.containerCollapseEvent = new YAHOO.util.CustomEvent("containerCollapse", this); + this.textboxBlurEvent = new YAHOO.util.CustomEvent("textboxBlur", this); + + // Finish up + oTextbox.setAttribute("autocomplete","off"); + YAHOO.widget.AutoComplete._nIndex++; + YAHOO.log("AutoComplete initialized","info",this.toString()); + } + // Required arguments were not found + else { + YAHOO.log("Could not instantiate AutoComplete due invalid arguments", "error", this.toString()); + } +}; + +///////////////////////////////////////////////////////////////////////////// +// +// Public member variables +// +///////////////////////////////////////////////////////////////////////////// + +/** + * The DataSource object that encapsulates the data used for auto completion. + * This object should be an inherited object from YAHOO.widget.DataSource. + * + * @property dataSource + * @type YAHOO.widget.DataSource + */ +YAHOO.widget.AutoComplete.prototype.dataSource = null; + +/** + * Number of characters that must be entered before querying for results. A negative value + * effectively turns off the widget. A value of 0 allows queries of null or empty string + * values. + * + * @property minQueryLength + * @type Number + * @default 1 + */ +YAHOO.widget.AutoComplete.prototype.minQueryLength = 1; + +/** + * Maximum number of results to display in results container. + * + * @property maxResultsDisplayed + * @type Number + * @default 10 + */ +YAHOO.widget.AutoComplete.prototype.maxResultsDisplayed = 10; + +/** + * Number of seconds to delay before submitting a query request. If a query + * request is received before a previous one has completed its delay, the + * previous request is cancelled and the new request is set to the delay. + * + * @property queryDelay + * @type Number + * @default 0.5 + */ +YAHOO.widget.AutoComplete.prototype.queryDelay = 0.5; + +/** + * Class name of a highlighted item within results container. + * + * @property highlightClassName + * @type String + * @default "yui-ac-highlight" + */ +YAHOO.widget.AutoComplete.prototype.highlightClassName = "yui-ac-highlight"; + +/** + * Class name of a pre-highlighted item within results container. + * + * @property prehighlightClassName + * @type String + */ +YAHOO.widget.AutoComplete.prototype.prehighlightClassName = null; + +/** + * Query delimiter. A single character separator for multiple delimited + * selections. Multiple delimiter characteres may be defined as an array of + * strings. A null value or empty string indicates that query results cannot + * be delimited. This feature is not recommended if you need forceSelection to + * be true. + * + * @property delimChar + * @type String | String[] + */ +YAHOO.widget.AutoComplete.prototype.delimChar = null; + +/** + * Whether or not the first item in results container should be automatically highlighted + * on expand. + * + * @property autoHighlight + * @type Boolean + * @default true + */ +YAHOO.widget.AutoComplete.prototype.autoHighlight = true; + +/** + * Whether or not the input field should be automatically updated + * with the first query result as the user types, auto-selecting the substring + * that the user has not typed. + * + * @property typeAhead + * @type Boolean + * @default false + */ +YAHOO.widget.AutoComplete.prototype.typeAhead = false; + +/** + * Whether or not to animate the expansion/collapse of the results container in the + * horizontal direction. + * + * @property animHoriz + * @type Boolean + * @default false + */ +YAHOO.widget.AutoComplete.prototype.animHoriz = false; + +/** + * Whether or not to animate the expansion/collapse of the results container in the + * vertical direction. + * + * @property animVert + * @type Boolean + * @default true + */ +YAHOO.widget.AutoComplete.prototype.animVert = true; + +/** + * Speed of container expand/collapse animation, in seconds.. + * + * @property animSpeed + * @type Number + * @default 0.3 + */ +YAHOO.widget.AutoComplete.prototype.animSpeed = 0.3; + +/** + * Whether or not to force the user's selection to match one of the query + * results. Enabling this feature essentially transforms the input field into a + * <select> field. This feature is not recommended with delimiter character(s) + * defined. + * + * @property forceSelection + * @type Boolean + * @default false + */ +YAHOO.widget.AutoComplete.prototype.forceSelection = false; + +/** + * Whether or not to allow browsers to cache user-typed input in the input + * field. Disabling this feature will prevent the widget from setting the + * autocomplete="off" on the input field. When autocomplete="off" + * and users click the back button after form submission, user-typed input can + * be prefilled by the browser from its cache. This caching of user input may + * not be desired for sensitive data, such as credit card numbers, in which + * case, implementers should consider setting allowBrowserAutocomplete to false. + * + * @property allowBrowserAutocomplete + * @type Boolean + * @default true + */ +YAHOO.widget.AutoComplete.prototype.allowBrowserAutocomplete = true; + +/** + * Whether or not the results container should always be displayed. + * Enabling this feature displays the container when the widget is instantiated + * and prevents the toggling of the container to a collapsed state. + * + * @property alwaysShowContainer + * @type Boolean + * @default false + */ +YAHOO.widget.AutoComplete.prototype.alwaysShowContainer = false; + +/** + * Whether or not to use an iFrame to layer over Windows form elements in + * IE. Set to true only when the results container will be on top of a + * <select> field in IE and thus exposed to the IE z-index bug (i.e., + * 5.5 < IE < 7). + * + * @property useIFrame + * @type Boolean + * @default false + */ +YAHOO.widget.AutoComplete.prototype.useIFrame = false; + +/** + * Whether or not the results container should have a shadow. + * + * @property useShadow + * @type Boolean + * @default false + */ +YAHOO.widget.AutoComplete.prototype.useShadow = false; + +///////////////////////////////////////////////////////////////////////////// +// +// Public methods +// +///////////////////////////////////////////////////////////////////////////// + + /** + * Public accessor to the unique name of the AutoComplete instance. + * + * @method toString + * @return {String} Unique name of the AutoComplete instance. + */ +YAHOO.widget.AutoComplete.prototype.toString = function() { + return "AutoComplete " + this._sName; +}; + + /** + * Returns true if container is in an expanded state, false otherwise. + * + * @method isContainerOpen + * @return {Boolean} Returns true if container is in an expanded state, false otherwise. + */ +YAHOO.widget.AutoComplete.prototype.isContainerOpen = function() { + return this._bContainerOpen; +}; + +/** + * Public accessor to the internal array of DOM <li> elements that + * display query results within the results container. + * + * @method getListItems + * @return {HTMLElement[]} Array of <li> elements within the results container. + */ +YAHOO.widget.AutoComplete.prototype.getListItems = function() { + return this._aListItems; +}; + +/** + * Public accessor to the data held in an <li> element of the + * results container. + * + * @method getListItemData + * @return {Object | Object[]} Object or array of result data or null + */ +YAHOO.widget.AutoComplete.prototype.getListItemData = function(oListItem) { + if(oListItem._oResultData) { + return oListItem._oResultData; + } + else { + return false; + } +}; + +/** + * Sets HTML markup for the results container header. This markup will be + * inserted within a <div> tag with a class of "yui-ac-hd". + * + * @method setHeader + * @param sHeader {String} HTML markup for results container header. + */ +YAHOO.widget.AutoComplete.prototype.setHeader = function(sHeader) { + if(sHeader) { + if(this._oContainer._oContent._oHeader) { + this._oContainer._oContent._oHeader.innerHTML = sHeader; + this._oContainer._oContent._oHeader.style.display = "block"; + } + } + else { + this._oContainer._oContent._oHeader.innerHTML = ""; + this._oContainer._oContent._oHeader.style.display = "none"; + } +}; + +/** + * Sets HTML markup for the results container footer. This markup will be + * inserted within a <div> tag with a class of "yui-ac-ft". + * + * @method setFooter + * @param sFooter {String} HTML markup for results container footer. + */ +YAHOO.widget.AutoComplete.prototype.setFooter = function(sFooter) { + if(sFooter) { + if(this._oContainer._oContent._oFooter) { + this._oContainer._oContent._oFooter.innerHTML = sFooter; + this._oContainer._oContent._oFooter.style.display = "block"; + } + } + else { + this._oContainer._oContent._oFooter.innerHTML = ""; + this._oContainer._oContent._oFooter.style.display = "none"; + } +}; + +/** + * Sets HTML markup for the results container body. This markup will be + * inserted within a <div> tag with a class of "yui-ac-bd". + * + * @method setBody + * @param sBody {String} HTML markup for results container body. + */ +YAHOO.widget.AutoComplete.prototype.setBody = function(sBody) { + if(sBody) { + if(this._oContainer._oContent._oBody) { + this._oContainer._oContent._oBody.innerHTML = sBody; + this._oContainer._oContent._oBody.style.display = "block"; + this._oContainer._oContent.style.display = "block"; + } + } + else { + this._oContainer._oContent._oBody.innerHTML = ""; + this._oContainer._oContent.style.display = "none"; + } + this._maxResultsDisplayed = 0; +}; + +/** + * Overridable method that converts a result item object into HTML markup + * for display. Return data values are accessible via the oResultItem object, + * and the key return value will always be oResultItem[0]. Markup will be + * displayed within <li> element tags in the container. + * + * @method formatResult + * @param oResultItem {Object} Result item representing one query result. Data is held in an array. + * @param sQuery {String} The current query string. + * @return {String} HTML markup of formatted result data. + */ +YAHOO.widget.AutoComplete.prototype.formatResult = function(oResultItem, sQuery) { + var sResult = oResultItem[0]; + if(sResult) { + return sResult; + } + else { + return ""; + } +}; + +/** + * Overridable method called before container expands allows implementers to access data + * and DOM elements. + * + * @method doBeforeExpandContainer + * @return {Boolean} Return true to continue expanding container, false to cancel the expand. + */ +YAHOO.widget.AutoComplete.prototype.doBeforeExpandContainer = function(oResultItem, sQuery) { + return true; +}; + +/** + * Makes query request to the DataSource. + * + * @method sendQuery + * @param sQuery {String} Query string. + */ +YAHOO.widget.AutoComplete.prototype.sendQuery = function(sQuery) { + this._sendQuery(sQuery); +}; + +///////////////////////////////////////////////////////////////////////////// +// +// Public events +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Fired when the input field receives focus. + * + * @event textboxFocusEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + */ +YAHOO.widget.AutoComplete.prototype.textboxFocusEvent = null; + +/** + * Fired when the input field receives key input. + * + * @event textboxKeyEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param nKeycode {Number} The keycode number. + */ +YAHOO.widget.AutoComplete.prototype.textboxKeyEvent = null; + +/** + * Fired when the AutoComplete instance makes a query to the DataSource. + * + * @event dataRequestEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param sQuery {String} The query string. + */ +YAHOO.widget.AutoComplete.prototype.dataRequestEvent = null; + +/** + * Fired when the AutoComplete instance receives query results from the data + * source. + * + * @event dataReturnEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param sQuery {String} The query string. + * @param aResults {Object[]} Results array. + */ +YAHOO.widget.AutoComplete.prototype.dataReturnEvent = null; + +/** + * Fired when the AutoComplete instance does not receive query results from the + * DataSource due to an error. + * + * @event dataErrorEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param sQuery {String} The query string. + */ +YAHOO.widget.AutoComplete.prototype.dataErrorEvent = null; + +/** + * Fired when the results container is expanded. + * + * @event containerExpandEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + */ +YAHOO.widget.AutoComplete.prototype.containerExpandEvent = null; + +/** + * Fired when the input field has been prefilled by the type-ahead + * feature. + * + * @event typeAheadEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param sQuery {String} The query string. + * @param sPrefill {String} The prefill string. + */ +YAHOO.widget.AutoComplete.prototype.typeAheadEvent = null; + +/** + * Fired when result item has been moused over. + * + * @event itemMouseOverEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param elItem {HTMLElement} The <li> element item moused to. + */ +YAHOO.widget.AutoComplete.prototype.itemMouseOverEvent = null; + +/** + * Fired when result item has been moused out. + * + * @event itemMouseOutEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param elItem {HTMLElement} The <li> element item moused from. + */ +YAHOO.widget.AutoComplete.prototype.itemMouseOutEvent = null; + +/** + * Fired when result item has been arrowed to. + * + * @event itemArrowToEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param elItem {HTMLElement} The <li> element item arrowed to. + */ +YAHOO.widget.AutoComplete.prototype.itemArrowToEvent = null; + +/** + * Fired when result item has been arrowed away from. + * + * @event itemArrowFromEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param elItem {HTMLElement} The <li> element item arrowed from. + */ +YAHOO.widget.AutoComplete.prototype.itemArrowFromEvent = null; + +/** + * Fired when an item is selected via mouse click, ENTER key, or TAB key. + * + * @event itemSelectEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param elItem {HTMLElement} The selected <li> element item. + * @param oData {Object} The data returned for the item, either as an object, + * or mapped from the schema into an array. + */ +YAHOO.widget.AutoComplete.prototype.itemSelectEvent = null; + +/** + * Fired when a user selection does not match any of the displayed result items. + * Note that this event may not behave as expected when delimiter characters + * have been defined. + * + * @event unmatchedItemSelectEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param sQuery {String} The user-typed query string. + */ +YAHOO.widget.AutoComplete.prototype.unmatchedItemSelectEvent = null; + +/** + * Fired if forceSelection is enabled and the user's input has been cleared + * because it did not match one of the returned query results. + * + * @event selectionEnforceEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + */ +YAHOO.widget.AutoComplete.prototype.selectionEnforceEvent = null; + +/** + * Fired when the results container is collapsed. + * + * @event containerCollapseEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + */ +YAHOO.widget.AutoComplete.prototype.containerCollapseEvent = null; + +/** + * Fired when the input field loses focus. + * + * @event textboxBlurEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + */ +YAHOO.widget.AutoComplete.prototype.textboxBlurEvent = null; + +///////////////////////////////////////////////////////////////////////////// +// +// Private member variables +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Internal class variable to index multiple AutoComplete instances. + * + * @property _nIndex + * @type Number + * @default 0 + * @private + */ +YAHOO.widget.AutoComplete._nIndex = 0; + +/** + * Name of AutoComplete instance. + * + * @property _sName + * @type String + * @private + */ +YAHOO.widget.AutoComplete.prototype._sName = null; + +/** + * Text input field DOM element. + * + * @property _oTextbox + * @type HTMLElement + * @private + */ +YAHOO.widget.AutoComplete.prototype._oTextbox = null; + +/** + * Whether or not the input field is currently in focus. If query results come back + * but the user has already moved on, do not proceed with auto complete behavior. + * + * @property _bFocused + * @type Boolean + * @private + */ +YAHOO.widget.AutoComplete.prototype._bFocused = true; + +/** + * Animation instance for container expand/collapse. + * + * @property _oAnim + * @type Boolean + * @private + */ +YAHOO.widget.AutoComplete.prototype._oAnim = null; + +/** + * Container DOM element. + * + * @property _oContainer + * @type HTMLElement + * @private + */ +YAHOO.widget.AutoComplete.prototype._oContainer = null; + +/** + * Whether or not the results container is currently open. + * + * @property _bContainerOpen + * @type Boolean + * @private + */ +YAHOO.widget.AutoComplete.prototype._bContainerOpen = false; + +/** + * Whether or not the mouse is currently over the results + * container. This is necessary in order to prevent clicks on container items + * from being text input field blur events. + * + * @property _bOverContainer + * @type Boolean + * @private + */ +YAHOO.widget.AutoComplete.prototype._bOverContainer = false; + +/** + * Array of <li> elements references that contain query results within the + * results container. + * + * @property _aListItems + * @type HTMLElement[] + * @private + */ +YAHOO.widget.AutoComplete.prototype._aListItems = null; + +/** + * Number of <li> elements currently displayed in results container. + * + * @property _nDisplayedItems + * @type Number + * @private + */ +YAHOO.widget.AutoComplete.prototype._nDisplayedItems = 0; + +/** + * Internal count of <li> elements displayed and hidden in results container. + * + * @property _maxResultsDisplayed + * @type Number + * @private + */ +YAHOO.widget.AutoComplete.prototype._maxResultsDisplayed = 0; + +/** + * Current query string + * + * @property _sCurQuery + * @type String + * @private + */ +YAHOO.widget.AutoComplete.prototype._sCurQuery = null; + +/** + * Past queries this session (for saving delimited queries). + * + * @property _sSavedQuery + * @type String + * @private + */ +YAHOO.widget.AutoComplete.prototype._sSavedQuery = null; + +/** + * Pointer to the currently highlighted <li> element in the container. + * + * @property _oCurItem + * @type HTMLElement + * @private + */ +YAHOO.widget.AutoComplete.prototype._oCurItem = null; + +/** + * Whether or not an item has been selected since the container was populated + * with results. Reset to false by _populateList, and set to true when item is + * selected. + * + * @property _bItemSelected + * @type Boolean + * @private + */ +YAHOO.widget.AutoComplete.prototype._bItemSelected = false; + +/** + * Key code of the last key pressed in textbox. + * + * @property _nKeyCode + * @type Number + * @private + */ +YAHOO.widget.AutoComplete.prototype._nKeyCode = null; + +/** + * Delay timeout ID. + * + * @property _nDelayID + * @type Number + * @private + */ +YAHOO.widget.AutoComplete.prototype._nDelayID = -1; + +/** + * Src to iFrame used when useIFrame = true. Supports implementations over SSL + * as well. + * + * @property _iFrameSrc + * @type String + * @private + */ +YAHOO.widget.AutoComplete.prototype._iFrameSrc = "javascript:false;"; + +/** + * For users typing via certain IMEs, queries must be triggered by intervals, + * since key events yet supported across all browsers for all IMEs. + * + * @property _queryInterval + * @type Object + * @private + */ +YAHOO.widget.AutoComplete.prototype._queryInterval = null; + +/** + * Internal tracker to last known textbox value, used to determine whether or not + * to trigger a query via interval for certain IME users. + * + * @event _sLastTextboxValue + * @type String + * @private + */ +YAHOO.widget.AutoComplete.prototype._sLastTextboxValue = null; + +///////////////////////////////////////////////////////////////////////////// +// +// Private methods +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Updates and validates latest public config properties. + * + * @method __initProps + * @private + */ +YAHOO.widget.AutoComplete.prototype._initProps = function() { + // Correct any invalid values + var minQueryLength = this.minQueryLength; + if(isNaN(minQueryLength) || (minQueryLength < 1)) { + minQueryLength = 1; + } + var maxResultsDisplayed = this.maxResultsDisplayed; + if(isNaN(this.maxResultsDisplayed) || (this.maxResultsDisplayed < 1)) { + this.maxResultsDisplayed = 10; + } + var queryDelay = this.queryDelay; + if(isNaN(this.queryDelay) || (this.queryDelay < 0)) { + this.queryDelay = 0.5; + } + var aDelimChar = (this.delimChar) ? this.delimChar : null; + if(aDelimChar) { + if(typeof aDelimChar == "string") { + this.delimChar = [aDelimChar]; + } + else if(aDelimChar.constructor != Array) { + this.delimChar = null; + } + } + var animSpeed = this.animSpeed; + if((this.animHoriz || this.animVert) && YAHOO.util.Anim) { + if(isNaN(animSpeed) || (animSpeed < 0)) { + animSpeed = 0.3; + } + if(!this._oAnim ) { + oAnim = new YAHOO.util.Anim(this._oContainer._oContent, {}, this.animSpeed); + this._oAnim = oAnim; + } + else { + this._oAnim.duration = animSpeed; + } + } + if(this.forceSelection && this.delimChar) { + YAHOO.log("The forceSelection feature has been enabled with delimChar defined.","warn", this.toString()); + } +}; + +/** + * Initializes the results container helpers if they are enabled and do + * not exist + * + * @method _initContainerHelpers + * @private + */ +YAHOO.widget.AutoComplete.prototype._initContainerHelpers = function() { + if(this.useShadow && !this._oContainer._oShadow) { + var oShadow = document.createElement("div"); + oShadow.className = "yui-ac-shadow"; + this._oContainer._oShadow = this._oContainer.appendChild(oShadow); + } + if(this.useIFrame && !this._oContainer._oIFrame) { + var oIFrame = document.createElement("iframe"); + oIFrame.src = this._iFrameSrc; + oIFrame.frameBorder = 0; + oIFrame.scrolling = "no"; + oIFrame.style.position = "absolute"; + oIFrame.style.width = "100%"; + oIFrame.style.height = "100%"; + oIFrame.tabIndex = -1; + this._oContainer._oIFrame = this._oContainer.appendChild(oIFrame); + } +}; + +/** + * Initializes the results container once at object creation + * + * @method _initContainer + * @private + */ +YAHOO.widget.AutoComplete.prototype._initContainer = function() { + if(!this._oContainer._oContent) { + // The oContent div helps size the iframe and shadow properly + var oContent = document.createElement("div"); + oContent.className = "yui-ac-content"; + oContent.style.display = "none"; + this._oContainer._oContent = this._oContainer.appendChild(oContent); + + var oHeader = document.createElement("div"); + oHeader.className = "yui-ac-hd"; + oHeader.style.display = "none"; + this._oContainer._oContent._oHeader = this._oContainer._oContent.appendChild(oHeader); + + var oBody = document.createElement("div"); + oBody.className = "yui-ac-bd"; + this._oContainer._oContent._oBody = this._oContainer._oContent.appendChild(oBody); + + var oFooter = document.createElement("div"); + oFooter.className = "yui-ac-ft"; + oFooter.style.display = "none"; + this._oContainer._oContent._oFooter = this._oContainer._oContent.appendChild(oFooter); + } + else { + YAHOO.log("Could not initialize the container","warn",this.toString()); + } +}; + +/** + * Clears out contents of container body and creates up to + * YAHOO.widget.AutoComplete#maxResultsDisplayed <li> elements in an + * <ul> element. + * + * @method _initList + * @private + */ +YAHOO.widget.AutoComplete.prototype._initList = function() { + this._aListItems = []; + while(this._oContainer._oContent._oBody.hasChildNodes()) { + var oldListItems = this.getListItems(); + if(oldListItems) { + for(var oldi = oldListItems.length-1; oldi >= 0; i--) { + oldListItems[oldi] = null; + } + } + this._oContainer._oContent._oBody.innerHTML = ""; + } + + var oList = document.createElement("ul"); + oList = this._oContainer._oContent._oBody.appendChild(oList); + for(var i=0; i= 18 && nKeyCode <= 20) || // alt,pause/break,caps lock + (nKeyCode == 27) || // esc + (nKeyCode >= 33 && nKeyCode <= 35) || // page up,page down,end + (nKeyCode >= 36 && nKeyCode <= 38) || // home,left,up + (nKeyCode == 40) || // down + (nKeyCode >= 44 && nKeyCode <= 45)) { // print screen,insert + return true; + } + return false; +}; + +/** + * Makes query request to the DataSource. + * + * @method _sendQuery + * @param sQuery {String} Query string. + * @private + */ +YAHOO.widget.AutoComplete.prototype._sendQuery = function(sQuery) { + // Widget has been effectively turned off + if(this.minQueryLength == -1) { + this._toggleContainer(false); + return; + } + // Delimiter has been enabled + var aDelimChar = (this.delimChar) ? this.delimChar : null; + if(aDelimChar) { + // Loop through all possible delimiters and find the latest one + // A " " may be a false positive if they are defined as delimiters AND + // are used to separate delimited queries + var nDelimIndex = -1; + for(var i = aDelimChar.length-1; i >= 0; i--) { + var nNewIndex = sQuery.lastIndexOf(aDelimChar[i]); + if(nNewIndex > nDelimIndex) { + nDelimIndex = nNewIndex; + } + } + // If we think the last delimiter is a space (" "), make sure it is NOT + // a false positive by also checking the char directly before it + if(aDelimChar[i] == " ") { + for (var j = aDelimChar.length-1; j >= 0; j--) { + if(sQuery[nDelimIndex - 1] == aDelimChar[j]) { + nDelimIndex--; + break; + } + } + } + // A delimiter has been found so extract the latest query + if (nDelimIndex > -1) { + var nQueryStart = nDelimIndex + 1; + // Trim any white space from the beginning... + while(sQuery.charAt(nQueryStart) == " ") { + nQueryStart += 1; + } + // ...and save the rest of the string for later + this._sSavedQuery = sQuery.substring(0,nQueryStart); + // Here is the query itself + sQuery = sQuery.substr(nQueryStart); + } + else if(sQuery.indexOf(this._sSavedQuery) < 0){ + this._sSavedQuery = null; + } + } + + // Don't search queries that are too short + if (sQuery && (sQuery.length < this.minQueryLength) || (!sQuery && this.minQueryLength > 0)) { + if (this._nDelayID != -1) { + clearTimeout(this._nDelayID); + } + this._toggleContainer(false); + return; + } + + sQuery = encodeURIComponent(sQuery); + this._nDelayID = -1; // Reset timeout ID because request has been made + this.dataRequestEvent.fire(this, sQuery); + this.dataSource.getResults(this._populateList, sQuery, this); +}; + +/** + * Populates the array of <li> elements in the container with query + * results. This method is passed to YAHOO.widget.DataSource#getResults as a + * callback function so results from the DataSource instance are returned to the + * AutoComplete instance. + * + * @method _populateList + * @param sQuery {String} The query string. + * @param aResults {Object[]} An array of query result objects from the DataSource. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._populateList = function(sQuery, aResults, oSelf) { + if(aResults === null) { + oSelf.dataErrorEvent.fire(oSelf, sQuery); + } + if (!oSelf._bFocused || !aResults) { + return; + } + + var isOpera = (navigator.userAgent.toLowerCase().indexOf("opera") != -1); + var contentStyle = oSelf._oContainer._oContent.style; + contentStyle.width = (!isOpera) ? null : ""; + contentStyle.height = (!isOpera) ? null : ""; + + var sCurQuery = decodeURIComponent(sQuery); + oSelf._sCurQuery = sCurQuery; + oSelf._bItemSelected = false; + + if(oSelf._maxResultsDisplayed != oSelf.maxResultsDisplayed) { + oSelf._initList(); + } + + var nItems = Math.min(aResults.length,oSelf.maxResultsDisplayed); + oSelf._nDisplayedItems = nItems; + if (nItems > 0) { + oSelf._initContainerHelpers(); + var aItems = oSelf._aListItems; + + // Fill items with data + for(var i = nItems-1; i >= 0; i--) { + var oItemi = aItems[i]; + var oResultItemi = aResults[i]; + oItemi.innerHTML = oSelf.formatResult(oResultItemi, sCurQuery); + oItemi.style.display = "list-item"; + oItemi._sResultKey = oResultItemi[0]; + oItemi._oResultData = oResultItemi; + + } + + // Empty out remaining items if any + for(var j = aItems.length-1; j >= nItems ; j--) { + var oItemj = aItems[j]; + oItemj.innerHTML = null; + oItemj.style.display = "none"; + oItemj._sResultKey = null; + oItemj._oResultData = null; + } + + if(oSelf.autoHighlight) { + // Go to the first item + var oFirstItem = aItems[0]; + oSelf._toggleHighlight(oFirstItem,"to"); + oSelf.itemArrowToEvent.fire(oSelf, oFirstItem); + oSelf._typeAhead(oFirstItem,sQuery); + } + else { + oSelf._oCurItem = null; + } + + // Expand the container + var ok = oSelf.doBeforeExpandContainer(oSelf._oTextbox, oSelf._oContainer, sQuery, aResults); + oSelf._toggleContainer(ok); + } + else { + oSelf._toggleContainer(false); + } + oSelf.dataReturnEvent.fire(oSelf, sQuery, aResults); +}; + +/** + * When forceSelection is true and the user attempts + * leave the text input box without selecting an item from the query results, + * the user selection is cleared. + * + * @method _clearSelection + * @private + */ +YAHOO.widget.AutoComplete.prototype._clearSelection = function() { + var sValue = this._oTextbox.value; + var sChar = (this.delimChar) ? this.delimChar[0] : null; + var nIndex = (sChar) ? sValue.lastIndexOf(sChar, sValue.length-2) : -1; + if(nIndex > -1) { + this._oTextbox.value = sValue.substring(0,nIndex); + } + else { + this._oTextbox.value = ""; + } + this._sSavedQuery = this._oTextbox.value; + + // Fire custom event + this.selectionEnforceEvent.fire(this); +}; + +/** + * Whether or not user-typed value in the text input box matches any of the + * query results. + * + * @method _textMatchesOption + * @return {Boolean} True if user-input text matches a result, false otherwise. + * @private + */ +YAHOO.widget.AutoComplete.prototype._textMatchesOption = function() { + var foundMatch = false; + + for(var i = this._nDisplayedItems-1; i >= 0 ; i--) { + var oItem = this._aListItems[i]; + var sMatch = oItem._sResultKey.toLowerCase(); + if (sMatch == this._sCurQuery.toLowerCase()) { + foundMatch = true; + break; + } + } + return(foundMatch); +}; + +/** + * Updates in the text input box with the first query result as the user types, + * selecting the substring that the user has not typed. + * + * @method _typeAhead + * @param oItem {HTMLElement} The <li> element item whose data populates the input field. + * @param sQuery {String} Query string. + * @private + */ +YAHOO.widget.AutoComplete.prototype._typeAhead = function(oItem, sQuery) { + // Don't update if turned off + if (!this.typeAhead || (this._nKeyCode == 8)) { + return; + } + + var oTextbox = this._oTextbox; + var sValue = this._oTextbox.value; // any saved queries plus what user has typed + + // Don't update with type-ahead if text selection is not supported + if(!oTextbox.setSelectionRange && !oTextbox.createTextRange) { + return; + } + + // Select the portion of text that the user has not typed + var nStart = sValue.length; + this._updateValue(oItem); + var nEnd = oTextbox.value.length; + this._selectText(oTextbox,nStart,nEnd); + var sPrefill = oTextbox.value.substr(nStart,nEnd); + this.typeAheadEvent.fire(this,sQuery,sPrefill); +}; + +/** + * Selects text in the input field. + * + * @method _selectText + * @param oTextbox {HTMLElement} Text input box element in which to select text. + * @param nStart {Number} Starting index of text string to select. + * @param nEnd {Number} Ending index of text selection. + * @private + */ +YAHOO.widget.AutoComplete.prototype._selectText = function(oTextbox, nStart, nEnd) { + if (oTextbox.setSelectionRange) { // For Mozilla + oTextbox.setSelectionRange(nStart,nEnd); + } + else if (oTextbox.createTextRange) { // For IE + var oTextRange = oTextbox.createTextRange(); + oTextRange.moveStart("character", nStart); + oTextRange.moveEnd("character", nEnd-oTextbox.value.length); + oTextRange.select(); + } + else { + oTextbox.select(); + } +}; + +/** + * Syncs results container with its helpers. + * + * @method _toggleContainerHelpers + * @param bShow {Boolean} True if container is expanded, false if collapsed + * @private + */ +YAHOO.widget.AutoComplete.prototype._toggleContainerHelpers = function(bShow) { + var bFireEvent = false; + var width = this._oContainer._oContent.offsetWidth + "px"; + var height = this._oContainer._oContent.offsetHeight + "px"; + + if(this.useIFrame && this._oContainer._oIFrame) { + bFireEvent = true; + if(bShow) { + this._oContainer._oIFrame.style.width = width; + this._oContainer._oIFrame.style.height = height; + } + else { + this._oContainer._oIFrame.style.width = 0; + this._oContainer._oIFrame.style.height = 0; + } + } + if(this.useShadow && this._oContainer._oShadow) { + bFireEvent = true; + if(bShow) { + this._oContainer._oShadow.style.width = width; + this._oContainer._oShadow.style.height = height; + } + else { + this._oContainer._oShadow.style.width = 0; + this._oContainer._oShadow.style.height = 0; + } + } +}; + +/** + * Animates expansion or collapse of the container. + * + * @method _toggleContainer + * @param bShow {Boolean} True if container should be expanded, false if container should be collapsed + * @private + */ +YAHOO.widget.AutoComplete.prototype._toggleContainer = function(bShow) { + var oContainer = this._oContainer; + + // Implementer has container always open so don't mess with it + if(this.alwaysShowContainer && this._bContainerOpen) { + return; + } + + // Clear contents of container + if(!bShow) { + this._oContainer._oContent.scrollTop = 0; + var aItems = this._aListItems; + + if(aItems && (aItems.length > 0)) { + for(var i = aItems.length-1; i >= 0 ; i--) { + aItems[i].style.display = "none"; + } + } + + if (this._oCurItem) { + this._toggleHighlight(this._oCurItem,"from"); + } + + this._oCurItem = null; + this._nDisplayedItems = 0; + this._sCurQuery = null; + } + + // Container is already closed + if (!bShow && !this._bContainerOpen) { + oContainer._oContent.style.display = "none"; + return; + } + + // If animation is enabled... + var oAnim = this._oAnim; + if (oAnim && oAnim.getEl() && (this.animHoriz || this.animVert)) { + // If helpers need to be collapsed, do it right away... + // but if helpers need to be expanded, wait until after the container expands + if(!bShow) { + this._toggleContainerHelpers(bShow); + } + + if(oAnim.isAnimated()) { + oAnim.stop(); + } + + // Clone container to grab current size offscreen + var oClone = oContainer._oContent.cloneNode(true); + oContainer.appendChild(oClone); + oClone.style.top = "-9000px"; + oClone.style.display = "block"; + + // Current size of the container is the EXPANDED size + var wExp = oClone.offsetWidth; + var hExp = oClone.offsetHeight; + + // Calculate COLLAPSED sizes based on horiz and vert anim + var wColl = (this.animHoriz) ? 0 : wExp; + var hColl = (this.animVert) ? 0 : hExp; + + // Set animation sizes + oAnim.attributes = (bShow) ? + {width: { to: wExp }, height: { to: hExp }} : + {width: { to: wColl}, height: { to: hColl }}; + + // If opening anew, set to a collapsed size... + if(bShow && !this._bContainerOpen) { + oContainer._oContent.style.width = wColl+"px"; + oContainer._oContent.style.height = hColl+"px"; + } + // Else, set it to its last known size. + else { + oContainer._oContent.style.width = wExp+"px"; + oContainer._oContent.style.height = hExp+"px"; + } + + oContainer.removeChild(oClone); + oClone = null; + + var oSelf = this; + var onAnimComplete = function() { + // Finish the collapse + oAnim.onComplete.unsubscribeAll(); + + if(bShow) { + oSelf.containerExpandEvent.fire(oSelf); + } + else { + oContainer._oContent.style.display = "none"; + oSelf.containerCollapseEvent.fire(oSelf); + } + oSelf._toggleContainerHelpers(bShow); + }; + + // Display container and animate it + oContainer._oContent.style.display = "block"; + oAnim.onComplete.subscribe(onAnimComplete); + oAnim.animate(); + this._bContainerOpen = bShow; + } + // Else don't animate, just show or hide + else { + if(bShow) { + oContainer._oContent.style.display = "block"; + this.containerExpandEvent.fire(this); + } + else { + oContainer._oContent.style.display = "none"; + this.containerCollapseEvent.fire(this); + } + this._toggleContainerHelpers(bShow); + this._bContainerOpen = bShow; + } + +}; + +/** + * Toggles the highlight on or off for an item in the container, and also cleans + * up highlighting of any previous item. + * + * @method _toggleHighlight + * @param oNewItem {HTMLElement} The <li> element item to receive highlight behavior. + * @param sType {String} Type "mouseover" will toggle highlight on, and "mouseout" will toggle highlight off. + * @private + */ +YAHOO.widget.AutoComplete.prototype._toggleHighlight = function(oNewItem, sType) { + var sHighlight = this.highlightClassName; + if(this._oCurItem) { + // Remove highlight from old item + YAHOO.util.Dom.removeClass(this._oCurItem, sHighlight); + } + + if((sType == "to") && sHighlight) { + // Apply highlight to new item + YAHOO.util.Dom.addClass(oNewItem, sHighlight); + this._oCurItem = oNewItem; + } +}; + +/** + * Toggles the pre-highlight on or off for an item in the container. + * + * @method _togglePrehighlight + * @param oNewItem {HTMLElement} The <li> element item to receive highlight behavior. + * @param sType {String} Type "mouseover" will toggle highlight on, and "mouseout" will toggle highlight off. + * @private + */ +YAHOO.widget.AutoComplete.prototype._togglePrehighlight = function(oNewItem, sType) { + if(oNewItem == this._oCurItem) { + return; + } + + var sPrehighlight = this.prehighlightClassName; + if((sType == "mouseover") && sPrehighlight) { + // Apply prehighlight to new item + YAHOO.util.Dom.addClass(oNewItem, sPrehighlight); + } + else { + // Remove prehighlight from old item + YAHOO.util.Dom.removeClass(oNewItem, sPrehighlight); + } +}; + +/** + * Updates the text input box value with selected query result. If a delimiter + * has been defined, then the value gets appended with the delimiter. + * + * @method _updateValue + * @param oItem {HTMLElement} The <li> element item with which to update the value. + * @private + */ +YAHOO.widget.AutoComplete.prototype._updateValue = function(oItem) { + var oTextbox = this._oTextbox; + var sDelimChar = (this.delimChar) ? (this.delimChar[0] || this.delimChar) : null; + var sSavedQuery = this._sSavedQuery; + var sResultKey = oItem._sResultKey; + oTextbox.focus(); + + // First clear text field + oTextbox.value = ""; + // Grab data to put into text field + if(sDelimChar) { + if(sSavedQuery) { + oTextbox.value = sSavedQuery; + } + oTextbox.value += sResultKey + sDelimChar; + if(sDelimChar != " ") { + oTextbox.value += " "; + } + } + else { oTextbox.value = sResultKey; } + + // scroll to bottom of textarea if necessary + if(oTextbox.type == "textarea") { + oTextbox.scrollTop = oTextbox.scrollHeight; + } + + // move cursor to end + var end = oTextbox.value.length; + this._selectText(oTextbox,end,end); + + this._oCurItem = oItem; +}; + +/** + * Selects a result item from the container + * + * @method _selectItem + * @param oItem {HTMLElement} The selected <li> element item. + * @private + */ +YAHOO.widget.AutoComplete.prototype._selectItem = function(oItem) { + this._bItemSelected = true; + this._updateValue(oItem); + this._cancelIntervalDetection(this); + this.itemSelectEvent.fire(this, oItem, oItem._oResultData); + this._toggleContainer(false); +}; + +/** + * For values updated by type-ahead, the right arrow key jumps to the end + * of the textbox, otherwise the container is closed. + * + * @method _jumpSelection + * @private + */ +YAHOO.widget.AutoComplete.prototype._jumpSelection = function() { + if(!this.typeAhead) { + return; + } + else { + this._toggleContainer(false); + } +}; + +/** + * Triggered by up and down arrow keys, changes the current highlighted + * <li> element item. Scrolls container if necessary. + * + * @method _moveSelection + * @param nKeyCode {Number} Code of key pressed. + * @private + */ +YAHOO.widget.AutoComplete.prototype._moveSelection = function(nKeyCode) { + if(this._bContainerOpen) { + // Determine current item's id number + var oCurItem = this._oCurItem; + var nCurItemIndex = -1; + + if (oCurItem) { + nCurItemIndex = oCurItem._nItemIndex; + } + + var nNewItemIndex = (nKeyCode == 40) ? + (nCurItemIndex + 1) : (nCurItemIndex - 1); + + // Out of bounds + if (nNewItemIndex < -2 || nNewItemIndex >= this._nDisplayedItems) { + return; + } + + if (oCurItem) { + // Unhighlight current item + this._toggleHighlight(oCurItem, "from"); + this.itemArrowFromEvent.fire(this, oCurItem); + } + if (nNewItemIndex == -1) { + // Go back to query (remove type-ahead string) + if(this.delimChar && this._sSavedQuery) { + if (!this._textMatchesOption()) { + this._oTextbox.value = this._sSavedQuery; + } + else { + this._oTextbox.value = this._sSavedQuery + this._sCurQuery; + } + } + else { + this._oTextbox.value = this._sCurQuery; + } + this._oCurItem = null; + return; + } + if (nNewItemIndex == -2) { + // Close container + this._toggleContainer(false); + return; + } + + var oNewItem = this._aListItems[nNewItemIndex]; + + // Scroll the container if necessary + var oContent = this._oContainer._oContent; + var scrollOn = ((YAHOO.util.Dom.getStyle(oContent,"overflow") == "auto") || + (YAHOO.util.Dom.getStyle(oContent,"overflowY") == "auto")); + if(scrollOn && (nNewItemIndex > -1) && + (nNewItemIndex < this._nDisplayedItems)) { + // User is keying down + if(nKeyCode == 40) { + // Bottom of selected item is below scroll area... + if((oNewItem.offsetTop+oNewItem.offsetHeight) > (oContent.scrollTop + oContent.offsetHeight)) { + // Set bottom of scroll area to bottom of selected item + oContent.scrollTop = (oNewItem.offsetTop+oNewItem.offsetHeight) - oContent.offsetHeight; + } + // Bottom of selected item is above scroll area... + else if((oNewItem.offsetTop+oNewItem.offsetHeight) < oContent.scrollTop) { + // Set top of selected item to top of scroll area + oContent.scrollTop = oNewItem.offsetTop; + + } + } + // User is keying up + else { + // Top of selected item is above scroll area + if(oNewItem.offsetTop < oContent.scrollTop) { + // Set top of scroll area to top of selected item + this._oContainer._oContent.scrollTop = oNewItem.offsetTop; + } + // Top of selected item is below scroll area + else if(oNewItem.offsetTop > (oContent.scrollTop + oContent.offsetHeight)) { + // Set bottom of selected item to bottom of scroll area + this._oContainer._oContent.scrollTop = (oNewItem.offsetTop+oNewItem.offsetHeight) - oContent.offsetHeight; + } + } + } + + this._toggleHighlight(oNewItem, "to"); + this.itemArrowToEvent.fire(this, oNewItem); + if(this.typeAhead) { + this._updateValue(oNewItem); + } + } +}; + +///////////////////////////////////////////////////////////////////////////// +// +// Private event handlers +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Handles <li> element mouseover events in the container. + * + * @method _onItemMouseover + * @param v {HTMLEvent} The mouseover event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onItemMouseover = function(v,oSelf) { + if(oSelf.prehighlightClassName) { + oSelf._togglePrehighlight(this,"mouseover"); + } + else { + oSelf._toggleHighlight(this,"to"); + } + + oSelf.itemMouseOverEvent.fire(oSelf, this); +}; + +/** + * Handles <li> element mouseout events in the container. + * + * @method _onItemMouseout + * @param v {HTMLEvent} The mouseout event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onItemMouseout = function(v,oSelf) { + if(oSelf.prehighlightClassName) { + oSelf._togglePrehighlight(this,"mouseout"); + } + else { + oSelf._toggleHighlight(this,"from"); + } + + oSelf.itemMouseOutEvent.fire(oSelf, this); +}; + +/** + * Handles <li> element click events in the container. + * + * @method _onItemMouseclick + * @param v {HTMLEvent} The click event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onItemMouseclick = function(v,oSelf) { + // In case item has not been moused over + oSelf._toggleHighlight(this,"to"); + oSelf._selectItem(this); +}; + +/** + * Handles container mouseover events. + * + * @method _onContainerMouseover + * @param v {HTMLEvent} The mouseover event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onContainerMouseover = function(v,oSelf) { + oSelf._bOverContainer = true; +}; + +/** + * Handles container mouseout events. + * + * @method _onContainerMouseout + * @param v {HTMLEvent} The mouseout event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onContainerMouseout = function(v,oSelf) { + oSelf._bOverContainer = false; + // If container is still active + if(oSelf._oCurItem) { + oSelf._toggleHighlight(oSelf._oCurItem,"to"); + } +}; + +/** + * Handles container scroll events. + * + * @method _onContainerScroll + * @param v {HTMLEvent} The scroll event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onContainerScroll = function(v,oSelf) { + oSelf._oTextbox.focus(); +}; + +/** + * Handles container resize events. + * + * @method _onContainerResize + * @param v {HTMLEvent} The resize event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onContainerResize = function(v,oSelf) { + oSelf._toggleContainerHelpers(oSelf._bContainerOpen); +}; + + +/** + * Handles textbox keydown events of functional keys, mainly for UI behavior. + * + * @method _onTextboxKeyDown + * @param v {HTMLEvent} The keydown event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onTextboxKeyDown = function(v,oSelf) { + var nKeyCode = v.keyCode; + + switch (nKeyCode) { + case 9: // tab + if(oSelf.delimChar && (oSelf._nKeyCode != nKeyCode)) { + if(oSelf._bContainerOpen) { + YAHOO.util.Event.stopEvent(v); + } + } + // select an item or clear out + if(oSelf._oCurItem) { + oSelf._selectItem(oSelf._oCurItem); + } + else { + oSelf._toggleContainer(false); + } + break; + case 13: // enter + if(oSelf._nKeyCode != nKeyCode) { + if(oSelf._bContainerOpen) { + YAHOO.util.Event.stopEvent(v); + } + } + if(oSelf._oCurItem) { + oSelf._selectItem(oSelf._oCurItem); + } + else { + oSelf._toggleContainer(false); + } + break; + case 27: // esc + oSelf._toggleContainer(false); + return; + case 39: // right + oSelf._jumpSelection(); + break; + case 38: // up + YAHOO.util.Event.stopEvent(v); + oSelf._moveSelection(nKeyCode); + break; + case 40: // down + YAHOO.util.Event.stopEvent(v); + oSelf._moveSelection(nKeyCode); + break; + default: + break; + } +}; + +/** + * Handles textbox keypress events. + * @method _onTextboxKeyPress + * @param v {HTMLEvent} The keypress event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onTextboxKeyPress = function(v,oSelf) { + var nKeyCode = v.keyCode; + + //Expose only to Mac browsers, where stopEvent is ineffective on keydown events (bug 790337) + var isMac = (navigator.userAgent.toLowerCase().indexOf("mac") != -1); + if(isMac) { + switch (nKeyCode) { + case 9: // tab + if(oSelf.delimChar && (oSelf._nKeyCode != nKeyCode)) { + if(oSelf._bContainerOpen) { + YAHOO.util.Event.stopEvent(v); + } + } + break; + case 13: // enter + if(oSelf._nKeyCode != nKeyCode) { + if(oSelf._bContainerOpen) { + YAHOO.util.Event.stopEvent(v); + } + } + break; + case 38: // up + case 40: // down + YAHOO.util.Event.stopEvent(v); + break; + default: + break; + } + } + + //TODO: (?) limit only to non-IE, non-Mac-FF for Korean IME support (bug 811948) + // Korean IME detected + else if(nKeyCode == 229) { + oSelf._queryInterval = setInterval(function() { oSelf._onIMEDetected(oSelf); },500); + } +}; + +/** + * Handles textbox keyup events that trigger queries. + * + * @method _onTextboxKeyUp + * @param v {HTMLEvent} The keyup event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onTextboxKeyUp = function(v,oSelf) { + // Check to see if any of the public properties have been updated + oSelf._initProps(); + + var nKeyCode = v.keyCode; + oSelf._nKeyCode = nKeyCode; + var sText = this.value; //string in textbox + + // Filter out chars that don't trigger queries + if (oSelf._isIgnoreKey(nKeyCode) || (sText.toLowerCase() == oSelf._sCurQuery)) { + return; + } + else { + oSelf.textboxKeyEvent.fire(oSelf, nKeyCode); + } + + // Set timeout on the request + if (oSelf.queryDelay > 0) { + var nDelayID = + setTimeout(function(){oSelf._sendQuery(sText);},(oSelf.queryDelay * 1000)); + + if (oSelf._nDelayID != -1) { + clearTimeout(oSelf._nDelayID); + } + + oSelf._nDelayID = nDelayID; + } + else { + // No delay so send request immediately + oSelf._sendQuery(sText); + } +}; + +/** + * Handles text input box receiving focus. + * + * @method _onTextboxFocus + * @param v {HTMLEvent} The focus event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onTextboxFocus = function (v,oSelf) { + oSelf._oTextbox.setAttribute("autocomplete","off"); + oSelf._bFocused = true; + oSelf.textboxFocusEvent.fire(oSelf); +}; + +/** + * Handles text input box losing focus. + * + * @method _onTextboxBlur + * @param v {HTMLEvent} The focus event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onTextboxBlur = function (v,oSelf) { + // Don't treat as a blur if it was a selection via mouse click + if(!oSelf._bOverContainer || (oSelf._nKeyCode == 9)) { + // Current query needs to be validated + if(!oSelf._bItemSelected) { + if(!oSelf._bContainerOpen || (oSelf._bContainerOpen && !oSelf._textMatchesOption())) { + if(oSelf.forceSelection) { + oSelf._clearSelection(); + } + else { + oSelf.unmatchedItemSelectEvent.fire(oSelf, oSelf._sCurQuery); + } + } + } + + if(oSelf._bContainerOpen) { + oSelf._toggleContainer(false); + } + oSelf._cancelIntervalDetection(oSelf); + oSelf._bFocused = false; + oSelf.textboxBlurEvent.fire(oSelf); + } +}; + +/** + * Handles form submission event. + * + * @method _onFormSubmit + * @param v {HTMLEvent} The submit event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onFormSubmit = function(v,oSelf) { + if(oSelf.allowBrowserAutocomplete) { + oSelf._oTextbox.setAttribute("autocomplete","on"); + } + else { + oSelf._oTextbox.setAttribute("autocomplete","off"); + } +}; + +/****************************************************************************/ +/****************************************************************************/ +/****************************************************************************/ + +/** + * The DataSource classes manages sending a request and returning response from a live + * database. Supported data include local JavaScript arrays and objects and databases + * accessible via XHR connections. Supported response formats include JavaScript arrays, + * JSON, XML, and flat-file textual data. + * + * @class DataSource + * @constructor + */ +YAHOO.widget.DataSource = function() { + /* abstract class */ +}; + + +///////////////////////////////////////////////////////////////////////////// +// +// Public constants +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Error message for null data responses. + * + * @property ERROR_DATANULL + * @type String + * @static + * @final + */ +YAHOO.widget.DataSource.ERROR_DATANULL = "Response data was null"; + +/** + * Error message for data responses with parsing errors. + * + * @property ERROR_DATAPARSE + * @type String + * @static + * @final + */ +YAHOO.widget.DataSource.ERROR_DATAPARSE = "Response data could not be parsed"; + + +///////////////////////////////////////////////////////////////////////////// +// +// Public member variables +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Max size of the local cache. Set to 0 to turn off caching. Caching is + * useful to reduce the number of server connections. Recommended only for data + * sources that return comprehensive results for queries or when stale data is + * not an issue. + * + * @property maxCacheEntries + * @type Number + * @default 15 + */ +YAHOO.widget.DataSource.prototype.maxCacheEntries = 15; + +/** + * Use this to equate cache matching with the type of matching done by your live + * data source. If caching is on and queryMatchContains is true, the cache + * returns results that "contain" the query string. By default, + * queryMatchContains is set to false, meaning the cache only returns results + * that "start with" the query string. + * + * @property queryMatchContains + * @type Boolean + * @default false + */ +YAHOO.widget.DataSource.prototype.queryMatchContains = false; + +/** + * Enables query subset matching. If caching is on and queryMatchSubset is + * true, substrings of queries will return matching cached results. For + * instance, if the first query is for "abc" susequent queries that start with + * "abc", like "abcd", will be queried against the cache, and not the live data + * source. Recommended only for DataSources that return comprehensive results + * for queries with very few characters. + * + * @property queryMatchSubset + * @type Boolean + * @default false + * + */ +YAHOO.widget.DataSource.prototype.queryMatchSubset = false; + +/** + * Enables query case-sensitivity matching. If caching is on and + * queryMatchCase is true, queries will only return results for case-sensitive + * matches. + * + * @property queryMatchCase + * @type Boolean + * @default false + */ +YAHOO.widget.DataSource.prototype.queryMatchCase = false; + + +///////////////////////////////////////////////////////////////////////////// +// +// Public methods +// +///////////////////////////////////////////////////////////////////////////// + + /** + * Public accessor to the unique name of the DataSource instance. + * + * @method toString + * @return {String} Unique name of the DataSource instance + */ +YAHOO.widget.DataSource.prototype.toString = function() { + return "DataSource " + this._sName; +}; + +/** + * Retrieves query results, first checking the local cache, then making the + * query request to the live data source as defined by the function doQuery. + * + * @method getResults + * @param oCallbackFn {HTMLFunction} Callback function defined by oParent object to which to return results. + * @param sQuery {String} Query string. + * @param oParent {Object} The object instance that has requested data. + */ +YAHOO.widget.DataSource.prototype.getResults = function(oCallbackFn, sQuery, oParent) { + + // First look in cache + var aResults = this._doQueryCache(oCallbackFn,sQuery,oParent); + + // Not in cache, so get results from server + if(aResults.length === 0) { + this.queryEvent.fire(this, oParent, sQuery); + this.doQuery(oCallbackFn, sQuery, oParent); + } +}; + +/** + * Abstract method implemented by subclasses to make a query to the live data + * source. Must call the callback function with the response returned from the + * query. Populates cache (if enabled). + * + * @method doQuery + * @param oCallbackFn {HTMLFunction} Callback function implemented by oParent to which to return results. + * @param sQuery {String} Query string. + * @param oParent {Object} The object instance that has requested data. + */ +YAHOO.widget.DataSource.prototype.doQuery = function(oCallbackFn, sQuery, oParent) { + /* override this */ +}; + +/** + * Flushes cache. + * + * @method flushCache + */ +YAHOO.widget.DataSource.prototype.flushCache = function() { + if(this._aCache) { + this._aCache = []; + } + if(this._aCacheHelper) { + this._aCacheHelper = []; + } + this.cacheFlushEvent.fire(this); +}; + +///////////////////////////////////////////////////////////////////////////// +// +// Public events +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Fired when a query is made to the live data source. + * + * @event queryEvent + * @param oSelf {Object} The DataSource instance. + * @param oParent {Object} The requesting object. + * @param sQuery {String} The query string. + */ +YAHOO.widget.DataSource.prototype.queryEvent = null; + +/** + * Fired when a query is made to the local cache. + * + * @event cacheQueryEvent + * @param oSelf {Object} The DataSource instance. + * @param oParent {Object} The requesting object. + * @param sQuery {String} The query string. + */ +YAHOO.widget.DataSource.prototype.cacheQueryEvent = null; + +/** + * Fired when data is retrieved from the live data source. + * + * @event getResultsEvent + * @param oSelf {Object} The DataSource instance. + * @param oParent {Object} The requesting object. + * @param sQuery {String} The query string. + * @param aResults {Object[]} Array of result objects. + */ +YAHOO.widget.DataSource.prototype.getResultsEvent = null; + +/** + * Fired when data is retrieved from the local cache. + * + * @event getCachedResultsEvent + * @param oSelf {Object} The DataSource instance. + * @param oParent {Object} The requesting object. + * @param sQuery {String} The query string. + * @param aResults {Object[]} Array of result objects. + */ +YAHOO.widget.DataSource.prototype.getCachedResultsEvent = null; + +/** + * Fired when an error is encountered with the live data source. + * + * @event dataErrorEvent + * @param oSelf {Object} The DataSource instance. + * @param oParent {Object} The requesting object. + * @param sQuery {String} The query string. + * @param sMsg {String} Error message string + */ +YAHOO.widget.DataSource.prototype.dataErrorEvent = null; + +/** + * Fired when the local cache is flushed. + * + * @event cacheFlushEvent + * @param oSelf {Object} The DataSource instance + */ +YAHOO.widget.DataSource.prototype.cacheFlushEvent = null; + +///////////////////////////////////////////////////////////////////////////// +// +// Private member variables +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Internal class variable to index multiple DataSource instances. + * + * @property _nIndex + * @type Number + * @private + * @static + */ +YAHOO.widget.DataSource._nIndex = 0; + +/** + * Name of DataSource instance. + * + * @property _sName + * @type String + * @private + */ +YAHOO.widget.DataSource.prototype._sName = null; + +/** + * Local cache of data result objects indexed chronologically. + * + * @property _aCache + * @type Object[] + * @private + */ +YAHOO.widget.DataSource.prototype._aCache = null; + + +///////////////////////////////////////////////////////////////////////////// +// +// Private methods +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Initializes DataSource instance. + * + * @method _init + * @private + */ +YAHOO.widget.DataSource.prototype._init = function() { + // Validate and initialize public configs + var maxCacheEntries = this.maxCacheEntries; + if(isNaN(maxCacheEntries) || (maxCacheEntries < 0)) { + maxCacheEntries = 0; + } + // Initialize local cache + if(maxCacheEntries > 0 && !this._aCache) { + this._aCache = []; + } + + this._sName = "instance" + YAHOO.widget.DataSource._nIndex; + YAHOO.widget.DataSource._nIndex++; + + this.queryEvent = new YAHOO.util.CustomEvent("query", this); + this.cacheQueryEvent = new YAHOO.util.CustomEvent("cacheQuery", this); + this.getResultsEvent = new YAHOO.util.CustomEvent("getResults", this); + this.getCachedResultsEvent = new YAHOO.util.CustomEvent("getCachedResults", this); + this.dataErrorEvent = new YAHOO.util.CustomEvent("dataError", this); + this.cacheFlushEvent = new YAHOO.util.CustomEvent("cacheFlush", this); +}; + +/** + * Adds a result object to the local cache, evicting the oldest element if the + * cache is full. Newer items will have higher indexes, the oldest item will have + * index of 0. + * + * @method _addCacheElem + * @param oResult {Object} Data result object, including array of results. + * @private + */ +YAHOO.widget.DataSource.prototype._addCacheElem = function(oResult) { + var aCache = this._aCache; + // Don't add if anything important is missing. + if(!aCache || !oResult || !oResult.query || !oResult.results) { + return; + } + + // If the cache is full, make room by removing from index=0 + if(aCache.length >= this.maxCacheEntries) { + aCache.shift(); + } + + // Add to cache, at the end of the array + aCache.push(oResult); +}; + +/** + * Queries the local cache for results. If query has been cached, the callback + * function is called with the results, and the cached is refreshed so that it + * is now the newest element. + * + * @method _doQueryCache + * @param oCallbackFn {HTMLFunction} Callback function defined by oParent object to which to return results. + * @param sQuery {String} Query string. + * @param oParent {Object} The object instance that has requested data. + * @return aResults {Object[]} Array of results from local cache if found, otherwise null. + * @private + */ +YAHOO.widget.DataSource.prototype._doQueryCache = function(oCallbackFn, sQuery, oParent) { + var aResults = []; + var bMatchFound = false; + var aCache = this._aCache; + var nCacheLength = (aCache) ? aCache.length : 0; + var bMatchContains = this.queryMatchContains; + + // If cache is enabled... + if((this.maxCacheEntries > 0) && aCache && (nCacheLength > 0)) { + this.cacheQueryEvent.fire(this, oParent, sQuery); + // If case is unimportant, normalize query now instead of in loops + if(!this.queryMatchCase) { + var sOrigQuery = sQuery; + sQuery = sQuery.toLowerCase(); + } + + // Loop through each cached element's query property... + for(var i = nCacheLength-1; i >= 0; i--) { + var resultObj = aCache[i]; + var aAllResultItems = resultObj.results; + // If case is unimportant, normalize match key for comparison + var matchKey = (!this.queryMatchCase) ? + encodeURIComponent(resultObj.query).toLowerCase(): + encodeURIComponent(resultObj.query); + + // If a cached match key exactly matches the query... + if(matchKey == sQuery) { + // Stash all result objects into aResult[] and stop looping through the cache. + bMatchFound = true; + aResults = aAllResultItems; + + // The matching cache element was not the most recent, + // so now we need to refresh the cache. + if(i != nCacheLength-1) { + // Remove element from its original location + aCache.splice(i,1); + // Add element as newest + this._addCacheElem(resultObj); + } + break; + } + // Else if this query is not an exact match and subset matching is enabled... + else if(this.queryMatchSubset) { + // Loop through substrings of each cached element's query property... + for(var j = sQuery.length-1; j >= 0 ; j--) { + var subQuery = sQuery.substr(0,j); + + // If a substring of a cached sQuery exactly matches the query... + if(matchKey == subQuery) { + bMatchFound = true; + + // Go through each cached result object to match against the query... + for(var k = aAllResultItems.length-1; k >= 0; k--) { + var aRecord = aAllResultItems[k]; + var sKeyIndex = (this.queryMatchCase) ? + encodeURIComponent(aRecord[0]).indexOf(sQuery): + encodeURIComponent(aRecord[0]).toLowerCase().indexOf(sQuery); + + // A STARTSWITH match is when the query is found at the beginning of the key string... + if((!bMatchContains && (sKeyIndex === 0)) || + // A CONTAINS match is when the query is found anywhere within the key string... + (bMatchContains && (sKeyIndex > -1))) { + // Stash a match into aResults[]. + aResults.unshift(aRecord); + } + } + + // Add the subset match result set object as the newest element to cache, + // and stop looping through the cache. + resultObj = {}; + resultObj.query = sQuery; + resultObj.results = aResults; + this._addCacheElem(resultObj); + break; + } + } + if(bMatchFound) { + break; + } + } + } + + // If there was a match, send along the results. + if(bMatchFound) { + this.getCachedResultsEvent.fire(this, oParent, sOrigQuery, aResults); + oCallbackFn(sOrigQuery, aResults, oParent); + } + } + return aResults; +}; + + +/****************************************************************************/ +/****************************************************************************/ +/****************************************************************************/ + +/** + * Implementation of YAHOO.widget.DataSource using XML HTTP requests that return + * query results. + * + * @class DS_XHR + * @extends YAHOO.widget.DataSource + * @requires connection + * @constructor + * @param sScriptURI {String} Absolute or relative URI to script that returns query + * results as JSON, XML, or delimited flat-file data. + * @param aSchema {String[]} Data schema definition of results. + * @param oConfigs {Object} (optional) Object literal of config params. + */ +YAHOO.widget.DS_XHR = function(sScriptURI, aSchema, oConfigs) { + // Set any config params passed in to override defaults + if(typeof oConfigs == "object") { + for(var sConfig in oConfigs) { + this[sConfig] = oConfigs[sConfig]; + } + } + + // Initialization sequence + if(!aSchema || (aSchema.constructor != Array)) { + YAHOO.log("Could not instantiate XHR DataSource due to invalid arguments", "error", this.toString()); + return; + } + else { + this.schema = aSchema; + } + this.scriptURI = sScriptURI; + this._init(); + YAHOO.log("XHR DataSource initialized","info",this.toString()); +}; + +YAHOO.widget.DS_XHR.prototype = new YAHOO.widget.DataSource(); + +///////////////////////////////////////////////////////////////////////////// +// +// Public constants +// +///////////////////////////////////////////////////////////////////////////// + +/** + * JSON data type. + * + * @property TYPE_JSON + * @type Number + * @static + * @final + */ +YAHOO.widget.DS_XHR.TYPE_JSON = 0; + +/** + * XML data type. + * + * @property TYPE_XML + * @type Number + * @static + * @final + */ +YAHOO.widget.DS_XHR.TYPE_XML = 1; + +/** + * Flat-file data type. + * + * @property TYPE_FLAT + * @type Number + * @static + * @final + */ +YAHOO.widget.DS_XHR.TYPE_FLAT = 2; + +/** + * Error message for XHR failure. + * + * @property ERROR_DATAXHR + * @type String + * @static + * @final + */ +YAHOO.widget.DS_XHR.ERROR_DATAXHR = "XHR response failed"; + +///////////////////////////////////////////////////////////////////////////// +// +// Public member variables +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Alias to YUI Connection Manager. Allows implementers to specify their own + * subclasses of the YUI Connection Manager utility. + * + * @property connMgr + * @type Object + * @default YAHOO.util.Connect + */ +YAHOO.widget.DS_XHR.prototype.connMgr = YAHOO.util.Connect; + +/** + * Number of milliseconds the XHR connection will wait for a server response. A + * a value of zero indicates the XHR connection will wait forever. Any value + * greater than zero will use the Connection utility's Auto-Abort feature. + * + * @property connTimeout + * @type Number + * @default 0 + */ +YAHOO.widget.DS_XHR.prototype.connTimeout = 0; + +/** + * Absolute or relative URI to script that returns query results. For instance, + * queries will be sent to <scriptURI>?<scriptQueryParam>=userinput + * + * @property scriptURI + * @type String + */ +YAHOO.widget.DS_XHR.prototype.scriptURI = null; + +/** + * Query string parameter name sent to scriptURI. For instance, queries will be + * sent to <scriptURI>?<scriptQueryParam>=userinput + * + * @property scriptQueryParam + * @type String + * @default "query" + */ +YAHOO.widget.DS_XHR.prototype.scriptQueryParam = "query"; + +/** + * String of key/value pairs to append to requests made to scriptURI. Define + * this string when you want to send additional query parameters to your script. + * When defined, queries will be sent to + * <scriptURI>?<scriptQueryParam>=userinput&<scriptQueryAppend> + * + * @property scriptQueryAppend + * @type String + * @default "" + */ +YAHOO.widget.DS_XHR.prototype.scriptQueryAppend = ""; + +/** + * XHR response data type. Other types that may be defined are YAHOO.widget.DS_XHR.TYPE_XML + * and YAHOO.widget.DS_XHR.TYPE_FLAT. + * + * @property responseType + * @type String + * @default YAHOO.widget.DS_XHR.TYPE_JSON + */ +YAHOO.widget.DS_XHR.prototype.responseType = YAHOO.widget.DS_XHR.TYPE_JSON; + +/** + * String after which to strip results. If the results from the XHR are sent + * back as HTML, the gzip HTML comment appears at the end of the data and should + * be ignored. + * + * @property responseStripAfter + * @type String + * @default "\n<!-" + */ +YAHOO.widget.DS_XHR.prototype.responseStripAfter = "\n 0) { + sUri += "&" + this.scriptQueryAppend; + } + YAHOO.log("DataSource is querying URL " + sUri, "info", this.toString()); + var oResponse = null; + + var oSelf = this; + /* + * Sets up ajax request callback + * + * @param {object} oReq HTTPXMLRequest object + * @private + */ + var responseSuccess = function(oResp) { + // Response ID does not match last made request ID. + if(!oSelf._oConn || (oResp.tId != oSelf._oConn.tId)) { + oSelf.dataErrorEvent.fire(oSelf, oParent, sQuery, YAHOO.widget.DataSource.ERROR_DATANULL); + YAHOO.log(YAHOO.widget.DataSource.ERROR_DATANULL, "error", this.toString()); + return; + } +//DEBUG +/*YAHOO.log(oResp.responseXML.getElementsByTagName("Result"),'warn'); +for(var foo in oResp) { + YAHOO.log(foo + ": "+oResp[foo],'warn'); +} +YAHOO.log('responseXML.xml: '+oResp.responseXML.xml,'warn');*/ + if(!isXML) { + oResp = oResp.responseText; + } + else { + oResp = oResp.responseXML; + } + if(oResp === null) { + oSelf.dataErrorEvent.fire(oSelf, oParent, sQuery, YAHOO.widget.DataSource.ERROR_DATANULL); + YAHOO.log(YAHOO.widget.DataSource.ERROR_DATANULL, "error", oSelf.toString()); + return; + } + + var aResults = oSelf.parseResponse(sQuery, oResp, oParent); + var resultObj = {}; + resultObj.query = decodeURIComponent(sQuery); + resultObj.results = aResults; + if(aResults === null) { + oSelf.dataErrorEvent.fire(oSelf, oParent, sQuery, YAHOO.widget.DataSource.ERROR_DATAPARSE); + YAHOO.log(YAHOO.widget.DataSource.ERROR_DATAPARSE, "error", oSelf.toString()); + aResults = []; + } + else { + oSelf.getResultsEvent.fire(oSelf, oParent, sQuery, aResults); + oSelf._addCacheElem(resultObj); + } + oCallbackFn(sQuery, aResults, oParent); + }; + + var responseFailure = function(oResp) { + oSelf.dataErrorEvent.fire(oSelf, oParent, sQuery, YAHOO.widget.DS_XHR.ERROR_DATAXHR); + YAHOO.log(YAHOO.widget.DS_XHR.ERROR_DATAXHR + ": " + oResp.statusText, "error", oSelf.toString()); + return; + }; + + var oCallback = { + success:responseSuccess, + failure:responseFailure + }; + + if(!isNaN(this.connTimeout) && this.connTimeout > 0) { + oCallback.timeout = this.connTimeout; + } + + if(this._oConn) { + this.connMgr.abort(this._oConn); + } + + oSelf._oConn = this.connMgr.asyncRequest("GET", sUri, oCallback, null); +}; + +/** + * Parses raw response data into an array of result objects. The result data key + * is always stashed in the [0] element of each result object. + * + * @method parseResponse + * @param sQuery {String} Query string. + * @param oResponse {Object} The raw response data to parse. + * @param oParent {Object} The object instance that has requested data. + * @returns {Object[]} Array of result objects. + */ +YAHOO.widget.DS_XHR.prototype.parseResponse = function(sQuery, oResponse, oParent) { + var aSchema = this.schema; + var aResults = []; + var bError = false; + + // Strip out comment at the end of results + var nEnd = ((this.responseStripAfter !== "") && (oResponse.indexOf)) ? + oResponse.indexOf(this.responseStripAfter) : -1; + if(nEnd != -1) { + oResponse = oResponse.substring(0,nEnd); + } + + switch (this.responseType) { + case YAHOO.widget.DS_XHR.TYPE_JSON: + var jsonList; + // Divert KHTML clients from JSON lib + if(window.JSON && (navigator.userAgent.toLowerCase().indexOf('khtml')== -1)) { + // Use the JSON utility if available + var jsonObjParsed = JSON.parse(oResponse); + if(!jsonObjParsed) { + bError = true; + break; + } + else { + try { + // eval is necessary here since aSchema[0] is of unknown depth + jsonList = eval("jsonObjParsed." + aSchema[0]); + } + catch(e) { + bError = true; + break; + } + } + } + else { + // Parse the JSON response as a string + try { + // Trim leading spaces + while (oResponse.substring(0,1) == " ") { + oResponse = oResponse.substring(1, oResponse.length); + } + + // Invalid JSON response + if(oResponse.indexOf("{") < 0) { + bError = true; + break; + } + + // Empty (but not invalid) JSON response + if(oResponse.indexOf("{}") === 0) { + break; + } + + // Turn the string into an object literal... + // ...eval is necessary here + var jsonObjRaw = eval("(" + oResponse + ")"); + if(!jsonObjRaw) { + bError = true; + break; + } + + // Grab the object member that contains an array of all reponses... + // ...eval is necessary here since aSchema[0] is of unknown depth + jsonList = eval("(jsonObjRaw." + aSchema[0]+")"); + } + catch(e) { + bError = true; + break; + } + } + + if(!jsonList) { + bError = true; + break; + } + + if(jsonList.constructor != Array) { + jsonList = [jsonList]; + } + + // Loop through the array of all responses... + for(var i = jsonList.length-1; i >= 0 ; i--) { + var aResultItem = []; + var jsonResult = jsonList[i]; + // ...and loop through each data field value of each response + for(var j = aSchema.length-1; j >= 1 ; j--) { + // ...and capture data into an array mapped according to the schema... + var dataFieldValue = jsonResult[aSchema[j]]; + if(!dataFieldValue) { + dataFieldValue = ""; + } + //YAHOO.log("data: " + i + " value:" +j+" = "+dataFieldValue,"debug",this.toString()); + aResultItem.unshift(dataFieldValue); + } + // If schema isn't well defined, pass along the entire result object + if(aResultItem.length == 1) { + aResultItem.push(jsonResult); + } + // Capture the array of data field values in an array of results + aResults.unshift(aResultItem); + } + break; + case YAHOO.widget.DS_XHR.TYPE_XML: + // Get the collection of results + var xmlList = oResponse.getElementsByTagName(aSchema[0]); + if(!xmlList) { + bError = true; + break; + } + // Loop through each result + for(var k = xmlList.length-1; k >= 0 ; k--) { + var result = xmlList.item(k); + //YAHOO.log("Result"+k+" is "+result.attributes.item(0).firstChild.nodeValue,"debug",this.toString()); + var aFieldSet = []; + // Loop through each data field in each result using the schema + for(var m = aSchema.length-1; m >= 1 ; m--) { + //YAHOO.log(aSchema[m]+" is "+result.attributes.getNamedItem(aSchema[m]).firstChild.nodeValue); + var sValue = null; + // Values may be held in an attribute... + var xmlAttr = result.attributes.getNamedItem(aSchema[m]); + if(xmlAttr) { + sValue = xmlAttr.value; + //YAHOO.log("Attr value is "+sValue,"debug",this.toString()); + } + // ...or in a node + else{ + var xmlNode = result.getElementsByTagName(aSchema[m]); + if(xmlNode && xmlNode.item(0) && xmlNode.item(0).firstChild) { + sValue = xmlNode.item(0).firstChild.nodeValue; + //YAHOO.log("Node value is "+sValue,"debug",this.toString()); + } + else { + sValue = ""; + //YAHOO.log("Value not found","debug",this.toString()); + } + } + // Capture the schema-mapped data field values into an array + aFieldSet.unshift(sValue); + } + // Capture each array of values into an array of results + aResults.unshift(aFieldSet); + } + break; + case YAHOO.widget.DS_XHR.TYPE_FLAT: + if(oResponse.length > 0) { + // Delete the last line delimiter at the end of the data if it exists + var newLength = oResponse.length-aSchema[0].length; + if(oResponse.substr(newLength) == aSchema[0]) { + oResponse = oResponse.substr(0, newLength); + } + var aRecords = oResponse.split(aSchema[0]); + for(var n = aRecords.length-1; n >= 0; n--) { + aResults[n] = aRecords[n].split(aSchema[1]); + } + } + break; + default: + break; + } + sQuery = null; + oResponse = null; + oParent = null; + if(bError) { + return null; + } + else { + return aResults; + } +}; + +///////////////////////////////////////////////////////////////////////////// +// +// Private member variables +// +///////////////////////////////////////////////////////////////////////////// + +/** + * XHR connection object. + * + * @property _oConn + * @type Object + * @private + */ +YAHOO.widget.DS_XHR.prototype._oConn = null; + + +/****************************************************************************/ +/****************************************************************************/ +/****************************************************************************/ + +/** + * Implementation of YAHOO.widget.DataSource using a native Javascript function as + * its live data source. + * + * @class DS_JSFunction + * @constructor + * @extends YAHOO.widget.DataSource + * @param oFunction {HTMLFunction} In-memory Javascript function that returns query results as an array of objects. + * @param oConfigs {Object} (optional) Object literal of config params. + */ +YAHOO.widget.DS_JSFunction = function(oFunction, oConfigs) { + // Set any config params passed in to override defaults + if(typeof oConfigs == "object") { + for(var sConfig in oConfigs) { + this[sConfig] = oConfigs[sConfig]; + } + } + + // Initialization sequence + if(!oFunction || (oFunction.constructor != Function)) { + YAHOO.log("Could not instantiate JSFunction DataSource due to invalid arguments", "error", this.toString()); + return; + } + else { + this.dataFunction = oFunction; + this._init(); + YAHOO.log("JS Function DataSource initialized","info",this.toString()); + } +}; + +YAHOO.widget.DS_JSFunction.prototype = new YAHOO.widget.DataSource(); + +///////////////////////////////////////////////////////////////////////////// +// +// Public member variables +// +///////////////////////////////////////////////////////////////////////////// + +/** + * In-memory Javascript function that returns query results. + * + * @property dataFunction + * @type HTMLFunction + */ +YAHOO.widget.DS_JSFunction.prototype.dataFunction = null; + +///////////////////////////////////////////////////////////////////////////// +// +// Public methods +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Queries the live data source defined by function for results. Results are + * passed back to a callback function. + * + * @method doQuery + * @param oCallbackFn {HTMLFunction} Callback function defined by oParent object to which to return results. + * @param sQuery {String} Query string. + * @param oParent {Object} The object instance that has requested data. + */ +YAHOO.widget.DS_JSFunction.prototype.doQuery = function(oCallbackFn, sQuery, oParent) { + var oFunction = this.dataFunction; + var aResults = []; + + aResults = oFunction(sQuery); + if(aResults === null) { + this.dataErrorEvent.fire(this, oParent, sQuery, YAHOO.widget.DataSource.ERROR_DATANULL); + YAHOO.log(YAHOO.widget.DataSource.ERROR_DATANULL, "error", this.toString()); + return; + } + + var resultObj = {}; + resultObj.query = decodeURIComponent(sQuery); + resultObj.results = aResults; + this._addCacheElem(resultObj); + + this.getResultsEvent.fire(this, oParent, sQuery, aResults); + oCallbackFn(sQuery, aResults, oParent); + return; +}; + +/****************************************************************************/ +/****************************************************************************/ +/****************************************************************************/ + +/** + * Implementation of YAHOO.widget.DataSource using a native Javascript array as + * its live data source. + * + * @class DS_JSArray + * @constructor + * @extends YAHOO.widget.DataSource + * @param aData {String[]} In-memory Javascript array of simple string data. + * @param oConfigs {Object} (optional) Object literal of config params. + */ +YAHOO.widget.DS_JSArray = function(aData, oConfigs) { + // Set any config params passed in to override defaults + if(typeof oConfigs == "object") { + for(var sConfig in oConfigs) { + this[sConfig] = oConfigs[sConfig]; + } + } + + // Initialization sequence + if(!aData || (aData.constructor != Array)) { + YAHOO.log("Could not instantiate JSArray DataSource due to invalid arguments", "error", this.toString()); + return; + } + else { + this.data = aData; + this._init(); + YAHOO.log("JS Array DataSource initialized","info",this.toString()); + } +}; + +YAHOO.widget.DS_JSArray.prototype = new YAHOO.widget.DataSource(); + +///////////////////////////////////////////////////////////////////////////// +// +// Public member variables +// +///////////////////////////////////////////////////////////////////////////// + +/** + * In-memory Javascript array of strings. + * + * @property data + * @type Array + */ +YAHOO.widget.DS_JSArray.prototype.data = null; + +///////////////////////////////////////////////////////////////////////////// +// +// Public methods +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Queries the live data source defined by data for results. Results are passed + * back to a callback function. + * + * @method doQuery + * @param oCallbackFn {HTMLFunction} Callback function defined by oParent object to which to return results. + * @param sQuery {String} Query string. + * @param oParent {Object} The object instance that has requested data. + */ +YAHOO.widget.DS_JSArray.prototype.doQuery = function(oCallbackFn, sQuery, oParent) { + var aData = this.data; // the array + var aResults = []; // container for results + var bMatchFound = false; + var bMatchContains = this.queryMatchContains; + if(sQuery) { + if(!this.queryMatchCase) { + sQuery = sQuery.toLowerCase(); + } + + // Loop through each element of the array... + // which can be a string or an array of strings + for(var i = aData.length-1; i >= 0; i--) { + var aDataset = []; + + if(aData[i]) { + if(aData[i].constructor == String) { + aDataset[0] = aData[i]; + } + else if(aData[i].constructor == Array) { + aDataset = aData[i]; + } + } + + if(aDataset[0] && (aDataset[0].constructor == String)) { + var sKeyIndex = (this.queryMatchCase) ? + encodeURIComponent(aDataset[0]).indexOf(sQuery): + encodeURIComponent(aDataset[0]).toLowerCase().indexOf(sQuery); + + // A STARTSWITH match is when the query is found at the beginning of the key string... + if((!bMatchContains && (sKeyIndex === 0)) || + // A CONTAINS match is when the query is found anywhere within the key string... + (bMatchContains && (sKeyIndex > -1))) { + // Stash a match into aResults[]. + aResults.unshift(aDataset); + } + } + } + } + + this.getResultsEvent.fire(this, oParent, sQuery, aResults); + oCallbackFn(sQuery, aResults, oParent); +}; + +YAHOO.register("autocomplete", YAHOO.widget.AutoComplete, {version: "2.2.0", build: "127"}); diff --git a/interface/ispconfig/interface/js/yui/autocomplete/autocomplete-min.js b/interface/ispconfig/interface/js/yui/autocomplete/autocomplete-min.js new file mode 100644 index 0000000000000000000000000000000000000000..f15e718970360f8b3fbcfbab81c6052062aed6c6 --- /dev/null +++ b/interface/ispconfig/interface/js/yui/autocomplete/autocomplete-min.js @@ -0,0 +1,183 @@ +/* +Copyright (c) 2007, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.2.0 +*/ + +YAHOO.widget.AutoComplete=function(elInput,elContainer,oDataSource,oConfigs){if(elInput&&elContainer&&oDataSource){if(oDataSource&&(oDataSource instanceof YAHOO.widget.DataSource)){this.dataSource=oDataSource;} +else{return;} +if(YAHOO.util.Dom.inDocument(elInput)){if(typeof elInput=="string"){this._sName="instance"+YAHOO.widget.AutoComplete._nIndex+" "+elInput;this._oTextbox=document.getElementById(elInput);} +else{this._sName=(elInput.id)?"instance"+YAHOO.widget.AutoComplete._nIndex+" "+elInput.id:"instance"+YAHOO.widget.AutoComplete._nIndex;this._oTextbox=elInput;}} +else{return;} +if(YAHOO.util.Dom.inDocument(elContainer)){if(typeof elContainer=="string"){this._oContainer=document.getElementById(elContainer);} +else{this._oContainer=elContainer;} +if(this._oContainer.style.display=="none"){}} +else{return;} +if(typeof oConfigs=="object"){for(var sConfig in oConfigs){if(sConfig){this[sConfig]=oConfigs[sConfig];}}} +this._initContainer();this._initProps();this._initList();this._initContainerHelpers();var oSelf=this;var oTextbox=this._oTextbox;var oContent=this._oContainer._oContent;YAHOO.util.Event.addListener(oTextbox,"keyup",oSelf._onTextboxKeyUp,oSelf);YAHOO.util.Event.addListener(oTextbox,"keydown",oSelf._onTextboxKeyDown,oSelf);YAHOO.util.Event.addListener(oTextbox,"focus",oSelf._onTextboxFocus,oSelf);YAHOO.util.Event.addListener(oTextbox,"blur",oSelf._onTextboxBlur,oSelf);YAHOO.util.Event.addListener(oContent,"mouseover",oSelf._onContainerMouseover,oSelf);YAHOO.util.Event.addListener(oContent,"mouseout",oSelf._onContainerMouseout,oSelf);YAHOO.util.Event.addListener(oContent,"scroll",oSelf._onContainerScroll,oSelf);YAHOO.util.Event.addListener(oContent,"resize",oSelf._onContainerResize,oSelf);if(oTextbox.form){YAHOO.util.Event.addListener(oTextbox.form,"submit",oSelf._onFormSubmit,oSelf);} +YAHOO.util.Event.addListener(oTextbox,"keypress",oSelf._onTextboxKeyPress,oSelf);this.textboxFocusEvent=new YAHOO.util.CustomEvent("textboxFocus",this);this.textboxKeyEvent=new YAHOO.util.CustomEvent("textboxKey",this);this.dataRequestEvent=new YAHOO.util.CustomEvent("dataRequest",this);this.dataReturnEvent=new YAHOO.util.CustomEvent("dataReturn",this);this.dataErrorEvent=new YAHOO.util.CustomEvent("dataError",this);this.containerExpandEvent=new YAHOO.util.CustomEvent("containerExpand",this);this.typeAheadEvent=new YAHOO.util.CustomEvent("typeAhead",this);this.itemMouseOverEvent=new YAHOO.util.CustomEvent("itemMouseOver",this);this.itemMouseOutEvent=new YAHOO.util.CustomEvent("itemMouseOut",this);this.itemArrowToEvent=new YAHOO.util.CustomEvent("itemArrowTo",this);this.itemArrowFromEvent=new YAHOO.util.CustomEvent("itemArrowFrom",this);this.itemSelectEvent=new YAHOO.util.CustomEvent("itemSelect",this);this.unmatchedItemSelectEvent=new YAHOO.util.CustomEvent("unmatchedItemSelect",this);this.selectionEnforceEvent=new YAHOO.util.CustomEvent("selectionEnforce",this);this.containerCollapseEvent=new YAHOO.util.CustomEvent("containerCollapse",this);this.textboxBlurEvent=new YAHOO.util.CustomEvent("textboxBlur",this);oTextbox.setAttribute("autocomplete","off");YAHOO.widget.AutoComplete._nIndex++;} +else{}};YAHOO.widget.AutoComplete.prototype.dataSource=null;YAHOO.widget.AutoComplete.prototype.minQueryLength=1;YAHOO.widget.AutoComplete.prototype.maxResultsDisplayed=10;YAHOO.widget.AutoComplete.prototype.queryDelay=0.5;YAHOO.widget.AutoComplete.prototype.highlightClassName="yui-ac-highlight";YAHOO.widget.AutoComplete.prototype.prehighlightClassName=null;YAHOO.widget.AutoComplete.prototype.delimChar=null;YAHOO.widget.AutoComplete.prototype.autoHighlight=true;YAHOO.widget.AutoComplete.prototype.typeAhead=false;YAHOO.widget.AutoComplete.prototype.animHoriz=false;YAHOO.widget.AutoComplete.prototype.animVert=true;YAHOO.widget.AutoComplete.prototype.animSpeed=0.3;YAHOO.widget.AutoComplete.prototype.forceSelection=false;YAHOO.widget.AutoComplete.prototype.allowBrowserAutocomplete=true;YAHOO.widget.AutoComplete.prototype.alwaysShowContainer=false;YAHOO.widget.AutoComplete.prototype.useIFrame=false;YAHOO.widget.AutoComplete.prototype.useShadow=false;YAHOO.widget.AutoComplete.prototype.toString=function(){return"AutoComplete "+this._sName;};YAHOO.widget.AutoComplete.prototype.isContainerOpen=function(){return this._bContainerOpen;};YAHOO.widget.AutoComplete.prototype.getListItems=function(){return this._aListItems;};YAHOO.widget.AutoComplete.prototype.getListItemData=function(oListItem){if(oListItem._oResultData){return oListItem._oResultData;} +else{return false;}};YAHOO.widget.AutoComplete.prototype.setHeader=function(sHeader){if(sHeader){if(this._oContainer._oContent._oHeader){this._oContainer._oContent._oHeader.innerHTML=sHeader;this._oContainer._oContent._oHeader.style.display="block";}} +else{this._oContainer._oContent._oHeader.innerHTML="";this._oContainer._oContent._oHeader.style.display="none";}};YAHOO.widget.AutoComplete.prototype.setFooter=function(sFooter){if(sFooter){if(this._oContainer._oContent._oFooter){this._oContainer._oContent._oFooter.innerHTML=sFooter;this._oContainer._oContent._oFooter.style.display="block";}} +else{this._oContainer._oContent._oFooter.innerHTML="";this._oContainer._oContent._oFooter.style.display="none";}};YAHOO.widget.AutoComplete.prototype.setBody=function(sBody){if(sBody){if(this._oContainer._oContent._oBody){this._oContainer._oContent._oBody.innerHTML=sBody;this._oContainer._oContent._oBody.style.display="block";this._oContainer._oContent.style.display="block";}} +else{this._oContainer._oContent._oBody.innerHTML="";this._oContainer._oContent.style.display="none";} +this._maxResultsDisplayed=0;};YAHOO.widget.AutoComplete.prototype.formatResult=function(oResultItem,sQuery){var sResult=oResultItem[0];if(sResult){return sResult;} +else{return"";}};YAHOO.widget.AutoComplete.prototype.doBeforeExpandContainer=function(oResultItem,sQuery){return true;};YAHOO.widget.AutoComplete.prototype.sendQuery=function(sQuery){this._sendQuery(sQuery);};YAHOO.widget.AutoComplete.prototype.textboxFocusEvent=null;YAHOO.widget.AutoComplete.prototype.textboxKeyEvent=null;YAHOO.widget.AutoComplete.prototype.dataRequestEvent=null;YAHOO.widget.AutoComplete.prototype.dataReturnEvent=null;YAHOO.widget.AutoComplete.prototype.dataErrorEvent=null;YAHOO.widget.AutoComplete.prototype.containerExpandEvent=null;YAHOO.widget.AutoComplete.prototype.typeAheadEvent=null;YAHOO.widget.AutoComplete.prototype.itemMouseOverEvent=null;YAHOO.widget.AutoComplete.prototype.itemMouseOutEvent=null;YAHOO.widget.AutoComplete.prototype.itemArrowToEvent=null;YAHOO.widget.AutoComplete.prototype.itemArrowFromEvent=null;YAHOO.widget.AutoComplete.prototype.itemSelectEvent=null;YAHOO.widget.AutoComplete.prototype.unmatchedItemSelectEvent=null;YAHOO.widget.AutoComplete.prototype.selectionEnforceEvent=null;YAHOO.widget.AutoComplete.prototype.containerCollapseEvent=null;YAHOO.widget.AutoComplete.prototype.textboxBlurEvent=null;YAHOO.widget.AutoComplete._nIndex=0;YAHOO.widget.AutoComplete.prototype._sName=null;YAHOO.widget.AutoComplete.prototype._oTextbox=null;YAHOO.widget.AutoComplete.prototype._bFocused=true;YAHOO.widget.AutoComplete.prototype._oAnim=null;YAHOO.widget.AutoComplete.prototype._oContainer=null;YAHOO.widget.AutoComplete.prototype._bContainerOpen=false;YAHOO.widget.AutoComplete.prototype._bOverContainer=false;YAHOO.widget.AutoComplete.prototype._aListItems=null;YAHOO.widget.AutoComplete.prototype._nDisplayedItems=0;YAHOO.widget.AutoComplete.prototype._maxResultsDisplayed=0;YAHOO.widget.AutoComplete.prototype._sCurQuery=null;YAHOO.widget.AutoComplete.prototype._sSavedQuery=null;YAHOO.widget.AutoComplete.prototype._oCurItem=null;YAHOO.widget.AutoComplete.prototype._bItemSelected=false;YAHOO.widget.AutoComplete.prototype._nKeyCode=null;YAHOO.widget.AutoComplete.prototype._nDelayID=-1;YAHOO.widget.AutoComplete.prototype._iFrameSrc="javascript:false;";YAHOO.widget.AutoComplete.prototype._queryInterval=null;YAHOO.widget.AutoComplete.prototype._sLastTextboxValue=null;YAHOO.widget.AutoComplete.prototype._initProps=function(){var minQueryLength=this.minQueryLength;if(isNaN(minQueryLength)||(minQueryLength<1)){minQueryLength=1;} +var maxResultsDisplayed=this.maxResultsDisplayed;if(isNaN(this.maxResultsDisplayed)||(this.maxResultsDisplayed<1)){this.maxResultsDisplayed=10;} +var queryDelay=this.queryDelay;if(isNaN(this.queryDelay)||(this.queryDelay<0)){this.queryDelay=0.5;} +var aDelimChar=(this.delimChar)?this.delimChar:null;if(aDelimChar){if(typeof aDelimChar=="string"){this.delimChar=[aDelimChar];} +else if(aDelimChar.constructor!=Array){this.delimChar=null;}} +var animSpeed=this.animSpeed;if((this.animHoriz||this.animVert)&&YAHOO.util.Anim){if(isNaN(animSpeed)||(animSpeed<0)){animSpeed=0.3;} +if(!this._oAnim){oAnim=new YAHOO.util.Anim(this._oContainer._oContent,{},this.animSpeed);this._oAnim=oAnim;} +else{this._oAnim.duration=animSpeed;}} +if(this.forceSelection&&this.delimChar){}};YAHOO.widget.AutoComplete.prototype._initContainerHelpers=function(){if(this.useShadow&&!this._oContainer._oShadow){var oShadow=document.createElement("div");oShadow.className="yui-ac-shadow";this._oContainer._oShadow=this._oContainer.appendChild(oShadow);} +if(this.useIFrame&&!this._oContainer._oIFrame){var oIFrame=document.createElement("iframe");oIFrame.src=this._iFrameSrc;oIFrame.frameBorder=0;oIFrame.scrolling="no";oIFrame.style.position="absolute";oIFrame.style.width="100%";oIFrame.style.height="100%";oIFrame.tabIndex=-1;this._oContainer._oIFrame=this._oContainer.appendChild(oIFrame);}};YAHOO.widget.AutoComplete.prototype._initContainer=function(){if(!this._oContainer._oContent){var oContent=document.createElement("div");oContent.className="yui-ac-content";oContent.style.display="none";this._oContainer._oContent=this._oContainer.appendChild(oContent);var oHeader=document.createElement("div");oHeader.className="yui-ac-hd";oHeader.style.display="none";this._oContainer._oContent._oHeader=this._oContainer._oContent.appendChild(oHeader);var oBody=document.createElement("div");oBody.className="yui-ac-bd";this._oContainer._oContent._oBody=this._oContainer._oContent.appendChild(oBody);var oFooter=document.createElement("div");oFooter.className="yui-ac-ft";oFooter.style.display="none";this._oContainer._oContent._oFooter=this._oContainer._oContent.appendChild(oFooter);} +else{}};YAHOO.widget.AutoComplete.prototype._initList=function(){this._aListItems=[];while(this._oContainer._oContent._oBody.hasChildNodes()){var oldListItems=this.getListItems();if(oldListItems){for(var oldi=oldListItems.length-1;oldi>=0;i--){oldListItems[oldi]=null;}} +this._oContainer._oContent._oBody.innerHTML="";} +var oList=document.createElement("ul");oList=this._oContainer._oContent._oBody.appendChild(oList);for(var i=0;i=18&&nKeyCode<=20)||(nKeyCode==27)||(nKeyCode>=33&&nKeyCode<=35)||(nKeyCode>=36&&nKeyCode<=38)||(nKeyCode==40)||(nKeyCode>=44&&nKeyCode<=45)){return true;} +return false;};YAHOO.widget.AutoComplete.prototype._sendQuery=function(sQuery){if(this.minQueryLength==-1){this._toggleContainer(false);return;} +var aDelimChar=(this.delimChar)?this.delimChar:null;if(aDelimChar){var nDelimIndex=-1;for(var i=aDelimChar.length-1;i>=0;i--){var nNewIndex=sQuery.lastIndexOf(aDelimChar[i]);if(nNewIndex>nDelimIndex){nDelimIndex=nNewIndex;}} +if(aDelimChar[i]==" "){for(var j=aDelimChar.length-1;j>=0;j--){if(sQuery[nDelimIndex-1]==aDelimChar[j]){nDelimIndex--;break;}}} +if(nDelimIndex>-1){var nQueryStart=nDelimIndex+1;while(sQuery.charAt(nQueryStart)==" "){nQueryStart+=1;} +this._sSavedQuery=sQuery.substring(0,nQueryStart);sQuery=sQuery.substr(nQueryStart);} +else if(sQuery.indexOf(this._sSavedQuery)<0){this._sSavedQuery=null;}} +if(sQuery&&(sQuery.length0)){if(this._nDelayID!=-1){clearTimeout(this._nDelayID);} +this._toggleContainer(false);return;} +sQuery=encodeURIComponent(sQuery);this._nDelayID=-1;this.dataRequestEvent.fire(this,sQuery);this.dataSource.getResults(this._populateList,sQuery,this);};YAHOO.widget.AutoComplete.prototype._populateList=function(sQuery,aResults,oSelf){if(aResults===null){oSelf.dataErrorEvent.fire(oSelf,sQuery);} +if(!oSelf._bFocused||!aResults){return;} +var isOpera=(navigator.userAgent.toLowerCase().indexOf("opera")!=-1);var contentStyle=oSelf._oContainer._oContent.style;contentStyle.width=(!isOpera)?null:"";contentStyle.height=(!isOpera)?null:"";var sCurQuery=decodeURIComponent(sQuery);oSelf._sCurQuery=sCurQuery;oSelf._bItemSelected=false;if(oSelf._maxResultsDisplayed!=oSelf.maxResultsDisplayed){oSelf._initList();} +var nItems=Math.min(aResults.length,oSelf.maxResultsDisplayed);oSelf._nDisplayedItems=nItems;if(nItems>0){oSelf._initContainerHelpers();var aItems=oSelf._aListItems;for(var i=nItems-1;i>=0;i--){var oItemi=aItems[i];var oResultItemi=aResults[i];oItemi.innerHTML=oSelf.formatResult(oResultItemi,sCurQuery);oItemi.style.display="list-item";oItemi._sResultKey=oResultItemi[0];oItemi._oResultData=oResultItemi;} +for(var j=aItems.length-1;j>=nItems;j--){var oItemj=aItems[j];oItemj.innerHTML=null;oItemj.style.display="none";oItemj._sResultKey=null;oItemj._oResultData=null;} +if(oSelf.autoHighlight){var oFirstItem=aItems[0];oSelf._toggleHighlight(oFirstItem,"to");oSelf.itemArrowToEvent.fire(oSelf,oFirstItem);oSelf._typeAhead(oFirstItem,sQuery);} +else{oSelf._oCurItem=null;} +var ok=oSelf.doBeforeExpandContainer(oSelf._oTextbox,oSelf._oContainer,sQuery,aResults);oSelf._toggleContainer(ok);} +else{oSelf._toggleContainer(false);} +oSelf.dataReturnEvent.fire(oSelf,sQuery,aResults);};YAHOO.widget.AutoComplete.prototype._clearSelection=function(){var sValue=this._oTextbox.value;var sChar=(this.delimChar)?this.delimChar[0]:null;var nIndex=(sChar)?sValue.lastIndexOf(sChar,sValue.length-2):-1;if(nIndex>-1){this._oTextbox.value=sValue.substring(0,nIndex);} +else{this._oTextbox.value="";} +this._sSavedQuery=this._oTextbox.value;this.selectionEnforceEvent.fire(this);};YAHOO.widget.AutoComplete.prototype._textMatchesOption=function(){var foundMatch=false;for(var i=this._nDisplayedItems-1;i>=0;i--){var oItem=this._aListItems[i];var sMatch=oItem._sResultKey.toLowerCase();if(sMatch==this._sCurQuery.toLowerCase()){foundMatch=true;break;}} +return(foundMatch);};YAHOO.widget.AutoComplete.prototype._typeAhead=function(oItem,sQuery){if(!this.typeAhead||(this._nKeyCode==8)){return;} +var oTextbox=this._oTextbox;var sValue=this._oTextbox.value;if(!oTextbox.setSelectionRange&&!oTextbox.createTextRange){return;} +var nStart=sValue.length;this._updateValue(oItem);var nEnd=oTextbox.value.length;this._selectText(oTextbox,nStart,nEnd);var sPrefill=oTextbox.value.substr(nStart,nEnd);this.typeAheadEvent.fire(this,sQuery,sPrefill);};YAHOO.widget.AutoComplete.prototype._selectText=function(oTextbox,nStart,nEnd){if(oTextbox.setSelectionRange){oTextbox.setSelectionRange(nStart,nEnd);} +else if(oTextbox.createTextRange){var oTextRange=oTextbox.createTextRange();oTextRange.moveStart("character",nStart);oTextRange.moveEnd("character",nEnd-oTextbox.value.length);oTextRange.select();} +else{oTextbox.select();}};YAHOO.widget.AutoComplete.prototype._toggleContainerHelpers=function(bShow){var bFireEvent=false;var width=this._oContainer._oContent.offsetWidth+"px";var height=this._oContainer._oContent.offsetHeight+"px";if(this.useIFrame&&this._oContainer._oIFrame){bFireEvent=true;if(bShow){this._oContainer._oIFrame.style.width=width;this._oContainer._oIFrame.style.height=height;} +else{this._oContainer._oIFrame.style.width=0;this._oContainer._oIFrame.style.height=0;}} +if(this.useShadow&&this._oContainer._oShadow){bFireEvent=true;if(bShow){this._oContainer._oShadow.style.width=width;this._oContainer._oShadow.style.height=height;} +else{this._oContainer._oShadow.style.width=0;this._oContainer._oShadow.style.height=0;}}};YAHOO.widget.AutoComplete.prototype._toggleContainer=function(bShow){var oContainer=this._oContainer;if(this.alwaysShowContainer&&this._bContainerOpen){return;} +if(!bShow){this._oContainer._oContent.scrollTop=0;var aItems=this._aListItems;if(aItems&&(aItems.length>0)){for(var i=aItems.length-1;i>=0;i--){aItems[i].style.display="none";}} +if(this._oCurItem){this._toggleHighlight(this._oCurItem,"from");} +this._oCurItem=null;this._nDisplayedItems=0;this._sCurQuery=null;} +if(!bShow&&!this._bContainerOpen){oContainer._oContent.style.display="none";return;} +var oAnim=this._oAnim;if(oAnim&&oAnim.getEl()&&(this.animHoriz||this.animVert)){if(!bShow){this._toggleContainerHelpers(bShow);} +if(oAnim.isAnimated()){oAnim.stop();} +var oClone=oContainer._oContent.cloneNode(true);oContainer.appendChild(oClone);oClone.style.top="-9000px";oClone.style.display="block";var wExp=oClone.offsetWidth;var hExp=oClone.offsetHeight;var wColl=(this.animHoriz)?0:wExp;var hColl=(this.animVert)?0:hExp;oAnim.attributes=(bShow)?{width:{to:wExp},height:{to:hExp}}:{width:{to:wColl},height:{to:hColl}};if(bShow&&!this._bContainerOpen){oContainer._oContent.style.width=wColl+"px";oContainer._oContent.style.height=hColl+"px";} +else{oContainer._oContent.style.width=wExp+"px";oContainer._oContent.style.height=hExp+"px";} +oContainer.removeChild(oClone);oClone=null;var oSelf=this;var onAnimComplete=function(){oAnim.onComplete.unsubscribeAll();if(bShow){oSelf.containerExpandEvent.fire(oSelf);} +else{oContainer._oContent.style.display="none";oSelf.containerCollapseEvent.fire(oSelf);} +oSelf._toggleContainerHelpers(bShow);};oContainer._oContent.style.display="block";oAnim.onComplete.subscribe(onAnimComplete);oAnim.animate();this._bContainerOpen=bShow;} +else{if(bShow){oContainer._oContent.style.display="block";this.containerExpandEvent.fire(this);} +else{oContainer._oContent.style.display="none";this.containerCollapseEvent.fire(this);} +this._toggleContainerHelpers(bShow);this._bContainerOpen=bShow;}};YAHOO.widget.AutoComplete.prototype._toggleHighlight=function(oNewItem,sType){var sHighlight=this.highlightClassName;if(this._oCurItem){YAHOO.util.Dom.removeClass(this._oCurItem,sHighlight);} +if((sType=="to")&&sHighlight){YAHOO.util.Dom.addClass(oNewItem,sHighlight);this._oCurItem=oNewItem;}};YAHOO.widget.AutoComplete.prototype._togglePrehighlight=function(oNewItem,sType){if(oNewItem==this._oCurItem){return;} +var sPrehighlight=this.prehighlightClassName;if((sType=="mouseover")&&sPrehighlight){YAHOO.util.Dom.addClass(oNewItem,sPrehighlight);} +else{YAHOO.util.Dom.removeClass(oNewItem,sPrehighlight);}};YAHOO.widget.AutoComplete.prototype._updateValue=function(oItem){var oTextbox=this._oTextbox;var sDelimChar=(this.delimChar)?(this.delimChar[0]||this.delimChar):null;var sSavedQuery=this._sSavedQuery;var sResultKey=oItem._sResultKey;oTextbox.focus();oTextbox.value="";if(sDelimChar){if(sSavedQuery){oTextbox.value=sSavedQuery;} +oTextbox.value+=sResultKey+sDelimChar;if(sDelimChar!=" "){oTextbox.value+=" ";}} +else{oTextbox.value=sResultKey;} +if(oTextbox.type=="textarea"){oTextbox.scrollTop=oTextbox.scrollHeight;} +var end=oTextbox.value.length;this._selectText(oTextbox,end,end);this._oCurItem=oItem;};YAHOO.widget.AutoComplete.prototype._selectItem=function(oItem){this._bItemSelected=true;this._updateValue(oItem);this._cancelIntervalDetection(this);this.itemSelectEvent.fire(this,oItem,oItem._oResultData);this._toggleContainer(false);};YAHOO.widget.AutoComplete.prototype._jumpSelection=function(){if(!this.typeAhead){return;} +else{this._toggleContainer(false);}};YAHOO.widget.AutoComplete.prototype._moveSelection=function(nKeyCode){if(this._bContainerOpen){var oCurItem=this._oCurItem;var nCurItemIndex=-1;if(oCurItem){nCurItemIndex=oCurItem._nItemIndex;} +var nNewItemIndex=(nKeyCode==40)?(nCurItemIndex+1):(nCurItemIndex-1);if(nNewItemIndex<-2||nNewItemIndex>=this._nDisplayedItems){return;} +if(oCurItem){this._toggleHighlight(oCurItem,"from");this.itemArrowFromEvent.fire(this,oCurItem);} +if(nNewItemIndex==-1){if(this.delimChar&&this._sSavedQuery){if(!this._textMatchesOption()){this._oTextbox.value=this._sSavedQuery;} +else{this._oTextbox.value=this._sSavedQuery+this._sCurQuery;}} +else{this._oTextbox.value=this._sCurQuery;} +this._oCurItem=null;return;} +if(nNewItemIndex==-2){this._toggleContainer(false);return;} +var oNewItem=this._aListItems[nNewItemIndex];var oContent=this._oContainer._oContent;var scrollOn=((YAHOO.util.Dom.getStyle(oContent,"overflow")=="auto")||(YAHOO.util.Dom.getStyle(oContent,"overflowY")=="auto"));if(scrollOn&&(nNewItemIndex>-1)&&(nNewItemIndex(oContent.scrollTop+oContent.offsetHeight)){oContent.scrollTop=(oNewItem.offsetTop+oNewItem.offsetHeight)-oContent.offsetHeight;} +else if((oNewItem.offsetTop+oNewItem.offsetHeight)(oContent.scrollTop+oContent.offsetHeight)){this._oContainer._oContent.scrollTop=(oNewItem.offsetTop+oNewItem.offsetHeight)-oContent.offsetHeight;}}} +this._toggleHighlight(oNewItem,"to");this.itemArrowToEvent.fire(this,oNewItem);if(this.typeAhead){this._updateValue(oNewItem);}}};YAHOO.widget.AutoComplete.prototype._onItemMouseover=function(v,oSelf){if(oSelf.prehighlightClassName){oSelf._togglePrehighlight(this,"mouseover");} +else{oSelf._toggleHighlight(this,"to");} +oSelf.itemMouseOverEvent.fire(oSelf,this);};YAHOO.widget.AutoComplete.prototype._onItemMouseout=function(v,oSelf){if(oSelf.prehighlightClassName){oSelf._togglePrehighlight(this,"mouseout");} +else{oSelf._toggleHighlight(this,"from");} +oSelf.itemMouseOutEvent.fire(oSelf,this);};YAHOO.widget.AutoComplete.prototype._onItemMouseclick=function(v,oSelf){oSelf._toggleHighlight(this,"to");oSelf._selectItem(this);};YAHOO.widget.AutoComplete.prototype._onContainerMouseover=function(v,oSelf){oSelf._bOverContainer=true;};YAHOO.widget.AutoComplete.prototype._onContainerMouseout=function(v,oSelf){oSelf._bOverContainer=false;if(oSelf._oCurItem){oSelf._toggleHighlight(oSelf._oCurItem,"to");}};YAHOO.widget.AutoComplete.prototype._onContainerScroll=function(v,oSelf){oSelf._oTextbox.focus();};YAHOO.widget.AutoComplete.prototype._onContainerResize=function(v,oSelf){oSelf._toggleContainerHelpers(oSelf._bContainerOpen);};YAHOO.widget.AutoComplete.prototype._onTextboxKeyDown=function(v,oSelf){var nKeyCode=v.keyCode;switch(nKeyCode){case 9:if(oSelf.delimChar&&(oSelf._nKeyCode!=nKeyCode)){if(oSelf._bContainerOpen){YAHOO.util.Event.stopEvent(v);}} +if(oSelf._oCurItem){oSelf._selectItem(oSelf._oCurItem);} +else{oSelf._toggleContainer(false);} +break;case 13:if(oSelf._nKeyCode!=nKeyCode){if(oSelf._bContainerOpen){YAHOO.util.Event.stopEvent(v);}} +if(oSelf._oCurItem){oSelf._selectItem(oSelf._oCurItem);} +else{oSelf._toggleContainer(false);} +break;case 27:oSelf._toggleContainer(false);return;case 39:oSelf._jumpSelection();break;case 38:YAHOO.util.Event.stopEvent(v);oSelf._moveSelection(nKeyCode);break;case 40:YAHOO.util.Event.stopEvent(v);oSelf._moveSelection(nKeyCode);break;default:break;}};YAHOO.widget.AutoComplete.prototype._onTextboxKeyPress=function(v,oSelf){var nKeyCode=v.keyCode;var isMac=(navigator.userAgent.toLowerCase().indexOf("mac")!=-1);if(isMac){switch(nKeyCode){case 9:if(oSelf.delimChar&&(oSelf._nKeyCode!=nKeyCode)){if(oSelf._bContainerOpen){YAHOO.util.Event.stopEvent(v);}} +break;case 13:if(oSelf._nKeyCode!=nKeyCode){if(oSelf._bContainerOpen){YAHOO.util.Event.stopEvent(v);}} +break;case 38:case 40:YAHOO.util.Event.stopEvent(v);break;default:break;}} +else if(nKeyCode==229){oSelf._queryInterval=setInterval(function(){oSelf._onIMEDetected(oSelf);},500);}};YAHOO.widget.AutoComplete.prototype._onTextboxKeyUp=function(v,oSelf){oSelf._initProps();var nKeyCode=v.keyCode;oSelf._nKeyCode=nKeyCode;var sText=this.value;if(oSelf._isIgnoreKey(nKeyCode)||(sText.toLowerCase()==oSelf._sCurQuery)){return;} +else{oSelf.textboxKeyEvent.fire(oSelf,nKeyCode);} +if(oSelf.queryDelay>0){var nDelayID=setTimeout(function(){oSelf._sendQuery(sText);},(oSelf.queryDelay*1000));if(oSelf._nDelayID!=-1){clearTimeout(oSelf._nDelayID);} +oSelf._nDelayID=nDelayID;} +else{oSelf._sendQuery(sText);}};YAHOO.widget.AutoComplete.prototype._onTextboxFocus=function(v,oSelf){oSelf._oTextbox.setAttribute("autocomplete","off");oSelf._bFocused=true;oSelf.textboxFocusEvent.fire(oSelf);};YAHOO.widget.AutoComplete.prototype._onTextboxBlur=function(v,oSelf){if(!oSelf._bOverContainer||(oSelf._nKeyCode==9)){if(!oSelf._bItemSelected){if(!oSelf._bContainerOpen||(oSelf._bContainerOpen&&!oSelf._textMatchesOption())){if(oSelf.forceSelection){oSelf._clearSelection();} +else{oSelf.unmatchedItemSelectEvent.fire(oSelf,oSelf._sCurQuery);}}} +if(oSelf._bContainerOpen){oSelf._toggleContainer(false);} +oSelf._cancelIntervalDetection(oSelf);oSelf._bFocused=false;oSelf.textboxBlurEvent.fire(oSelf);}};YAHOO.widget.AutoComplete.prototype._onFormSubmit=function(v,oSelf){if(oSelf.allowBrowserAutocomplete){oSelf._oTextbox.setAttribute("autocomplete","on");} +else{oSelf._oTextbox.setAttribute("autocomplete","off");}};YAHOO.widget.DataSource=function(){};YAHOO.widget.DataSource.ERROR_DATANULL="Response data was null";YAHOO.widget.DataSource.ERROR_DATAPARSE="Response data could not be parsed";YAHOO.widget.DataSource.prototype.maxCacheEntries=15;YAHOO.widget.DataSource.prototype.queryMatchContains=false;YAHOO.widget.DataSource.prototype.queryMatchSubset=false;YAHOO.widget.DataSource.prototype.queryMatchCase=false;YAHOO.widget.DataSource.prototype.toString=function(){return"DataSource "+this._sName;};YAHOO.widget.DataSource.prototype.getResults=function(oCallbackFn,sQuery,oParent){var aResults=this._doQueryCache(oCallbackFn,sQuery,oParent);if(aResults.length===0){this.queryEvent.fire(this,oParent,sQuery);this.doQuery(oCallbackFn,sQuery,oParent);}};YAHOO.widget.DataSource.prototype.doQuery=function(oCallbackFn,sQuery,oParent){};YAHOO.widget.DataSource.prototype.flushCache=function(){if(this._aCache){this._aCache=[];} +if(this._aCacheHelper){this._aCacheHelper=[];} +this.cacheFlushEvent.fire(this);};YAHOO.widget.DataSource.prototype.queryEvent=null;YAHOO.widget.DataSource.prototype.cacheQueryEvent=null;YAHOO.widget.DataSource.prototype.getResultsEvent=null;YAHOO.widget.DataSource.prototype.getCachedResultsEvent=null;YAHOO.widget.DataSource.prototype.dataErrorEvent=null;YAHOO.widget.DataSource.prototype.cacheFlushEvent=null;YAHOO.widget.DataSource._nIndex=0;YAHOO.widget.DataSource.prototype._sName=null;YAHOO.widget.DataSource.prototype._aCache=null;YAHOO.widget.DataSource.prototype._init=function(){var maxCacheEntries=this.maxCacheEntries;if(isNaN(maxCacheEntries)||(maxCacheEntries<0)){maxCacheEntries=0;} +if(maxCacheEntries>0&&!this._aCache){this._aCache=[];} +this._sName="instance"+YAHOO.widget.DataSource._nIndex;YAHOO.widget.DataSource._nIndex++;this.queryEvent=new YAHOO.util.CustomEvent("query",this);this.cacheQueryEvent=new YAHOO.util.CustomEvent("cacheQuery",this);this.getResultsEvent=new YAHOO.util.CustomEvent("getResults",this);this.getCachedResultsEvent=new YAHOO.util.CustomEvent("getCachedResults",this);this.dataErrorEvent=new YAHOO.util.CustomEvent("dataError",this);this.cacheFlushEvent=new YAHOO.util.CustomEvent("cacheFlush",this);};YAHOO.widget.DataSource.prototype._addCacheElem=function(oResult){var aCache=this._aCache;if(!aCache||!oResult||!oResult.query||!oResult.results){return;} +if(aCache.length>=this.maxCacheEntries){aCache.shift();} +aCache.push(oResult);};YAHOO.widget.DataSource.prototype._doQueryCache=function(oCallbackFn,sQuery,oParent){var aResults=[];var bMatchFound=false;var aCache=this._aCache;var nCacheLength=(aCache)?aCache.length:0;var bMatchContains=this.queryMatchContains;if((this.maxCacheEntries>0)&&aCache&&(nCacheLength>0)){this.cacheQueryEvent.fire(this,oParent,sQuery);if(!this.queryMatchCase){var sOrigQuery=sQuery;sQuery=sQuery.toLowerCase();} +for(var i=nCacheLength-1;i>=0;i--){var resultObj=aCache[i];var aAllResultItems=resultObj.results;var matchKey=(!this.queryMatchCase)?encodeURIComponent(resultObj.query).toLowerCase():encodeURIComponent(resultObj.query);if(matchKey==sQuery){bMatchFound=true;aResults=aAllResultItems;if(i!=nCacheLength-1){aCache.splice(i,1);this._addCacheElem(resultObj);} +break;} +else if(this.queryMatchSubset){for(var j=sQuery.length-1;j>=0;j--){var subQuery=sQuery.substr(0,j);if(matchKey==subQuery){bMatchFound=true;for(var k=aAllResultItems.length-1;k>=0;k--){var aRecord=aAllResultItems[k];var sKeyIndex=(this.queryMatchCase)?encodeURIComponent(aRecord[0]).indexOf(sQuery):encodeURIComponent(aRecord[0]).toLowerCase().indexOf(sQuery);if((!bMatchContains&&(sKeyIndex===0))||(bMatchContains&&(sKeyIndex>-1))){aResults.unshift(aRecord);}} +resultObj={};resultObj.query=sQuery;resultObj.results=aResults;this._addCacheElem(resultObj);break;}} +if(bMatchFound){break;}}} +if(bMatchFound){this.getCachedResultsEvent.fire(this,oParent,sOrigQuery,aResults);oCallbackFn(sOrigQuery,aResults,oParent);}} +return aResults;};YAHOO.widget.DS_XHR=function(sScriptURI,aSchema,oConfigs){if(typeof oConfigs=="object"){for(var sConfig in oConfigs){this[sConfig]=oConfigs[sConfig];}} +if(!aSchema||(aSchema.constructor!=Array)){return;} +else{this.schema=aSchema;} +this.scriptURI=sScriptURI;this._init();};YAHOO.widget.DS_XHR.prototype=new YAHOO.widget.DataSource();YAHOO.widget.DS_XHR.TYPE_JSON=0;YAHOO.widget.DS_XHR.TYPE_XML=1;YAHOO.widget.DS_XHR.TYPE_FLAT=2;YAHOO.widget.DS_XHR.ERROR_DATAXHR="XHR response failed";YAHOO.widget.DS_XHR.prototype.connMgr=YAHOO.util.Connect;YAHOO.widget.DS_XHR.prototype.connTimeout=0;YAHOO.widget.DS_XHR.prototype.scriptURI=null;YAHOO.widget.DS_XHR.prototype.scriptQueryParam="query";YAHOO.widget.DS_XHR.prototype.scriptQueryAppend="";YAHOO.widget.DS_XHR.prototype.responseType=YAHOO.widget.DS_XHR.TYPE_JSON;YAHOO.widget.DS_XHR.prototype.responseStripAfter="\n0){sUri+="&"+this.scriptQueryAppend;} +var oResponse=null;var oSelf=this;var responseSuccess=function(oResp){if(!oSelf._oConn||(oResp.tId!=oSelf._oConn.tId)){oSelf.dataErrorEvent.fire(oSelf,oParent,sQuery,YAHOO.widget.DataSource.ERROR_DATANULL);return;} +for(var foo in oResp){} +if(!isXML){oResp=oResp.responseText;} +else{oResp=oResp.responseXML;} +if(oResp===null){oSelf.dataErrorEvent.fire(oSelf,oParent,sQuery,YAHOO.widget.DataSource.ERROR_DATANULL);return;} +var aResults=oSelf.parseResponse(sQuery,oResp,oParent);var resultObj={};resultObj.query=decodeURIComponent(sQuery);resultObj.results=aResults;if(aResults===null){oSelf.dataErrorEvent.fire(oSelf,oParent,sQuery,YAHOO.widget.DataSource.ERROR_DATAPARSE);aResults=[];} +else{oSelf.getResultsEvent.fire(oSelf,oParent,sQuery,aResults);oSelf._addCacheElem(resultObj);} +oCallbackFn(sQuery,aResults,oParent);};var responseFailure=function(oResp){oSelf.dataErrorEvent.fire(oSelf,oParent,sQuery,YAHOO.widget.DS_XHR.ERROR_DATAXHR);return;};var oCallback={success:responseSuccess,failure:responseFailure};if(!isNaN(this.connTimeout)&&this.connTimeout>0){oCallback.timeout=this.connTimeout;} +if(this._oConn){this.connMgr.abort(this._oConn);} +oSelf._oConn=this.connMgr.asyncRequest("GET",sUri,oCallback,null);};YAHOO.widget.DS_XHR.prototype.parseResponse=function(sQuery,oResponse,oParent){var aSchema=this.schema;var aResults=[];var bError=false;var nEnd=((this.responseStripAfter!=="")&&(oResponse.indexOf))?oResponse.indexOf(this.responseStripAfter):-1;if(nEnd!=-1){oResponse=oResponse.substring(0,nEnd);} +switch(this.responseType){case YAHOO.widget.DS_XHR.TYPE_JSON:var jsonList;if(window.JSON&&(navigator.userAgent.toLowerCase().indexOf('khtml')==-1)){var jsonObjParsed=JSON.parse(oResponse);if(!jsonObjParsed){bError=true;break;} +else{try{jsonList=eval("jsonObjParsed."+aSchema[0]);} +catch(e){bError=true;break;}}} +else{try{while(oResponse.substring(0,1)==" "){oResponse=oResponse.substring(1,oResponse.length);} +if(oResponse.indexOf("{")<0){bError=true;break;} +if(oResponse.indexOf("{}")===0){break;} +var jsonObjRaw=eval("("+oResponse+")");if(!jsonObjRaw){bError=true;break;} +jsonList=eval("(jsonObjRaw."+aSchema[0]+")");} +catch(e){bError=true;break;}} +if(!jsonList){bError=true;break;} +if(jsonList.constructor!=Array){jsonList=[jsonList];} +for(var i=jsonList.length-1;i>=0;i--){var aResultItem=[];var jsonResult=jsonList[i];for(var j=aSchema.length-1;j>=1;j--){var dataFieldValue=jsonResult[aSchema[j]];if(!dataFieldValue){dataFieldValue="";} +aResultItem.unshift(dataFieldValue);} +if(aResultItem.length==1){aResultItem.push(jsonResult);} +aResults.unshift(aResultItem);} +break;case YAHOO.widget.DS_XHR.TYPE_XML:var xmlList=oResponse.getElementsByTagName(aSchema[0]);if(!xmlList){bError=true;break;} +for(var k=xmlList.length-1;k>=0;k--){var result=xmlList.item(k);var aFieldSet=[];for(var m=aSchema.length-1;m>=1;m--){var sValue=null;var xmlAttr=result.attributes.getNamedItem(aSchema[m]);if(xmlAttr){sValue=xmlAttr.value;} +else{var xmlNode=result.getElementsByTagName(aSchema[m]);if(xmlNode&&xmlNode.item(0)&&xmlNode.item(0).firstChild){sValue=xmlNode.item(0).firstChild.nodeValue;} +else{sValue="";}} +aFieldSet.unshift(sValue);} +aResults.unshift(aFieldSet);} +break;case YAHOO.widget.DS_XHR.TYPE_FLAT:if(oResponse.length>0){var newLength=oResponse.length-aSchema[0].length;if(oResponse.substr(newLength)==aSchema[0]){oResponse=oResponse.substr(0,newLength);} +var aRecords=oResponse.split(aSchema[0]);for(var n=aRecords.length-1;n>=0;n--){aResults[n]=aRecords[n].split(aSchema[1]);}} +break;default:break;} +sQuery=null;oResponse=null;oParent=null;if(bError){return null;} +else{return aResults;}};YAHOO.widget.DS_XHR.prototype._oConn=null;YAHOO.widget.DS_JSFunction=function(oFunction,oConfigs){if(typeof oConfigs=="object"){for(var sConfig in oConfigs){this[sConfig]=oConfigs[sConfig];}} +if(!oFunction||(oFunction.constructor!=Function)){return;} +else{this.dataFunction=oFunction;this._init();}};YAHOO.widget.DS_JSFunction.prototype=new YAHOO.widget.DataSource();YAHOO.widget.DS_JSFunction.prototype.dataFunction=null;YAHOO.widget.DS_JSFunction.prototype.doQuery=function(oCallbackFn,sQuery,oParent){var oFunction=this.dataFunction;var aResults=[];aResults=oFunction(sQuery);if(aResults===null){this.dataErrorEvent.fire(this,oParent,sQuery,YAHOO.widget.DataSource.ERROR_DATANULL);return;} +var resultObj={};resultObj.query=decodeURIComponent(sQuery);resultObj.results=aResults;this._addCacheElem(resultObj);this.getResultsEvent.fire(this,oParent,sQuery,aResults);oCallbackFn(sQuery,aResults,oParent);return;};YAHOO.widget.DS_JSArray=function(aData,oConfigs){if(typeof oConfigs=="object"){for(var sConfig in oConfigs){this[sConfig]=oConfigs[sConfig];}} +if(!aData||(aData.constructor!=Array)){return;} +else{this.data=aData;this._init();}};YAHOO.widget.DS_JSArray.prototype=new YAHOO.widget.DataSource();YAHOO.widget.DS_JSArray.prototype.data=null;YAHOO.widget.DS_JSArray.prototype.doQuery=function(oCallbackFn,sQuery,oParent){var aData=this.data;var aResults=[];var bMatchFound=false;var bMatchContains=this.queryMatchContains;if(sQuery){if(!this.queryMatchCase){sQuery=sQuery.toLowerCase();} +for(var i=aData.length-1;i>=0;i--){var aDataset=[];if(aData[i]){if(aData[i].constructor==String){aDataset[0]=aData[i];} +else if(aData[i].constructor==Array){aDataset=aData[i];}} +if(aDataset[0]&&(aDataset[0].constructor==String)){var sKeyIndex=(this.queryMatchCase)?encodeURIComponent(aDataset[0]).indexOf(sQuery):encodeURIComponent(aDataset[0]).toLowerCase().indexOf(sQuery);if((!bMatchContains&&(sKeyIndex===0))||(bMatchContains&&(sKeyIndex>-1))){aResults.unshift(aDataset);}}}} +this.getResultsEvent.fire(this,oParent,sQuery,aResults);oCallbackFn(sQuery,aResults,oParent);};YAHOO.register("autocomplete",YAHOO.widget.AutoComplete,{version:"2.2.0",build:"127"}); \ No newline at end of file diff --git a/interface/ispconfig/interface/js/yui/autocomplete/autocomplete.js b/interface/ispconfig/interface/js/yui/autocomplete/autocomplete.js new file mode 100644 index 0000000000000000000000000000000000000000..ce4e0581ecbff83df04ab81b534e814d586d72a8 --- /dev/null +++ b/interface/ispconfig/interface/js/yui/autocomplete/autocomplete.js @@ -0,0 +1,3071 @@ +/* +Copyright (c) 2007, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.2.0 +*/ + /** + * The AutoComplete control provides the front-end logic for text-entry suggestion and + * completion functionality. + * + * @module autocomplete + * @requires yahoo, dom, event, datasource + * @optional animation, connection + * @namespace YAHOO.widget + * @title AutoComplete Widget + */ + +/****************************************************************************/ +/****************************************************************************/ +/****************************************************************************/ + +/** + * The AutoComplete class provides the customizable functionality of a plug-and-play DHTML + * auto completion widget. Some key features: + *
    + *
  • Navigate with up/down arrow keys and/or mouse to pick a selection
  • + *
  • The drop down container can "roll down" or "fly out" via configurable + * animation
  • + *
  • UI look-and-feel customizable through CSS, including container + * attributes, borders, position, fonts, etc
  • + *
+ * + * @class AutoComplete + * @constructor + * @param elInput {HTMLElement} DOM element reference of an input field. + * @param elInput {String} String ID of an input field. + * @param elContainer {HTMLElement} DOM element reference of an existing DIV. + * @param elContainer {String} String ID of an existing DIV. + * @param oDataSource {YAHOO.widget.DataSource} DataSource instance. + * @param oConfigs {Object} (optional) Object literal of configuration params. + */ +YAHOO.widget.AutoComplete = function(elInput,elContainer,oDataSource,oConfigs) { + if(elInput && elContainer && oDataSource) { + // Validate DataSource + if (oDataSource && (oDataSource instanceof YAHOO.widget.DataSource)) { + this.dataSource = oDataSource; + } + else { + return; + } + + // Validate input element + if(YAHOO.util.Dom.inDocument(elInput)) { + if(typeof elInput == "string") { + this._sName = "instance" + YAHOO.widget.AutoComplete._nIndex + " " + elInput; + this._oTextbox = document.getElementById(elInput); + } + else { + this._sName = (elInput.id) ? + "instance" + YAHOO.widget.AutoComplete._nIndex + " " + elInput.id: + "instance" + YAHOO.widget.AutoComplete._nIndex; + this._oTextbox = elInput; + } + } + else { + return; + } + + // Validate container element + if(YAHOO.util.Dom.inDocument(elContainer)) { + if(typeof elContainer == "string") { + this._oContainer = document.getElementById(elContainer); + } + else { + this._oContainer = elContainer; + } + if(this._oContainer.style.display == "none") { + } + } + else { + return; + } + + // Set any config params passed in to override defaults + if (typeof oConfigs == "object") { + for(var sConfig in oConfigs) { + if (sConfig) { + this[sConfig] = oConfigs[sConfig]; + } + } + } + + // Initialization sequence + this._initContainer(); + this._initProps(); + this._initList(); + this._initContainerHelpers(); + + // Set up events + var oSelf = this; + var oTextbox = this._oTextbox; + // Events are actually for the content module within the container + var oContent = this._oContainer._oContent; + + // Dom events + YAHOO.util.Event.addListener(oTextbox,"keyup",oSelf._onTextboxKeyUp,oSelf); + YAHOO.util.Event.addListener(oTextbox,"keydown",oSelf._onTextboxKeyDown,oSelf); + YAHOO.util.Event.addListener(oTextbox,"focus",oSelf._onTextboxFocus,oSelf); + YAHOO.util.Event.addListener(oTextbox,"blur",oSelf._onTextboxBlur,oSelf); + YAHOO.util.Event.addListener(oContent,"mouseover",oSelf._onContainerMouseover,oSelf); + YAHOO.util.Event.addListener(oContent,"mouseout",oSelf._onContainerMouseout,oSelf); + YAHOO.util.Event.addListener(oContent,"scroll",oSelf._onContainerScroll,oSelf); + YAHOO.util.Event.addListener(oContent,"resize",oSelf._onContainerResize,oSelf); + if(oTextbox.form) { + YAHOO.util.Event.addListener(oTextbox.form,"submit",oSelf._onFormSubmit,oSelf); + } + YAHOO.util.Event.addListener(oTextbox,"keypress",oSelf._onTextboxKeyPress,oSelf); + + // Custom events + this.textboxFocusEvent = new YAHOO.util.CustomEvent("textboxFocus", this); + this.textboxKeyEvent = new YAHOO.util.CustomEvent("textboxKey", this); + this.dataRequestEvent = new YAHOO.util.CustomEvent("dataRequest", this); + this.dataReturnEvent = new YAHOO.util.CustomEvent("dataReturn", this); + this.dataErrorEvent = new YAHOO.util.CustomEvent("dataError", this); + this.containerExpandEvent = new YAHOO.util.CustomEvent("containerExpand", this); + this.typeAheadEvent = new YAHOO.util.CustomEvent("typeAhead", this); + this.itemMouseOverEvent = new YAHOO.util.CustomEvent("itemMouseOver", this); + this.itemMouseOutEvent = new YAHOO.util.CustomEvent("itemMouseOut", this); + this.itemArrowToEvent = new YAHOO.util.CustomEvent("itemArrowTo", this); + this.itemArrowFromEvent = new YAHOO.util.CustomEvent("itemArrowFrom", this); + this.itemSelectEvent = new YAHOO.util.CustomEvent("itemSelect", this); + this.unmatchedItemSelectEvent = new YAHOO.util.CustomEvent("unmatchedItemSelect", this); + this.selectionEnforceEvent = new YAHOO.util.CustomEvent("selectionEnforce", this); + this.containerCollapseEvent = new YAHOO.util.CustomEvent("containerCollapse", this); + this.textboxBlurEvent = new YAHOO.util.CustomEvent("textboxBlur", this); + + // Finish up + oTextbox.setAttribute("autocomplete","off"); + YAHOO.widget.AutoComplete._nIndex++; + } + // Required arguments were not found + else { + } +}; + +///////////////////////////////////////////////////////////////////////////// +// +// Public member variables +// +///////////////////////////////////////////////////////////////////////////// + +/** + * The DataSource object that encapsulates the data used for auto completion. + * This object should be an inherited object from YAHOO.widget.DataSource. + * + * @property dataSource + * @type YAHOO.widget.DataSource + */ +YAHOO.widget.AutoComplete.prototype.dataSource = null; + +/** + * Number of characters that must be entered before querying for results. A negative value + * effectively turns off the widget. A value of 0 allows queries of null or empty string + * values. + * + * @property minQueryLength + * @type Number + * @default 1 + */ +YAHOO.widget.AutoComplete.prototype.minQueryLength = 1; + +/** + * Maximum number of results to display in results container. + * + * @property maxResultsDisplayed + * @type Number + * @default 10 + */ +YAHOO.widget.AutoComplete.prototype.maxResultsDisplayed = 10; + +/** + * Number of seconds to delay before submitting a query request. If a query + * request is received before a previous one has completed its delay, the + * previous request is cancelled and the new request is set to the delay. + * + * @property queryDelay + * @type Number + * @default 0.5 + */ +YAHOO.widget.AutoComplete.prototype.queryDelay = 0.5; + +/** + * Class name of a highlighted item within results container. + * + * @property highlightClassName + * @type String + * @default "yui-ac-highlight" + */ +YAHOO.widget.AutoComplete.prototype.highlightClassName = "yui-ac-highlight"; + +/** + * Class name of a pre-highlighted item within results container. + * + * @property prehighlightClassName + * @type String + */ +YAHOO.widget.AutoComplete.prototype.prehighlightClassName = null; + +/** + * Query delimiter. A single character separator for multiple delimited + * selections. Multiple delimiter characteres may be defined as an array of + * strings. A null value or empty string indicates that query results cannot + * be delimited. This feature is not recommended if you need forceSelection to + * be true. + * + * @property delimChar + * @type String | String[] + */ +YAHOO.widget.AutoComplete.prototype.delimChar = null; + +/** + * Whether or not the first item in results container should be automatically highlighted + * on expand. + * + * @property autoHighlight + * @type Boolean + * @default true + */ +YAHOO.widget.AutoComplete.prototype.autoHighlight = true; + +/** + * Whether or not the input field should be automatically updated + * with the first query result as the user types, auto-selecting the substring + * that the user has not typed. + * + * @property typeAhead + * @type Boolean + * @default false + */ +YAHOO.widget.AutoComplete.prototype.typeAhead = false; + +/** + * Whether or not to animate the expansion/collapse of the results container in the + * horizontal direction. + * + * @property animHoriz + * @type Boolean + * @default false + */ +YAHOO.widget.AutoComplete.prototype.animHoriz = false; + +/** + * Whether or not to animate the expansion/collapse of the results container in the + * vertical direction. + * + * @property animVert + * @type Boolean + * @default true + */ +YAHOO.widget.AutoComplete.prototype.animVert = true; + +/** + * Speed of container expand/collapse animation, in seconds.. + * + * @property animSpeed + * @type Number + * @default 0.3 + */ +YAHOO.widget.AutoComplete.prototype.animSpeed = 0.3; + +/** + * Whether or not to force the user's selection to match one of the query + * results. Enabling this feature essentially transforms the input field into a + * <select> field. This feature is not recommended with delimiter character(s) + * defined. + * + * @property forceSelection + * @type Boolean + * @default false + */ +YAHOO.widget.AutoComplete.prototype.forceSelection = false; + +/** + * Whether or not to allow browsers to cache user-typed input in the input + * field. Disabling this feature will prevent the widget from setting the + * autocomplete="off" on the input field. When autocomplete="off" + * and users click the back button after form submission, user-typed input can + * be prefilled by the browser from its cache. This caching of user input may + * not be desired for sensitive data, such as credit card numbers, in which + * case, implementers should consider setting allowBrowserAutocomplete to false. + * + * @property allowBrowserAutocomplete + * @type Boolean + * @default true + */ +YAHOO.widget.AutoComplete.prototype.allowBrowserAutocomplete = true; + +/** + * Whether or not the results container should always be displayed. + * Enabling this feature displays the container when the widget is instantiated + * and prevents the toggling of the container to a collapsed state. + * + * @property alwaysShowContainer + * @type Boolean + * @default false + */ +YAHOO.widget.AutoComplete.prototype.alwaysShowContainer = false; + +/** + * Whether or not to use an iFrame to layer over Windows form elements in + * IE. Set to true only when the results container will be on top of a + * <select> field in IE and thus exposed to the IE z-index bug (i.e., + * 5.5 < IE < 7). + * + * @property useIFrame + * @type Boolean + * @default false + */ +YAHOO.widget.AutoComplete.prototype.useIFrame = false; + +/** + * Whether or not the results container should have a shadow. + * + * @property useShadow + * @type Boolean + * @default false + */ +YAHOO.widget.AutoComplete.prototype.useShadow = false; + +///////////////////////////////////////////////////////////////////////////// +// +// Public methods +// +///////////////////////////////////////////////////////////////////////////// + + /** + * Public accessor to the unique name of the AutoComplete instance. + * + * @method toString + * @return {String} Unique name of the AutoComplete instance. + */ +YAHOO.widget.AutoComplete.prototype.toString = function() { + return "AutoComplete " + this._sName; +}; + + /** + * Returns true if container is in an expanded state, false otherwise. + * + * @method isContainerOpen + * @return {Boolean} Returns true if container is in an expanded state, false otherwise. + */ +YAHOO.widget.AutoComplete.prototype.isContainerOpen = function() { + return this._bContainerOpen; +}; + +/** + * Public accessor to the internal array of DOM <li> elements that + * display query results within the results container. + * + * @method getListItems + * @return {HTMLElement[]} Array of <li> elements within the results container. + */ +YAHOO.widget.AutoComplete.prototype.getListItems = function() { + return this._aListItems; +}; + +/** + * Public accessor to the data held in an <li> element of the + * results container. + * + * @method getListItemData + * @return {Object | Object[]} Object or array of result data or null + */ +YAHOO.widget.AutoComplete.prototype.getListItemData = function(oListItem) { + if(oListItem._oResultData) { + return oListItem._oResultData; + } + else { + return false; + } +}; + +/** + * Sets HTML markup for the results container header. This markup will be + * inserted within a <div> tag with a class of "yui-ac-hd". + * + * @method setHeader + * @param sHeader {String} HTML markup for results container header. + */ +YAHOO.widget.AutoComplete.prototype.setHeader = function(sHeader) { + if(sHeader) { + if(this._oContainer._oContent._oHeader) { + this._oContainer._oContent._oHeader.innerHTML = sHeader; + this._oContainer._oContent._oHeader.style.display = "block"; + } + } + else { + this._oContainer._oContent._oHeader.innerHTML = ""; + this._oContainer._oContent._oHeader.style.display = "none"; + } +}; + +/** + * Sets HTML markup for the results container footer. This markup will be + * inserted within a <div> tag with a class of "yui-ac-ft". + * + * @method setFooter + * @param sFooter {String} HTML markup for results container footer. + */ +YAHOO.widget.AutoComplete.prototype.setFooter = function(sFooter) { + if(sFooter) { + if(this._oContainer._oContent._oFooter) { + this._oContainer._oContent._oFooter.innerHTML = sFooter; + this._oContainer._oContent._oFooter.style.display = "block"; + } + } + else { + this._oContainer._oContent._oFooter.innerHTML = ""; + this._oContainer._oContent._oFooter.style.display = "none"; + } +}; + +/** + * Sets HTML markup for the results container body. This markup will be + * inserted within a <div> tag with a class of "yui-ac-bd". + * + * @method setBody + * @param sBody {String} HTML markup for results container body. + */ +YAHOO.widget.AutoComplete.prototype.setBody = function(sBody) { + if(sBody) { + if(this._oContainer._oContent._oBody) { + this._oContainer._oContent._oBody.innerHTML = sBody; + this._oContainer._oContent._oBody.style.display = "block"; + this._oContainer._oContent.style.display = "block"; + } + } + else { + this._oContainer._oContent._oBody.innerHTML = ""; + this._oContainer._oContent.style.display = "none"; + } + this._maxResultsDisplayed = 0; +}; + +/** + * Overridable method that converts a result item object into HTML markup + * for display. Return data values are accessible via the oResultItem object, + * and the key return value will always be oResultItem[0]. Markup will be + * displayed within <li> element tags in the container. + * + * @method formatResult + * @param oResultItem {Object} Result item representing one query result. Data is held in an array. + * @param sQuery {String} The current query string. + * @return {String} HTML markup of formatted result data. + */ +YAHOO.widget.AutoComplete.prototype.formatResult = function(oResultItem, sQuery) { + var sResult = oResultItem[0]; + if(sResult) { + return sResult; + } + else { + return ""; + } +}; + +/** + * Overridable method called before container expands allows implementers to access data + * and DOM elements. + * + * @method doBeforeExpandContainer + * @return {Boolean} Return true to continue expanding container, false to cancel the expand. + */ +YAHOO.widget.AutoComplete.prototype.doBeforeExpandContainer = function(oResultItem, sQuery) { + return true; +}; + +/** + * Makes query request to the DataSource. + * + * @method sendQuery + * @param sQuery {String} Query string. + */ +YAHOO.widget.AutoComplete.prototype.sendQuery = function(sQuery) { + this._sendQuery(sQuery); +}; + +///////////////////////////////////////////////////////////////////////////// +// +// Public events +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Fired when the input field receives focus. + * + * @event textboxFocusEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + */ +YAHOO.widget.AutoComplete.prototype.textboxFocusEvent = null; + +/** + * Fired when the input field receives key input. + * + * @event textboxKeyEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param nKeycode {Number} The keycode number. + */ +YAHOO.widget.AutoComplete.prototype.textboxKeyEvent = null; + +/** + * Fired when the AutoComplete instance makes a query to the DataSource. + * + * @event dataRequestEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param sQuery {String} The query string. + */ +YAHOO.widget.AutoComplete.prototype.dataRequestEvent = null; + +/** + * Fired when the AutoComplete instance receives query results from the data + * source. + * + * @event dataReturnEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param sQuery {String} The query string. + * @param aResults {Object[]} Results array. + */ +YAHOO.widget.AutoComplete.prototype.dataReturnEvent = null; + +/** + * Fired when the AutoComplete instance does not receive query results from the + * DataSource due to an error. + * + * @event dataErrorEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param sQuery {String} The query string. + */ +YAHOO.widget.AutoComplete.prototype.dataErrorEvent = null; + +/** + * Fired when the results container is expanded. + * + * @event containerExpandEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + */ +YAHOO.widget.AutoComplete.prototype.containerExpandEvent = null; + +/** + * Fired when the input field has been prefilled by the type-ahead + * feature. + * + * @event typeAheadEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param sQuery {String} The query string. + * @param sPrefill {String} The prefill string. + */ +YAHOO.widget.AutoComplete.prototype.typeAheadEvent = null; + +/** + * Fired when result item has been moused over. + * + * @event itemMouseOverEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param elItem {HTMLElement} The <li> element item moused to. + */ +YAHOO.widget.AutoComplete.prototype.itemMouseOverEvent = null; + +/** + * Fired when result item has been moused out. + * + * @event itemMouseOutEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param elItem {HTMLElement} The <li> element item moused from. + */ +YAHOO.widget.AutoComplete.prototype.itemMouseOutEvent = null; + +/** + * Fired when result item has been arrowed to. + * + * @event itemArrowToEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param elItem {HTMLElement} The <li> element item arrowed to. + */ +YAHOO.widget.AutoComplete.prototype.itemArrowToEvent = null; + +/** + * Fired when result item has been arrowed away from. + * + * @event itemArrowFromEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param elItem {HTMLElement} The <li> element item arrowed from. + */ +YAHOO.widget.AutoComplete.prototype.itemArrowFromEvent = null; + +/** + * Fired when an item is selected via mouse click, ENTER key, or TAB key. + * + * @event itemSelectEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param elItem {HTMLElement} The selected <li> element item. + * @param oData {Object} The data returned for the item, either as an object, + * or mapped from the schema into an array. + */ +YAHOO.widget.AutoComplete.prototype.itemSelectEvent = null; + +/** + * Fired when a user selection does not match any of the displayed result items. + * Note that this event may not behave as expected when delimiter characters + * have been defined. + * + * @event unmatchedItemSelectEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param sQuery {String} The user-typed query string. + */ +YAHOO.widget.AutoComplete.prototype.unmatchedItemSelectEvent = null; + +/** + * Fired if forceSelection is enabled and the user's input has been cleared + * because it did not match one of the returned query results. + * + * @event selectionEnforceEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + */ +YAHOO.widget.AutoComplete.prototype.selectionEnforceEvent = null; + +/** + * Fired when the results container is collapsed. + * + * @event containerCollapseEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + */ +YAHOO.widget.AutoComplete.prototype.containerCollapseEvent = null; + +/** + * Fired when the input field loses focus. + * + * @event textboxBlurEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + */ +YAHOO.widget.AutoComplete.prototype.textboxBlurEvent = null; + +///////////////////////////////////////////////////////////////////////////// +// +// Private member variables +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Internal class variable to index multiple AutoComplete instances. + * + * @property _nIndex + * @type Number + * @default 0 + * @private + */ +YAHOO.widget.AutoComplete._nIndex = 0; + +/** + * Name of AutoComplete instance. + * + * @property _sName + * @type String + * @private + */ +YAHOO.widget.AutoComplete.prototype._sName = null; + +/** + * Text input field DOM element. + * + * @property _oTextbox + * @type HTMLElement + * @private + */ +YAHOO.widget.AutoComplete.prototype._oTextbox = null; + +/** + * Whether or not the input field is currently in focus. If query results come back + * but the user has already moved on, do not proceed with auto complete behavior. + * + * @property _bFocused + * @type Boolean + * @private + */ +YAHOO.widget.AutoComplete.prototype._bFocused = true; + +/** + * Animation instance for container expand/collapse. + * + * @property _oAnim + * @type Boolean + * @private + */ +YAHOO.widget.AutoComplete.prototype._oAnim = null; + +/** + * Container DOM element. + * + * @property _oContainer + * @type HTMLElement + * @private + */ +YAHOO.widget.AutoComplete.prototype._oContainer = null; + +/** + * Whether or not the results container is currently open. + * + * @property _bContainerOpen + * @type Boolean + * @private + */ +YAHOO.widget.AutoComplete.prototype._bContainerOpen = false; + +/** + * Whether or not the mouse is currently over the results + * container. This is necessary in order to prevent clicks on container items + * from being text input field blur events. + * + * @property _bOverContainer + * @type Boolean + * @private + */ +YAHOO.widget.AutoComplete.prototype._bOverContainer = false; + +/** + * Array of <li> elements references that contain query results within the + * results container. + * + * @property _aListItems + * @type HTMLElement[] + * @private + */ +YAHOO.widget.AutoComplete.prototype._aListItems = null; + +/** + * Number of <li> elements currently displayed in results container. + * + * @property _nDisplayedItems + * @type Number + * @private + */ +YAHOO.widget.AutoComplete.prototype._nDisplayedItems = 0; + +/** + * Internal count of <li> elements displayed and hidden in results container. + * + * @property _maxResultsDisplayed + * @type Number + * @private + */ +YAHOO.widget.AutoComplete.prototype._maxResultsDisplayed = 0; + +/** + * Current query string + * + * @property _sCurQuery + * @type String + * @private + */ +YAHOO.widget.AutoComplete.prototype._sCurQuery = null; + +/** + * Past queries this session (for saving delimited queries). + * + * @property _sSavedQuery + * @type String + * @private + */ +YAHOO.widget.AutoComplete.prototype._sSavedQuery = null; + +/** + * Pointer to the currently highlighted <li> element in the container. + * + * @property _oCurItem + * @type HTMLElement + * @private + */ +YAHOO.widget.AutoComplete.prototype._oCurItem = null; + +/** + * Whether or not an item has been selected since the container was populated + * with results. Reset to false by _populateList, and set to true when item is + * selected. + * + * @property _bItemSelected + * @type Boolean + * @private + */ +YAHOO.widget.AutoComplete.prototype._bItemSelected = false; + +/** + * Key code of the last key pressed in textbox. + * + * @property _nKeyCode + * @type Number + * @private + */ +YAHOO.widget.AutoComplete.prototype._nKeyCode = null; + +/** + * Delay timeout ID. + * + * @property _nDelayID + * @type Number + * @private + */ +YAHOO.widget.AutoComplete.prototype._nDelayID = -1; + +/** + * Src to iFrame used when useIFrame = true. Supports implementations over SSL + * as well. + * + * @property _iFrameSrc + * @type String + * @private + */ +YAHOO.widget.AutoComplete.prototype._iFrameSrc = "javascript:false;"; + +/** + * For users typing via certain IMEs, queries must be triggered by intervals, + * since key events yet supported across all browsers for all IMEs. + * + * @property _queryInterval + * @type Object + * @private + */ +YAHOO.widget.AutoComplete.prototype._queryInterval = null; + +/** + * Internal tracker to last known textbox value, used to determine whether or not + * to trigger a query via interval for certain IME users. + * + * @event _sLastTextboxValue + * @type String + * @private + */ +YAHOO.widget.AutoComplete.prototype._sLastTextboxValue = null; + +///////////////////////////////////////////////////////////////////////////// +// +// Private methods +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Updates and validates latest public config properties. + * + * @method __initProps + * @private + */ +YAHOO.widget.AutoComplete.prototype._initProps = function() { + // Correct any invalid values + var minQueryLength = this.minQueryLength; + if(isNaN(minQueryLength) || (minQueryLength < 1)) { + minQueryLength = 1; + } + var maxResultsDisplayed = this.maxResultsDisplayed; + if(isNaN(this.maxResultsDisplayed) || (this.maxResultsDisplayed < 1)) { + this.maxResultsDisplayed = 10; + } + var queryDelay = this.queryDelay; + if(isNaN(this.queryDelay) || (this.queryDelay < 0)) { + this.queryDelay = 0.5; + } + var aDelimChar = (this.delimChar) ? this.delimChar : null; + if(aDelimChar) { + if(typeof aDelimChar == "string") { + this.delimChar = [aDelimChar]; + } + else if(aDelimChar.constructor != Array) { + this.delimChar = null; + } + } + var animSpeed = this.animSpeed; + if((this.animHoriz || this.animVert) && YAHOO.util.Anim) { + if(isNaN(animSpeed) || (animSpeed < 0)) { + animSpeed = 0.3; + } + if(!this._oAnim ) { + oAnim = new YAHOO.util.Anim(this._oContainer._oContent, {}, this.animSpeed); + this._oAnim = oAnim; + } + else { + this._oAnim.duration = animSpeed; + } + } + if(this.forceSelection && this.delimChar) { + } +}; + +/** + * Initializes the results container helpers if they are enabled and do + * not exist + * + * @method _initContainerHelpers + * @private + */ +YAHOO.widget.AutoComplete.prototype._initContainerHelpers = function() { + if(this.useShadow && !this._oContainer._oShadow) { + var oShadow = document.createElement("div"); + oShadow.className = "yui-ac-shadow"; + this._oContainer._oShadow = this._oContainer.appendChild(oShadow); + } + if(this.useIFrame && !this._oContainer._oIFrame) { + var oIFrame = document.createElement("iframe"); + oIFrame.src = this._iFrameSrc; + oIFrame.frameBorder = 0; + oIFrame.scrolling = "no"; + oIFrame.style.position = "absolute"; + oIFrame.style.width = "100%"; + oIFrame.style.height = "100%"; + oIFrame.tabIndex = -1; + this._oContainer._oIFrame = this._oContainer.appendChild(oIFrame); + } +}; + +/** + * Initializes the results container once at object creation + * + * @method _initContainer + * @private + */ +YAHOO.widget.AutoComplete.prototype._initContainer = function() { + if(!this._oContainer._oContent) { + // The oContent div helps size the iframe and shadow properly + var oContent = document.createElement("div"); + oContent.className = "yui-ac-content"; + oContent.style.display = "none"; + this._oContainer._oContent = this._oContainer.appendChild(oContent); + + var oHeader = document.createElement("div"); + oHeader.className = "yui-ac-hd"; + oHeader.style.display = "none"; + this._oContainer._oContent._oHeader = this._oContainer._oContent.appendChild(oHeader); + + var oBody = document.createElement("div"); + oBody.className = "yui-ac-bd"; + this._oContainer._oContent._oBody = this._oContainer._oContent.appendChild(oBody); + + var oFooter = document.createElement("div"); + oFooter.className = "yui-ac-ft"; + oFooter.style.display = "none"; + this._oContainer._oContent._oFooter = this._oContainer._oContent.appendChild(oFooter); + } + else { + } +}; + +/** + * Clears out contents of container body and creates up to + * YAHOO.widget.AutoComplete#maxResultsDisplayed <li> elements in an + * <ul> element. + * + * @method _initList + * @private + */ +YAHOO.widget.AutoComplete.prototype._initList = function() { + this._aListItems = []; + while(this._oContainer._oContent._oBody.hasChildNodes()) { + var oldListItems = this.getListItems(); + if(oldListItems) { + for(var oldi = oldListItems.length-1; oldi >= 0; i--) { + oldListItems[oldi] = null; + } + } + this._oContainer._oContent._oBody.innerHTML = ""; + } + + var oList = document.createElement("ul"); + oList = this._oContainer._oContent._oBody.appendChild(oList); + for(var i=0; i= 18 && nKeyCode <= 20) || // alt,pause/break,caps lock + (nKeyCode == 27) || // esc + (nKeyCode >= 33 && nKeyCode <= 35) || // page up,page down,end + (nKeyCode >= 36 && nKeyCode <= 38) || // home,left,up + (nKeyCode == 40) || // down + (nKeyCode >= 44 && nKeyCode <= 45)) { // print screen,insert + return true; + } + return false; +}; + +/** + * Makes query request to the DataSource. + * + * @method _sendQuery + * @param sQuery {String} Query string. + * @private + */ +YAHOO.widget.AutoComplete.prototype._sendQuery = function(sQuery) { + // Widget has been effectively turned off + if(this.minQueryLength == -1) { + this._toggleContainer(false); + return; + } + // Delimiter has been enabled + var aDelimChar = (this.delimChar) ? this.delimChar : null; + if(aDelimChar) { + // Loop through all possible delimiters and find the latest one + // A " " may be a false positive if they are defined as delimiters AND + // are used to separate delimited queries + var nDelimIndex = -1; + for(var i = aDelimChar.length-1; i >= 0; i--) { + var nNewIndex = sQuery.lastIndexOf(aDelimChar[i]); + if(nNewIndex > nDelimIndex) { + nDelimIndex = nNewIndex; + } + } + // If we think the last delimiter is a space (" "), make sure it is NOT + // a false positive by also checking the char directly before it + if(aDelimChar[i] == " ") { + for (var j = aDelimChar.length-1; j >= 0; j--) { + if(sQuery[nDelimIndex - 1] == aDelimChar[j]) { + nDelimIndex--; + break; + } + } + } + // A delimiter has been found so extract the latest query + if (nDelimIndex > -1) { + var nQueryStart = nDelimIndex + 1; + // Trim any white space from the beginning... + while(sQuery.charAt(nQueryStart) == " ") { + nQueryStart += 1; + } + // ...and save the rest of the string for later + this._sSavedQuery = sQuery.substring(0,nQueryStart); + // Here is the query itself + sQuery = sQuery.substr(nQueryStart); + } + else if(sQuery.indexOf(this._sSavedQuery) < 0){ + this._sSavedQuery = null; + } + } + + // Don't search queries that are too short + if (sQuery && (sQuery.length < this.minQueryLength) || (!sQuery && this.minQueryLength > 0)) { + if (this._nDelayID != -1) { + clearTimeout(this._nDelayID); + } + this._toggleContainer(false); + return; + } + + sQuery = encodeURIComponent(sQuery); + this._nDelayID = -1; // Reset timeout ID because request has been made + this.dataRequestEvent.fire(this, sQuery); + this.dataSource.getResults(this._populateList, sQuery, this); +}; + +/** + * Populates the array of <li> elements in the container with query + * results. This method is passed to YAHOO.widget.DataSource#getResults as a + * callback function so results from the DataSource instance are returned to the + * AutoComplete instance. + * + * @method _populateList + * @param sQuery {String} The query string. + * @param aResults {Object[]} An array of query result objects from the DataSource. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._populateList = function(sQuery, aResults, oSelf) { + if(aResults === null) { + oSelf.dataErrorEvent.fire(oSelf, sQuery); + } + if (!oSelf._bFocused || !aResults) { + return; + } + + var isOpera = (navigator.userAgent.toLowerCase().indexOf("opera") != -1); + var contentStyle = oSelf._oContainer._oContent.style; + contentStyle.width = (!isOpera) ? null : ""; + contentStyle.height = (!isOpera) ? null : ""; + + var sCurQuery = decodeURIComponent(sQuery); + oSelf._sCurQuery = sCurQuery; + oSelf._bItemSelected = false; + + if(oSelf._maxResultsDisplayed != oSelf.maxResultsDisplayed) { + oSelf._initList(); + } + + var nItems = Math.min(aResults.length,oSelf.maxResultsDisplayed); + oSelf._nDisplayedItems = nItems; + if (nItems > 0) { + oSelf._initContainerHelpers(); + var aItems = oSelf._aListItems; + + // Fill items with data + for(var i = nItems-1; i >= 0; i--) { + var oItemi = aItems[i]; + var oResultItemi = aResults[i]; + oItemi.innerHTML = oSelf.formatResult(oResultItemi, sCurQuery); + oItemi.style.display = "list-item"; + oItemi._sResultKey = oResultItemi[0]; + oItemi._oResultData = oResultItemi; + + } + + // Empty out remaining items if any + for(var j = aItems.length-1; j >= nItems ; j--) { + var oItemj = aItems[j]; + oItemj.innerHTML = null; + oItemj.style.display = "none"; + oItemj._sResultKey = null; + oItemj._oResultData = null; + } + + if(oSelf.autoHighlight) { + // Go to the first item + var oFirstItem = aItems[0]; + oSelf._toggleHighlight(oFirstItem,"to"); + oSelf.itemArrowToEvent.fire(oSelf, oFirstItem); + oSelf._typeAhead(oFirstItem,sQuery); + } + else { + oSelf._oCurItem = null; + } + + // Expand the container + var ok = oSelf.doBeforeExpandContainer(oSelf._oTextbox, oSelf._oContainer, sQuery, aResults); + oSelf._toggleContainer(ok); + } + else { + oSelf._toggleContainer(false); + } + oSelf.dataReturnEvent.fire(oSelf, sQuery, aResults); +}; + +/** + * When forceSelection is true and the user attempts + * leave the text input box without selecting an item from the query results, + * the user selection is cleared. + * + * @method _clearSelection + * @private + */ +YAHOO.widget.AutoComplete.prototype._clearSelection = function() { + var sValue = this._oTextbox.value; + var sChar = (this.delimChar) ? this.delimChar[0] : null; + var nIndex = (sChar) ? sValue.lastIndexOf(sChar, sValue.length-2) : -1; + if(nIndex > -1) { + this._oTextbox.value = sValue.substring(0,nIndex); + } + else { + this._oTextbox.value = ""; + } + this._sSavedQuery = this._oTextbox.value; + + // Fire custom event + this.selectionEnforceEvent.fire(this); +}; + +/** + * Whether or not user-typed value in the text input box matches any of the + * query results. + * + * @method _textMatchesOption + * @return {Boolean} True if user-input text matches a result, false otherwise. + * @private + */ +YAHOO.widget.AutoComplete.prototype._textMatchesOption = function() { + var foundMatch = false; + + for(var i = this._nDisplayedItems-1; i >= 0 ; i--) { + var oItem = this._aListItems[i]; + var sMatch = oItem._sResultKey.toLowerCase(); + if (sMatch == this._sCurQuery.toLowerCase()) { + foundMatch = true; + break; + } + } + return(foundMatch); +}; + +/** + * Updates in the text input box with the first query result as the user types, + * selecting the substring that the user has not typed. + * + * @method _typeAhead + * @param oItem {HTMLElement} The <li> element item whose data populates the input field. + * @param sQuery {String} Query string. + * @private + */ +YAHOO.widget.AutoComplete.prototype._typeAhead = function(oItem, sQuery) { + // Don't update if turned off + if (!this.typeAhead || (this._nKeyCode == 8)) { + return; + } + + var oTextbox = this._oTextbox; + var sValue = this._oTextbox.value; // any saved queries plus what user has typed + + // Don't update with type-ahead if text selection is not supported + if(!oTextbox.setSelectionRange && !oTextbox.createTextRange) { + return; + } + + // Select the portion of text that the user has not typed + var nStart = sValue.length; + this._updateValue(oItem); + var nEnd = oTextbox.value.length; + this._selectText(oTextbox,nStart,nEnd); + var sPrefill = oTextbox.value.substr(nStart,nEnd); + this.typeAheadEvent.fire(this,sQuery,sPrefill); +}; + +/** + * Selects text in the input field. + * + * @method _selectText + * @param oTextbox {HTMLElement} Text input box element in which to select text. + * @param nStart {Number} Starting index of text string to select. + * @param nEnd {Number} Ending index of text selection. + * @private + */ +YAHOO.widget.AutoComplete.prototype._selectText = function(oTextbox, nStart, nEnd) { + if (oTextbox.setSelectionRange) { // For Mozilla + oTextbox.setSelectionRange(nStart,nEnd); + } + else if (oTextbox.createTextRange) { // For IE + var oTextRange = oTextbox.createTextRange(); + oTextRange.moveStart("character", nStart); + oTextRange.moveEnd("character", nEnd-oTextbox.value.length); + oTextRange.select(); + } + else { + oTextbox.select(); + } +}; + +/** + * Syncs results container with its helpers. + * + * @method _toggleContainerHelpers + * @param bShow {Boolean} True if container is expanded, false if collapsed + * @private + */ +YAHOO.widget.AutoComplete.prototype._toggleContainerHelpers = function(bShow) { + var bFireEvent = false; + var width = this._oContainer._oContent.offsetWidth + "px"; + var height = this._oContainer._oContent.offsetHeight + "px"; + + if(this.useIFrame && this._oContainer._oIFrame) { + bFireEvent = true; + if(bShow) { + this._oContainer._oIFrame.style.width = width; + this._oContainer._oIFrame.style.height = height; + } + else { + this._oContainer._oIFrame.style.width = 0; + this._oContainer._oIFrame.style.height = 0; + } + } + if(this.useShadow && this._oContainer._oShadow) { + bFireEvent = true; + if(bShow) { + this._oContainer._oShadow.style.width = width; + this._oContainer._oShadow.style.height = height; + } + else { + this._oContainer._oShadow.style.width = 0; + this._oContainer._oShadow.style.height = 0; + } + } +}; + +/** + * Animates expansion or collapse of the container. + * + * @method _toggleContainer + * @param bShow {Boolean} True if container should be expanded, false if container should be collapsed + * @private + */ +YAHOO.widget.AutoComplete.prototype._toggleContainer = function(bShow) { + var oContainer = this._oContainer; + + // Implementer has container always open so don't mess with it + if(this.alwaysShowContainer && this._bContainerOpen) { + return; + } + + // Clear contents of container + if(!bShow) { + this._oContainer._oContent.scrollTop = 0; + var aItems = this._aListItems; + + if(aItems && (aItems.length > 0)) { + for(var i = aItems.length-1; i >= 0 ; i--) { + aItems[i].style.display = "none"; + } + } + + if (this._oCurItem) { + this._toggleHighlight(this._oCurItem,"from"); + } + + this._oCurItem = null; + this._nDisplayedItems = 0; + this._sCurQuery = null; + } + + // Container is already closed + if (!bShow && !this._bContainerOpen) { + oContainer._oContent.style.display = "none"; + return; + } + + // If animation is enabled... + var oAnim = this._oAnim; + if (oAnim && oAnim.getEl() && (this.animHoriz || this.animVert)) { + // If helpers need to be collapsed, do it right away... + // but if helpers need to be expanded, wait until after the container expands + if(!bShow) { + this._toggleContainerHelpers(bShow); + } + + if(oAnim.isAnimated()) { + oAnim.stop(); + } + + // Clone container to grab current size offscreen + var oClone = oContainer._oContent.cloneNode(true); + oContainer.appendChild(oClone); + oClone.style.top = "-9000px"; + oClone.style.display = "block"; + + // Current size of the container is the EXPANDED size + var wExp = oClone.offsetWidth; + var hExp = oClone.offsetHeight; + + // Calculate COLLAPSED sizes based on horiz and vert anim + var wColl = (this.animHoriz) ? 0 : wExp; + var hColl = (this.animVert) ? 0 : hExp; + + // Set animation sizes + oAnim.attributes = (bShow) ? + {width: { to: wExp }, height: { to: hExp }} : + {width: { to: wColl}, height: { to: hColl }}; + + // If opening anew, set to a collapsed size... + if(bShow && !this._bContainerOpen) { + oContainer._oContent.style.width = wColl+"px"; + oContainer._oContent.style.height = hColl+"px"; + } + // Else, set it to its last known size. + else { + oContainer._oContent.style.width = wExp+"px"; + oContainer._oContent.style.height = hExp+"px"; + } + + oContainer.removeChild(oClone); + oClone = null; + + var oSelf = this; + var onAnimComplete = function() { + // Finish the collapse + oAnim.onComplete.unsubscribeAll(); + + if(bShow) { + oSelf.containerExpandEvent.fire(oSelf); + } + else { + oContainer._oContent.style.display = "none"; + oSelf.containerCollapseEvent.fire(oSelf); + } + oSelf._toggleContainerHelpers(bShow); + }; + + // Display container and animate it + oContainer._oContent.style.display = "block"; + oAnim.onComplete.subscribe(onAnimComplete); + oAnim.animate(); + this._bContainerOpen = bShow; + } + // Else don't animate, just show or hide + else { + if(bShow) { + oContainer._oContent.style.display = "block"; + this.containerExpandEvent.fire(this); + } + else { + oContainer._oContent.style.display = "none"; + this.containerCollapseEvent.fire(this); + } + this._toggleContainerHelpers(bShow); + this._bContainerOpen = bShow; + } + +}; + +/** + * Toggles the highlight on or off for an item in the container, and also cleans + * up highlighting of any previous item. + * + * @method _toggleHighlight + * @param oNewItem {HTMLElement} The <li> element item to receive highlight behavior. + * @param sType {String} Type "mouseover" will toggle highlight on, and "mouseout" will toggle highlight off. + * @private + */ +YAHOO.widget.AutoComplete.prototype._toggleHighlight = function(oNewItem, sType) { + var sHighlight = this.highlightClassName; + if(this._oCurItem) { + // Remove highlight from old item + YAHOO.util.Dom.removeClass(this._oCurItem, sHighlight); + } + + if((sType == "to") && sHighlight) { + // Apply highlight to new item + YAHOO.util.Dom.addClass(oNewItem, sHighlight); + this._oCurItem = oNewItem; + } +}; + +/** + * Toggles the pre-highlight on or off for an item in the container. + * + * @method _togglePrehighlight + * @param oNewItem {HTMLElement} The <li> element item to receive highlight behavior. + * @param sType {String} Type "mouseover" will toggle highlight on, and "mouseout" will toggle highlight off. + * @private + */ +YAHOO.widget.AutoComplete.prototype._togglePrehighlight = function(oNewItem, sType) { + if(oNewItem == this._oCurItem) { + return; + } + + var sPrehighlight = this.prehighlightClassName; + if((sType == "mouseover") && sPrehighlight) { + // Apply prehighlight to new item + YAHOO.util.Dom.addClass(oNewItem, sPrehighlight); + } + else { + // Remove prehighlight from old item + YAHOO.util.Dom.removeClass(oNewItem, sPrehighlight); + } +}; + +/** + * Updates the text input box value with selected query result. If a delimiter + * has been defined, then the value gets appended with the delimiter. + * + * @method _updateValue + * @param oItem {HTMLElement} The <li> element item with which to update the value. + * @private + */ +YAHOO.widget.AutoComplete.prototype._updateValue = function(oItem) { + var oTextbox = this._oTextbox; + var sDelimChar = (this.delimChar) ? (this.delimChar[0] || this.delimChar) : null; + var sSavedQuery = this._sSavedQuery; + var sResultKey = oItem._sResultKey; + oTextbox.focus(); + + // First clear text field + oTextbox.value = ""; + // Grab data to put into text field + if(sDelimChar) { + if(sSavedQuery) { + oTextbox.value = sSavedQuery; + } + oTextbox.value += sResultKey + sDelimChar; + if(sDelimChar != " ") { + oTextbox.value += " "; + } + } + else { oTextbox.value = sResultKey; } + + // scroll to bottom of textarea if necessary + if(oTextbox.type == "textarea") { + oTextbox.scrollTop = oTextbox.scrollHeight; + } + + // move cursor to end + var end = oTextbox.value.length; + this._selectText(oTextbox,end,end); + + this._oCurItem = oItem; +}; + +/** + * Selects a result item from the container + * + * @method _selectItem + * @param oItem {HTMLElement} The selected <li> element item. + * @private + */ +YAHOO.widget.AutoComplete.prototype._selectItem = function(oItem) { + this._bItemSelected = true; + this._updateValue(oItem); + this._cancelIntervalDetection(this); + this.itemSelectEvent.fire(this, oItem, oItem._oResultData); + this._toggleContainer(false); +}; + +/** + * For values updated by type-ahead, the right arrow key jumps to the end + * of the textbox, otherwise the container is closed. + * + * @method _jumpSelection + * @private + */ +YAHOO.widget.AutoComplete.prototype._jumpSelection = function() { + if(!this.typeAhead) { + return; + } + else { + this._toggleContainer(false); + } +}; + +/** + * Triggered by up and down arrow keys, changes the current highlighted + * <li> element item. Scrolls container if necessary. + * + * @method _moveSelection + * @param nKeyCode {Number} Code of key pressed. + * @private + */ +YAHOO.widget.AutoComplete.prototype._moveSelection = function(nKeyCode) { + if(this._bContainerOpen) { + // Determine current item's id number + var oCurItem = this._oCurItem; + var nCurItemIndex = -1; + + if (oCurItem) { + nCurItemIndex = oCurItem._nItemIndex; + } + + var nNewItemIndex = (nKeyCode == 40) ? + (nCurItemIndex + 1) : (nCurItemIndex - 1); + + // Out of bounds + if (nNewItemIndex < -2 || nNewItemIndex >= this._nDisplayedItems) { + return; + } + + if (oCurItem) { + // Unhighlight current item + this._toggleHighlight(oCurItem, "from"); + this.itemArrowFromEvent.fire(this, oCurItem); + } + if (nNewItemIndex == -1) { + // Go back to query (remove type-ahead string) + if(this.delimChar && this._sSavedQuery) { + if (!this._textMatchesOption()) { + this._oTextbox.value = this._sSavedQuery; + } + else { + this._oTextbox.value = this._sSavedQuery + this._sCurQuery; + } + } + else { + this._oTextbox.value = this._sCurQuery; + } + this._oCurItem = null; + return; + } + if (nNewItemIndex == -2) { + // Close container + this._toggleContainer(false); + return; + } + + var oNewItem = this._aListItems[nNewItemIndex]; + + // Scroll the container if necessary + var oContent = this._oContainer._oContent; + var scrollOn = ((YAHOO.util.Dom.getStyle(oContent,"overflow") == "auto") || + (YAHOO.util.Dom.getStyle(oContent,"overflowY") == "auto")); + if(scrollOn && (nNewItemIndex > -1) && + (nNewItemIndex < this._nDisplayedItems)) { + // User is keying down + if(nKeyCode == 40) { + // Bottom of selected item is below scroll area... + if((oNewItem.offsetTop+oNewItem.offsetHeight) > (oContent.scrollTop + oContent.offsetHeight)) { + // Set bottom of scroll area to bottom of selected item + oContent.scrollTop = (oNewItem.offsetTop+oNewItem.offsetHeight) - oContent.offsetHeight; + } + // Bottom of selected item is above scroll area... + else if((oNewItem.offsetTop+oNewItem.offsetHeight) < oContent.scrollTop) { + // Set top of selected item to top of scroll area + oContent.scrollTop = oNewItem.offsetTop; + + } + } + // User is keying up + else { + // Top of selected item is above scroll area + if(oNewItem.offsetTop < oContent.scrollTop) { + // Set top of scroll area to top of selected item + this._oContainer._oContent.scrollTop = oNewItem.offsetTop; + } + // Top of selected item is below scroll area + else if(oNewItem.offsetTop > (oContent.scrollTop + oContent.offsetHeight)) { + // Set bottom of selected item to bottom of scroll area + this._oContainer._oContent.scrollTop = (oNewItem.offsetTop+oNewItem.offsetHeight) - oContent.offsetHeight; + } + } + } + + this._toggleHighlight(oNewItem, "to"); + this.itemArrowToEvent.fire(this, oNewItem); + if(this.typeAhead) { + this._updateValue(oNewItem); + } + } +}; + +///////////////////////////////////////////////////////////////////////////// +// +// Private event handlers +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Handles <li> element mouseover events in the container. + * + * @method _onItemMouseover + * @param v {HTMLEvent} The mouseover event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onItemMouseover = function(v,oSelf) { + if(oSelf.prehighlightClassName) { + oSelf._togglePrehighlight(this,"mouseover"); + } + else { + oSelf._toggleHighlight(this,"to"); + } + + oSelf.itemMouseOverEvent.fire(oSelf, this); +}; + +/** + * Handles <li> element mouseout events in the container. + * + * @method _onItemMouseout + * @param v {HTMLEvent} The mouseout event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onItemMouseout = function(v,oSelf) { + if(oSelf.prehighlightClassName) { + oSelf._togglePrehighlight(this,"mouseout"); + } + else { + oSelf._toggleHighlight(this,"from"); + } + + oSelf.itemMouseOutEvent.fire(oSelf, this); +}; + +/** + * Handles <li> element click events in the container. + * + * @method _onItemMouseclick + * @param v {HTMLEvent} The click event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onItemMouseclick = function(v,oSelf) { + // In case item has not been moused over + oSelf._toggleHighlight(this,"to"); + oSelf._selectItem(this); +}; + +/** + * Handles container mouseover events. + * + * @method _onContainerMouseover + * @param v {HTMLEvent} The mouseover event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onContainerMouseover = function(v,oSelf) { + oSelf._bOverContainer = true; +}; + +/** + * Handles container mouseout events. + * + * @method _onContainerMouseout + * @param v {HTMLEvent} The mouseout event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onContainerMouseout = function(v,oSelf) { + oSelf._bOverContainer = false; + // If container is still active + if(oSelf._oCurItem) { + oSelf._toggleHighlight(oSelf._oCurItem,"to"); + } +}; + +/** + * Handles container scroll events. + * + * @method _onContainerScroll + * @param v {HTMLEvent} The scroll event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onContainerScroll = function(v,oSelf) { + oSelf._oTextbox.focus(); +}; + +/** + * Handles container resize events. + * + * @method _onContainerResize + * @param v {HTMLEvent} The resize event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onContainerResize = function(v,oSelf) { + oSelf._toggleContainerHelpers(oSelf._bContainerOpen); +}; + + +/** + * Handles textbox keydown events of functional keys, mainly for UI behavior. + * + * @method _onTextboxKeyDown + * @param v {HTMLEvent} The keydown event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onTextboxKeyDown = function(v,oSelf) { + var nKeyCode = v.keyCode; + + switch (nKeyCode) { + case 9: // tab + if(oSelf.delimChar && (oSelf._nKeyCode != nKeyCode)) { + if(oSelf._bContainerOpen) { + YAHOO.util.Event.stopEvent(v); + } + } + // select an item or clear out + if(oSelf._oCurItem) { + oSelf._selectItem(oSelf._oCurItem); + } + else { + oSelf._toggleContainer(false); + } + break; + case 13: // enter + if(oSelf._nKeyCode != nKeyCode) { + if(oSelf._bContainerOpen) { + YAHOO.util.Event.stopEvent(v); + } + } + if(oSelf._oCurItem) { + oSelf._selectItem(oSelf._oCurItem); + } + else { + oSelf._toggleContainer(false); + } + break; + case 27: // esc + oSelf._toggleContainer(false); + return; + case 39: // right + oSelf._jumpSelection(); + break; + case 38: // up + YAHOO.util.Event.stopEvent(v); + oSelf._moveSelection(nKeyCode); + break; + case 40: // down + YAHOO.util.Event.stopEvent(v); + oSelf._moveSelection(nKeyCode); + break; + default: + break; + } +}; + +/** + * Handles textbox keypress events. + * @method _onTextboxKeyPress + * @param v {HTMLEvent} The keypress event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onTextboxKeyPress = function(v,oSelf) { + var nKeyCode = v.keyCode; + + //Expose only to Mac browsers, where stopEvent is ineffective on keydown events (bug 790337) + var isMac = (navigator.userAgent.toLowerCase().indexOf("mac") != -1); + if(isMac) { + switch (nKeyCode) { + case 9: // tab + if(oSelf.delimChar && (oSelf._nKeyCode != nKeyCode)) { + if(oSelf._bContainerOpen) { + YAHOO.util.Event.stopEvent(v); + } + } + break; + case 13: // enter + if(oSelf._nKeyCode != nKeyCode) { + if(oSelf._bContainerOpen) { + YAHOO.util.Event.stopEvent(v); + } + } + break; + case 38: // up + case 40: // down + YAHOO.util.Event.stopEvent(v); + break; + default: + break; + } + } + + //TODO: (?) limit only to non-IE, non-Mac-FF for Korean IME support (bug 811948) + // Korean IME detected + else if(nKeyCode == 229) { + oSelf._queryInterval = setInterval(function() { oSelf._onIMEDetected(oSelf); },500); + } +}; + +/** + * Handles textbox keyup events that trigger queries. + * + * @method _onTextboxKeyUp + * @param v {HTMLEvent} The keyup event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onTextboxKeyUp = function(v,oSelf) { + // Check to see if any of the public properties have been updated + oSelf._initProps(); + + var nKeyCode = v.keyCode; + oSelf._nKeyCode = nKeyCode; + var sText = this.value; //string in textbox + + // Filter out chars that don't trigger queries + if (oSelf._isIgnoreKey(nKeyCode) || (sText.toLowerCase() == oSelf._sCurQuery)) { + return; + } + else { + oSelf.textboxKeyEvent.fire(oSelf, nKeyCode); + } + + // Set timeout on the request + if (oSelf.queryDelay > 0) { + var nDelayID = + setTimeout(function(){oSelf._sendQuery(sText);},(oSelf.queryDelay * 1000)); + + if (oSelf._nDelayID != -1) { + clearTimeout(oSelf._nDelayID); + } + + oSelf._nDelayID = nDelayID; + } + else { + // No delay so send request immediately + oSelf._sendQuery(sText); + } +}; + +/** + * Handles text input box receiving focus. + * + * @method _onTextboxFocus + * @param v {HTMLEvent} The focus event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onTextboxFocus = function (v,oSelf) { + oSelf._oTextbox.setAttribute("autocomplete","off"); + oSelf._bFocused = true; + oSelf.textboxFocusEvent.fire(oSelf); +}; + +/** + * Handles text input box losing focus. + * + * @method _onTextboxBlur + * @param v {HTMLEvent} The focus event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onTextboxBlur = function (v,oSelf) { + // Don't treat as a blur if it was a selection via mouse click + if(!oSelf._bOverContainer || (oSelf._nKeyCode == 9)) { + // Current query needs to be validated + if(!oSelf._bItemSelected) { + if(!oSelf._bContainerOpen || (oSelf._bContainerOpen && !oSelf._textMatchesOption())) { + if(oSelf.forceSelection) { + oSelf._clearSelection(); + } + else { + oSelf.unmatchedItemSelectEvent.fire(oSelf, oSelf._sCurQuery); + } + } + } + + if(oSelf._bContainerOpen) { + oSelf._toggleContainer(false); + } + oSelf._cancelIntervalDetection(oSelf); + oSelf._bFocused = false; + oSelf.textboxBlurEvent.fire(oSelf); + } +}; + +/** + * Handles form submission event. + * + * @method _onFormSubmit + * @param v {HTMLEvent} The submit event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onFormSubmit = function(v,oSelf) { + if(oSelf.allowBrowserAutocomplete) { + oSelf._oTextbox.setAttribute("autocomplete","on"); + } + else { + oSelf._oTextbox.setAttribute("autocomplete","off"); + } +}; + +/****************************************************************************/ +/****************************************************************************/ +/****************************************************************************/ + +/** + * The DataSource classes manages sending a request and returning response from a live + * database. Supported data include local JavaScript arrays and objects and databases + * accessible via XHR connections. Supported response formats include JavaScript arrays, + * JSON, XML, and flat-file textual data. + * + * @class DataSource + * @constructor + */ +YAHOO.widget.DataSource = function() { + /* abstract class */ +}; + + +///////////////////////////////////////////////////////////////////////////// +// +// Public constants +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Error message for null data responses. + * + * @property ERROR_DATANULL + * @type String + * @static + * @final + */ +YAHOO.widget.DataSource.ERROR_DATANULL = "Response data was null"; + +/** + * Error message for data responses with parsing errors. + * + * @property ERROR_DATAPARSE + * @type String + * @static + * @final + */ +YAHOO.widget.DataSource.ERROR_DATAPARSE = "Response data could not be parsed"; + + +///////////////////////////////////////////////////////////////////////////// +// +// Public member variables +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Max size of the local cache. Set to 0 to turn off caching. Caching is + * useful to reduce the number of server connections. Recommended only for data + * sources that return comprehensive results for queries or when stale data is + * not an issue. + * + * @property maxCacheEntries + * @type Number + * @default 15 + */ +YAHOO.widget.DataSource.prototype.maxCacheEntries = 15; + +/** + * Use this to equate cache matching with the type of matching done by your live + * data source. If caching is on and queryMatchContains is true, the cache + * returns results that "contain" the query string. By default, + * queryMatchContains is set to false, meaning the cache only returns results + * that "start with" the query string. + * + * @property queryMatchContains + * @type Boolean + * @default false + */ +YAHOO.widget.DataSource.prototype.queryMatchContains = false; + +/** + * Enables query subset matching. If caching is on and queryMatchSubset is + * true, substrings of queries will return matching cached results. For + * instance, if the first query is for "abc" susequent queries that start with + * "abc", like "abcd", will be queried against the cache, and not the live data + * source. Recommended only for DataSources that return comprehensive results + * for queries with very few characters. + * + * @property queryMatchSubset + * @type Boolean + * @default false + * + */ +YAHOO.widget.DataSource.prototype.queryMatchSubset = false; + +/** + * Enables query case-sensitivity matching. If caching is on and + * queryMatchCase is true, queries will only return results for case-sensitive + * matches. + * + * @property queryMatchCase + * @type Boolean + * @default false + */ +YAHOO.widget.DataSource.prototype.queryMatchCase = false; + + +///////////////////////////////////////////////////////////////////////////// +// +// Public methods +// +///////////////////////////////////////////////////////////////////////////// + + /** + * Public accessor to the unique name of the DataSource instance. + * + * @method toString + * @return {String} Unique name of the DataSource instance + */ +YAHOO.widget.DataSource.prototype.toString = function() { + return "DataSource " + this._sName; +}; + +/** + * Retrieves query results, first checking the local cache, then making the + * query request to the live data source as defined by the function doQuery. + * + * @method getResults + * @param oCallbackFn {HTMLFunction} Callback function defined by oParent object to which to return results. + * @param sQuery {String} Query string. + * @param oParent {Object} The object instance that has requested data. + */ +YAHOO.widget.DataSource.prototype.getResults = function(oCallbackFn, sQuery, oParent) { + + // First look in cache + var aResults = this._doQueryCache(oCallbackFn,sQuery,oParent); + + // Not in cache, so get results from server + if(aResults.length === 0) { + this.queryEvent.fire(this, oParent, sQuery); + this.doQuery(oCallbackFn, sQuery, oParent); + } +}; + +/** + * Abstract method implemented by subclasses to make a query to the live data + * source. Must call the callback function with the response returned from the + * query. Populates cache (if enabled). + * + * @method doQuery + * @param oCallbackFn {HTMLFunction} Callback function implemented by oParent to which to return results. + * @param sQuery {String} Query string. + * @param oParent {Object} The object instance that has requested data. + */ +YAHOO.widget.DataSource.prototype.doQuery = function(oCallbackFn, sQuery, oParent) { + /* override this */ +}; + +/** + * Flushes cache. + * + * @method flushCache + */ +YAHOO.widget.DataSource.prototype.flushCache = function() { + if(this._aCache) { + this._aCache = []; + } + if(this._aCacheHelper) { + this._aCacheHelper = []; + } + this.cacheFlushEvent.fire(this); +}; + +///////////////////////////////////////////////////////////////////////////// +// +// Public events +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Fired when a query is made to the live data source. + * + * @event queryEvent + * @param oSelf {Object} The DataSource instance. + * @param oParent {Object} The requesting object. + * @param sQuery {String} The query string. + */ +YAHOO.widget.DataSource.prototype.queryEvent = null; + +/** + * Fired when a query is made to the local cache. + * + * @event cacheQueryEvent + * @param oSelf {Object} The DataSource instance. + * @param oParent {Object} The requesting object. + * @param sQuery {String} The query string. + */ +YAHOO.widget.DataSource.prototype.cacheQueryEvent = null; + +/** + * Fired when data is retrieved from the live data source. + * + * @event getResultsEvent + * @param oSelf {Object} The DataSource instance. + * @param oParent {Object} The requesting object. + * @param sQuery {String} The query string. + * @param aResults {Object[]} Array of result objects. + */ +YAHOO.widget.DataSource.prototype.getResultsEvent = null; + +/** + * Fired when data is retrieved from the local cache. + * + * @event getCachedResultsEvent + * @param oSelf {Object} The DataSource instance. + * @param oParent {Object} The requesting object. + * @param sQuery {String} The query string. + * @param aResults {Object[]} Array of result objects. + */ +YAHOO.widget.DataSource.prototype.getCachedResultsEvent = null; + +/** + * Fired when an error is encountered with the live data source. + * + * @event dataErrorEvent + * @param oSelf {Object} The DataSource instance. + * @param oParent {Object} The requesting object. + * @param sQuery {String} The query string. + * @param sMsg {String} Error message string + */ +YAHOO.widget.DataSource.prototype.dataErrorEvent = null; + +/** + * Fired when the local cache is flushed. + * + * @event cacheFlushEvent + * @param oSelf {Object} The DataSource instance + */ +YAHOO.widget.DataSource.prototype.cacheFlushEvent = null; + +///////////////////////////////////////////////////////////////////////////// +// +// Private member variables +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Internal class variable to index multiple DataSource instances. + * + * @property _nIndex + * @type Number + * @private + * @static + */ +YAHOO.widget.DataSource._nIndex = 0; + +/** + * Name of DataSource instance. + * + * @property _sName + * @type String + * @private + */ +YAHOO.widget.DataSource.prototype._sName = null; + +/** + * Local cache of data result objects indexed chronologically. + * + * @property _aCache + * @type Object[] + * @private + */ +YAHOO.widget.DataSource.prototype._aCache = null; + + +///////////////////////////////////////////////////////////////////////////// +// +// Private methods +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Initializes DataSource instance. + * + * @method _init + * @private + */ +YAHOO.widget.DataSource.prototype._init = function() { + // Validate and initialize public configs + var maxCacheEntries = this.maxCacheEntries; + if(isNaN(maxCacheEntries) || (maxCacheEntries < 0)) { + maxCacheEntries = 0; + } + // Initialize local cache + if(maxCacheEntries > 0 && !this._aCache) { + this._aCache = []; + } + + this._sName = "instance" + YAHOO.widget.DataSource._nIndex; + YAHOO.widget.DataSource._nIndex++; + + this.queryEvent = new YAHOO.util.CustomEvent("query", this); + this.cacheQueryEvent = new YAHOO.util.CustomEvent("cacheQuery", this); + this.getResultsEvent = new YAHOO.util.CustomEvent("getResults", this); + this.getCachedResultsEvent = new YAHOO.util.CustomEvent("getCachedResults", this); + this.dataErrorEvent = new YAHOO.util.CustomEvent("dataError", this); + this.cacheFlushEvent = new YAHOO.util.CustomEvent("cacheFlush", this); +}; + +/** + * Adds a result object to the local cache, evicting the oldest element if the + * cache is full. Newer items will have higher indexes, the oldest item will have + * index of 0. + * + * @method _addCacheElem + * @param oResult {Object} Data result object, including array of results. + * @private + */ +YAHOO.widget.DataSource.prototype._addCacheElem = function(oResult) { + var aCache = this._aCache; + // Don't add if anything important is missing. + if(!aCache || !oResult || !oResult.query || !oResult.results) { + return; + } + + // If the cache is full, make room by removing from index=0 + if(aCache.length >= this.maxCacheEntries) { + aCache.shift(); + } + + // Add to cache, at the end of the array + aCache.push(oResult); +}; + +/** + * Queries the local cache for results. If query has been cached, the callback + * function is called with the results, and the cached is refreshed so that it + * is now the newest element. + * + * @method _doQueryCache + * @param oCallbackFn {HTMLFunction} Callback function defined by oParent object to which to return results. + * @param sQuery {String} Query string. + * @param oParent {Object} The object instance that has requested data. + * @return aResults {Object[]} Array of results from local cache if found, otherwise null. + * @private + */ +YAHOO.widget.DataSource.prototype._doQueryCache = function(oCallbackFn, sQuery, oParent) { + var aResults = []; + var bMatchFound = false; + var aCache = this._aCache; + var nCacheLength = (aCache) ? aCache.length : 0; + var bMatchContains = this.queryMatchContains; + + // If cache is enabled... + if((this.maxCacheEntries > 0) && aCache && (nCacheLength > 0)) { + this.cacheQueryEvent.fire(this, oParent, sQuery); + // If case is unimportant, normalize query now instead of in loops + if(!this.queryMatchCase) { + var sOrigQuery = sQuery; + sQuery = sQuery.toLowerCase(); + } + + // Loop through each cached element's query property... + for(var i = nCacheLength-1; i >= 0; i--) { + var resultObj = aCache[i]; + var aAllResultItems = resultObj.results; + // If case is unimportant, normalize match key for comparison + var matchKey = (!this.queryMatchCase) ? + encodeURIComponent(resultObj.query).toLowerCase(): + encodeURIComponent(resultObj.query); + + // If a cached match key exactly matches the query... + if(matchKey == sQuery) { + // Stash all result objects into aResult[] and stop looping through the cache. + bMatchFound = true; + aResults = aAllResultItems; + + // The matching cache element was not the most recent, + // so now we need to refresh the cache. + if(i != nCacheLength-1) { + // Remove element from its original location + aCache.splice(i,1); + // Add element as newest + this._addCacheElem(resultObj); + } + break; + } + // Else if this query is not an exact match and subset matching is enabled... + else if(this.queryMatchSubset) { + // Loop through substrings of each cached element's query property... + for(var j = sQuery.length-1; j >= 0 ; j--) { + var subQuery = sQuery.substr(0,j); + + // If a substring of a cached sQuery exactly matches the query... + if(matchKey == subQuery) { + bMatchFound = true; + + // Go through each cached result object to match against the query... + for(var k = aAllResultItems.length-1; k >= 0; k--) { + var aRecord = aAllResultItems[k]; + var sKeyIndex = (this.queryMatchCase) ? + encodeURIComponent(aRecord[0]).indexOf(sQuery): + encodeURIComponent(aRecord[0]).toLowerCase().indexOf(sQuery); + + // A STARTSWITH match is when the query is found at the beginning of the key string... + if((!bMatchContains && (sKeyIndex === 0)) || + // A CONTAINS match is when the query is found anywhere within the key string... + (bMatchContains && (sKeyIndex > -1))) { + // Stash a match into aResults[]. + aResults.unshift(aRecord); + } + } + + // Add the subset match result set object as the newest element to cache, + // and stop looping through the cache. + resultObj = {}; + resultObj.query = sQuery; + resultObj.results = aResults; + this._addCacheElem(resultObj); + break; + } + } + if(bMatchFound) { + break; + } + } + } + + // If there was a match, send along the results. + if(bMatchFound) { + this.getCachedResultsEvent.fire(this, oParent, sOrigQuery, aResults); + oCallbackFn(sOrigQuery, aResults, oParent); + } + } + return aResults; +}; + + +/****************************************************************************/ +/****************************************************************************/ +/****************************************************************************/ + +/** + * Implementation of YAHOO.widget.DataSource using XML HTTP requests that return + * query results. + * + * @class DS_XHR + * @extends YAHOO.widget.DataSource + * @requires connection + * @constructor + * @param sScriptURI {String} Absolute or relative URI to script that returns query + * results as JSON, XML, or delimited flat-file data. + * @param aSchema {String[]} Data schema definition of results. + * @param oConfigs {Object} (optional) Object literal of config params. + */ +YAHOO.widget.DS_XHR = function(sScriptURI, aSchema, oConfigs) { + // Set any config params passed in to override defaults + if(typeof oConfigs == "object") { + for(var sConfig in oConfigs) { + this[sConfig] = oConfigs[sConfig]; + } + } + + // Initialization sequence + if(!aSchema || (aSchema.constructor != Array)) { + return; + } + else { + this.schema = aSchema; + } + this.scriptURI = sScriptURI; + this._init(); +}; + +YAHOO.widget.DS_XHR.prototype = new YAHOO.widget.DataSource(); + +///////////////////////////////////////////////////////////////////////////// +// +// Public constants +// +///////////////////////////////////////////////////////////////////////////// + +/** + * JSON data type. + * + * @property TYPE_JSON + * @type Number + * @static + * @final + */ +YAHOO.widget.DS_XHR.TYPE_JSON = 0; + +/** + * XML data type. + * + * @property TYPE_XML + * @type Number + * @static + * @final + */ +YAHOO.widget.DS_XHR.TYPE_XML = 1; + +/** + * Flat-file data type. + * + * @property TYPE_FLAT + * @type Number + * @static + * @final + */ +YAHOO.widget.DS_XHR.TYPE_FLAT = 2; + +/** + * Error message for XHR failure. + * + * @property ERROR_DATAXHR + * @type String + * @static + * @final + */ +YAHOO.widget.DS_XHR.ERROR_DATAXHR = "XHR response failed"; + +///////////////////////////////////////////////////////////////////////////// +// +// Public member variables +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Alias to YUI Connection Manager. Allows implementers to specify their own + * subclasses of the YUI Connection Manager utility. + * + * @property connMgr + * @type Object + * @default YAHOO.util.Connect + */ +YAHOO.widget.DS_XHR.prototype.connMgr = YAHOO.util.Connect; + +/** + * Number of milliseconds the XHR connection will wait for a server response. A + * a value of zero indicates the XHR connection will wait forever. Any value + * greater than zero will use the Connection utility's Auto-Abort feature. + * + * @property connTimeout + * @type Number + * @default 0 + */ +YAHOO.widget.DS_XHR.prototype.connTimeout = 0; + +/** + * Absolute or relative URI to script that returns query results. For instance, + * queries will be sent to <scriptURI>?<scriptQueryParam>=userinput + * + * @property scriptURI + * @type String + */ +YAHOO.widget.DS_XHR.prototype.scriptURI = null; + +/** + * Query string parameter name sent to scriptURI. For instance, queries will be + * sent to <scriptURI>?<scriptQueryParam>=userinput + * + * @property scriptQueryParam + * @type String + * @default "query" + */ +YAHOO.widget.DS_XHR.prototype.scriptQueryParam = "query"; + +/** + * String of key/value pairs to append to requests made to scriptURI. Define + * this string when you want to send additional query parameters to your script. + * When defined, queries will be sent to + * <scriptURI>?<scriptQueryParam>=userinput&<scriptQueryAppend> + * + * @property scriptQueryAppend + * @type String + * @default "" + */ +YAHOO.widget.DS_XHR.prototype.scriptQueryAppend = ""; + +/** + * XHR response data type. Other types that may be defined are YAHOO.widget.DS_XHR.TYPE_XML + * and YAHOO.widget.DS_XHR.TYPE_FLAT. + * + * @property responseType + * @type String + * @default YAHOO.widget.DS_XHR.TYPE_JSON + */ +YAHOO.widget.DS_XHR.prototype.responseType = YAHOO.widget.DS_XHR.TYPE_JSON; + +/** + * String after which to strip results. If the results from the XHR are sent + * back as HTML, the gzip HTML comment appears at the end of the data and should + * be ignored. + * + * @property responseStripAfter + * @type String + * @default "\n<!-" + */ +YAHOO.widget.DS_XHR.prototype.responseStripAfter = "\n 0) { + sUri += "&" + this.scriptQueryAppend; + } + var oResponse = null; + + var oSelf = this; + /* + * Sets up ajax request callback + * + * @param {object} oReq HTTPXMLRequest object + * @private + */ + var responseSuccess = function(oResp) { + // Response ID does not match last made request ID. + if(!oSelf._oConn || (oResp.tId != oSelf._oConn.tId)) { + oSelf.dataErrorEvent.fire(oSelf, oParent, sQuery, YAHOO.widget.DataSource.ERROR_DATANULL); + return; + } +//DEBUG +for(var foo in oResp) { +} + if(!isXML) { + oResp = oResp.responseText; + } + else { + oResp = oResp.responseXML; + } + if(oResp === null) { + oSelf.dataErrorEvent.fire(oSelf, oParent, sQuery, YAHOO.widget.DataSource.ERROR_DATANULL); + return; + } + + var aResults = oSelf.parseResponse(sQuery, oResp, oParent); + var resultObj = {}; + resultObj.query = decodeURIComponent(sQuery); + resultObj.results = aResults; + if(aResults === null) { + oSelf.dataErrorEvent.fire(oSelf, oParent, sQuery, YAHOO.widget.DataSource.ERROR_DATAPARSE); + aResults = []; + } + else { + oSelf.getResultsEvent.fire(oSelf, oParent, sQuery, aResults); + oSelf._addCacheElem(resultObj); + } + oCallbackFn(sQuery, aResults, oParent); + }; + + var responseFailure = function(oResp) { + oSelf.dataErrorEvent.fire(oSelf, oParent, sQuery, YAHOO.widget.DS_XHR.ERROR_DATAXHR); + return; + }; + + var oCallback = { + success:responseSuccess, + failure:responseFailure + }; + + if(!isNaN(this.connTimeout) && this.connTimeout > 0) { + oCallback.timeout = this.connTimeout; + } + + if(this._oConn) { + this.connMgr.abort(this._oConn); + } + + oSelf._oConn = this.connMgr.asyncRequest("GET", sUri, oCallback, null); +}; + +/** + * Parses raw response data into an array of result objects. The result data key + * is always stashed in the [0] element of each result object. + * + * @method parseResponse + * @param sQuery {String} Query string. + * @param oResponse {Object} The raw response data to parse. + * @param oParent {Object} The object instance that has requested data. + * @returns {Object[]} Array of result objects. + */ +YAHOO.widget.DS_XHR.prototype.parseResponse = function(sQuery, oResponse, oParent) { + var aSchema = this.schema; + var aResults = []; + var bError = false; + + // Strip out comment at the end of results + var nEnd = ((this.responseStripAfter !== "") && (oResponse.indexOf)) ? + oResponse.indexOf(this.responseStripAfter) : -1; + if(nEnd != -1) { + oResponse = oResponse.substring(0,nEnd); + } + + switch (this.responseType) { + case YAHOO.widget.DS_XHR.TYPE_JSON: + var jsonList; + // Divert KHTML clients from JSON lib + if(window.JSON && (navigator.userAgent.toLowerCase().indexOf('khtml')== -1)) { + // Use the JSON utility if available + var jsonObjParsed = JSON.parse(oResponse); + if(!jsonObjParsed) { + bError = true; + break; + } + else { + try { + // eval is necessary here since aSchema[0] is of unknown depth + jsonList = eval("jsonObjParsed." + aSchema[0]); + } + catch(e) { + bError = true; + break; + } + } + } + else { + // Parse the JSON response as a string + try { + // Trim leading spaces + while (oResponse.substring(0,1) == " ") { + oResponse = oResponse.substring(1, oResponse.length); + } + + // Invalid JSON response + if(oResponse.indexOf("{") < 0) { + bError = true; + break; + } + + // Empty (but not invalid) JSON response + if(oResponse.indexOf("{}") === 0) { + break; + } + + // Turn the string into an object literal... + // ...eval is necessary here + var jsonObjRaw = eval("(" + oResponse + ")"); + if(!jsonObjRaw) { + bError = true; + break; + } + + // Grab the object member that contains an array of all reponses... + // ...eval is necessary here since aSchema[0] is of unknown depth + jsonList = eval("(jsonObjRaw." + aSchema[0]+")"); + } + catch(e) { + bError = true; + break; + } + } + + if(!jsonList) { + bError = true; + break; + } + + if(jsonList.constructor != Array) { + jsonList = [jsonList]; + } + + // Loop through the array of all responses... + for(var i = jsonList.length-1; i >= 0 ; i--) { + var aResultItem = []; + var jsonResult = jsonList[i]; + // ...and loop through each data field value of each response + for(var j = aSchema.length-1; j >= 1 ; j--) { + // ...and capture data into an array mapped according to the schema... + var dataFieldValue = jsonResult[aSchema[j]]; + if(!dataFieldValue) { + dataFieldValue = ""; + } + aResultItem.unshift(dataFieldValue); + } + // If schema isn't well defined, pass along the entire result object + if(aResultItem.length == 1) { + aResultItem.push(jsonResult); + } + // Capture the array of data field values in an array of results + aResults.unshift(aResultItem); + } + break; + case YAHOO.widget.DS_XHR.TYPE_XML: + // Get the collection of results + var xmlList = oResponse.getElementsByTagName(aSchema[0]); + if(!xmlList) { + bError = true; + break; + } + // Loop through each result + for(var k = xmlList.length-1; k >= 0 ; k--) { + var result = xmlList.item(k); + var aFieldSet = []; + // Loop through each data field in each result using the schema + for(var m = aSchema.length-1; m >= 1 ; m--) { + var sValue = null; + // Values may be held in an attribute... + var xmlAttr = result.attributes.getNamedItem(aSchema[m]); + if(xmlAttr) { + sValue = xmlAttr.value; + } + // ...or in a node + else{ + var xmlNode = result.getElementsByTagName(aSchema[m]); + if(xmlNode && xmlNode.item(0) && xmlNode.item(0).firstChild) { + sValue = xmlNode.item(0).firstChild.nodeValue; + } + else { + sValue = ""; + } + } + // Capture the schema-mapped data field values into an array + aFieldSet.unshift(sValue); + } + // Capture each array of values into an array of results + aResults.unshift(aFieldSet); + } + break; + case YAHOO.widget.DS_XHR.TYPE_FLAT: + if(oResponse.length > 0) { + // Delete the last line delimiter at the end of the data if it exists + var newLength = oResponse.length-aSchema[0].length; + if(oResponse.substr(newLength) == aSchema[0]) { + oResponse = oResponse.substr(0, newLength); + } + var aRecords = oResponse.split(aSchema[0]); + for(var n = aRecords.length-1; n >= 0; n--) { + aResults[n] = aRecords[n].split(aSchema[1]); + } + } + break; + default: + break; + } + sQuery = null; + oResponse = null; + oParent = null; + if(bError) { + return null; + } + else { + return aResults; + } +}; + +///////////////////////////////////////////////////////////////////////////// +// +// Private member variables +// +///////////////////////////////////////////////////////////////////////////// + +/** + * XHR connection object. + * + * @property _oConn + * @type Object + * @private + */ +YAHOO.widget.DS_XHR.prototype._oConn = null; + + +/****************************************************************************/ +/****************************************************************************/ +/****************************************************************************/ + +/** + * Implementation of YAHOO.widget.DataSource using a native Javascript function as + * its live data source. + * + * @class DS_JSFunction + * @constructor + * @extends YAHOO.widget.DataSource + * @param oFunction {HTMLFunction} In-memory Javascript function that returns query results as an array of objects. + * @param oConfigs {Object} (optional) Object literal of config params. + */ +YAHOO.widget.DS_JSFunction = function(oFunction, oConfigs) { + // Set any config params passed in to override defaults + if(typeof oConfigs == "object") { + for(var sConfig in oConfigs) { + this[sConfig] = oConfigs[sConfig]; + } + } + + // Initialization sequence + if(!oFunction || (oFunction.constructor != Function)) { + return; + } + else { + this.dataFunction = oFunction; + this._init(); + } +}; + +YAHOO.widget.DS_JSFunction.prototype = new YAHOO.widget.DataSource(); + +///////////////////////////////////////////////////////////////////////////// +// +// Public member variables +// +///////////////////////////////////////////////////////////////////////////// + +/** + * In-memory Javascript function that returns query results. + * + * @property dataFunction + * @type HTMLFunction + */ +YAHOO.widget.DS_JSFunction.prototype.dataFunction = null; + +///////////////////////////////////////////////////////////////////////////// +// +// Public methods +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Queries the live data source defined by function for results. Results are + * passed back to a callback function. + * + * @method doQuery + * @param oCallbackFn {HTMLFunction} Callback function defined by oParent object to which to return results. + * @param sQuery {String} Query string. + * @param oParent {Object} The object instance that has requested data. + */ +YAHOO.widget.DS_JSFunction.prototype.doQuery = function(oCallbackFn, sQuery, oParent) { + var oFunction = this.dataFunction; + var aResults = []; + + aResults = oFunction(sQuery); + if(aResults === null) { + this.dataErrorEvent.fire(this, oParent, sQuery, YAHOO.widget.DataSource.ERROR_DATANULL); + return; + } + + var resultObj = {}; + resultObj.query = decodeURIComponent(sQuery); + resultObj.results = aResults; + this._addCacheElem(resultObj); + + this.getResultsEvent.fire(this, oParent, sQuery, aResults); + oCallbackFn(sQuery, aResults, oParent); + return; +}; + +/****************************************************************************/ +/****************************************************************************/ +/****************************************************************************/ + +/** + * Implementation of YAHOO.widget.DataSource using a native Javascript array as + * its live data source. + * + * @class DS_JSArray + * @constructor + * @extends YAHOO.widget.DataSource + * @param aData {String[]} In-memory Javascript array of simple string data. + * @param oConfigs {Object} (optional) Object literal of config params. + */ +YAHOO.widget.DS_JSArray = function(aData, oConfigs) { + // Set any config params passed in to override defaults + if(typeof oConfigs == "object") { + for(var sConfig in oConfigs) { + this[sConfig] = oConfigs[sConfig]; + } + } + + // Initialization sequence + if(!aData || (aData.constructor != Array)) { + return; + } + else { + this.data = aData; + this._init(); + } +}; + +YAHOO.widget.DS_JSArray.prototype = new YAHOO.widget.DataSource(); + +///////////////////////////////////////////////////////////////////////////// +// +// Public member variables +// +///////////////////////////////////////////////////////////////////////////// + +/** + * In-memory Javascript array of strings. + * + * @property data + * @type Array + */ +YAHOO.widget.DS_JSArray.prototype.data = null; + +///////////////////////////////////////////////////////////////////////////// +// +// Public methods +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Queries the live data source defined by data for results. Results are passed + * back to a callback function. + * + * @method doQuery + * @param oCallbackFn {HTMLFunction} Callback function defined by oParent object to which to return results. + * @param sQuery {String} Query string. + * @param oParent {Object} The object instance that has requested data. + */ +YAHOO.widget.DS_JSArray.prototype.doQuery = function(oCallbackFn, sQuery, oParent) { + var aData = this.data; // the array + var aResults = []; // container for results + var bMatchFound = false; + var bMatchContains = this.queryMatchContains; + if(sQuery) { + if(!this.queryMatchCase) { + sQuery = sQuery.toLowerCase(); + } + + // Loop through each element of the array... + // which can be a string or an array of strings + for(var i = aData.length-1; i >= 0; i--) { + var aDataset = []; + + if(aData[i]) { + if(aData[i].constructor == String) { + aDataset[0] = aData[i]; + } + else if(aData[i].constructor == Array) { + aDataset = aData[i]; + } + } + + if(aDataset[0] && (aDataset[0].constructor == String)) { + var sKeyIndex = (this.queryMatchCase) ? + encodeURIComponent(aDataset[0]).indexOf(sQuery): + encodeURIComponent(aDataset[0]).toLowerCase().indexOf(sQuery); + + // A STARTSWITH match is when the query is found at the beginning of the key string... + if((!bMatchContains && (sKeyIndex === 0)) || + // A CONTAINS match is when the query is found anywhere within the key string... + (bMatchContains && (sKeyIndex > -1))) { + // Stash a match into aResults[]. + aResults.unshift(aDataset); + } + } + } + } + + this.getResultsEvent.fire(this, oParent, sQuery, aResults); + oCallbackFn(sQuery, aResults, oParent); +}; + +YAHOO.register("autocomplete", YAHOO.widget.AutoComplete, {version: "2.2.0", build: "127"}); diff --git a/interface/ispconfig/interface/js/yui/button/README b/interface/ispconfig/interface/js/yui/button/README new file mode 100644 index 0000000000000000000000000000000000000000..036e33d9c947f2417b1625ab8657e8dd17a5f9e6 --- /dev/null +++ b/interface/ispconfig/interface/js/yui/button/README @@ -0,0 +1,3 @@ +*** Version 2.2.0 *** + +* Button Control introduced \ No newline at end of file diff --git a/interface/ispconfig/interface/js/yui/button/assets/background.png b/interface/ispconfig/interface/js/yui/button/assets/background.png new file mode 100644 index 0000000000000000000000000000000000000000..87c85b5e539b5c514df107bbb4e298948a016e3d Binary files /dev/null and b/interface/ispconfig/interface/js/yui/button/assets/background.png differ diff --git a/interface/ispconfig/interface/js/yui/button/assets/button.css b/interface/ispconfig/interface/js/yui/button/assets/button.css new file mode 100644 index 0000000000000000000000000000000000000000..ff90c8ec844778e084026a23c0552bfb33cec1a3 --- /dev/null +++ b/interface/ispconfig/interface/js/yui/button/assets/button.css @@ -0,0 +1,217 @@ +/* +Copyright (c) 2007, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.2.0 +*/ +.yuibutton { + + display:-moz-inline-stack; /* Gecko */ + display:inline-block; /* IE, Opera and Safari */ + + border-width:1px 0; + border-style:solid; + border-color:#999; + + background:#ecece3 url(background.png) left center; + + /* Give the transparent background image to IE 6 */ + _background-image:none; + _filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='../../build/button/assets/background.png', sizingMethod = 'scale'); + + margin:auto .25em; + +} + +.yuibutton .first-child { + + display:block; /* Gecko, Opera and Safari */ + *display:inline-block; /* IE */ + + border-width:0 1px; + border-style:solid; + border-color:#999; + + margin:0 -1px; + *position:relative; + *left:-1px; + +} + +.yuibutton button, +.yuibutton a { + + display:block; /* Opera and Safari */ + display:-moz-inline-block; /* Gecko */ + *display:inline-block; /* IE */ + padding:.25em .5em; + border:1px solid #ccc; + +} + +.yuibutton button { + + overflow:visible; /* Remove superfluous padding for IE */ + font-size:100%; /* Makes form controls resizable in IE */ + background-color:transparent; + cursor:pointer; + cursor:hand; + +} + +.yuibutton a { + + text-decoration:none; + color:#000; + +} + +.yuibutton.splitbutton button, +.yuibutton.menubutton button { + + padding-right:20px; + background-position:right center; + background-repeat:no-repeat; + +} + +.yuibutton.menubutton button { + + background-image:url(menuarrow.gif); + +} + +.yuibutton.splitbutton button { + + background-image:url(splitarrow.gif); + +} + + +/* Focus state */ + +.yuibutton.focus { + + border-color:#5e5c95; + +} + +.yuibutton.focus .first-child { + + border-color:#5e5c95; + +} + +.yuibutton.focus button, +.yuibutton.focus a { + + border-color:#cec1fc; + +} + + +/* Hover state */ + +.yuibutton.hover { + + border-color:#406fac; + background-color:#98d5fc; + +} + +.yuibutton.hover .first-child { + + border-color:#406fac; + +} + +.yuibutton.hover button, +.yuibutton.hover a { + + border-color:#7099ce; + +} + + +/* Active state */ + +.yuibutton.active { + + border-color:#7a8180; + background-color:#333; + +} + +.yuibutton.active .first-child { + + border-color:#7a8180; + +} + +.yuibutton.active button, +.yuibutton.active a { + + border-color:#98a09f; + +} + +.yuibutton.splitbutton.activeoption button { + + background-color:transparent; + background-image:url(splitarrow_active.gif); + +} + + + +/* Checked state */ + +.yuibutton.radio.checked, +.yuibutton.checkbox.checked { + + border-color:#7a8180; + background-color:#333; + +} + +.yuibutton.radio.checked .first-child, +.yuibutton.checkbox.checked .first-child { + + border-color:#7a8180; + +} + +.yuibutton.radio.checked button, +.yuibutton.checkbox.checked button { + + border-color:#98a09f; + +} + + + +/* Disabled state */ + +.yuibutton.disabled { + + border-color:#cbcdc5; + background:#ecece3; + + _filter:none; + +} + +.yuibutton.disabled .first-child { + + border-color:#cbcdc5; + +} + +.yuibutton.disabled button, +.yuibutton.disabled a { + + border-color:transparent; + color:#b9b9b9; + cursor:default; + +} \ No newline at end of file diff --git a/interface/ispconfig/interface/js/yui/button/assets/menuarrow.gif b/interface/ispconfig/interface/js/yui/button/assets/menuarrow.gif new file mode 100644 index 0000000000000000000000000000000000000000..ffa2ba9d25d7ec10438cc1c8ac043c99d4cd7d55 Binary files /dev/null and b/interface/ispconfig/interface/js/yui/button/assets/menuarrow.gif differ diff --git a/interface/ispconfig/interface/js/yui/button/assets/splitarrow.gif b/interface/ispconfig/interface/js/yui/button/assets/splitarrow.gif new file mode 100644 index 0000000000000000000000000000000000000000..6d1ce65940cde97983279c08a144b48d9e8e4b89 Binary files /dev/null and b/interface/ispconfig/interface/js/yui/button/assets/splitarrow.gif differ diff --git a/interface/ispconfig/interface/js/yui/button/assets/splitarrow_active.gif b/interface/ispconfig/interface/js/yui/button/assets/splitarrow_active.gif new file mode 100644 index 0000000000000000000000000000000000000000..25c0884e06acfc235acccf87d3ae141edfe8dbdf Binary files /dev/null and b/interface/ispconfig/interface/js/yui/button/assets/splitarrow_active.gif differ diff --git a/interface/ispconfig/interface/js/yui/button/button-beta-debug.js b/interface/ispconfig/interface/js/yui/button/button-beta-debug.js new file mode 100644 index 0000000000000000000000000000000000000000..e9403670babad2acddd7bdacb57c1f556cb7c584 --- /dev/null +++ b/interface/ispconfig/interface/js/yui/button/button-beta-debug.js @@ -0,0 +1,4061 @@ +/* +Copyright (c) 2007, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.2.0 +*/ +/** +* @module button +* @description

The Button Control enables the creation of rich, graphical +* buttons that function like traditional HTML form buttons. Unlike +* tradition HTML form buttons, buttons created with the Button Control can have +* a label that is different from its value. With the inclusion of the optional +* Menu Control, the Button Control can also be +* used to create menu buttons and split buttons, controls that are not +* available natively in HTML. The Button Control can also be thought of as a +* way to create more visually engaging implementations of the browser's +* default radio-button and check-box controls.

+*

The Button Control supports the following types:

+*
+*
button
+*
Basic push button that can execute a user-specified command when +* pressed.
+*
link
+*
Navigates to a specified url when pressed.
+*
submit
+*
Submits the parent form when pressed.
+*
reset
+*
Resets the parent form when pressed.
+*
checkbox
+*
Maintains a "checked" state that can be toggled on and off.
+*
radio
+*
Maintains a "checked" state that can be toggled on and off. Use with +* the ButtonGroup class to create a set of controls that are mutually +* exclusive; checking one button in the set will uncheck all others in +* the group.
+*
menubutton
+*
When pressed will show/hide a menu.
+*
splitbutton
+*
Can execute a user-specified command or display a menu when pressed.
+*
+* @title Button +* @namespace YAHOO.widget +* @requires yahoo, dom, element, event +* @optional container, menu +* @beta +*/ + + +(function() { + +// Shorthard for utilities + +var Dom = YAHOO.util.Dom, + Event = YAHOO.util.Event, + Lang = YAHOO.lang, + + + // Private member variables + + m_oButtons = {}, + m_oFocusedButton = null; + + + +// Constructor + + +/** +* The Button class creates a rich, graphical button. +* @param {String} p_oElement String specifying the id attribute of the +* <input>, <a> or +* <span> element to be used to create the button. +* @param {HTMLInputElement|HTMLElement} p_oElement Object reference for the +* <input>, <a> or +* <span> element to be used to create the button. +* @param {Object} p_oElement Object literal specifying a set of configuration +* attributes used to create the button. +* @param {Object} p_oAttributes Optional. Object literal specifying a set of +* configuration attributes used to create the button. +* @namespace YAHOO.widget +* @class Button +* @constructor +* @extends YAHOO.util.Element +*/ +YAHOO.widget.Button = function(p_oElement, p_oAttributes) { + + var fnSuperClass = YAHOO.widget.Button.superclass.constructor; + + if( + arguments.length == 1 && + !Lang.isString(p_oElement) && + !p_oElement.nodeName + ) { + + if(!p_oElement.id) { + + p_oElement.id = Dom.generateId(); + + YAHOO.log( + "No value specified for the button's \"id\" attribute. " + + "Setting button id to \"" + p_oElement.id + "\".", + "warn" + ); + + } + + this.logger = new YAHOO.widget.LogWriter("Button " + p_oElement.id); + + this.logger.log( + "No source HTML element. " + + "Building the button using the set of configuration attributes." + ); + + fnSuperClass.call( + this, + (this._createButtonElement(p_oElement.type)), + p_oElement + ); + + } + else { + + var oConfig = { + + element: null, + attributes: (p_oAttributes || {}) + + }; + + + if(Lang.isString(p_oElement)) { + + var me = this; + + Event.onAvailable(p_oElement, function() { + + var sTagName = this.tagName.toUpperCase(); + + if(sTagName == me.TAG_NAME) { + + oConfig.attributes.id = this.id; + + } + else if(sTagName == "INPUT" && !oConfig.attributes.id) { + + oConfig.attributes.id = Dom.generateId(); + + YAHOO.log( + "No value specified for the button's \"id\" " + + "attribute. Setting button id to \"" + + oConfig.attributes.id + "\".", + "warn" + ); + + } + + me.logger = new YAHOO.widget.LogWriter( + "Button " + oConfig.attributes.id + ); + + me.logger.log( + "Building the button using an existing HTML " + + "element as a source element." + ); + + + oConfig.attributes.srcelement = this; + + initConfig.call(me, oConfig); + + + if(!oConfig.element) { + + me.logger.log( + "Source element could not be used as is. " + + "Creating a new HTML element for the button." + ); + + oConfig.element = + me._createButtonElement(oConfig.attributes.type); + + } + + fnSuperClass.call(me, oConfig.element, oConfig.attributes); + + }); + + } + else { + + var sTagName = p_oElement.tagName.toUpperCase(); + + if(sTagName == this.TAG_NAME) { + + if(p_oElement.id) { + + oConfig.attributes.id = p_oElement.id; + + } + else { + + oConfig.attributes.id = Dom.generateId(); + + YAHOO.log( + "No value specified for the button's \"id\" " + + "attribute. Setting button id to \"" + + oConfig.attributes.id + "\".", + "warn" + ); + + } + + + } + else if(sTagName == "INPUT" && !oConfig.attributes.id) { + + oConfig.attributes.id = Dom.generateId(); + + YAHOO.log( + "No value specified for the button's \"id\" " + + "attribute. Setting button id to \"" + + oConfig.attributes.id + "\".", + "warn" + ); + + } + + this.logger = + new YAHOO.widget.LogWriter("Button " + oConfig.attributes.id); + + this.logger.log( + "Building the button using an existing HTML element as " + + "a source element." + ); + + + oConfig.attributes.srcelement = p_oElement; + + initConfig.call(this, oConfig); + + + if(!oConfig.element) { + + this.logger.log( + "Source element could not be used as is. " + + "Creating a new HTML element for the button." + ); + + oConfig.element = + this._createButtonElement(oConfig.attributes.type); + + } + + fnSuperClass.call(this, oConfig.element, oConfig.attributes); + + } + + } + +}; + + + +// Private methods + + +/** +* @method getFirstElement +* @description Returns an HTML element's first HTML element node. +* @private +* @param {HTMLElement} p_oElement Object +* reference specifying the element to be evaluated. +* @return {HTMLElement} +*/ +function getFirstElement(p_oElement) { + + var oFirstChild = p_oElement.firstChild; + + if(oFirstChild) { + + if(oFirstChild.nodeType == 1) { + + return oFirstChild; + + } + else { + + var oNextSibling = oFirstChild.nextSibling; + + if(oNextSibling && oNextSibling.nodeType == 1) { + + return oNextSibling; + + } + + } + + } + +} + + +/** +* @method createInputElement +* @description Creates an <input> element of the +* specified type. +* @private +* @param {String} p_sType String specifying the type of +* <input> element to create. +* @param {String} p_sName String specifying the name of +* <input> element to create. +* @param {String} p_sValue String specifying the value of +* <input> element to create. +* @param {String} p_bChecked Boolean specifying if the +* <input> element is to be checked. +* @return {HTMLInputElement} +*/ +function createInputElement(p_sType, p_sName, p_sValue, p_bChecked) { + + var oInput; + + if(navigator.userAgent.indexOf("MSIE") != -1) { + + /* + For IE it is necessary to create the element with the + "type," "name," "value," and "checked" properties set all at once. + */ + + var sInput = "<input> or <a>) that map to +* Button configuration attributes and sets them into a collection that is +* passed to the Button constructor. +* @private +* @param {HTMLInputElement|HTMLAnchorElement} p_oElement Object reference to the HTML +* element (either <input> or <span>) +* used to create the button. +* @param {Object} p_oAttributes Object reference for the collection of +* configuration attributes used to create the button. +*/ +function setAttributesFromSrcElement(p_oElement, p_oAttributes) { + + var me = this; + + /** + * @method setAttributeFromDOMAttribute + * @description Gets the value of the specified DOM attribute and sets it + * into the collection of configuration attributes used to configure + * the button. + * @private + * @param {String} p_sAttribute String representing the name of the + * attribute to retrieve from the DOM element. + */ + function setAttributeFromDOMAttribute(p_sAttribute) { + + if( !(p_sAttribute in p_oAttributes) ) { + + /* + Need to use "getAttributeNode" instead of "getAttribute" + because using "getAttribute," IE will return the innerText of + a <button> for the value attribute rather + than the value of the "value" attribute. + */ + + var oAttribute = p_oElement.getAttributeNode(p_sAttribute); + + + if(oAttribute && ("value" in oAttribute)) { + + me.logger.log( + "Setting attribute \"" + p_sAttribute + "\" using " + + "source element's attribute value of \"" + + oAttribute.value + "\"" + ); + + p_oAttributes[p_sAttribute] = oAttribute.value; + + } + + } + + } + + + /** + * @method setFormElementProperties + * @description Gets the value of the attributes from the form element and + * sets them into the collection of configuration attributes used to + * configure the button. + * @private + */ + function setFormElementProperties() { + + setAttributeFromDOMAttribute("type"); + + if( !("disabled" in p_oAttributes) ) { + + p_oAttributes.disabled = p_oElement.disabled; + + } + + setAttributeFromDOMAttribute("name"); + setAttributeFromDOMAttribute("value"); + setAttributeFromDOMAttribute("title"); + + } + + + var sSrcElementTagName = p_oElement.tagName.toUpperCase(); + + + if( !("label" in p_oAttributes) ) { + + // Set the "label" property + + var sText = sSrcElementTagName == "INPUT" ? + p_oElement.value : p_oElement.innerHTML; + + + if(sText && sText.length > 0) { + + p_oAttributes.label = sText; + + } + + } + + + setAttributeFromDOMAttribute("tabindex"); + setAttributeFromDOMAttribute("accesskey"); + + + switch(sSrcElementTagName) { + + case "A": + + p_oAttributes.type = "link"; + + setAttributeFromDOMAttribute("href"); + setAttributeFromDOMAttribute("target"); + + break; + + case "INPUT": + + setFormElementProperties(); + + if( !("checked" in p_oAttributes) ) { + + p_oAttributes.checked = p_oElement.checked; + + } + + break; + + case "BUTTON": + + setFormElementProperties(); + + var oRootNode = p_oElement.parentNode.parentNode; + + if(Dom.hasClass(oRootNode, "checked")) { + + p_oAttributes.checked = true; + + } + + if(Dom.hasClass(oRootNode, "disabled")) { + + p_oAttributes.disabled = true; + + } + + p_oElement.removeAttribute("name"); + p_oElement.removeAttribute("value"); + + p_oElement.setAttribute("type", "button"); + + break; + + } + +} + + +/** +* @method initConfig +* @description Initializes the set of configuration attributes that are used to +* instantiate the button. +* @private +* @param {Object} Object representing the button's set of +* configuration attributes. +*/ +function initConfig(p_oConfig) { + + var oAttributes = p_oConfig.attributes, + oSrcElement = oAttributes.srcelement, + sSrcElementTagName = oSrcElement.tagName.toUpperCase(); + + + if(sSrcElementTagName == this.TAG_NAME) { + + p_oConfig.element = oSrcElement; + + var oFirstChild = getFirstElement(p_oConfig.element); + + Dom.addClass(oFirstChild, "first-child"); + + if(oFirstChild) { + + var oButton = getFirstElement(oFirstChild); + + + if(oButton) { + + var sButtonTagName = oButton.tagName.toUpperCase(); + + + if(sButtonTagName == "A" || sButtonTagName == "BUTTON") { + + setAttributesFromSrcElement.call( + this, + oButton, + oAttributes + ); + + } + + } + + } + + } + else if(sSrcElementTagName == "INPUT") { + + setAttributesFromSrcElement.call(this, oSrcElement, oAttributes); + + } + +} + + +YAHOO.extend(YAHOO.widget.Button, YAHOO.util.Element, { + + +// Protected properties + + +/** +* @property _button +* @description Object reference to the button's internal +* <a> or <button> element. +* @default null +* @protected +* @type HTMLAnchorElement|HTMLButtonElement +*/ +_button: null, + + +/** +* @property _menu +* @description Object reference to the button's menu. +* @default null +* @protected +* @type YAHOO.widget.Menu +*/ +_menu: null, + + +/** +* @property _onclickAttributeValue +* @description Object reference to the button's current value for the "onclick" +* configuration attribute. +* @default null +* @protected +* @type Object +*/ +_onclickAttributeValue: null, + + +/** +* @property _oninitAttributeValue +* @description Object reference to the button's current value for the "oninit" +* configuration attribute. +* @default null +* @protected +* @type Object +*/ +_oninitAttributeValue: null, + + +/** +* @property _activationKeyPressed +* @description Boolean indicating if the key(s) that toggle the button's +* "active" state have been pressed. +* @default false +* @protected +* @type Boolean +*/ +_activationKeyPressed: false, + + +/** +* @property _activationButtonPressed +* @description Boolean indicating if the mouse button that toggles the button's +* "active" state has been pressed. +* @default false +* @protected +* @type Boolean +*/ +_activationButtonPressed: false, + + +/** +* @property _hasKeyEventHandlers +* @description Boolean indicating if the button's "blur", "keydown" and +* "keyup" event handlers are assigned +* @default false +* @protected +* @type Boolean +*/ +_hasKeyEventHandlers: false, + + +/** +* @property _hasMouseEventHandlers +* @description Boolean indicating if the button's "mouseout" and "mousedown" +* and "mouseup" event handlers are assigned +* @default false +* @protected +* @type Boolean +*/ +_hasMouseEventHandlers: false, + + + +// Constants + + +/** +* @property TAG_NAME +* @description The name of the tag to be used for the button's root element. +* @default "SPAN" +* @final +* @type String +*/ +TAG_NAME: "SPAN", + + +/** +* @property CHECK_ACTIVATION_KEYS +* @description Array of numbers representing keys that (when pressed) toggle +* the button's "checked" attribute. +* @default [32] +* @final +* @type Array +*/ +CHECK_ACTIVATION_KEYS: [32], + + +/** +* @property ACTIVATION_KEYS +* @description Array of numbers representing keys that (when presed) toggle +* the button's "active" state. +* @default [13, 32] +* @final +* @type Array +*/ +ACTIVATION_KEYS: [13, 32], + + +/** +* @property OPTION_AREA_WIDTH +* @description Width (in pixels) of the area of a split button that when +* pressed will display a menu. +* @default 20 +* @final +* @type Number +*/ +OPTION_AREA_WIDTH: 20, + + +/** +* @property CSS_CLASS_NAME +* @description String representing the CSS class(es) to be applied to the +* button's root element. +* @default "yuibutton" +* @final +* @type String +*/ +CSS_CLASS_NAME: "yuibutton", + + +/** +* @property RADIO_DEFAULT_TITLE +* @description String representing the default title applied to buttons of +* type "radio." +* @default "Unchecked. Click to check." +* @final +* @type String +*/ +RADIO_DEFAULT_TITLE: "Unchecked. Click to check.", + + +/** +* @property RADIO_CHECKED_TITLE +* @description String representing the title applied to buttons of type "radio" +* when checked. +* @default "Checked. Click to uncheck." +* @final +* @type String +*/ +RADIO_CHECKED_TITLE: "Checked. Click to uncheck.", + + +/** +* @property CHECKBOX_DEFAULT_TITLE +* @description String representing the default title applied to buttons of +* type "checkbox." +* @default "Unchecked. Click to check." +* @final +* @type String +*/ +CHECKBOX_DEFAULT_TITLE: "Unchecked. Click to check.", + + +/** +* @property CHECKBOX_CHECKED_TITLE +* @description String representing the title applied to buttons of type +* "checkbox" when checked. +* @default "Checked. Click to uncheck." +* @final +* @type String +*/ +CHECKBOX_CHECKED_TITLE: "Checked. Click to uncheck.", + + +/** +* @property MENUBUTTON_DEFAULT_TITLE +* @description String representing the default title applied to buttons of +* type "menubutton." +* @default "Menu collapsed. Click to expand." +* @final +* @type String +*/ +MENUBUTTON_DEFAULT_TITLE: "Menu collapsed. Click to expand.", + + +/** +* @property MENUBUTTON_MENU_VISIBLE_TITLE +* @description String representing the title applied to buttons of type +* "menubutton" when the button's menu is visible. +* @default "Menu expanded. Click or press Esc to collapse." +* @final +* @type String +*/ +MENUBUTTON_MENU_VISIBLE_TITLE: + "Menu expanded. Click or press Esc to collapse.", + + +/** +* @property SPLITBUTTON_DEFAULT_TITLE +* @description String representing the default title applied to buttons of +* type "splitebutton." +* @default "Menu collapsed. Click inside option region or press +* Ctrl + Shift + M to show the menu." +* @final +* @type String +*/ +SPLITBUTTON_DEFAULT_TITLE: + "Menu collapsed. Click inside option region or press Ctrl + Shift + M to show the menu.", + + +/** +* @property SPLITBUTTON_OPTION_VISIBLE_TITLE +* @description String representing the title applied to buttons of type +* "splitbutton" when the button's menu is visible. +* @default "Menu expanded. Press Esc or Ctrl + Shift + M to hide the menu." +* @final +* @type String +*/ +SPLITBUTTON_OPTION_VISIBLE_TITLE: + "Menu expanded. Press Esc or Ctrl + Shift + M to hide the menu.", + + +/** +* @property SUBMIT_TITLE +* @description String representing the title applied to buttons of +* type "submit." +* @default "Click to submit form." +* @final +* @type String +*/ +SUBMIT_TITLE: "Click to submit form.", + + + +// Protected attribute setter methods + + +/** +* @method _setType +* @description Sets the value of the button's "type" attribute. +* @protected +* @param {String} p_sType String indicating the value for the button's +* "type" attribute. +*/ +_setType: function(p_sType) { + + if(p_sType == "splitbutton") { + + this.on("option", this._onOption); + + } + +}, + + +/** +* @method _setLabel +* @description Sets the value of the button's "label" attribute. +* @protected +* @param {String} p_sLabel String indicating the value for the button's +* "label" attribute. +*/ +_setLabel: function(p_sLabel) { + + this._button.innerHTML = p_sLabel; + +}, + + +/** +* @method _setTabIndex +* @description Sets the value of the button's "tabindex" attribute. +* @protected +* @param {Number} p_nTabIndex Number indicating the value for the button's +* "tabindex" attribute. +*/ +_setTabIndex: function(p_nTabIndex) { + + this._button.tabIndex = p_nTabIndex; + +}, + + +/** +* @method _setTitle +* @description Sets the value of the button's "title" attribute. +* @protected +* @param {String} p_nTabIndex Number indicating the value for the button's +* "title" attribute. +*/ +_setTitle: function(p_sTitle) { + + if(this.get("type") != "link") { + + var sTitle = p_sTitle; + + if(!sTitle) { + + + var sType = this.get("type"); + + switch(sType) { + + case "radio": + + sTitle = this.RADIO_DEFAULT_TITLE; + + break; + + case "checkbox": + + sTitle = this.CHECKBOX_DEFAULT_TITLE; + + break; + + case "menubutton": + + sTitle = this.MENUBUTTON_DEFAULT_TITLE; + + break; + + case "splitbutton": + + sTitle = this.SPLITBUTTON_DEFAULT_TITLE; + + break; + + case "submit": + + sTitle = this.SUBMIT_TITLE; + + break; + + } + + } + + this._button.title = sTitle; + + } + +}, + + +/** +* @method _setDisabled +* @description Sets the value of the button's "disabled" attribute. +* @protected +* @param {Boolean} p_bDisabled Boolean indicating the value for the button's +* "disabled" attribute. +*/ +_setDisabled: function(p_bDisabled) { + + if(this.get("type") != "link") { + + if(p_bDisabled) { + + if(this.hasFocus()) { + + this.blur(); + + } + + this._button.setAttribute("disabled", "disabled"); + + this.addClass("disabled"); + + } + else { + + this._button.removeAttribute("disabled"); + + this.removeClass("disabled"); + + } + + } + +}, + + +/** +* @method _setAccessKey +* @description Sets the value of the button's "accesskey" attribute. +* @protected +* @param {String} p_sAccessKey String indicating the value for the button's +* "accesskey" attribute. +*/ +_setAccessKey: function(p_sAccessKey) { + + this._button.accessKey = p_sAccessKey; + +}, + + +/** +* @method _setHref +* @description Sets the value of the button's "href" attribute. +* @protected +* @param {String} p_sHref String indicating the value for the button's +* "href" attribute. +*/ +_setHref: function(p_sHref) { + + if(this.get("type") == "link") { + + this._button.href = p_sHref; + + } + +}, + + +/** +* @method _setTarget +* @description Sets the value of the button's "target" attribute. +* @protected +* @param {String} p_sTarget String indicating the value for the button's +* "target" attribute. +*/ +_setTarget: function(p_sTarget) { + + if(this.get("type") == "link") { + + this._button.setAttribute("target", p_sTarget); + + } + +}, + + +/** +* @method _setChecked +* @description Sets the value of the button's "target" attribute. +* @protected +* @param {Boolean} p_bChecked Boolean indicating the value for the button's +* "checked" attribute. +*/ +_setChecked: function(p_bChecked) { + + var sType = this.get("type"), + sTitle; + + if(sType == "checkbox" || sType == "radio") { + + if(p_bChecked) { + + this.addClass("checked"); + + sTitle = (sType == "radio") ? + this.RADIO_CHECKED_TITLE : + this.CHECKBOX_CHECKED_TITLE; + + } + else { + + this.removeClass("checked"); + + sTitle = (sType == "radio") ? + this.RADIO_DEFAULT_TITLE : + this.CHECKBOX_DEFAULT_TITLE; + + } + + this.set("title", sTitle); + + } + +}, + + +/** +* @method _setMenu +* @description Sets the value of the button's "menu" attribute. +* @protected +* @param {Object} p_oMenu Object indicating the value for the button's +* "menu" attribute. +*/ +_setMenu: function(p_oMenu) { + + var Menu = YAHOO.widget.Menu, + oMenu, + me = this; + + if(!Menu) { + + this.logger.log("YAHOO.widget.Menu dependency not met.", "error"); + + return false; + + } + + + function initMenu() { + + if(oMenu) { + + oMenu.showEvent.subscribe(this._onMenuShow, this, true); + oMenu.hideEvent.subscribe(this._onMenuHide, this, true); + oMenu.keyDownEvent.subscribe(this._onMenuKeyDown, this, true); + oMenu.renderEvent.subscribe(this._onMenuRender, this, true); + oMenu.clickEvent.subscribe(this._onMenuClick, this, true); + oMenu.itemAddedEvent.subscribe(this._onMenuItemAdded, this, true); + + var oSrcElement = oMenu.srcElement; + + if(oSrcElement && oSrcElement.tagName.toUpperCase() == "SELECT") { + + oSrcElement.style.display = "none"; + oSrcElement.parentNode.removeChild(oSrcElement); + + } + + this._menu = oMenu; + + } + else { + + this._menu.destroy(); + this._menu = null; + + } + + } + + + if(p_oMenu instanceof Menu) { + + oMenu = p_oMenu; + + var aItems = oMenu.getItems(), + nItems = aItems.length, + oItem; + + if(nItems > 0) { + + var i = nItems - 1; + + do { + + oItem = aItems[i]; + + if(oItem) { + + oItem.cfg.subscribeToConfigEvent( + "selected", + this._onMenuItemSelected, + oItem, + this + ); + + } + + } + while(i--); + + } + + initMenu.call(this); + + } + else if(Lang.isArray(p_oMenu)) { + + this.on("appendTo", function() { + + oMenu = new Menu( + Dom.generateId(), + { lazyload: true, itemdata: p_oMenu } + ); + + initMenu.call(me); + + }); + + } + else if(Lang.isString(p_oMenu)) { + + Event.onContentReady(p_oMenu, function() { + + oMenu = new Menu(this, { lazyload: true }); + + initMenu.call(me); + + }); + + } + else if(p_oMenu && p_oMenu.nodeName) { + + oMenu = new Menu(p_oMenu, { lazyload: true }); + + initMenu.call(this); + + } + +}, + + +/** +* @method _setOnClick +* @description Sets the value of the button's "onclick" attribute. +* @protected +* @param {Object} p_oObject Object indicating the value for the button's +* "onclick" attribute. +*/ +_setOnClick: function(p_oObject) { + + /* + Remove any existing listeners if a "click" event handler has already + been specified. + */ + + if( + this._onclickAttributeValue && + (this._onclickAttributeValue != p_oObject) + ) { + + this.removeListener("click", this._onclickAttributeValue.fn); + + this._onclickAttributeValue = null; + + } + + + if( + !this._onclickAttributeValue && + Lang.isObject(p_oObject) && + Lang.isFunction(p_oObject.fn) + ) { + + this.on("click", p_oObject.fn, p_oObject.obj, p_oObject.scope); + + this._onclickAttributeValue = p_oObject; + + } + +}, + +/** +* @method _setOnInit +* @description Sets the value of the button's "init" attribute. +* @protected +* @param {Object} p_oObject Object indicating the value for the button's +* "oninit" attribute. +*/ +_setOnInit: function(p_oObject) { + + /* + Remove any existing listeners if a "init" event handler has already + been specified. + */ + + if( + this._oninitAttributeValue && + (this._oninitAttributeValue != p_oObject) + ) { + + this.removeListener("init", this._oninitAttributeValue.fn); + + this._oninitAttributeValue = null; + + } + + + if( + !this._oninitAttributeValue && + Lang.isObject(p_oObject) && + Lang.isFunction(p_oObject.fn) + ) { + + this.on("init", p_oObject.fn, p_oObject.obj, p_oObject.scope); + + this._oninitAttributeValue = p_oObject; + + } + +}, + + + +// Protected methods + + +/** +* @method _createButtonElement +* @description Creates the button's element. +* @protected +* @param {String} p_sType String indicating the type of element to create. +* @return {HTMLElement} +*/ +_createButtonElement: function(p_sType) { + + var sTagName = this.TAG_NAME, + oElement = document.createElement(sTagName); + + oElement.innerHTML = + + "<" + sTagName + " class=\"first-child\">" + + (p_sType == "link" ? "" : "") + + ""; + + return oElement; + +}, + + +/** +* @method _isActivationKey +* @description Determines if the specified keycode is one that toggles the +* button's "active" state. +* @protected +* @param {Number} p_nKeyCode Number representing the keycode to be evaluated. +* @return {Boolean} +*/ +_isActivationKey: function(p_nKeyCode) { + + var sType = this.get("type"), + aKeyCodes = (sType == "checkbox" || sType == "radio") ? + this.CHECK_ACTIVATION_KEYS : this.ACTIVATION_KEYS, + + nKeyCodes = aKeyCodes.length; + + if(nKeyCodes > 0) { + + var i = nKeyCodes - 1; + + do { + + if(p_nKeyCode == aKeyCodes[i]) { + + return true; + + } + + } + while(i--); + + } + +}, + + +/** +* @method _isSplitButtonOptionKey +* @description Determines if the specified keycode is one that toggles the +* display of the split button's menu. +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +* @return {Boolean} +*/ +_isSplitButtonOptionKey: function(p_oEvent) { + + return ( + p_oEvent.ctrlKey && + p_oEvent.shiftKey && + Event.getCharCode(p_oEvent) == 77 + ); + +}, + + +_originalMaxHeight: -1, + + +/** +* @method _showMenu +* @description Shows the button's menu. +* @protected +*/ +_showMenu: function() { + + var oMenu = this._menu; + + if(oMenu) { + + YAHOO.widget.MenuManager.hideVisible(); + + oMenu.cfg.applyConfig({ + context:[this.get("id"), "tl", "bl"], + clicktohide: false, + constraintoviewport: false, + visible: true + }); + + oMenu.cfg.fireQueue(); + + var nViewportHeight = Dom.getViewportHeight(), + nMenuHeight = oMenu.element.offsetHeight; + + + if((oMenu.cfg.getProperty("y") + nMenuHeight) > nViewportHeight) { + + this.logger.log("Current menu position will place a portion, or " + + "the entire menu outside the boundary of the viewport. " + + "Repositioning the menu to stay inside the viewport."); + + oMenu.align("bl", "tl"); + + var nY = oMenu.cfg.getProperty("y"), + + nScrollTop = ( + document.documentElement.scrollTop || + document.body.scrollTop + ); + + + if(nScrollTop >= nY) { + + if(this._originalMaxHeight == -1) { + + this._originalMaxHeight = + oMenu.cfg.getProperty("maxheight"); + + } + + oMenu.cfg.setProperty( + "maxheight", + (nMenuHeight - ((nScrollTop - nY) + 20)) + ); + + oMenu.align("bl", "tl"); + + } + + } + + oMenu.cfg.setProperty("constraintoviewport", true); + + } + +}, + + +/** +* @method _hideMenu +* @description Hides the button's menu. +* @protected +*/ +_hideMenu: function() { + + var oMenu = this._menu; + + if(oMenu && oMenu.cfg.getProperty("visible")) { + + oMenu.hide(); + + } + +}, + + +/** +* @method _submitForm +* @description Submits the form to which the button belongs. +* @protected +*/ +_submitForm: function() { + + var oForm = this.getForm(); + + if(oForm) { + + YAHOO.widget.Button.addHiddenFieldsToForm(oForm); + + this.createHiddenField(); + + oForm.submit(); + + } + +}, + + + +// Protected event handlers + + +/** +* @method _onMouseOver +* @description "mouseover" event handler for the button. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +*/ +_onMouseOver: function(p_oEvent) { + + if(!this.get("disabled")) { + + if(!this._hasMouseEventHandlers) { + + this.on("mouseout", this._onMouseOut); + this.on("mousedown", this._onMouseDown); + this.on("mouseup", this._onMouseUp); + + this._hasMouseEventHandlers = true; + + } + + this.addClass("hover"); + + if(this._activationButtonPressed) { + + this.addClass("active"); + + } + + + if(this._bOptionPressed) { + + this.addClass("activeoption"); + + } + + } + +}, + + +/** +* @method _onMouseOut +* @description "mouseout" event handler for the button. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +*/ +_onMouseOut: function(p_oEvent) { + + if(!this.get("disabled")) { + + this.removeClass("hover"); + + if(this.get("type") != "menubutton") { + + this.removeClass("active"); + + } + + if(this._activationButtonPressed || this._bOptionPressed) { + + Event.on(document, "mouseup", this._onDocumentMouseUp, this, true); + + } + + } + +}, + + +/** +* @method _onDocumentMouseUp +* @description "mouseup" event handler for the button. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +* @param {YAHOO.widget.Button} p_oButton Object representing the button. +*/ +_onDocumentMouseUp: function(p_oEvent, p_oButton) { + + this._activationButtonPressed = false; + this._bOptionPressed = false; + + var sType = this.get("type"); + + if(sType == "menubutton" || sType == "splitbutton") { + + this.removeClass((sType == "menubutton" ? "active" : "activeoption")); + + this._hideMenu(); + + } + + Event.removeListener(document, "mouseup", this._onDocumentMouseUp); + +}, + + +/** +* @method _onMouseDown +* @description "mousedown" event handler for the button. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +*/ +_onMouseDown: function(p_oEvent) { + + if(!this.get("disabled")) { + + if((p_oEvent.which || p_oEvent.button) == 1) { + + if(!this.hasFocus()) { + + this.focus(); + + } + + + var sType = this.get("type"); + + + if(sType == "splitbutton") { + + var oElement = this.get("element"), + nX = Event.getPageX(p_oEvent) - Dom.getX(oElement); + + if((oElement.offsetWidth - this.OPTION_AREA_WIDTH) < nX) { + + this.fireEvent("option", p_oEvent); + + } + else { + + this.addClass("active"); + + this._activationButtonPressed = true; + + } + + } + else if(sType == "menubutton") { + + if(this.hasClass("active")) { + + this._hideMenu(); + + this._activationButtonPressed = false; + + } + else { + + this._showMenu(); + + this._activationButtonPressed = true; + + } + + } + else { + + this.addClass("active"); + + this._activationButtonPressed = true; + + } + + + + if(sType == "splitbutton" || sType == "menubutton") { + + var me = this; + + + function onMouseUp() { + + me._hideMenu(); + me.removeListener("mouseup", onMouseUp); + + } + + + this._hideMenuTimerId = window.setTimeout(function() { + + me.on("mouseup", onMouseUp); + + }, 250); + + } + + } + + } + +}, + + +/** +* @method _onMouseUp +* @description "mouseup" event handler for the button. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +*/ +_onMouseUp: function(p_oEvent) { + + if(!this.get("disabled")) { + + + if(this._hideMenuTimerId) { + + window.clearTimeout(this._hideMenuTimerId); + + } + + var sType = this.get("type"); + + if(sType == "checkbox" || sType == "radio") { + + this.set("checked", !(this.get("checked"))); + + } + + + this._activationButtonPressed = false; + + + if(this.get("type") != "menubutton") { + + this.removeClass("active"); + + } + + } + +}, + + +/** +* @method _onFocus +* @description "focus" event handler for the button. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +* @param {YAHOO.widget.Button} p_oButton Object representing the button that +* fired the event. +*/ +_onFocus: function(p_oEvent, p_oButton) { + + if(!this.get("disabled")) { + + this.addClass("focus"); + + if(this._activationKeyPressed) { + + this.addClass("active"); + + } + + m_oFocusedButton = this; + + + if(!this._hasKeyEventHandlers) { + + var oElement = this._button; + + Event.on(oElement, "blur", this._onBlur, this, true); + Event.on(oElement, "keydown", this._onKeyDown, this, true); + Event.on(oElement, "keyup", this._onKeyUp, this, true); + + this._hasKeyEventHandlers = true; + + } + + + this.fireEvent("focus", p_oEvent); + + } + +}, + + +/** +* @method _onBlur +* @description "blur" event handler for the button. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +* @param {YAHOO.widget.Button} p_oButton Object representing the button. +*/ +_onBlur: function(p_oEvent, p_oButton) { + + if(!this.get("disabled")) { + + this.removeClass("focus"); + + if(this.get("type") != "menubutton") { + + this.removeClass("active"); + + } + + if(this._activationKeyPressed) { + + Event.on(document, "keyup", this._onDocumentKeyUp, this, true); + + } + + + m_oFocusedButton = null; + + this.fireEvent("blur", p_oEvent); + + } + +}, + + +/** +* @method _onDocumentKeyUp +* @description "keyup" event handler for the document. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +* @param {YAHOO.widget.Button} p_oButton Object representing the button. +*/ +_onDocumentKeyUp: function(p_oEvent, p_oButton) { + + if(this._isActivationKey(Event.getCharCode(p_oEvent))) { + + this._activationKeyPressed = false; + + Event.removeListener(document, "keyup", this._onDocumentKeyUp); + + } + +}, + + +/** +* @method _onKeyDown +* @description "keydown" event handler for the button. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +* @param {YAHOO.widget.Button} p_oButton Object representing the button. +*/ +_onKeyDown: function(p_oEvent, p_oButton) { + + if(!this.get("disabled")) { + + if( + this.get("type") == "splitbutton" && + this._isSplitButtonOptionKey(p_oEvent) + ) { + + this.fireEvent("option", p_oEvent); + + } + else if(this._isActivationKey(Event.getCharCode(p_oEvent))) { + + if(this.get("type") == "menubutton") { + + this._showMenu(); + + } + else { + + this._activationKeyPressed = true; + + this.addClass("active"); + + } + + } + + + var oMenu = this._menu; + + if( + oMenu && oMenu.cfg.getProperty("visible") && + Event.getCharCode(p_oEvent) == 27 + ) { + + oMenu.hide(); + this.focus(); + + } + + } + +}, + + +/** +* @method _onKeyUp +* @description "keyup" event handler for the button. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +* @param {YAHOO.widget.Button} p_oButton Object representing the button. +*/ +_onKeyUp: function(p_oEvent, p_oButton) { + + if(!this.get("disabled")) { + + if(this._isActivationKey(Event.getCharCode(p_oEvent))) { + + var sType = this.get("type"); + + if(sType == "checkbox" || sType == "radio") { + + this.set("checked", !(this.get("checked"))); + + } + + this._activationKeyPressed = false; + + if(this.get("type") != "menubutton") { + + this.removeClass("active"); + + } + + } + + } + +}, + + +/** +* @method _onClick +* @description "click" event handler for the button. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +*/ +_onClick: function(p_oEvent) { + + var sType = this.get("type"), + sTitle; + + switch(sType) { + + case "radio": + case "checkbox": + + if(this.get("checked")) { + + sTitle = (sType == "radio") ? + this.RADIO_CHECKED_TITLE : + this.CHECKBOX_CHECKED_TITLE; + + } + else { + + sTitle = (sType == "radio") ? + this.RADIO_DEFAULT_TITLE : + this.CHECKBOX_DEFAULT_TITLE; + + } + + this.set("title", sTitle); + + break; + + case "submit": + + this._submitForm(); + + break; + + case "reset": + + var oForm = this.getForm(); + + if(oForm) { + + oForm.reset(); + + } + + break; + + case "menubutton": + + sTitle = this._menu.cfg.getProperty("visible") ? + this.MENUBUTTON_MENU_VISIBLE_TITLE : + this.MENUBUTTON_DEFAULT_TITLE; + + this.set("title", sTitle); + + break; + + case "splitbutton": + + var oElement = this.get("element"), + nX = Event.getPageX(p_oEvent) - Dom.getX(oElement); + + if((oElement.offsetWidth - this.OPTION_AREA_WIDTH) < nX) { + + return false; + + } + else { + + this._hideMenu(); + + var oSrcElement = this.get("srcelement"); + + if(oSrcElement && oSrcElement.type == "submit") { + + this._submitForm(); + + } + + } + + sTitle = this._menu.cfg.getProperty("visible") ? + this.SPLITBUTTON_OPTION_VISIBLE_TITLE : + this.SPLITBUTTON_DEFAULT_TITLE; + + this.set("title", sTitle); + + break; + + } + +}, + + +/** +* @method _onAppendTo +* @description "appendTo" event handler for the button. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +*/ +_onAppendTo: function(p_oEvent) { + + /* + It is necessary to call "getForm" using "setTimeout" to make sure that + the button's "form" property returns a node reference. Sometimes, if + you try to get the reference immediately after appending the field, it + is null. + */ + + var me = this; + + window.setTimeout(function() { + + var oForm = me.getForm(); + + if(oForm) { + + Event.on(oForm, "reset", me._onFormReset, me, true); + Event.on(oForm, "submit", me._onFormSubmit, me, true); + + } + + }, 0); + +}, + + +/** +* @method _onFormSubmit +* @description "submit" event handler for the button's form. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +* @param {YAHOO.widget.Button} p_oButton Object representing the button. +*/ +_onFormSubmit: function(p_oEvent, p_oButton) { + + var sType = this.get("type"), + oMenuItem = this.get("selectedMenuItem"), + oForm = this.getForm(); + + + if(sType == "radio" || sType == "checkbox") { + + YAHOO.log("Creating hidden field for button: " + this); + + this.createHiddenField(); + + } + else if(oMenuItem) { + + var oSrcElement = this._menu.srcElement; + + if(oSrcElement && oSrcElement.tagName.toUpperCase() == "SELECT") { + + oForm.appendChild(oSrcElement); + oSrcElement.selectedIndex = oMenuItem.index; + + } + else { + + var oValue = (oMenuItem.value === null || oMenuItem.value === "") ? + oMenuItem.cfg.getProperty("text") : + oMenuItem.value; + + + if(oValue) { + + var oField = createInputElement( + "hidden", + (this.get("name") + "_options"), + oValue + ); + + oForm.appendChild(oField); + + } + + } + + } + +}, + + +/** +* @method _onFormReset +* @description "reset" event handler for the button's form. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +* @param {YAHOO.widget.Button} p_oButton Object representing the button. +*/ +_onFormReset: function(p_oEvent, p_oButton) { + + var sType = this.get("type"); + + if(sType == "checkbox" || sType == "radio") { + + this.resetValue("checked"); + + } + + if(this._menu) { + + this.resetValue("selectedMenuItem"); + + } + +}, + + +/** +* @method _onDocumentMouseDown +* @description "mousedown" event handler for the document. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +* @param {YAHOO.widget.Button} p_oButton Object representing the button. +*/ +_onDocumentMouseDown: function(p_oEvent, p_oButton) { + + var oTarget = Event.getTarget(p_oEvent), + oButtonElement = this.get("element"), + oMenuElement = this._menu.element; + + if( + oTarget != oButtonElement && + !Dom.isAncestor(oButtonElement, oTarget) && + oTarget != oMenuElement && + !Dom.isAncestor(oMenuElement, oTarget) + ) { + + this._hideMenu(); + + Event.removeListener( + document, + "mousedown", + this._onDocumentMouseDown + ); + + } + +}, + + +/** +* @method _onOption +* @description "option" event handler for the button. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +*/ +_onOption: function(p_oEvent) { + + if(this.hasClass("activeoption")) { + + this._hideMenu(); + + this._bOptionPressed = false; + + } + else { + + this._showMenu(); + + this._bOptionPressed = true; + + } + +}, + + +/** +* @method _onMenuShow +* @description "show" event handler for the button's menu. +* @private +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Button} p_oButton Object representing the button. +*/ +_onMenuShow: function(p_sType, p_aArgs, p_oButton) { + + Event.on(document, "mousedown", this._onDocumentMouseDown, this, true); + + var sTitle, + sClass; + + if(this.get("type") == "splitbutton") { + + sTitle = this.SPLITBUTTON_OPTION_VISIBLE_TITLE; + sClass = "activeoption"; + + } + else { + + sTitle = this.MENUBUTTON_MENU_VISIBLE_TITLE; + sClass = "active"; + + } + + this.addClass(sClass); + this.set("title", sTitle); + +}, + + +/** +* @method _onMenuHide +* @description "hide" event handler for the button's menu. +* @private +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Button} p_oButton Object representing the button. +*/ +_onMenuHide: function(p_sType, p_aArgs, p_oButton) { + + if(this._originalMaxHeight != -1) { + + this._menu.cfg.setProperty("maxheight", this._originalMaxHeight); + + } + + + var sTitle, + sClass; + + if(this.get("type") == "splitbutton") { + + sTitle = this.SPLITBUTTON_DEFAULT_TITLE; + sClass = "activeoption"; + + } + else { + + sTitle = this.MENUBUTTON_DEFAULT_TITLE; + sClass = "active"; + } + + + this.removeClass(sClass); + this.set("title", sTitle); + +}, + + +/** +* @method _onMenuKeyDown +* @description "keydown" event handler for the button's menu. +* @private +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Button} p_oButton Object representing the button. +*/ +_onMenuKeyDown: function(p_sType, p_aArgs, p_oButton) { + + var oEvent = p_aArgs[0]; + + if(Event.getCharCode(oEvent) == 27) { + + this.focus(); + + if(this.get("type") == "splitbutton") { + + this._bOptionPressed = false; + + } + + } + +}, + + +/** +* @method _onMenuRender +* @description "render" event handler for the button's menu. +* @private +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Button} p_oButton Object representing the button. +*/ +_onMenuRender: function(p_sType, p_aArgs, p_oButton) { + + this.get("element").parentNode.appendChild(this._menu.element); + +}, + + +/** +* @method _onMenuItemSelected +* @description "selectedchange" event handler for each item in the +* button's menu. +* @private +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.MenuItem} +* p_oItem Object representing the menu item that subscribed to the event. +*/ +_onMenuItemSelected: function(p_sType, p_aArgs, p_oItem) { + + this.set("selectedMenuItem", p_oItem); + +}, + + +/** +* @method _onMenuItemAdded +* @description "itemadded" event handler for the button's menu. +* @private +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.MenuItem} +* p_oItem Object representing the menu item that subscribed to the event. +*/ +_onMenuItemAdded: function(p_sType, p_aArgs, p_oItem) { + + var oItem = p_aArgs[0]; + + oItem.cfg.subscribeToConfigEvent( + "selected", + this._onMenuItemSelected, + oItem, + this + ); + +}, + + +/** +* @method _onMenuClick +* @description "click" event handler for the button's menu. +* @private +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Button} p_oButton Object representing the menu's button. +*/ +_onMenuClick: function(p_sType, p_aArgs, p_oButton) { + + var oItem = p_aArgs[0]; + + if(oItem) { + + var oSrcElement = this.get("srcelement"); + + if(oSrcElement && oSrcElement.type == "submit") { + + this._submitForm(); + + } + + this._hideMenu(); + + } + +}, + + + +// Public methods + + +/** +* @method createHiddenField +* @description Creates the button's hidden form field and appends it to its +* parent form. +* @return {HTMLInputElement} +*/ +createHiddenField: function () { + + if(!this.get("disabled")) { + + var sType = this.get("type"), + + bCheckable = (sType == "checkbox" || sType == "radio"), + + oField = createInputElement( + (bCheckable ? this.get("type") : "hidden"), + this.get("name"), + this.get("value"), + this.get("checked") + ), + + oForm = this.getForm(); + + + if(oField && bCheckable) { + + oField.style.display = "none"; + + } + + + if(oForm) { + + oForm.appendChild(oField); + + } + + + return oField; + + } + +}, + + +/** +* @method init +* @description The Button class's initialization method. +* @param {String} p_oElement String specifying the id attribute of the +* <input>, <a> or +* <span> element to be used to create the button. +* @param {HTMLInputElement|HTMLElement} p_oElement Object reference for the +* <input>, <a> or +* <span> element to be used to create the button. +* @param {Object} p_oElement Object literal specifying a set of configuration +* attributes used to create the button. +* @param {Object} p_oAttributes Optional. Object literal specifying a set of +* configuration attributes used to create the button. +*/ +init: function(p_oElement, p_oAttributes) { + + var sTagName = p_oAttributes.type == "link" ? "A" : "BUTTON", + oSrcElement = p_oAttributes.srcelement; + + + this._button = p_oElement.getElementsByTagName(sTagName)[0]; + + + YAHOO.widget.Button.superclass.init.call( + this, p_oElement, + p_oAttributes + ); + + + m_oButtons[this.get("id")] = this; + + + this.addClass(this.CSS_CLASS_NAME); + this.addClass(this.get("type")); + + Event.on(this._button, "focus", this._onFocus, this, true); + this.on("mouseover", this._onMouseOver); + this.on("click", this._onClick); + this.on("appendTo", this._onAppendTo); + + var oContainer = this.get("container"), + oElement = this.get("element"); + + + if(oContainer) { + + if(Lang.isString(oContainer)) { + + var me = this; + + Event.onContentReady(oContainer, function() { + + me.appendTo(this); + + }); + + } + else { + + this.appendTo(oContainer); + + } + + } + else if( + !Dom.inDocument(oElement) && + oSrcElement && + oSrcElement.tagName.toUpperCase() == "INPUT" + ) { + + var oParentNode = oSrcElement.parentNode; + + if(oParentNode) { + + this.fireEvent("beforeAppendTo", { + type: "beforeAppendTo", + target: oParentNode + }); + + oParentNode.replaceChild(oElement, oSrcElement); + + this.fireEvent("appendTo", { + type: "appendTo", + target: oParentNode + }); + + } + + } + else if( + Dom.inDocument(oElement) && + oSrcElement.tagName.toUpperCase() == "SPAN" + ) { + + var oForm = this.getForm(); + + if(oForm) { + + Event.on(oForm, "reset", this._onFormReset, this, true); + Event.on(oForm, "submit", this._onFormSubmit, this, true); + + } + + } + + this.fireEvent("init"); + + this.logger.log("Initialization completed."); + +}, + + +/** +* @method initAttributes +* @description Initializes all of the configuration attributes used to create +* the button. +* @param {Object} p_oAttributes Object literal specifying a set of +* configuration attributes used to create the button. +*/ +initAttributes: function(p_oAttributes) { + + var oAttributes = p_oAttributes || {}; + + YAHOO.widget.Button.superclass.initAttributes.call(this, oAttributes); + + + /** + * @config type + * @description String specifying the button's type. Possible values are: + * "button," "link," "submit," "reset," "checkbox," "radio," "menubutton," + * and "splitbutton." + * @default "button" + * @type String + */ + this.setAttributeConfig("type", { + + value: (oAttributes.type || "button"), + validator: Lang.isString, + writeOnce: true, + method: this._setType + + }); + + + /** + * @config label + * @description String specifying the button's text label or innerHTML. + * @default null + * @type String + */ + this.setAttributeConfig("label", { + + value: oAttributes.label, + validator: Lang.isString, + method: this._setLabel + + }); + + + /** + * @config value + * @description Object specifying the value for the button. + * @default null + * @type Object + */ + this.setAttributeConfig("value", { + + value: oAttributes.value + + }); + + + /** + * @config name + * @description String specifying the name for the button. + * @default null + * @type String + */ + this.setAttributeConfig("name", { + + value: oAttributes.name, + validator: Lang.isString + + }); + + + /** + * @config tabindex + * @description Number specifying the tabindex for the button. + * @default null + * @type Number + */ + this.setAttributeConfig("tabindex", { + + value: oAttributes.tabindex, + validator: Lang.isNumber, + method: this._setTabIndex + + }); + + + /** + * @config title + * @description String specifying the title for the button. + * @default null + * @type String + */ + this.configureAttribute("title", { + + value: oAttributes.title, + validator: Lang.isString, + method: this._setTitle + + }); + + + /** + * @config disabled + * @description Boolean indicating if the button should be disabled. + * (Disabled buttons are dimmed and will not respond to user input + * or fire events.) + * @default false + * @type Boolean + */ + this.setAttributeConfig("disabled", { + + value: (oAttributes.disabled || false), + validator: Lang.isBoolean, + method: this._setDisabled + + }); + + + /** + * @config href + * @description String specifying the href for the button. Applies only to + * buttons of type "link." + * @type String + */ + this.setAttributeConfig("href", { + + value: oAttributes.href, + validator: Lang.isString, + method: this._setHref + + }); + + + /** + * @config target + * @description String specifying the target for the button. Applies only + * to buttons of type "link." + * @type String + */ + this.setAttributeConfig("target", { + + value: oAttributes.target, + validator: Lang.isString, + method: this._setTarget + + }); + + + /** + * @config checked + * @description Boolean indicating if the button is checked. Applies only + * to buttons of type "radio" and "checkbox." + * @default false + * @type Boolean + */ + this.setAttributeConfig("checked", { + + value: (oAttributes.checked || false), + validator: Lang.isBoolean, + method: this._setChecked + + }); + + + /** + * @config container + * @description HTML element reference or string specifying the id + * attribute of the HTML element that the button's markup should be + * rendered into. + * @type HTMLElement|String + * @default null + */ + this.setAttributeConfig("container", { + + value: oAttributes.container + + }); + + + /** + * @config srcelement + * @description Object reference to the HTML element (either + * <input> or <span>) used to + * create the button. + * @type HTMLElement|String + * @default null + */ + this.setAttributeConfig("srcelement", { + + value: oAttributes.srcelement, + writeOnce: true + + }); + + + /** + * @config menu + * @description Object specifying the menu for the button. The value can be + * one of the following: + *
    + *
  • Object specifying a + * YAHOO.widget.Menu instance.
  • + *
  • String specifying the id attribute of the <div> + * element used to create the menu.
  • + *
  • String specifying the id attribute of the + * <select> element used to create the menu.
  • + *
  • Object specifying the <div> element used to + * create the menu.
  • + *
  • Object specifying the <select> element used to + * create the menu.
  • + *
  • Array of object literals, each representing a set of + * YAHOO.widget.MenuItem + * configuration attributes.
  • + *
  • Array of strings representing the text labels for each menu item in + * the menu.
  • + *
+ * @type HTMLElement|String|Array + * @default null + */ + this.setAttributeConfig("menu", { + + value: null, + method: this._setMenu + + }); + + + /** + * @config selectedMenuItem + * @description Reference to the item in the button's menu that is + * currently selected. + * @type YAHOO.widget.MenuItem + * @default null + */ + this.setAttributeConfig("selectedMenuItem", { + + value: null + + }); + + + /** + * @config onclick + * @description Object literal representing the code to be executed when + * the button is clicked. Format:
{
+ * fn: Function, // The handler to call when the + * event fires.
obj: Object, // An object to + * pass back to the handler.
scope: Object // + * The object to use for the scope of the handler.
}
+ * @type Object + * @default null + */ + this.setAttributeConfig("onclick", { + + value: oAttributes.onclick, + method: this._setOnClick + + }); + + + /** + * @config oninit + * @description Object literal representing the code to be executed when + * the button is initialized. Format:
{
+ * fn: Function, // The handler to call when the + * event fires.
obj: Object, // An object to + * pass back to the handler.
scope: Object // + * The object to use for the scope of the handler.
}
+ * @type Object + * @default null + */ + this.setAttributeConfig("oninit", { + + value: oAttributes.oninit, + method: this._setOnInit + + }); + +}, + + +/** +* @method focus +* @description Causes the button to receive the focus and fires the button's +* "focus" event. +*/ +focus: function() { + + if(!this.get("disabled")) { + + this._button.focus(); + + } + +}, + + +/** +* @method blur +* @description Causes the button to lose focus and fires the button's +* "blur" event. +*/ +blur: function() { + + if(!this.get("disabled")) { + + this._button.blur(); + + } + +}, + + +/** +* @method hasFocus +* @description Returns a boolean indicating whether or not the button has focus. +* @return {Boolean} +*/ +hasFocus: function() { + + return (m_oFocusedButton == this); + +}, + + +/** +* @method isActive +* @description Returns a boolean indicating whether or not the button is active. +* @return {Boolean} +*/ +isActive: function() { + + return this.hasClass("active"); + +}, + + +/** +* @method getMenu +* @description Returns a reference to the button's menu. +* @return {YAHOO.widget.Menu} +*/ +getMenu: function() { + + return this._menu; + +}, + + +/** +* @method getForm +* @description Returns a reference to the button's menu. +* @return {HTMLFormElement} +*/ +getForm: function() { + + return this._button.form; + +}, + + +/** +* @method destroy +* @description Removes the button's element from its parent element and +* removes all event handlers. +*/ +destroy: function() { + + this.logger.log("Destroying ..."); + + var oElement = this.get("element"), + oParentNode = oElement.parentNode, + oMenu = this._menu; + + if(oMenu) { + + this.logger.log("Destroying menu."); + + oMenu.destroy(); + + } + + this.logger.log("Removing DOM event handlers."); + + Event.purgeElement(oElement); + Event.purgeElement(this._button); + Event.removeListener(document, "mouseup", this._onDocumentMouseUp); + Event.removeListener(document, "keyup", this._onDocumentKeyUp); + Event.removeListener(document, "mousedown", this._onDocumentMouseDown); + + var oForm = this.getForm(); + + if(oForm) { + + Event.removeListener(oForm, "reset", this._onFormReset); + + } + + + oParentNode.removeChild(oElement); + + this.logger.log("Removing from document."); + + delete m_oButtons[this.get("id")]; + + this.logger.log("Destroyed."); + +}, + + +/** +* @method toString +* @description Returns a string representing the button. +* @return {String} +*/ +toString: function() { + + return ("Button " + this.get("id")); + +} + +}); + + +/** +* @method addHiddenFieldsToForm +* @description Searches the specified form and adds hidden fields for instances +* of YAHOO.widget.Button that are of type "radio," "checkbox," "menubutton," +* and "splitbutton." +* @param {HTMLFormElement} p_oForm Object reference +* for the form to search. +*/ +YAHOO.widget.Button.addHiddenFieldsToForm = function(p_oForm) { + + var aButtons = Dom.getElementsByClassName("yuibutton", "*", p_oForm), + nButtons = aButtons.length; + + + if(nButtons > 0) { + + YAHOO.log("Form contains " + nButtons + " YUI buttons."); + + var oButton = null, + sType = null, + oMenuItem = null, + oMenu = null; + + for(var i=0; i
 tag (for wrapping)
+            var container = (this.verboseOutput) ? "CODE" : "PRE";
+            var oNewElement = (this.newestOnTop) ?
+                this._elConsole.insertBefore(
+                    document.createElement(container),this._elConsole.firstChild):
+                this._elConsole.appendChild(document.createElement(container));
+
+            oNewElement.innerHTML = output;
+            this._consoleMsgCount++;
+            this._lastTime = entry.time.getTime();
+        }
+    }
+};
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Private event handlers
+//
+/////////////////////////////////////////////////////////////////////////////
+
+/**
+ * Handles Logger's categoryCreateEvent.
+ *
+ * @method _onCategoryCreate
+ * @param sType {String} The event.
+ * @param aArgs {Object[]} Data passed from event firer.
+ * @param oSelf {Object} The LogReader instance.
+ * @private
+ */
+YAHOO.widget.LogReader.prototype._onCategoryCreate = function(sType, aArgs, oSelf) {
+    var category = aArgs[0];
+    if(oSelf._elFt) {
+        oSelf._createCategoryCheckbox(category);
+    }
+};
+
+/**
+ * Handles Logger's sourceCreateEvent.
+ *
+ * @method _onSourceCreate
+ * @param sType {String} The event.
+ * @param aArgs {Object[]} Data passed from event firer.
+ * @param oSelf {Object} The LogReader instance.
+ * @private
+ */
+YAHOO.widget.LogReader.prototype._onSourceCreate = function(sType, aArgs, oSelf) {
+    var source = aArgs[0];
+    if(oSelf._elFt) {
+        oSelf._createSourceCheckbox(source);
+    }
+};
+
+/**
+ * Handles check events on the category filter checkboxes.
+ *
+ * @method _onCheckCategory
+ * @param v {HTMLEvent} The click event.
+ * @param oSelf {Object} The LogReader instance.
+ * @private
+ */
+YAHOO.widget.LogReader.prototype._onCheckCategory = function(v, oSelf) {
+    var newFilter = this.category;
+    var filtersArray = oSelf._categoryFilters;
+
+    if(!this.checked) { // Remove category from filters
+        for(var i=0; i 0) {
+                // Substring until first space
+                sClass = sSource.substring(0,spaceIndex);
+                // The rest of the source
+                sDetail = sSource.substring(spaceIndex,sSource.length);
+            }
+            else {
+                sClass = sSource;
+            }
+            if(this._isNewSource(sClass)) {
+                this._createNewSource(sClass);
+            }
+        }
+
+        var timestamp = new Date();
+        var logEntry = new YAHOO.widget.LogMsg({
+            msg: sMsg,
+            time: timestamp,
+            category: sCategory,
+            source: sClass,
+            sourceDetail: sDetail
+        });
+
+        var stack = this._stack;
+        var maxStackEntries = this.maxStackEntries;
+        if(maxStackEntries && !isNaN(maxStackEntries) &&
+            (stack.length >= maxStackEntries)) {
+            stack.shift();
+        }
+        stack.push(logEntry);
+        this.newLogEvent.fire(logEntry);
+
+        if(this._browserConsoleEnabled) {
+            this._printToBrowserConsole(logEntry);
+        }
+        return true;
+    }
+    else {
+        return false;
+    }
+};
+
+/**
+ * Resets internal stack and startTime, enables Logger, and fires logResetEvent.
+ *
+ * @method reset
+ */
+YAHOO.widget.Logger.reset = function() {
+    this._stack = [];
+    this._startTime = new Date().getTime();
+    this.loggerEnabled = true;
+    this.log("Logger reset");
+    this.logResetEvent.fire();
+};
+
+/**
+ * Public accessor to internal stack of log message objects.
+ *
+ * @method getStack
+ * @return {Object[]} Array of log message objects.
+ */
+YAHOO.widget.Logger.getStack = function() {
+    return this._stack;
+};
+
+/**
+ * Public accessor to internal start time.
+ *
+ * @method getStartTime
+ * @return {Date} Internal date of when Logger singleton was initialized.
+ */
+YAHOO.widget.Logger.getStartTime = function() {
+    return this._startTime;
+};
+
+/**
+ * Disables output to the browser's global console.log() function, which is used
+ * by the Firebug extension to Firefox as well as Safari.
+ *
+ * @method disableBrowserConsole
+ */
+YAHOO.widget.Logger.disableBrowserConsole = function() {
+    YAHOO.log("Logger output to the function console.log() has been disabled.");
+    this._browserConsoleEnabled = false;
+};
+
+/**
+ * Enables output to the browser's global console.log() function, which is used
+ * by the Firebug extension to Firefox as well as Safari.
+ *
+ * @method enableBrowserConsole
+ */
+YAHOO.widget.Logger.enableBrowserConsole = function() {
+    this._browserConsoleEnabled = true;
+    YAHOO.log("Logger output to the function console.log() has been enabled.");
+};
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Public events
+//
+/////////////////////////////////////////////////////////////////////////////
+
+ /**
+ * Fired when a new category has been created.
+ *
+ * @event categoryCreateEvent
+ * @param sCategory {String} Category name.
+ */
+YAHOO.widget.Logger.categoryCreateEvent =
+    new YAHOO.util.CustomEvent("categoryCreate", this, true);
+
+ /**
+ * Fired when a new source has been named.
+ *
+ * @event sourceCreateEvent
+ * @param sSource {String} Source name.
+ */
+YAHOO.widget.Logger.sourceCreateEvent =
+    new YAHOO.util.CustomEvent("sourceCreate", this, true);
+
+ /**
+ * Fired when a new log message has been created.
+ *
+ * @event newLogEvent
+ * @param sMsg {String} Log message.
+ */
+YAHOO.widget.Logger.newLogEvent = new YAHOO.util.CustomEvent("newLog", this, true);
+
+/**
+ * Fired when the Logger has been reset has been created.
+ *
+ * @event logResetEvent
+ */
+YAHOO.widget.Logger.logResetEvent = new YAHOO.util.CustomEvent("logReset", this, true);
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Private methods
+//
+/////////////////////////////////////////////////////////////////////////////
+
+/**
+ * Creates a new category of log messages and fires categoryCreateEvent.
+ *
+ * @method _createNewCategory
+ * @param sCategory {String} Category name.
+ * @private
+ */
+YAHOO.widget.Logger._createNewCategory = function(sCategory) {
+    this.categories.push(sCategory);
+    this.categoryCreateEvent.fire(sCategory);
+};
+
+/**
+ * Checks to see if a category has already been created.
+ *
+ * @method _isNewCategory
+ * @param sCategory {String} Category name.
+ * @return {Boolean} Returns true if category is unknown, else returns false.
+ * @private
+ */
+YAHOO.widget.Logger._isNewCategory = function(sCategory) {
+    for(var i=0; i < this.categories.length; i++) {
+        if(sCategory == this.categories[i]) {
+            return false;
+        }
+    }
+    return true;
+};
+
+/**
+ * Creates a new source of log messages and fires sourceCreateEvent.
+ *
+ * @method _createNewSource
+ * @param sSource {String} Source name.
+ * @private
+ */
+YAHOO.widget.Logger._createNewSource = function(sSource) {
+    this.sources.push(sSource);
+    this.sourceCreateEvent.fire(sSource);
+};
+
+/**
+ * Checks to see if a source already exists.
+ *
+ * @method _isNewSource
+ * @param sSource {String} Source name.
+ * @return {Boolean} Returns true if source is unknown, else returns false.
+ * @private
+ */
+YAHOO.widget.Logger._isNewSource = function(sSource) {
+    if(sSource) {
+        for(var i=0; i < this.sources.length; i++) {
+            if(sSource == this.sources[i]) {
+                return false;
+            }
+        }
+        return true;
+    }
+};
+
+/**
+ * Outputs a log message to global console.log() function.
+ *
+ * @method _printToBrowserConsole
+ * @param oEntry {Object} Log entry object.
+ * @private
+ */
+YAHOO.widget.Logger._printToBrowserConsole = function(oEntry) {
+    if(window.console && console.log) {
+        var category = oEntry.category;
+        var label = oEntry.category.substring(0,4).toUpperCase();
+
+        var time = oEntry.time;
+        if (time.toLocaleTimeString) {
+            var localTime  = time.toLocaleTimeString();
+        }
+        else {
+            localTime = time.toString();
+        }
+
+        var msecs = time.getTime();
+        var elapsedTime = (YAHOO.widget.Logger._lastTime) ?
+            (msecs - YAHOO.widget.Logger._lastTime) : 0;
+        YAHOO.widget.Logger._lastTime = msecs;
+
+        var output =
+            localTime + " (" +
+            elapsedTime + "ms): " +
+            oEntry.source + ": " +
+            oEntry.msg;
+
+        console.log(output);
+    }
+};
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Private event handlers
+//
+/////////////////////////////////////////////////////////////////////////////
+
+/**
+ * Handles logging of messages due to window error events.
+ *
+ * @method _onWindowError
+ * @param sMsg {String} The error message.
+ * @param sUrl {String} URL of the error.
+ * @param sLine {String} Line number of the error.
+ * @private
+ */
+YAHOO.widget.Logger._onWindowError = function(sMsg,sUrl,sLine) {
+    // Logger is not in scope of this event handler
+    try {
+        YAHOO.widget.Logger.log(sMsg+' ('+sUrl+', line '+sLine+')', "window");
+        if(YAHOO.widget.Logger._origOnWindowError) {
+            YAHOO.widget.Logger._origOnWindowError();
+        }
+    }
+    catch(e) {
+        return false;
+    }
+};
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Enable handling of native JavaScript errors
+// NB: Not all browsers support the window.onerror event
+//
+/////////////////////////////////////////////////////////////////////////////
+
+if(window.onerror) {
+    // Save any previously defined handler to call
+    YAHOO.widget.Logger._origOnWindowError = window.onerror;
+}
+window.onerror = YAHOO.widget.Logger._onWindowError;
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// First log
+//
+/////////////////////////////////////////////////////////////////////////////
+
+YAHOO.widget.Logger.log("Logger initialized");
+
+
+YAHOO.register("logger", YAHOO.widget.Logger, {version: "2.2.0", build: "127"});
diff --git a/interface/ispconfig/interface/js/yui/logger/logger-min.js b/interface/ispconfig/interface/js/yui/logger/logger-min.js
new file mode 100644
index 0000000000000000000000000000000000000000..a633e1b150372611c3ac995599b2ce3f7f2b16d1
--- /dev/null
+++ b/interface/ispconfig/interface/js/yui/logger/logger-min.js
@@ -0,0 +1,63 @@
+/*
+Copyright (c) 2007, Yahoo! Inc. All rights reserved.
+Code licensed under the BSD License:
+http://developer.yahoo.net/yui/license.txt
+version: 2.2.0
+*/
+
+YAHOO.widget.LogMsg=function(oConfigs){if(typeof oConfigs=="object"){for(var param in oConfigs){this[param]=oConfigs[param];}}};YAHOO.widget.LogMsg.prototype.msg=null;YAHOO.widget.LogMsg.prototype.time=null;YAHOO.widget.LogMsg.prototype.category=null;YAHOO.widget.LogMsg.prototype.source=null;YAHOO.widget.LogMsg.prototype.sourceDetail=null;YAHOO.widget.LogWriter=function(sSource){if(!sSource){YAHOO.log("Could not instantiate LogWriter due to invalid source.","error","LogWriter");return;}
+this._source=sSource;};YAHOO.widget.LogWriter.prototype.toString=function(){return"LogWriter "+this._sSource;};YAHOO.widget.LogWriter.prototype.log=function(sMsg,sCategory){YAHOO.widget.Logger.log(sMsg,sCategory,this._source);};YAHOO.widget.LogWriter.prototype.getSource=function(){return this._sSource;};YAHOO.widget.LogWriter.prototype.setSource=function(sSource){if(!sSource){YAHOO.log("Could not set source due to invalid source.","error",this.toString());return;}
+else{this._sSource=sSource;}};YAHOO.widget.LogWriter.prototype._source=null;YAHOO.widget.LogReader=function(elContainer,oConfigs){var oSelf=this;this._sName=YAHOO.widget.LogReader._index;YAHOO.widget.LogReader._index++;if(typeof oConfigs=="object"){for(var param in oConfigs){this[param]=oConfigs[param];}}
+if(elContainer){if(typeof elContainer=="string"){this._elContainer=document.getElementById(elContainer);}
+else if(elContainer.tagName){this._elContainer=elContainer;}
+this._elContainer.className="yui-log";}
+if(!this._elContainer){if(YAHOO.widget.LogReader._elDefaultContainer){this._elContainer=YAHOO.widget.LogReader._elDefaultContainer;}
+else{this._elContainer=document.body.appendChild(document.createElement("div"));this._elContainer.id="yui-log";this._elContainer.className="yui-log";YAHOO.widget.LogReader._elDefaultContainer=this._elContainer;}
+var containerStyle=this._elContainer.style;if(this.width){containerStyle.width=this.width;}
+if(this.right){containerStyle.right=this.right;}
+if(this.top){containerStyle.top=this.top;}
+if(this.left){containerStyle.left=this.left;containerStyle.right="auto";}
+if(this.bottom){containerStyle.bottom=this.bottom;containerStyle.top="auto";}
+if(this.fontSize){containerStyle.fontSize=this.fontSize;}
+if(navigator.userAgent.toLowerCase().indexOf("opera")!=-1){document.body.style+='';}}
+if(this._elContainer){if(!this._elHd){this._elHd=this._elContainer.appendChild(document.createElement("div"));this._elHd.id="yui-log-hd"+this._sName;this._elHd.className="yui-log-hd";this._elCollapse=this._elHd.appendChild(document.createElement("div"));this._elCollapse.className="yui-log-btns";this._btnCollapse=document.createElement("input");this._btnCollapse.type="button";this._btnCollapse.style.fontSize=YAHOO.util.Dom.getStyle(this._elContainer,"fontSize");this._btnCollapse.className="yui-log-button";this._btnCollapse.value="Collapse";this._btnCollapse=this._elCollapse.appendChild(this._btnCollapse);YAHOO.util.Event.addListener(oSelf._btnCollapse,'click',oSelf._onClickCollapseBtn,oSelf);this._title=this._elHd.appendChild(document.createElement("h4"));this._title.innerHTML="Logger Console";if(YAHOO.util.DD&&(YAHOO.widget.LogReader._elDefaultContainer==this._elContainer)){var ylog_dd=new YAHOO.util.DD(this._elContainer.id);ylog_dd.setHandleElId(this._elHd.id);this._elHd.style.cursor="move";}}
+if(!this._elConsole){this._elConsole=this._elContainer.appendChild(document.createElement("div"));this._elConsole.className="yui-log-bd";if(this.height){this._elConsole.style.height=this.height;}}
+if(!this._elFt&&this.footerEnabled){this._elFt=this._elContainer.appendChild(document.createElement("div"));this._elFt.className="yui-log-ft";this._elBtns=this._elFt.appendChild(document.createElement("div"));this._elBtns.className="yui-log-btns";this._btnPause=document.createElement("input");this._btnPause.type="button";this._btnPause.style.fontSize=YAHOO.util.Dom.getStyle(this._elContainer,"fontSize");this._btnPause.className="yui-log-button";this._btnPause.value="Pause";this._btnPause=this._elBtns.appendChild(this._btnPause);YAHOO.util.Event.addListener(oSelf._btnPause,'click',oSelf._onClickPauseBtn,oSelf);this._btnClear=document.createElement("input");this._btnClear.type="button";this._btnClear.style.fontSize=YAHOO.util.Dom.getStyle(this._elContainer,"fontSize");this._btnClear.className="yui-log-button";this._btnClear.value="Clear";this._btnClear=this._elBtns.appendChild(this._btnClear);YAHOO.util.Event.addListener(oSelf._btnClear,'click',oSelf._onClickClearBtn,oSelf);this._elCategoryFilters=this._elFt.appendChild(document.createElement("div"));this._elCategoryFilters.className="yui-log-categoryfilters";this._elSourceFilters=this._elFt.appendChild(document.createElement("div"));this._elSourceFilters.className="yui-log-sourcefilters";}}
+if(!this._buffer){this._buffer=[];}
+this._lastTime=YAHOO.widget.Logger.getStartTime();YAHOO.widget.Logger.newLogEvent.subscribe(this._onNewLog,this);YAHOO.widget.Logger.logResetEvent.subscribe(this._onReset,this);this._categoryFilters=[];var catsLen=YAHOO.widget.Logger.categories.length;if(this._elCategoryFilters){for(var i=0;i",label," ",totalTime,"ms (+",elapsedTime,") ",localTime,": ","

",sourceAndDetail,":

",msg,"

"]:["

",label," ",totalTime,"ms (+",elapsedTime,") ",localTime,": ",sourceAndDetail,": ",msg,"

"];return output.join("");};YAHOO.widget.LogReader.prototype.html2Text=function(sHtml){if(sHtml){sHtml+="";return sHtml.replace(/&/g,"&").replace(//g,">");} +return"";};YAHOO.widget.LogReader._index=0;YAHOO.widget.LogReader.prototype._sName=null;YAHOO.widget.LogReader._elDefaultContainer=null;YAHOO.widget.LogReader.prototype._buffer=null;YAHOO.widget.LogReader.prototype._consoleMsgCount=0;YAHOO.widget.LogReader.prototype._lastTime=null;YAHOO.widget.LogReader.prototype._timeout=null;YAHOO.widget.LogReader.prototype._categoryFilters=null;YAHOO.widget.LogReader.prototype._sourceFilters=null;YAHOO.widget.LogReader.prototype._elContainer=null;YAHOO.widget.LogReader.prototype._elHd=null;YAHOO.widget.LogReader.prototype._elCollapse=null;YAHOO.widget.LogReader.prototype._btnCollapse=null;YAHOO.widget.LogReader.prototype._title=null;YAHOO.widget.LogReader.prototype._elConsole=null;YAHOO.widget.LogReader.prototype._elFt=null;YAHOO.widget.LogReader.prototype._elBtns=null;YAHOO.widget.LogReader.prototype._elCategoryFilters=null;YAHOO.widget.LogReader.prototype._elSourceFilters=null;YAHOO.widget.LogReader.prototype._btnPause=null;YAHOO.widget.LogReader.prototype._btnClear=null;YAHOO.widget.LogReader.prototype._createCategoryCheckbox=function(sCategory){var oSelf=this;if(this._elFt){var elParent=this._elCategoryFilters;var filters=this._categoryFilters;var elFilter=elParent.appendChild(document.createElement("span"));elFilter.className="yui-log-filtergrp";var chkCategory=document.createElement("input");chkCategory.id="yui-log-filter-"+sCategory+this._sName;chkCategory.className="yui-log-filter-"+sCategory;chkCategory.type="checkbox";chkCategory.category=sCategory;chkCategory=elFilter.appendChild(chkCategory);chkCategory.checked=true;filters.push(sCategory);YAHOO.util.Event.addListener(chkCategory,'click',oSelf._onCheckCategory,oSelf);var lblCategory=elFilter.appendChild(document.createElement("label"));lblCategory.htmlFor=chkCategory.id;lblCategory.className=sCategory;lblCategory.innerHTML=sCategory;}};YAHOO.widget.LogReader.prototype._createSourceCheckbox=function(sSource){var oSelf=this;if(this._elFt){var elParent=this._elSourceFilters;var filters=this._sourceFilters;var elFilter=elParent.appendChild(document.createElement("span"));elFilter.className="yui-log-filtergrp";var chkSource=document.createElement("input");chkSource.id="yui-log-filter"+sSource+this._sName;chkSource.className="yui-log-filter"+sSource;chkSource.type="checkbox";chkSource.source=sSource;chkSource=elFilter.appendChild(chkSource);chkSource.checked=true;filters.push(sSource);YAHOO.util.Event.addListener(chkSource,'click',oSelf._onCheckSource,oSelf);var lblSource=elFilter.appendChild(document.createElement("label"));lblSource.htmlFor=chkSource.id;lblSource.className=sSource;lblSource.innerHTML=sSource;}};YAHOO.widget.LogReader.prototype._filterLogs=function(){if(this._elConsole!==null){this._clearConsole();this._printToConsole(YAHOO.widget.Logger.getStack());}};YAHOO.widget.LogReader.prototype._clearConsole=function(){this._timeout=null;this._buffer=[];this._consoleMsgCount=0;this._lastTime=YAHOO.widget.Logger.getStartTime();var elConsole=this._elConsole;while(elConsole.hasChildNodes()){elConsole.removeChild(elConsole.firstChild);}};YAHOO.widget.LogReader.prototype._printBuffer=function(){this._timeout=null;if(this._elConsole!==null){var thresholdMax=this.thresholdMax;thresholdMax=(thresholdMax&&!isNaN(thresholdMax))?thresholdMax:500;if(this._consoleMsgCountthis.thresholdMax)){thresholdMin=0;} +var entriesStartIndex=(entriesLen>thresholdMin)?(entriesLen-thresholdMin):0;var sourceFiltersLen=this._sourceFilters.length;var categoryFiltersLen=this._categoryFilters.length;for(var i=entriesStartIndex;i0){sClass=sSource.substring(0,spaceIndex);sDetail=sSource.substring(spaceIndex,sSource.length);} +else{sClass=sSource;} +if(this._isNewSource(sClass)){this._createNewSource(sClass);}} +var timestamp=new Date();var logEntry=new YAHOO.widget.LogMsg({msg:sMsg,time:timestamp,category:sCategory,source:sClass,sourceDetail:sDetail});var stack=this._stack;var maxStackEntries=this.maxStackEntries;if(maxStackEntries&&!isNaN(maxStackEntries)&&(stack.length>=maxStackEntries)){stack.shift();} +stack.push(logEntry);this.newLogEvent.fire(logEntry);if(this._browserConsoleEnabled){this._printToBrowserConsole(logEntry);} +return true;} +else{return false;}};YAHOO.widget.Logger.reset=function(){this._stack=[];this._startTime=new Date().getTime();this.loggerEnabled=true;this.log("Logger reset");this.logResetEvent.fire();};YAHOO.widget.Logger.getStack=function(){return this._stack;};YAHOO.widget.Logger.getStartTime=function(){return this._startTime;};YAHOO.widget.Logger.disableBrowserConsole=function(){YAHOO.log("Logger output to the function console.log() has been disabled.");this._browserConsoleEnabled=false;};YAHOO.widget.Logger.enableBrowserConsole=function(){this._browserConsoleEnabled=true;YAHOO.log("Logger output to the function console.log() has been enabled.");};YAHOO.widget.Logger.categoryCreateEvent=new YAHOO.util.CustomEvent("categoryCreate",this,true);YAHOO.widget.Logger.sourceCreateEvent=new YAHOO.util.CustomEvent("sourceCreate",this,true);YAHOO.widget.Logger.newLogEvent=new YAHOO.util.CustomEvent("newLog",this,true);YAHOO.widget.Logger.logResetEvent=new YAHOO.util.CustomEvent("logReset",this,true);YAHOO.widget.Logger._createNewCategory=function(sCategory){this.categories.push(sCategory);this.categoryCreateEvent.fire(sCategory);};YAHOO.widget.Logger._isNewCategory=function(sCategory){for(var i=0;i", label, " ", + totalTime, "ms (+", elapsedTime, ") ", + localTime, ": ", + "

", + sourceAndDetail, + ":

", + msg, + "

"] : + + ["

", label, " ", + totalTime, "ms (+", elapsedTime, ") ", + localTime, ": ", + sourceAndDetail, ": ", + msg,"

"]; + + return output.join(""); +}; + +/** + * Converts input chars "<", ">", and "&" to HTML entities. + * + * @method html2Text + * @param sHtml {String} String to convert. + * @private + */ +YAHOO.widget.LogReader.prototype.html2Text = function(sHtml) { + if(sHtml) { + sHtml += ""; + return sHtml.replace(/&/g, "&").replace(//g, ">"); + } + return ""; +}; + +///////////////////////////////////////////////////////////////////////////// +// +// Private member variables +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Internal class member to index multiple LogReader instances. + * + * @property _memberName + * @static + * @type Number + * @default 0 + * @private + */ +YAHOO.widget.LogReader._index = 0; + +/** + * Name of LogReader instance. + * + * @property _sName + * @type String + * @private + */ +YAHOO.widget.LogReader.prototype._sName = null; + +/** + * A class member shared by all LogReaders if a container needs to be + * created during instantiation. Will be null if a container element never needs to + * be created on the fly, such as when the implementer passes in their own element. + * + * @property _elDefaultContainer + * @type HTMLElement + * @private + */ +YAHOO.widget.LogReader._elDefaultContainer = null; + +/** + * Buffer of log message objects for batch output. + * + * @property _buffer + * @type Object[] + * @private + */ +YAHOO.widget.LogReader.prototype._buffer = null; + +/** + * Number of log messages output to console. + * + * @property _consoleMsgCount + * @type Number + * @default 0 + * @private + */ +YAHOO.widget.LogReader.prototype._consoleMsgCount = 0; + +/** + * Date of last output log message. + * + * @property _lastTime + * @type Date + * @private + */ +YAHOO.widget.LogReader.prototype._lastTime = null; + +/** + * Batched output timeout ID. + * + * @property _timeout + * @type Number + * @private + */ +YAHOO.widget.LogReader.prototype._timeout = null; + +/** + * Array of filters for log message categories. + * + * @property _categoryFilters + * @type String[] + * @private + */ +YAHOO.widget.LogReader.prototype._categoryFilters = null; + +/** + * Array of filters for log message sources. + * + * @property _sourceFilters + * @type String[] + * @private + */ +YAHOO.widget.LogReader.prototype._sourceFilters = null; + +/** + * LogReader container element. + * + * @property _elContainer + * @type HTMLElement + * @private + */ +YAHOO.widget.LogReader.prototype._elContainer = null; + +/** + * LogReader header element. + * + * @property _elHd + * @type HTMLElement + * @private + */ +YAHOO.widget.LogReader.prototype._elHd = null; + +/** + * LogReader collapse element. + * + * @property _elCollapse + * @type HTMLElement + * @private + */ +YAHOO.widget.LogReader.prototype._elCollapse = null; + +/** + * LogReader collapse button element. + * + * @property _btnCollapse + * @type HTMLElement + * @private + */ +YAHOO.widget.LogReader.prototype._btnCollapse = null; + +/** + * LogReader title header element. + * + * @property _title + * @type HTMLElement + * @private + */ +YAHOO.widget.LogReader.prototype._title = null; + +/** + * LogReader console element. + * + * @property _elConsole + * @type HTMLElement + * @private + */ +YAHOO.widget.LogReader.prototype._elConsole = null; + +/** + * LogReader footer element. + * + * @property _elFt + * @type HTMLElement + * @private + */ +YAHOO.widget.LogReader.prototype._elFt = null; + +/** + * LogReader buttons container element. + * + * @property _elBtns + * @type HTMLElement + * @private + */ +YAHOO.widget.LogReader.prototype._elBtns = null; + +/** + * Container element for LogReader category filter checkboxes. + * + * @property _elCategoryFilters + * @type HTMLElement + * @private + */ +YAHOO.widget.LogReader.prototype._elCategoryFilters = null; + +/** + * Container element for LogReader source filter checkboxes. + * + * @property _elSourceFilters + * @type HTMLElement + * @private + */ +YAHOO.widget.LogReader.prototype._elSourceFilters = null; + +/** + * LogReader pause button element. + * + * @property _btnPause + * @type HTMLElement + * @private + */ +YAHOO.widget.LogReader.prototype._btnPause = null; + +/** + * Clear button element. + * + * @property _btnClear + * @type HTMLElement + * @private + */ +YAHOO.widget.LogReader.prototype._btnClear = null; + +///////////////////////////////////////////////////////////////////////////// +// +// Private methods +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Creates the UI for a category filter in the LogReader footer element. + * + * @method _createCategoryCheckbox + * @param sCategory {String} Category name. + * @private + */ +YAHOO.widget.LogReader.prototype._createCategoryCheckbox = function(sCategory) { + var oSelf = this; + + if(this._elFt) { + var elParent = this._elCategoryFilters; + var filters = this._categoryFilters; + + var elFilter = elParent.appendChild(document.createElement("span")); + elFilter.className = "yui-log-filtergrp"; + // Append el at the end so IE 5.5 can set "type" attribute + // and THEN set checked property + var chkCategory = document.createElement("input"); + chkCategory.id = "yui-log-filter-" + sCategory + this._sName; + chkCategory.className = "yui-log-filter-" + sCategory; + chkCategory.type = "checkbox"; + chkCategory.category = sCategory; + chkCategory = elFilter.appendChild(chkCategory); + chkCategory.checked = true; + + // Add this checked filter to the internal array of filters + filters.push(sCategory); + // Subscribe to the click event + YAHOO.util.Event.addListener(chkCategory,'click',oSelf._onCheckCategory,oSelf); + + // Create and class the text label + var lblCategory = elFilter.appendChild(document.createElement("label")); + lblCategory.htmlFor = chkCategory.id; + lblCategory.className = sCategory; + lblCategory.innerHTML = sCategory; + } +}; + +/** + * Creates a checkbox in the LogReader footer element to filter by source. + * + * @method _createSourceCheckbox + * @param sSource {String} Source name. + * @private + */ +YAHOO.widget.LogReader.prototype._createSourceCheckbox = function(sSource) { + var oSelf = this; + + if(this._elFt) { + var elParent = this._elSourceFilters; + var filters = this._sourceFilters; + + var elFilter = elParent.appendChild(document.createElement("span")); + elFilter.className = "yui-log-filtergrp"; + + // Append el at the end so IE 5.5 can set "type" attribute + // and THEN set checked property + var chkSource = document.createElement("input"); + chkSource.id = "yui-log-filter" + sSource + this._sName; + chkSource.className = "yui-log-filter" + sSource; + chkSource.type = "checkbox"; + chkSource.source = sSource; + chkSource = elFilter.appendChild(chkSource); + chkSource.checked = true; + + // Add this checked filter to the internal array of filters + filters.push(sSource); + // Subscribe to the click event + YAHOO.util.Event.addListener(chkSource,'click',oSelf._onCheckSource,oSelf); + + // Create and class the text label + var lblSource = elFilter.appendChild(document.createElement("label")); + lblSource.htmlFor = chkSource.id; + lblSource.className = sSource; + lblSource.innerHTML = sSource; + } +}; + +/** + * Reprints all log messages in the stack through filters. + * + * @method _filterLogs + * @private + */ +YAHOO.widget.LogReader.prototype._filterLogs = function() { + // Reprint stack with new filters + if (this._elConsole !== null) { + this._clearConsole(); + this._printToConsole(YAHOO.widget.Logger.getStack()); + } +}; + +/** + * Clears all outputted log messages from the console and resets the time of the + * last output log message. + * + * @method _clearConsole + * @private + */ +YAHOO.widget.LogReader.prototype._clearConsole = function() { + // Clear the buffer of any pending messages + this._timeout = null; + this._buffer = []; + this._consoleMsgCount = 0; + + // Reset the rolling timer + this._lastTime = YAHOO.widget.Logger.getStartTime(); + + var elConsole = this._elConsole; + while(elConsole.hasChildNodes()) { + elConsole.removeChild(elConsole.firstChild); + } +}; + +/** + * Sends buffer of log messages to output and clears buffer. + * + * @method _printBuffer + * @private + */ +YAHOO.widget.LogReader.prototype._printBuffer = function() { + this._timeout = null; + + if(this._elConsole !== null) { + var thresholdMax = this.thresholdMax; + thresholdMax = (thresholdMax && !isNaN(thresholdMax)) ? thresholdMax : 500; + if(this._consoleMsgCount < thresholdMax) { + var entries = []; + for (var i=0; i this.thresholdMax)) { + thresholdMin = 0; + } + var entriesStartIndex = (entriesLen > thresholdMin) ? (entriesLen - thresholdMin) : 0; + + // Iterate through all log entries + var sourceFiltersLen = this._sourceFilters.length; + var categoryFiltersLen = this._categoryFilters.length; + for(var i=entriesStartIndex; i tag instead of
 tag (for wrapping)
+            var container = (this.verboseOutput) ? "CODE" : "PRE";
+            var oNewElement = (this.newestOnTop) ?
+                this._elConsole.insertBefore(
+                    document.createElement(container),this._elConsole.firstChild):
+                this._elConsole.appendChild(document.createElement(container));
+
+            oNewElement.innerHTML = output;
+            this._consoleMsgCount++;
+            this._lastTime = entry.time.getTime();
+        }
+    }
+};
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Private event handlers
+//
+/////////////////////////////////////////////////////////////////////////////
+
+/**
+ * Handles Logger's categoryCreateEvent.
+ *
+ * @method _onCategoryCreate
+ * @param sType {String} The event.
+ * @param aArgs {Object[]} Data passed from event firer.
+ * @param oSelf {Object} The LogReader instance.
+ * @private
+ */
+YAHOO.widget.LogReader.prototype._onCategoryCreate = function(sType, aArgs, oSelf) {
+    var category = aArgs[0];
+    if(oSelf._elFt) {
+        oSelf._createCategoryCheckbox(category);
+    }
+};
+
+/**
+ * Handles Logger's sourceCreateEvent.
+ *
+ * @method _onSourceCreate
+ * @param sType {String} The event.
+ * @param aArgs {Object[]} Data passed from event firer.
+ * @param oSelf {Object} The LogReader instance.
+ * @private
+ */
+YAHOO.widget.LogReader.prototype._onSourceCreate = function(sType, aArgs, oSelf) {
+    var source = aArgs[0];
+    if(oSelf._elFt) {
+        oSelf._createSourceCheckbox(source);
+    }
+};
+
+/**
+ * Handles check events on the category filter checkboxes.
+ *
+ * @method _onCheckCategory
+ * @param v {HTMLEvent} The click event.
+ * @param oSelf {Object} The LogReader instance.
+ * @private
+ */
+YAHOO.widget.LogReader.prototype._onCheckCategory = function(v, oSelf) {
+    var newFilter = this.category;
+    var filtersArray = oSelf._categoryFilters;
+
+    if(!this.checked) { // Remove category from filters
+        for(var i=0; i 0) {
+                // Substring until first space
+                sClass = sSource.substring(0,spaceIndex);
+                // The rest of the source
+                sDetail = sSource.substring(spaceIndex,sSource.length);
+            }
+            else {
+                sClass = sSource;
+            }
+            if(this._isNewSource(sClass)) {
+                this._createNewSource(sClass);
+            }
+        }
+
+        var timestamp = new Date();
+        var logEntry = new YAHOO.widget.LogMsg({
+            msg: sMsg,
+            time: timestamp,
+            category: sCategory,
+            source: sClass,
+            sourceDetail: sDetail
+        });
+
+        var stack = this._stack;
+        var maxStackEntries = this.maxStackEntries;
+        if(maxStackEntries && !isNaN(maxStackEntries) &&
+            (stack.length >= maxStackEntries)) {
+            stack.shift();
+        }
+        stack.push(logEntry);
+        this.newLogEvent.fire(logEntry);
+
+        if(this._browserConsoleEnabled) {
+            this._printToBrowserConsole(logEntry);
+        }
+        return true;
+    }
+    else {
+        return false;
+    }
+};
+
+/**
+ * Resets internal stack and startTime, enables Logger, and fires logResetEvent.
+ *
+ * @method reset
+ */
+YAHOO.widget.Logger.reset = function() {
+    this._stack = [];
+    this._startTime = new Date().getTime();
+    this.loggerEnabled = true;
+    this.log("Logger reset");
+    this.logResetEvent.fire();
+};
+
+/**
+ * Public accessor to internal stack of log message objects.
+ *
+ * @method getStack
+ * @return {Object[]} Array of log message objects.
+ */
+YAHOO.widget.Logger.getStack = function() {
+    return this._stack;
+};
+
+/**
+ * Public accessor to internal start time.
+ *
+ * @method getStartTime
+ * @return {Date} Internal date of when Logger singleton was initialized.
+ */
+YAHOO.widget.Logger.getStartTime = function() {
+    return this._startTime;
+};
+
+/**
+ * Disables output to the browser's global console.log() function, which is used
+ * by the Firebug extension to Firefox as well as Safari.
+ *
+ * @method disableBrowserConsole
+ */
+YAHOO.widget.Logger.disableBrowserConsole = function() {
+    YAHOO.log("Logger output to the function console.log() has been disabled.");
+    this._browserConsoleEnabled = false;
+};
+
+/**
+ * Enables output to the browser's global console.log() function, which is used
+ * by the Firebug extension to Firefox as well as Safari.
+ *
+ * @method enableBrowserConsole
+ */
+YAHOO.widget.Logger.enableBrowserConsole = function() {
+    this._browserConsoleEnabled = true;
+    YAHOO.log("Logger output to the function console.log() has been enabled.");
+};
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Public events
+//
+/////////////////////////////////////////////////////////////////////////////
+
+ /**
+ * Fired when a new category has been created.
+ *
+ * @event categoryCreateEvent
+ * @param sCategory {String} Category name.
+ */
+YAHOO.widget.Logger.categoryCreateEvent =
+    new YAHOO.util.CustomEvent("categoryCreate", this, true);
+
+ /**
+ * Fired when a new source has been named.
+ *
+ * @event sourceCreateEvent
+ * @param sSource {String} Source name.
+ */
+YAHOO.widget.Logger.sourceCreateEvent =
+    new YAHOO.util.CustomEvent("sourceCreate", this, true);
+
+ /**
+ * Fired when a new log message has been created.
+ *
+ * @event newLogEvent
+ * @param sMsg {String} Log message.
+ */
+YAHOO.widget.Logger.newLogEvent = new YAHOO.util.CustomEvent("newLog", this, true);
+
+/**
+ * Fired when the Logger has been reset has been created.
+ *
+ * @event logResetEvent
+ */
+YAHOO.widget.Logger.logResetEvent = new YAHOO.util.CustomEvent("logReset", this, true);
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Private methods
+//
+/////////////////////////////////////////////////////////////////////////////
+
+/**
+ * Creates a new category of log messages and fires categoryCreateEvent.
+ *
+ * @method _createNewCategory
+ * @param sCategory {String} Category name.
+ * @private
+ */
+YAHOO.widget.Logger._createNewCategory = function(sCategory) {
+    this.categories.push(sCategory);
+    this.categoryCreateEvent.fire(sCategory);
+};
+
+/**
+ * Checks to see if a category has already been created.
+ *
+ * @method _isNewCategory
+ * @param sCategory {String} Category name.
+ * @return {Boolean} Returns true if category is unknown, else returns false.
+ * @private
+ */
+YAHOO.widget.Logger._isNewCategory = function(sCategory) {
+    for(var i=0; i < this.categories.length; i++) {
+        if(sCategory == this.categories[i]) {
+            return false;
+        }
+    }
+    return true;
+};
+
+/**
+ * Creates a new source of log messages and fires sourceCreateEvent.
+ *
+ * @method _createNewSource
+ * @param sSource {String} Source name.
+ * @private
+ */
+YAHOO.widget.Logger._createNewSource = function(sSource) {
+    this.sources.push(sSource);
+    this.sourceCreateEvent.fire(sSource);
+};
+
+/**
+ * Checks to see if a source already exists.
+ *
+ * @method _isNewSource
+ * @param sSource {String} Source name.
+ * @return {Boolean} Returns true if source is unknown, else returns false.
+ * @private
+ */
+YAHOO.widget.Logger._isNewSource = function(sSource) {
+    if(sSource) {
+        for(var i=0; i < this.sources.length; i++) {
+            if(sSource == this.sources[i]) {
+                return false;
+            }
+        }
+        return true;
+    }
+};
+
+/**
+ * Outputs a log message to global console.log() function.
+ *
+ * @method _printToBrowserConsole
+ * @param oEntry {Object} Log entry object.
+ * @private
+ */
+YAHOO.widget.Logger._printToBrowserConsole = function(oEntry) {
+    if(window.console && console.log) {
+        var category = oEntry.category;
+        var label = oEntry.category.substring(0,4).toUpperCase();
+
+        var time = oEntry.time;
+        if (time.toLocaleTimeString) {
+            var localTime  = time.toLocaleTimeString();
+        }
+        else {
+            localTime = time.toString();
+        }
+
+        var msecs = time.getTime();
+        var elapsedTime = (YAHOO.widget.Logger._lastTime) ?
+            (msecs - YAHOO.widget.Logger._lastTime) : 0;
+        YAHOO.widget.Logger._lastTime = msecs;
+
+        var output =
+            localTime + " (" +
+            elapsedTime + "ms): " +
+            oEntry.source + ": " +
+            oEntry.msg;
+
+        console.log(output);
+    }
+};
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Private event handlers
+//
+/////////////////////////////////////////////////////////////////////////////
+
+/**
+ * Handles logging of messages due to window error events.
+ *
+ * @method _onWindowError
+ * @param sMsg {String} The error message.
+ * @param sUrl {String} URL of the error.
+ * @param sLine {String} Line number of the error.
+ * @private
+ */
+YAHOO.widget.Logger._onWindowError = function(sMsg,sUrl,sLine) {
+    // Logger is not in scope of this event handler
+    try {
+        YAHOO.widget.Logger.log(sMsg+' ('+sUrl+', line '+sLine+')', "window");
+        if(YAHOO.widget.Logger._origOnWindowError) {
+            YAHOO.widget.Logger._origOnWindowError();
+        }
+    }
+    catch(e) {
+        return false;
+    }
+};
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Enable handling of native JavaScript errors
+// NB: Not all browsers support the window.onerror event
+//
+/////////////////////////////////////////////////////////////////////////////
+
+if(window.onerror) {
+    // Save any previously defined handler to call
+    YAHOO.widget.Logger._origOnWindowError = window.onerror;
+}
+window.onerror = YAHOO.widget.Logger._onWindowError;
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// First log
+//
+/////////////////////////////////////////////////////////////////////////////
+
+YAHOO.widget.Logger.log("Logger initialized");
+
+
+YAHOO.register("logger", YAHOO.widget.Logger, {version: "2.2.0", build: "127"});
diff --git a/interface/ispconfig/interface/js/yui/menu/README b/interface/ispconfig/interface/js/yui/menu/README
new file mode 100644
index 0000000000000000000000000000000000000000..34689ef9593a5439b1100c272b359930e8834c4d
--- /dev/null
+++ b/interface/ispconfig/interface/js/yui/menu/README
@@ -0,0 +1,385 @@
+*** version 2.2.0 ***
+
+Added the following features:
+-----------------------------
+
+* Added two new methods to YAHOO.widget.Menu:
+
+    * "getItems" - Returns a flat array of the items in a menu.
+
+    * "clearContent" - Removes all of the content from the menu, including the 
+      menu items, group titles, header and footer.
+
+
+* Added three new configuration attributes to YAHOO.widget.Menu:
+
+    * "submenuhidedelay" - Number indicating the time (in milliseconds) that 
+      should expire before a submenu is hidden when the user mouses out of a 
+      menu item heading in the direction of a submenu. The value must be 
+      greater than or equal to the value specified for the "showdelay" 
+      configuration property.
+
+    * "maxheight" - Defines the maximum height (in pixels) for a menu before 
+      the contents of the body are scrolled. 
+
+    * "classname" - CSS class to be applied to the menu's root 
element. + The specified class(es) are appended in addition to the default class as + specified by the menu's CSS_CLASS_NAME constant. + + +* Added new constants to YAHOO.widget.MenuItem: + + * COLLAPSED_SUBMENU_INDICATOR_TEXT - String representing the text for the + element used for the submenu arrow indicator. + + * EXPANDED_SUBMENU_INDICATOR_TEXT - String representing the text for the + submenu arrow indicator element () when the submenu is visible. + + * DISABLED_SUBMENU_INDICATOR_ALT_TEXT - String representing the text for + the submenu arrow indicator element () when the menu item is disabled. + + * CHECKED_TEXT - String representing the text to be used for the checked + indicator element (). + + * DISABLED_CHECKED_TEXT - String representing the text to be used for the + checked indicator element () when the menu item is disabled. + + +* Added two new configuration attributes to YAHOO.widget.MenuItem: + + * "onclick" - Object literal representing the code to be executed when the + button is clicked. Format: + + { + fn: Function, // The handler to call when the event fires. + obj: Object, // An object to pass back to the handler. + scope: Object // The object to use for the scope of the handler. + } + + * "classname" - CSS class to be applied to the menu item's root
  • + element. The specified class(es) are appended in addition to the default + class as specified by the menu item's CSS_CLASS_NAME constant. + + +* Added an "id" property to YAHOO.widget.MenuItem that represents the id of + the menu item's root
  • node. Although not a configuration attribute, this + property should be set via the object literal of configuration attributes + passed as the second argument to the constructor. If no value is + specified, then one will be generated using the "generateId" method of the + Dom utility (YAHOO.widget.Dom). + +* Added a "trigger context menu event" + (YAHOO.widget.ContextMenu.triggerContextMenuEvent) that fires when the DOM + "contextmenu" event ("mousedown" for Opera) is fired by one of the elemeents + defined as a YAHOO.widget.ContextMenu instance's trigger. + +* Added a "cancel" method to YAHOO.widget.ContextMenu that can be used to + cancel the display of a YAHOO.widget.ContextMen instance. This method + should be called within the scope of a "context menu" event handler for + one of the context menu's triggers + (YAHOO.widget.ContextMenu.triggerContextMenuEvent). + + +Fixed the following bugs: +------------------------- + +* Users can now move diagonally from a menu item to its corresponding submenu + without the submenu hiding immediately. + +* "destroy" method of YAHOO.widget.Menu now unsubscribes from the "text resize" + event (YAHOO.widget.Module.textResizeEvent). + +* Browser progress bar no longer flashes when hovering over checked menu items + or menu items with submenus. + +* Menu item submenu indicator image no longer jumps to the next line in + quirks mode. + +* Mouse events no longer fire in Firefox if a YAHOO.widget.Menu instance is + moved by script into a stationary mouse pointer. + +* Modified "toString" method of YAHOO.widget.ContextMenuItem to return the + correct class name, as it was reporting as YAHOO.widget.MenuBarItem. + + +Changes: +-------- + +* Default value for the "showdelay" configuration attribute is now 250 + +* Modified code so that all Menu images are added via CSS background images. + As a result, the following constants and properties have been deprecated: + + * YAHOO.widget.MenuItem.SUBMENU_INDICATOR_IMAGE_PATH + * YAHOO.widget.MenuItem.SELECTED_SUBMENU_INDICATOR_IMAGE_PATH + * YAHOO.widget.MenuItem.DISABLED_SUBMENU_INDICATOR_IMAGE_PATH + * YAHOO.widget.MenuItem.COLLAPSED_SUBMENU_INDICATOR_ALT_TEXT + * YAHOO.widget.MenuItem.EXPANDED_SUBMENU_INDICATOR_ALT_TEXT + * YAHOO.widget.MenuItem.DISABLED_SUBMENU_INDICATOR_ALT_TEXT + * YAHOO.widget.MenuItem.CHECKED_IMAGE_PATH + * YAHOO.widget.MenuItem.SELECTED_CHECKED_IMAGE_PATH + * YAHOO.widget.MenuItem.DISABLED_CHECKED_IMAGE_PATH + * YAHOO.widget.MenuItem.CHECKED_IMAGE_ALT_TEXT + * YAHOO.widget.MenuItem.DISABLED_CHECKED_IMAGE_ALT_TEXT + * YAHOO.widget.MenuItem.IMG_ROOT + * YAHOO.widget.MenuItem.IMG_ROOT_SSL + * YAHOO.widget.MenuItem.imageRoot + * YAHOO.widget.MenuItem.isSecure + + + +*** version 0.12.2 *** + +* No changes + + + +*** version 0.12.1 *** + +Fixed the following bugs: +------------------------- + +* Placed the call to the DOM "focus" method used by the MenuItem class inside + a zero-second timeout to resolve a race condition between menu positioning + and focusing of a menu item that resulted in the browser viewport + scrolling unnecessarily. + +* Switched to JSMin for JavaScript compression to resolve issues with the + minified version. + +* Disabled menu item instances will no longer display a submenu if the item is + clicked or moused over. + +* Can no longer select more than one item in a menu if using the keyboard and + mouse simultaneously. + +* Calling the "destory" method on a menu will now unregister all of the menu's + submenus from the MenuManager. + + + +*** version 0.12 *** + +Added the following features: +----------------------------- + +* Added the YAHOO.widget.MenuManager singleton class. + +* Added two new methods to YAHOO.widget.Menu: + + * "addItems" - Adds an array of items to a menu. + + * "getRoot" - Returns the root menu in a menu hierarchy. + +* Added two new events to YAHOO.widget.Menu: + + * "itemAddedEvent" - Fires when an item is added to a menu. + + * "itemRemovedEvent" - Fires when an item is removed from a menu. + +* Added two new properties to YAHOO.widget.Menu: + + * "itemData" - Array of items to be added to the menu. + + * "lazyLoad" - Boolean indicating if the menu's "lazy load" feature + is enabled. + +* Added new configuration properties to YAHOO.widget.Menu: + + * "hidedelay" - Hides the menu after the specified number of milliseconds. + + * "showdelay" - Shows the menu after the specified number of milliseconds. + + * "container" - The containing element the menu should be rendered into. + + * "clicktohide" - Boolean indicating if the menu will automatically be + hidden if the user clicks outside of it. + + * "autosubmenudisplay" - Boolean indicating if submenus are automatically + made visible when the user mouses over the menu's items. + +* Added a "toString" method to YAHOO.widget.MenuItem, YAHOO.widget.MenuBarItem + and YAHOO.widget.ContextMenuItem that returns the class name followed by the + value of the item's "text" configuration property. + + +Fixed the following bugs: +------------------------- + +* Setting a YAHOO.widget.ContextMenu instance's "trigger" configuration + property will remove all previous triggers before setting up the new ones. + +* "destroy" method of YAHOO.widget.ContextMenu cleans up all DOM event handlers. + +* Clicking on a menu item with a submenu no longer hides/collapses the + entire menu. + +* Clicking an item's submenu indicator image no longer collapses the + entire menu. + + +Changes: +-------- + +* Deprecated the YAHOO.widget.MenuModule and YAHOO.widget.MenuModuleItem + classes. The Base classes are now YAHOO.widget.Menu and + YAHOO.widget.MenuItem. + +* "addItem" and "insertItem" methods of YAHOO.widget.Menu now accept an + object literal representing YAHOO.widget.MenuItem configuration properties. + +* "clearActiveItem" now takes an argument: flag indicating if the Menu + instance's active item should be blurred. + +* Switched the default value of the "visible" configuration property for + YAHOO.widget.Menu to "false." + +* Switched the default value of the "constraintoviewport" configuration + property for YAHOO.widget.Menu to "true." + +* Overloaded the "submenu" configuration property for YAHOO.widget.MenuItem + so that it now can accept any of the following: + + * YAHOO.widget.Menu instance + * Object literal representation of a menu + * Element id + * Element reference + +* "hide" and "show" methods of statically positioned menus now toggle the their + element's "display" style property between "block" and "none." + + + +*** version 0.10.0 *** + +* Initial release + +* Known issues: + + * Some Firefox extensions disable the ability for JavaScript to prevent + the display of the browser's default context menu. These extensions + can cause the YUI ContextMenu to stop working. If you encounter this + problem, you can reset the context menu preference in Firefox back to + the default by making sure the "Disable or replace context menus" + preference is checked: + + Mac Firefox 1.0: + ------------------- + Preferences > Web Features > + Advanced... > Disable or replace context menus + + Mac Firefox 1.5 + ------------------- + Preferences > Context > + Advanced... > Disable or replace context menus + + Windows Firefox 1.0 + ------------------- + Tools > Options > Web Features > + Advanced... > Disable or replace context menus + + Windows Firefox 1.5 + ------------------- + Tools > Options > Context > + Advanced... > Disable or replace context menus + + + +*** version 0.11.3 *** + +Added the following features: +----------------------------- + +* Added a "target" configuration property to the MenuModuleItem object that + allows the user to specify the target of an item's anchor element. Items + that make use of the "target" configuration property will require the user + to click exactly on the item's anchor element to navigate to the specified + URL. + +* Items without a "url" property set will automatically hide their parent + menu instance(s) when clicked. + + +Fixed the following bugs: +------------------------- + +* Items in a submenu should now navigate to their specified URL when clicked. + +* Removed MenuBar's use of "overflow:hidden." This fixes an issue in Firefox + 1.5 in which submenus of a Menubar instance cannot overlay other absolutely + positioned elements on the page. + +* Submenus of a Menubar instance will now automatically have their iframe shim + enabled in IE<7. + +* Statically positioned Menubar and Menu instances will now render with the + correct position and dimensions in Safari. + +* MenuModuleItem's "focus" method now checks to make sure that an item's + "display" style property is not "none" before trying to set focus to its + anchor element. + +* A ContextMenu instance will now hide all other ContextMenu instances before + displaying itself. + +* Removed the dead space in front of an item's submenu indicator image in IE. + This space was causing an item's submenu to flicker when the user hovered + over it. + + +Changes: +-------- + +* Moved the DOM event handlers for every menu from the root DIV node of each + instance to the document object. This change reduces the number of DOM event + handlers used by Menu to eight, improving the cleanup time required by the + Event utility. + + + +*** version 0.11.0 *** + +Added the following features: +----------------------------- +* Overloaded the "addItem" and "insertItem" methods of MenuModule to accept a + string or a MenuModuleItem instance + +* Added the ability to define a MenuItem instance as being "checked" + + +Fixed the following bugs: +------------------------- +* Changing the path for the submenu indicator image of one MenuModuleItem + subclass will no longer affect other subclasses + +* MenuItem instances built from existing markup without anchor tags will no + longer trigger a JavaScript error when clicked + +* Modified the implementation of the "imageRoot" property for the + MenuModuleItem class so that it is set to a secure/non-secure path when the + object is instantiated + +* Menu instances now resize in response to changes to the browser's font size + +* Modified the propagation of the MenuModule class's "submenualignment" + configuration property so that it only applies to instances of the same type + +* Adjusted the specificity of the style rule that controls the position of a + MenuItem instance's submenu indicator image to prevent it from wrapping in IE + +* Specified a width and height for submenu indicator images in the Menu + stylesheet to ensure that Menu instances are always rendered at the correct + width + +* Clicking a MenuItem instance will no longer trigger two HTTP GET requests + +* Users can now control or shift-click on MenuItem links + + +Changes: +-------- +* In the Menu stylesheet (menu.css), switched from using "first" class to + "first-of-type" class + +* Changed case of MenuModuleItem class's "subMenuIndicator" property + to "submenuIndicator" \ No newline at end of file diff --git a/interface/ispconfig/interface/js/yui/menu/assets/map.gif b/interface/ispconfig/interface/js/yui/menu/assets/map.gif new file mode 100644 index 0000000000000000000000000000000000000000..715859aa8b7e006cce52c4533c659e0bc022b868 Binary files /dev/null and b/interface/ispconfig/interface/js/yui/menu/assets/map.gif differ diff --git a/interface/ispconfig/interface/js/yui/menu/assets/menu.css b/interface/ispconfig/interface/js/yui/menu/assets/menu.css new file mode 100644 index 0000000000000000000000000000000000000000..2fc2f63039eddff321294c2519102f6f03755b9f --- /dev/null +++ b/interface/ispconfig/interface/js/yui/menu/assets/menu.css @@ -0,0 +1,384 @@ +/* +Copyright (c) 2007, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.2.0 +*/ +/* Menu styles */ + +div.yuimenu { + + background-color:#f6f7ee; + border:solid 1px #c4c4be; + padding:1px; + +} + +/* Submenus are positioned absolute and hidden by default */ + +div.yuimenu div.yuimenu, +div.yuimenubar div.yuimenu { + + position:absolute; + visibility:hidden; + +} + +/* MenuBar Styles */ + +div.yuimenubar { + + background-color:#f6f7ee; + +} + +/* + Applying a width triggers "haslayout" in IE so that the module's + body clears its floated elements +*/ +div.yuimenubar div.bd { + + width:100%; + +} + +/* + Clear the module body for other browsers +*/ +div.yuimenubar div.bd:after { + + content:'.'; + display:block; + clear:both; + visibility:hidden; + height:0; + +} + +/* Matches the group title (H6) inside a Menu or MenuBar instance */ + +div.yuimenu h6, +div.yuimenubar h6 { + + font-size:100%; + font-weight:normal; + margin:0; + border:solid 1px #c4c4be; + color:#b9b9b9; + +} + +div.yuimenubar h6 { + + float:left; + display:inline; /* Prevent margin doubling in IE */ + padding:4px 12px; + border-width:0 1px 0 0; + +} + +div.yuimenu h6 { + + float:none; + display:block; + border-width:1px 0 0 0; + padding:5px 10px 0 10px; + +} + +/* Matches the UL inside a Menu or MenuBar instance */ + +div.yuimenubar ul { + + list-style-type:none; + margin:0; + padding:0; + +} + +div.yuimenu ul { + + list-style-type:none; + border:solid 1px #c4c4be; + border-width:1px 0 0 0; + margin:0; + padding:10px 0; + +} + +div.yuimenu ul.first-of-type, +div.yuimenu ul.hastitle, +div.yuimenu h6.first-of-type { + + border-width:0; + +} + +/* + Styles for the menu's header and footer elements that are used as controls + to scroll the menu's body element when the menu's height exceeds the + value of the "maxheight" configuration property. +*/ + +div.yuimenu div.topscrollbar, +div.yuimenu div.bottomscrollbar { + + height:16px; + background-image:url(map.gif); + background-repeat:no-repeat; + +} + + +div.yuimenu div.topscrollbar { + + background-image:url(map.gif); + background-position:center -72px; + +} + + +div.yuimenu div.topscrollbar_disabled { + + background-image:url(map.gif); + background-position:center -88px; + +} + + +div.yuimenu div.bottomscrollbar { + + background-image:url(map.gif); + background-position:center -104px; + +} + + +div.yuimenu div.bottomscrollbar_disabled { + + background-image:url(map.gif); + background-position:center -120px; + +} + + +/* MenuItem and MenuBarItem styles */ + +div.yuimenu li, +div.yuimenubar li { + + font-size:85%; + cursor:pointer; + cursor:hand; + white-space:nowrap; + text-align:left; + +} + +div.yuimenu li.yuimenuitem { + + padding:2px 24px; + +} + +div.yuimenu li li, +div.yuimenubar li li { + + font-size:100%; + +} + + +/* Matches the help text for a menu item */ + +div.yuimenu li.hashelptext em.helptext { + + font-style:normal; + margin:0 0 0 40px; + +} + +div.yuimenu li a, +div.yuimenubar li a { + + /* + "zoom:1" triggers "haslayout" in IE to ensure that the mouseover and + mouseout events bubble to the parent LI in IE. + */ + zoom:1; + color:#000; + text-decoration:none; + +} + +div.yuimenu li.hassubmenu, +div.yuimenu li.hashelptext { + + text-align:right; + +} + +div.yuimenu li.hassubmenu a.hassubmenu, +div.yuimenu li.hashelptext a.hashelptext { + + float:left; + display:inline; /* Prevent margin doubling in IE */ + text-align:left; + +} + + +/* Matches selected menu items */ + +div.yuimenu li.selected, +div.yuimenubar li.selected { + + background-color:#8c8ad0; + +} + +div.yuimenu li.selected a.selected, +div.yuimenubar li.selected a.selected { + + text-decoration:underline; + +} + +div.yuimenu li.selected a.selected, +div.yuimenu li.selected em.selected, +div.yuimenubar li.selected a.selected { + + color:#fff; + +} + + +/* Matches disabled menu items */ + +div.yuimenu li.disabled, +div.yuimenubar li.disabled { + + cursor:default; + +} + +div.yuimenu li.disabled a.disabled, +div.yuimenu li.disabled em.disabled, +div.yuimenubar li.disabled a.disabled { + + color:#b9b9b9; + cursor:default; + +} + +div.yuimenubar li.yuimenubaritem { + + float:left; + display:inline; /* Prevent margin doubling in IE */ + border-width:0 0 0 1px; + border-style:solid; + border-color:#c4c4be; + padding:4px 24px; + margin:0; + +} + +div.yuimenubar li.yuimenubaritem.first-of-type { + + border-width:0; + +} + + +/* Styles for the the submenu indicator for menu items */ + +div.yuimenu li.hassubmenu em.submenuindicator, +div.yuimenubar li.hassubmenu em.submenuindicator { + + display:-moz-inline-box; /* Mozilla */ + display:inline-block; /* IE, Opera and Safari */ + vertical-align:middle; + height:8px; + width:8px; + text-indent:9px; + font:0/0 arial; + overflow:hidden; + background-image:url(map.gif); + background-repeat:no-repeat; + +} + +div.yuimenubar li.hassubmenu em.submenuindicator { + + background-position:0 -24px; + margin:0 0 0 10px; + +} + +div.yuimenubar li.hassubmenu em.submenuindicator.selected { + + background-position:0 -32px; + +} + +div.yuimenubar li.hassubmenu em.submenuindicator.disabled { + + background-position:0 -40px; + +} + +div.yuimenu li.hassubmenu em.submenuindicator { + + background-position:0 0; + margin:0 -16px 0 10px; + +} + +div.yuimenu li.hassubmenu em.submenuindicator.selected { + + background-position:0 -8px; + +} + +div.yuimenu li.hassubmenu em.submenuindicator.disabled { + + background-position:0 -16px; + +} + + +/* Styles for a menu item's "checked" state */ + +div.yuimenu li.checked { + + position:relative; + +} + +div.yuimenu li.checked em.checkedindicator { + + height:8px; + width:8px; + text-indent:9px; + overflow:hidden; + background-image:url(map.gif); + background-position:0 -48px; + background-repeat:no-repeat; + position:absolute; + left:6px; + _left:-16px; /* Underscore hack b/c this is for IE 6 only */ + top:.5em; + +} + +div.yuimenu li.checked em.checkedindicator.selected { + + background-position:0 -56px; + +} + +div.yuimenu li.checked em.checkedindicator.disabled { + + background-position:0 -64px; + +} \ No newline at end of file diff --git a/interface/ispconfig/interface/js/yui/menu/assets/menuarodwn8_dim_1.gif b/interface/ispconfig/interface/js/yui/menu/assets/menuarodwn8_dim_1.gif new file mode 100644 index 0000000000000000000000000000000000000000..60b38365a203237a6cfd8b95002bbd0b4322fe99 Binary files /dev/null and b/interface/ispconfig/interface/js/yui/menu/assets/menuarodwn8_dim_1.gif differ diff --git a/interface/ispconfig/interface/js/yui/menu/assets/menuarodwn8_hov_1.gif b/interface/ispconfig/interface/js/yui/menu/assets/menuarodwn8_hov_1.gif new file mode 100644 index 0000000000000000000000000000000000000000..66632e83e2b62c42823147c76e3ae64f89d147ac Binary files /dev/null and b/interface/ispconfig/interface/js/yui/menu/assets/menuarodwn8_hov_1.gif differ diff --git a/interface/ispconfig/interface/js/yui/menu/assets/menuarodwn8_nrm_1.gif b/interface/ispconfig/interface/js/yui/menu/assets/menuarodwn8_nrm_1.gif new file mode 100644 index 0000000000000000000000000000000000000000..bf5d3f1d2de98f703b472b6b9d212e456e18ba8b Binary files /dev/null and b/interface/ispconfig/interface/js/yui/menu/assets/menuarodwn8_nrm_1.gif differ diff --git a/interface/ispconfig/interface/js/yui/menu/assets/menuarorght8_dim_1.gif b/interface/ispconfig/interface/js/yui/menu/assets/menuarorght8_dim_1.gif new file mode 100644 index 0000000000000000000000000000000000000000..0780b662115465ffcd5a5fc6f781dc6908b21a6a Binary files /dev/null and b/interface/ispconfig/interface/js/yui/menu/assets/menuarorght8_dim_1.gif differ diff --git a/interface/ispconfig/interface/js/yui/menu/assets/menuarorght8_hov_1.gif b/interface/ispconfig/interface/js/yui/menu/assets/menuarorght8_hov_1.gif new file mode 100644 index 0000000000000000000000000000000000000000..0d87f1a35587240de1e1f3528de894859cc5ba4a Binary files /dev/null and b/interface/ispconfig/interface/js/yui/menu/assets/menuarorght8_hov_1.gif differ diff --git a/interface/ispconfig/interface/js/yui/menu/assets/menuarorght8_nrm_1.gif b/interface/ispconfig/interface/js/yui/menu/assets/menuarorght8_nrm_1.gif new file mode 100644 index 0000000000000000000000000000000000000000..3cdc2a9d18fe9b4eb72e764869e64f37c777b906 Binary files /dev/null and b/interface/ispconfig/interface/js/yui/menu/assets/menuarorght8_nrm_1.gif differ diff --git a/interface/ispconfig/interface/js/yui/menu/assets/menuaroup8_dim_1.gif b/interface/ispconfig/interface/js/yui/menu/assets/menuaroup8_dim_1.gif new file mode 100644 index 0000000000000000000000000000000000000000..1acaeecf1447e32179a9027b4420527987a1dc5f Binary files /dev/null and b/interface/ispconfig/interface/js/yui/menu/assets/menuaroup8_dim_1.gif differ diff --git a/interface/ispconfig/interface/js/yui/menu/assets/menuaroup8_nrm_1.gif b/interface/ispconfig/interface/js/yui/menu/assets/menuaroup8_nrm_1.gif new file mode 100644 index 0000000000000000000000000000000000000000..ee44529ace0b46009fca271d0b0e9bb08fda07b5 Binary files /dev/null and b/interface/ispconfig/interface/js/yui/menu/assets/menuaroup8_nrm_1.gif differ diff --git a/interface/ispconfig/interface/js/yui/menu/assets/menuchk8_dim_1.gif b/interface/ispconfig/interface/js/yui/menu/assets/menuchk8_dim_1.gif new file mode 100644 index 0000000000000000000000000000000000000000..d282a6c06ac7f43aeafbcb8208765c9b508bb99b Binary files /dev/null and b/interface/ispconfig/interface/js/yui/menu/assets/menuchk8_dim_1.gif differ diff --git a/interface/ispconfig/interface/js/yui/menu/assets/menuchk8_hov_1.gif b/interface/ispconfig/interface/js/yui/menu/assets/menuchk8_hov_1.gif new file mode 100644 index 0000000000000000000000000000000000000000..2fabaef59b00950cd4f25dc9a9abee998eafc8ce Binary files /dev/null and b/interface/ispconfig/interface/js/yui/menu/assets/menuchk8_hov_1.gif differ diff --git a/interface/ispconfig/interface/js/yui/menu/assets/menuchk8_nrm_1.gif b/interface/ispconfig/interface/js/yui/menu/assets/menuchk8_nrm_1.gif new file mode 100644 index 0000000000000000000000000000000000000000..9732837a7755b6bee23b95f32eb998c487daa53c Binary files /dev/null and b/interface/ispconfig/interface/js/yui/menu/assets/menuchk8_nrm_1.gif differ diff --git a/interface/ispconfig/interface/js/yui/menu/menu-debug.js b/interface/ispconfig/interface/js/yui/menu/menu-debug.js new file mode 100644 index 0000000000000000000000000000000000000000..58cc2831184bd80828fd7d0c8e2774e02e398c9e --- /dev/null +++ b/interface/ispconfig/interface/js/yui/menu/menu-debug.js @@ -0,0 +1,8317 @@ +/* +Copyright (c) 2007, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.2.0 +*/ + + +/** +* @module menu +* @description

    The Menu family of components features a collection of +* controls that make it easy to add menus to your website or web application. +* With the Menu Controls you can create website fly-out menus, customized +* context menus, or application-style menu bars with just a small amount of +* scripting.

    The Menu family of controls features:

    +*
      +*
    • Screen-reader accessibility.
    • +*
    • Keyboard and mouse navigation.
    • +*
    • A rich event model that provides access to all of a menu's +* interesting moments.
    • +*
    • Support for +* Progressive +* Enhancement; Menus can be created from simple, +* semantic markup on the page or purely through JavaScript.
    • +*
    +* @title Menu +* @namespace YAHOO.widget +* @requires Event, Dom, Container +*/ +(function() { + +var Dom = YAHOO.util.Dom, + Event = YAHOO.util.Event; + +/** +* Singleton that manages a collection of all menus and menu items. Listens for +* DOM events at the document level and dispatches the events to the +* corresponding menu or menu item. +* +* @namespace YAHOO.widget +* @class MenuManager +* @static +*/ +YAHOO.widget.MenuManager = function() { + + // Private member variables + + + // Flag indicating if the DOM event handlers have been attached + + var m_bInitializedEventHandlers = false, + + + // Collection of menus + + m_oMenus = {}, + + + // Collection of menu items + + m_oItems = {}, + + + // Collection of visible menus + + m_oVisibleMenus = {}, + + me = this; + + + var m_oLogger = new YAHOO.widget.LogWriter(this.toString()); + + + // Private methods + + + /** + * @method addItem + * @description Adds an item to the collection of known menu items. + * @private + * @param {YAHOO.widget.MenuItem} p_oItem Object specifying the MenuItem + * instance to be added. + */ + function addItem(p_oItem) { + + var sId = p_oItem.id; + + if(p_oItem && m_oItems[sId] != p_oItem) { + + m_oItems[sId] = p_oItem; + + p_oItem.destroyEvent.subscribe(onItemDestroy, p_oItem); + + m_oLogger.log("Item: " + + p_oItem.toString() + " successfully registered."); + + } + + } + + + /** + * @method removeItem + * @description Removes an item from the collection of known menu items. + * @private + * @param {YAHOO.widget.MenuItem} p_oItem Object specifying the MenuItem + * instance to be removed. + */ + function removeItem(p_oItem) { + + var sId = p_oItem.id; + + if(sId && m_oItems[sId]) { + + delete m_oItems[sId]; + + m_oLogger.log("Item: " + + p_oItem.toString() + " successfully unregistered."); + + } + + } + + + /** + * @method getMenuRootElement + * @description Finds the root DIV node of a menu or the root LI node of a + * menu item. + * @private + * @param {HTMLElement} p_oElement Object specifying + * an HTML element. + */ + function getMenuRootElement(p_oElement) { + + var oParentNode; + + if(p_oElement && p_oElement.tagName) { + + switch(p_oElement.tagName.toUpperCase()) { + + case "DIV": + + oParentNode = p_oElement.parentNode; + + // Check if the DIV is the inner "body" node of a menu + + if( + ( + Dom.hasClass(p_oElement, "hd") || + Dom.hasClass(p_oElement, "bd") || + Dom.hasClass(p_oElement, "ft") + ) + && + oParentNode && + oParentNode.tagName && + oParentNode.tagName.toUpperCase() == "DIV" + ) { + + return oParentNode; + + } + else { + + return p_oElement; + + } + + break; + + case "LI": + + return p_oElement; + + default: + + oParentNode = p_oElement.parentNode; + + if(oParentNode) { + + return getMenuRootElement(oParentNode); + + } + + break; + + } + + } + + } + + + + // Private event handlers + + + /** + * @method onDOMEvent + * @description Generic, global event handler for all of a menu's DOM-based + * events. This listens for events against the document object. If the + * target of a given event is a member of a menu or menu item's DOM, the + * instance's corresponding Custom Event is fired. + * @private + * @param {Event} p_oEvent Object representing the DOM event object passed + * back by the event utility (YAHOO.util.Event). + */ + function onDOMEvent(p_oEvent) { + + // Get the target node of the DOM event + + var oTarget = Event.getTarget(p_oEvent), + + + // See if the target of the event was a menu, or a menu item + + oElement = getMenuRootElement(oTarget), + oMenuItem, + oMenu; + + + if(oElement) { + + var sTagName = oElement.tagName.toUpperCase(); + + if(sTagName == "LI") { + + var sId = oElement.id; + + if(sId && m_oItems[sId]) { + + oMenuItem = m_oItems[sId]; + oMenu = oMenuItem.parent; + + } + + } + else if(sTagName == "DIV") { + + if(oElement.id) { + + oMenu = m_oMenus[oElement.id]; + + } + + } + + } + + if(oMenu) { + + // Map of DOM event names to CustomEvent names + + var oEventTypes = { + "click": "clickEvent", + "mousedown": "mouseDownEvent", + "mouseup": "mouseUpEvent", + "mouseover": "mouseOverEvent", + "mouseout": "mouseOutEvent", + "keydown": "keyDownEvent", + "keyup": "keyUpEvent", + "keypress": "keyPressEvent" + }, + + sCustomEventType = oEventTypes[p_oEvent.type]; + + + // Fire the Custom Even that corresponds the current DOM event + + if(oMenuItem && !oMenuItem.cfg.getProperty("disabled")) { + + oMenuItem[sCustomEventType].fire(p_oEvent); + + } + + oMenu[sCustomEventType].fire(p_oEvent, oMenuItem); + + } + else if(p_oEvent.type == "mousedown") { + + + /* + If the target of the event wasn't a menu, hide all + dynamically positioned menus + */ + + var oActiveItem; + + for(var i in m_oMenus) { + + if(m_oMenus.hasOwnProperty(i)) { + + oMenu = m_oMenus[i]; + + if( + oMenu.cfg.getProperty("clicktohide") && + oMenu.cfg.getProperty("position") == "dynamic" + ) { + + oMenu.hide(); + + } + else { + + oMenu.clearActiveItem(true); + + } + + } + + } + + } + + } + + + /** + * @method onMenuDestroy + * @description "destroy" event handler for a menu. + * @private + * @param {String} p_sType String representing the name of the event that + * was fired. + * @param {Array} p_aArgs Array of arguments sent when the event was fired. + * @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that + * fired the event. + */ + function onMenuDestroy(p_sType, p_aArgs, p_oMenu) { + + if(p_oMenu && m_oMenus[p_oMenu.id]) { + + delete m_oMenus[p_oMenu.id]; + + m_oLogger.log("Menu: " + + p_oMenu.toString() + " successfully unregistered."); + + } + + } + + + /** + * @method onItemDestroy + * @description "destroy" event handler for a MenuItem instance. + * @private + * @param {String} p_sType String representing the name of the event that + * was fired. + * @param {Array} p_aArgs Array of arguments sent when the event was fired. + * @param {YAHOO.widget.MenuItem} p_oItem Object representing the menu item + * that fired the event. + */ + function onItemDestroy(p_sType, p_aArgs, p_oItem) { + + var sId = p_oItem.id; + + if(sId && m_oItems[sId]) { + + delete m_oItems[sId]; + + } + + } + + + /** + * @method onMenuVisibleConfigChange + * @description Event handler for when the "visible" configuration property + * of a Menu instance changes. + * @private + * @param {String} p_sType String representing the name of the event that + * was fired. + * @param {Array} p_aArgs Array of arguments sent when the event was fired. + * @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that + * fired the event. + */ + function onMenuVisibleConfigChange(p_sType, p_aArgs, p_oMenu) { + + var bVisible = p_aArgs[0]; + + if(bVisible) { + + m_oVisibleMenus[p_oMenu.id] = p_oMenu; + + m_oLogger.log("Menu: " + + p_oMenu.toString() + + " registered with the collection of visible menus."); + + } + else if(m_oVisibleMenus[p_oMenu.id]) { + + delete m_oVisibleMenus[p_oMenu.id]; + + m_oLogger.log("Menu: " + + p_oMenu.toString() + + " unregistered from the collection of visible menus."); + + } + + } + + + /** + * @method onItemAdded + * @description "itemadded" event handler for a Menu instance. + * @private + * @param {String} p_sType String representing the name of the event that + * was fired. + * @param {Array} p_aArgs Array of arguments sent when the event was fired. + */ + function onItemAdded(p_sType, p_aArgs) { + + addItem(p_aArgs[0]); + + } + + + /** + * @method onItemRemoved + * @description "itemremoved" event handler for a Menu instance. + * @private + * @param {String} p_sType String representing the name of the event that + * was fired. + * @param {Array} p_aArgs Array of arguments sent when the event was fired. + */ + function onItemRemoved(p_sType, p_aArgs) { + + removeItem(p_aArgs[0]); + + } + + + + return { + + // Privileged methods + + + /** + * @method addMenu + * @description Adds a menu to the collection of known menus. + * @param {YAHOO.widget.Menu} p_oMenu Object specifying the Menu + * instance to be added. + */ + addMenu: function(p_oMenu) { + + if(p_oMenu && p_oMenu.id && !m_oMenus[p_oMenu.id]) { + + m_oMenus[p_oMenu.id] = p_oMenu; + + + if(!m_bInitializedEventHandlers) { + + var oDoc = document; + + Event.addListener(oDoc, "mouseover", onDOMEvent, me, true); + Event.addListener(oDoc, "mouseout", onDOMEvent, me, true); + Event.addListener(oDoc, "mousedown", onDOMEvent, me, true); + Event.addListener(oDoc, "mouseup", onDOMEvent, me, true); + Event.addListener(oDoc, "click", onDOMEvent, me, true); + Event.addListener(oDoc, "keydown", onDOMEvent, me, true); + Event.addListener(oDoc, "keyup", onDOMEvent, me, true); + Event.addListener(oDoc, "keypress", onDOMEvent, me, true); + + m_bInitializedEventHandlers = true; + + m_oLogger.log("DOM event handlers initialized."); + + } + + p_oMenu.destroyEvent.subscribe(onMenuDestroy, p_oMenu, me); + + p_oMenu.cfg.subscribeToConfigEvent( + "visible", + onMenuVisibleConfigChange, + p_oMenu + ); + + p_oMenu.itemAddedEvent.subscribe(onItemAdded); + p_oMenu.itemRemovedEvent.subscribe(onItemRemoved); + + m_oLogger.log("Menu: " + + p_oMenu.toString() + " successfully registered."); + + } + + }, + + + /** + * @method removeMenu + * @description Removes a menu from the collection of known menus. + * @param {YAHOO.widget.Menu} p_oMenu Object specifying the Menu + * instance to be removed. + */ + removeMenu: function(p_oMenu) { + + if(p_oMenu && m_oMenus[p_oMenu.id]) { + + delete m_oMenus[p_oMenu.id]; + + m_oLogger.log("Menu: " + + p_oMenu.toString() + " successfully unregistered."); + + } + + }, + + + /** + * @method hideVisible + * @description Hides all visible, dynamically positioned menus. + */ + hideVisible: function() { + + var oMenu; + + for(var i in m_oVisibleMenus) { + + if(m_oVisibleMenus.hasOwnProperty(i)) { + + oMenu = m_oVisibleMenus[i]; + + if(oMenu.cfg.getProperty("position") == "dynamic") { + + oMenu.hide(); + + } + + } + + } + + }, + + + /** + * @method getMenus + * @description Returns an array of all menus registered with the + * menu manger. + * @return {Array} + */ + getMenus: function() { + + return m_oMenus; + + }, + + + /** + * @method getMenu + * @description Returns a menu with the specified id. + * @param {String} p_sId String specifying the id of the menu to + * be retrieved. + * @return {YAHOO.widget.Menu} + */ + getMenu: function(p_sId) { + + if(m_oMenus[p_sId]) { + + return m_oMenus[p_sId]; + + } + + }, + + + /** + * @method toString + * @description Returns a string representing the menu manager. + * @return {String} + */ + toString: function() { + + return ("MenuManager"); + + } + + }; + +}(); + +})(); + + + +/** +* The Menu class creates a container that holds a vertical list representing +* a set of options or commands. Menu is the base class for all +* menu containers. +* @param {String} p_oElement String specifying the id attribute of the +* <div> element of the menu. +* @param {String} p_oElement String specifying the id attribute of the +* <select> element to be used as the data source +* for the menu. +* @param {HTMLDivElement} p_oElement Object +* specifying the <div> element of the menu. +* @param {HTMLSelectElement} p_oElement +* Object specifying the <select> element to be used as +* the data source for the menu. +* @param {Object} p_oConfig Optional. Object literal specifying the +* configuration for the menu. See configuration class documentation for +* more details. +* @namespace YAHOO.widget +* @class Menu +* @constructor +* @extends YAHOO.widget.Overlay +*/ +(function() { + +var Dom = YAHOO.util.Dom, + Event = YAHOO.util.Event, + Lang = YAHOO.lang; + + +YAHOO.widget.Menu = function(p_oElement, p_oConfig) { + + if(p_oConfig) { + + this.parent = p_oConfig.parent; + this.lazyLoad = p_oConfig.lazyLoad || p_oConfig.lazyload; + this.itemData = p_oConfig.itemData || p_oConfig.itemdata; + + } + + + YAHOO.widget.Menu.superclass.constructor.call( + this, + p_oElement, + p_oConfig + ); + +}; + + +YAHOO.lang.extend(YAHOO.widget.Menu, YAHOO.widget.Overlay, { + + +// Constants + + +/** +* @property CSS_CLASS_NAME +* @description String representing the CSS class(es) to be applied to the +* menu's <div> element. +* @default "yuimenu" +* @final +* @type String +*/ +CSS_CLASS_NAME: "yuimenu", + + +/** +* @property ITEM_TYPE +* @description Object representing the type of menu item to instantiate and +* add when parsing the child nodes (either <li> element, +* <optgroup> element or <option>) +* of the menu's source HTML element. +* @default YAHOO.widget.MenuItem +* @final +* @type YAHOO.widget.MenuItem +*/ +ITEM_TYPE: null, + + +/** +* @property GROUP_TITLE_TAG_NAME +* @description String representing the tagname of the HTML element used to +* title the menu's item groups. +* @default H6 +* @final +* @type String +*/ +GROUP_TITLE_TAG_NAME: "h6", + + + +// Private properties + + +/** +* @property _nHideDelayId +* @description Number representing the time-out setting used to cancel the +* hiding of a menu. +* @default null +* @private +* @type Number +*/ +_nHideDelayId: null, + + +/** +* @property _nShowDelayId +* @description Number representing the time-out setting used to cancel the +* showing of a menu. +* @default null +* @private +* @type Number +*/ +_nShowDelayId: null, + + +/** +* @property _nSubmenuHideDelayId +* @description Number representing the time-out setting used to cancel the +* hiding of a submenu. +* @default null +* @private +* @type Number +*/ +_nSubmenuHideDelayId: null, + + +/** +* @property _nBodyScrollId +* @description Number representing the time-out setting used to cancel the +* scrolling of the menu's body element. +* @default null +* @private +* @type Number +*/ +_nBodyScrollId: null, + + +/** +* @property _bHideDelayEventHandlersAssigned +* @description Boolean indicating if the "mouseover" and "mouseout" event +* handlers used for hiding the menu via a call to "window.setTimeout" have +* already been assigned. +* @default false +* @private +* @type Boolean +*/ +_bHideDelayEventHandlersAssigned: false, + + +/** +* @property _bHandledMouseOverEvent +* @description Boolean indicating the current state of the menu's +* "mouseover" event. +* @default false +* @private +* @type Boolean +*/ +_bHandledMouseOverEvent: false, + + +/** +* @property _bHandledMouseOutEvent +* @description Boolean indicating the current state of the menu's +* "mouseout" event. +* @default false +* @private +* @type Boolean +*/ +_bHandledMouseOutEvent: false, + + +/** +* @property _aGroupTitleElements +* @description Array of HTML element used to title groups of menu items. +* @default [] +* @private +* @type Array +*/ +_aGroupTitleElements: null, + + +/** +* @property _aItemGroups +* @description Multi-dimensional Array representing the menu items as they +* are grouped in the menu. +* @default [] +* @private +* @type Array +*/ +_aItemGroups: null, + + +/** +* @property _aListElements +* @description Array of <ul> elements, each of which is +* the parent node for each item's <li> element. +* @default [] +* @private +* @type Array +*/ +_aListElements: null, + + +/** +* @property _nCurrentMouseX +* @description The current x coordinate of the mouse inside the area of +* the menu. +* @default 0 +* @private +* @type Number +*/ +_nCurrentMouseX: 0, + + +/** +* @property _nMaxHeight +* @description The original value of the "maxheight" configuration property +* as set by the user. +* @default -1 +* @private +* @type Number +*/ +_nMaxHeight: -1, + + +/** +* @property _bStopMouseEventHandlers +* @description Stops "mouseover," "mouseout," and "mousemove" event handlers +* from executing. +* @default false +* @private +* @type Boolean +*/ +_bStopMouseEventHandlers: false, + + +/** +* @property _sClassName +* @description The current value of the "classname" configuration attribute. +* @default null +* @private +* @type String +*/ +_sClassName: null, + + + +// Public properties + + +/** +* @property lazyLoad +* @description Boolean indicating if the menu's "lazy load" feature is +* enabled. If set to "true," initialization and rendering of the menu's +* items will be deferred until the first time it is made visible. This +* property should be set via the constructor using the configuration +* object literal. +* @default false +* @type Boolean +*/ +lazyLoad: false, + + +/** +* @property itemData +* @description Array of items to be added to the menu. The array can contain +* strings representing the text for each item to be created, object literals +* representing the menu item configuration properties, or MenuItem instances. +* This property should be set via the constructor using the configuration +* object literal. +* @default null +* @type Array +*/ +itemData: null, + + +/** +* @property activeItem +* @description Object reference to the item in the menu that has focus. +* @default null +* @type YAHOO.widget.MenuItem +*/ +activeItem: null, + + +/** +* @property parent +* @description Object reference to the menu's parent menu or menu item. +* This property can be set via the constructor using the configuration +* object literal. +* @default null +* @type YAHOO.widget.MenuItem +*/ +parent: null, + + +/** +* @property srcElement +* @description Object reference to the HTML element (either +* <select> or <div>) used to +* create the menu. +* @default null +* @type HTMLSelectElement|HTMLDivElement +*/ +srcElement: null, + + + +// Events + + +/** +* @event mouseOverEvent +* @description Fires when the mouse has entered the menu. Passes back +* the DOM Event object as an argument. +*/ +mouseOverEvent: null, + + +/** +* @event mouseOutEvent +* @description Fires when the mouse has left the menu. Passes back the DOM +* Event object as an argument. +* @type YAHOO.util.CustomEvent +*/ +mouseOutEvent: null, + + +/** +* @event mouseDownEvent +* @description Fires when the user mouses down on the menu. Passes back the +* DOM Event object as an argument. +* @type YAHOO.util.CustomEvent +*/ +mouseDownEvent: null, + + +/** +* @event mouseUpEvent +* @description Fires when the user releases a mouse button while the mouse is +* over the menu. Passes back the DOM Event object as an argument. +* @type YAHOO.util.CustomEvent +*/ +mouseUpEvent: null, + + +/** +* @event clickEvent +* @description Fires when the user clicks the on the menu. Passes back the +* DOM Event object as an argument. +* @type YAHOO.util.CustomEvent +*/ +clickEvent: null, + + +/** +* @event keyPressEvent +* @description Fires when the user presses an alphanumeric key when one of the +* menu's items has focus. Passes back the DOM Event object as an argument. +* @type YAHOO.util.CustomEvent +*/ +keyPressEvent: null, + + +/** +* @event keyDownEvent +* @description Fires when the user presses a key when one of the menu's items +* has focus. Passes back the DOM Event object as an argument. +* @type YAHOO.util.CustomEvent +*/ +keyDownEvent: null, + + +/** +* @event keyUpEvent +* @description Fires when the user releases a key when one of the menu's items +* has focus. Passes back the DOM Event object as an argument. +* @type YAHOO.util.CustomEvent +*/ +keyUpEvent: null, + + +/** +* @event itemAddedEvent +* @description Fires when an item is added to the menu. +* @type YAHOO.util.CustomEvent +*/ +itemAddedEvent: null, + + +/** +* @event itemRemovedEvent +* @description Fires when an item is removed to the menu. +* @type YAHOO.util.CustomEvent +*/ +itemRemovedEvent: null, + + +/** +* @method init +* @description The Menu class's initialization method. This method is +* automatically called by the constructor, and sets up all DOM references +* for pre-existing markup, and creates required markup if it is not +* already present. +* @param {String} p_oElement String specifying the id attribute of the +* <div> element of the menu. +* @param {String} p_oElement String specifying the id attribute of the +* <select> element to be used as the data source +* for the menu. +* @param {HTMLDivElement} p_oElement Object +* specifying the <div> element of the menu. +* @param {HTMLSelectElement} p_oElement +* Object specifying the <select> element to be used as +* the data source for the menu. +* @param {Object} p_oConfig Optional. Object literal specifying the +* configuration for the menu. See configuration class documentation for +* more details. +*/ +init: function(p_oElement, p_oConfig) { + + this._aItemGroups = []; + this._aListElements = []; + this._aGroupTitleElements = []; + + + if(!this.ITEM_TYPE) { + + this.ITEM_TYPE = YAHOO.widget.MenuItem; + + } + + + var oElement; + + if(typeof p_oElement == "string") { + + oElement = document.getElementById(p_oElement); + + } + else if(p_oElement.tagName) { + + oElement = p_oElement; + + } + + + if(oElement && oElement.tagName) { + + switch(oElement.tagName.toUpperCase()) { + + case "DIV": + + this.srcElement = oElement; + + if(!oElement.id) { + + oElement.setAttribute("id", Dom.generateId()); + + } + + + /* + Note: we don't pass the user config in here yet + because we only want it executed once, at the lowest + subclass level. + */ + + YAHOO.widget.Menu.superclass.init.call(this, oElement); + + this.beforeInitEvent.fire(YAHOO.widget.Menu); + + this.logger = new YAHOO.widget.LogWriter(this.toString()); + + this.logger.log("Source element: " + this.srcElement.tagName); + + break; + + case "SELECT": + + this.srcElement = oElement; + + + /* + The source element is not something that we can use + outright, so we need to create a new Overlay + + Note: we don't pass the user config in here yet + because we only want it executed once, at the lowest + subclass level. + */ + + YAHOO.widget.Menu.superclass.init.call(this, Dom.generateId()); + + this.beforeInitEvent.fire(YAHOO.widget.Menu); + + this.logger = new YAHOO.widget.LogWriter(this.toString()); + + this.logger.log("Source element: " + this.srcElement.tagName); + + break; + + } + + } + else { + + /* + Note: we don't pass the user config in here yet + because we only want it executed once, at the lowest + subclass level. + */ + + YAHOO.widget.Menu.superclass.init.call(this, p_oElement); + + this.beforeInitEvent.fire(YAHOO.widget.Menu); + + this.logger = new YAHOO.widget.LogWriter(this.toString()); + + this.logger.log("No source element found. " + + "Created element with id: " + this.id); + + } + + + if(this.element) { + + var oEl = this.element; + + Dom.addClass(oEl, this.CSS_CLASS_NAME); + + + // Subscribe to Custom Events + + this.initEvent.subscribe(this._onInit, this, true); + this.beforeRenderEvent.subscribe(this._onBeforeRender, this, true); + this.renderEvent.subscribe(this._setWidth, this, true); + this.beforeShowEvent.subscribe(this._onBeforeShow, this, true); + this.showEvent.subscribe(this._onShow, this, true); + this.beforeHideEvent.subscribe(this._onBeforeHide, this, true); + this.hideEvent.subscribe(this._onHide, this, true); + this.mouseOverEvent.subscribe(this._onMouseOver, this, true); + this.mouseOutEvent.subscribe(this._onMouseOut, this, true); + this.clickEvent.subscribe(this._onClick, this, true); + this.keyDownEvent.subscribe(this._onKeyDown, this, true); + this.keyPressEvent.subscribe(this._onKeyPress, this, true); + + YAHOO.widget.Module.textResizeEvent.subscribe( + this._onTextResize, + this, + true + ); + + + if(p_oConfig) { + + this.cfg.applyConfig(p_oConfig, true); + + } + + + // Register the Menu instance with the MenuManager + + YAHOO.widget.MenuManager.addMenu(this); + + + this.initEvent.fire(YAHOO.widget.Menu); + + } + +}, + + + +// Private methods + + +/** +* @method _initSubTree +* @description Iterates the childNodes of the source element to find nodes +* used to instantiate menu and menu items. +* @private +*/ +_initSubTree: function() { + + var oNode; + + if(this.srcElement.tagName.toUpperCase() == "DIV") { + + /* + Populate the collection of item groups and item + group titles + */ + + oNode = this.body.firstChild; + + var nGroup = 0, + sGroupTitleTagName = this.GROUP_TITLE_TAG_NAME.toUpperCase(); + + do { + + if(oNode && oNode.tagName) { + + switch(oNode.tagName.toUpperCase()) { + + case sGroupTitleTagName: + + this._aGroupTitleElements[nGroup] = oNode; + + break; + + case "UL": + + this._aListElements[nGroup] = oNode; + this._aItemGroups[nGroup] = []; + nGroup++; + + break; + + } + + } + + } + while((oNode = oNode.nextSibling)); + + + /* + Apply the "first-of-type" class to the first UL to mimic + the "first-of-type" CSS3 psuedo class. + */ + + if(this._aListElements[0]) { + + Dom.addClass(this._aListElements[0], "first-of-type"); + + } + + } + + + oNode = null; + + this.logger.log("Searching DOM for items to initialize."); + + if(this.srcElement.tagName) { + + var sSrcElementTagName = this.srcElement.tagName.toUpperCase(); + + + switch(sSrcElementTagName) { + + case "DIV": + + if(this._aListElements.length > 0) { + + this.logger.log("Found " + + this._aListElements.length + + " item groups to initialize."); + + var i = this._aListElements.length - 1; + + do { + + oNode = this._aListElements[i].firstChild; + + this.logger.log("Scanning " + + this._aListElements[i].childNodes.length + + " child nodes for items to initialize."); + + do { + + if( + oNode && + oNode.tagName && + oNode.tagName.toUpperCase() == "LI" + ) { + + this.logger.log("Initializing " + + oNode.tagName + " node."); + + this.addItem( + new this.ITEM_TYPE( + oNode, + { parent: this } + ), + i + ); + + } + + } + while((oNode = oNode.nextSibling)); + + } + while(i--); + + } + + break; + + case "SELECT": + + this.logger.log("Scanning " + + this.srcElement.childNodes.length + + " child nodes for items to initialize."); + + oNode = this.srcElement.firstChild; + + do { + + if(oNode && oNode.tagName) { + + switch(oNode.tagName.toUpperCase()) { + + case "OPTGROUP": + case "OPTION": + + this.logger.log("Initializing " + + oNode.tagName + " node."); + + this.addItem( + new this.ITEM_TYPE( + oNode, + { parent: this } + ) + ); + + break; + + } + + } + + } + while((oNode = oNode.nextSibling)); + + break; + + } + + } + +}, + + +/** +* @method _getFirstEnabledItem +* @description Returns the first enabled item in the menu. +* @return {YAHOO.widget.MenuItem} +* @private +*/ +_getFirstEnabledItem: function() { + + var aItems = this.getItems(), + nItems = aItems.length, + oItem; + + for(var i=0; i= aGroup.length); + + + if(aGroup[p_nItemIndex]) { + + aGroup.splice(p_nItemIndex, 0, oItem); + + } + else { + + aGroup[p_nItemIndex] = oItem; + + } + + + oGroupItem = aGroup[p_nItemIndex]; + + if(oGroupItem) { + + if( + bAppend && + ( + !oGroupItem.element.parentNode || + oGroupItem.element.parentNode.nodeType == 11 + ) + ) { + + this._aListElements[nGroupIndex].appendChild( + oGroupItem.element + ); + + } + else { + + function getNextItemSibling(p_aArray, p_nStartIndex) { + + return ( + p_aArray[p_nStartIndex] || + getNextItemSibling( + p_aArray, + (p_nStartIndex+1) + ) + ); + + } + + + var oNextItemSibling = + getNextItemSibling(aGroup, (p_nItemIndex+1)); + + if( + oNextItemSibling && + ( + !oGroupItem.element.parentNode || + oGroupItem.element.parentNode.nodeType == 11 + ) + ) { + + this._aListElements[nGroupIndex].insertBefore( + oGroupItem.element, + oNextItemSibling.element + ); + + } + + } + + + oGroupItem.parent = this; + + this._subscribeToItemEvents(oGroupItem); + + this._configureSubmenu(oGroupItem); + + this._updateItemProperties(nGroupIndex); + + this.logger.log("Item inserted." + + " Text: " + oGroupItem.cfg.getProperty("text") + ", " + + " Index: " + oGroupItem.index + ", " + + " Group Index: " + oGroupItem.groupIndex); + + this.itemAddedEvent.fire(oGroupItem); + + return oGroupItem; + + } + + } + else { + + var nItemIndex = aGroup.length; + + aGroup[nItemIndex] = oItem; + + oGroupItem = aGroup[nItemIndex]; + + + if(oGroupItem) { + + if( + !Dom.isAncestor( + this._aListElements[nGroupIndex], + oGroupItem.element + ) + ) { + + this._aListElements[nGroupIndex].appendChild( + oGroupItem.element + ); + + } + + oGroupItem.element.setAttribute("groupindex", nGroupIndex); + oGroupItem.element.setAttribute("index", nItemIndex); + + oGroupItem.parent = this; + + oGroupItem.index = nItemIndex; + oGroupItem.groupIndex = nGroupIndex; + + this._subscribeToItemEvents(oGroupItem); + + this._configureSubmenu(oGroupItem); + + if(nItemIndex === 0) { + + Dom.addClass(oGroupItem.element, "first-of-type"); + + } + + this.logger.log("Item added." + + " Text: " + oGroupItem.cfg.getProperty("text") + ", " + + " Index: " + oGroupItem.index + ", " + + " Group Index: " + oGroupItem.groupIndex); + + + this.itemAddedEvent.fire(oGroupItem); + + return oGroupItem; + + } + + } + + } + +}, + + +/** +* @method _removeItemFromGroupByIndex +* @description Removes a menu item from a group by index. Returns the menu +* item that was removed. +* @private +* @param {Number} p_nGroupIndex Number indicating the group to which the menu +* item belongs. +* @param {Number} p_nItemIndex Number indicating the index of the menu item +* to be removed. +* @return {YAHOO.widget.MenuItem} +*/ +_removeItemFromGroupByIndex: function(p_nGroupIndex, p_nItemIndex) { + + var nGroupIndex = typeof p_nGroupIndex == "number" ? p_nGroupIndex : 0, + aGroup = this._getItemGroup(nGroupIndex); + + if(aGroup) { + + var aArray = aGroup.splice(p_nItemIndex, 1), + oItem = aArray[0]; + + if(oItem) { + + // Update the index and className properties of each member + + this._updateItemProperties(nGroupIndex); + + if(aGroup.length === 0) { + + // Remove the UL + + var oUL = this._aListElements[nGroupIndex]; + + if(this.body && oUL) { + + this.body.removeChild(oUL); + + } + + // Remove the group from the array of items + + this._aItemGroups.splice(nGroupIndex, 1); + + + // Remove the UL from the array of ULs + + this._aListElements.splice(nGroupIndex, 1); + + + /* + Assign the "first-of-type" class to the new first UL + in the collection + */ + + oUL = this._aListElements[0]; + + if(oUL) { + + Dom.addClass(oUL, "first-of-type"); + + } + + } + + + this.itemRemovedEvent.fire(oItem); + + + // Return a reference to the item that was removed + + return oItem; + + } + + } + +}, + + +/** +* @method _removeItemFromGroupByValue +* @description Removes a menu item from a group by reference. Returns the +* menu item that was removed. +* @private +* @param {Number} p_nGroupIndex Number indicating the group to which the +* menu item belongs. +* @param {YAHOO.widget.MenuItem} p_oItem Object reference for the MenuItem +* instance to be removed. +* @return {YAHOO.widget.MenuItem} +*/ +_removeItemFromGroupByValue: function(p_nGroupIndex, p_oItem) { + + var aGroup = this._getItemGroup(p_nGroupIndex); + + if(aGroup) { + + var nItems = aGroup.length, + nItemIndex = -1; + + if(nItems > 0) { + + var i = nItems-1; + + do { + + if(aGroup[i] == p_oItem) { + + nItemIndex = i; + break; + + } + + } + while(i--); + + if(nItemIndex > -1) { + + return this._removeItemFromGroupByIndex( + p_nGroupIndex, + nItemIndex + ); + + } + + } + + } + +}, + + +/** +* @method _updateItemProperties +* @description Updates the "index," "groupindex," and "className" properties +* of the menu items in the specified group. +* @private +* @param {Number} p_nGroupIndex Number indicating the group of items to update. +*/ +_updateItemProperties: function(p_nGroupIndex) { + + var aGroup = this._getItemGroup(p_nGroupIndex), + nItems = aGroup.length; + + if(nItems > 0) { + + var i = nItems - 1, + oItem, + oLI; + + // Update the index and className properties of each member + + do { + + oItem = aGroup[i]; + + if(oItem) { + + oLI = oItem.element; + + oItem.index = i; + oItem.groupIndex = p_nGroupIndex; + + oLI.setAttribute("groupindex", p_nGroupIndex); + oLI.setAttribute("index", i); + + Dom.removeClass(oLI, "first-of-type"); + + } + + } + while(i--); + + + if(oLI) { + + Dom.addClass(oLI, "first-of-type"); + + } + + } + +}, + + +/** +* @method _createItemGroup +* @description Creates a new menu item group (array) and its associated +* <ul> element. Returns an aray of menu item groups. +* @private +* @param {Number} p_nIndex Number indicating the group to create. +* @return {Array} +*/ +_createItemGroup: function(p_nIndex) { + + if(!this._aItemGroups[p_nIndex]) { + + this._aItemGroups[p_nIndex] = []; + + var oUL = document.createElement("ul"); + + this._aListElements[p_nIndex] = oUL; + + return this._aItemGroups[p_nIndex]; + + } + +}, + + +/** +* @method _getItemGroup +* @description Returns the menu item group at the specified index. +* @private +* @param {Number} p_nIndex Number indicating the index of the menu item group +* to be retrieved. +* @return {Array} +*/ +_getItemGroup: function(p_nIndex) { + + var nIndex = ((typeof p_nIndex == "number") ? p_nIndex : 0); + + return this._aItemGroups[nIndex]; + +}, + + +/** +* @method _configureSubmenu +* @description Subscribes the menu item's submenu to its parent menu's events. +* @private +* @param {YAHOO.widget.MenuItem} p_oItem Object reference for the MenuItem +* instance with the submenu to be configured. +*/ +_configureSubmenu: function(p_oItem) { + + var oSubmenu = p_oItem.cfg.getProperty("submenu"); + + if(oSubmenu) { + + /* + Listen for configuration changes to the parent menu + so they they can be applied to the submenu. + */ + + this.cfg.configChangedEvent.subscribe( + this._onParentMenuConfigChange, + oSubmenu, + true + ); + + this.renderEvent.subscribe( + this._onParentMenuRender, + oSubmenu, + true + ); + + oSubmenu.beforeShowEvent.subscribe( + this._onSubmenuBeforeShow, + oSubmenu, + true + ); + + oSubmenu.showEvent.subscribe( + this._onSubmenuShow, + oSubmenu, + true + ); + + oSubmenu.hideEvent.subscribe( + this._onSubmenuHide, + oSubmenu, + true + ); + + } + +}, + + +/** +* @method _subscribeToItemEvents +* @description Subscribes a menu to a menu item's event. +* @private +* @param {YAHOO.widget.MenuItem} p_oItem Object reference for the MenuItem +* instance whose events should be subscribed to. +*/ +_subscribeToItemEvents: function(p_oItem) { + + p_oItem.focusEvent.subscribe(this._onMenuItemFocus, p_oItem, this); + + p_oItem.blurEvent.subscribe(this._onMenuItemBlur, this, true); + + p_oItem.cfg.configChangedEvent.subscribe( + this._onMenuItemConfigChange, + p_oItem, + this + ); + +}, + + +/** +* @method _getOffsetWidth +* @description Returns the offset width of the menu's +* <div> element. +* @private +*/ +_getOffsetWidth: function() { + + var oClone = this.element.cloneNode(true); + + Dom.setStyle(oClone, "width", ""); + + document.body.appendChild(oClone); + + var sWidth = oClone.offsetWidth; + + document.body.removeChild(oClone); + + return sWidth; + +}, + + +/** +* @method _setWidth +* @description Sets the width of the menu's root <div> +* element to its offsetWidth. +* @private +*/ +_setWidth: function() { + + if(this.cfg.getProperty("position") == "dynamic") { + + var sWidth; + + if(this.element.parentNode.tagName.toUpperCase() == "BODY") { + + if(this.browser == "opera") { + + sWidth = this._getOffsetWidth(); + + } + else { + + Dom.setStyle(this.element, "width", "auto"); + + sWidth = this.element.offsetWidth; + + } + + } + else { + + sWidth = this._getOffsetWidth(); + + } + + this.cfg.setProperty("width", (sWidth + "px")); + + } + +}, + + +/** +* @method _cancelHideDelay +* @description Cancels the call to "hideMenu." +* @private +*/ +_cancelHideDelay: function() { + + var oRoot = this.getRoot(); + + if(oRoot._nHideDelayId) { + + window.clearTimeout(oRoot._nHideDelayId); + + } + +}, + + +/** +* @method _execHideDelay +* @description Hides the menu after the number of milliseconds specified by +* the "hidedelay" configuration property. +* @private +*/ +_execHideDelay: function() { + + this._cancelHideDelay(); + + var oRoot = this.getRoot(), + me = this; + + function hideMenu() { + + if(oRoot.activeItem) { + + oRoot.clearActiveItem(); + + } + + if(oRoot == me && me.cfg.getProperty("position") == "dynamic") { + + me.hide(); + + } + + } + + + oRoot._nHideDelayId = + window.setTimeout(hideMenu, oRoot.cfg.getProperty("hidedelay")); + +}, + + +/** +* @method _cancelShowDelay +* @description Cancels the call to the "showMenu." +* @private +*/ +_cancelShowDelay: function() { + + var oRoot = this.getRoot(); + + if(oRoot._nShowDelayId) { + + window.clearTimeout(oRoot._nShowDelayId); + + } + +}, + + +/** +* @method _execShowDelay +* @description Shows the menu after the number of milliseconds specified by +* the "showdelay" configuration property have ellapsed. +* @private +* @param {YAHOO.widget.Menu} p_oMenu Object specifying the menu that should +* be made visible. +*/ +_execShowDelay: function(p_oMenu) { + + var oRoot = this.getRoot(); + + function showMenu() { + + if(p_oMenu.parent.cfg.getProperty("selected")) { + + p_oMenu.show(); + + } + + } + + + oRoot._nShowDelayId = + window.setTimeout(showMenu, oRoot.cfg.getProperty("showdelay")); + +}, + + +/** +* @method _execSubmenuHideDelay +* @description Hides a submenu after the number of milliseconds specified by +* the "submenuhidedelay" configuration property have ellapsed. +* @private +* @param {YAHOO.widget.Menu} p_oSubmenu Object specifying the submenu that +* should be hidden. +* @param {Number} p_nMouseX The x coordinate of the mouse when it left +* the specified submenu's parent menu item. +* @param {Number} p_nHideDelay The number of milliseconds that should ellapse +* before the submenu is hidden. +*/ +_execSubmenuHideDelay: function(p_oSubmenu, p_nMouseX, p_nHideDelay) { + + var me = this; + + p_oSubmenu._nSubmenuHideDelayId = window.setTimeout(function () { + + if(me._nCurrentMouseX > (p_nMouseX + 10)) { + + p_oSubmenu._nSubmenuHideDelayId = window.setTimeout(function () { + + p_oSubmenu.hide(); + + }, p_nHideDelay); + + } + else { + + p_oSubmenu.hide(); + + } + + }, 50); + +}, + + + +// Protected methods + + +/** +* @method _disableScrollHeader +* @description Disables the header used for scrolling the body of the menu. +* @protected +*/ +_disableScrollHeader: function() { + + if(!this._bHeaderDisabled) { + + Dom.addClass(this.header, "topscrollbar_disabled"); + this._bHeaderDisabled = true; + + } + +}, + + +/** +* @method _disableScrollFooter +* @description Disables the footer used for scrolling the body of the menu. +* @protected +*/ +_disableScrollFooter: function() { + + if(!this._bFooterDisabled) { + + Dom.addClass(this.footer, "bottomscrollbar_disabled"); + this._bFooterDisabled = true; + + } + +}, + + +/** +* @method _enableScrollHeader +* @description Enables the header used for scrolling the body of the menu. +* @protected +*/ +_enableScrollHeader: function() { + + if(this._bHeaderDisabled) { + + Dom.removeClass(this.header, "topscrollbar_disabled"); + this._bHeaderDisabled = false; + + } + +}, + + +/** +* @method _enableScrollFooter +* @description Enables the footer used for scrolling the body of the menu. +* @protected +*/ +_enableScrollFooter: function() { + + if(this._bFooterDisabled) { + + Dom.removeClass(this.footer, "bottomscrollbar_disabled"); + this._bFooterDisabled = false; + + } + +}, + + + +/** +* @method _onMouseOver +* @description "mouseover" event handler for the menu. +* @protected +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that +* fired the event. +*/ +_onMouseOver: function(p_sType, p_aArgs, p_oMenu) { + + if(this._bStopMouseEventHandlers) { + + return false; + + } + + + var oEvent = p_aArgs[0], + oItem = p_aArgs[1], + oTarget = Event.getTarget(oEvent); + + + if( + !this._bHandledMouseOverEvent && + (oTarget == this.element || Dom.isAncestor(this.element, oTarget)) + ) { + + // Menu mouseover logic + + this._nCurrentMouseX = 0; + + Event.addListener( + this.element, + "mousemove", + this._onMouseMove, + this, + true + ); + + + this.clearActiveItem(); + + + if(this.parent && this._nSubmenuHideDelayId) { + + window.clearTimeout(this._nSubmenuHideDelayId); + + this.parent.cfg.setProperty("selected", true); + + var oParentMenu = this.parent.parent; + + oParentMenu.activeItem = this.parent; + + oParentMenu._bHandledMouseOutEvent = true; + oParentMenu._bHandledMouseOverEvent = false; + + } + + + this._bHandledMouseOverEvent = true; + this._bHandledMouseOutEvent = false; + + } + + + if( + oItem && !oItem.handledMouseOverEvent && + !oItem.cfg.getProperty("disabled") && + (oTarget == oItem.element || Dom.isAncestor(oItem.element, oTarget)) + ) { + + // Menu Item mouseover logic + + var nShowDelay = this.cfg.getProperty("showdelay"), + bShowDelay = (nShowDelay > 0); + + + if(bShowDelay) { + + this._cancelShowDelay(); + + } + + + var oActiveItem = this.activeItem; + + if(oActiveItem) { + + oActiveItem.cfg.setProperty("selected", false); + + } + + + var oItemCfg = oItem.cfg; + + // Select and focus the current menu item + + oItemCfg.setProperty("selected", true); + oItem.focus(); + + + if(this.cfg.getProperty("autosubmenudisplay")) { + + // Show the submenu this menu item + + var oSubmenu = oItemCfg.getProperty("submenu"); + + if(oSubmenu) { + + if(bShowDelay) { + + this._execShowDelay(oSubmenu); + + } + else { + + oSubmenu.show(); + + } + + } + + } + + oItem.handledMouseOverEvent = true; + oItem.handledMouseOutEvent = false; + + } + +}, + + +/** +* @method _onMouseOut +* @description "mouseout" event handler for the menu. +* @protected +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that +* fired the event. +*/ +_onMouseOut: function(p_sType, p_aArgs, p_oMenu) { + + if(this._bStopMouseEventHandlers) { + + return false; + + } + + + var oEvent = p_aArgs[0], + oItem = p_aArgs[1], + oRelatedTarget = Event.getRelatedTarget(oEvent), + bMovingToSubmenu = false; + + + if(oItem && !oItem.cfg.getProperty("disabled")) { + + var oItemCfg = oItem.cfg, + oSubmenu = oItemCfg.getProperty("submenu"); + + + if( + oSubmenu && + ( + oRelatedTarget == oSubmenu.element || + Dom.isAncestor(oSubmenu.element, oRelatedTarget) + ) + ) { + + bMovingToSubmenu = true; + + } + + + if( + !oItem.handledMouseOutEvent && + ( + ( + oRelatedTarget != oItem.element && + !Dom.isAncestor(oItem.element, oRelatedTarget) + ) || bMovingToSubmenu + ) + ) { + + // Menu Item mouseout logic + + if(!bMovingToSubmenu) { + + oItem.cfg.setProperty("selected", false); + + + if(oSubmenu) { + + var nSubmenuHideDelay = + this.cfg.getProperty("submenuhidedelay"), + + nShowDelay = this.cfg.getProperty("showdelay"); + + if( + !(this instanceof YAHOO.widget.MenuBar) && + nSubmenuHideDelay > 0 && + nShowDelay >= nSubmenuHideDelay + ) { + + this._execSubmenuHideDelay( + oSubmenu, + Event.getPageX(oEvent), + nSubmenuHideDelay + ); + + } + else { + + oSubmenu.hide(); + + } + + } + + } + + + oItem.handledMouseOutEvent = true; + oItem.handledMouseOverEvent = false; + + } + + } + + + if( + !this._bHandledMouseOutEvent && + ( + ( + oRelatedTarget != this.element && + !Dom.isAncestor(this.element, oRelatedTarget) + ) + || bMovingToSubmenu + ) + ) { + + // Menu mouseout logic + + Event.removeListener(this.element, "mousemove", this._onMouseMove); + + this._nCurrentMouseX = Event.getPageX(oEvent); + + this._bHandledMouseOutEvent = true; + this._bHandledMouseOverEvent = false; + + } + +}, + + +/** +* @method _onMouseMove +* @description "click" event handler for the menu. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that +* fired the event. +*/ +_onMouseMove: function(p_oEvent, p_oMenu) { + + if(this._bStopMouseEventHandlers) { + + return false; + + } + + this._nCurrentMouseX = Event.getPageX(p_oEvent); + +}, + + +/** +* @method _onClick +* @description "click" event handler for the menu. +* @protected +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that +* fired the event. +*/ +_onClick: function(p_sType, p_aArgs, p_oMenu) { + + var oEvent = p_aArgs[0], + oItem = p_aArgs[1], + oTarget = Event.getTarget(oEvent); + + if(oItem && !oItem.cfg.getProperty("disabled")) { + + var oItemCfg = oItem.cfg, + oSubmenu = oItemCfg.getProperty("submenu"); + + + /* + ACCESSIBILITY FEATURE FOR SCREEN READERS: + Expand/collapse the submenu when the user clicks + on the submenu indicator image. + */ + + if(oTarget == oItem.submenuIndicator && oSubmenu) { + + if(oSubmenu.cfg.getProperty("visible")) { + + oSubmenu.hide(); + + oSubmenu.parent.focus(); + + } + else { + + this.clearActiveItem(); + + this.activeItem = oItem; + + oItem.cfg.setProperty("selected", true); + + oSubmenu.show(); + + } + + } + else { + + var sURL = oItemCfg.getProperty("url"), + bCurrentPageURL = (sURL.substr((sURL.length-1),1) == "#"), + sTarget = oItemCfg.getProperty("target"), + bHasTarget = (sTarget && sTarget.length > 0); + + /* + Prevent the browser from following links + equal to "#" + */ + + if( + oTarget.tagName.toUpperCase() == "A" && + bCurrentPageURL && !bHasTarget + ) { + + Event.preventDefault(oEvent); + + } + + if( + oTarget.tagName.toUpperCase() != "A" && + !bCurrentPageURL && !bHasTarget + ) { + + /* + Follow the URL of the item regardless of + whether or not the user clicked specifically + on the anchor element. + */ + + document.location = sURL; + + } + + + /* + If the item doesn't navigate to a URL and it doesn't have + a submenu, then collapse the menu tree. + */ + + if(bCurrentPageURL && !oSubmenu) { + + var oRoot = this.getRoot(); + + if(oRoot.cfg.getProperty("position") == "static") { + + oRoot.clearActiveItem(); + + } + else if(oRoot.cfg.getProperty("clicktohide")) { + + oRoot.hide(); + + } + + } + + } + + } + +}, + + +/** +* @method _onKeyDown +* @description "keydown" event handler for the menu. +* @protected +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that +* fired the event. +*/ +_onKeyDown: function(p_sType, p_aArgs, p_oMenu) { + + var oEvent = p_aArgs[0], + oItem = p_aArgs[1], + me = this, + oSubmenu; + + + /* + This function is called to prevent a bug in Firefox. In Firefox, + moving a DOM element into a stationary mouse pointer will cause the + browser to fire mouse events. This can result in the menu mouse + event handlers being called uncessarily, especially when menus are + moved into a stationary mouse pointer as a result of a + key event handler. + */ + function stopMouseEventHandlers() { + + me._bStopMouseEventHandlers = true; + + window.setTimeout(function() { + + me._bStopMouseEventHandlers = false; + + }, 10); + + } + + + if(oItem && !oItem.cfg.getProperty("disabled")) { + + var oItemCfg = oItem.cfg, + oParentItem = this.parent, + oRoot, + oNextItem; + + + switch(oEvent.keyCode) { + + case 38: // Up arrow + case 40: // Down arrow + + if( + oItem == this.activeItem && + !oItemCfg.getProperty("selected") + ) { + + oItemCfg.setProperty("selected", true); + + } + else { + + oNextItem = (oEvent.keyCode == 38) ? + oItem.getPreviousEnabledSibling() : + oItem.getNextEnabledSibling(); + + if(oNextItem) { + + this.clearActiveItem(); + + oNextItem.cfg.setProperty("selected", true); + oNextItem.focus(); + + + if(this.cfg.getProperty("maxheight") > 0) { + + var oBody = this.body; + + oBody.scrollTop = + + ( + oNextItem.element.offsetTop + + oNextItem.element.offsetHeight + ) - oBody.offsetHeight; + + + var nScrollTop = oBody.scrollTop, + nScrollTarget = + oBody.scrollHeight - oBody.offsetHeight; + + if(nScrollTop === 0) { + + this._disableScrollHeader(); + this._enableScrollFooter(); + + } + else if(nScrollTop == nScrollTarget) { + + this._enableScrollHeader(); + this._disableScrollFooter(); + + } + else { + + this._enableScrollHeader(); + this._enableScrollFooter(); + + } + + } + + } + + } + + Event.preventDefault(oEvent); + + stopMouseEventHandlers(); + + break; + + + case 39: // Right arrow + + oSubmenu = oItemCfg.getProperty("submenu"); + + if(oSubmenu) { + + if(!oItemCfg.getProperty("selected")) { + + oItemCfg.setProperty("selected", true); + + } + + oSubmenu.show(); + + oSubmenu.setInitialSelection(); + + } + else { + + oRoot = this.getRoot(); + + if(oRoot instanceof YAHOO.widget.MenuBar) { + + oNextItem = oRoot.activeItem.getNextEnabledSibling(); + + if(oNextItem) { + + oRoot.clearActiveItem(); + + oNextItem.cfg.setProperty("selected", true); + + oSubmenu = oNextItem.cfg.getProperty("submenu"); + + if(oSubmenu) { + + oSubmenu.show(); + + } + + oNextItem.focus(); + + } + + } + + } + + + Event.preventDefault(oEvent); + + stopMouseEventHandlers(); + + break; + + + case 37: // Left arrow + + if(oParentItem) { + + var oParentMenu = oParentItem.parent; + + if(oParentMenu instanceof YAHOO.widget.MenuBar) { + + oNextItem = + oParentMenu.activeItem.getPreviousEnabledSibling(); + + if(oNextItem) { + + oParentMenu.clearActiveItem(); + + oNextItem.cfg.setProperty("selected", true); + + oSubmenu = oNextItem.cfg.getProperty("submenu"); + + if(oSubmenu) { + + oSubmenu.show(); + + } + + oNextItem.focus(); + + } + + } + else { + + this.hide(); + + oParentItem.focus(); + + } + + } + + Event.preventDefault(oEvent); + + stopMouseEventHandlers(); + + break; + + } + + + } + + + if(oEvent.keyCode == 27) { // Esc key + + if(this.cfg.getProperty("position") == "dynamic") { + + this.hide(); + + if(this.parent) { + + this.parent.focus(); + + } + + } + else if(this.activeItem) { + + oSubmenu = this.activeItem.cfg.getProperty("submenu"); + + if(oSubmenu && oSubmenu.cfg.getProperty("visible")) { + + oSubmenu.hide(); + this.activeItem.focus(); + + } + else { + + this.activeItem.cfg.setProperty("selected", false); + this.activeItem.blur(); + + } + + } + + + Event.preventDefault(oEvent); + + } + +}, + + +/** +* @method _onKeyPress +* @description "keypress" event handler for a Menu instance. +* @protected +* @param {String} p_sType The name of the event that was fired. +* @param {Array} p_aArgs Collection of arguments sent when the event +* was fired. +* @param {YAHOO.widget.Menu} p_oMenu The Menu instance that fired the event. +*/ +_onKeyPress: function(p_sType, p_aArgs, p_oMenu) { + + var oEvent = p_aArgs[0]; + + + if(oEvent.keyCode == 40 || oEvent.keyCode == 38) { + + YAHOO.util.Event.preventDefault(oEvent); + + } + +}, + + +/** +* @method _onTextResize +* @description "textresize" event handler for the menu. +* @protected +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that +* fired the event. +*/ +_onTextResize: function(p_sType, p_aArgs, p_oMenu) { + + if(this.browser == "gecko" && !this._handleResize) { + + this._handleResize = true; + return; + + } + + + var oConfig = this.cfg; + + if(oConfig.getProperty("position") == "dynamic") { + + oConfig.setProperty("width", (this._getOffsetWidth() + "px")); + + } + +}, + + +/** +* @method _onScrollTargetMouseOver +* @description "mouseover" event handler for the menu's "header" and "footer" +* elements. Used to scroll the body of the menu up and down when the +* menu's "maxheight" configuration property is set to a value greater than 0. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that +* fired the event. +*/ +_onScrollTargetMouseOver: function(p_oEvent, p_oMenu) { + + this._cancelHideDelay(); + + var oTarget = Event.getTarget(p_oEvent), + oBody = this.body, + me = this, + nScrollTarget, + fnScrollFunction; + + + function scrollBodyDown() { + + var nScrollTop = oBody.scrollTop; + + + if(nScrollTop < nScrollTarget) { + + oBody.scrollTop = (nScrollTop + 1); + + me._enableScrollHeader(); + + } + else { + + oBody.scrollTop = nScrollTarget; + + window.clearInterval(me._nBodyScrollId); + + me._disableScrollFooter(); + + } + + } + + + function scrollBodyUp() { + + var nScrollTop = oBody.scrollTop; + + + if(nScrollTop > 0) { + + oBody.scrollTop = (nScrollTop - 1); + + me._enableScrollFooter(); + + } + else { + + oBody.scrollTop = 0; + + window.clearInterval(me._nBodyScrollId); + + me._disableScrollHeader(); + + } + + } + + + if(Dom.hasClass(oTarget, "hd")) { + + fnScrollFunction = scrollBodyUp; + + } + else { + + nScrollTarget = oBody.scrollHeight - oBody.offsetHeight; + + fnScrollFunction = scrollBodyDown; + + } + + + this._nBodyScrollId = window.setInterval(fnScrollFunction, 10); + +}, + + +/** +* @method _onScrollTargetMouseOut +* @description "mouseout" event handler for the menu's "header" and "footer" +* elements. Used to stop scrolling the body of the menu up and down when the +* menu's "maxheight" configuration property is set to a value greater than 0. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that +* fired the event. +*/ +_onScrollTargetMouseOut: function(p_oEvent, p_oMenu) { + + window.clearInterval(this._nBodyScrollId); + + this._cancelHideDelay(); + +}, + + + +// Private methods + + +/** +* @method _onInit +* @description "init" event handler for the menu. +* @private +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that +* fired the event. +*/ +_onInit: function(p_sType, p_aArgs, p_oMenu) { + + if( + ( + (this.parent && !this.lazyLoad) || + (!this.parent && this.cfg.getProperty("position") == "static") || + ( + !this.parent && + !this.lazyLoad && + this.cfg.getProperty("position") == "dynamic" + ) + ) && + this.getItemGroups().length === 0 + ) { + + if(this.srcElement) { + + this._initSubTree(); + + } + + + if(this.itemData) { + + this.addItems(this.itemData); + + } + + } + else if(this.lazyLoad) { + + this.cfg.fireQueue(); + + } + +}, + + +/** +* @method _onBeforeRender +* @description "beforerender" event handler for the menu. Appends all of the +* <ul>, <li> and their accompanying +* title elements to the body element of the menu. +* @private +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that +* fired the event. +*/ +_onBeforeRender: function(p_sType, p_aArgs, p_oMenu) { + + var oConfig = this.cfg, + oEl = this.element, + nListElements = this._aListElements.length; + + + if(nListElements > 0) { + + var i = 0, + bFirstList = true, + oUL, + oGroupTitle; + + + do { + + oUL = this._aListElements[i]; + + if(oUL) { + + if(bFirstList) { + + Dom.addClass(oUL, "first-of-type"); + bFirstList = false; + + } + + + if(!Dom.isAncestor(oEl, oUL)) { + + this.appendToBody(oUL); + + } + + + oGroupTitle = this._aGroupTitleElements[i]; + + if(oGroupTitle) { + + if(!Dom.isAncestor(oEl, oGroupTitle)) { + + oUL.parentNode.insertBefore(oGroupTitle, oUL); + + } + + + Dom.addClass(oUL, "hastitle"); + + } + + } + + i++; + + } + while(i < nListElements); + + } + +}, + + +/** +* @method _onBeforeShow +* @description "beforeshow" event handler for the menu. +* @private +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that +* fired the event. +*/ +_onBeforeShow: function(p_sType, p_aArgs, p_oMenu) { + + if(this.lazyLoad && this.getItemGroups().length === 0) { + + if(this.srcElement) { + + this._initSubTree(); + + } + + + if(this.itemData) { + + if( + this.parent && this.parent.parent && + this.parent.parent.srcElement && + this.parent.parent.srcElement.tagName.toUpperCase() == "SELECT" + ) { + + var nOptions = this.itemData.length; + + for(var n=0; n= nViewportHeight) { + + var nMaxHeight = this.cfg.getProperty("maxheight"); + + /* + Cache the original value for the "maxheight" configuration + property so that we can set it back when the menu is hidden. + */ + + this._nMaxHeight = nMaxHeight; + + this.cfg.setProperty("maxheight", (nViewportHeight - 20)); + + } + + + if(this.cfg.getProperty("maxheight") > 0) { + + var oBody = this.body; + + if(oBody.scrollTop > 0) { + + oBody.scrollTop = 0; + + } + + this._disableScrollHeader(); + this._enableScrollFooter(); + + } + + } + + +}, + + +/** +* @method _onShow +* @description "show" event handler for the menu. +* @private +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that fired +* the event. +*/ +_onShow: function(p_sType, p_aArgs, p_oMenu) { + + this.setInitialFocus(); + + var oParent = this.parent; + + if(oParent) { + + var oParentMenu = oParent.parent, + aParentAlignment = oParentMenu.cfg.getProperty("submenualignment"), + aAlignment = this.cfg.getProperty("submenualignment"); + + + if( + (aParentAlignment[0] != aAlignment[0]) && + (aParentAlignment[1] != aAlignment[1]) + ) { + + this.cfg.setProperty( + "submenualignment", + [ aParentAlignment[0], aParentAlignment[1] ] + ); + + } + + + if( + !oParentMenu.cfg.getProperty("autosubmenudisplay") && + oParentMenu.cfg.getProperty("position") == "static" + ) { + + oParentMenu.cfg.setProperty("autosubmenudisplay", true); + + + function disableAutoSubmenuDisplay(p_oEvent) { + + if( + p_oEvent.type == "mousedown" || + (p_oEvent.type == "keydown" && p_oEvent.keyCode == 27) + ) { + + /* + Set the "autosubmenudisplay" to "false" if the user + clicks outside the menu bar. + */ + + var oTarget = Event.getTarget(p_oEvent); + + if( + oTarget != oParentMenu.element || + !YAHOO.util.Dom.isAncestor(oParentMenu.element, oTarget) + ) { + + oParentMenu.cfg.setProperty( + "autosubmenudisplay", + false + ); + + Event.removeListener( + document, + "mousedown", + disableAutoSubmenuDisplay + ); + + Event.removeListener( + document, + "keydown", + disableAutoSubmenuDisplay + ); + + } + + } + + } + + Event.addListener(document, "mousedown", disableAutoSubmenuDisplay); + Event.addListener(document, "keydown", disableAutoSubmenuDisplay); + + } + + } + else if(!oParent && this.lazyLoad) { + + this.cfg.refireEvent("xy"); + + } + +}, + + +/** +* @method _onBeforeHide +* @description "beforehide" event handler for the menu. +* @private +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that fired +* the event. +*/ +_onBeforeHide: function(p_sType, p_aArgs, p_oMenu) { + + var oActiveItem = this.activeItem; + + if(oActiveItem) { + + var oConfig = oActiveItem.cfg; + + oConfig.setProperty("selected", false); + + var oSubmenu = oConfig.getProperty("submenu"); + + if(oSubmenu) { + + oSubmenu.hide(); + + } + + oActiveItem.blur(); + + } + +}, + + +/** +* @method _onHide +* @description "hide" event handler for the menu. +* @private +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that fired +* the event. +*/ +_onHide: function(p_sType, p_aArgs, p_oMenu) { + + if(this._nMaxHeight != -1) { + + this.cfg.setProperty("maxheight", this._nMaxHeight); + + this._nMaxHeight = -1; + + } + +}, + + +/** +* @method _onParentMenuConfigChange +* @description "configchange" event handler for a submenu. +* @private +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oSubmenu Object representing the submenu that +* subscribed to the event. +*/ +_onParentMenuConfigChange: function(p_sType, p_aArgs, p_oSubmenu) { + + var sPropertyName = p_aArgs[0][0], + oPropertyValue = p_aArgs[0][1]; + + switch(sPropertyName) { + + case "iframe": + case "constraintoviewport": + case "hidedelay": + case "showdelay": + case "submenuhidedelay": + case "clicktohide": + case "effect": + case "classname": + + p_oSubmenu.cfg.setProperty(sPropertyName, oPropertyValue); + + break; + + } + +}, + + +/** +* @method _onParentMenuRender +* @description "render" event handler for a submenu. Renders a +* submenu in response to the firing of its parent's "render" event. +* @private +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oSubmenu Object representing the submenu that +* subscribed to the event. +*/ +_onParentMenuRender: function(p_sType, p_aArgs, p_oSubmenu) { + + var oParentMenu = p_oSubmenu.parent.parent, + + oConfig = { + + constraintoviewport: + oParentMenu.cfg.getProperty("constraintoviewport"), + + xy: [0,0], + + clicktohide: oParentMenu.cfg.getProperty("clicktohide"), + + effect: oParentMenu.cfg.getProperty("effect"), + + showdelay: oParentMenu.cfg.getProperty("showdelay"), + + hidedelay: oParentMenu.cfg.getProperty("hidedelay"), + + submenuhidedelay: oParentMenu.cfg.getProperty("submenuhidedelay"), + + classname: oParentMenu.cfg.getProperty("classname") + + }; + + + /* + Only sync the "iframe" configuration property if the parent + menu's "position" configuration is the same. + */ + + if( + this.cfg.getProperty("position") == + oParentMenu.cfg.getProperty("position") + ) { + + oConfig.iframe = oParentMenu.cfg.getProperty("iframe"); + + } + + + p_oSubmenu.cfg.applyConfig(oConfig); + + + if(!this.lazyLoad) { + + var oLI = this.parent.element; + + if(this.element.parentNode == oLI) { + + this.render(); + + } + else { + + this.render(oLI); + + } + + } + +}, + + +/** +* @method _onSubmenuBeforeShow +* @description "beforeshow" event handler for a submenu. +* @private +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oSubmenu Object representing the submenu that +* subscribed to the event. +*/ +_onSubmenuBeforeShow: function(p_sType, p_aArgs, p_oSubmenu) { + + var oParent = this.parent, + aAlignment = oParent.parent.cfg.getProperty("submenualignment"); + + this.cfg.setProperty( + "context", + [oParent.element, aAlignment[0], aAlignment[1]] + ); + + + var nScrollTop = oParent.parent.body.scrollTop; + + if( + (this.browser == "gecko" || this.browser == "safari") + && nScrollTop > 0 + ) { + + this.cfg.setProperty("y", (this.cfg.getProperty("y") - nScrollTop)); + + } + +}, + + +/** +* @method _onSubmenuShow +* @description "show" event handler for a submenu. +* @private +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oSubmenu Object representing the submenu that +* subscribed to the event. +*/ +_onSubmenuShow: function(p_sType, p_aArgs, p_oSubmenu) { + + var oParent = this.parent; + + oParent.submenuIndicator.firstChild.nodeValue = + oParent.EXPANDED_SUBMENU_INDICATOR_TEXT; + +}, + + +/** +* @method _onSubmenuHide +* @description "hide" Custom Event handler for a submenu. +* @private +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oSubmenu Object representing the submenu that +* subscribed to the event. +*/ +_onSubmenuHide: function(p_sType, p_aArgs, p_oSubmenu) { + + var oParent = this.parent; + + oParent.submenuIndicator.firstChild.nodeValue = + oParent.COLLAPSED_SUBMENU_INDICATOR_TEXT; + +}, + + +/** +* @method _onMenuItemFocus +* @description "focus" event handler for the menu's items. +* @private +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.MenuItem} p_oItem Object representing the menu item +* that fired the event. +*/ +_onMenuItemFocus: function(p_sType, p_aArgs, p_oItem) { + + this.activeItem = p_oItem; + +}, + + +/** +* @method _onMenuItemBlur +* @description "blur" event handler for the menu's items. +* @private +* @param {String} p_sType String representing the name of the event +* that was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +*/ +_onMenuItemBlur: function(p_sType, p_aArgs) { + + this.activeItem = null; + +}, + + +/** +* @method _onMenuItemConfigChange +* @description "configchange" event handler for the menu's items. +* @private +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.MenuItem} p_oItem Object representing the menu item +* that fired the event. +*/ +_onMenuItemConfigChange: function(p_sType, p_aArgs, p_oItem) { + + var sProperty = p_aArgs[0][0]; + + switch(sProperty) { + + case "submenu": + + var oSubmenu = p_aArgs[0][1]; + + if(oSubmenu) { + + this._configureSubmenu(p_oItem); + + } + + break; + + case "text": + case "helptext": + + /* + A change to an item's "text" or "helptext" + configuration properties requires the width of the parent + menu to be recalculated. + */ + + if(this.element.style.width) { + + var sWidth = this._getOffsetWidth() + "px"; + + Dom.setStyle(this.element, "width", sWidth); + + } + + break; + + } + +}, + + + +// Public event handlers for configuration properties + + +/** +* @method enforceConstraints +* @description The default event handler executed when the moveEvent is fired, +* if the "constraintoviewport" configuration property is set to true. +* @param {String} type The name of the event that was fired. +* @param {Array} args Collection of arguments sent when the +* event was fired. +* @param {Array} obj Array containing the current Menu instance +* and the item that fired the event. +*/ +enforceConstraints: function(type, args, obj) { + + var oConfig = this.cfg, + pos = args[0], + + x = pos[0], + y = pos[1], + + offsetHeight = this.element.offsetHeight, + offsetWidth = this.element.offsetWidth, + + viewPortWidth = YAHOO.util.Dom.getViewportWidth(), + viewPortHeight = YAHOO.util.Dom.getViewportHeight(), + + scrollX = Math.max( + document.documentElement.scrollLeft, + document.body.scrollLeft + ), + + scrollY = Math.max( + document.documentElement.scrollTop, + document.body.scrollTop + ), + + nPadding = ( + this.parent && + this.parent.parent instanceof YAHOO.widget.MenuBar + ) ? 0 : 10, + + topConstraint = scrollY + nPadding, + leftConstraint = scrollX + nPadding, + bottomConstraint = scrollY + viewPortHeight - offsetHeight - nPadding, + rightConstraint = scrollX + viewPortWidth - offsetWidth - nPadding, + + aContext = oConfig.getProperty("context"), + oContextElement = aContext ? aContext[0] : null; + + + if (x < 10) { + + x = leftConstraint; + + } else if ((x + offsetWidth) > viewPortWidth) { + + if( + oContextElement && + ((x - oContextElement.offsetWidth) > offsetWidth) + ) { + + x = (x - (oContextElement.offsetWidth + offsetWidth)); + + } + else { + + x = rightConstraint; + + } + + } + + if (y < 10) { + + y = topConstraint; + + } else if (y > bottomConstraint) { + + if(oContextElement && (y > offsetHeight)) { + + y = ((y + oContextElement.offsetHeight) - offsetHeight); + + } + else { + + y = bottomConstraint; + + } + + } + + oConfig.setProperty("x", x, true); + oConfig.setProperty("y", y, true); + oConfig.setProperty("xy", [x,y], true); + +}, + + +/** +* @method configVisible +* @description Event handler for when the "visible" configuration property +* the menu changes. +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that +* fired the event. +*/ +configVisible: function(p_sType, p_aArgs, p_oMenu) { + + if(this.cfg.getProperty("position") == "dynamic") { + + YAHOO.widget.Menu.superclass.configVisible.call( + this, + p_sType, + p_aArgs, + p_oMenu + ); + + } + else { + + var bVisible = p_aArgs[0], + sDisplay = Dom.getStyle(this.element, "display"); + + if(bVisible) { + + if(sDisplay != "block") { + this.beforeShowEvent.fire(); + Dom.setStyle(this.element, "display", "block"); + this.showEvent.fire(); + } + + } + else { + + if(sDisplay == "block") { + this.beforeHideEvent.fire(); + Dom.setStyle(this.element, "display", "none"); + this.hideEvent.fire(); + } + + } + + } + +}, + + +/** +* @method configPosition +* @description Event handler for when the "position" configuration property +* of the menu changes. +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that +* fired the event. +*/ +configPosition: function(p_sType, p_aArgs, p_oMenu) { + + var sCSSPosition = p_aArgs[0] == "static" ? "static" : "absolute", + oCfg = this.cfg; + + Dom.setStyle(this.element, "position", sCSSPosition); + + + if(sCSSPosition == "static") { + + /* + Remove the iframe for statically positioned menus since it will + intercept mouse events. + */ + + oCfg.setProperty("iframe", false); + + + // Statically positioned menus are visible by default + + Dom.setStyle(this.element, "display", "block"); + + oCfg.setProperty("visible", true); + + } + else { + + /* + Even though the "visible" property is queued to + "false" by default, we need to set the "visibility" property to + "hidden" since Overlay's "configVisible" implementation checks the + element's "visibility" style property before deciding whether + or not to show an Overlay instance. + */ + + Dom.setStyle(this.element, "visibility", "hidden"); + + } + + + if(sCSSPosition == "absolute") { + + var nZIndex = oCfg.getProperty("zindex"); + + if(!nZIndex || nZIndex === 0) { + + nZIndex = this.parent ? + (this.parent.parent.cfg.getProperty("zindex") + 1) : 1; + + oCfg.setProperty("zindex", nZIndex); + + } + + } + +}, + + +/** +* @method configIframe +* @description Event handler for when the "iframe" configuration property of +* the menu changes. +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that +* fired the event. +*/ +configIframe: function(p_sType, p_aArgs, p_oMenu) { + + if(this.cfg.getProperty("position") == "dynamic") { + + YAHOO.widget.Menu.superclass.configIframe.call( + this, + p_sType, + p_aArgs, + p_oMenu + ); + + } + +}, + + +/** +* @method configHideDelay +* @description Event handler for when the "hidedelay" configuration property +* of the menu changes. +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that +* fired the event. +*/ +configHideDelay: function(p_sType, p_aArgs, p_oMenu) { + + var nHideDelay = p_aArgs[0], + oMouseOutEvent = this.mouseOutEvent, + oMouseOverEvent = this.mouseOverEvent, + oKeyDownEvent = this.keyDownEvent; + + if(nHideDelay > 0) { + + /* + Only assign event handlers once. This way the user change + the value for the hidedelay as many times as they want. + */ + + if(!this._bHideDelayEventHandlersAssigned) { + + oMouseOutEvent.subscribe(this._execHideDelay, true); + oMouseOverEvent.subscribe(this._cancelHideDelay, this, true); + oKeyDownEvent.subscribe(this._cancelHideDelay, this, true); + + this._bHideDelayEventHandlersAssigned = true; + + } + + } + else { + + oMouseOutEvent.unsubscribe(this._execHideDelay, this); + oMouseOverEvent.unsubscribe(this._cancelHideDelay, this); + oKeyDownEvent.unsubscribe(this._cancelHideDelay, this); + + this._bHideDelayEventHandlersAssigned = false; + + } + +}, + + +/** +* @method configContainer +* @description Event handler for when the "container" configuration property +of the menu changes. +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that +* fired the event. +*/ +configContainer: function(p_sType, p_aArgs, p_oMenu) { + + var oElement = p_aArgs[0]; + + if(typeof oElement == 'string') { + + this.cfg.setProperty( + "container", + document.getElementById(oElement), + true + ); + + } + +}, + + +/** +* @method configMaxHeight +* @description Event handler for when the "maxheight" configuration property of +* a Menu changes. +* @param {String} p_sType The name of the event that was fired. +* @param {Array} p_aArgs Collection of arguments sent when the event +* was fired. +* @param {YAHOO.widget.Menu} p_oMenu The Menu instance fired +* the event. +*/ +configMaxHeight: function(p_sType, p_aArgs, p_oMenu) { + + var nMaxHeight = p_aArgs[0], + oBody = this.body, + oHeader = this.header, + oFooter = this.footer, + fnMouseOver = this._onScrollTargetMouseOver, + fnMouseOut = this._onScrollTargetMouseOut; + + + if((nMaxHeight > 0) && (oBody.offsetHeight > nMaxHeight)) { + + if(!this.cfg.getProperty("width")) { + + this._setWidth(); + + } + + if(!oHeader && !oFooter) { + + this.setHeader(" "); + this.setFooter(" "); + + oHeader = this.header; + oFooter = this.footer; + + Dom.addClass(oHeader, "topscrollbar"); + Dom.addClass(oFooter, "bottomscrollbar"); + + this.element.insertBefore(oHeader, oBody); + this.element.appendChild(oFooter); + + Event.addListener(oHeader, "mouseover", fnMouseOver, this, true); + Event.addListener(oHeader, "mouseout", fnMouseOut, this, true); + Event.addListener(oFooter, "mouseover", fnMouseOver, this, true); + Event.addListener(oFooter, "mouseout", fnMouseOut, this, true); + + } + + var nHeight = + + ( + nMaxHeight - + (this.footer.offsetHeight + this.header.offsetHeight) + ); + + Dom.setStyle(oBody, "height", (nHeight + "px")); + Dom.setStyle(oBody, "overflow", "hidden"); + + } + else if(oHeader && oFooter) { + + Dom.setStyle(oBody, "height", "auto"); + Dom.setStyle(oBody, "overflow", "visible"); + + Event.removeListener(oHeader, "mouseover", fnMouseOver); + Event.removeListener(oHeader, "mouseout", fnMouseOut); + Event.removeListener(oFooter, "mouseover", fnMouseOver); + Event.removeListener(oFooter, "mouseout", fnMouseOut); + + this.element.removeChild(oHeader); + this.element.removeChild(oFooter); + + this.header = null; + this.footer = null; + + } + +}, + + +/** +* @method configClassName +* @description Event handler for when the "classname" configuration property of +* a menu changes. +* @param {String} p_sType The name of the event that was fired. +* @param {Array} p_aArgs Collection of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oMenu The Menu instance fired the event. +*/ +configClassName: function(p_sType, p_aArgs, p_oMenu) { + + var sClassName = p_aArgs[0]; + + if(this._sClassName) { + + Dom.removeClass(this.element, this._sClassName); + + } + + Dom.addClass(this.element, sClassName); + this._sClassName = sClassName; + +}, + + +// Public methods + + +/** +* @method initEvents +* @description Initializes the custom events for the menu. +*/ +initEvents: function() { + + YAHOO.widget.Menu.superclass.initEvents.call(this); + + // Create custom events + + var CustomEvent = YAHOO.util.CustomEvent; + + this.mouseOverEvent = new CustomEvent("mouseOverEvent", this); + this.mouseOutEvent = new CustomEvent("mouseOutEvent", this); + this.mouseDownEvent = new CustomEvent("mouseDownEvent", this); + this.mouseUpEvent = new CustomEvent("mouseUpEvent", this); + this.clickEvent = new CustomEvent("clickEvent", this); + this.keyPressEvent = new CustomEvent("keyPressEvent", this); + this.keyDownEvent = new CustomEvent("keyDownEvent", this); + this.keyUpEvent = new CustomEvent("keyUpEvent", this); + this.itemAddedEvent = new CustomEvent("itemAddedEvent", this); + this.itemRemovedEvent = new CustomEvent("itemRemovedEvent", this); + +}, + + +/** +* @method getRoot +* @description Finds the menu's root menu. +*/ +getRoot: function() { + + var oItem = this.parent; + + if(oItem) { + + var oParentMenu = oItem.parent; + + return oParentMenu ? oParentMenu.getRoot() : this; + + } + else { + + return this; + + } + +}, + + +/** +* @method toString +* @description Returns a string representing the menu. +* @return {String} +*/ +toString: function() { + + return ("Menu " + this.id); + +}, + + +/** +* @method setItemGroupTitle +* @description Sets the title of a group of menu items. +* @param {String} p_sGroupTitle String specifying the title of the group. +* @param {Number} p_nGroupIndex Optional. Number specifying the group to which +* the title belongs. +*/ +setItemGroupTitle: function(p_sGroupTitle, p_nGroupIndex) { + + if(typeof p_sGroupTitle == "string" && p_sGroupTitle.length > 0) { + + var nGroupIndex = typeof p_nGroupIndex == "number" ? p_nGroupIndex : 0, + oTitle = this._aGroupTitleElements[nGroupIndex]; + + + if(oTitle) { + + oTitle.innerHTML = p_sGroupTitle; + + } + else { + + oTitle = document.createElement(this.GROUP_TITLE_TAG_NAME); + + oTitle.innerHTML = p_sGroupTitle; + + this._aGroupTitleElements[nGroupIndex] = oTitle; + + } + + + var i = this._aGroupTitleElements.length - 1, + nFirstIndex; + + do { + + if(this._aGroupTitleElements[i]) { + + Dom.removeClass(this._aGroupTitleElements[i], "first-of-type"); + + nFirstIndex = i; + + } + + } + while(i--); + + + if(nFirstIndex !== null) { + + Dom.addClass( + this._aGroupTitleElements[nFirstIndex], + "first-of-type" + ); + + } + + } + +}, + + + +/** +* @method addItem +* @description Appends an item to the menu. +* @param {YAHOO.widget.MenuItem} p_oItem Object reference for the MenuItem +* instance to be added to the menu. +* @param {String} p_oItem String specifying the text of the item to be added +* to the menu. +* @param {Object} p_oItem Object literal containing a set of menu item +* configuration properties. +* @param {Number} p_nGroupIndex Optional. Number indicating the group to +* which the item belongs. +* @return {YAHOO.widget.MenuItem} +*/ +addItem: function(p_oItem, p_nGroupIndex) { + + if(p_oItem) { + + return this._addItemToGroup(p_nGroupIndex, p_oItem); + + } + +}, + + +/** +* @method addItems +* @description Adds an array of items to the menu. +* @param {Array} p_aItems Array of items to be added to the menu. The array +* can contain strings specifying the text for each item to be created, object +* literals specifying each of the menu item configuration properties, +* or MenuItem instances. +* @param {Number} p_nGroupIndex Optional. Number specifying the group to +* which the items belongs. +* @return {Array} +*/ +addItems: function(p_aItems, p_nGroupIndex) { + + if(Lang.isArray(p_aItems)) { + + var nItems = p_aItems.length, + aItems = [], + oItem; + + + for(var i=0; i 0) { + + var i = nItems - 1, + oItem, + oSubmenu; + + do { + + oItem = aItems[i]; + + if(oItem) { + + oSubmenu = oItem.cfg.getProperty("submenu"); + + if(oSubmenu) { + + this.cfg.configChangedEvent.unsubscribe( + this._onParentMenuConfigChange, + oSubmenu + ); + + this.renderEvent.unsubscribe( + this._onParentMenuRender, + oSubmenu + ); + + } + + oItem.destroy(); + + } + + } + while(i--); + + } + + + if(oHeader) { + + Event.purgeElement(oHeader); + oElement.removeChild(oHeader); + + } + + + if(oFooter) { + + Event.purgeElement(oFooter); + oElement.removeChild(oFooter); + } + + + if(oBody) { + + Event.purgeElement(oBody); + + oBody.innerHTML = ""; + + } + + + this._aItemGroups = []; + this._aListElements = []; + this._aGroupTitleElements = []; + +}, + + +/** +* @method destroy +* @description Removes the menu's <div> element +* (and accompanying child nodes) from the document. +*/ +destroy: function() { + + // Remove all DOM event listeners + + Event.purgeElement(this.element); + + + // Remove Custom Event listeners + + this.mouseOverEvent.unsubscribeAll(); + this.mouseOutEvent.unsubscribeAll(); + this.mouseDownEvent.unsubscribeAll(); + this.mouseUpEvent.unsubscribeAll(); + this.clickEvent.unsubscribeAll(); + this.keyPressEvent.unsubscribeAll(); + this.keyDownEvent.unsubscribeAll(); + this.keyUpEvent.unsubscribeAll(); + this.itemAddedEvent.unsubscribeAll(); + this.itemRemovedEvent.unsubscribeAll(); + + YAHOO.widget.Module.textResizeEvent.unsubscribe(this._onTextResize, this); + + + // Remove all items + + this.clearContent(); + + + this._aItemGroups = null; + this._aListElements = null; + this._aGroupTitleElements = null; + + + // Continue with the superclass implementation of this method + + YAHOO.widget.Menu.superclass.destroy.call(this); + + this.logger.log("Destroyed."); + +}, + + +/** +* @method setInitialFocus +* @description Sets focus to the menu's first enabled item. +*/ +setInitialFocus: function() { + + var oItem = this._getFirstEnabledItem(); + + if(oItem) { + + oItem.focus(); + } + +}, + + +/** +* @method setInitialSelection +* @description Sets the "selected" configuration property of the menu's first +* enabled item to "true." +*/ +setInitialSelection: function() { + + var oItem = this._getFirstEnabledItem(); + + if(oItem) { + + oItem.cfg.setProperty("selected", true); + } + +}, + + +/** +* @method clearActiveItem +* @description Sets the "selected" configuration property of the menu's active +* item to "false" and hides the item's submenu. +* @param {Boolean} p_bBlur Boolean indicating if the menu's active item +* should be blurred. +*/ +clearActiveItem: function(p_bBlur) { + + if(this.cfg.getProperty("showdelay") > 0) { + + this._cancelShowDelay(); + + } + + + var oActiveItem = this.activeItem; + + if(oActiveItem) { + + var oConfig = oActiveItem.cfg; + + oConfig.setProperty("selected", false); + + var oSubmenu = oConfig.getProperty("submenu"); + + if(oSubmenu) { + + oSubmenu.hide(); + + } + + if(p_bBlur) { + + oActiveItem.blur(); + + } + + } + +}, + + +/** +* @description Initializes the class's configurable properties which can be +* changed using the menu's Config object ("cfg"). +* @method initDefaultConfig +*/ +initDefaultConfig: function() { + + YAHOO.widget.Menu.superclass.initDefaultConfig.call(this); + + var oConfig = this.cfg; + + // Add configuration attributes + + /* + Change the default value for the "visible" configuration + property to "false" by re-adding the property. + */ + + /** + * @config visible + * @description Boolean indicating whether or not the menu is visible. If + * the menu's "position" configuration property is set to "dynamic" (the + * default), this property toggles the menu's <div> + * element's "visibility" style property between "visible" (true) or + * "hidden" (false). If the menu's "position" configuration property is + * set to "static" this property toggles the menu's + * <div> element's "display" style property + * between "block" (true) or "none" (false). + * @default false + * @type Boolean + */ + oConfig.addProperty( + "visible", + { + value:false, + handler:this.configVisible, + validator:this.cfg.checkBoolean + } + ); + + + /* + Change the default value for the "constraintoviewport" configuration + property to "true" by re-adding the property. + */ + + /** + * @config constraintoviewport + * @description Boolean indicating if the menu will try to remain inside + * the boundaries of the size of viewport. + * @default true + * @type Boolean + */ + oConfig.addProperty( + "constraintoviewport", + { + value:true, + handler:this.configConstrainToViewport, + validator:this.cfg.checkBoolean, + supercedes:["iframe","x","y","xy"] + } + ); + + + /** + * @config position + * @description String indicating how a menu should be positioned on the + * screen. Possible values are "static" and "dynamic." Static menus are + * visible by default and reside in the normal flow of the document + * (CSS position: static). Dynamic menus are hidden by default, reside + * out of the normal flow of the document (CSS position: absolute), and + * can overlay other elements on the screen. + * @default dynamic + * @type String + */ + oConfig.addProperty( + "position", + { + value: "dynamic", + handler: this.configPosition, + validator: this._checkPosition, + supercedes: ["visible"] + } + ); + + + /** + * @config submenualignment + * @description Array defining how submenus should be aligned to their + * parent menu item. The format is: [itemCorner, submenuCorner]. By default + * a submenu's top left corner is aligned to its parent menu item's top + * right corner. + * @default ["tl","tr"] + * @type Array + */ + oConfig.addProperty("submenualignment", { value: ["tl","tr"] } ); + + + /** + * @config autosubmenudisplay + * @description Boolean indicating if submenus are automatically made + * visible when the user mouses over the menu's items. + * @default true + * @type Boolean + */ + oConfig.addProperty( + "autosubmenudisplay", + { + value: true, + validator: oConfig.checkBoolean + } + ); + + + /** + * @config showdelay + * @description Number indicating the time (in milliseconds) that should + * expire before a submenu is made visible when the user mouses over + * the menu's items. + * @default 250 + * @type Number + */ + oConfig.addProperty( + "showdelay", + { + value: 250, + validator: oConfig.checkNumber + } + ); + + + /** + * @config hidedelay + * @description Number indicating the time (in milliseconds) that should + * expire before the menu is hidden. + * @default 0 + * @type Number + */ + oConfig.addProperty( + "hidedelay", + { + value: 0, + validator: oConfig.checkNumber, + handler: this.configHideDelay, + suppressEvent: true + } + ); + + + /** + * @config submenuhidedelay + * @description Number indicating the time (in milliseconds) that should + * expire before a submenu is hidden when the user mouses out of a menu item + * heading in the direction of a submenu. The value must be greater than or + * equal to the value specified for the "showdelay" configuration property. + * @default 250 + * @type Number + */ + oConfig.addProperty( + "submenuhidedelay", + { + value: 250, + validator: oConfig.checkNumber + } + ); + + + /** + * @config clicktohide + * @description Boolean indicating if the menu will automatically be + * hidden if the user clicks outside of it. + * @default true + * @type Boolean + */ + oConfig.addProperty( + "clicktohide", + { + value: true, + validator: oConfig.checkBoolean + } + ); + + + /** + * @config container + * @description HTML element reference or string specifying the id + * attribute of the HTML element that the menu's markup should be + * rendered into. + * @type HTMLElement|String + * @default document.body + */ + oConfig.addProperty( + "container", + { + value:document.body, + handler:this.configContainer + } + ); + + + /** + * @config maxheight + * @description Defines the maximum height (in pixels) for a menu before the + * contents of the body are scrolled. + * @default 0 + * @type Number + */ + oConfig.addProperty( + "maxheight", + { + value: 0, + validator: oConfig.checkNumber, + handler: this.configMaxHeight + } + ); + + + /** + * @config classname + * @description CSS class to be applied to the menu's root + * <div> element. The specified class(es) are + * appended in addition to the default class as specified by the menu's + * CSS_CLASS_NAME constant. + * @default null + * @type String + */ + oConfig.addProperty( + "classname", + { + value: null, + handler: this.configClassName, + validator: this._checkString + } + ); + +} + +}); // END YAHOO.lang.extend + +})(); + + + +(function() { + +var Dom = YAHOO.util.Dom, + Module = YAHOO.widget.Module, + Menu = YAHOO.widget.Menu, + + m_oMenuItemElement = null, + m_oSubmenuIndicator = null, + m_oCheckedIndicator = null; + + +/** +* Creates an item for a menu. +* +* @param {String} p_oObject String specifying the text of the menu item. +* @param {HTMLLIElement} p_oObject Object specifying +* the <li> element of the menu item. +* @param {HTMLOptGroupElement} p_oObject Object +* specifying the <optgroup> element of the menu item. +* @param {HTMLOptionElement} p_oObject Object +* specifying the <option> element of the menu item. +* @param {Object} p_oConfig Optional. Object literal specifying the +* configuration for the menu item. See configuration class documentation +* for more details. +* @class MenuItem +* @constructor +*/ +YAHOO.widget.MenuItem = function(p_oObject, p_oConfig) { + + if(p_oObject) { + + if(p_oConfig) { + + this.parent = p_oConfig.parent; + this.value = p_oConfig.value; + this.id = p_oConfig.id; + + } + + this.init(p_oObject, p_oConfig); + + } + +}; + + +YAHOO.widget.MenuItem.prototype = { + + // Constants + + + /** + * @property SUBMENU_INDICATOR_IMAGE_PATH + * @description String representing the path to the image to be used for the + * menu item's submenu arrow indicator. + * @default "nt/ic/ut/alt1/menuarorght8_nrm_1.gif" + * @final + * @type String + * @deprecated All submenu indicator images are applied via a CSS + * background image. See "submenuindicator" class name in menu.css. + */ + SUBMENU_INDICATOR_IMAGE_PATH: "nt/ic/ut/alt1/menuarorght8_nrm_1.gif", + + + /** + * @property SELECTED_SUBMENU_INDICATOR_IMAGE_PATH + * @description String representing the path to the image to be used for the + * submenu arrow indicator when the menu item is selected. + * @default "nt/ic/ut/alt1/menuarorght8_hov_1.gif" + * @final + * @type String + * @deprecated All submenu indicator images are applied via a CSS + * background image. See "submenuindicator" class name in menu.css. + */ + SELECTED_SUBMENU_INDICATOR_IMAGE_PATH: + "nt/ic/ut/alt1/menuarorght8_hov_1.gif", + + + /** + * @property DISABLED_SUBMENU_INDICATOR_IMAGE_PATH + * @description String representing the path to the image to be used for the + * submenu arrow indicator when the menu item is disabled. + * @default "nt/ic/ut/alt1/menuarorght8_dim_1.gif" + * @final + * @type String + * @deprecated All submenu indicator images are applied via a CSS + * background image. See "submenuindicator" class name in menu.css. + */ + DISABLED_SUBMENU_INDICATOR_IMAGE_PATH: + "nt/ic/ut/alt1/menuarorght8_dim_1.gif", + + + /** + * @property COLLAPSED_SUBMENU_INDICATOR_ALT_TEXT + * @description String representing the alt text for the image to be used + * for the submenu arrow indicator. + * @default "Collapsed. Click to expand." + * @final + * @type String + * @deprecated Use COLLAPSED_SUBMENU_INDICATOR_TEXT. + */ + COLLAPSED_SUBMENU_INDICATOR_ALT_TEXT: "Collapsed. Click to expand.", + + + /** + * @property EXPANDED_SUBMENU_INDICATOR_ALT_TEXT + * @description String representing the alt text for the image to be used + * for the submenu arrow indicator when the submenu is visible. + * @default "Expanded. Click to collapse." + * @final + * @type String + * @deprecated Use EXPANDED_SUBMENU_INDICATOR_TEXT. + */ + EXPANDED_SUBMENU_INDICATOR_ALT_TEXT: "Expanded. Click to collapse.", + + + /** + * @property DISABLED_SUBMENU_INDICATOR_ALT_TEXT + * @description String representing the alt text for the image to be used + * for the submenu arrow indicator when the menu item is disabled. + * @default "Disabled." + * @final + * @type String + * @deprecated Use DISABLED_SUBMENU_INDICATOR_TEXT. + */ + DISABLED_SUBMENU_INDICATOR_ALT_TEXT: "Disabled.", + + + /** + * @property COLLAPSED_SUBMENU_INDICATOR_TEXT + * @description String representing the text for the <em> + * element used for the submenu arrow indicator. + * @default "Submenu collapsed. Click to expand submenu." + * @final + * @type String + */ + COLLAPSED_SUBMENU_INDICATOR_TEXT: + "Submenu collapsed. Click to expand submenu.", + + + /** + * @property EXPANDED_SUBMENU_INDICATOR_TEXT + * @description String representing the text for the submenu arrow indicator + * element (<em>) when the submenu is visible. + * @default "Submenu expanded. Click to collapse submenu." + * @final + * @type String + */ + EXPANDED_SUBMENU_INDICATOR_TEXT: + "Submenu expanded. Click to collapse submenu.", + + + /** + * @property DISABLED_SUBMENU_INDICATOR_TEXT + * @description String representing the text for the submenu arrow indicator + * element (<em>) when the menu item is disabled. + * @default "Submenu collapsed. (Item disabled.)." + * @final + * @type String + */ + DISABLED_SUBMENU_INDICATOR_TEXT: "Submenu collapsed. (Item disabled.)", + + + /** + * @property CHECKED_IMAGE_PATH + * @description String representing the path to the image to be used for + * the checked state. + * @default "nt/ic/ut/bsc/menuchk8_nrm_1.gif" + * @final + * @type String + * @deprecated All checked indicator images are applied via a CSS + * background image. See "checkedindicator" class name in menu.css. + */ + CHECKED_IMAGE_PATH: "nt/ic/ut/bsc/menuchk8_nrm_1.gif", + + + /** + * @property SELECTED_CHECKED_IMAGE_PATH + * @description String representing the path to the image to be used for + * the selected checked state. + * @default "nt/ic/ut/bsc/menuchk8_hov_1.gif" + * @final + * @type String + * @deprecated All checked indicator images are applied via a CSS + * background image. See "checkedindicator" class name in menu.css. + */ + SELECTED_CHECKED_IMAGE_PATH: "nt/ic/ut/bsc/menuchk8_hov_1.gif", + + + /** + * @property DISABLED_CHECKED_IMAGE_PATH + * @description String representing the path to the image to be used for + * the disabled checked state. + * @default "nt/ic/ut/bsc/menuchk8_dim_1.gif" + * @final + * @type String + * @deprecated All checked indicator images are applied via a CSS + * background image. + */ + DISABLED_CHECKED_IMAGE_PATH: "nt/ic/ut/bsc/menuchk8_dim_1.gif", + + + /** + * @property CHECKED_IMAGE_ALT_TEXT + * @description String representing the alt text for the image to be used + * for the checked image. + * @default "Checked." + * @final + * @type String + * @deprecated Use CHECKED_TEXT. + */ + CHECKED_IMAGE_ALT_TEXT: "Checked.", + + + /** + * @property DISABLED_CHECKED_IMAGE_ALT_TEXT + * @description String representing the alt text for the image to be used + * for the checked image when the item is disabled. + * @default "Checked. (Item disabled.)" + * @final + * @type String + * @deprecated Use DISABLED_CHECKED_TEXT. + */ + DISABLED_CHECKED_IMAGE_ALT_TEXT: "Checked. (Item disabled.)", + + + /** + * @property CHECKED_TEXT + * @description String representing the text to be used for the checked + * indicator element (<em>). + * @default "Checked." + * @final + * @type String + */ + CHECKED_TEXT: "Menu item checked.", + + + /** + * @property DISABLED_CHECKED_TEXT + * @description String representing the text to be used for the checked + * indicator element (<em>) when the menu item + * is disabled. + * @default "Checked. (Item disabled.)" + * @final + * @type String + */ + DISABLED_CHECKED_TEXT: "Checked. (Item disabled.)", + + + /** + * @property CSS_CLASS_NAME + * @description String representing the CSS class(es) to be applied to the + * <li> element of the menu item. + * @default "yuimenuitem" + * @final + * @type String + */ + CSS_CLASS_NAME: "yuimenuitem", + + + /** + * @property SUBMENU_TYPE + * @description Object representing the type of menu to instantiate and + * add when parsing the child nodes of the menu item's source HTML element. + * @final + * @type YAHOO.widget.Menu + */ + SUBMENU_TYPE: null, + + + /** + * @property IMG_ROOT + * @description String representing the prefix path to use for + * non-secure images. + * @default "http://us.i1.yimg.com/us.yimg.com/i/" + * @type String + * @deprecated All menu item images are now applied via CSS + * background images. + */ + IMG_ROOT: "http://us.i1.yimg.com/us.yimg.com/i/", + + + /** + * @property IMG_ROOT_SSL + * @description String representing the prefix path to use for securely + * served images. + * @default "https://a248.e.akamai.net/sec.yimg.com/i/" + * @type String + * @deprecated All menu item images are now applied via CSS + * background images. + */ + IMG_ROOT_SSL: "https://a248.e.akamai.net/sec.yimg.com/i/", + + + + // Private member variables + + + /** + * @property _oAnchor + * @description Object reference to the menu item's + * <a> element. + * @default null + * @private + * @type HTMLAnchorElement + */ + _oAnchor: null, + + + /** + * @property _oText + * @description Object reference to the menu item's text node. + * @default null + * @private + * @type TextNode + */ + _oText: null, + + + /** + * @property _oHelpTextEM + * @description Object reference to the menu item's help text + * <em> element. + * @default null + * @private + * @type HTMLElement + */ + _oHelpTextEM: null, + + + /** + * @property _oSubmenu + * @description Object reference to the menu item's submenu. + * @default null + * @private + * @type YAHOO.widget.Menu + */ + _oSubmenu: null, + + + /** + * @property _checkImage + * @description Object reference to the menu item's checkmark image. + * @default null + * @private + * @type HTMLImageElement + * @deprecated Use _oCheckedIndicator. + */ + _checkImage: null, + + + /** + * @property _oCheckedIndicator + * @description Object reference to the menu item's checkmark image. + * @default HTMLElement + * @private + * @type HTMLElement + */ + _oCheckedIndicator: null, + + + /** + * @property _oOnclickAttributeValue + * @description Object reference to the menu item's current value for the + * "onclick" configuration attribute. + * @default null + * @private + * @type Object + */ + _oOnclickAttributeValue: null, + + + /** + * @property _sClassName + * @description The current value of the "classname" configuration attribute. + * @default null + * @private + * @type String + */ + _sClassName: null, + + + + // Public properties + + + /** + * @property constructor + * @description Object reference to the menu item's constructor function. + * @default YAHOO.widget.MenuItem + * @type YAHOO.widget.MenuItem + */ + constructor: YAHOO.widget.MenuItem, + + + /** + * @property imageRoot + * @description String representing the root path for all of the menu + * item's images. + * @type String + * @deprecated All menu item images are now applied via CSS + * background images. + */ + imageRoot: null, + + + /** + * @property isSecure + * @description Boolean representing whether or not the current browsing + * context is secure (HTTPS). + * @type Boolean + * @deprecated All menu item images are now applied via CSS + * background images. + */ + isSecure: Module.prototype.isSecure, + + + /** + * @property index + * @description Number indicating the ordinal position of the menu item in + * its group. + * @default null + * @type Number + */ + index: null, + + + /** + * @property groupIndex + * @description Number indicating the index of the group to which the menu + * item belongs. + * @default null + * @type Number + */ + groupIndex: null, + + + /** + * @property parent + * @description Object reference to the menu item's parent menu. + * @default null + * @type YAHOO.widget.Menu + */ + parent: null, + + + /** + * @property element + * @description Object reference to the menu item's + * <li> element. + * @default HTMLLIElement + * @type HTMLLIElement + */ + element: null, + + + /** + * @property srcElement + * @description Object reference to the HTML element (either + * <li>, <optgroup> or + * <option>) used create the menu item. + * @default HTMLLIElement|HTMLOptGroupElement|HTMLOptionElement + * @type HTMLLIElement| + * HTMLOptGroupElement|HTMLOptionElement + */ + srcElement: null, + + + /** + * @property value + * @description Object reference to the menu item's value. + * @default null + * @type Object + */ + value: null, + + + /** + * @property submenuIndicator + * @description Object reference to the <em> element + * used to create the submenu indicator for the menu item. + * @default HTMLElement + * @type HTMLElement + */ + submenuIndicator: null, + + + /** + * @property browser + * @description String representing the browser. + * @type String + */ + browser: Module.prototype.browser, + + + /** + * @property id + * @description Id of the menu item's root <li> + * element. This property should be set via the constructor using the + * configuration object literal. If an id is not specified, then one will + * be created using the "generateId" method of the Dom utility. + * @default null + * @type String + */ + id: null, + + + + // Events + + + /** + * @event destroyEvent + * @description Fires when the menu item's <li> + * element is removed from its parent <ul> element. + * @type YAHOO.util.CustomEvent + */ + destroyEvent: null, + + + /** + * @event mouseOverEvent + * @description Fires when the mouse has entered the menu item. Passes + * back the DOM Event object as an argument. + * @type YAHOO.util.CustomEvent + */ + mouseOverEvent: null, + + + /** + * @event mouseOutEvent + * @description Fires when the mouse has left the menu item. Passes back + * the DOM Event object as an argument. + * @type YAHOO.util.CustomEvent + */ + mouseOutEvent: null, + + + /** + * @event mouseDownEvent + * @description Fires when the user mouses down on the menu item. Passes + * back the DOM Event object as an argument. + * @type YAHOO.util.CustomEvent + */ + mouseDownEvent: null, + + + /** + * @event mouseUpEvent + * @description Fires when the user releases a mouse button while the mouse + * is over the menu item. Passes back the DOM Event object as an argument. + * @type YAHOO.util.CustomEvent + */ + mouseUpEvent: null, + + + /** + * @event clickEvent + * @description Fires when the user clicks the on the menu item. Passes + * back the DOM Event object as an argument. + * @type YAHOO.util.CustomEvent + */ + clickEvent: null, + + + /** + * @event keyPressEvent + * @description Fires when the user presses an alphanumeric key when the + * menu item has focus. Passes back the DOM Event object as an argument. + * @type YAHOO.util.CustomEvent + */ + keyPressEvent: null, + + + /** + * @event keyDownEvent + * @description Fires when the user presses a key when the menu item has + * focus. Passes back the DOM Event object as an argument. + * @type YAHOO.util.CustomEvent + */ + keyDownEvent: null, + + + /** + * @event keyUpEvent + * @description Fires when the user releases a key when the menu item has + * focus. Passes back the DOM Event object as an argument. + * @type YAHOO.util.CustomEvent + */ + keyUpEvent: null, + + + /** + * @event focusEvent + * @description Fires when the menu item receives focus. + * @type YAHOO.util.CustomEvent + */ + focusEvent: null, + + + /** + * @event blurEvent + * @description Fires when the menu item loses the input focus. + * @type YAHOO.util.CustomEvent + */ + blurEvent: null, + + + /** + * @method init + * @description The MenuItem class's initialization method. This method is + * automatically called by the constructor, and sets up all DOM references + * for pre-existing markup, and creates required markup if it is not + * already present. + * @param {String} p_oObject String specifying the text of the menu item. + * @param {HTMLLIElement} p_oObject Object specifying + * the <li> element of the menu item. + * @param {HTMLOptGroupElement} p_oObject Object + * specifying the <optgroup> element of the menu item. + * @param {HTMLOptionElement} p_oObject Object + * specifying the <option> element of the menu item. + * @param {Object} p_oConfig Optional. Object literal specifying the + * configuration for the menu item. See configuration class documentation + * for more details. + */ + init: function(p_oObject, p_oConfig) { + + + if(!this.SUBMENU_TYPE) { + + this.SUBMENU_TYPE = Menu; + + } + + + // Create the config object + + this.cfg = new YAHOO.util.Config(this); + + this.initDefaultConfig(); + + var oConfig = this.cfg; + + + if(this._checkString(p_oObject)) { + + this._createRootNodeStructure(); + + oConfig.setProperty("text", p_oObject); + + } + else if(this._checkDOMNode(p_oObject)) { + + switch(p_oObject.tagName.toUpperCase()) { + + case "OPTION": + + this._createRootNodeStructure(); + + oConfig.setProperty("text", p_oObject.text); + + this.srcElement = p_oObject; + + break; + + case "OPTGROUP": + + this._createRootNodeStructure(); + + oConfig.setProperty("text", p_oObject.label); + + this.srcElement = p_oObject; + + this._initSubTree(); + + break; + + case "LI": + + // Get the anchor node (if it exists) + + var oAnchor = this._getFirstElement(p_oObject, "A"), + sURL = "#", + sTarget, + sText; + + + // Capture the "text" and/or the "URL" + + if(oAnchor) { + + sURL = oAnchor.getAttribute("href"); + sTarget = oAnchor.getAttribute("target"); + + if(oAnchor.innerText) { + + sText = oAnchor.innerText; + + } + else { + + var oRange = oAnchor.ownerDocument.createRange(); + + oRange.selectNodeContents(oAnchor); + + sText = oRange.toString(); + + } + + } + else { + + var oText = p_oObject.firstChild; + + sText = oText.nodeValue; + + oAnchor = document.createElement("a"); + + oAnchor.setAttribute("href", sURL); + + p_oObject.replaceChild(oAnchor, oText); + + oAnchor.appendChild(oText); + + } + + + this.srcElement = p_oObject; + this.element = p_oObject; + this._oAnchor = oAnchor; + + + // Check if emphasis has been applied to the MenuItem + + var oEmphasisNode = this._getFirstElement(oAnchor), + bEmphasis = false, + bStrongEmphasis = false; + + if(oEmphasisNode) { + + // Set a reference to the text node + + this._oText = oEmphasisNode.firstChild; + + switch(oEmphasisNode.tagName.toUpperCase()) { + + case "EM": + + bEmphasis = true; + + break; + + case "STRONG": + + bStrongEmphasis = true; + + break; + + } + + } + else { + + // Set a reference to the text node + + this._oText = oAnchor.firstChild; + + } + + + /* + Set these properties silently to sync up the + configuration object without making changes to the + element's DOM + */ + + oConfig.setProperty("text", sText, true); + oConfig.setProperty("url", sURL, true); + oConfig.setProperty("target", sTarget, true); + oConfig.setProperty("emphasis", bEmphasis, true); + oConfig.setProperty( + "strongemphasis", + bStrongEmphasis, + true + ); + + this._initSubTree(); + + break; + + } + + } + + + if(this.element) { + + var sId = this.element.id; + + if(!sId) { + + sId = this.id || Dom.generateId(); + + this.element.id = sId; + + } + + this.id = sId; + + + Dom.addClass(this.element, this.CSS_CLASS_NAME); + + + // Create custom events + + var CustomEvent = YAHOO.util.CustomEvent; + + this.destroyEvent = new CustomEvent("destroyEvent", this); + this.mouseOverEvent = new CustomEvent("mouseOverEvent", this); + this.mouseOutEvent = new CustomEvent("mouseOutEvent", this); + this.mouseDownEvent = new CustomEvent("mouseDownEvent", this); + this.mouseUpEvent = new CustomEvent("mouseUpEvent", this); + this.clickEvent = new CustomEvent("clickEvent", this); + this.keyPressEvent = new CustomEvent("keyPressEvent", this); + this.keyDownEvent = new CustomEvent("keyDownEvent", this); + this.keyUpEvent = new CustomEvent("keyUpEvent", this); + this.focusEvent = new CustomEvent("focusEvent", this); + this.blurEvent = new CustomEvent("blurEvent", this); + + + if(p_oConfig) { + + oConfig.applyConfig(p_oConfig); + + } + + oConfig.fireQueue(); + + + + + } + + }, + + + + // Private methods + + + /** + * @method _getFirstElement + * @description Returns an HTML element's first HTML element node. + * @private + * @param {HTMLElement} p_oElement Object + * reference specifying the element to be evaluated. + * @param {String} p_sTagName Optional. String specifying the tagname of + * the element to be retrieved. + * @return {HTMLElement} + */ + _getFirstElement: function(p_oElement, p_sTagName) { + + var oFirstChild = p_oElement.firstChild, + oElement; + + if(oFirstChild) { + + if(oFirstChild.nodeType == 1) { + + oElement = oFirstChild; + + } + else { + + var oNextSibling = oFirstChild.nextSibling; + + if(oNextSibling && oNextSibling.nodeType == 1) { + + oElement = oNextSibling; + + } + + } + + } + + + if(p_sTagName) { + + return (oElement && oElement.tagName.toUpperCase() == p_sTagName) ? + oElement : false; + + } + + return oElement; + + }, + + + /** + * @method _checkString + * @description Determines if an object is a string. + * @private + * @param {Object} p_oObject Object to be evaluated. + * @return {Boolean} + */ + _checkString: function(p_oObject) { + + return (typeof p_oObject == "string"); + + }, + + + /** + * @method _checkDOMNode + * @description Determines if an object is an HTML element. + * @private + * @param {Object} p_oObject Object to be evaluated. + * @return {Boolean} + */ + _checkDOMNode: function(p_oObject) { + + return (p_oObject && p_oObject.tagName); + + }, + + + /** + * @method _createRootNodeStructure + * @description Creates the core DOM structure for the menu item. + * @private + */ + _createRootNodeStructure: function () { + + if(!m_oMenuItemElement) { + + m_oMenuItemElement = document.createElement("li"); + m_oMenuItemElement.innerHTML = "s"; + + } + + this.element = m_oMenuItemElement.cloneNode(true); + this._oAnchor = this.element.firstChild; + this._oText = this._oAnchor.firstChild; + + this.element.appendChild(this._oAnchor); + + }, + + + /** + * @method _initSubTree + * @description Iterates the source element's childNodes collection and uses + * the child nodes to instantiate other menus. + * @private + */ + _initSubTree: function() { + + var oSrcEl = this.srcElement, + oConfig = this.cfg; + + + if(oSrcEl.childNodes.length > 0) { + + if( + this.parent.lazyLoad && + this.parent.srcElement && + this.parent.srcElement.tagName.toUpperCase() == "SELECT" + ) { + + oConfig.setProperty( + "submenu", + { id: Dom.generateId(), itemdata: oSrcEl.childNodes } + ); + + } + else { + + var oNode = oSrcEl.firstChild, + aOptions = []; + + do { + + if(oNode && oNode.tagName) { + + switch(oNode.tagName.toUpperCase()) { + + case "DIV": + + oConfig.setProperty("submenu", oNode); + + break; + + case "OPTION": + + aOptions[aOptions.length] = oNode; + + break; + + } + + } + + } + while((oNode = oNode.nextSibling)); + + + var nOptions = aOptions.length; + + if(nOptions > 0) { + + var oMenu = new this.SUBMENU_TYPE(Dom.generateId()); + + oConfig.setProperty("submenu", oMenu); + + for(var n=0; n 0) { + + oAnchor.setAttribute("target", sTarget); + + } + else { + + oAnchor.removeAttribute("target"); + + } + + }, + + + /** + * @method configEmphasis + * @description Event handler for when the "emphasis" configuration property + * of the menu item changes. + * @param {String} p_sType String representing the name of the event that + * was fired. + * @param {Array} p_aArgs Array of arguments sent when the event was fired. + * @param {YAHOO.widget.MenuItem} p_oItem Object representing the menu item + * that fired the event. + */ + configEmphasis: function(p_sType, p_aArgs, p_oItem) { + + var bEmphasis = p_aArgs[0], + oAnchor = this._oAnchor, + oText = this._oText, + oConfig = this.cfg, + oEM; + + + if(bEmphasis && oConfig.getProperty("strongemphasis")) { + + oConfig.setProperty("strongemphasis", false); + + } + + + if(oAnchor) { + + if(bEmphasis) { + + oEM = document.createElement("em"); + oEM.appendChild(oText); + + oAnchor.appendChild(oEM); + + } + else { + + oEM = this._getFirstElement(oAnchor, "EM"); + + if(oEM) { + + oAnchor.removeChild(oEM); + oAnchor.appendChild(oText); + + } + + } + + } + + }, + + + /** + * @method configStrongEmphasis + * @description Event handler for when the "strongemphasis" configuration + * property of the menu item changes. + * @param {String} p_sType String representing the name of the event that + * was fired. + * @param {Array} p_aArgs Array of arguments sent when the event was fired. + * @param {YAHOO.widget.MenuItem} p_oItem Object representing the menu item + * that fired the event. + */ + configStrongEmphasis: function(p_sType, p_aArgs, p_oItem) { + + var bStrongEmphasis = p_aArgs[0], + oAnchor = this._oAnchor, + oText = this._oText, + oConfig = this.cfg, + oStrong; + + if(bStrongEmphasis && oConfig.getProperty("emphasis")) { + + oConfig.setProperty("emphasis", false); + + } + + if(oAnchor) { + + if(bStrongEmphasis) { + + oStrong = document.createElement("strong"); + oStrong.appendChild(oText); + + oAnchor.appendChild(oStrong); + + } + else { + + oStrong = this._getFirstElement(oAnchor, "STRONG"); + + if(oStrong) { + + oAnchor.removeChild(oStrong); + oAnchor.appendChild(oText); + + } + + } + + } + + }, + + + /** + * @method configChecked + * @description Event handler for when the "checked" configuration property + * of the menu item changes. + * @param {String} p_sType String representing the name of the event that + * was fired. + * @param {Array} p_aArgs Array of arguments sent when the event was fired. + * @param {YAHOO.widget.MenuItem} p_oItem Object representing the menu item + * that fired the event. + */ + configChecked: function(p_sType, p_aArgs, p_oItem) { + + var bChecked = p_aArgs[0], + oEl = this.element, + oConfig = this.cfg, + oEM; + + + if(bChecked) { + + if(!m_oCheckedIndicator) { + + m_oCheckedIndicator = document.createElement("em"); + m_oCheckedIndicator.innerHTML = this.CHECKED_TEXT; + m_oCheckedIndicator.className = "checkedindicator"; + + } + + oEM = m_oCheckedIndicator.cloneNode(true); + + var oSubmenu = this.cfg.getProperty("submenu"); + + if(oSubmenu && oSubmenu.element) { + + oEl.insertBefore(oEM, oSubmenu.element); + + } + else { + + oEl.appendChild(oEM); + + } + + + Dom.addClass(oEl, "checked"); + + this._oCheckedIndicator = oEM; + + if(oConfig.getProperty("disabled")) { + + oConfig.refireEvent("disabled"); + + } + + if(oConfig.getProperty("selected")) { + + oConfig.refireEvent("selected"); + + } + + } + else { + + oEM = this._oCheckedIndicator; + + Dom.removeClass(oEl, "checked"); + + if(oEM) { + + oEl.removeChild(oEM); + + } + + this._oCheckedIndicator = null; + + } + + }, + + + + /** + * @method configDisabled + * @description Event handler for when the "disabled" configuration property + * of the menu item changes. + * @param {String} p_sType String representing the name of the event that + * was fired. + * @param {Array} p_aArgs Array of arguments sent when the event was fired. + * @param {YAHOO.widget.MenuItem} p_oItem Object representing the menu item + * that fired the event. + */ + configDisabled: function(p_sType, p_aArgs, p_oItem) { + + var bDisabled = p_aArgs[0], + oConfig = this.cfg, + oAnchor = this._oAnchor, + aNodes = [this.element, oAnchor], + oHelpText = this._oHelpTextEM, + oCheckedIndicator = this._oCheckedIndicator, + oSubmenuIndicator = this.submenuIndicator, + i = 1; + + + if(oHelpText) { + + i++; + aNodes[i] = oHelpText; + + } + + + if(oCheckedIndicator) { + + oCheckedIndicator.firstChild.nodeValue = bDisabled ? + this.DISABLED_CHECKED_TEXT : + this.CHECKED_TEXT; + + i++; + aNodes[i] = oCheckedIndicator; + + } + + + if(oSubmenuIndicator) { + + oSubmenuIndicator.firstChild.nodeValue = bDisabled ? + this.DISABLED_SUBMENU_INDICATOR_TEXT : + this.COLLAPSED_SUBMENU_INDICATOR_TEXT; + + i++; + aNodes[i] = oSubmenuIndicator; + + } + + + if(bDisabled) { + + if(oConfig.getProperty("selected")) { + + oConfig.setProperty("selected", false); + + } + + oAnchor.removeAttribute("href"); + + Dom.addClass(aNodes, "disabled"); + + } + else { + + oAnchor.setAttribute("href", oConfig.getProperty("url")); + + Dom.removeClass(aNodes, "disabled"); + + } + + }, + + + /** + * @method configSelected + * @description Event handler for when the "selected" configuration property + * of the menu item changes. + * @param {String} p_sType String representing the name of the event that + * was fired. + * @param {Array} p_aArgs Array of arguments sent when the event was fired. + * @param {YAHOO.widget.MenuItem} p_oItem Object representing the menu item + * that fired the event. + */ + configSelected: function(p_sType, p_aArgs, p_oItem) { + + if(!this.cfg.getProperty("disabled")) { + + var bSelected = p_aArgs[0], + oHelpText = this._oHelpTextEM, + oSubmenuIndicator = this.submenuIndicator, + oCheckedIndicator = this._oCheckedIndicator, + aNodes = [this.element, this._oAnchor], + i = 1; + + + if(oHelpText) { + + i++; + aNodes[i] = oHelpText; + + } + + + if(oSubmenuIndicator) { + + i++; + aNodes[i] = oSubmenuIndicator; + + } + + + if(oCheckedIndicator) { + + i++; + aNodes[i] = oCheckedIndicator; + + } + + + if(bSelected) { + + Dom.addClass(aNodes, "selected"); + + } + else { + + Dom.removeClass(aNodes, "selected"); + + } + + } + + }, + + + /** + * @method configSubmenu + * @description Event handler for when the "submenu" configuration property + * of the menu item changes. + * @param {String} p_sType String representing the name of the event that + * was fired. + * @param {Array} p_aArgs Array of arguments sent when the event was fired. + * @param {YAHOO.widget.MenuItem} p_oItem Object representing the menu item + * that fired the event. + */ + configSubmenu: function(p_sType, p_aArgs, p_oItem) { + + var oEl = this.element, + oSubmenu = p_aArgs[0], + oSubmenuIndicator = this.submenuIndicator, + oConfig = this.cfg, + aNodes = [this.element, this._oAnchor], + bLazyLoad = this.parent && this.parent.lazyLoad, + oMenu; + + + if(oSubmenu) { + + if(oSubmenu instanceof Menu) { + + oMenu = oSubmenu; + oMenu.parent = this; + oMenu.lazyLoad = bLazyLoad; + + } + else if( + typeof oSubmenu == "object" && + oSubmenu.id && + !oSubmenu.nodeType + ) { + + var sSubmenuId = oSubmenu.id, + oSubmenuConfig = oSubmenu; + + oSubmenuConfig.lazyload = bLazyLoad; + oSubmenuConfig.parent = this; + + oMenu = new this.SUBMENU_TYPE(sSubmenuId, oSubmenuConfig); + + + // Set the value of the property to the Menu instance + + this.cfg.setProperty("submenu", oMenu, true); + + } + else { + + oMenu = new this.SUBMENU_TYPE( + oSubmenu, + { lazyload: bLazyLoad, parent: this } + ); + + + // Set the value of the property to the Menu instance + + this.cfg.setProperty("submenu", oMenu, true); + + } + + + if(oMenu) { + + this._oSubmenu = oMenu; + + + if(!oSubmenuIndicator) { + + + if(!m_oSubmenuIndicator) { + + m_oSubmenuIndicator = document.createElement("em"); + m_oSubmenuIndicator.innerHTML = + this.COLLAPSED_SUBMENU_INDICATOR_TEXT; + m_oSubmenuIndicator.className = "submenuindicator"; + + } + + + oSubmenuIndicator = m_oSubmenuIndicator.cloneNode(true); + + + if(oMenu.element.parentNode == oEl) { + + if(this.browser == "opera") { + + oEl.appendChild(oSubmenuIndicator); + + oMenu.renderEvent.subscribe(function() { + + oSubmenuIndicator.parentNode.insertBefore( + oSubmenuIndicator, + oMenu.element + ); + + }); + + } + else { + + oEl.insertBefore(oSubmenuIndicator, oMenu.element); + + } + + } + else { + + oEl.appendChild(oSubmenuIndicator); + + } + + this.submenuIndicator = oSubmenuIndicator; + + } + + + Dom.addClass(aNodes, "hassubmenu"); + + + if(oConfig.getProperty("disabled")) { + + oConfig.refireEvent("disabled"); + + } + + if(oConfig.getProperty("selected")) { + + oConfig.refireEvent("selected"); + + } + + } + + } + else { + + Dom.removeClass(aNodes, "hassubmenu"); + + if(oSubmenuIndicator) { + + oEl.removeChild(oSubmenuIndicator); + + } + + if(this._oSubmenu) { + + this._oSubmenu.destroy(); + + } + + } + + }, + + + /** + * @method configOnClick + * @description Event handler for when the "onclick" configuration property + * of the menu item changes. + * @param {String} p_sType String representing the name of the event that + * was fired. + * @param {Array} p_aArgs Array of arguments sent when the event was fired. + * @param {YAHOO.widget.MenuItem} p_oItem Object representing the menu item + * that fired the event. + */ + configOnClick: function(p_sType, p_aArgs, p_oItem) { + + var oObject = p_aArgs[0]; + + /* + Remove any existing listeners if a "click" event handler has + already been specified. + */ + + if( + this._oOnclickAttributeValue && + (this._oOnclickAttributeValue != oObject) + ) { + + this.clickEvent.unsubscribe( + this._oOnclickAttributeValue.fn, + this._oOnclickAttributeValue.obj + ); + + this._oOnclickAttributeValue = null; + + } + + + if( + !this._oOnclickAttributeValue && + typeof oObject == "object" && + typeof oObject.fn == "function" + ) { + + this.clickEvent.subscribe( + oObject.fn, + (oObject.obj || this), + oObject.scope + ); + + this._oOnclickAttributeValue = oObject; + + } + + }, + + + /** + * @method configClassName + * @description Event handler for when the "classname" configuration + * property of a menu item changes. + * @param {String} p_sType String representing the name of the event that + * was fired. + * @param {Array} p_aArgs Array of arguments sent when the event was fired. + * @param {YAHOO.widget.MenuItem} p_oItem Object representing the menu item + * that fired the event. + */ + configClassName: function(p_sType, p_aArgs, p_oItem) { + + var sClassName = p_aArgs[0]; + + if(this._sClassName) { + + Dom.removeClass(this.element, this._sClassName); + + } + + Dom.addClass(this.element, sClassName); + this._sClassName = sClassName; + + }, + + + + // Public methods + + + /** + * @method initDefaultConfig + * @description Initializes an item's configurable properties. + */ + initDefaultConfig : function() { + + var oConfig = this.cfg, + CheckBoolean = oConfig.checkBoolean; + + + // Define the configuration attributes + + /** + * @config text + * @description String specifying the text label for the menu item. + * When building a menu from existing HTML the value of this property + * will be interpreted from the menu's markup. + * @default "" + * @type String + */ + oConfig.addProperty( + "text", + { + value: "", + handler: this.configText, + validator: this._checkString, + suppressEvent: true + } + ); + + + /** + * @config helptext + * @description String specifying additional instructional text to + * accompany the text for the nenu item. + * @default null + * @type String| + * HTMLElement + */ + oConfig.addProperty("helptext", { handler: this.configHelpText }); + + + /** + * @config url + * @description String specifying the URL for the menu item's anchor's + * "href" attribute. When building a menu from existing HTML the value + * of this property will be interpreted from the menu's markup. + * @default "#" + * @type String + */ + oConfig.addProperty( + "url", + { value: "#", handler: this.configURL, suppressEvent: true } + ); + + + /** + * @config target + * @description String specifying the value for the "target" attribute + * of the menu item's anchor element. Specifying a target will + * require the user to click directly on the menu item's anchor node in + * order to cause the browser to navigate to the specified URL. + * When building a menu from existing HTML the value of this property + * will be interpreted from the menu's markup. + * @default null + * @type String + */ + oConfig.addProperty( + "target", + { handler: this.configTarget, suppressEvent: true } + ); + + + /** + * @config emphasis + * @description Boolean indicating if the text of the menu item will be + * rendered with emphasis. When building a menu from existing HTML the + * value of this property will be interpreted from the menu's markup. + * @default false + * @type Boolean + */ + oConfig.addProperty( + "emphasis", + { + value: false, + handler: this.configEmphasis, + validator: CheckBoolean, + suppressEvent: true + } + ); + + + /** + * @config strongemphasis + * @description Boolean indicating if the text of the menu item will be + * rendered with strong emphasis. When building a menu from existing + * HTML the value of this property will be interpreted from the + * menu's markup. + * @default false + * @type Boolean + */ + oConfig.addProperty( + "strongemphasis", + { + value: false, + handler: this.configStrongEmphasis, + validator: CheckBoolean, + suppressEvent: true + } + ); + + + /** + * @config checked + * @description Boolean indicating if the menu item should be rendered + * with a checkmark. + * @default false + * @type Boolean + */ + oConfig.addProperty( + "checked", + { + value: false, + handler: this.configChecked, + validator: this.cfg.checkBoolean, + suppressEvent: true, + supercedes:["disabled"] + } + ); + + + /** + * @config disabled + * @description Boolean indicating if the menu item should be disabled. + * (Disabled menu items are dimmed and will not respond to user input + * or fire events.) + * @default false + * @type Boolean + */ + oConfig.addProperty( + "disabled", + { + value: false, + handler: this.configDisabled, + validator: CheckBoolean, + suppressEvent: true + } + ); + + + /** + * @config selected + * @description Boolean indicating if the menu item should + * be highlighted. + * @default false + * @type Boolean + */ + oConfig.addProperty( + "selected", + { + value: false, + handler: this.configSelected, + validator: CheckBoolean, + suppressEvent: true + } + ); + + + /** + * @config submenu + * @description Object specifying the submenu to be appended to the + * menu item. The value can be one of the following:
    • Object + * specifying a Menu instance.
    • Object literal specifying the + * menu to be created. Format: { id: [menu id], itemdata: + * [array of values for + * items] }.
    • String specifying the id attribute + * of the <div> element of the menu.
    • + * Object specifying the <div> element of the + * menu.
    + * @default null + * @type Menu|String|Object| + * HTMLElement + */ + oConfig.addProperty("submenu", { handler: this.configSubmenu }); + + + /** + * @config onclick + * @description Object literal representing the code to be executed when + * the button is clicked. Format:
    {
    + * fn: Function, // The handler to call when + * the event fires.
    obj: Object, // An + * object to pass back to the handler.
    scope: + * Object // The object to use for the scope of the handler. + *
    }
    + * @type Object + * @default null + */ + oConfig.addProperty("onclick", { handler: this.configOnClick }); + + + /** + * @config classname + * @description CSS class to be applied to the menu item's root + * <li> element. The specified class(es) are + * appended in addition to the default class as specified by the menu + * item's CSS_CLASS_NAME constant. + * @default null + * @type String + */ + oConfig.addProperty( + "classname", + { + value: null, + handler: this.configClassName, + validator: this._checkString + } + ); + + }, + + + /** + * @method getNextEnabledSibling + * @description Finds the menu item's next enabled sibling. + * @return YAHOO.widget.MenuItem + */ + getNextEnabledSibling: function() { + + if(this.parent instanceof Menu) { + + var nGroupIndex = this.groupIndex; + + function getNextArrayItem(p_aArray, p_nStartIndex) { + + return p_aArray[p_nStartIndex] || + getNextArrayItem(p_aArray, (p_nStartIndex+1)); + + } + + + var aItemGroups = this.parent.getItemGroups(), + oNextItem; + + + if(this.index < (aItemGroups[nGroupIndex].length - 1)) { + + oNextItem = getNextArrayItem( + aItemGroups[nGroupIndex], + (this.index+1) + ); + + } + else { + + var nNextGroupIndex; + + if(nGroupIndex < (aItemGroups.length - 1)) { + + nNextGroupIndex = nGroupIndex + 1; + + } + else { + + nNextGroupIndex = 0; + + } + + var aNextGroup = getNextArrayItem(aItemGroups, nNextGroupIndex); + + // Retrieve the first menu item in the next group + + oNextItem = getNextArrayItem(aNextGroup, 0); + + } + + return ( + oNextItem.cfg.getProperty("disabled") || + oNextItem.element.style.display == "none" + ) ? + oNextItem.getNextEnabledSibling() : oNextItem; + + } + + }, + + + /** + * @method getPreviousEnabledSibling + * @description Finds the menu item's previous enabled sibling. + * @return {YAHOO.widget.MenuItem} + */ + getPreviousEnabledSibling: function() { + + if(this.parent instanceof Menu) { + + var nGroupIndex = this.groupIndex; + + function getPreviousArrayItem(p_aArray, p_nStartIndex) { + + return p_aArray[p_nStartIndex] || + getPreviousArrayItem(p_aArray, (p_nStartIndex-1)); + + } + + function getFirstItemIndex(p_aArray, p_nStartIndex) { + + return p_aArray[p_nStartIndex] ? + p_nStartIndex : + getFirstItemIndex(p_aArray, (p_nStartIndex+1)); + + } + + var aItemGroups = this.parent.getItemGroups(), + oPreviousItem; + + if( + this.index > getFirstItemIndex(aItemGroups[nGroupIndex], 0) + ) { + + oPreviousItem = + getPreviousArrayItem( + aItemGroups[nGroupIndex], + (this.index-1) + ); + + } + else { + + var nPreviousGroupIndex; + + if(nGroupIndex > getFirstItemIndex(aItemGroups, 0)) { + + nPreviousGroupIndex = nGroupIndex - 1; + + } + else { + + nPreviousGroupIndex = aItemGroups.length - 1; + + } + + var aPreviousGroup = + getPreviousArrayItem(aItemGroups, nPreviousGroupIndex); + + oPreviousItem = + getPreviousArrayItem( + aPreviousGroup, + (aPreviousGroup.length - 1) + ); + + } + + return ( + oPreviousItem.cfg.getProperty("disabled") || + oPreviousItem.element.style.display == "none" + ) ? + oPreviousItem.getPreviousEnabledSibling() : oPreviousItem; + + } + + }, + + + /** + * @method focus + * @description Causes the menu item to receive the focus and fires the + * focus event. + */ + focus: function() { + + var oParent = this.parent, + oAnchor = this._oAnchor, + oActiveItem = oParent.activeItem; + + + function setFocus() { + + try { + + oAnchor.focus(); + + } + catch(e) { + + } + + } + + + if( + !this.cfg.getProperty("disabled") && + oParent && + oParent.cfg.getProperty("visible") && + this.element.style.display != "none" + ) { + + if(oActiveItem) { + + oActiveItem.blur(); + + } + + + /* + Setting focus via a timer fixes a race condition in Firefox, IE + and Opera where the browser viewport jumps as it trys to + position and focus the menu. + */ + + window.setTimeout(setFocus, 0); + + this.focusEvent.fire(); + + } + + }, + + + /** + * @method blur + * @description Causes the menu item to lose focus and fires the + * onblur event. + */ + blur: function() { + + var oParent = this.parent; + + if( + !this.cfg.getProperty("disabled") && + oParent && + Dom.getStyle(oParent.element, "visibility") == "visible" + ) { + + this._oAnchor.blur(); + + this.blurEvent.fire(); + + } + + }, + + + /** + * @method destroy + * @description Removes the menu item's <li> element + * from its parent <ul> element. + */ + destroy: function() { + + var oEl = this.element; + + if(oEl) { + + + // If the item has a submenu, destroy it first + + var oSubmenu = this.cfg.getProperty("submenu"); + + if(oSubmenu) { + + oSubmenu.destroy(); + + } + + + // Remove CustomEvent listeners + + this.mouseOverEvent.unsubscribeAll(); + this.mouseOutEvent.unsubscribeAll(); + this.mouseDownEvent.unsubscribeAll(); + this.mouseUpEvent.unsubscribeAll(); + this.clickEvent.unsubscribeAll(); + this.keyPressEvent.unsubscribeAll(); + this.keyDownEvent.unsubscribeAll(); + this.keyUpEvent.unsubscribeAll(); + this.focusEvent.unsubscribeAll(); + this.blurEvent.unsubscribeAll(); + this.cfg.configChangedEvent.unsubscribeAll(); + + + // Remove the element from the parent node + + var oParentNode = oEl.parentNode; + + if(oParentNode) { + + oParentNode.removeChild(oEl); + + this.destroyEvent.fire(); + + } + + this.destroyEvent.unsubscribeAll(); + + } + + }, + + + /** + * @method toString + * @description Returns a string representing the menu item. + * @return {String} + */ + toString: function() { + + return ("MenuItem: " + this.cfg.getProperty("text")); + + } + +}; + +})(); + + + +/** +* Creates a list of options or commands which are made visible in response to +* an HTML element's "contextmenu" event ("mousedown" for Opera). +* +* @param {String} p_oElement String specifying the id attribute of the +* <div> element of the context menu. +* @param {String} p_oElement String specifying the id attribute of the +* <select> element to be used as the data source for the +* context menu. +* @param {HTMLDivElement} p_oElement Object specifying the +* <div> element of the context menu. +* @param {HTMLSelectElement} p_oElement Object specifying +* the <select> element to be used as the data source for +* the context menu. +* @param {Object} p_oConfig Optional. Object literal specifying the +* configuration for the context menu. See configuration class documentation +* for more details. +* @class ContextMenu +* @constructor +* @extends YAHOO.widget.Menu +* @namespace YAHOO.widget +*/ +YAHOO.widget.ContextMenu = function(p_oElement, p_oConfig) { + + YAHOO.widget.ContextMenu.superclass.constructor.call( + this, + p_oElement, + p_oConfig + ); + +}; + + +YAHOO.lang.extend(YAHOO.widget.ContextMenu, YAHOO.widget.Menu, { + + + +// Private properties + + +/** +* @property _oTrigger +* @description Object reference to the current value of the "trigger" +* configuration property. +* @default null +* @private +* @type String|HTMLElement|Array +*/ +_oTrigger: null, + + +/** +* @property _bCancelled +* @description Boolean indicating if the display of the context menu should +* be cancelled. +* @default false +* @private +* @type Boolean +*/ +_bCancelled: false, + + +// Public properties + + +/** +* @property contextEventTarget +* @description Object reference for the HTML element that was the target of the +* "contextmenu" DOM event ("mousedown" for Opera) that triggered the display of +* the context menu. +* @default null +* @type HTMLElement +*/ +contextEventTarget: null, + + + +// Events + + +/** +* @event triggerContextMenuEvent +* @description Custom Event wrapper for the "contextmenu" DOM event +* ("mousedown" for Opera) fired by the element(s) that trigger the display of +* the context menu. +*/ +triggerContextMenuEvent: null, + + + + + +/** +* @method init +* @description The ContextMenu class's initialization method. This method is +* automatically called by the constructor, and sets up all DOM references for +* pre-existing markup, and creates required markup if it is not already present. +* @param {String} p_oElement String specifying the id attribute of the +* <div> element of the context menu. +* @param {String} p_oElement String specifying the id attribute of the +* <select> element to be used as the data source for +* the context menu. +* @param {HTMLDivElement} p_oElement Object specifying the +* <div> element of the context menu. +* @param {HTMLSelectElement} p_oElement Object specifying +* the <select> element to be used as the data source for +* the context menu. +* @param {Object} p_oConfig Optional. Object literal specifying the +* configuration for the context menu. See configuration class documentation +* for more details. +*/ +init: function(p_oElement, p_oConfig) { + + if(!this.ITEM_TYPE) { + + this.ITEM_TYPE = YAHOO.widget.ContextMenuItem; + + } + + + // Call the init of the superclass (YAHOO.widget.Menu) + + YAHOO.widget.ContextMenu.superclass.init.call(this, p_oElement); + + + this.beforeInitEvent.fire(YAHOO.widget.ContextMenu); + + + if(p_oConfig) { + + this.cfg.applyConfig(p_oConfig, true); + + } + + + this.initEvent.fire(YAHOO.widget.ContextMenu); + +}, + + +/** +* @method initEvents +* @description Initializes the custom events for the context menu. +*/ +initEvents: function() { + + YAHOO.widget.ContextMenu.superclass.initEvents.call(this); + + // Create custom events + + this.triggerContextMenuEvent = + new YAHOO.util.CustomEvent("triggerContextMenuEvent", this); + +}, + + +/** +* @method cancel +* @description Cancels the display of the context menu. +*/ +cancel: function() { + + this._bCancelled = true; + +}, + + + +// Private methods + + +/** +* @method _removeEventHandlers +* @description Removes all of the DOM event handlers from the HTML element(s) +* whose "context menu" event ("click" for Opera) trigger the display of +* the context menu. +* @private +*/ +_removeEventHandlers: function() { + + var Event = YAHOO.util.Event, + oTrigger = this._oTrigger, + bOpera = (this.browser == "opera"); + + + // Remove the event handlers from the trigger(s) + + Event.removeListener( + oTrigger, + (bOpera ? "mousedown" : "contextmenu"), + this._onTriggerContextMenu + ); + + if(bOpera) { + + Event.removeListener(oTrigger, "click", this._onTriggerClick); + + } + +}, + + + +// Private event handlers + + +/** +* @method _onTriggerClick +* @description "click" event handler for the HTML element(s) identified as the +* "trigger" for the context menu. Used to cancel default behaviors in Opera. +* @private +* @param {Event} p_oEvent Object representing the DOM event object passed back +* by the event utility (YAHOO.util.Event). +* @param {YAHOO.widget.ContextMenu} p_oMenu Object representing the context +* menu that is handling the event. +*/ +_onTriggerClick: function(p_oEvent, p_oMenu) { + + if(p_oEvent.ctrlKey) { + + YAHOO.util.Event.stopEvent(p_oEvent); + + } + +}, + + +/** +* @method _onTriggerContextMenu +* @description "contextmenu" event handler ("mousedown" for Opera) for the HTML +* element(s) that trigger the display of the context menu. +* @private +* @param {Event} p_oEvent Object representing the DOM event object passed back +* by the event utility (YAHOO.util.Event). +* @param {YAHOO.widget.ContextMenu} p_oMenu Object representing the context +* menu that is handling the event. +*/ +_onTriggerContextMenu: function(p_oEvent, p_oMenu) { + + var Event = YAHOO.util.Event; + + if(p_oEvent.type == "mousedown" && !p_oEvent.ctrlKey) { + + return; + + } + + + /* + Prevent the browser's default context menu from appearing and + stop the propagation of the "contextmenu" event so that + other ContextMenu instances are not displayed. + */ + + Event.stopEvent(p_oEvent); + + + // Hide any other ContextMenu instances that might be visible + + YAHOO.widget.MenuManager.hideVisible(); + + + this.contextEventTarget = Event.getTarget(p_oEvent); + + this.triggerContextMenuEvent.fire(p_oEvent); + + + if(!this._bCancelled) { + + // Position and display the context menu + + this.cfg.setProperty("xy", Event.getXY(p_oEvent)); + + this.show(); + + } + + this._bCancelled = false; + +}, + + + +// Public methods + + +/** +* @method toString +* @description Returns a string representing the context menu. +* @return {String} +*/ +toString: function() { + + return ("ContextMenu " + this.id); + +}, + + +/** +* @method initDefaultConfig +* @description Initializes the class's configurable properties which can be +* changed using the context menu's Config object ("cfg"). +*/ +initDefaultConfig: function() { + + YAHOO.widget.ContextMenu.superclass.initDefaultConfig.call(this); + + /** + * @config trigger + * @description The HTML element(s) whose "contextmenu" event ("mousedown" + * for Opera) trigger the display of the context menu. Can be a string + * representing the id attribute of the HTML element, an object reference + * for the HTML element, or an array of strings or HTML element references. + * @default null + * @type String|HTMLElement|Array + */ + this.cfg.addProperty("trigger", { handler: this.configTrigger }); + +}, + + +/** +* @method destroy +* @description Removes the context menu's <div> element +* (and accompanying child nodes) from the document. +*/ +destroy: function() { + + // Remove the DOM event handlers from the current trigger(s) + + this._removeEventHandlers(); + + + // Continue with the superclass implementation of this method + + YAHOO.widget.ContextMenu.superclass.destroy.call(this); + +}, + + + +// Public event handlers for configuration properties + + +/** +* @method configTrigger +* @description Event handler for when the value of the "trigger" configuration +* property changes. +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.ContextMenu} p_oMenu Object representing the context +* menu that fired the event. +*/ +configTrigger: function(p_sType, p_aArgs, p_oMenu) { + + var Event = YAHOO.util.Event, + oTrigger = p_aArgs[0]; + + if(oTrigger) { + + /* + If there is a current "trigger" - remove the event handlers + from that element(s) before assigning new ones + */ + + if(this._oTrigger) { + + this._removeEventHandlers(); + + } + + this._oTrigger = oTrigger; + + + /* + Listen for the "mousedown" event in Opera b/c it does not + support the "contextmenu" event + */ + + var bOpera = (this.browser == "opera"); + + Event.addListener( + oTrigger, + (bOpera ? "mousedown" : "contextmenu"), + this._onTriggerContextMenu, + this, + true + ); + + + /* + Assign a "click" event handler to the trigger element(s) for + Opera to prevent default browser behaviors. + */ + + if(bOpera) { + + Event.addListener( + oTrigger, + "click", + this._onTriggerClick, + this, + true + ); + + } + + } + else { + + this._removeEventHandlers(); + + } + +} + +}); // END YAHOO.lang.extend + + + +/** +* Creates an item for a context menu. +* +* @param {String} p_oObject String specifying the text of the context menu item. +* @param {HTMLLIElement} p_oObject Object specifying the +* <li> element of the context menu item. +* @param {HTMLOptGroupElement} p_oObject Object +* specifying the <optgroup> element of the context +* menu item. +* @param {HTMLOptionElement} p_oObject Object specifying +* the <option> element of the context menu item. +* @param {Object} p_oConfig Optional. Object literal specifying the +* configuration for the context menu item. See configuration class +* documentation for more details. +* @class ContextMenuItem +* @constructor +* @extends YAHOO.widget.MenuItem +*/ +YAHOO.widget.ContextMenuItem = function(p_oObject, p_oConfig) { + + YAHOO.widget.ContextMenuItem.superclass.constructor.call( + this, + p_oObject, + p_oConfig + ); + +}; + +YAHOO.lang.extend(YAHOO.widget.ContextMenuItem, YAHOO.widget.MenuItem, { + + +/** +* @method init +* @description The ContextMenuItem class's initialization method. This method +* is automatically called by the constructor, and sets up all DOM references +* for pre-existing markup, and creates required markup if it is not +* already present. +* @param {String} p_oObject String specifying the text of the context menu item. +* @param {HTMLLIElement} p_oObject Object specifying the +* <li> element of the context menu item. +* @param {HTMLOptGroupElement} p_oObject Object +* specifying the <optgroup> element of the context +* menu item. +* @param {HTMLOptionElement} p_oObject Object specifying +* the <option> element of the context menu item. +* @param {Object} p_oConfig Optional. Object literal specifying the +* configuration for the context menu item. See configuration class +* documentation for more details. +*/ +init: function(p_oObject, p_oConfig) { + + if(!this.SUBMENU_TYPE) { + + this.SUBMENU_TYPE = YAHOO.widget.ContextMenu; + + } + + + /* + Call the init of the superclass (YAHOO.widget.MenuItem) + Note: We don't pass the user config in here yet + because we only want it executed once, at the lowest + subclass level. + */ + + YAHOO.widget.ContextMenuItem.superclass.init.call(this, p_oObject); + + var oConfig = this.cfg; + + if(p_oConfig) { + + oConfig.applyConfig(p_oConfig, true); + + } + + oConfig.fireQueue(); + +}, + + + +// Public methods + + +/** +* @method toString +* @description Returns a string representing the context menu item. +* @return {String} +*/ +toString: function() { + + return ("ContextMenuItem: " + this.cfg.getProperty("text")); + +} + +}); // END YAHOO.lang.extend + + + +/** +* Horizontal collection of items, each of which can contain a submenu. +* +* @param {String} p_oElement String specifying the id attribute of the +* <div> element of the menu bar. +* @param {String} p_oElement String specifying the id attribute of the +* <select> element to be used as the data source for the +* menu bar. +* @param {HTMLDivElement} p_oElement Object specifying +* the <div> element of the menu bar. +* @param {HTMLSelectElement} p_oElement Object +* specifying the <select> element to be used as the data +* source for the menu bar. +* @param {Object} p_oConfig Optional. Object literal specifying the +* configuration for the menu bar. See configuration class documentation for +* more details. +* @class Menubar +* @constructor +* @extends YAHOO.widget.Menu +* @namespace YAHOO.widget +*/ +YAHOO.widget.MenuBar = function(p_oElement, p_oConfig) { + + YAHOO.widget.MenuBar.superclass.constructor.call( + this, + p_oElement, + p_oConfig + ); + +}; + +YAHOO.lang.extend(YAHOO.widget.MenuBar, YAHOO.widget.Menu, { + +/** +* @method init +* @description The MenuBar class's initialization method. This method is +* automatically called by the constructor, and sets up all DOM references for +* pre-existing markup, and creates required markup if it is not already present. +* @param {String} p_oElement String specifying the id attribute of the +* <div> element of the menu bar. +* @param {String} p_oElement String specifying the id attribute of the +* <select> element to be used as the data source for the +* menu bar. +* @param {HTMLDivElement} p_oElement Object specifying +* the <div> element of the menu bar. +* @param {HTMLSelectElement} p_oElement Object +* specifying the <select> element to be used as the data +* source for the menu bar. +* @param {Object} p_oConfig Optional. Object literal specifying the +* configuration for the menu bar. See configuration class documentation for +* more details. +*/ +init: function(p_oElement, p_oConfig) { + + if(!this.ITEM_TYPE) { + + this.ITEM_TYPE = YAHOO.widget.MenuBarItem; + + } + + + // Call the init of the superclass (YAHOO.widget.Menu) + + YAHOO.widget.MenuBar.superclass.init.call(this, p_oElement); + + + this.beforeInitEvent.fire(YAHOO.widget.MenuBar); + + + if(p_oConfig) { + + this.cfg.applyConfig(p_oConfig, true); + + } + + this.initEvent.fire(YAHOO.widget.MenuBar); + +}, + + + +// Constants + + +/** +* @property CSS_CLASS_NAME +* @description String representing the CSS class(es) to be applied to the menu +* bar's <div> element. +* @default "yuimenubar" +* @final +* @type String +*/ +CSS_CLASS_NAME: "yuimenubar", + + + +// Protected event handlers + + +/** +* @method _onKeyDown +* @description "keydown" Custom Event handler for the menu bar. +* @private +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.MenuBar} p_oMenuBar Object representing the menu bar +* that fired the event. +*/ +_onKeyDown: function(p_sType, p_aArgs, p_oMenuBar) { + + var Event = YAHOO.util.Event, + oEvent = p_aArgs[0], + oItem = p_aArgs[1], + oSubmenu; + + + if(oItem && !oItem.cfg.getProperty("disabled")) { + + var oItemCfg = oItem.cfg; + + switch(oEvent.keyCode) { + + case 37: // Left arrow + case 39: // Right arrow + + if( + oItem == this.activeItem && + !oItemCfg.getProperty("selected") + ) { + + oItemCfg.setProperty("selected", true); + + } + else { + + var oNextItem = (oEvent.keyCode == 37) ? + oItem.getPreviousEnabledSibling() : + oItem.getNextEnabledSibling(); + + if(oNextItem) { + + this.clearActiveItem(); + + oNextItem.cfg.setProperty("selected", true); + + + if(this.cfg.getProperty("autosubmenudisplay")) { + + oSubmenu = oNextItem.cfg.getProperty("submenu"); + + if(oSubmenu) { + + oSubmenu.show(); + oSubmenu.activeItem.blur(); + oSubmenu.activeItem = null; + + } + + } + + oNextItem.focus(); + + } + + } + + Event.preventDefault(oEvent); + + break; + + case 40: // Down arrow + + if(this.activeItem != oItem) { + + this.clearActiveItem(); + + oItemCfg.setProperty("selected", true); + oItem.focus(); + + } + + oSubmenu = oItemCfg.getProperty("submenu"); + + if(oSubmenu) { + + if(oSubmenu.cfg.getProperty("visible")) { + + oSubmenu.setInitialSelection(); + oSubmenu.setInitialFocus(); + + } + else { + + oSubmenu.show(); + + } + + } + + Event.preventDefault(oEvent); + + break; + + } + + } + + + if(oEvent.keyCode == 27 && this.activeItem) { // Esc key + + oSubmenu = this.activeItem.cfg.getProperty("submenu"); + + if(oSubmenu && oSubmenu.cfg.getProperty("visible")) { + + oSubmenu.hide(); + this.activeItem.focus(); + + } + else { + + this.activeItem.cfg.setProperty("selected", false); + this.activeItem.blur(); + + } + + Event.preventDefault(oEvent); + + } + +}, + + +/** +* @method _onClick +* @description "click" event handler for the menu bar. +* @protected +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.MenuBar} p_oMenuBar Object representing the menu bar +* that fired the event. +*/ +_onClick: function(p_sType, p_aArgs, p_oMenuBar) { + + YAHOO.widget.MenuBar.superclass._onClick.call( + this, + p_sType, + p_aArgs, + p_oMenuBar + ); + + + var oItem = p_aArgs[1]; + + if(oItem && !oItem.cfg.getProperty("disabled")) { + + var Event = YAHOO.util.Event, + Dom = YAHOO.util.Dom, + + oEvent = p_aArgs[0], + oTarget = Event.getTarget(oEvent), + + oActiveItem = this.activeItem, + oConfig = this.cfg; + + + // Hide any other submenus that might be visible + + if(oActiveItem && oActiveItem != oItem) { + + this.clearActiveItem(); + + } + + + // Select and focus the current item + + oItem.cfg.setProperty("selected", true); + oItem.focus(); + + + // Show the submenu for the item + + var oSubmenu = oItem.cfg.getProperty("submenu"); + + + if(oSubmenu && oTarget != oItem.submenuIndicator) { + + if(oSubmenu.cfg.getProperty("visible")) { + + oSubmenu.hide(); + + } + else { + + oSubmenu.show(); + + } + + } + + } + +}, + + + +// Public methods + + +/** +* @method toString +* @description Returns a string representing the menu bar. +* @return {String} +*/ +toString: function() { + + return ("MenuBar " + this.id); + +}, + + +/** +* @description Initializes the class's configurable properties which can be +* changed using the menu bar's Config object ("cfg"). +* @method initDefaultConfig +*/ +initDefaultConfig: function() { + + YAHOO.widget.MenuBar.superclass.initDefaultConfig.call(this); + + var oConfig = this.cfg; + + // Add configuration properties + + + /* + Set the default value for the "position" configuration property + to "static" by re-adding the property. + */ + + /** + * @config position + * @description String indicating how a menu bar should be positioned on the + * screen. Possible values are "static" and "dynamic." Static menu bars + * are visible by default and reside in the normal flow of the document + * (CSS position: static). Dynamic menu bars are hidden by default, reside + * out of the normal flow of the document (CSS position: absolute), and can + * overlay other elements on the screen. + * @default static + * @type String + */ + oConfig.addProperty( + "position", + { + value: "static", + handler: this.configPosition, + validator: this._checkPosition, + supercedes: ["visible"] + } + ); + + + /* + Set the default value for the "submenualignment" configuration property + to ["tl","bl"] by re-adding the property. + */ + + /** + * @config submenualignment + * @description Array defining how submenus should be aligned to their + * parent menu bar item. The format is: [itemCorner, submenuCorner]. + * @default ["tl","bl"] + * @type Array + */ + oConfig.addProperty("submenualignment", { value: ["tl","bl"] } ); + + + /* + Change the default value for the "autosubmenudisplay" configuration + property to "false" by re-adding the property. + */ + + /** + * @config autosubmenudisplay + * @description Boolean indicating if submenus are automatically made + * visible when the user mouses over the menu bar's items. + * @default false + * @type Boolean + */ + oConfig.addProperty( + "autosubmenudisplay", + { value: false, validator: oConfig.checkBoolean } + ); + +} + +}); // END YAHOO.lang.extend + + + +/** +* Creates an item for a menu bar. +* +* @param {String} p_oObject String specifying the text of the menu bar item. +* @param {HTMLLIElement} p_oObject Object specifying the +* <li> element of the menu bar item. +* @param {HTMLOptGroupElement} p_oObject Object +* specifying the <optgroup> element of the menu bar item. +* @param {HTMLOptionElement} p_oObject Object specifying +* the <option> element of the menu bar item. +* @param {Object} p_oConfig Optional. Object literal specifying the +* configuration for the menu bar item. See configuration class documentation +* for more details. +* @class MenuBarItem +* @constructor +* @extends YAHOO.widget.MenuItem +*/ +YAHOO.widget.MenuBarItem = function(p_oObject, p_oConfig) { + + YAHOO.widget.MenuBarItem.superclass.constructor.call( + this, + p_oObject, + p_oConfig + ); + +}; + +YAHOO.lang.extend(YAHOO.widget.MenuBarItem, YAHOO.widget.MenuItem, { + + +/** +* @method init +* @description The MenuBarItem class's initialization method. This method is +* automatically called by the constructor, and sets up all DOM references for +* pre-existing markup, and creates required markup if it is not already present. +* @param {String} p_oObject String specifying the text of the menu bar item. +* @param {HTMLLIElement} p_oObject Object specifying the +* <li> element of the menu bar item. +* @param {HTMLOptGroupElement} p_oObject Object +* specifying the <optgroup> element of the menu bar item. +* @param {HTMLOptionElement} p_oObject Object specifying +* the <option> element of the menu bar item. +* @param {Object} p_oConfig Optional. Object literal specifying the +* configuration for the menu bar item. See configuration class documentation +* for more details. +*/ +init: function(p_oObject, p_oConfig) { + + if(!this.SUBMENU_TYPE) { + + this.SUBMENU_TYPE = YAHOO.widget.Menu; + + } + + + /* + Call the init of the superclass (YAHOO.widget.MenuItem) + Note: We don't pass the user config in here yet + because we only want it executed once, at the lowest + subclass level. + */ + + YAHOO.widget.MenuBarItem.superclass.init.call(this, p_oObject); + + + var oConfig = this.cfg; + + if(p_oConfig) { + + oConfig.applyConfig(p_oConfig, true); + + } + + oConfig.fireQueue(); + +}, + + + +// Constants + +/** +* @property CSS_CLASS_NAME +* @description String representing the CSS class(es) to be applied to the +* <li> element of the menu bar item. +* @default "yuimenubaritem" +* @final +* @type String +*/ +CSS_CLASS_NAME: "yuimenubaritem", + + + +// Public methods + + +/** +* @method toString +* @description Returns a string representing the menu bar item. +* @return {String} +*/ +toString: function() { + + return ("MenuBarItem: " + this.cfg.getProperty("text")); + +} + +}); // END YAHOO.lang.extend +YAHOO.register("menu", YAHOO.widget.Menu, {version: "2.2.0", build: "127"}); diff --git a/interface/ispconfig/interface/js/yui/menu/menu-min.js b/interface/ispconfig/interface/js/yui/menu/menu-min.js new file mode 100644 index 0000000000000000000000000000000000000000..d4ca1d7ade47ab67000ce78b2b1d9de4f1a47bf1 --- /dev/null +++ b/interface/ispconfig/interface/js/yui/menu/menu-min.js @@ -0,0 +1,260 @@ +/* +Copyright (c) 2007, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.2.0 +*/ + +(function(){var Dom=YAHOO.util.Dom,Event=YAHOO.util.Event;YAHOO.widget.MenuManager=function(){var m_bInitializedEventHandlers=false,m_oMenus={},m_oItems={},m_oVisibleMenus={},me=this;function addItem(p_oItem){var sId=p_oItem.id;if(p_oItem&&m_oItems[sId]!=p_oItem){m_oItems[sId]=p_oItem;p_oItem.destroyEvent.subscribe(onItemDestroy,p_oItem);}} +function removeItem(p_oItem){var sId=p_oItem.id;if(sId&&m_oItems[sId]){delete m_oItems[sId];}} +function getMenuRootElement(p_oElement){var oParentNode;if(p_oElement&&p_oElement.tagName){switch(p_oElement.tagName.toUpperCase()){case"DIV":oParentNode=p_oElement.parentNode;if((Dom.hasClass(p_oElement,"hd")||Dom.hasClass(p_oElement,"bd")||Dom.hasClass(p_oElement,"ft"))&&oParentNode&&oParentNode.tagName&&oParentNode.tagName.toUpperCase()=="DIV"){return oParentNode;} +else{return p_oElement;} +break;case"LI":return p_oElement;default:oParentNode=p_oElement.parentNode;if(oParentNode){return getMenuRootElement(oParentNode);} +break;}}} +function onDOMEvent(p_oEvent){var oTarget=Event.getTarget(p_oEvent),oElement=getMenuRootElement(oTarget),oMenuItem,oMenu;if(oElement){var sTagName=oElement.tagName.toUpperCase();if(sTagName=="LI"){var sId=oElement.id;if(sId&&m_oItems[sId]){oMenuItem=m_oItems[sId];oMenu=oMenuItem.parent;}} +else if(sTagName=="DIV"){if(oElement.id){oMenu=m_oMenus[oElement.id];}}} +if(oMenu){var oEventTypes={"click":"clickEvent","mousedown":"mouseDownEvent","mouseup":"mouseUpEvent","mouseover":"mouseOverEvent","mouseout":"mouseOutEvent","keydown":"keyDownEvent","keyup":"keyUpEvent","keypress":"keyPressEvent"},sCustomEventType=oEventTypes[p_oEvent.type];if(oMenuItem&&!oMenuItem.cfg.getProperty("disabled")){oMenuItem[sCustomEventType].fire(p_oEvent);} +oMenu[sCustomEventType].fire(p_oEvent,oMenuItem);} +else if(p_oEvent.type=="mousedown"){var oActiveItem;for(var i in m_oMenus){if(m_oMenus.hasOwnProperty(i)){oMenu=m_oMenus[i];if(oMenu.cfg.getProperty("clicktohide")&&oMenu.cfg.getProperty("position")=="dynamic"){oMenu.hide();} +else{oMenu.clearActiveItem(true);}}}}} +function onMenuDestroy(p_sType,p_aArgs,p_oMenu){if(p_oMenu&&m_oMenus[p_oMenu.id]){delete m_oMenus[p_oMenu.id];}} +function onItemDestroy(p_sType,p_aArgs,p_oItem){var sId=p_oItem.id;if(sId&&m_oItems[sId]){delete m_oItems[sId];}} +function onMenuVisibleConfigChange(p_sType,p_aArgs,p_oMenu){var bVisible=p_aArgs[0];if(bVisible){m_oVisibleMenus[p_oMenu.id]=p_oMenu;} +else if(m_oVisibleMenus[p_oMenu.id]){delete m_oVisibleMenus[p_oMenu.id];}} +function onItemAdded(p_sType,p_aArgs){addItem(p_aArgs[0]);} +function onItemRemoved(p_sType,p_aArgs){removeItem(p_aArgs[0]);} +return{addMenu:function(p_oMenu){if(p_oMenu&&p_oMenu.id&&!m_oMenus[p_oMenu.id]){m_oMenus[p_oMenu.id]=p_oMenu;if(!m_bInitializedEventHandlers){var oDoc=document;Event.addListener(oDoc,"mouseover",onDOMEvent,me,true);Event.addListener(oDoc,"mouseout",onDOMEvent,me,true);Event.addListener(oDoc,"mousedown",onDOMEvent,me,true);Event.addListener(oDoc,"mouseup",onDOMEvent,me,true);Event.addListener(oDoc,"click",onDOMEvent,me,true);Event.addListener(oDoc,"keydown",onDOMEvent,me,true);Event.addListener(oDoc,"keyup",onDOMEvent,me,true);Event.addListener(oDoc,"keypress",onDOMEvent,me,true);m_bInitializedEventHandlers=true;} +p_oMenu.destroyEvent.subscribe(onMenuDestroy,p_oMenu,me);p_oMenu.cfg.subscribeToConfigEvent("visible",onMenuVisibleConfigChange,p_oMenu);p_oMenu.itemAddedEvent.subscribe(onItemAdded);p_oMenu.itemRemovedEvent.subscribe(onItemRemoved);}},removeMenu:function(p_oMenu){if(p_oMenu&&m_oMenus[p_oMenu.id]){delete m_oMenus[p_oMenu.id];}},hideVisible:function(){var oMenu;for(var i in m_oVisibleMenus){if(m_oVisibleMenus.hasOwnProperty(i)){oMenu=m_oVisibleMenus[i];if(oMenu.cfg.getProperty("position")=="dynamic"){oMenu.hide();}}}},getMenus:function(){return m_oMenus;},getMenu:function(p_sId){if(m_oMenus[p_sId]){return m_oMenus[p_sId];}},toString:function(){return("MenuManager");}};}();})();(function(){var Dom=YAHOO.util.Dom,Event=YAHOO.util.Event,Lang=YAHOO.lang;YAHOO.widget.Menu=function(p_oElement,p_oConfig){if(p_oConfig){this.parent=p_oConfig.parent;this.lazyLoad=p_oConfig.lazyLoad||p_oConfig.lazyload;this.itemData=p_oConfig.itemData||p_oConfig.itemdata;} +YAHOO.widget.Menu.superclass.constructor.call(this,p_oElement,p_oConfig);};YAHOO.lang.extend(YAHOO.widget.Menu,YAHOO.widget.Overlay,{CSS_CLASS_NAME:"yuimenu",ITEM_TYPE:null,GROUP_TITLE_TAG_NAME:"h6",_nHideDelayId:null,_nShowDelayId:null,_nSubmenuHideDelayId:null,_nBodyScrollId:null,_bHideDelayEventHandlersAssigned:false,_bHandledMouseOverEvent:false,_bHandledMouseOutEvent:false,_aGroupTitleElements:null,_aItemGroups:null,_aListElements:null,_nCurrentMouseX:0,_nMaxHeight:-1,_bStopMouseEventHandlers:false,_sClassName:null,lazyLoad:false,itemData:null,activeItem:null,parent:null,srcElement:null,mouseOverEvent:null,mouseOutEvent:null,mouseDownEvent:null,mouseUpEvent:null,clickEvent:null,keyPressEvent:null,keyDownEvent:null,keyUpEvent:null,itemAddedEvent:null,itemRemovedEvent:null,init:function(p_oElement,p_oConfig){this._aItemGroups=[];this._aListElements=[];this._aGroupTitleElements=[];if(!this.ITEM_TYPE){this.ITEM_TYPE=YAHOO.widget.MenuItem;} +var oElement;if(typeof p_oElement=="string"){oElement=document.getElementById(p_oElement);} +else if(p_oElement.tagName){oElement=p_oElement;} +if(oElement&&oElement.tagName){switch(oElement.tagName.toUpperCase()){case"DIV":this.srcElement=oElement;if(!oElement.id){oElement.setAttribute("id",Dom.generateId());} +YAHOO.widget.Menu.superclass.init.call(this,oElement);this.beforeInitEvent.fire(YAHOO.widget.Menu);break;case"SELECT":this.srcElement=oElement;YAHOO.widget.Menu.superclass.init.call(this,Dom.generateId());this.beforeInitEvent.fire(YAHOO.widget.Menu);break;}} +else{YAHOO.widget.Menu.superclass.init.call(this,p_oElement);this.beforeInitEvent.fire(YAHOO.widget.Menu);} +if(this.element){var oEl=this.element;Dom.addClass(oEl,this.CSS_CLASS_NAME);this.initEvent.subscribe(this._onInit,this,true);this.beforeRenderEvent.subscribe(this._onBeforeRender,this,true);this.renderEvent.subscribe(this._setWidth,this,true);this.beforeShowEvent.subscribe(this._onBeforeShow,this,true);this.showEvent.subscribe(this._onShow,this,true);this.beforeHideEvent.subscribe(this._onBeforeHide,this,true);this.hideEvent.subscribe(this._onHide,this,true);this.mouseOverEvent.subscribe(this._onMouseOver,this,true);this.mouseOutEvent.subscribe(this._onMouseOut,this,true);this.clickEvent.subscribe(this._onClick,this,true);this.keyDownEvent.subscribe(this._onKeyDown,this,true);this.keyPressEvent.subscribe(this._onKeyPress,this,true);YAHOO.widget.Module.textResizeEvent.subscribe(this._onTextResize,this,true);if(p_oConfig){this.cfg.applyConfig(p_oConfig,true);} +YAHOO.widget.MenuManager.addMenu(this);this.initEvent.fire(YAHOO.widget.Menu);}},_initSubTree:function(){var oNode;if(this.srcElement.tagName.toUpperCase()=="DIV"){oNode=this.body.firstChild;var nGroup=0,sGroupTitleTagName=this.GROUP_TITLE_TAG_NAME.toUpperCase();do{if(oNode&&oNode.tagName){switch(oNode.tagName.toUpperCase()){case sGroupTitleTagName:this._aGroupTitleElements[nGroup]=oNode;break;case"UL":this._aListElements[nGroup]=oNode;this._aItemGroups[nGroup]=[];nGroup++;break;}}} +while((oNode=oNode.nextSibling));if(this._aListElements[0]){Dom.addClass(this._aListElements[0],"first-of-type");}} +oNode=null;if(this.srcElement.tagName){var sSrcElementTagName=this.srcElement.tagName.toUpperCase();switch(sSrcElementTagName){case"DIV":if(this._aListElements.length>0){var i=this._aListElements.length-1;do{oNode=this._aListElements[i].firstChild;do{if(oNode&&oNode.tagName&&oNode.tagName.toUpperCase()=="LI"){this.addItem(new this.ITEM_TYPE(oNode,{parent:this}),i);}} +while((oNode=oNode.nextSibling));} +while(i--);} +break;case"SELECT":oNode=this.srcElement.firstChild;do{if(oNode&&oNode.tagName){switch(oNode.tagName.toUpperCase()){case"OPTGROUP":case"OPTION":this.addItem(new this.ITEM_TYPE(oNode,{parent:this}));break;}}} +while((oNode=oNode.nextSibling));break;}}},_getFirstEnabledItem:function(){var aItems=this.getItems(),nItems=aItems.length,oItem;for(var i=0;i=aGroup.length);if(aGroup[p_nItemIndex]){aGroup.splice(p_nItemIndex,0,oItem);} +else{aGroup[p_nItemIndex]=oItem;} +oGroupItem=aGroup[p_nItemIndex];if(oGroupItem){if(bAppend&&(!oGroupItem.element.parentNode||oGroupItem.element.parentNode.nodeType==11)){this._aListElements[nGroupIndex].appendChild(oGroupItem.element);} +else{function getNextItemSibling(p_aArray,p_nStartIndex){return(p_aArray[p_nStartIndex]||getNextItemSibling(p_aArray,(p_nStartIndex+1)));} +var oNextItemSibling=getNextItemSibling(aGroup,(p_nItemIndex+1));if(oNextItemSibling&&(!oGroupItem.element.parentNode||oGroupItem.element.parentNode.nodeType==11)){this._aListElements[nGroupIndex].insertBefore(oGroupItem.element,oNextItemSibling.element);}} +oGroupItem.parent=this;this._subscribeToItemEvents(oGroupItem);this._configureSubmenu(oGroupItem);this._updateItemProperties(nGroupIndex);this.itemAddedEvent.fire(oGroupItem);return oGroupItem;}} +else{var nItemIndex=aGroup.length;aGroup[nItemIndex]=oItem;oGroupItem=aGroup[nItemIndex];if(oGroupItem){if(!Dom.isAncestor(this._aListElements[nGroupIndex],oGroupItem.element)){this._aListElements[nGroupIndex].appendChild(oGroupItem.element);} +oGroupItem.element.setAttribute("groupindex",nGroupIndex);oGroupItem.element.setAttribute("index",nItemIndex);oGroupItem.parent=this;oGroupItem.index=nItemIndex;oGroupItem.groupIndex=nGroupIndex;this._subscribeToItemEvents(oGroupItem);this._configureSubmenu(oGroupItem);if(nItemIndex===0){Dom.addClass(oGroupItem.element,"first-of-type");} +this.itemAddedEvent.fire(oGroupItem);return oGroupItem;}}}},_removeItemFromGroupByIndex:function(p_nGroupIndex,p_nItemIndex){var nGroupIndex=typeof p_nGroupIndex=="number"?p_nGroupIndex:0,aGroup=this._getItemGroup(nGroupIndex);if(aGroup){var aArray=aGroup.splice(p_nItemIndex,1),oItem=aArray[0];if(oItem){this._updateItemProperties(nGroupIndex);if(aGroup.length===0){var oUL=this._aListElements[nGroupIndex];if(this.body&&oUL){this.body.removeChild(oUL);} +this._aItemGroups.splice(nGroupIndex,1);this._aListElements.splice(nGroupIndex,1);oUL=this._aListElements[0];if(oUL){Dom.addClass(oUL,"first-of-type");}} +this.itemRemovedEvent.fire(oItem);return oItem;}}},_removeItemFromGroupByValue:function(p_nGroupIndex,p_oItem){var aGroup=this._getItemGroup(p_nGroupIndex);if(aGroup){var nItems=aGroup.length,nItemIndex=-1;if(nItems>0){var i=nItems-1;do{if(aGroup[i]==p_oItem){nItemIndex=i;break;}} +while(i--);if(nItemIndex>-1){return this._removeItemFromGroupByIndex(p_nGroupIndex,nItemIndex);}}}},_updateItemProperties:function(p_nGroupIndex){var aGroup=this._getItemGroup(p_nGroupIndex),nItems=aGroup.length;if(nItems>0){var i=nItems-1,oItem,oLI;do{oItem=aGroup[i];if(oItem){oLI=oItem.element;oItem.index=i;oItem.groupIndex=p_nGroupIndex;oLI.setAttribute("groupindex",p_nGroupIndex);oLI.setAttribute("index",i);Dom.removeClass(oLI,"first-of-type");}} +while(i--);if(oLI){Dom.addClass(oLI,"first-of-type");}}},_createItemGroup:function(p_nIndex){if(!this._aItemGroups[p_nIndex]){this._aItemGroups[p_nIndex]=[];var oUL=document.createElement("ul");this._aListElements[p_nIndex]=oUL;return this._aItemGroups[p_nIndex];}},_getItemGroup:function(p_nIndex){var nIndex=((typeof p_nIndex=="number")?p_nIndex:0);return this._aItemGroups[nIndex];},_configureSubmenu:function(p_oItem){var oSubmenu=p_oItem.cfg.getProperty("submenu");if(oSubmenu){this.cfg.configChangedEvent.subscribe(this._onParentMenuConfigChange,oSubmenu,true);this.renderEvent.subscribe(this._onParentMenuRender,oSubmenu,true);oSubmenu.beforeShowEvent.subscribe(this._onSubmenuBeforeShow,oSubmenu,true);oSubmenu.showEvent.subscribe(this._onSubmenuShow,oSubmenu,true);oSubmenu.hideEvent.subscribe(this._onSubmenuHide,oSubmenu,true);}},_subscribeToItemEvents:function(p_oItem){p_oItem.focusEvent.subscribe(this._onMenuItemFocus,p_oItem,this);p_oItem.blurEvent.subscribe(this._onMenuItemBlur,this,true);p_oItem.cfg.configChangedEvent.subscribe(this._onMenuItemConfigChange,p_oItem,this);},_getOffsetWidth:function(){var oClone=this.element.cloneNode(true);Dom.setStyle(oClone,"width","");document.body.appendChild(oClone);var sWidth=oClone.offsetWidth;document.body.removeChild(oClone);return sWidth;},_setWidth:function(){if(this.cfg.getProperty("position")=="dynamic"){var sWidth;if(this.element.parentNode.tagName.toUpperCase()=="BODY"){if(this.browser=="opera"){sWidth=this._getOffsetWidth();} +else{Dom.setStyle(this.element,"width","auto");sWidth=this.element.offsetWidth;}} +else{sWidth=this._getOffsetWidth();} +this.cfg.setProperty("width",(sWidth+"px"));}},_cancelHideDelay:function(){var oRoot=this.getRoot();if(oRoot._nHideDelayId){window.clearTimeout(oRoot._nHideDelayId);}},_execHideDelay:function(){this._cancelHideDelay();var oRoot=this.getRoot(),me=this;function hideMenu(){if(oRoot.activeItem){oRoot.clearActiveItem();} +if(oRoot==me&&me.cfg.getProperty("position")=="dynamic"){me.hide();}} +oRoot._nHideDelayId=window.setTimeout(hideMenu,oRoot.cfg.getProperty("hidedelay"));},_cancelShowDelay:function(){var oRoot=this.getRoot();if(oRoot._nShowDelayId){window.clearTimeout(oRoot._nShowDelayId);}},_execShowDelay:function(p_oMenu){var oRoot=this.getRoot();function showMenu(){if(p_oMenu.parent.cfg.getProperty("selected")){p_oMenu.show();}} +oRoot._nShowDelayId=window.setTimeout(showMenu,oRoot.cfg.getProperty("showdelay"));},_execSubmenuHideDelay:function(p_oSubmenu,p_nMouseX,p_nHideDelay){var me=this;p_oSubmenu._nSubmenuHideDelayId=window.setTimeout(function(){if(me._nCurrentMouseX>(p_nMouseX+10)){p_oSubmenu._nSubmenuHideDelayId=window.setTimeout(function(){p_oSubmenu.hide();},p_nHideDelay);} +else{p_oSubmenu.hide();}},50);},_disableScrollHeader:function(){if(!this._bHeaderDisabled){Dom.addClass(this.header,"topscrollbar_disabled");this._bHeaderDisabled=true;}},_disableScrollFooter:function(){if(!this._bFooterDisabled){Dom.addClass(this.footer,"bottomscrollbar_disabled");this._bFooterDisabled=true;}},_enableScrollHeader:function(){if(this._bHeaderDisabled){Dom.removeClass(this.header,"topscrollbar_disabled");this._bHeaderDisabled=false;}},_enableScrollFooter:function(){if(this._bFooterDisabled){Dom.removeClass(this.footer,"bottomscrollbar_disabled");this._bFooterDisabled=false;}},_onMouseOver:function(p_sType,p_aArgs,p_oMenu){if(this._bStopMouseEventHandlers){return false;} +var oEvent=p_aArgs[0],oItem=p_aArgs[1],oTarget=Event.getTarget(oEvent);if(!this._bHandledMouseOverEvent&&(oTarget==this.element||Dom.isAncestor(this.element,oTarget))){this._nCurrentMouseX=0;Event.addListener(this.element,"mousemove",this._onMouseMove,this,true);this.clearActiveItem();if(this.parent&&this._nSubmenuHideDelayId){window.clearTimeout(this._nSubmenuHideDelayId);this.parent.cfg.setProperty("selected",true);var oParentMenu=this.parent.parent;oParentMenu.activeItem=this.parent;oParentMenu._bHandledMouseOutEvent=true;oParentMenu._bHandledMouseOverEvent=false;} +this._bHandledMouseOverEvent=true;this._bHandledMouseOutEvent=false;} +if(oItem&&!oItem.handledMouseOverEvent&&!oItem.cfg.getProperty("disabled")&&(oTarget==oItem.element||Dom.isAncestor(oItem.element,oTarget))){var nShowDelay=this.cfg.getProperty("showdelay"),bShowDelay=(nShowDelay>0);if(bShowDelay){this._cancelShowDelay();} +var oActiveItem=this.activeItem;if(oActiveItem){oActiveItem.cfg.setProperty("selected",false);} +var oItemCfg=oItem.cfg;oItemCfg.setProperty("selected",true);oItem.focus();if(this.cfg.getProperty("autosubmenudisplay")){var oSubmenu=oItemCfg.getProperty("submenu");if(oSubmenu){if(bShowDelay){this._execShowDelay(oSubmenu);} +else{oSubmenu.show();}}} +oItem.handledMouseOverEvent=true;oItem.handledMouseOutEvent=false;}},_onMouseOut:function(p_sType,p_aArgs,p_oMenu){if(this._bStopMouseEventHandlers){return false;} +var oEvent=p_aArgs[0],oItem=p_aArgs[1],oRelatedTarget=Event.getRelatedTarget(oEvent),bMovingToSubmenu=false;if(oItem&&!oItem.cfg.getProperty("disabled")){var oItemCfg=oItem.cfg,oSubmenu=oItemCfg.getProperty("submenu");if(oSubmenu&&(oRelatedTarget==oSubmenu.element||Dom.isAncestor(oSubmenu.element,oRelatedTarget))){bMovingToSubmenu=true;} +if(!oItem.handledMouseOutEvent&&((oRelatedTarget!=oItem.element&&!Dom.isAncestor(oItem.element,oRelatedTarget))||bMovingToSubmenu)){if(!bMovingToSubmenu){oItem.cfg.setProperty("selected",false);if(oSubmenu){var nSubmenuHideDelay=this.cfg.getProperty("submenuhidedelay"),nShowDelay=this.cfg.getProperty("showdelay");if(!(this instanceof YAHOO.widget.MenuBar)&&nSubmenuHideDelay>0&&nShowDelay>=nSubmenuHideDelay){this._execSubmenuHideDelay(oSubmenu,Event.getPageX(oEvent),nSubmenuHideDelay);} +else{oSubmenu.hide();}}} +oItem.handledMouseOutEvent=true;oItem.handledMouseOverEvent=false;}} +if(!this._bHandledMouseOutEvent&&((oRelatedTarget!=this.element&&!Dom.isAncestor(this.element,oRelatedTarget))||bMovingToSubmenu)){Event.removeListener(this.element,"mousemove",this._onMouseMove);this._nCurrentMouseX=Event.getPageX(oEvent);this._bHandledMouseOutEvent=true;this._bHandledMouseOverEvent=false;}},_onMouseMove:function(p_oEvent,p_oMenu){if(this._bStopMouseEventHandlers){return false;} +this._nCurrentMouseX=Event.getPageX(p_oEvent);},_onClick:function(p_sType,p_aArgs,p_oMenu){var oEvent=p_aArgs[0],oItem=p_aArgs[1],oTarget=Event.getTarget(oEvent);if(oItem&&!oItem.cfg.getProperty("disabled")){var oItemCfg=oItem.cfg,oSubmenu=oItemCfg.getProperty("submenu");if(oTarget==oItem.submenuIndicator&&oSubmenu){if(oSubmenu.cfg.getProperty("visible")){oSubmenu.hide();oSubmenu.parent.focus();} +else{this.clearActiveItem();this.activeItem=oItem;oItem.cfg.setProperty("selected",true);oSubmenu.show();}} +else{var sURL=oItemCfg.getProperty("url"),bCurrentPageURL=(sURL.substr((sURL.length-1),1)=="#"),sTarget=oItemCfg.getProperty("target"),bHasTarget=(sTarget&&sTarget.length>0);if(oTarget.tagName.toUpperCase()=="A"&&bCurrentPageURL&&!bHasTarget){Event.preventDefault(oEvent);} +if(oTarget.tagName.toUpperCase()!="A"&&!bCurrentPageURL&&!bHasTarget){document.location=sURL;} +if(bCurrentPageURL&&!oSubmenu){var oRoot=this.getRoot();if(oRoot.cfg.getProperty("position")=="static"){oRoot.clearActiveItem();} +else if(oRoot.cfg.getProperty("clicktohide")){oRoot.hide();}}}}},_onKeyDown:function(p_sType,p_aArgs,p_oMenu){var oEvent=p_aArgs[0],oItem=p_aArgs[1],me=this,oSubmenu;function stopMouseEventHandlers(){me._bStopMouseEventHandlers=true;window.setTimeout(function(){me._bStopMouseEventHandlers=false;},10);} +if(oItem&&!oItem.cfg.getProperty("disabled")){var oItemCfg=oItem.cfg,oParentItem=this.parent,oRoot,oNextItem;switch(oEvent.keyCode){case 38:case 40:if(oItem==this.activeItem&&!oItemCfg.getProperty("selected")){oItemCfg.setProperty("selected",true);} +else{oNextItem=(oEvent.keyCode==38)?oItem.getPreviousEnabledSibling():oItem.getNextEnabledSibling();if(oNextItem){this.clearActiveItem();oNextItem.cfg.setProperty("selected",true);oNextItem.focus();if(this.cfg.getProperty("maxheight")>0){var oBody=this.body;oBody.scrollTop=(oNextItem.element.offsetTop+ +oNextItem.element.offsetHeight)-oBody.offsetHeight;var nScrollTop=oBody.scrollTop,nScrollTarget=oBody.scrollHeight-oBody.offsetHeight;if(nScrollTop===0){this._disableScrollHeader();this._enableScrollFooter();} +else if(nScrollTop==nScrollTarget){this._enableScrollHeader();this._disableScrollFooter();} +else{this._enableScrollHeader();this._enableScrollFooter();}}}} +Event.preventDefault(oEvent);stopMouseEventHandlers();break;case 39:oSubmenu=oItemCfg.getProperty("submenu");if(oSubmenu){if(!oItemCfg.getProperty("selected")){oItemCfg.setProperty("selected",true);} +oSubmenu.show();oSubmenu.setInitialSelection();} +else{oRoot=this.getRoot();if(oRoot instanceof YAHOO.widget.MenuBar){oNextItem=oRoot.activeItem.getNextEnabledSibling();if(oNextItem){oRoot.clearActiveItem();oNextItem.cfg.setProperty("selected",true);oSubmenu=oNextItem.cfg.getProperty("submenu");if(oSubmenu){oSubmenu.show();} +oNextItem.focus();}}} +Event.preventDefault(oEvent);stopMouseEventHandlers();break;case 37:if(oParentItem){var oParentMenu=oParentItem.parent;if(oParentMenu instanceof YAHOO.widget.MenuBar){oNextItem=oParentMenu.activeItem.getPreviousEnabledSibling();if(oNextItem){oParentMenu.clearActiveItem();oNextItem.cfg.setProperty("selected",true);oSubmenu=oNextItem.cfg.getProperty("submenu");if(oSubmenu){oSubmenu.show();} +oNextItem.focus();}} +else{this.hide();oParentItem.focus();}} +Event.preventDefault(oEvent);stopMouseEventHandlers();break;}} +if(oEvent.keyCode==27){if(this.cfg.getProperty("position")=="dynamic"){this.hide();if(this.parent){this.parent.focus();}} +else if(this.activeItem){oSubmenu=this.activeItem.cfg.getProperty("submenu");if(oSubmenu&&oSubmenu.cfg.getProperty("visible")){oSubmenu.hide();this.activeItem.focus();} +else{this.activeItem.cfg.setProperty("selected",false);this.activeItem.blur();}} +Event.preventDefault(oEvent);}},_onKeyPress:function(p_sType,p_aArgs,p_oMenu){var oEvent=p_aArgs[0];if(oEvent.keyCode==40||oEvent.keyCode==38){YAHOO.util.Event.preventDefault(oEvent);}},_onTextResize:function(p_sType,p_aArgs,p_oMenu){if(this.browser=="gecko"&&!this._handleResize){this._handleResize=true;return;} +var oConfig=this.cfg;if(oConfig.getProperty("position")=="dynamic"){oConfig.setProperty("width",(this._getOffsetWidth()+"px"));}},_onScrollTargetMouseOver:function(p_oEvent,p_oMenu){this._cancelHideDelay();var oTarget=Event.getTarget(p_oEvent),oBody=this.body,me=this,nScrollTarget,fnScrollFunction;function scrollBodyDown(){var nScrollTop=oBody.scrollTop;if(nScrollTop0){oBody.scrollTop=(nScrollTop-1);me._enableScrollFooter();} +else{oBody.scrollTop=0;window.clearInterval(me._nBodyScrollId);me._disableScrollHeader();}} +if(Dom.hasClass(oTarget,"hd")){fnScrollFunction=scrollBodyUp;} +else{nScrollTarget=oBody.scrollHeight-oBody.offsetHeight;fnScrollFunction=scrollBodyDown;} +this._nBodyScrollId=window.setInterval(fnScrollFunction,10);},_onScrollTargetMouseOut:function(p_oEvent,p_oMenu){window.clearInterval(this._nBodyScrollId);this._cancelHideDelay();},_onInit:function(p_sType,p_aArgs,p_oMenu){if(((this.parent&&!this.lazyLoad)||(!this.parent&&this.cfg.getProperty("position")=="static")||(!this.parent&&!this.lazyLoad&&this.cfg.getProperty("position")=="dynamic"))&&this.getItemGroups().length===0){if(this.srcElement){this._initSubTree();} +if(this.itemData){this.addItems(this.itemData);}} +else if(this.lazyLoad){this.cfg.fireQueue();}},_onBeforeRender:function(p_sType,p_aArgs,p_oMenu){var oConfig=this.cfg,oEl=this.element,nListElements=this._aListElements.length;if(nListElements>0){var i=0,bFirstList=true,oUL,oGroupTitle;do{oUL=this._aListElements[i];if(oUL){if(bFirstList){Dom.addClass(oUL,"first-of-type");bFirstList=false;} +if(!Dom.isAncestor(oEl,oUL)){this.appendToBody(oUL);} +oGroupTitle=this._aGroupTitleElements[i];if(oGroupTitle){if(!Dom.isAncestor(oEl,oGroupTitle)){oUL.parentNode.insertBefore(oGroupTitle,oUL);} +Dom.addClass(oUL,"hastitle");}} +i++;} +while(i=nViewportHeight){var nMaxHeight=this.cfg.getProperty("maxheight");this._nMaxHeight=nMaxHeight;this.cfg.setProperty("maxheight",(nViewportHeight-20));} +if(this.cfg.getProperty("maxheight")>0){var oBody=this.body;if(oBody.scrollTop>0){oBody.scrollTop=0;} +this._disableScrollHeader();this._enableScrollFooter();}}},_onShow:function(p_sType,p_aArgs,p_oMenu){this.setInitialFocus();var oParent=this.parent;if(oParent){var oParentMenu=oParent.parent,aParentAlignment=oParentMenu.cfg.getProperty("submenualignment"),aAlignment=this.cfg.getProperty("submenualignment");if((aParentAlignment[0]!=aAlignment[0])&&(aParentAlignment[1]!=aAlignment[1])){this.cfg.setProperty("submenualignment",[aParentAlignment[0],aParentAlignment[1]]);} +if(!oParentMenu.cfg.getProperty("autosubmenudisplay")&&oParentMenu.cfg.getProperty("position")=="static"){oParentMenu.cfg.setProperty("autosubmenudisplay",true);function disableAutoSubmenuDisplay(p_oEvent){if(p_oEvent.type=="mousedown"||(p_oEvent.type=="keydown"&&p_oEvent.keyCode==27)){var oTarget=Event.getTarget(p_oEvent);if(oTarget!=oParentMenu.element||!YAHOO.util.Dom.isAncestor(oParentMenu.element,oTarget)){oParentMenu.cfg.setProperty("autosubmenudisplay",false);Event.removeListener(document,"mousedown",disableAutoSubmenuDisplay);Event.removeListener(document,"keydown",disableAutoSubmenuDisplay);}}} +Event.addListener(document,"mousedown",disableAutoSubmenuDisplay);Event.addListener(document,"keydown",disableAutoSubmenuDisplay);}} +else if(!oParent&&this.lazyLoad){this.cfg.refireEvent("xy");}},_onBeforeHide:function(p_sType,p_aArgs,p_oMenu){var oActiveItem=this.activeItem;if(oActiveItem){var oConfig=oActiveItem.cfg;oConfig.setProperty("selected",false);var oSubmenu=oConfig.getProperty("submenu");if(oSubmenu){oSubmenu.hide();} +oActiveItem.blur();}},_onHide:function(p_sType,p_aArgs,p_oMenu){if(this._nMaxHeight!=-1){this.cfg.setProperty("maxheight",this._nMaxHeight);this._nMaxHeight=-1;}},_onParentMenuConfigChange:function(p_sType,p_aArgs,p_oSubmenu){var sPropertyName=p_aArgs[0][0],oPropertyValue=p_aArgs[0][1];switch(sPropertyName){case"iframe":case"constraintoviewport":case"hidedelay":case"showdelay":case"submenuhidedelay":case"clicktohide":case"effect":case"classname":p_oSubmenu.cfg.setProperty(sPropertyName,oPropertyValue);break;}},_onParentMenuRender:function(p_sType,p_aArgs,p_oSubmenu){var oParentMenu=p_oSubmenu.parent.parent,oConfig={constraintoviewport:oParentMenu.cfg.getProperty("constraintoviewport"),xy:[0,0],clicktohide:oParentMenu.cfg.getProperty("clicktohide"),effect:oParentMenu.cfg.getProperty("effect"),showdelay:oParentMenu.cfg.getProperty("showdelay"),hidedelay:oParentMenu.cfg.getProperty("hidedelay"),submenuhidedelay:oParentMenu.cfg.getProperty("submenuhidedelay"),classname:oParentMenu.cfg.getProperty("classname")};if(this.cfg.getProperty("position")==oParentMenu.cfg.getProperty("position")){oConfig.iframe=oParentMenu.cfg.getProperty("iframe");} +p_oSubmenu.cfg.applyConfig(oConfig);if(!this.lazyLoad){var oLI=this.parent.element;if(this.element.parentNode==oLI){this.render();} +else{this.render(oLI);}}},_onSubmenuBeforeShow:function(p_sType,p_aArgs,p_oSubmenu){var oParent=this.parent,aAlignment=oParent.parent.cfg.getProperty("submenualignment");this.cfg.setProperty("context",[oParent.element,aAlignment[0],aAlignment[1]]);var nScrollTop=oParent.parent.body.scrollTop;if((this.browser=="gecko"||this.browser=="safari")&&nScrollTop>0){this.cfg.setProperty("y",(this.cfg.getProperty("y")-nScrollTop));}},_onSubmenuShow:function(p_sType,p_aArgs,p_oSubmenu){var oParent=this.parent;oParent.submenuIndicator.firstChild.nodeValue=oParent.EXPANDED_SUBMENU_INDICATOR_TEXT;},_onSubmenuHide:function(p_sType,p_aArgs,p_oSubmenu){var oParent=this.parent;oParent.submenuIndicator.firstChild.nodeValue=oParent.COLLAPSED_SUBMENU_INDICATOR_TEXT;},_onMenuItemFocus:function(p_sType,p_aArgs,p_oItem){this.activeItem=p_oItem;},_onMenuItemBlur:function(p_sType,p_aArgs){this.activeItem=null;},_onMenuItemConfigChange:function(p_sType,p_aArgs,p_oItem){var sProperty=p_aArgs[0][0];switch(sProperty){case"submenu":var oSubmenu=p_aArgs[0][1];if(oSubmenu){this._configureSubmenu(p_oItem);} +break;case"text":case"helptext":if(this.element.style.width){var sWidth=this._getOffsetWidth()+"px";Dom.setStyle(this.element,"width",sWidth);} +break;}},enforceConstraints:function(type,args,obj){var oConfig=this.cfg,pos=args[0],x=pos[0],y=pos[1],offsetHeight=this.element.offsetHeight,offsetWidth=this.element.offsetWidth,viewPortWidth=YAHOO.util.Dom.getViewportWidth(),viewPortHeight=YAHOO.util.Dom.getViewportHeight(),scrollX=Math.max(document.documentElement.scrollLeft,document.body.scrollLeft),scrollY=Math.max(document.documentElement.scrollTop,document.body.scrollTop),nPadding=(this.parent&&this.parent.parent instanceof YAHOO.widget.MenuBar)?0:10,topConstraint=scrollY+nPadding,leftConstraint=scrollX+nPadding,bottomConstraint=scrollY+viewPortHeight-offsetHeight-nPadding,rightConstraint=scrollX+viewPortWidth-offsetWidth-nPadding,aContext=oConfig.getProperty("context"),oContextElement=aContext?aContext[0]:null;if(x<10){x=leftConstraint;}else if((x+offsetWidth)>viewPortWidth){if(oContextElement&&((x-oContextElement.offsetWidth)>offsetWidth)){x=(x-(oContextElement.offsetWidth+offsetWidth));} +else{x=rightConstraint;}} +if(y<10){y=topConstraint;}else if(y>bottomConstraint){if(oContextElement&&(y>offsetHeight)){y=((y+oContextElement.offsetHeight)-offsetHeight);} +else{y=bottomConstraint;}} +oConfig.setProperty("x",x,true);oConfig.setProperty("y",y,true);oConfig.setProperty("xy",[x,y],true);},configVisible:function(p_sType,p_aArgs,p_oMenu){if(this.cfg.getProperty("position")=="dynamic"){YAHOO.widget.Menu.superclass.configVisible.call(this,p_sType,p_aArgs,p_oMenu);} +else{var bVisible=p_aArgs[0],sDisplay=Dom.getStyle(this.element,"display");if(bVisible){if(sDisplay!="block"){this.beforeShowEvent.fire();Dom.setStyle(this.element,"display","block");this.showEvent.fire();}} +else{if(sDisplay=="block"){this.beforeHideEvent.fire();Dom.setStyle(this.element,"display","none");this.hideEvent.fire();}}}},configPosition:function(p_sType,p_aArgs,p_oMenu){var sCSSPosition=p_aArgs[0]=="static"?"static":"absolute",oCfg=this.cfg;Dom.setStyle(this.element,"position",sCSSPosition);if(sCSSPosition=="static"){oCfg.setProperty("iframe",false);Dom.setStyle(this.element,"display","block");oCfg.setProperty("visible",true);} +else{Dom.setStyle(this.element,"visibility","hidden");} +if(sCSSPosition=="absolute"){var nZIndex=oCfg.getProperty("zindex");if(!nZIndex||nZIndex===0){nZIndex=this.parent?(this.parent.parent.cfg.getProperty("zindex")+1):1;oCfg.setProperty("zindex",nZIndex);}}},configIframe:function(p_sType,p_aArgs,p_oMenu){if(this.cfg.getProperty("position")=="dynamic"){YAHOO.widget.Menu.superclass.configIframe.call(this,p_sType,p_aArgs,p_oMenu);}},configHideDelay:function(p_sType,p_aArgs,p_oMenu){var nHideDelay=p_aArgs[0],oMouseOutEvent=this.mouseOutEvent,oMouseOverEvent=this.mouseOverEvent,oKeyDownEvent=this.keyDownEvent;if(nHideDelay>0){if(!this._bHideDelayEventHandlersAssigned){oMouseOutEvent.subscribe(this._execHideDelay,true);oMouseOverEvent.subscribe(this._cancelHideDelay,this,true);oKeyDownEvent.subscribe(this._cancelHideDelay,this,true);this._bHideDelayEventHandlersAssigned=true;}} +else{oMouseOutEvent.unsubscribe(this._execHideDelay,this);oMouseOverEvent.unsubscribe(this._cancelHideDelay,this);oKeyDownEvent.unsubscribe(this._cancelHideDelay,this);this._bHideDelayEventHandlersAssigned=false;}},configContainer:function(p_sType,p_aArgs,p_oMenu){var oElement=p_aArgs[0];if(typeof oElement=='string'){this.cfg.setProperty("container",document.getElementById(oElement),true);}},configMaxHeight:function(p_sType,p_aArgs,p_oMenu){var nMaxHeight=p_aArgs[0],oBody=this.body,oHeader=this.header,oFooter=this.footer,fnMouseOver=this._onScrollTargetMouseOver,fnMouseOut=this._onScrollTargetMouseOut;if((nMaxHeight>0)&&(oBody.offsetHeight>nMaxHeight)){if(!this.cfg.getProperty("width")){this._setWidth();} +if(!oHeader&&!oFooter){this.setHeader(" ");this.setFooter(" ");oHeader=this.header;oFooter=this.footer;Dom.addClass(oHeader,"topscrollbar");Dom.addClass(oFooter,"bottomscrollbar");this.element.insertBefore(oHeader,oBody);this.element.appendChild(oFooter);Event.addListener(oHeader,"mouseover",fnMouseOver,this,true);Event.addListener(oHeader,"mouseout",fnMouseOut,this,true);Event.addListener(oFooter,"mouseover",fnMouseOver,this,true);Event.addListener(oFooter,"mouseout",fnMouseOut,this,true);} +var nHeight=(nMaxHeight- +(this.footer.offsetHeight+this.header.offsetHeight));Dom.setStyle(oBody,"height",(nHeight+"px"));Dom.setStyle(oBody,"overflow","hidden");} +else if(oHeader&&oFooter){Dom.setStyle(oBody,"height","auto");Dom.setStyle(oBody,"overflow","visible");Event.removeListener(oHeader,"mouseover",fnMouseOver);Event.removeListener(oHeader,"mouseout",fnMouseOut);Event.removeListener(oFooter,"mouseover",fnMouseOver);Event.removeListener(oFooter,"mouseout",fnMouseOut);this.element.removeChild(oHeader);this.element.removeChild(oFooter);this.header=null;this.footer=null;}},configClassName:function(p_sType,p_aArgs,p_oMenu){var sClassName=p_aArgs[0];if(this._sClassName){Dom.removeClass(this.element,this._sClassName);} +Dom.addClass(this.element,sClassName);this._sClassName=sClassName;},initEvents:function(){YAHOO.widget.Menu.superclass.initEvents.call(this);var CustomEvent=YAHOO.util.CustomEvent;this.mouseOverEvent=new CustomEvent("mouseOverEvent",this);this.mouseOutEvent=new CustomEvent("mouseOutEvent",this);this.mouseDownEvent=new CustomEvent("mouseDownEvent",this);this.mouseUpEvent=new CustomEvent("mouseUpEvent",this);this.clickEvent=new CustomEvent("clickEvent",this);this.keyPressEvent=new CustomEvent("keyPressEvent",this);this.keyDownEvent=new CustomEvent("keyDownEvent",this);this.keyUpEvent=new CustomEvent("keyUpEvent",this);this.itemAddedEvent=new CustomEvent("itemAddedEvent",this);this.itemRemovedEvent=new CustomEvent("itemRemovedEvent",this);},getRoot:function(){var oItem=this.parent;if(oItem){var oParentMenu=oItem.parent;return oParentMenu?oParentMenu.getRoot():this;} +else{return this;}},toString:function(){return("Menu "+this.id);},setItemGroupTitle:function(p_sGroupTitle,p_nGroupIndex){if(typeof p_sGroupTitle=="string"&&p_sGroupTitle.length>0){var nGroupIndex=typeof p_nGroupIndex=="number"?p_nGroupIndex:0,oTitle=this._aGroupTitleElements[nGroupIndex];if(oTitle){oTitle.innerHTML=p_sGroupTitle;} +else{oTitle=document.createElement(this.GROUP_TITLE_TAG_NAME);oTitle.innerHTML=p_sGroupTitle;this._aGroupTitleElements[nGroupIndex]=oTitle;} +var i=this._aGroupTitleElements.length-1,nFirstIndex;do{if(this._aGroupTitleElements[i]){Dom.removeClass(this._aGroupTitleElements[i],"first-of-type");nFirstIndex=i;}} +while(i--);if(nFirstIndex!==null){Dom.addClass(this._aGroupTitleElements[nFirstIndex],"first-of-type");}}},addItem:function(p_oItem,p_nGroupIndex){if(p_oItem){return this._addItemToGroup(p_nGroupIndex,p_oItem);}},addItems:function(p_aItems,p_nGroupIndex){if(Lang.isArray(p_aItems)){var nItems=p_aItems.length,aItems=[],oItem;for(var i=0;i0){var i=nItems-1,oItem,oSubmenu;do{oItem=aItems[i];if(oItem){oSubmenu=oItem.cfg.getProperty("submenu");if(oSubmenu){this.cfg.configChangedEvent.unsubscribe(this._onParentMenuConfigChange,oSubmenu);this.renderEvent.unsubscribe(this._onParentMenuRender,oSubmenu);} +oItem.destroy();}} +while(i--);} +if(oHeader){Event.purgeElement(oHeader);oElement.removeChild(oHeader);} +if(oFooter){Event.purgeElement(oFooter);oElement.removeChild(oFooter);} +if(oBody){Event.purgeElement(oBody);oBody.innerHTML="";} +this._aItemGroups=[];this._aListElements=[];this._aGroupTitleElements=[];},destroy:function(){Event.purgeElement(this.element);this.mouseOverEvent.unsubscribeAll();this.mouseOutEvent.unsubscribeAll();this.mouseDownEvent.unsubscribeAll();this.mouseUpEvent.unsubscribeAll();this.clickEvent.unsubscribeAll();this.keyPressEvent.unsubscribeAll();this.keyDownEvent.unsubscribeAll();this.keyUpEvent.unsubscribeAll();this.itemAddedEvent.unsubscribeAll();this.itemRemovedEvent.unsubscribeAll();YAHOO.widget.Module.textResizeEvent.unsubscribe(this._onTextResize,this);this.clearContent();this._aItemGroups=null;this._aListElements=null;this._aGroupTitleElements=null;YAHOO.widget.Menu.superclass.destroy.call(this);},setInitialFocus:function(){var oItem=this._getFirstEnabledItem();if(oItem){oItem.focus();}},setInitialSelection:function(){var oItem=this._getFirstEnabledItem();if(oItem){oItem.cfg.setProperty("selected",true);}},clearActiveItem:function(p_bBlur){if(this.cfg.getProperty("showdelay")>0){this._cancelShowDelay();} +var oActiveItem=this.activeItem;if(oActiveItem){var oConfig=oActiveItem.cfg;oConfig.setProperty("selected",false);var oSubmenu=oConfig.getProperty("submenu");if(oSubmenu){oSubmenu.hide();} +if(p_bBlur){oActiveItem.blur();}}},initDefaultConfig:function(){YAHOO.widget.Menu.superclass.initDefaultConfig.call(this);var oConfig=this.cfg;oConfig.addProperty("visible",{value:false,handler:this.configVisible,validator:this.cfg.checkBoolean});oConfig.addProperty("constraintoviewport",{value:true,handler:this.configConstrainToViewport,validator:this.cfg.checkBoolean,supercedes:["iframe","x","y","xy"]});oConfig.addProperty("position",{value:"dynamic",handler:this.configPosition,validator:this._checkPosition,supercedes:["visible"]});oConfig.addProperty("submenualignment",{value:["tl","tr"]});oConfig.addProperty("autosubmenudisplay",{value:true,validator:oConfig.checkBoolean});oConfig.addProperty("showdelay",{value:250,validator:oConfig.checkNumber});oConfig.addProperty("hidedelay",{value:0,validator:oConfig.checkNumber,handler:this.configHideDelay,suppressEvent:true});oConfig.addProperty("submenuhidedelay",{value:250,validator:oConfig.checkNumber});oConfig.addProperty("clicktohide",{value:true,validator:oConfig.checkBoolean});oConfig.addProperty("container",{value:document.body,handler:this.configContainer});oConfig.addProperty("maxheight",{value:0,validator:oConfig.checkNumber,handler:this.configMaxHeight});oConfig.addProperty("classname",{value:null,handler:this.configClassName,validator:this._checkString});}});})();(function(){var Dom=YAHOO.util.Dom,Module=YAHOO.widget.Module,Menu=YAHOO.widget.Menu,m_oMenuItemElement=null,m_oSubmenuIndicator=null,m_oCheckedIndicator=null;YAHOO.widget.MenuItem=function(p_oObject,p_oConfig){if(p_oObject){if(p_oConfig){this.parent=p_oConfig.parent;this.value=p_oConfig.value;this.id=p_oConfig.id;} +this.init(p_oObject,p_oConfig);}};YAHOO.widget.MenuItem.prototype={SUBMENU_INDICATOR_IMAGE_PATH:"nt/ic/ut/alt1/menuarorght8_nrm_1.gif",SELECTED_SUBMENU_INDICATOR_IMAGE_PATH:"nt/ic/ut/alt1/menuarorght8_hov_1.gif",DISABLED_SUBMENU_INDICATOR_IMAGE_PATH:"nt/ic/ut/alt1/menuarorght8_dim_1.gif",COLLAPSED_SUBMENU_INDICATOR_ALT_TEXT:"Collapsed. Click to expand.",EXPANDED_SUBMENU_INDICATOR_ALT_TEXT:"Expanded. Click to collapse.",DISABLED_SUBMENU_INDICATOR_ALT_TEXT:"Disabled.",COLLAPSED_SUBMENU_INDICATOR_TEXT:"Submenu collapsed. Click to expand submenu.",EXPANDED_SUBMENU_INDICATOR_TEXT:"Submenu expanded. Click to collapse submenu.",DISABLED_SUBMENU_INDICATOR_TEXT:"Submenu collapsed. (Item disabled.)",CHECKED_IMAGE_PATH:"nt/ic/ut/bsc/menuchk8_nrm_1.gif",SELECTED_CHECKED_IMAGE_PATH:"nt/ic/ut/bsc/menuchk8_hov_1.gif",DISABLED_CHECKED_IMAGE_PATH:"nt/ic/ut/bsc/menuchk8_dim_1.gif",CHECKED_IMAGE_ALT_TEXT:"Checked.",DISABLED_CHECKED_IMAGE_ALT_TEXT:"Checked. (Item disabled.)",CHECKED_TEXT:"Menu item checked.",DISABLED_CHECKED_TEXT:"Checked. (Item disabled.)",CSS_CLASS_NAME:"yuimenuitem",SUBMENU_TYPE:null,IMG_ROOT:"http://us.i1.yimg.com/us.yimg.com/i/",IMG_ROOT_SSL:"https://a248.e.akamai.net/sec.yimg.com/i/",_oAnchor:null,_oText:null,_oHelpTextEM:null,_oSubmenu:null,_checkImage:null,_oCheckedIndicator:null,_oOnclickAttributeValue:null,_sClassName:null,constructor:YAHOO.widget.MenuItem,imageRoot:null,isSecure:Module.prototype.isSecure,index:null,groupIndex:null,parent:null,element:null,srcElement:null,value:null,submenuIndicator:null,browser:Module.prototype.browser,id:null,destroyEvent:null,mouseOverEvent:null,mouseOutEvent:null,mouseDownEvent:null,mouseUpEvent:null,clickEvent:null,keyPressEvent:null,keyDownEvent:null,keyUpEvent:null,focusEvent:null,blurEvent:null,init:function(p_oObject,p_oConfig){if(!this.SUBMENU_TYPE){this.SUBMENU_TYPE=Menu;} +this.cfg=new YAHOO.util.Config(this);this.initDefaultConfig();var oConfig=this.cfg;if(this._checkString(p_oObject)){this._createRootNodeStructure();oConfig.setProperty("text",p_oObject);} +else if(this._checkDOMNode(p_oObject)){switch(p_oObject.tagName.toUpperCase()){case"OPTION":this._createRootNodeStructure();oConfig.setProperty("text",p_oObject.text);this.srcElement=p_oObject;break;case"OPTGROUP":this._createRootNodeStructure();oConfig.setProperty("text",p_oObject.label);this.srcElement=p_oObject;this._initSubTree();break;case"LI":var oAnchor=this._getFirstElement(p_oObject,"A"),sURL="#",sTarget,sText;if(oAnchor){sURL=oAnchor.getAttribute("href");sTarget=oAnchor.getAttribute("target");if(oAnchor.innerText){sText=oAnchor.innerText;} +else{var oRange=oAnchor.ownerDocument.createRange();oRange.selectNodeContents(oAnchor);sText=oRange.toString();}} +else{var oText=p_oObject.firstChild;sText=oText.nodeValue;oAnchor=document.createElement("a");oAnchor.setAttribute("href",sURL);p_oObject.replaceChild(oAnchor,oText);oAnchor.appendChild(oText);} +this.srcElement=p_oObject;this.element=p_oObject;this._oAnchor=oAnchor;var oEmphasisNode=this._getFirstElement(oAnchor),bEmphasis=false,bStrongEmphasis=false;if(oEmphasisNode){this._oText=oEmphasisNode.firstChild;switch(oEmphasisNode.tagName.toUpperCase()){case"EM":bEmphasis=true;break;case"STRONG":bStrongEmphasis=true;break;}} +else{this._oText=oAnchor.firstChild;} +oConfig.setProperty("text",sText,true);oConfig.setProperty("url",sURL,true);oConfig.setProperty("target",sTarget,true);oConfig.setProperty("emphasis",bEmphasis,true);oConfig.setProperty("strongemphasis",bStrongEmphasis,true);this._initSubTree();break;}} +if(this.element){var sId=this.element.id;if(!sId){sId=this.id||Dom.generateId();this.element.id=sId;} +this.id=sId;Dom.addClass(this.element,this.CSS_CLASS_NAME);var CustomEvent=YAHOO.util.CustomEvent;this.destroyEvent=new CustomEvent("destroyEvent",this);this.mouseOverEvent=new CustomEvent("mouseOverEvent",this);this.mouseOutEvent=new CustomEvent("mouseOutEvent",this);this.mouseDownEvent=new CustomEvent("mouseDownEvent",this);this.mouseUpEvent=new CustomEvent("mouseUpEvent",this);this.clickEvent=new CustomEvent("clickEvent",this);this.keyPressEvent=new CustomEvent("keyPressEvent",this);this.keyDownEvent=new CustomEvent("keyDownEvent",this);this.keyUpEvent=new CustomEvent("keyUpEvent",this);this.focusEvent=new CustomEvent("focusEvent",this);this.blurEvent=new CustomEvent("blurEvent",this);if(p_oConfig){oConfig.applyConfig(p_oConfig);} +oConfig.fireQueue();}},_getFirstElement:function(p_oElement,p_sTagName){var oFirstChild=p_oElement.firstChild,oElement;if(oFirstChild){if(oFirstChild.nodeType==1){oElement=oFirstChild;} +else{var oNextSibling=oFirstChild.nextSibling;if(oNextSibling&&oNextSibling.nodeType==1){oElement=oNextSibling;}}} +if(p_sTagName){return(oElement&&oElement.tagName.toUpperCase()==p_sTagName)?oElement:false;} +return oElement;},_checkString:function(p_oObject){return(typeof p_oObject=="string");},_checkDOMNode:function(p_oObject){return(p_oObject&&p_oObject.tagName);},_createRootNodeStructure:function(){if(!m_oMenuItemElement){m_oMenuItemElement=document.createElement("li");m_oMenuItemElement.innerHTML="s";} +this.element=m_oMenuItemElement.cloneNode(true);this._oAnchor=this.element.firstChild;this._oText=this._oAnchor.firstChild;this.element.appendChild(this._oAnchor);},_initSubTree:function(){var oSrcEl=this.srcElement,oConfig=this.cfg;if(oSrcEl.childNodes.length>0){if(this.parent.lazyLoad&&this.parent.srcElement&&this.parent.srcElement.tagName.toUpperCase()=="SELECT"){oConfig.setProperty("submenu",{id:Dom.generateId(),itemdata:oSrcEl.childNodes});} +else{var oNode=oSrcEl.firstChild,aOptions=[];do{if(oNode&&oNode.tagName){switch(oNode.tagName.toUpperCase()){case"DIV":oConfig.setProperty("submenu",oNode);break;case"OPTION":aOptions[aOptions.length]=oNode;break;}}} +while((oNode=oNode.nextSibling));var nOptions=aOptions.length;if(nOptions>0){var oMenu=new this.SUBMENU_TYPE(Dom.generateId());oConfig.setProperty("submenu",oMenu);for(var n=0;n0){oAnchor.setAttribute("target",sTarget);} +else{oAnchor.removeAttribute("target");}},configEmphasis:function(p_sType,p_aArgs,p_oItem){var bEmphasis=p_aArgs[0],oAnchor=this._oAnchor,oText=this._oText,oConfig=this.cfg,oEM;if(bEmphasis&&oConfig.getProperty("strongemphasis")){oConfig.setProperty("strongemphasis",false);} +if(oAnchor){if(bEmphasis){oEM=document.createElement("em");oEM.appendChild(oText);oAnchor.appendChild(oEM);} +else{oEM=this._getFirstElement(oAnchor,"EM");if(oEM){oAnchor.removeChild(oEM);oAnchor.appendChild(oText);}}}},configStrongEmphasis:function(p_sType,p_aArgs,p_oItem){var bStrongEmphasis=p_aArgs[0],oAnchor=this._oAnchor,oText=this._oText,oConfig=this.cfg,oStrong;if(bStrongEmphasis&&oConfig.getProperty("emphasis")){oConfig.setProperty("emphasis",false);} +if(oAnchor){if(bStrongEmphasis){oStrong=document.createElement("strong");oStrong.appendChild(oText);oAnchor.appendChild(oStrong);} +else{oStrong=this._getFirstElement(oAnchor,"STRONG");if(oStrong){oAnchor.removeChild(oStrong);oAnchor.appendChild(oText);}}}},configChecked:function(p_sType,p_aArgs,p_oItem){var bChecked=p_aArgs[0],oEl=this.element,oConfig=this.cfg,oEM;if(bChecked){if(!m_oCheckedIndicator){m_oCheckedIndicator=document.createElement("em");m_oCheckedIndicator.innerHTML=this.CHECKED_TEXT;m_oCheckedIndicator.className="checkedindicator";} +oEM=m_oCheckedIndicator.cloneNode(true);var oSubmenu=this.cfg.getProperty("submenu");if(oSubmenu&&oSubmenu.element){oEl.insertBefore(oEM,oSubmenu.element);} +else{oEl.appendChild(oEM);} +Dom.addClass(oEl,"checked");this._oCheckedIndicator=oEM;if(oConfig.getProperty("disabled")){oConfig.refireEvent("disabled");} +if(oConfig.getProperty("selected")){oConfig.refireEvent("selected");}} +else{oEM=this._oCheckedIndicator;Dom.removeClass(oEl,"checked");if(oEM){oEl.removeChild(oEM);} +this._oCheckedIndicator=null;}},configDisabled:function(p_sType,p_aArgs,p_oItem){var bDisabled=p_aArgs[0],oConfig=this.cfg,oAnchor=this._oAnchor,aNodes=[this.element,oAnchor],oHelpText=this._oHelpTextEM,oCheckedIndicator=this._oCheckedIndicator,oSubmenuIndicator=this.submenuIndicator,i=1;if(oHelpText){i++;aNodes[i]=oHelpText;} +if(oCheckedIndicator){oCheckedIndicator.firstChild.nodeValue=bDisabled?this.DISABLED_CHECKED_TEXT:this.CHECKED_TEXT;i++;aNodes[i]=oCheckedIndicator;} +if(oSubmenuIndicator){oSubmenuIndicator.firstChild.nodeValue=bDisabled?this.DISABLED_SUBMENU_INDICATOR_TEXT:this.COLLAPSED_SUBMENU_INDICATOR_TEXT;i++;aNodes[i]=oSubmenuIndicator;} +if(bDisabled){if(oConfig.getProperty("selected")){oConfig.setProperty("selected",false);} +oAnchor.removeAttribute("href");Dom.addClass(aNodes,"disabled");} +else{oAnchor.setAttribute("href",oConfig.getProperty("url"));Dom.removeClass(aNodes,"disabled");}},configSelected:function(p_sType,p_aArgs,p_oItem){if(!this.cfg.getProperty("disabled")){var bSelected=p_aArgs[0],oHelpText=this._oHelpTextEM,oSubmenuIndicator=this.submenuIndicator,oCheckedIndicator=this._oCheckedIndicator,aNodes=[this.element,this._oAnchor],i=1;if(oHelpText){i++;aNodes[i]=oHelpText;} +if(oSubmenuIndicator){i++;aNodes[i]=oSubmenuIndicator;} +if(oCheckedIndicator){i++;aNodes[i]=oCheckedIndicator;} +if(bSelected){Dom.addClass(aNodes,"selected");} +else{Dom.removeClass(aNodes,"selected");}}},configSubmenu:function(p_sType,p_aArgs,p_oItem){var oEl=this.element,oSubmenu=p_aArgs[0],oSubmenuIndicator=this.submenuIndicator,oConfig=this.cfg,aNodes=[this.element,this._oAnchor],bLazyLoad=this.parent&&this.parent.lazyLoad,oMenu;if(oSubmenu){if(oSubmenu instanceof Menu){oMenu=oSubmenu;oMenu.parent=this;oMenu.lazyLoad=bLazyLoad;} +else if(typeof oSubmenu=="object"&&oSubmenu.id&&!oSubmenu.nodeType){var sSubmenuId=oSubmenu.id,oSubmenuConfig=oSubmenu;oSubmenuConfig.lazyload=bLazyLoad;oSubmenuConfig.parent=this;oMenu=new this.SUBMENU_TYPE(sSubmenuId,oSubmenuConfig);this.cfg.setProperty("submenu",oMenu,true);} +else{oMenu=new this.SUBMENU_TYPE(oSubmenu,{lazyload:bLazyLoad,parent:this});this.cfg.setProperty("submenu",oMenu,true);} +if(oMenu){this._oSubmenu=oMenu;if(!oSubmenuIndicator){if(!m_oSubmenuIndicator){m_oSubmenuIndicator=document.createElement("em");m_oSubmenuIndicator.innerHTML=this.COLLAPSED_SUBMENU_INDICATOR_TEXT;m_oSubmenuIndicator.className="submenuindicator";} +oSubmenuIndicator=m_oSubmenuIndicator.cloneNode(true);if(oMenu.element.parentNode==oEl){if(this.browser=="opera"){oEl.appendChild(oSubmenuIndicator);oMenu.renderEvent.subscribe(function(){oSubmenuIndicator.parentNode.insertBefore(oSubmenuIndicator,oMenu.element);});} +else{oEl.insertBefore(oSubmenuIndicator,oMenu.element);}} +else{oEl.appendChild(oSubmenuIndicator);} +this.submenuIndicator=oSubmenuIndicator;} +Dom.addClass(aNodes,"hassubmenu");if(oConfig.getProperty("disabled")){oConfig.refireEvent("disabled");} +if(oConfig.getProperty("selected")){oConfig.refireEvent("selected");}}} +else{Dom.removeClass(aNodes,"hassubmenu");if(oSubmenuIndicator){oEl.removeChild(oSubmenuIndicator);} +if(this._oSubmenu){this._oSubmenu.destroy();}}},configOnClick:function(p_sType,p_aArgs,p_oItem){var oObject=p_aArgs[0];if(this._oOnclickAttributeValue&&(this._oOnclickAttributeValue!=oObject)){this.clickEvent.unsubscribe(this._oOnclickAttributeValue.fn,this._oOnclickAttributeValue.obj);this._oOnclickAttributeValue=null;} +if(!this._oOnclickAttributeValue&&typeof oObject=="object"&&typeof oObject.fn=="function"){this.clickEvent.subscribe(oObject.fn,(oObject.obj||this),oObject.scope);this._oOnclickAttributeValue=oObject;}},configClassName:function(p_sType,p_aArgs,p_oItem){var sClassName=p_aArgs[0];if(this._sClassName){Dom.removeClass(this.element,this._sClassName);} +Dom.addClass(this.element,sClassName);this._sClassName=sClassName;},initDefaultConfig:function(){var oConfig=this.cfg,CheckBoolean=oConfig.checkBoolean;oConfig.addProperty("text",{value:"",handler:this.configText,validator:this._checkString,suppressEvent:true});oConfig.addProperty("helptext",{handler:this.configHelpText});oConfig.addProperty("url",{value:"#",handler:this.configURL,suppressEvent:true});oConfig.addProperty("target",{handler:this.configTarget,suppressEvent:true});oConfig.addProperty("emphasis",{value:false,handler:this.configEmphasis,validator:CheckBoolean,suppressEvent:true});oConfig.addProperty("strongemphasis",{value:false,handler:this.configStrongEmphasis,validator:CheckBoolean,suppressEvent:true});oConfig.addProperty("checked",{value:false,handler:this.configChecked,validator:this.cfg.checkBoolean,suppressEvent:true,supercedes:["disabled"]});oConfig.addProperty("disabled",{value:false,handler:this.configDisabled,validator:CheckBoolean,suppressEvent:true});oConfig.addProperty("selected",{value:false,handler:this.configSelected,validator:CheckBoolean,suppressEvent:true});oConfig.addProperty("submenu",{handler:this.configSubmenu});oConfig.addProperty("onclick",{handler:this.configOnClick});oConfig.addProperty("classname",{value:null,handler:this.configClassName,validator:this._checkString});},getNextEnabledSibling:function(){if(this.parent instanceof Menu){var nGroupIndex=this.groupIndex;function getNextArrayItem(p_aArray,p_nStartIndex){return p_aArray[p_nStartIndex]||getNextArrayItem(p_aArray,(p_nStartIndex+1));} +var aItemGroups=this.parent.getItemGroups(),oNextItem;if(this.index<(aItemGroups[nGroupIndex].length-1)){oNextItem=getNextArrayItem(aItemGroups[nGroupIndex],(this.index+1));} +else{var nNextGroupIndex;if(nGroupIndex<(aItemGroups.length-1)){nNextGroupIndex=nGroupIndex+1;} +else{nNextGroupIndex=0;} +var aNextGroup=getNextArrayItem(aItemGroups,nNextGroupIndex);oNextItem=getNextArrayItem(aNextGroup,0);} +return(oNextItem.cfg.getProperty("disabled")||oNextItem.element.style.display=="none")?oNextItem.getNextEnabledSibling():oNextItem;}},getPreviousEnabledSibling:function(){if(this.parent instanceof Menu){var nGroupIndex=this.groupIndex;function getPreviousArrayItem(p_aArray,p_nStartIndex){return p_aArray[p_nStartIndex]||getPreviousArrayItem(p_aArray,(p_nStartIndex-1));} +function getFirstItemIndex(p_aArray,p_nStartIndex){return p_aArray[p_nStartIndex]?p_nStartIndex:getFirstItemIndex(p_aArray,(p_nStartIndex+1));} +var aItemGroups=this.parent.getItemGroups(),oPreviousItem;if(this.index>getFirstItemIndex(aItemGroups[nGroupIndex],0)){oPreviousItem=getPreviousArrayItem(aItemGroups[nGroupIndex],(this.index-1));} +else{var nPreviousGroupIndex;if(nGroupIndex>getFirstItemIndex(aItemGroups,0)){nPreviousGroupIndex=nGroupIndex-1;} +else{nPreviousGroupIndex=aItemGroups.length-1;} +var aPreviousGroup=getPreviousArrayItem(aItemGroups,nPreviousGroupIndex);oPreviousItem=getPreviousArrayItem(aPreviousGroup,(aPreviousGroup.length-1));} +return(oPreviousItem.cfg.getProperty("disabled")||oPreviousItem.element.style.display=="none")?oPreviousItem.getPreviousEnabledSibling():oPreviousItem;}},focus:function(){var oParent=this.parent,oAnchor=this._oAnchor,oActiveItem=oParent.activeItem;function setFocus(){try{oAnchor.focus();} +catch(e){}} +if(!this.cfg.getProperty("disabled")&&oParent&&oParent.cfg.getProperty("visible")&&this.element.style.display!="none"){if(oActiveItem){oActiveItem.blur();} +window.setTimeout(setFocus,0);this.focusEvent.fire();}},blur:function(){var oParent=this.parent;if(!this.cfg.getProperty("disabled")&&oParent&&Dom.getStyle(oParent.element,"visibility")=="visible"){this._oAnchor.blur();this.blurEvent.fire();}},destroy:function(){var oEl=this.element;if(oEl){var oSubmenu=this.cfg.getProperty("submenu");if(oSubmenu){oSubmenu.destroy();} +this.mouseOverEvent.unsubscribeAll();this.mouseOutEvent.unsubscribeAll();this.mouseDownEvent.unsubscribeAll();this.mouseUpEvent.unsubscribeAll();this.clickEvent.unsubscribeAll();this.keyPressEvent.unsubscribeAll();this.keyDownEvent.unsubscribeAll();this.keyUpEvent.unsubscribeAll();this.focusEvent.unsubscribeAll();this.blurEvent.unsubscribeAll();this.cfg.configChangedEvent.unsubscribeAll();var oParentNode=oEl.parentNode;if(oParentNode){oParentNode.removeChild(oEl);this.destroyEvent.fire();} +this.destroyEvent.unsubscribeAll();}},toString:function(){return("MenuItem: "+this.cfg.getProperty("text"));}};})();YAHOO.widget.ContextMenu=function(p_oElement,p_oConfig){YAHOO.widget.ContextMenu.superclass.constructor.call(this,p_oElement,p_oConfig);};YAHOO.lang.extend(YAHOO.widget.ContextMenu,YAHOO.widget.Menu,{_oTrigger:null,_bCancelled:false,contextEventTarget:null,triggerContextMenuEvent:null,init:function(p_oElement,p_oConfig){if(!this.ITEM_TYPE){this.ITEM_TYPE=YAHOO.widget.ContextMenuItem;} +YAHOO.widget.ContextMenu.superclass.init.call(this,p_oElement);this.beforeInitEvent.fire(YAHOO.widget.ContextMenu);if(p_oConfig){this.cfg.applyConfig(p_oConfig,true);} +this.initEvent.fire(YAHOO.widget.ContextMenu);},initEvents:function(){YAHOO.widget.ContextMenu.superclass.initEvents.call(this);this.triggerContextMenuEvent=new YAHOO.util.CustomEvent("triggerContextMenuEvent",this);},cancel:function(){this._bCancelled=true;},_removeEventHandlers:function(){var Event=YAHOO.util.Event,oTrigger=this._oTrigger,bOpera=(this.browser=="opera");Event.removeListener(oTrigger,(bOpera?"mousedown":"contextmenu"),this._onTriggerContextMenu);if(bOpera){Event.removeListener(oTrigger,"click",this._onTriggerClick);}},_onTriggerClick:function(p_oEvent,p_oMenu){if(p_oEvent.ctrlKey){YAHOO.util.Event.stopEvent(p_oEvent);}},_onTriggerContextMenu:function(p_oEvent,p_oMenu){var Event=YAHOO.util.Event;if(p_oEvent.type=="mousedown"&&!p_oEvent.ctrlKey){return;} +Event.stopEvent(p_oEvent);YAHOO.widget.MenuManager.hideVisible();this.contextEventTarget=Event.getTarget(p_oEvent);this.triggerContextMenuEvent.fire(p_oEvent);if(!this._bCancelled){this.cfg.setProperty("xy",Event.getXY(p_oEvent));this.show();} +this._bCancelled=false;},toString:function(){return("ContextMenu "+this.id);},initDefaultConfig:function(){YAHOO.widget.ContextMenu.superclass.initDefaultConfig.call(this);this.cfg.addProperty("trigger",{handler:this.configTrigger});},destroy:function(){this._removeEventHandlers();YAHOO.widget.ContextMenu.superclass.destroy.call(this);},configTrigger:function(p_sType,p_aArgs,p_oMenu){var Event=YAHOO.util.Event,oTrigger=p_aArgs[0];if(oTrigger){if(this._oTrigger){this._removeEventHandlers();} +this._oTrigger=oTrigger;var bOpera=(this.browser=="opera");Event.addListener(oTrigger,(bOpera?"mousedown":"contextmenu"),this._onTriggerContextMenu,this,true);if(bOpera){Event.addListener(oTrigger,"click",this._onTriggerClick,this,true);}} +else{this._removeEventHandlers();}}});YAHOO.widget.ContextMenuItem=function(p_oObject,p_oConfig){YAHOO.widget.ContextMenuItem.superclass.constructor.call(this,p_oObject,p_oConfig);};YAHOO.lang.extend(YAHOO.widget.ContextMenuItem,YAHOO.widget.MenuItem,{init:function(p_oObject,p_oConfig){if(!this.SUBMENU_TYPE){this.SUBMENU_TYPE=YAHOO.widget.ContextMenu;} +YAHOO.widget.ContextMenuItem.superclass.init.call(this,p_oObject);var oConfig=this.cfg;if(p_oConfig){oConfig.applyConfig(p_oConfig,true);} +oConfig.fireQueue();},toString:function(){return("ContextMenuItem: "+this.cfg.getProperty("text"));}});YAHOO.widget.MenuBar=function(p_oElement,p_oConfig){YAHOO.widget.MenuBar.superclass.constructor.call(this,p_oElement,p_oConfig);};YAHOO.lang.extend(YAHOO.widget.MenuBar,YAHOO.widget.Menu,{init:function(p_oElement,p_oConfig){if(!this.ITEM_TYPE){this.ITEM_TYPE=YAHOO.widget.MenuBarItem;} +YAHOO.widget.MenuBar.superclass.init.call(this,p_oElement);this.beforeInitEvent.fire(YAHOO.widget.MenuBar);if(p_oConfig){this.cfg.applyConfig(p_oConfig,true);} +this.initEvent.fire(YAHOO.widget.MenuBar);},CSS_CLASS_NAME:"yuimenubar",_onKeyDown:function(p_sType,p_aArgs,p_oMenuBar){var Event=YAHOO.util.Event,oEvent=p_aArgs[0],oItem=p_aArgs[1],oSubmenu;if(oItem&&!oItem.cfg.getProperty("disabled")){var oItemCfg=oItem.cfg;switch(oEvent.keyCode){case 37:case 39:if(oItem==this.activeItem&&!oItemCfg.getProperty("selected")){oItemCfg.setProperty("selected",true);} +else{var oNextItem=(oEvent.keyCode==37)?oItem.getPreviousEnabledSibling():oItem.getNextEnabledSibling();if(oNextItem){this.clearActiveItem();oNextItem.cfg.setProperty("selected",true);if(this.cfg.getProperty("autosubmenudisplay")){oSubmenu=oNextItem.cfg.getProperty("submenu");if(oSubmenu){oSubmenu.show();oSubmenu.activeItem.blur();oSubmenu.activeItem=null;}} +oNextItem.focus();}} +Event.preventDefault(oEvent);break;case 40:if(this.activeItem!=oItem){this.clearActiveItem();oItemCfg.setProperty("selected",true);oItem.focus();} +oSubmenu=oItemCfg.getProperty("submenu");if(oSubmenu){if(oSubmenu.cfg.getProperty("visible")){oSubmenu.setInitialSelection();oSubmenu.setInitialFocus();} +else{oSubmenu.show();}} +Event.preventDefault(oEvent);break;}} +if(oEvent.keyCode==27&&this.activeItem){oSubmenu=this.activeItem.cfg.getProperty("submenu");if(oSubmenu&&oSubmenu.cfg.getProperty("visible")){oSubmenu.hide();this.activeItem.focus();} +else{this.activeItem.cfg.setProperty("selected",false);this.activeItem.blur();} +Event.preventDefault(oEvent);}},_onClick:function(p_sType,p_aArgs,p_oMenuBar){YAHOO.widget.MenuBar.superclass._onClick.call(this,p_sType,p_aArgs,p_oMenuBar);var oItem=p_aArgs[1];if(oItem&&!oItem.cfg.getProperty("disabled")){var Event=YAHOO.util.Event,Dom=YAHOO.util.Dom,oEvent=p_aArgs[0],oTarget=Event.getTarget(oEvent),oActiveItem=this.activeItem,oConfig=this.cfg;if(oActiveItem&&oActiveItem!=oItem){this.clearActiveItem();} +oItem.cfg.setProperty("selected",true);oItem.focus();var oSubmenu=oItem.cfg.getProperty("submenu");if(oSubmenu&&oTarget!=oItem.submenuIndicator){if(oSubmenu.cfg.getProperty("visible")){oSubmenu.hide();} +else{oSubmenu.show();}}}},toString:function(){return("MenuBar "+this.id);},initDefaultConfig:function(){YAHOO.widget.MenuBar.superclass.initDefaultConfig.call(this);var oConfig=this.cfg;oConfig.addProperty("position",{value:"static",handler:this.configPosition,validator:this._checkPosition,supercedes:["visible"]});oConfig.addProperty("submenualignment",{value:["tl","bl"]});oConfig.addProperty("autosubmenudisplay",{value:false,validator:oConfig.checkBoolean});}});YAHOO.widget.MenuBarItem=function(p_oObject,p_oConfig){YAHOO.widget.MenuBarItem.superclass.constructor.call(this,p_oObject,p_oConfig);};YAHOO.lang.extend(YAHOO.widget.MenuBarItem,YAHOO.widget.MenuItem,{init:function(p_oObject,p_oConfig){if(!this.SUBMENU_TYPE){this.SUBMENU_TYPE=YAHOO.widget.Menu;} +YAHOO.widget.MenuBarItem.superclass.init.call(this,p_oObject);var oConfig=this.cfg;if(p_oConfig){oConfig.applyConfig(p_oConfig,true);} +oConfig.fireQueue();},CSS_CLASS_NAME:"yuimenubaritem",toString:function(){return("MenuBarItem: "+this.cfg.getProperty("text"));}});YAHOO.register("menu",YAHOO.widget.Menu,{version:"2.2.0",build:"127"}); \ No newline at end of file diff --git a/interface/ispconfig/interface/js/yui/menu/menu.js b/interface/ispconfig/interface/js/yui/menu/menu.js new file mode 100644 index 0000000000000000000000000000000000000000..37cb6048dba282fb5185d667e749e1f82c3d96d1 --- /dev/null +++ b/interface/ispconfig/interface/js/yui/menu/menu.js @@ -0,0 +1,8265 @@ +/* +Copyright (c) 2007, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.2.0 +*/ + + +/** +* @module menu +* @description

    The Menu family of components features a collection of +* controls that make it easy to add menus to your website or web application. +* With the Menu Controls you can create website fly-out menus, customized +* context menus, or application-style menu bars with just a small amount of +* scripting.

    The Menu family of controls features:

    +*
      +*
    • Screen-reader accessibility.
    • +*
    • Keyboard and mouse navigation.
    • +*
    • A rich event model that provides access to all of a menu's +* interesting moments.
    • +*
    • Support for +* Progressive +* Enhancement; Menus can be created from simple, +* semantic markup on the page or purely through JavaScript.
    • +*
    +* @title Menu +* @namespace YAHOO.widget +* @requires Event, Dom, Container +*/ +(function() { + +var Dom = YAHOO.util.Dom, + Event = YAHOO.util.Event; + +/** +* Singleton that manages a collection of all menus and menu items. Listens for +* DOM events at the document level and dispatches the events to the +* corresponding menu or menu item. +* +* @namespace YAHOO.widget +* @class MenuManager +* @static +*/ +YAHOO.widget.MenuManager = function() { + + // Private member variables + + + // Flag indicating if the DOM event handlers have been attached + + var m_bInitializedEventHandlers = false, + + + // Collection of menus + + m_oMenus = {}, + + + // Collection of menu items + + m_oItems = {}, + + + // Collection of visible menus + + m_oVisibleMenus = {}, + + me = this; + + + + + // Private methods + + + /** + * @method addItem + * @description Adds an item to the collection of known menu items. + * @private + * @param {YAHOO.widget.MenuItem} p_oItem Object specifying the MenuItem + * instance to be added. + */ + function addItem(p_oItem) { + + var sId = p_oItem.id; + + if(p_oItem && m_oItems[sId] != p_oItem) { + + m_oItems[sId] = p_oItem; + + p_oItem.destroyEvent.subscribe(onItemDestroy, p_oItem); + + + } + + } + + + /** + * @method removeItem + * @description Removes an item from the collection of known menu items. + * @private + * @param {YAHOO.widget.MenuItem} p_oItem Object specifying the MenuItem + * instance to be removed. + */ + function removeItem(p_oItem) { + + var sId = p_oItem.id; + + if(sId && m_oItems[sId]) { + + delete m_oItems[sId]; + + + } + + } + + + /** + * @method getMenuRootElement + * @description Finds the root DIV node of a menu or the root LI node of a + * menu item. + * @private + * @param {HTMLElement} p_oElement Object specifying + * an HTML element. + */ + function getMenuRootElement(p_oElement) { + + var oParentNode; + + if(p_oElement && p_oElement.tagName) { + + switch(p_oElement.tagName.toUpperCase()) { + + case "DIV": + + oParentNode = p_oElement.parentNode; + + // Check if the DIV is the inner "body" node of a menu + + if( + ( + Dom.hasClass(p_oElement, "hd") || + Dom.hasClass(p_oElement, "bd") || + Dom.hasClass(p_oElement, "ft") + ) + && + oParentNode && + oParentNode.tagName && + oParentNode.tagName.toUpperCase() == "DIV" + ) { + + return oParentNode; + + } + else { + + return p_oElement; + + } + + break; + + case "LI": + + return p_oElement; + + default: + + oParentNode = p_oElement.parentNode; + + if(oParentNode) { + + return getMenuRootElement(oParentNode); + + } + + break; + + } + + } + + } + + + + // Private event handlers + + + /** + * @method onDOMEvent + * @description Generic, global event handler for all of a menu's DOM-based + * events. This listens for events against the document object. If the + * target of a given event is a member of a menu or menu item's DOM, the + * instance's corresponding Custom Event is fired. + * @private + * @param {Event} p_oEvent Object representing the DOM event object passed + * back by the event utility (YAHOO.util.Event). + */ + function onDOMEvent(p_oEvent) { + + // Get the target node of the DOM event + + var oTarget = Event.getTarget(p_oEvent), + + + // See if the target of the event was a menu, or a menu item + + oElement = getMenuRootElement(oTarget), + oMenuItem, + oMenu; + + + if(oElement) { + + var sTagName = oElement.tagName.toUpperCase(); + + if(sTagName == "LI") { + + var sId = oElement.id; + + if(sId && m_oItems[sId]) { + + oMenuItem = m_oItems[sId]; + oMenu = oMenuItem.parent; + + } + + } + else if(sTagName == "DIV") { + + if(oElement.id) { + + oMenu = m_oMenus[oElement.id]; + + } + + } + + } + + if(oMenu) { + + // Map of DOM event names to CustomEvent names + + var oEventTypes = { + "click": "clickEvent", + "mousedown": "mouseDownEvent", + "mouseup": "mouseUpEvent", + "mouseover": "mouseOverEvent", + "mouseout": "mouseOutEvent", + "keydown": "keyDownEvent", + "keyup": "keyUpEvent", + "keypress": "keyPressEvent" + }, + + sCustomEventType = oEventTypes[p_oEvent.type]; + + + // Fire the Custom Even that corresponds the current DOM event + + if(oMenuItem && !oMenuItem.cfg.getProperty("disabled")) { + + oMenuItem[sCustomEventType].fire(p_oEvent); + + } + + oMenu[sCustomEventType].fire(p_oEvent, oMenuItem); + + } + else if(p_oEvent.type == "mousedown") { + + + /* + If the target of the event wasn't a menu, hide all + dynamically positioned menus + */ + + var oActiveItem; + + for(var i in m_oMenus) { + + if(m_oMenus.hasOwnProperty(i)) { + + oMenu = m_oMenus[i]; + + if( + oMenu.cfg.getProperty("clicktohide") && + oMenu.cfg.getProperty("position") == "dynamic" + ) { + + oMenu.hide(); + + } + else { + + oMenu.clearActiveItem(true); + + } + + } + + } + + } + + } + + + /** + * @method onMenuDestroy + * @description "destroy" event handler for a menu. + * @private + * @param {String} p_sType String representing the name of the event that + * was fired. + * @param {Array} p_aArgs Array of arguments sent when the event was fired. + * @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that + * fired the event. + */ + function onMenuDestroy(p_sType, p_aArgs, p_oMenu) { + + if(p_oMenu && m_oMenus[p_oMenu.id]) { + + delete m_oMenus[p_oMenu.id]; + + + } + + } + + + /** + * @method onItemDestroy + * @description "destroy" event handler for a MenuItem instance. + * @private + * @param {String} p_sType String representing the name of the event that + * was fired. + * @param {Array} p_aArgs Array of arguments sent when the event was fired. + * @param {YAHOO.widget.MenuItem} p_oItem Object representing the menu item + * that fired the event. + */ + function onItemDestroy(p_sType, p_aArgs, p_oItem) { + + var sId = p_oItem.id; + + if(sId && m_oItems[sId]) { + + delete m_oItems[sId]; + + } + + } + + + /** + * @method onMenuVisibleConfigChange + * @description Event handler for when the "visible" configuration property + * of a Menu instance changes. + * @private + * @param {String} p_sType String representing the name of the event that + * was fired. + * @param {Array} p_aArgs Array of arguments sent when the event was fired. + * @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that + * fired the event. + */ + function onMenuVisibleConfigChange(p_sType, p_aArgs, p_oMenu) { + + var bVisible = p_aArgs[0]; + + if(bVisible) { + + m_oVisibleMenus[p_oMenu.id] = p_oMenu; + + + } + else if(m_oVisibleMenus[p_oMenu.id]) { + + delete m_oVisibleMenus[p_oMenu.id]; + + + } + + } + + + /** + * @method onItemAdded + * @description "itemadded" event handler for a Menu instance. + * @private + * @param {String} p_sType String representing the name of the event that + * was fired. + * @param {Array} p_aArgs Array of arguments sent when the event was fired. + */ + function onItemAdded(p_sType, p_aArgs) { + + addItem(p_aArgs[0]); + + } + + + /** + * @method onItemRemoved + * @description "itemremoved" event handler for a Menu instance. + * @private + * @param {String} p_sType String representing the name of the event that + * was fired. + * @param {Array} p_aArgs Array of arguments sent when the event was fired. + */ + function onItemRemoved(p_sType, p_aArgs) { + + removeItem(p_aArgs[0]); + + } + + + + return { + + // Privileged methods + + + /** + * @method addMenu + * @description Adds a menu to the collection of known menus. + * @param {YAHOO.widget.Menu} p_oMenu Object specifying the Menu + * instance to be added. + */ + addMenu: function(p_oMenu) { + + if(p_oMenu && p_oMenu.id && !m_oMenus[p_oMenu.id]) { + + m_oMenus[p_oMenu.id] = p_oMenu; + + + if(!m_bInitializedEventHandlers) { + + var oDoc = document; + + Event.addListener(oDoc, "mouseover", onDOMEvent, me, true); + Event.addListener(oDoc, "mouseout", onDOMEvent, me, true); + Event.addListener(oDoc, "mousedown", onDOMEvent, me, true); + Event.addListener(oDoc, "mouseup", onDOMEvent, me, true); + Event.addListener(oDoc, "click", onDOMEvent, me, true); + Event.addListener(oDoc, "keydown", onDOMEvent, me, true); + Event.addListener(oDoc, "keyup", onDOMEvent, me, true); + Event.addListener(oDoc, "keypress", onDOMEvent, me, true); + + m_bInitializedEventHandlers = true; + + + } + + p_oMenu.destroyEvent.subscribe(onMenuDestroy, p_oMenu, me); + + p_oMenu.cfg.subscribeToConfigEvent( + "visible", + onMenuVisibleConfigChange, + p_oMenu + ); + + p_oMenu.itemAddedEvent.subscribe(onItemAdded); + p_oMenu.itemRemovedEvent.subscribe(onItemRemoved); + + + } + + }, + + + /** + * @method removeMenu + * @description Removes a menu from the collection of known menus. + * @param {YAHOO.widget.Menu} p_oMenu Object specifying the Menu + * instance to be removed. + */ + removeMenu: function(p_oMenu) { + + if(p_oMenu && m_oMenus[p_oMenu.id]) { + + delete m_oMenus[p_oMenu.id]; + + + } + + }, + + + /** + * @method hideVisible + * @description Hides all visible, dynamically positioned menus. + */ + hideVisible: function() { + + var oMenu; + + for(var i in m_oVisibleMenus) { + + if(m_oVisibleMenus.hasOwnProperty(i)) { + + oMenu = m_oVisibleMenus[i]; + + if(oMenu.cfg.getProperty("position") == "dynamic") { + + oMenu.hide(); + + } + + } + + } + + }, + + + /** + * @method getMenus + * @description Returns an array of all menus registered with the + * menu manger. + * @return {Array} + */ + getMenus: function() { + + return m_oMenus; + + }, + + + /** + * @method getMenu + * @description Returns a menu with the specified id. + * @param {String} p_sId String specifying the id of the menu to + * be retrieved. + * @return {YAHOO.widget.Menu} + */ + getMenu: function(p_sId) { + + if(m_oMenus[p_sId]) { + + return m_oMenus[p_sId]; + + } + + }, + + + /** + * @method toString + * @description Returns a string representing the menu manager. + * @return {String} + */ + toString: function() { + + return ("MenuManager"); + + } + + }; + +}(); + +})(); + + + +/** +* The Menu class creates a container that holds a vertical list representing +* a set of options or commands. Menu is the base class for all +* menu containers. +* @param {String} p_oElement String specifying the id attribute of the +* <div> element of the menu. +* @param {String} p_oElement String specifying the id attribute of the +* <select> element to be used as the data source +* for the menu. +* @param {HTMLDivElement} p_oElement Object +* specifying the <div> element of the menu. +* @param {HTMLSelectElement} p_oElement +* Object specifying the <select> element to be used as +* the data source for the menu. +* @param {Object} p_oConfig Optional. Object literal specifying the +* configuration for the menu. See configuration class documentation for +* more details. +* @namespace YAHOO.widget +* @class Menu +* @constructor +* @extends YAHOO.widget.Overlay +*/ +(function() { + +var Dom = YAHOO.util.Dom, + Event = YAHOO.util.Event, + Lang = YAHOO.lang; + + +YAHOO.widget.Menu = function(p_oElement, p_oConfig) { + + if(p_oConfig) { + + this.parent = p_oConfig.parent; + this.lazyLoad = p_oConfig.lazyLoad || p_oConfig.lazyload; + this.itemData = p_oConfig.itemData || p_oConfig.itemdata; + + } + + + YAHOO.widget.Menu.superclass.constructor.call( + this, + p_oElement, + p_oConfig + ); + +}; + + +YAHOO.lang.extend(YAHOO.widget.Menu, YAHOO.widget.Overlay, { + + +// Constants + + +/** +* @property CSS_CLASS_NAME +* @description String representing the CSS class(es) to be applied to the +* menu's <div> element. +* @default "yuimenu" +* @final +* @type String +*/ +CSS_CLASS_NAME: "yuimenu", + + +/** +* @property ITEM_TYPE +* @description Object representing the type of menu item to instantiate and +* add when parsing the child nodes (either <li> element, +* <optgroup> element or <option>) +* of the menu's source HTML element. +* @default YAHOO.widget.MenuItem +* @final +* @type YAHOO.widget.MenuItem +*/ +ITEM_TYPE: null, + + +/** +* @property GROUP_TITLE_TAG_NAME +* @description String representing the tagname of the HTML element used to +* title the menu's item groups. +* @default H6 +* @final +* @type String +*/ +GROUP_TITLE_TAG_NAME: "h6", + + + +// Private properties + + +/** +* @property _nHideDelayId +* @description Number representing the time-out setting used to cancel the +* hiding of a menu. +* @default null +* @private +* @type Number +*/ +_nHideDelayId: null, + + +/** +* @property _nShowDelayId +* @description Number representing the time-out setting used to cancel the +* showing of a menu. +* @default null +* @private +* @type Number +*/ +_nShowDelayId: null, + + +/** +* @property _nSubmenuHideDelayId +* @description Number representing the time-out setting used to cancel the +* hiding of a submenu. +* @default null +* @private +* @type Number +*/ +_nSubmenuHideDelayId: null, + + +/** +* @property _nBodyScrollId +* @description Number representing the time-out setting used to cancel the +* scrolling of the menu's body element. +* @default null +* @private +* @type Number +*/ +_nBodyScrollId: null, + + +/** +* @property _bHideDelayEventHandlersAssigned +* @description Boolean indicating if the "mouseover" and "mouseout" event +* handlers used for hiding the menu via a call to "window.setTimeout" have +* already been assigned. +* @default false +* @private +* @type Boolean +*/ +_bHideDelayEventHandlersAssigned: false, + + +/** +* @property _bHandledMouseOverEvent +* @description Boolean indicating the current state of the menu's +* "mouseover" event. +* @default false +* @private +* @type Boolean +*/ +_bHandledMouseOverEvent: false, + + +/** +* @property _bHandledMouseOutEvent +* @description Boolean indicating the current state of the menu's +* "mouseout" event. +* @default false +* @private +* @type Boolean +*/ +_bHandledMouseOutEvent: false, + + +/** +* @property _aGroupTitleElements +* @description Array of HTML element used to title groups of menu items. +* @default [] +* @private +* @type Array +*/ +_aGroupTitleElements: null, + + +/** +* @property _aItemGroups +* @description Multi-dimensional Array representing the menu items as they +* are grouped in the menu. +* @default [] +* @private +* @type Array +*/ +_aItemGroups: null, + + +/** +* @property _aListElements +* @description Array of <ul> elements, each of which is +* the parent node for each item's <li> element. +* @default [] +* @private +* @type Array +*/ +_aListElements: null, + + +/** +* @property _nCurrentMouseX +* @description The current x coordinate of the mouse inside the area of +* the menu. +* @default 0 +* @private +* @type Number +*/ +_nCurrentMouseX: 0, + + +/** +* @property _nMaxHeight +* @description The original value of the "maxheight" configuration property +* as set by the user. +* @default -1 +* @private +* @type Number +*/ +_nMaxHeight: -1, + + +/** +* @property _bStopMouseEventHandlers +* @description Stops "mouseover," "mouseout," and "mousemove" event handlers +* from executing. +* @default false +* @private +* @type Boolean +*/ +_bStopMouseEventHandlers: false, + + +/** +* @property _sClassName +* @description The current value of the "classname" configuration attribute. +* @default null +* @private +* @type String +*/ +_sClassName: null, + + + +// Public properties + + +/** +* @property lazyLoad +* @description Boolean indicating if the menu's "lazy load" feature is +* enabled. If set to "true," initialization and rendering of the menu's +* items will be deferred until the first time it is made visible. This +* property should be set via the constructor using the configuration +* object literal. +* @default false +* @type Boolean +*/ +lazyLoad: false, + + +/** +* @property itemData +* @description Array of items to be added to the menu. The array can contain +* strings representing the text for each item to be created, object literals +* representing the menu item configuration properties, or MenuItem instances. +* This property should be set via the constructor using the configuration +* object literal. +* @default null +* @type Array +*/ +itemData: null, + + +/** +* @property activeItem +* @description Object reference to the item in the menu that has focus. +* @default null +* @type YAHOO.widget.MenuItem +*/ +activeItem: null, + + +/** +* @property parent +* @description Object reference to the menu's parent menu or menu item. +* This property can be set via the constructor using the configuration +* object literal. +* @default null +* @type YAHOO.widget.MenuItem +*/ +parent: null, + + +/** +* @property srcElement +* @description Object reference to the HTML element (either +* <select> or <div>) used to +* create the menu. +* @default null +* @type HTMLSelectElement|HTMLDivElement +*/ +srcElement: null, + + + +// Events + + +/** +* @event mouseOverEvent +* @description Fires when the mouse has entered the menu. Passes back +* the DOM Event object as an argument. +*/ +mouseOverEvent: null, + + +/** +* @event mouseOutEvent +* @description Fires when the mouse has left the menu. Passes back the DOM +* Event object as an argument. +* @type YAHOO.util.CustomEvent +*/ +mouseOutEvent: null, + + +/** +* @event mouseDownEvent +* @description Fires when the user mouses down on the menu. Passes back the +* DOM Event object as an argument. +* @type YAHOO.util.CustomEvent +*/ +mouseDownEvent: null, + + +/** +* @event mouseUpEvent +* @description Fires when the user releases a mouse button while the mouse is +* over the menu. Passes back the DOM Event object as an argument. +* @type YAHOO.util.CustomEvent +*/ +mouseUpEvent: null, + + +/** +* @event clickEvent +* @description Fires when the user clicks the on the menu. Passes back the +* DOM Event object as an argument. +* @type YAHOO.util.CustomEvent +*/ +clickEvent: null, + + +/** +* @event keyPressEvent +* @description Fires when the user presses an alphanumeric key when one of the +* menu's items has focus. Passes back the DOM Event object as an argument. +* @type YAHOO.util.CustomEvent +*/ +keyPressEvent: null, + + +/** +* @event keyDownEvent +* @description Fires when the user presses a key when one of the menu's items +* has focus. Passes back the DOM Event object as an argument. +* @type YAHOO.util.CustomEvent +*/ +keyDownEvent: null, + + +/** +* @event keyUpEvent +* @description Fires when the user releases a key when one of the menu's items +* has focus. Passes back the DOM Event object as an argument. +* @type YAHOO.util.CustomEvent +*/ +keyUpEvent: null, + + +/** +* @event itemAddedEvent +* @description Fires when an item is added to the menu. +* @type YAHOO.util.CustomEvent +*/ +itemAddedEvent: null, + + +/** +* @event itemRemovedEvent +* @description Fires when an item is removed to the menu. +* @type YAHOO.util.CustomEvent +*/ +itemRemovedEvent: null, + + +/** +* @method init +* @description The Menu class's initialization method. This method is +* automatically called by the constructor, and sets up all DOM references +* for pre-existing markup, and creates required markup if it is not +* already present. +* @param {String} p_oElement String specifying the id attribute of the +* <div> element of the menu. +* @param {String} p_oElement String specifying the id attribute of the +* <select> element to be used as the data source +* for the menu. +* @param {HTMLDivElement} p_oElement Object +* specifying the <div> element of the menu. +* @param {HTMLSelectElement} p_oElement +* Object specifying the <select> element to be used as +* the data source for the menu. +* @param {Object} p_oConfig Optional. Object literal specifying the +* configuration for the menu. See configuration class documentation for +* more details. +*/ +init: function(p_oElement, p_oConfig) { + + this._aItemGroups = []; + this._aListElements = []; + this._aGroupTitleElements = []; + + + if(!this.ITEM_TYPE) { + + this.ITEM_TYPE = YAHOO.widget.MenuItem; + + } + + + var oElement; + + if(typeof p_oElement == "string") { + + oElement = document.getElementById(p_oElement); + + } + else if(p_oElement.tagName) { + + oElement = p_oElement; + + } + + + if(oElement && oElement.tagName) { + + switch(oElement.tagName.toUpperCase()) { + + case "DIV": + + this.srcElement = oElement; + + if(!oElement.id) { + + oElement.setAttribute("id", Dom.generateId()); + + } + + + /* + Note: we don't pass the user config in here yet + because we only want it executed once, at the lowest + subclass level. + */ + + YAHOO.widget.Menu.superclass.init.call(this, oElement); + + this.beforeInitEvent.fire(YAHOO.widget.Menu); + + + + break; + + case "SELECT": + + this.srcElement = oElement; + + + /* + The source element is not something that we can use + outright, so we need to create a new Overlay + + Note: we don't pass the user config in here yet + because we only want it executed once, at the lowest + subclass level. + */ + + YAHOO.widget.Menu.superclass.init.call(this, Dom.generateId()); + + this.beforeInitEvent.fire(YAHOO.widget.Menu); + + + + break; + + } + + } + else { + + /* + Note: we don't pass the user config in here yet + because we only want it executed once, at the lowest + subclass level. + */ + + YAHOO.widget.Menu.superclass.init.call(this, p_oElement); + + this.beforeInitEvent.fire(YAHOO.widget.Menu); + + + + } + + + if(this.element) { + + var oEl = this.element; + + Dom.addClass(oEl, this.CSS_CLASS_NAME); + + + // Subscribe to Custom Events + + this.initEvent.subscribe(this._onInit, this, true); + this.beforeRenderEvent.subscribe(this._onBeforeRender, this, true); + this.renderEvent.subscribe(this._setWidth, this, true); + this.beforeShowEvent.subscribe(this._onBeforeShow, this, true); + this.showEvent.subscribe(this._onShow, this, true); + this.beforeHideEvent.subscribe(this._onBeforeHide, this, true); + this.hideEvent.subscribe(this._onHide, this, true); + this.mouseOverEvent.subscribe(this._onMouseOver, this, true); + this.mouseOutEvent.subscribe(this._onMouseOut, this, true); + this.clickEvent.subscribe(this._onClick, this, true); + this.keyDownEvent.subscribe(this._onKeyDown, this, true); + this.keyPressEvent.subscribe(this._onKeyPress, this, true); + + YAHOO.widget.Module.textResizeEvent.subscribe( + this._onTextResize, + this, + true + ); + + + if(p_oConfig) { + + this.cfg.applyConfig(p_oConfig, true); + + } + + + // Register the Menu instance with the MenuManager + + YAHOO.widget.MenuManager.addMenu(this); + + + this.initEvent.fire(YAHOO.widget.Menu); + + } + +}, + + + +// Private methods + + +/** +* @method _initSubTree +* @description Iterates the childNodes of the source element to find nodes +* used to instantiate menu and menu items. +* @private +*/ +_initSubTree: function() { + + var oNode; + + if(this.srcElement.tagName.toUpperCase() == "DIV") { + + /* + Populate the collection of item groups and item + group titles + */ + + oNode = this.body.firstChild; + + var nGroup = 0, + sGroupTitleTagName = this.GROUP_TITLE_TAG_NAME.toUpperCase(); + + do { + + if(oNode && oNode.tagName) { + + switch(oNode.tagName.toUpperCase()) { + + case sGroupTitleTagName: + + this._aGroupTitleElements[nGroup] = oNode; + + break; + + case "UL": + + this._aListElements[nGroup] = oNode; + this._aItemGroups[nGroup] = []; + nGroup++; + + break; + + } + + } + + } + while((oNode = oNode.nextSibling)); + + + /* + Apply the "first-of-type" class to the first UL to mimic + the "first-of-type" CSS3 psuedo class. + */ + + if(this._aListElements[0]) { + + Dom.addClass(this._aListElements[0], "first-of-type"); + + } + + } + + + oNode = null; + + + if(this.srcElement.tagName) { + + var sSrcElementTagName = this.srcElement.tagName.toUpperCase(); + + + switch(sSrcElementTagName) { + + case "DIV": + + if(this._aListElements.length > 0) { + + + var i = this._aListElements.length - 1; + + do { + + oNode = this._aListElements[i].firstChild; + + + do { + + if( + oNode && + oNode.tagName && + oNode.tagName.toUpperCase() == "LI" + ) { + + + this.addItem( + new this.ITEM_TYPE( + oNode, + { parent: this } + ), + i + ); + + } + + } + while((oNode = oNode.nextSibling)); + + } + while(i--); + + } + + break; + + case "SELECT": + + + oNode = this.srcElement.firstChild; + + do { + + if(oNode && oNode.tagName) { + + switch(oNode.tagName.toUpperCase()) { + + case "OPTGROUP": + case "OPTION": + + + this.addItem( + new this.ITEM_TYPE( + oNode, + { parent: this } + ) + ); + + break; + + } + + } + + } + while((oNode = oNode.nextSibling)); + + break; + + } + + } + +}, + + +/** +* @method _getFirstEnabledItem +* @description Returns the first enabled item in the menu. +* @return {YAHOO.widget.MenuItem} +* @private +*/ +_getFirstEnabledItem: function() { + + var aItems = this.getItems(), + nItems = aItems.length, + oItem; + + for(var i=0; i= aGroup.length); + + + if(aGroup[p_nItemIndex]) { + + aGroup.splice(p_nItemIndex, 0, oItem); + + } + else { + + aGroup[p_nItemIndex] = oItem; + + } + + + oGroupItem = aGroup[p_nItemIndex]; + + if(oGroupItem) { + + if( + bAppend && + ( + !oGroupItem.element.parentNode || + oGroupItem.element.parentNode.nodeType == 11 + ) + ) { + + this._aListElements[nGroupIndex].appendChild( + oGroupItem.element + ); + + } + else { + + function getNextItemSibling(p_aArray, p_nStartIndex) { + + return ( + p_aArray[p_nStartIndex] || + getNextItemSibling( + p_aArray, + (p_nStartIndex+1) + ) + ); + + } + + + var oNextItemSibling = + getNextItemSibling(aGroup, (p_nItemIndex+1)); + + if( + oNextItemSibling && + ( + !oGroupItem.element.parentNode || + oGroupItem.element.parentNode.nodeType == 11 + ) + ) { + + this._aListElements[nGroupIndex].insertBefore( + oGroupItem.element, + oNextItemSibling.element + ); + + } + + } + + + oGroupItem.parent = this; + + this._subscribeToItemEvents(oGroupItem); + + this._configureSubmenu(oGroupItem); + + this._updateItemProperties(nGroupIndex); + + + this.itemAddedEvent.fire(oGroupItem); + + return oGroupItem; + + } + + } + else { + + var nItemIndex = aGroup.length; + + aGroup[nItemIndex] = oItem; + + oGroupItem = aGroup[nItemIndex]; + + + if(oGroupItem) { + + if( + !Dom.isAncestor( + this._aListElements[nGroupIndex], + oGroupItem.element + ) + ) { + + this._aListElements[nGroupIndex].appendChild( + oGroupItem.element + ); + + } + + oGroupItem.element.setAttribute("groupindex", nGroupIndex); + oGroupItem.element.setAttribute("index", nItemIndex); + + oGroupItem.parent = this; + + oGroupItem.index = nItemIndex; + oGroupItem.groupIndex = nGroupIndex; + + this._subscribeToItemEvents(oGroupItem); + + this._configureSubmenu(oGroupItem); + + if(nItemIndex === 0) { + + Dom.addClass(oGroupItem.element, "first-of-type"); + + } + + + + this.itemAddedEvent.fire(oGroupItem); + + return oGroupItem; + + } + + } + + } + +}, + + +/** +* @method _removeItemFromGroupByIndex +* @description Removes a menu item from a group by index. Returns the menu +* item that was removed. +* @private +* @param {Number} p_nGroupIndex Number indicating the group to which the menu +* item belongs. +* @param {Number} p_nItemIndex Number indicating the index of the menu item +* to be removed. +* @return {YAHOO.widget.MenuItem} +*/ +_removeItemFromGroupByIndex: function(p_nGroupIndex, p_nItemIndex) { + + var nGroupIndex = typeof p_nGroupIndex == "number" ? p_nGroupIndex : 0, + aGroup = this._getItemGroup(nGroupIndex); + + if(aGroup) { + + var aArray = aGroup.splice(p_nItemIndex, 1), + oItem = aArray[0]; + + if(oItem) { + + // Update the index and className properties of each member + + this._updateItemProperties(nGroupIndex); + + if(aGroup.length === 0) { + + // Remove the UL + + var oUL = this._aListElements[nGroupIndex]; + + if(this.body && oUL) { + + this.body.removeChild(oUL); + + } + + // Remove the group from the array of items + + this._aItemGroups.splice(nGroupIndex, 1); + + + // Remove the UL from the array of ULs + + this._aListElements.splice(nGroupIndex, 1); + + + /* + Assign the "first-of-type" class to the new first UL + in the collection + */ + + oUL = this._aListElements[0]; + + if(oUL) { + + Dom.addClass(oUL, "first-of-type"); + + } + + } + + + this.itemRemovedEvent.fire(oItem); + + + // Return a reference to the item that was removed + + return oItem; + + } + + } + +}, + + +/** +* @method _removeItemFromGroupByValue +* @description Removes a menu item from a group by reference. Returns the +* menu item that was removed. +* @private +* @param {Number} p_nGroupIndex Number indicating the group to which the +* menu item belongs. +* @param {YAHOO.widget.MenuItem} p_oItem Object reference for the MenuItem +* instance to be removed. +* @return {YAHOO.widget.MenuItem} +*/ +_removeItemFromGroupByValue: function(p_nGroupIndex, p_oItem) { + + var aGroup = this._getItemGroup(p_nGroupIndex); + + if(aGroup) { + + var nItems = aGroup.length, + nItemIndex = -1; + + if(nItems > 0) { + + var i = nItems-1; + + do { + + if(aGroup[i] == p_oItem) { + + nItemIndex = i; + break; + + } + + } + while(i--); + + if(nItemIndex > -1) { + + return this._removeItemFromGroupByIndex( + p_nGroupIndex, + nItemIndex + ); + + } + + } + + } + +}, + + +/** +* @method _updateItemProperties +* @description Updates the "index," "groupindex," and "className" properties +* of the menu items in the specified group. +* @private +* @param {Number} p_nGroupIndex Number indicating the group of items to update. +*/ +_updateItemProperties: function(p_nGroupIndex) { + + var aGroup = this._getItemGroup(p_nGroupIndex), + nItems = aGroup.length; + + if(nItems > 0) { + + var i = nItems - 1, + oItem, + oLI; + + // Update the index and className properties of each member + + do { + + oItem = aGroup[i]; + + if(oItem) { + + oLI = oItem.element; + + oItem.index = i; + oItem.groupIndex = p_nGroupIndex; + + oLI.setAttribute("groupindex", p_nGroupIndex); + oLI.setAttribute("index", i); + + Dom.removeClass(oLI, "first-of-type"); + + } + + } + while(i--); + + + if(oLI) { + + Dom.addClass(oLI, "first-of-type"); + + } + + } + +}, + + +/** +* @method _createItemGroup +* @description Creates a new menu item group (array) and its associated +* <ul> element. Returns an aray of menu item groups. +* @private +* @param {Number} p_nIndex Number indicating the group to create. +* @return {Array} +*/ +_createItemGroup: function(p_nIndex) { + + if(!this._aItemGroups[p_nIndex]) { + + this._aItemGroups[p_nIndex] = []; + + var oUL = document.createElement("ul"); + + this._aListElements[p_nIndex] = oUL; + + return this._aItemGroups[p_nIndex]; + + } + +}, + + +/** +* @method _getItemGroup +* @description Returns the menu item group at the specified index. +* @private +* @param {Number} p_nIndex Number indicating the index of the menu item group +* to be retrieved. +* @return {Array} +*/ +_getItemGroup: function(p_nIndex) { + + var nIndex = ((typeof p_nIndex == "number") ? p_nIndex : 0); + + return this._aItemGroups[nIndex]; + +}, + + +/** +* @method _configureSubmenu +* @description Subscribes the menu item's submenu to its parent menu's events. +* @private +* @param {YAHOO.widget.MenuItem} p_oItem Object reference for the MenuItem +* instance with the submenu to be configured. +*/ +_configureSubmenu: function(p_oItem) { + + var oSubmenu = p_oItem.cfg.getProperty("submenu"); + + if(oSubmenu) { + + /* + Listen for configuration changes to the parent menu + so they they can be applied to the submenu. + */ + + this.cfg.configChangedEvent.subscribe( + this._onParentMenuConfigChange, + oSubmenu, + true + ); + + this.renderEvent.subscribe( + this._onParentMenuRender, + oSubmenu, + true + ); + + oSubmenu.beforeShowEvent.subscribe( + this._onSubmenuBeforeShow, + oSubmenu, + true + ); + + oSubmenu.showEvent.subscribe( + this._onSubmenuShow, + oSubmenu, + true + ); + + oSubmenu.hideEvent.subscribe( + this._onSubmenuHide, + oSubmenu, + true + ); + + } + +}, + + +/** +* @method _subscribeToItemEvents +* @description Subscribes a menu to a menu item's event. +* @private +* @param {YAHOO.widget.MenuItem} p_oItem Object reference for the MenuItem +* instance whose events should be subscribed to. +*/ +_subscribeToItemEvents: function(p_oItem) { + + p_oItem.focusEvent.subscribe(this._onMenuItemFocus, p_oItem, this); + + p_oItem.blurEvent.subscribe(this._onMenuItemBlur, this, true); + + p_oItem.cfg.configChangedEvent.subscribe( + this._onMenuItemConfigChange, + p_oItem, + this + ); + +}, + + +/** +* @method _getOffsetWidth +* @description Returns the offset width of the menu's +* <div> element. +* @private +*/ +_getOffsetWidth: function() { + + var oClone = this.element.cloneNode(true); + + Dom.setStyle(oClone, "width", ""); + + document.body.appendChild(oClone); + + var sWidth = oClone.offsetWidth; + + document.body.removeChild(oClone); + + return sWidth; + +}, + + +/** +* @method _setWidth +* @description Sets the width of the menu's root <div> +* element to its offsetWidth. +* @private +*/ +_setWidth: function() { + + if(this.cfg.getProperty("position") == "dynamic") { + + var sWidth; + + if(this.element.parentNode.tagName.toUpperCase() == "BODY") { + + if(this.browser == "opera") { + + sWidth = this._getOffsetWidth(); + + } + else { + + Dom.setStyle(this.element, "width", "auto"); + + sWidth = this.element.offsetWidth; + + } + + } + else { + + sWidth = this._getOffsetWidth(); + + } + + this.cfg.setProperty("width", (sWidth + "px")); + + } + +}, + + +/** +* @method _cancelHideDelay +* @description Cancels the call to "hideMenu." +* @private +*/ +_cancelHideDelay: function() { + + var oRoot = this.getRoot(); + + if(oRoot._nHideDelayId) { + + window.clearTimeout(oRoot._nHideDelayId); + + } + +}, + + +/** +* @method _execHideDelay +* @description Hides the menu after the number of milliseconds specified by +* the "hidedelay" configuration property. +* @private +*/ +_execHideDelay: function() { + + this._cancelHideDelay(); + + var oRoot = this.getRoot(), + me = this; + + function hideMenu() { + + if(oRoot.activeItem) { + + oRoot.clearActiveItem(); + + } + + if(oRoot == me && me.cfg.getProperty("position") == "dynamic") { + + me.hide(); + + } + + } + + + oRoot._nHideDelayId = + window.setTimeout(hideMenu, oRoot.cfg.getProperty("hidedelay")); + +}, + + +/** +* @method _cancelShowDelay +* @description Cancels the call to the "showMenu." +* @private +*/ +_cancelShowDelay: function() { + + var oRoot = this.getRoot(); + + if(oRoot._nShowDelayId) { + + window.clearTimeout(oRoot._nShowDelayId); + + } + +}, + + +/** +* @method _execShowDelay +* @description Shows the menu after the number of milliseconds specified by +* the "showdelay" configuration property have ellapsed. +* @private +* @param {YAHOO.widget.Menu} p_oMenu Object specifying the menu that should +* be made visible. +*/ +_execShowDelay: function(p_oMenu) { + + var oRoot = this.getRoot(); + + function showMenu() { + + if(p_oMenu.parent.cfg.getProperty("selected")) { + + p_oMenu.show(); + + } + + } + + + oRoot._nShowDelayId = + window.setTimeout(showMenu, oRoot.cfg.getProperty("showdelay")); + +}, + + +/** +* @method _execSubmenuHideDelay +* @description Hides a submenu after the number of milliseconds specified by +* the "submenuhidedelay" configuration property have ellapsed. +* @private +* @param {YAHOO.widget.Menu} p_oSubmenu Object specifying the submenu that +* should be hidden. +* @param {Number} p_nMouseX The x coordinate of the mouse when it left +* the specified submenu's parent menu item. +* @param {Number} p_nHideDelay The number of milliseconds that should ellapse +* before the submenu is hidden. +*/ +_execSubmenuHideDelay: function(p_oSubmenu, p_nMouseX, p_nHideDelay) { + + var me = this; + + p_oSubmenu._nSubmenuHideDelayId = window.setTimeout(function () { + + if(me._nCurrentMouseX > (p_nMouseX + 10)) { + + p_oSubmenu._nSubmenuHideDelayId = window.setTimeout(function () { + + p_oSubmenu.hide(); + + }, p_nHideDelay); + + } + else { + + p_oSubmenu.hide(); + + } + + }, 50); + +}, + + + +// Protected methods + + +/** +* @method _disableScrollHeader +* @description Disables the header used for scrolling the body of the menu. +* @protected +*/ +_disableScrollHeader: function() { + + if(!this._bHeaderDisabled) { + + Dom.addClass(this.header, "topscrollbar_disabled"); + this._bHeaderDisabled = true; + + } + +}, + + +/** +* @method _disableScrollFooter +* @description Disables the footer used for scrolling the body of the menu. +* @protected +*/ +_disableScrollFooter: function() { + + if(!this._bFooterDisabled) { + + Dom.addClass(this.footer, "bottomscrollbar_disabled"); + this._bFooterDisabled = true; + + } + +}, + + +/** +* @method _enableScrollHeader +* @description Enables the header used for scrolling the body of the menu. +* @protected +*/ +_enableScrollHeader: function() { + + if(this._bHeaderDisabled) { + + Dom.removeClass(this.header, "topscrollbar_disabled"); + this._bHeaderDisabled = false; + + } + +}, + + +/** +* @method _enableScrollFooter +* @description Enables the footer used for scrolling the body of the menu. +* @protected +*/ +_enableScrollFooter: function() { + + if(this._bFooterDisabled) { + + Dom.removeClass(this.footer, "bottomscrollbar_disabled"); + this._bFooterDisabled = false; + + } + +}, + + + +/** +* @method _onMouseOver +* @description "mouseover" event handler for the menu. +* @protected +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that +* fired the event. +*/ +_onMouseOver: function(p_sType, p_aArgs, p_oMenu) { + + if(this._bStopMouseEventHandlers) { + + return false; + + } + + + var oEvent = p_aArgs[0], + oItem = p_aArgs[1], + oTarget = Event.getTarget(oEvent); + + + if( + !this._bHandledMouseOverEvent && + (oTarget == this.element || Dom.isAncestor(this.element, oTarget)) + ) { + + // Menu mouseover logic + + this._nCurrentMouseX = 0; + + Event.addListener( + this.element, + "mousemove", + this._onMouseMove, + this, + true + ); + + + this.clearActiveItem(); + + + if(this.parent && this._nSubmenuHideDelayId) { + + window.clearTimeout(this._nSubmenuHideDelayId); + + this.parent.cfg.setProperty("selected", true); + + var oParentMenu = this.parent.parent; + + oParentMenu.activeItem = this.parent; + + oParentMenu._bHandledMouseOutEvent = true; + oParentMenu._bHandledMouseOverEvent = false; + + } + + + this._bHandledMouseOverEvent = true; + this._bHandledMouseOutEvent = false; + + } + + + if( + oItem && !oItem.handledMouseOverEvent && + !oItem.cfg.getProperty("disabled") && + (oTarget == oItem.element || Dom.isAncestor(oItem.element, oTarget)) + ) { + + // Menu Item mouseover logic + + var nShowDelay = this.cfg.getProperty("showdelay"), + bShowDelay = (nShowDelay > 0); + + + if(bShowDelay) { + + this._cancelShowDelay(); + + } + + + var oActiveItem = this.activeItem; + + if(oActiveItem) { + + oActiveItem.cfg.setProperty("selected", false); + + } + + + var oItemCfg = oItem.cfg; + + // Select and focus the current menu item + + oItemCfg.setProperty("selected", true); + oItem.focus(); + + + if(this.cfg.getProperty("autosubmenudisplay")) { + + // Show the submenu this menu item + + var oSubmenu = oItemCfg.getProperty("submenu"); + + if(oSubmenu) { + + if(bShowDelay) { + + this._execShowDelay(oSubmenu); + + } + else { + + oSubmenu.show(); + + } + + } + + } + + oItem.handledMouseOverEvent = true; + oItem.handledMouseOutEvent = false; + + } + +}, + + +/** +* @method _onMouseOut +* @description "mouseout" event handler for the menu. +* @protected +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that +* fired the event. +*/ +_onMouseOut: function(p_sType, p_aArgs, p_oMenu) { + + if(this._bStopMouseEventHandlers) { + + return false; + + } + + + var oEvent = p_aArgs[0], + oItem = p_aArgs[1], + oRelatedTarget = Event.getRelatedTarget(oEvent), + bMovingToSubmenu = false; + + + if(oItem && !oItem.cfg.getProperty("disabled")) { + + var oItemCfg = oItem.cfg, + oSubmenu = oItemCfg.getProperty("submenu"); + + + if( + oSubmenu && + ( + oRelatedTarget == oSubmenu.element || + Dom.isAncestor(oSubmenu.element, oRelatedTarget) + ) + ) { + + bMovingToSubmenu = true; + + } + + + if( + !oItem.handledMouseOutEvent && + ( + ( + oRelatedTarget != oItem.element && + !Dom.isAncestor(oItem.element, oRelatedTarget) + ) || bMovingToSubmenu + ) + ) { + + // Menu Item mouseout logic + + if(!bMovingToSubmenu) { + + oItem.cfg.setProperty("selected", false); + + + if(oSubmenu) { + + var nSubmenuHideDelay = + this.cfg.getProperty("submenuhidedelay"), + + nShowDelay = this.cfg.getProperty("showdelay"); + + if( + !(this instanceof YAHOO.widget.MenuBar) && + nSubmenuHideDelay > 0 && + nShowDelay >= nSubmenuHideDelay + ) { + + this._execSubmenuHideDelay( + oSubmenu, + Event.getPageX(oEvent), + nSubmenuHideDelay + ); + + } + else { + + oSubmenu.hide(); + + } + + } + + } + + + oItem.handledMouseOutEvent = true; + oItem.handledMouseOverEvent = false; + + } + + } + + + if( + !this._bHandledMouseOutEvent && + ( + ( + oRelatedTarget != this.element && + !Dom.isAncestor(this.element, oRelatedTarget) + ) + || bMovingToSubmenu + ) + ) { + + // Menu mouseout logic + + Event.removeListener(this.element, "mousemove", this._onMouseMove); + + this._nCurrentMouseX = Event.getPageX(oEvent); + + this._bHandledMouseOutEvent = true; + this._bHandledMouseOverEvent = false; + + } + +}, + + +/** +* @method _onMouseMove +* @description "click" event handler for the menu. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that +* fired the event. +*/ +_onMouseMove: function(p_oEvent, p_oMenu) { + + if(this._bStopMouseEventHandlers) { + + return false; + + } + + this._nCurrentMouseX = Event.getPageX(p_oEvent); + +}, + + +/** +* @method _onClick +* @description "click" event handler for the menu. +* @protected +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that +* fired the event. +*/ +_onClick: function(p_sType, p_aArgs, p_oMenu) { + + var oEvent = p_aArgs[0], + oItem = p_aArgs[1], + oTarget = Event.getTarget(oEvent); + + if(oItem && !oItem.cfg.getProperty("disabled")) { + + var oItemCfg = oItem.cfg, + oSubmenu = oItemCfg.getProperty("submenu"); + + + /* + ACCESSIBILITY FEATURE FOR SCREEN READERS: + Expand/collapse the submenu when the user clicks + on the submenu indicator image. + */ + + if(oTarget == oItem.submenuIndicator && oSubmenu) { + + if(oSubmenu.cfg.getProperty("visible")) { + + oSubmenu.hide(); + + oSubmenu.parent.focus(); + + } + else { + + this.clearActiveItem(); + + this.activeItem = oItem; + + oItem.cfg.setProperty("selected", true); + + oSubmenu.show(); + + } + + } + else { + + var sURL = oItemCfg.getProperty("url"), + bCurrentPageURL = (sURL.substr((sURL.length-1),1) == "#"), + sTarget = oItemCfg.getProperty("target"), + bHasTarget = (sTarget && sTarget.length > 0); + + /* + Prevent the browser from following links + equal to "#" + */ + + if( + oTarget.tagName.toUpperCase() == "A" && + bCurrentPageURL && !bHasTarget + ) { + + Event.preventDefault(oEvent); + + } + + if( + oTarget.tagName.toUpperCase() != "A" && + !bCurrentPageURL && !bHasTarget + ) { + + /* + Follow the URL of the item regardless of + whether or not the user clicked specifically + on the anchor element. + */ + + document.location = sURL; + + } + + + /* + If the item doesn't navigate to a URL and it doesn't have + a submenu, then collapse the menu tree. + */ + + if(bCurrentPageURL && !oSubmenu) { + + var oRoot = this.getRoot(); + + if(oRoot.cfg.getProperty("position") == "static") { + + oRoot.clearActiveItem(); + + } + else if(oRoot.cfg.getProperty("clicktohide")) { + + oRoot.hide(); + + } + + } + + } + + } + +}, + + +/** +* @method _onKeyDown +* @description "keydown" event handler for the menu. +* @protected +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that +* fired the event. +*/ +_onKeyDown: function(p_sType, p_aArgs, p_oMenu) { + + var oEvent = p_aArgs[0], + oItem = p_aArgs[1], + me = this, + oSubmenu; + + + /* + This function is called to prevent a bug in Firefox. In Firefox, + moving a DOM element into a stationary mouse pointer will cause the + browser to fire mouse events. This can result in the menu mouse + event handlers being called uncessarily, especially when menus are + moved into a stationary mouse pointer as a result of a + key event handler. + */ + function stopMouseEventHandlers() { + + me._bStopMouseEventHandlers = true; + + window.setTimeout(function() { + + me._bStopMouseEventHandlers = false; + + }, 10); + + } + + + if(oItem && !oItem.cfg.getProperty("disabled")) { + + var oItemCfg = oItem.cfg, + oParentItem = this.parent, + oRoot, + oNextItem; + + + switch(oEvent.keyCode) { + + case 38: // Up arrow + case 40: // Down arrow + + if( + oItem == this.activeItem && + !oItemCfg.getProperty("selected") + ) { + + oItemCfg.setProperty("selected", true); + + } + else { + + oNextItem = (oEvent.keyCode == 38) ? + oItem.getPreviousEnabledSibling() : + oItem.getNextEnabledSibling(); + + if(oNextItem) { + + this.clearActiveItem(); + + oNextItem.cfg.setProperty("selected", true); + oNextItem.focus(); + + + if(this.cfg.getProperty("maxheight") > 0) { + + var oBody = this.body; + + oBody.scrollTop = + + ( + oNextItem.element.offsetTop + + oNextItem.element.offsetHeight + ) - oBody.offsetHeight; + + + var nScrollTop = oBody.scrollTop, + nScrollTarget = + oBody.scrollHeight - oBody.offsetHeight; + + if(nScrollTop === 0) { + + this._disableScrollHeader(); + this._enableScrollFooter(); + + } + else if(nScrollTop == nScrollTarget) { + + this._enableScrollHeader(); + this._disableScrollFooter(); + + } + else { + + this._enableScrollHeader(); + this._enableScrollFooter(); + + } + + } + + } + + } + + Event.preventDefault(oEvent); + + stopMouseEventHandlers(); + + break; + + + case 39: // Right arrow + + oSubmenu = oItemCfg.getProperty("submenu"); + + if(oSubmenu) { + + if(!oItemCfg.getProperty("selected")) { + + oItemCfg.setProperty("selected", true); + + } + + oSubmenu.show(); + + oSubmenu.setInitialSelection(); + + } + else { + + oRoot = this.getRoot(); + + if(oRoot instanceof YAHOO.widget.MenuBar) { + + oNextItem = oRoot.activeItem.getNextEnabledSibling(); + + if(oNextItem) { + + oRoot.clearActiveItem(); + + oNextItem.cfg.setProperty("selected", true); + + oSubmenu = oNextItem.cfg.getProperty("submenu"); + + if(oSubmenu) { + + oSubmenu.show(); + + } + + oNextItem.focus(); + + } + + } + + } + + + Event.preventDefault(oEvent); + + stopMouseEventHandlers(); + + break; + + + case 37: // Left arrow + + if(oParentItem) { + + var oParentMenu = oParentItem.parent; + + if(oParentMenu instanceof YAHOO.widget.MenuBar) { + + oNextItem = + oParentMenu.activeItem.getPreviousEnabledSibling(); + + if(oNextItem) { + + oParentMenu.clearActiveItem(); + + oNextItem.cfg.setProperty("selected", true); + + oSubmenu = oNextItem.cfg.getProperty("submenu"); + + if(oSubmenu) { + + oSubmenu.show(); + + } + + oNextItem.focus(); + + } + + } + else { + + this.hide(); + + oParentItem.focus(); + + } + + } + + Event.preventDefault(oEvent); + + stopMouseEventHandlers(); + + break; + + } + + + } + + + if(oEvent.keyCode == 27) { // Esc key + + if(this.cfg.getProperty("position") == "dynamic") { + + this.hide(); + + if(this.parent) { + + this.parent.focus(); + + } + + } + else if(this.activeItem) { + + oSubmenu = this.activeItem.cfg.getProperty("submenu"); + + if(oSubmenu && oSubmenu.cfg.getProperty("visible")) { + + oSubmenu.hide(); + this.activeItem.focus(); + + } + else { + + this.activeItem.cfg.setProperty("selected", false); + this.activeItem.blur(); + + } + + } + + + Event.preventDefault(oEvent); + + } + +}, + + +/** +* @method _onKeyPress +* @description "keypress" event handler for a Menu instance. +* @protected +* @param {String} p_sType The name of the event that was fired. +* @param {Array} p_aArgs Collection of arguments sent when the event +* was fired. +* @param {YAHOO.widget.Menu} p_oMenu The Menu instance that fired the event. +*/ +_onKeyPress: function(p_sType, p_aArgs, p_oMenu) { + + var oEvent = p_aArgs[0]; + + + if(oEvent.keyCode == 40 || oEvent.keyCode == 38) { + + YAHOO.util.Event.preventDefault(oEvent); + + } + +}, + + +/** +* @method _onTextResize +* @description "textresize" event handler for the menu. +* @protected +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that +* fired the event. +*/ +_onTextResize: function(p_sType, p_aArgs, p_oMenu) { + + if(this.browser == "gecko" && !this._handleResize) { + + this._handleResize = true; + return; + + } + + + var oConfig = this.cfg; + + if(oConfig.getProperty("position") == "dynamic") { + + oConfig.setProperty("width", (this._getOffsetWidth() + "px")); + + } + +}, + + +/** +* @method _onScrollTargetMouseOver +* @description "mouseover" event handler for the menu's "header" and "footer" +* elements. Used to scroll the body of the menu up and down when the +* menu's "maxheight" configuration property is set to a value greater than 0. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that +* fired the event. +*/ +_onScrollTargetMouseOver: function(p_oEvent, p_oMenu) { + + this._cancelHideDelay(); + + var oTarget = Event.getTarget(p_oEvent), + oBody = this.body, + me = this, + nScrollTarget, + fnScrollFunction; + + + function scrollBodyDown() { + + var nScrollTop = oBody.scrollTop; + + + if(nScrollTop < nScrollTarget) { + + oBody.scrollTop = (nScrollTop + 1); + + me._enableScrollHeader(); + + } + else { + + oBody.scrollTop = nScrollTarget; + + window.clearInterval(me._nBodyScrollId); + + me._disableScrollFooter(); + + } + + } + + + function scrollBodyUp() { + + var nScrollTop = oBody.scrollTop; + + + if(nScrollTop > 0) { + + oBody.scrollTop = (nScrollTop - 1); + + me._enableScrollFooter(); + + } + else { + + oBody.scrollTop = 0; + + window.clearInterval(me._nBodyScrollId); + + me._disableScrollHeader(); + + } + + } + + + if(Dom.hasClass(oTarget, "hd")) { + + fnScrollFunction = scrollBodyUp; + + } + else { + + nScrollTarget = oBody.scrollHeight - oBody.offsetHeight; + + fnScrollFunction = scrollBodyDown; + + } + + + this._nBodyScrollId = window.setInterval(fnScrollFunction, 10); + +}, + + +/** +* @method _onScrollTargetMouseOut +* @description "mouseout" event handler for the menu's "header" and "footer" +* elements. Used to stop scrolling the body of the menu up and down when the +* menu's "maxheight" configuration property is set to a value greater than 0. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that +* fired the event. +*/ +_onScrollTargetMouseOut: function(p_oEvent, p_oMenu) { + + window.clearInterval(this._nBodyScrollId); + + this._cancelHideDelay(); + +}, + + + +// Private methods + + +/** +* @method _onInit +* @description "init" event handler for the menu. +* @private +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that +* fired the event. +*/ +_onInit: function(p_sType, p_aArgs, p_oMenu) { + + if( + ( + (this.parent && !this.lazyLoad) || + (!this.parent && this.cfg.getProperty("position") == "static") || + ( + !this.parent && + !this.lazyLoad && + this.cfg.getProperty("position") == "dynamic" + ) + ) && + this.getItemGroups().length === 0 + ) { + + if(this.srcElement) { + + this._initSubTree(); + + } + + + if(this.itemData) { + + this.addItems(this.itemData); + + } + + } + else if(this.lazyLoad) { + + this.cfg.fireQueue(); + + } + +}, + + +/** +* @method _onBeforeRender +* @description "beforerender" event handler for the menu. Appends all of the +* <ul>, <li> and their accompanying +* title elements to the body element of the menu. +* @private +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that +* fired the event. +*/ +_onBeforeRender: function(p_sType, p_aArgs, p_oMenu) { + + var oConfig = this.cfg, + oEl = this.element, + nListElements = this._aListElements.length; + + + if(nListElements > 0) { + + var i = 0, + bFirstList = true, + oUL, + oGroupTitle; + + + do { + + oUL = this._aListElements[i]; + + if(oUL) { + + if(bFirstList) { + + Dom.addClass(oUL, "first-of-type"); + bFirstList = false; + + } + + + if(!Dom.isAncestor(oEl, oUL)) { + + this.appendToBody(oUL); + + } + + + oGroupTitle = this._aGroupTitleElements[i]; + + if(oGroupTitle) { + + if(!Dom.isAncestor(oEl, oGroupTitle)) { + + oUL.parentNode.insertBefore(oGroupTitle, oUL); + + } + + + Dom.addClass(oUL, "hastitle"); + + } + + } + + i++; + + } + while(i < nListElements); + + } + +}, + + +/** +* @method _onBeforeShow +* @description "beforeshow" event handler for the menu. +* @private +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that +* fired the event. +*/ +_onBeforeShow: function(p_sType, p_aArgs, p_oMenu) { + + if(this.lazyLoad && this.getItemGroups().length === 0) { + + if(this.srcElement) { + + this._initSubTree(); + + } + + + if(this.itemData) { + + if( + this.parent && this.parent.parent && + this.parent.parent.srcElement && + this.parent.parent.srcElement.tagName.toUpperCase() == "SELECT" + ) { + + var nOptions = this.itemData.length; + + for(var n=0; n= nViewportHeight) { + + var nMaxHeight = this.cfg.getProperty("maxheight"); + + /* + Cache the original value for the "maxheight" configuration + property so that we can set it back when the menu is hidden. + */ + + this._nMaxHeight = nMaxHeight; + + this.cfg.setProperty("maxheight", (nViewportHeight - 20)); + + } + + + if(this.cfg.getProperty("maxheight") > 0) { + + var oBody = this.body; + + if(oBody.scrollTop > 0) { + + oBody.scrollTop = 0; + + } + + this._disableScrollHeader(); + this._enableScrollFooter(); + + } + + } + + +}, + + +/** +* @method _onShow +* @description "show" event handler for the menu. +* @private +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that fired +* the event. +*/ +_onShow: function(p_sType, p_aArgs, p_oMenu) { + + this.setInitialFocus(); + + var oParent = this.parent; + + if(oParent) { + + var oParentMenu = oParent.parent, + aParentAlignment = oParentMenu.cfg.getProperty("submenualignment"), + aAlignment = this.cfg.getProperty("submenualignment"); + + + if( + (aParentAlignment[0] != aAlignment[0]) && + (aParentAlignment[1] != aAlignment[1]) + ) { + + this.cfg.setProperty( + "submenualignment", + [ aParentAlignment[0], aParentAlignment[1] ] + ); + + } + + + if( + !oParentMenu.cfg.getProperty("autosubmenudisplay") && + oParentMenu.cfg.getProperty("position") == "static" + ) { + + oParentMenu.cfg.setProperty("autosubmenudisplay", true); + + + function disableAutoSubmenuDisplay(p_oEvent) { + + if( + p_oEvent.type == "mousedown" || + (p_oEvent.type == "keydown" && p_oEvent.keyCode == 27) + ) { + + /* + Set the "autosubmenudisplay" to "false" if the user + clicks outside the menu bar. + */ + + var oTarget = Event.getTarget(p_oEvent); + + if( + oTarget != oParentMenu.element || + !YAHOO.util.Dom.isAncestor(oParentMenu.element, oTarget) + ) { + + oParentMenu.cfg.setProperty( + "autosubmenudisplay", + false + ); + + Event.removeListener( + document, + "mousedown", + disableAutoSubmenuDisplay + ); + + Event.removeListener( + document, + "keydown", + disableAutoSubmenuDisplay + ); + + } + + } + + } + + Event.addListener(document, "mousedown", disableAutoSubmenuDisplay); + Event.addListener(document, "keydown", disableAutoSubmenuDisplay); + + } + + } + else if(!oParent && this.lazyLoad) { + + this.cfg.refireEvent("xy"); + + } + +}, + + +/** +* @method _onBeforeHide +* @description "beforehide" event handler for the menu. +* @private +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that fired +* the event. +*/ +_onBeforeHide: function(p_sType, p_aArgs, p_oMenu) { + + var oActiveItem = this.activeItem; + + if(oActiveItem) { + + var oConfig = oActiveItem.cfg; + + oConfig.setProperty("selected", false); + + var oSubmenu = oConfig.getProperty("submenu"); + + if(oSubmenu) { + + oSubmenu.hide(); + + } + + oActiveItem.blur(); + + } + +}, + + +/** +* @method _onHide +* @description "hide" event handler for the menu. +* @private +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that fired +* the event. +*/ +_onHide: function(p_sType, p_aArgs, p_oMenu) { + + if(this._nMaxHeight != -1) { + + this.cfg.setProperty("maxheight", this._nMaxHeight); + + this._nMaxHeight = -1; + + } + +}, + + +/** +* @method _onParentMenuConfigChange +* @description "configchange" event handler for a submenu. +* @private +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oSubmenu Object representing the submenu that +* subscribed to the event. +*/ +_onParentMenuConfigChange: function(p_sType, p_aArgs, p_oSubmenu) { + + var sPropertyName = p_aArgs[0][0], + oPropertyValue = p_aArgs[0][1]; + + switch(sPropertyName) { + + case "iframe": + case "constraintoviewport": + case "hidedelay": + case "showdelay": + case "submenuhidedelay": + case "clicktohide": + case "effect": + case "classname": + + p_oSubmenu.cfg.setProperty(sPropertyName, oPropertyValue); + + break; + + } + +}, + + +/** +* @method _onParentMenuRender +* @description "render" event handler for a submenu. Renders a +* submenu in response to the firing of its parent's "render" event. +* @private +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oSubmenu Object representing the submenu that +* subscribed to the event. +*/ +_onParentMenuRender: function(p_sType, p_aArgs, p_oSubmenu) { + + var oParentMenu = p_oSubmenu.parent.parent, + + oConfig = { + + constraintoviewport: + oParentMenu.cfg.getProperty("constraintoviewport"), + + xy: [0,0], + + clicktohide: oParentMenu.cfg.getProperty("clicktohide"), + + effect: oParentMenu.cfg.getProperty("effect"), + + showdelay: oParentMenu.cfg.getProperty("showdelay"), + + hidedelay: oParentMenu.cfg.getProperty("hidedelay"), + + submenuhidedelay: oParentMenu.cfg.getProperty("submenuhidedelay"), + + classname: oParentMenu.cfg.getProperty("classname") + + }; + + + /* + Only sync the "iframe" configuration property if the parent + menu's "position" configuration is the same. + */ + + if( + this.cfg.getProperty("position") == + oParentMenu.cfg.getProperty("position") + ) { + + oConfig.iframe = oParentMenu.cfg.getProperty("iframe"); + + } + + + p_oSubmenu.cfg.applyConfig(oConfig); + + + if(!this.lazyLoad) { + + var oLI = this.parent.element; + + if(this.element.parentNode == oLI) { + + this.render(); + + } + else { + + this.render(oLI); + + } + + } + +}, + + +/** +* @method _onSubmenuBeforeShow +* @description "beforeshow" event handler for a submenu. +* @private +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oSubmenu Object representing the submenu that +* subscribed to the event. +*/ +_onSubmenuBeforeShow: function(p_sType, p_aArgs, p_oSubmenu) { + + var oParent = this.parent, + aAlignment = oParent.parent.cfg.getProperty("submenualignment"); + + this.cfg.setProperty( + "context", + [oParent.element, aAlignment[0], aAlignment[1]] + ); + + + var nScrollTop = oParent.parent.body.scrollTop; + + if( + (this.browser == "gecko" || this.browser == "safari") + && nScrollTop > 0 + ) { + + this.cfg.setProperty("y", (this.cfg.getProperty("y") - nScrollTop)); + + } + +}, + + +/** +* @method _onSubmenuShow +* @description "show" event handler for a submenu. +* @private +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oSubmenu Object representing the submenu that +* subscribed to the event. +*/ +_onSubmenuShow: function(p_sType, p_aArgs, p_oSubmenu) { + + var oParent = this.parent; + + oParent.submenuIndicator.firstChild.nodeValue = + oParent.EXPANDED_SUBMENU_INDICATOR_TEXT; + +}, + + +/** +* @method _onSubmenuHide +* @description "hide" Custom Event handler for a submenu. +* @private +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oSubmenu Object representing the submenu that +* subscribed to the event. +*/ +_onSubmenuHide: function(p_sType, p_aArgs, p_oSubmenu) { + + var oParent = this.parent; + + oParent.submenuIndicator.firstChild.nodeValue = + oParent.COLLAPSED_SUBMENU_INDICATOR_TEXT; + +}, + + +/** +* @method _onMenuItemFocus +* @description "focus" event handler for the menu's items. +* @private +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.MenuItem} p_oItem Object representing the menu item +* that fired the event. +*/ +_onMenuItemFocus: function(p_sType, p_aArgs, p_oItem) { + + this.activeItem = p_oItem; + +}, + + +/** +* @method _onMenuItemBlur +* @description "blur" event handler for the menu's items. +* @private +* @param {String} p_sType String representing the name of the event +* that was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +*/ +_onMenuItemBlur: function(p_sType, p_aArgs) { + + this.activeItem = null; + +}, + + +/** +* @method _onMenuItemConfigChange +* @description "configchange" event handler for the menu's items. +* @private +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.MenuItem} p_oItem Object representing the menu item +* that fired the event. +*/ +_onMenuItemConfigChange: function(p_sType, p_aArgs, p_oItem) { + + var sProperty = p_aArgs[0][0]; + + switch(sProperty) { + + case "submenu": + + var oSubmenu = p_aArgs[0][1]; + + if(oSubmenu) { + + this._configureSubmenu(p_oItem); + + } + + break; + + case "text": + case "helptext": + + /* + A change to an item's "text" or "helptext" + configuration properties requires the width of the parent + menu to be recalculated. + */ + + if(this.element.style.width) { + + var sWidth = this._getOffsetWidth() + "px"; + + Dom.setStyle(this.element, "width", sWidth); + + } + + break; + + } + +}, + + + +// Public event handlers for configuration properties + + +/** +* @method enforceConstraints +* @description The default event handler executed when the moveEvent is fired, +* if the "constraintoviewport" configuration property is set to true. +* @param {String} type The name of the event that was fired. +* @param {Array} args Collection of arguments sent when the +* event was fired. +* @param {Array} obj Array containing the current Menu instance +* and the item that fired the event. +*/ +enforceConstraints: function(type, args, obj) { + + var oConfig = this.cfg, + pos = args[0], + + x = pos[0], + y = pos[1], + + offsetHeight = this.element.offsetHeight, + offsetWidth = this.element.offsetWidth, + + viewPortWidth = YAHOO.util.Dom.getViewportWidth(), + viewPortHeight = YAHOO.util.Dom.getViewportHeight(), + + scrollX = Math.max( + document.documentElement.scrollLeft, + document.body.scrollLeft + ), + + scrollY = Math.max( + document.documentElement.scrollTop, + document.body.scrollTop + ), + + nPadding = ( + this.parent && + this.parent.parent instanceof YAHOO.widget.MenuBar + ) ? 0 : 10, + + topConstraint = scrollY + nPadding, + leftConstraint = scrollX + nPadding, + bottomConstraint = scrollY + viewPortHeight - offsetHeight - nPadding, + rightConstraint = scrollX + viewPortWidth - offsetWidth - nPadding, + + aContext = oConfig.getProperty("context"), + oContextElement = aContext ? aContext[0] : null; + + + if (x < 10) { + + x = leftConstraint; + + } else if ((x + offsetWidth) > viewPortWidth) { + + if( + oContextElement && + ((x - oContextElement.offsetWidth) > offsetWidth) + ) { + + x = (x - (oContextElement.offsetWidth + offsetWidth)); + + } + else { + + x = rightConstraint; + + } + + } + + if (y < 10) { + + y = topConstraint; + + } else if (y > bottomConstraint) { + + if(oContextElement && (y > offsetHeight)) { + + y = ((y + oContextElement.offsetHeight) - offsetHeight); + + } + else { + + y = bottomConstraint; + + } + + } + + oConfig.setProperty("x", x, true); + oConfig.setProperty("y", y, true); + oConfig.setProperty("xy", [x,y], true); + +}, + + +/** +* @method configVisible +* @description Event handler for when the "visible" configuration property +* the menu changes. +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that +* fired the event. +*/ +configVisible: function(p_sType, p_aArgs, p_oMenu) { + + if(this.cfg.getProperty("position") == "dynamic") { + + YAHOO.widget.Menu.superclass.configVisible.call( + this, + p_sType, + p_aArgs, + p_oMenu + ); + + } + else { + + var bVisible = p_aArgs[0], + sDisplay = Dom.getStyle(this.element, "display"); + + if(bVisible) { + + if(sDisplay != "block") { + this.beforeShowEvent.fire(); + Dom.setStyle(this.element, "display", "block"); + this.showEvent.fire(); + } + + } + else { + + if(sDisplay == "block") { + this.beforeHideEvent.fire(); + Dom.setStyle(this.element, "display", "none"); + this.hideEvent.fire(); + } + + } + + } + +}, + + +/** +* @method configPosition +* @description Event handler for when the "position" configuration property +* of the menu changes. +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that +* fired the event. +*/ +configPosition: function(p_sType, p_aArgs, p_oMenu) { + + var sCSSPosition = p_aArgs[0] == "static" ? "static" : "absolute", + oCfg = this.cfg; + + Dom.setStyle(this.element, "position", sCSSPosition); + + + if(sCSSPosition == "static") { + + /* + Remove the iframe for statically positioned menus since it will + intercept mouse events. + */ + + oCfg.setProperty("iframe", false); + + + // Statically positioned menus are visible by default + + Dom.setStyle(this.element, "display", "block"); + + oCfg.setProperty("visible", true); + + } + else { + + /* + Even though the "visible" property is queued to + "false" by default, we need to set the "visibility" property to + "hidden" since Overlay's "configVisible" implementation checks the + element's "visibility" style property before deciding whether + or not to show an Overlay instance. + */ + + Dom.setStyle(this.element, "visibility", "hidden"); + + } + + + if(sCSSPosition == "absolute") { + + var nZIndex = oCfg.getProperty("zindex"); + + if(!nZIndex || nZIndex === 0) { + + nZIndex = this.parent ? + (this.parent.parent.cfg.getProperty("zindex") + 1) : 1; + + oCfg.setProperty("zindex", nZIndex); + + } + + } + +}, + + +/** +* @method configIframe +* @description Event handler for when the "iframe" configuration property of +* the menu changes. +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that +* fired the event. +*/ +configIframe: function(p_sType, p_aArgs, p_oMenu) { + + if(this.cfg.getProperty("position") == "dynamic") { + + YAHOO.widget.Menu.superclass.configIframe.call( + this, + p_sType, + p_aArgs, + p_oMenu + ); + + } + +}, + + +/** +* @method configHideDelay +* @description Event handler for when the "hidedelay" configuration property +* of the menu changes. +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that +* fired the event. +*/ +configHideDelay: function(p_sType, p_aArgs, p_oMenu) { + + var nHideDelay = p_aArgs[0], + oMouseOutEvent = this.mouseOutEvent, + oMouseOverEvent = this.mouseOverEvent, + oKeyDownEvent = this.keyDownEvent; + + if(nHideDelay > 0) { + + /* + Only assign event handlers once. This way the user change + the value for the hidedelay as many times as they want. + */ + + if(!this._bHideDelayEventHandlersAssigned) { + + oMouseOutEvent.subscribe(this._execHideDelay, true); + oMouseOverEvent.subscribe(this._cancelHideDelay, this, true); + oKeyDownEvent.subscribe(this._cancelHideDelay, this, true); + + this._bHideDelayEventHandlersAssigned = true; + + } + + } + else { + + oMouseOutEvent.unsubscribe(this._execHideDelay, this); + oMouseOverEvent.unsubscribe(this._cancelHideDelay, this); + oKeyDownEvent.unsubscribe(this._cancelHideDelay, this); + + this._bHideDelayEventHandlersAssigned = false; + + } + +}, + + +/** +* @method configContainer +* @description Event handler for when the "container" configuration property +of the menu changes. +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that +* fired the event. +*/ +configContainer: function(p_sType, p_aArgs, p_oMenu) { + + var oElement = p_aArgs[0]; + + if(typeof oElement == 'string') { + + this.cfg.setProperty( + "container", + document.getElementById(oElement), + true + ); + + } + +}, + + +/** +* @method configMaxHeight +* @description Event handler for when the "maxheight" configuration property of +* a Menu changes. +* @param {String} p_sType The name of the event that was fired. +* @param {Array} p_aArgs Collection of arguments sent when the event +* was fired. +* @param {YAHOO.widget.Menu} p_oMenu The Menu instance fired +* the event. +*/ +configMaxHeight: function(p_sType, p_aArgs, p_oMenu) { + + var nMaxHeight = p_aArgs[0], + oBody = this.body, + oHeader = this.header, + oFooter = this.footer, + fnMouseOver = this._onScrollTargetMouseOver, + fnMouseOut = this._onScrollTargetMouseOut; + + + if((nMaxHeight > 0) && (oBody.offsetHeight > nMaxHeight)) { + + if(!this.cfg.getProperty("width")) { + + this._setWidth(); + + } + + if(!oHeader && !oFooter) { + + this.setHeader(" "); + this.setFooter(" "); + + oHeader = this.header; + oFooter = this.footer; + + Dom.addClass(oHeader, "topscrollbar"); + Dom.addClass(oFooter, "bottomscrollbar"); + + this.element.insertBefore(oHeader, oBody); + this.element.appendChild(oFooter); + + Event.addListener(oHeader, "mouseover", fnMouseOver, this, true); + Event.addListener(oHeader, "mouseout", fnMouseOut, this, true); + Event.addListener(oFooter, "mouseover", fnMouseOver, this, true); + Event.addListener(oFooter, "mouseout", fnMouseOut, this, true); + + } + + var nHeight = + + ( + nMaxHeight - + (this.footer.offsetHeight + this.header.offsetHeight) + ); + + Dom.setStyle(oBody, "height", (nHeight + "px")); + Dom.setStyle(oBody, "overflow", "hidden"); + + } + else if(oHeader && oFooter) { + + Dom.setStyle(oBody, "height", "auto"); + Dom.setStyle(oBody, "overflow", "visible"); + + Event.removeListener(oHeader, "mouseover", fnMouseOver); + Event.removeListener(oHeader, "mouseout", fnMouseOut); + Event.removeListener(oFooter, "mouseover", fnMouseOver); + Event.removeListener(oFooter, "mouseout", fnMouseOut); + + this.element.removeChild(oHeader); + this.element.removeChild(oFooter); + + this.header = null; + this.footer = null; + + } + +}, + + +/** +* @method configClassName +* @description Event handler for when the "classname" configuration property of +* a menu changes. +* @param {String} p_sType The name of the event that was fired. +* @param {Array} p_aArgs Collection of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oMenu The Menu instance fired the event. +*/ +configClassName: function(p_sType, p_aArgs, p_oMenu) { + + var sClassName = p_aArgs[0]; + + if(this._sClassName) { + + Dom.removeClass(this.element, this._sClassName); + + } + + Dom.addClass(this.element, sClassName); + this._sClassName = sClassName; + +}, + + +// Public methods + + +/** +* @method initEvents +* @description Initializes the custom events for the menu. +*/ +initEvents: function() { + + YAHOO.widget.Menu.superclass.initEvents.call(this); + + // Create custom events + + var CustomEvent = YAHOO.util.CustomEvent; + + this.mouseOverEvent = new CustomEvent("mouseOverEvent", this); + this.mouseOutEvent = new CustomEvent("mouseOutEvent", this); + this.mouseDownEvent = new CustomEvent("mouseDownEvent", this); + this.mouseUpEvent = new CustomEvent("mouseUpEvent", this); + this.clickEvent = new CustomEvent("clickEvent", this); + this.keyPressEvent = new CustomEvent("keyPressEvent", this); + this.keyDownEvent = new CustomEvent("keyDownEvent", this); + this.keyUpEvent = new CustomEvent("keyUpEvent", this); + this.itemAddedEvent = new CustomEvent("itemAddedEvent", this); + this.itemRemovedEvent = new CustomEvent("itemRemovedEvent", this); + +}, + + +/** +* @method getRoot +* @description Finds the menu's root menu. +*/ +getRoot: function() { + + var oItem = this.parent; + + if(oItem) { + + var oParentMenu = oItem.parent; + + return oParentMenu ? oParentMenu.getRoot() : this; + + } + else { + + return this; + + } + +}, + + +/** +* @method toString +* @description Returns a string representing the menu. +* @return {String} +*/ +toString: function() { + + return ("Menu " + this.id); + +}, + + +/** +* @method setItemGroupTitle +* @description Sets the title of a group of menu items. +* @param {String} p_sGroupTitle String specifying the title of the group. +* @param {Number} p_nGroupIndex Optional. Number specifying the group to which +* the title belongs. +*/ +setItemGroupTitle: function(p_sGroupTitle, p_nGroupIndex) { + + if(typeof p_sGroupTitle == "string" && p_sGroupTitle.length > 0) { + + var nGroupIndex = typeof p_nGroupIndex == "number" ? p_nGroupIndex : 0, + oTitle = this._aGroupTitleElements[nGroupIndex]; + + + if(oTitle) { + + oTitle.innerHTML = p_sGroupTitle; + + } + else { + + oTitle = document.createElement(this.GROUP_TITLE_TAG_NAME); + + oTitle.innerHTML = p_sGroupTitle; + + this._aGroupTitleElements[nGroupIndex] = oTitle; + + } + + + var i = this._aGroupTitleElements.length - 1, + nFirstIndex; + + do { + + if(this._aGroupTitleElements[i]) { + + Dom.removeClass(this._aGroupTitleElements[i], "first-of-type"); + + nFirstIndex = i; + + } + + } + while(i--); + + + if(nFirstIndex !== null) { + + Dom.addClass( + this._aGroupTitleElements[nFirstIndex], + "first-of-type" + ); + + } + + } + +}, + + + +/** +* @method addItem +* @description Appends an item to the menu. +* @param {YAHOO.widget.MenuItem} p_oItem Object reference for the MenuItem +* instance to be added to the menu. +* @param {String} p_oItem String specifying the text of the item to be added +* to the menu. +* @param {Object} p_oItem Object literal containing a set of menu item +* configuration properties. +* @param {Number} p_nGroupIndex Optional. Number indicating the group to +* which the item belongs. +* @return {YAHOO.widget.MenuItem} +*/ +addItem: function(p_oItem, p_nGroupIndex) { + + if(p_oItem) { + + return this._addItemToGroup(p_nGroupIndex, p_oItem); + + } + +}, + + +/** +* @method addItems +* @description Adds an array of items to the menu. +* @param {Array} p_aItems Array of items to be added to the menu. The array +* can contain strings specifying the text for each item to be created, object +* literals specifying each of the menu item configuration properties, +* or MenuItem instances. +* @param {Number} p_nGroupIndex Optional. Number specifying the group to +* which the items belongs. +* @return {Array} +*/ +addItems: function(p_aItems, p_nGroupIndex) { + + if(Lang.isArray(p_aItems)) { + + var nItems = p_aItems.length, + aItems = [], + oItem; + + + for(var i=0; i 0) { + + var i = nItems - 1, + oItem, + oSubmenu; + + do { + + oItem = aItems[i]; + + if(oItem) { + + oSubmenu = oItem.cfg.getProperty("submenu"); + + if(oSubmenu) { + + this.cfg.configChangedEvent.unsubscribe( + this._onParentMenuConfigChange, + oSubmenu + ); + + this.renderEvent.unsubscribe( + this._onParentMenuRender, + oSubmenu + ); + + } + + oItem.destroy(); + + } + + } + while(i--); + + } + + + if(oHeader) { + + Event.purgeElement(oHeader); + oElement.removeChild(oHeader); + + } + + + if(oFooter) { + + Event.purgeElement(oFooter); + oElement.removeChild(oFooter); + } + + + if(oBody) { + + Event.purgeElement(oBody); + + oBody.innerHTML = ""; + + } + + + this._aItemGroups = []; + this._aListElements = []; + this._aGroupTitleElements = []; + +}, + + +/** +* @method destroy +* @description Removes the menu's <div> element +* (and accompanying child nodes) from the document. +*/ +destroy: function() { + + // Remove all DOM event listeners + + Event.purgeElement(this.element); + + + // Remove Custom Event listeners + + this.mouseOverEvent.unsubscribeAll(); + this.mouseOutEvent.unsubscribeAll(); + this.mouseDownEvent.unsubscribeAll(); + this.mouseUpEvent.unsubscribeAll(); + this.clickEvent.unsubscribeAll(); + this.keyPressEvent.unsubscribeAll(); + this.keyDownEvent.unsubscribeAll(); + this.keyUpEvent.unsubscribeAll(); + this.itemAddedEvent.unsubscribeAll(); + this.itemRemovedEvent.unsubscribeAll(); + + YAHOO.widget.Module.textResizeEvent.unsubscribe(this._onTextResize, this); + + + // Remove all items + + this.clearContent(); + + + this._aItemGroups = null; + this._aListElements = null; + this._aGroupTitleElements = null; + + + // Continue with the superclass implementation of this method + + YAHOO.widget.Menu.superclass.destroy.call(this); + + +}, + + +/** +* @method setInitialFocus +* @description Sets focus to the menu's first enabled item. +*/ +setInitialFocus: function() { + + var oItem = this._getFirstEnabledItem(); + + if(oItem) { + + oItem.focus(); + } + +}, + + +/** +* @method setInitialSelection +* @description Sets the "selected" configuration property of the menu's first +* enabled item to "true." +*/ +setInitialSelection: function() { + + var oItem = this._getFirstEnabledItem(); + + if(oItem) { + + oItem.cfg.setProperty("selected", true); + } + +}, + + +/** +* @method clearActiveItem +* @description Sets the "selected" configuration property of the menu's active +* item to "false" and hides the item's submenu. +* @param {Boolean} p_bBlur Boolean indicating if the menu's active item +* should be blurred. +*/ +clearActiveItem: function(p_bBlur) { + + if(this.cfg.getProperty("showdelay") > 0) { + + this._cancelShowDelay(); + + } + + + var oActiveItem = this.activeItem; + + if(oActiveItem) { + + var oConfig = oActiveItem.cfg; + + oConfig.setProperty("selected", false); + + var oSubmenu = oConfig.getProperty("submenu"); + + if(oSubmenu) { + + oSubmenu.hide(); + + } + + if(p_bBlur) { + + oActiveItem.blur(); + + } + + } + +}, + + +/** +* @description Initializes the class's configurable properties which can be +* changed using the menu's Config object ("cfg"). +* @method initDefaultConfig +*/ +initDefaultConfig: function() { + + YAHOO.widget.Menu.superclass.initDefaultConfig.call(this); + + var oConfig = this.cfg; + + // Add configuration attributes + + /* + Change the default value for the "visible" configuration + property to "false" by re-adding the property. + */ + + /** + * @config visible + * @description Boolean indicating whether or not the menu is visible. If + * the menu's "position" configuration property is set to "dynamic" (the + * default), this property toggles the menu's <div> + * element's "visibility" style property between "visible" (true) or + * "hidden" (false). If the menu's "position" configuration property is + * set to "static" this property toggles the menu's + * <div> element's "display" style property + * between "block" (true) or "none" (false). + * @default false + * @type Boolean + */ + oConfig.addProperty( + "visible", + { + value:false, + handler:this.configVisible, + validator:this.cfg.checkBoolean + } + ); + + + /* + Change the default value for the "constraintoviewport" configuration + property to "true" by re-adding the property. + */ + + /** + * @config constraintoviewport + * @description Boolean indicating if the menu will try to remain inside + * the boundaries of the size of viewport. + * @default true + * @type Boolean + */ + oConfig.addProperty( + "constraintoviewport", + { + value:true, + handler:this.configConstrainToViewport, + validator:this.cfg.checkBoolean, + supercedes:["iframe","x","y","xy"] + } + ); + + + /** + * @config position + * @description String indicating how a menu should be positioned on the + * screen. Possible values are "static" and "dynamic." Static menus are + * visible by default and reside in the normal flow of the document + * (CSS position: static). Dynamic menus are hidden by default, reside + * out of the normal flow of the document (CSS position: absolute), and + * can overlay other elements on the screen. + * @default dynamic + * @type String + */ + oConfig.addProperty( + "position", + { + value: "dynamic", + handler: this.configPosition, + validator: this._checkPosition, + supercedes: ["visible"] + } + ); + + + /** + * @config submenualignment + * @description Array defining how submenus should be aligned to their + * parent menu item. The format is: [itemCorner, submenuCorner]. By default + * a submenu's top left corner is aligned to its parent menu item's top + * right corner. + * @default ["tl","tr"] + * @type Array + */ + oConfig.addProperty("submenualignment", { value: ["tl","tr"] } ); + + + /** + * @config autosubmenudisplay + * @description Boolean indicating if submenus are automatically made + * visible when the user mouses over the menu's items. + * @default true + * @type Boolean + */ + oConfig.addProperty( + "autosubmenudisplay", + { + value: true, + validator: oConfig.checkBoolean + } + ); + + + /** + * @config showdelay + * @description Number indicating the time (in milliseconds) that should + * expire before a submenu is made visible when the user mouses over + * the menu's items. + * @default 250 + * @type Number + */ + oConfig.addProperty( + "showdelay", + { + value: 250, + validator: oConfig.checkNumber + } + ); + + + /** + * @config hidedelay + * @description Number indicating the time (in milliseconds) that should + * expire before the menu is hidden. + * @default 0 + * @type Number + */ + oConfig.addProperty( + "hidedelay", + { + value: 0, + validator: oConfig.checkNumber, + handler: this.configHideDelay, + suppressEvent: true + } + ); + + + /** + * @config submenuhidedelay + * @description Number indicating the time (in milliseconds) that should + * expire before a submenu is hidden when the user mouses out of a menu item + * heading in the direction of a submenu. The value must be greater than or + * equal to the value specified for the "showdelay" configuration property. + * @default 250 + * @type Number + */ + oConfig.addProperty( + "submenuhidedelay", + { + value: 250, + validator: oConfig.checkNumber + } + ); + + + /** + * @config clicktohide + * @description Boolean indicating if the menu will automatically be + * hidden if the user clicks outside of it. + * @default true + * @type Boolean + */ + oConfig.addProperty( + "clicktohide", + { + value: true, + validator: oConfig.checkBoolean + } + ); + + + /** + * @config container + * @description HTML element reference or string specifying the id + * attribute of the HTML element that the menu's markup should be + * rendered into. + * @type HTMLElement|String + * @default document.body + */ + oConfig.addProperty( + "container", + { + value:document.body, + handler:this.configContainer + } + ); + + + /** + * @config maxheight + * @description Defines the maximum height (in pixels) for a menu before the + * contents of the body are scrolled. + * @default 0 + * @type Number + */ + oConfig.addProperty( + "maxheight", + { + value: 0, + validator: oConfig.checkNumber, + handler: this.configMaxHeight + } + ); + + + /** + * @config classname + * @description CSS class to be applied to the menu's root + * <div> element. The specified class(es) are + * appended in addition to the default class as specified by the menu's + * CSS_CLASS_NAME constant. + * @default null + * @type String + */ + oConfig.addProperty( + "classname", + { + value: null, + handler: this.configClassName, + validator: this._checkString + } + ); + +} + +}); // END YAHOO.lang.extend + +})(); + + + +(function() { + +var Dom = YAHOO.util.Dom, + Module = YAHOO.widget.Module, + Menu = YAHOO.widget.Menu, + + m_oMenuItemElement = null, + m_oSubmenuIndicator = null, + m_oCheckedIndicator = null; + + +/** +* Creates an item for a menu. +* +* @param {String} p_oObject String specifying the text of the menu item. +* @param {HTMLLIElement} p_oObject Object specifying +* the <li> element of the menu item. +* @param {HTMLOptGroupElement} p_oObject Object +* specifying the <optgroup> element of the menu item. +* @param {HTMLOptionElement} p_oObject Object +* specifying the <option> element of the menu item. +* @param {Object} p_oConfig Optional. Object literal specifying the +* configuration for the menu item. See configuration class documentation +* for more details. +* @class MenuItem +* @constructor +*/ +YAHOO.widget.MenuItem = function(p_oObject, p_oConfig) { + + if(p_oObject) { + + if(p_oConfig) { + + this.parent = p_oConfig.parent; + this.value = p_oConfig.value; + this.id = p_oConfig.id; + + } + + this.init(p_oObject, p_oConfig); + + } + +}; + + +YAHOO.widget.MenuItem.prototype = { + + // Constants + + + /** + * @property SUBMENU_INDICATOR_IMAGE_PATH + * @description String representing the path to the image to be used for the + * menu item's submenu arrow indicator. + * @default "nt/ic/ut/alt1/menuarorght8_nrm_1.gif" + * @final + * @type String + * @deprecated All submenu indicator images are applied via a CSS + * background image. See "submenuindicator" class name in menu.css. + */ + SUBMENU_INDICATOR_IMAGE_PATH: "nt/ic/ut/alt1/menuarorght8_nrm_1.gif", + + + /** + * @property SELECTED_SUBMENU_INDICATOR_IMAGE_PATH + * @description String representing the path to the image to be used for the + * submenu arrow indicator when the menu item is selected. + * @default "nt/ic/ut/alt1/menuarorght8_hov_1.gif" + * @final + * @type String + * @deprecated All submenu indicator images are applied via a CSS + * background image. See "submenuindicator" class name in menu.css. + */ + SELECTED_SUBMENU_INDICATOR_IMAGE_PATH: + "nt/ic/ut/alt1/menuarorght8_hov_1.gif", + + + /** + * @property DISABLED_SUBMENU_INDICATOR_IMAGE_PATH + * @description String representing the path to the image to be used for the + * submenu arrow indicator when the menu item is disabled. + * @default "nt/ic/ut/alt1/menuarorght8_dim_1.gif" + * @final + * @type String + * @deprecated All submenu indicator images are applied via a CSS + * background image. See "submenuindicator" class name in menu.css. + */ + DISABLED_SUBMENU_INDICATOR_IMAGE_PATH: + "nt/ic/ut/alt1/menuarorght8_dim_1.gif", + + + /** + * @property COLLAPSED_SUBMENU_INDICATOR_ALT_TEXT + * @description String representing the alt text for the image to be used + * for the submenu arrow indicator. + * @default "Collapsed. Click to expand." + * @final + * @type String + * @deprecated Use COLLAPSED_SUBMENU_INDICATOR_TEXT. + */ + COLLAPSED_SUBMENU_INDICATOR_ALT_TEXT: "Collapsed. Click to expand.", + + + /** + * @property EXPANDED_SUBMENU_INDICATOR_ALT_TEXT + * @description String representing the alt text for the image to be used + * for the submenu arrow indicator when the submenu is visible. + * @default "Expanded. Click to collapse." + * @final + * @type String + * @deprecated Use EXPANDED_SUBMENU_INDICATOR_TEXT. + */ + EXPANDED_SUBMENU_INDICATOR_ALT_TEXT: "Expanded. Click to collapse.", + + + /** + * @property DISABLED_SUBMENU_INDICATOR_ALT_TEXT + * @description String representing the alt text for the image to be used + * for the submenu arrow indicator when the menu item is disabled. + * @default "Disabled." + * @final + * @type String + * @deprecated Use DISABLED_SUBMENU_INDICATOR_TEXT. + */ + DISABLED_SUBMENU_INDICATOR_ALT_TEXT: "Disabled.", + + + /** + * @property COLLAPSED_SUBMENU_INDICATOR_TEXT + * @description String representing the text for the <em> + * element used for the submenu arrow indicator. + * @default "Submenu collapsed. Click to expand submenu." + * @final + * @type String + */ + COLLAPSED_SUBMENU_INDICATOR_TEXT: + "Submenu collapsed. Click to expand submenu.", + + + /** + * @property EXPANDED_SUBMENU_INDICATOR_TEXT + * @description String representing the text for the submenu arrow indicator + * element (<em>) when the submenu is visible. + * @default "Submenu expanded. Click to collapse submenu." + * @final + * @type String + */ + EXPANDED_SUBMENU_INDICATOR_TEXT: + "Submenu expanded. Click to collapse submenu.", + + + /** + * @property DISABLED_SUBMENU_INDICATOR_TEXT + * @description String representing the text for the submenu arrow indicator + * element (<em>) when the menu item is disabled. + * @default "Submenu collapsed. (Item disabled.)." + * @final + * @type String + */ + DISABLED_SUBMENU_INDICATOR_TEXT: "Submenu collapsed. (Item disabled.)", + + + /** + * @property CHECKED_IMAGE_PATH + * @description String representing the path to the image to be used for + * the checked state. + * @default "nt/ic/ut/bsc/menuchk8_nrm_1.gif" + * @final + * @type String + * @deprecated All checked indicator images are applied via a CSS + * background image. See "checkedindicator" class name in menu.css. + */ + CHECKED_IMAGE_PATH: "nt/ic/ut/bsc/menuchk8_nrm_1.gif", + + + /** + * @property SELECTED_CHECKED_IMAGE_PATH + * @description String representing the path to the image to be used for + * the selected checked state. + * @default "nt/ic/ut/bsc/menuchk8_hov_1.gif" + * @final + * @type String + * @deprecated All checked indicator images are applied via a CSS + * background image. See "checkedindicator" class name in menu.css. + */ + SELECTED_CHECKED_IMAGE_PATH: "nt/ic/ut/bsc/menuchk8_hov_1.gif", + + + /** + * @property DISABLED_CHECKED_IMAGE_PATH + * @description String representing the path to the image to be used for + * the disabled checked state. + * @default "nt/ic/ut/bsc/menuchk8_dim_1.gif" + * @final + * @type String + * @deprecated All checked indicator images are applied via a CSS + * background image. + */ + DISABLED_CHECKED_IMAGE_PATH: "nt/ic/ut/bsc/menuchk8_dim_1.gif", + + + /** + * @property CHECKED_IMAGE_ALT_TEXT + * @description String representing the alt text for the image to be used + * for the checked image. + * @default "Checked." + * @final + * @type String + * @deprecated Use CHECKED_TEXT. + */ + CHECKED_IMAGE_ALT_TEXT: "Checked.", + + + /** + * @property DISABLED_CHECKED_IMAGE_ALT_TEXT + * @description String representing the alt text for the image to be used + * for the checked image when the item is disabled. + * @default "Checked. (Item disabled.)" + * @final + * @type String + * @deprecated Use DISABLED_CHECKED_TEXT. + */ + DISABLED_CHECKED_IMAGE_ALT_TEXT: "Checked. (Item disabled.)", + + + /** + * @property CHECKED_TEXT + * @description String representing the text to be used for the checked + * indicator element (<em>). + * @default "Checked." + * @final + * @type String + */ + CHECKED_TEXT: "Menu item checked.", + + + /** + * @property DISABLED_CHECKED_TEXT + * @description String representing the text to be used for the checked + * indicator element (<em>) when the menu item + * is disabled. + * @default "Checked. (Item disabled.)" + * @final + * @type String + */ + DISABLED_CHECKED_TEXT: "Checked. (Item disabled.)", + + + /** + * @property CSS_CLASS_NAME + * @description String representing the CSS class(es) to be applied to the + * <li> element of the menu item. + * @default "yuimenuitem" + * @final + * @type String + */ + CSS_CLASS_NAME: "yuimenuitem", + + + /** + * @property SUBMENU_TYPE + * @description Object representing the type of menu to instantiate and + * add when parsing the child nodes of the menu item's source HTML element. + * @final + * @type YAHOO.widget.Menu + */ + SUBMENU_TYPE: null, + + + /** + * @property IMG_ROOT + * @description String representing the prefix path to use for + * non-secure images. + * @default "http://us.i1.yimg.com/us.yimg.com/i/" + * @type String + * @deprecated All menu item images are now applied via CSS + * background images. + */ + IMG_ROOT: "http://us.i1.yimg.com/us.yimg.com/i/", + + + /** + * @property IMG_ROOT_SSL + * @description String representing the prefix path to use for securely + * served images. + * @default "https://a248.e.akamai.net/sec.yimg.com/i/" + * @type String + * @deprecated All menu item images are now applied via CSS + * background images. + */ + IMG_ROOT_SSL: "https://a248.e.akamai.net/sec.yimg.com/i/", + + + + // Private member variables + + + /** + * @property _oAnchor + * @description Object reference to the menu item's + * <a> element. + * @default null + * @private + * @type HTMLAnchorElement + */ + _oAnchor: null, + + + /** + * @property _oText + * @description Object reference to the menu item's text node. + * @default null + * @private + * @type TextNode + */ + _oText: null, + + + /** + * @property _oHelpTextEM + * @description Object reference to the menu item's help text + * <em> element. + * @default null + * @private + * @type HTMLElement + */ + _oHelpTextEM: null, + + + /** + * @property _oSubmenu + * @description Object reference to the menu item's submenu. + * @default null + * @private + * @type YAHOO.widget.Menu + */ + _oSubmenu: null, + + + /** + * @property _checkImage + * @description Object reference to the menu item's checkmark image. + * @default null + * @private + * @type HTMLImageElement + * @deprecated Use _oCheckedIndicator. + */ + _checkImage: null, + + + /** + * @property _oCheckedIndicator + * @description Object reference to the menu item's checkmark image. + * @default HTMLElement + * @private + * @type HTMLElement + */ + _oCheckedIndicator: null, + + + /** + * @property _oOnclickAttributeValue + * @description Object reference to the menu item's current value for the + * "onclick" configuration attribute. + * @default null + * @private + * @type Object + */ + _oOnclickAttributeValue: null, + + + /** + * @property _sClassName + * @description The current value of the "classname" configuration attribute. + * @default null + * @private + * @type String + */ + _sClassName: null, + + + + // Public properties + + + /** + * @property constructor + * @description Object reference to the menu item's constructor function. + * @default YAHOO.widget.MenuItem + * @type YAHOO.widget.MenuItem + */ + constructor: YAHOO.widget.MenuItem, + + + /** + * @property imageRoot + * @description String representing the root path for all of the menu + * item's images. + * @type String + * @deprecated All menu item images are now applied via CSS + * background images. + */ + imageRoot: null, + + + /** + * @property isSecure + * @description Boolean representing whether or not the current browsing + * context is secure (HTTPS). + * @type Boolean + * @deprecated All menu item images are now applied via CSS + * background images. + */ + isSecure: Module.prototype.isSecure, + + + /** + * @property index + * @description Number indicating the ordinal position of the menu item in + * its group. + * @default null + * @type Number + */ + index: null, + + + /** + * @property groupIndex + * @description Number indicating the index of the group to which the menu + * item belongs. + * @default null + * @type Number + */ + groupIndex: null, + + + /** + * @property parent + * @description Object reference to the menu item's parent menu. + * @default null + * @type YAHOO.widget.Menu + */ + parent: null, + + + /** + * @property element + * @description Object reference to the menu item's + * <li> element. + * @default HTMLLIElement + * @type HTMLLIElement + */ + element: null, + + + /** + * @property srcElement + * @description Object reference to the HTML element (either + * <li>, <optgroup> or + * <option>) used create the menu item. + * @default HTMLLIElement|HTMLOptGroupElement|HTMLOptionElement + * @type HTMLLIElement| + * HTMLOptGroupElement|HTMLOptionElement + */ + srcElement: null, + + + /** + * @property value + * @description Object reference to the menu item's value. + * @default null + * @type Object + */ + value: null, + + + /** + * @property submenuIndicator + * @description Object reference to the <em> element + * used to create the submenu indicator for the menu item. + * @default HTMLElement + * @type HTMLElement + */ + submenuIndicator: null, + + + /** + * @property browser + * @description String representing the browser. + * @type String + */ + browser: Module.prototype.browser, + + + /** + * @property id + * @description Id of the menu item's root <li> + * element. This property should be set via the constructor using the + * configuration object literal. If an id is not specified, then one will + * be created using the "generateId" method of the Dom utility. + * @default null + * @type String + */ + id: null, + + + + // Events + + + /** + * @event destroyEvent + * @description Fires when the menu item's <li> + * element is removed from its parent <ul> element. + * @type YAHOO.util.CustomEvent + */ + destroyEvent: null, + + + /** + * @event mouseOverEvent + * @description Fires when the mouse has entered the menu item. Passes + * back the DOM Event object as an argument. + * @type YAHOO.util.CustomEvent + */ + mouseOverEvent: null, + + + /** + * @event mouseOutEvent + * @description Fires when the mouse has left the menu item. Passes back + * the DOM Event object as an argument. + * @type YAHOO.util.CustomEvent + */ + mouseOutEvent: null, + + + /** + * @event mouseDownEvent + * @description Fires when the user mouses down on the menu item. Passes + * back the DOM Event object as an argument. + * @type YAHOO.util.CustomEvent + */ + mouseDownEvent: null, + + + /** + * @event mouseUpEvent + * @description Fires when the user releases a mouse button while the mouse + * is over the menu item. Passes back the DOM Event object as an argument. + * @type YAHOO.util.CustomEvent + */ + mouseUpEvent: null, + + + /** + * @event clickEvent + * @description Fires when the user clicks the on the menu item. Passes + * back the DOM Event object as an argument. + * @type YAHOO.util.CustomEvent + */ + clickEvent: null, + + + /** + * @event keyPressEvent + * @description Fires when the user presses an alphanumeric key when the + * menu item has focus. Passes back the DOM Event object as an argument. + * @type YAHOO.util.CustomEvent + */ + keyPressEvent: null, + + + /** + * @event keyDownEvent + * @description Fires when the user presses a key when the menu item has + * focus. Passes back the DOM Event object as an argument. + * @type YAHOO.util.CustomEvent + */ + keyDownEvent: null, + + + /** + * @event keyUpEvent + * @description Fires when the user releases a key when the menu item has + * focus. Passes back the DOM Event object as an argument. + * @type YAHOO.util.CustomEvent + */ + keyUpEvent: null, + + + /** + * @event focusEvent + * @description Fires when the menu item receives focus. + * @type YAHOO.util.CustomEvent + */ + focusEvent: null, + + + /** + * @event blurEvent + * @description Fires when the menu item loses the input focus. + * @type YAHOO.util.CustomEvent + */ + blurEvent: null, + + + /** + * @method init + * @description The MenuItem class's initialization method. This method is + * automatically called by the constructor, and sets up all DOM references + * for pre-existing markup, and creates required markup if it is not + * already present. + * @param {String} p_oObject String specifying the text of the menu item. + * @param {HTMLLIElement} p_oObject Object specifying + * the <li> element of the menu item. + * @param {HTMLOptGroupElement} p_oObject Object + * specifying the <optgroup> element of the menu item. + * @param {HTMLOptionElement} p_oObject Object + * specifying the <option> element of the menu item. + * @param {Object} p_oConfig Optional. Object literal specifying the + * configuration for the menu item. See configuration class documentation + * for more details. + */ + init: function(p_oObject, p_oConfig) { + + + if(!this.SUBMENU_TYPE) { + + this.SUBMENU_TYPE = Menu; + + } + + + // Create the config object + + this.cfg = new YAHOO.util.Config(this); + + this.initDefaultConfig(); + + var oConfig = this.cfg; + + + if(this._checkString(p_oObject)) { + + this._createRootNodeStructure(); + + oConfig.setProperty("text", p_oObject); + + } + else if(this._checkDOMNode(p_oObject)) { + + switch(p_oObject.tagName.toUpperCase()) { + + case "OPTION": + + this._createRootNodeStructure(); + + oConfig.setProperty("text", p_oObject.text); + + this.srcElement = p_oObject; + + break; + + case "OPTGROUP": + + this._createRootNodeStructure(); + + oConfig.setProperty("text", p_oObject.label); + + this.srcElement = p_oObject; + + this._initSubTree(); + + break; + + case "LI": + + // Get the anchor node (if it exists) + + var oAnchor = this._getFirstElement(p_oObject, "A"), + sURL = "#", + sTarget, + sText; + + + // Capture the "text" and/or the "URL" + + if(oAnchor) { + + sURL = oAnchor.getAttribute("href"); + sTarget = oAnchor.getAttribute("target"); + + if(oAnchor.innerText) { + + sText = oAnchor.innerText; + + } + else { + + var oRange = oAnchor.ownerDocument.createRange(); + + oRange.selectNodeContents(oAnchor); + + sText = oRange.toString(); + + } + + } + else { + + var oText = p_oObject.firstChild; + + sText = oText.nodeValue; + + oAnchor = document.createElement("a"); + + oAnchor.setAttribute("href", sURL); + + p_oObject.replaceChild(oAnchor, oText); + + oAnchor.appendChild(oText); + + } + + + this.srcElement = p_oObject; + this.element = p_oObject; + this._oAnchor = oAnchor; + + + // Check if emphasis has been applied to the MenuItem + + var oEmphasisNode = this._getFirstElement(oAnchor), + bEmphasis = false, + bStrongEmphasis = false; + + if(oEmphasisNode) { + + // Set a reference to the text node + + this._oText = oEmphasisNode.firstChild; + + switch(oEmphasisNode.tagName.toUpperCase()) { + + case "EM": + + bEmphasis = true; + + break; + + case "STRONG": + + bStrongEmphasis = true; + + break; + + } + + } + else { + + // Set a reference to the text node + + this._oText = oAnchor.firstChild; + + } + + + /* + Set these properties silently to sync up the + configuration object without making changes to the + element's DOM + */ + + oConfig.setProperty("text", sText, true); + oConfig.setProperty("url", sURL, true); + oConfig.setProperty("target", sTarget, true); + oConfig.setProperty("emphasis", bEmphasis, true); + oConfig.setProperty( + "strongemphasis", + bStrongEmphasis, + true + ); + + this._initSubTree(); + + break; + + } + + } + + + if(this.element) { + + var sId = this.element.id; + + if(!sId) { + + sId = this.id || Dom.generateId(); + + this.element.id = sId; + + } + + this.id = sId; + + + Dom.addClass(this.element, this.CSS_CLASS_NAME); + + + // Create custom events + + var CustomEvent = YAHOO.util.CustomEvent; + + this.destroyEvent = new CustomEvent("destroyEvent", this); + this.mouseOverEvent = new CustomEvent("mouseOverEvent", this); + this.mouseOutEvent = new CustomEvent("mouseOutEvent", this); + this.mouseDownEvent = new CustomEvent("mouseDownEvent", this); + this.mouseUpEvent = new CustomEvent("mouseUpEvent", this); + this.clickEvent = new CustomEvent("clickEvent", this); + this.keyPressEvent = new CustomEvent("keyPressEvent", this); + this.keyDownEvent = new CustomEvent("keyDownEvent", this); + this.keyUpEvent = new CustomEvent("keyUpEvent", this); + this.focusEvent = new CustomEvent("focusEvent", this); + this.blurEvent = new CustomEvent("blurEvent", this); + + + if(p_oConfig) { + + oConfig.applyConfig(p_oConfig); + + } + + oConfig.fireQueue(); + + + + + } + + }, + + + + // Private methods + + + /** + * @method _getFirstElement + * @description Returns an HTML element's first HTML element node. + * @private + * @param {HTMLElement} p_oElement Object + * reference specifying the element to be evaluated. + * @param {String} p_sTagName Optional. String specifying the tagname of + * the element to be retrieved. + * @return {HTMLElement} + */ + _getFirstElement: function(p_oElement, p_sTagName) { + + var oFirstChild = p_oElement.firstChild, + oElement; + + if(oFirstChild) { + + if(oFirstChild.nodeType == 1) { + + oElement = oFirstChild; + + } + else { + + var oNextSibling = oFirstChild.nextSibling; + + if(oNextSibling && oNextSibling.nodeType == 1) { + + oElement = oNextSibling; + + } + + } + + } + + + if(p_sTagName) { + + return (oElement && oElement.tagName.toUpperCase() == p_sTagName) ? + oElement : false; + + } + + return oElement; + + }, + + + /** + * @method _checkString + * @description Determines if an object is a string. + * @private + * @param {Object} p_oObject Object to be evaluated. + * @return {Boolean} + */ + _checkString: function(p_oObject) { + + return (typeof p_oObject == "string"); + + }, + + + /** + * @method _checkDOMNode + * @description Determines if an object is an HTML element. + * @private + * @param {Object} p_oObject Object to be evaluated. + * @return {Boolean} + */ + _checkDOMNode: function(p_oObject) { + + return (p_oObject && p_oObject.tagName); + + }, + + + /** + * @method _createRootNodeStructure + * @description Creates the core DOM structure for the menu item. + * @private + */ + _createRootNodeStructure: function () { + + if(!m_oMenuItemElement) { + + m_oMenuItemElement = document.createElement("li"); + m_oMenuItemElement.innerHTML = "s"; + + } + + this.element = m_oMenuItemElement.cloneNode(true); + this._oAnchor = this.element.firstChild; + this._oText = this._oAnchor.firstChild; + + this.element.appendChild(this._oAnchor); + + }, + + + /** + * @method _initSubTree + * @description Iterates the source element's childNodes collection and uses + * the child nodes to instantiate other menus. + * @private + */ + _initSubTree: function() { + + var oSrcEl = this.srcElement, + oConfig = this.cfg; + + + if(oSrcEl.childNodes.length > 0) { + + if( + this.parent.lazyLoad && + this.parent.srcElement && + this.parent.srcElement.tagName.toUpperCase() == "SELECT" + ) { + + oConfig.setProperty( + "submenu", + { id: Dom.generateId(), itemdata: oSrcEl.childNodes } + ); + + } + else { + + var oNode = oSrcEl.firstChild, + aOptions = []; + + do { + + if(oNode && oNode.tagName) { + + switch(oNode.tagName.toUpperCase()) { + + case "DIV": + + oConfig.setProperty("submenu", oNode); + + break; + + case "OPTION": + + aOptions[aOptions.length] = oNode; + + break; + + } + + } + + } + while((oNode = oNode.nextSibling)); + + + var nOptions = aOptions.length; + + if(nOptions > 0) { + + var oMenu = new this.SUBMENU_TYPE(Dom.generateId()); + + oConfig.setProperty("submenu", oMenu); + + for(var n=0; n 0) { + + oAnchor.setAttribute("target", sTarget); + + } + else { + + oAnchor.removeAttribute("target"); + + } + + }, + + + /** + * @method configEmphasis + * @description Event handler for when the "emphasis" configuration property + * of the menu item changes. + * @param {String} p_sType String representing the name of the event that + * was fired. + * @param {Array} p_aArgs Array of arguments sent when the event was fired. + * @param {YAHOO.widget.MenuItem} p_oItem Object representing the menu item + * that fired the event. + */ + configEmphasis: function(p_sType, p_aArgs, p_oItem) { + + var bEmphasis = p_aArgs[0], + oAnchor = this._oAnchor, + oText = this._oText, + oConfig = this.cfg, + oEM; + + + if(bEmphasis && oConfig.getProperty("strongemphasis")) { + + oConfig.setProperty("strongemphasis", false); + + } + + + if(oAnchor) { + + if(bEmphasis) { + + oEM = document.createElement("em"); + oEM.appendChild(oText); + + oAnchor.appendChild(oEM); + + } + else { + + oEM = this._getFirstElement(oAnchor, "EM"); + + if(oEM) { + + oAnchor.removeChild(oEM); + oAnchor.appendChild(oText); + + } + + } + + } + + }, + + + /** + * @method configStrongEmphasis + * @description Event handler for when the "strongemphasis" configuration + * property of the menu item changes. + * @param {String} p_sType String representing the name of the event that + * was fired. + * @param {Array} p_aArgs Array of arguments sent when the event was fired. + * @param {YAHOO.widget.MenuItem} p_oItem Object representing the menu item + * that fired the event. + */ + configStrongEmphasis: function(p_sType, p_aArgs, p_oItem) { + + var bStrongEmphasis = p_aArgs[0], + oAnchor = this._oAnchor, + oText = this._oText, + oConfig = this.cfg, + oStrong; + + if(bStrongEmphasis && oConfig.getProperty("emphasis")) { + + oConfig.setProperty("emphasis", false); + + } + + if(oAnchor) { + + if(bStrongEmphasis) { + + oStrong = document.createElement("strong"); + oStrong.appendChild(oText); + + oAnchor.appendChild(oStrong); + + } + else { + + oStrong = this._getFirstElement(oAnchor, "STRONG"); + + if(oStrong) { + + oAnchor.removeChild(oStrong); + oAnchor.appendChild(oText); + + } + + } + + } + + }, + + + /** + * @method configChecked + * @description Event handler for when the "checked" configuration property + * of the menu item changes. + * @param {String} p_sType String representing the name of the event that + * was fired. + * @param {Array} p_aArgs Array of arguments sent when the event was fired. + * @param {YAHOO.widget.MenuItem} p_oItem Object representing the menu item + * that fired the event. + */ + configChecked: function(p_sType, p_aArgs, p_oItem) { + + var bChecked = p_aArgs[0], + oEl = this.element, + oConfig = this.cfg, + oEM; + + + if(bChecked) { + + if(!m_oCheckedIndicator) { + + m_oCheckedIndicator = document.createElement("em"); + m_oCheckedIndicator.innerHTML = this.CHECKED_TEXT; + m_oCheckedIndicator.className = "checkedindicator"; + + } + + oEM = m_oCheckedIndicator.cloneNode(true); + + var oSubmenu = this.cfg.getProperty("submenu"); + + if(oSubmenu && oSubmenu.element) { + + oEl.insertBefore(oEM, oSubmenu.element); + + } + else { + + oEl.appendChild(oEM); + + } + + + Dom.addClass(oEl, "checked"); + + this._oCheckedIndicator = oEM; + + if(oConfig.getProperty("disabled")) { + + oConfig.refireEvent("disabled"); + + } + + if(oConfig.getProperty("selected")) { + + oConfig.refireEvent("selected"); + + } + + } + else { + + oEM = this._oCheckedIndicator; + + Dom.removeClass(oEl, "checked"); + + if(oEM) { + + oEl.removeChild(oEM); + + } + + this._oCheckedIndicator = null; + + } + + }, + + + + /** + * @method configDisabled + * @description Event handler for when the "disabled" configuration property + * of the menu item changes. + * @param {String} p_sType String representing the name of the event that + * was fired. + * @param {Array} p_aArgs Array of arguments sent when the event was fired. + * @param {YAHOO.widget.MenuItem} p_oItem Object representing the menu item + * that fired the event. + */ + configDisabled: function(p_sType, p_aArgs, p_oItem) { + + var bDisabled = p_aArgs[0], + oConfig = this.cfg, + oAnchor = this._oAnchor, + aNodes = [this.element, oAnchor], + oHelpText = this._oHelpTextEM, + oCheckedIndicator = this._oCheckedIndicator, + oSubmenuIndicator = this.submenuIndicator, + i = 1; + + + if(oHelpText) { + + i++; + aNodes[i] = oHelpText; + + } + + + if(oCheckedIndicator) { + + oCheckedIndicator.firstChild.nodeValue = bDisabled ? + this.DISABLED_CHECKED_TEXT : + this.CHECKED_TEXT; + + i++; + aNodes[i] = oCheckedIndicator; + + } + + + if(oSubmenuIndicator) { + + oSubmenuIndicator.firstChild.nodeValue = bDisabled ? + this.DISABLED_SUBMENU_INDICATOR_TEXT : + this.COLLAPSED_SUBMENU_INDICATOR_TEXT; + + i++; + aNodes[i] = oSubmenuIndicator; + + } + + + if(bDisabled) { + + if(oConfig.getProperty("selected")) { + + oConfig.setProperty("selected", false); + + } + + oAnchor.removeAttribute("href"); + + Dom.addClass(aNodes, "disabled"); + + } + else { + + oAnchor.setAttribute("href", oConfig.getProperty("url")); + + Dom.removeClass(aNodes, "disabled"); + + } + + }, + + + /** + * @method configSelected + * @description Event handler for when the "selected" configuration property + * of the menu item changes. + * @param {String} p_sType String representing the name of the event that + * was fired. + * @param {Array} p_aArgs Array of arguments sent when the event was fired. + * @param {YAHOO.widget.MenuItem} p_oItem Object representing the menu item + * that fired the event. + */ + configSelected: function(p_sType, p_aArgs, p_oItem) { + + if(!this.cfg.getProperty("disabled")) { + + var bSelected = p_aArgs[0], + oHelpText = this._oHelpTextEM, + oSubmenuIndicator = this.submenuIndicator, + oCheckedIndicator = this._oCheckedIndicator, + aNodes = [this.element, this._oAnchor], + i = 1; + + + if(oHelpText) { + + i++; + aNodes[i] = oHelpText; + + } + + + if(oSubmenuIndicator) { + + i++; + aNodes[i] = oSubmenuIndicator; + + } + + + if(oCheckedIndicator) { + + i++; + aNodes[i] = oCheckedIndicator; + + } + + + if(bSelected) { + + Dom.addClass(aNodes, "selected"); + + } + else { + + Dom.removeClass(aNodes, "selected"); + + } + + } + + }, + + + /** + * @method configSubmenu + * @description Event handler for when the "submenu" configuration property + * of the menu item changes. + * @param {String} p_sType String representing the name of the event that + * was fired. + * @param {Array} p_aArgs Array of arguments sent when the event was fired. + * @param {YAHOO.widget.MenuItem} p_oItem Object representing the menu item + * that fired the event. + */ + configSubmenu: function(p_sType, p_aArgs, p_oItem) { + + var oEl = this.element, + oSubmenu = p_aArgs[0], + oSubmenuIndicator = this.submenuIndicator, + oConfig = this.cfg, + aNodes = [this.element, this._oAnchor], + bLazyLoad = this.parent && this.parent.lazyLoad, + oMenu; + + + if(oSubmenu) { + + if(oSubmenu instanceof Menu) { + + oMenu = oSubmenu; + oMenu.parent = this; + oMenu.lazyLoad = bLazyLoad; + + } + else if( + typeof oSubmenu == "object" && + oSubmenu.id && + !oSubmenu.nodeType + ) { + + var sSubmenuId = oSubmenu.id, + oSubmenuConfig = oSubmenu; + + oSubmenuConfig.lazyload = bLazyLoad; + oSubmenuConfig.parent = this; + + oMenu = new this.SUBMENU_TYPE(sSubmenuId, oSubmenuConfig); + + + // Set the value of the property to the Menu instance + + this.cfg.setProperty("submenu", oMenu, true); + + } + else { + + oMenu = new this.SUBMENU_TYPE( + oSubmenu, + { lazyload: bLazyLoad, parent: this } + ); + + + // Set the value of the property to the Menu instance + + this.cfg.setProperty("submenu", oMenu, true); + + } + + + if(oMenu) { + + this._oSubmenu = oMenu; + + + if(!oSubmenuIndicator) { + + + if(!m_oSubmenuIndicator) { + + m_oSubmenuIndicator = document.createElement("em"); + m_oSubmenuIndicator.innerHTML = + this.COLLAPSED_SUBMENU_INDICATOR_TEXT; + m_oSubmenuIndicator.className = "submenuindicator"; + + } + + + oSubmenuIndicator = m_oSubmenuIndicator.cloneNode(true); + + + if(oMenu.element.parentNode == oEl) { + + if(this.browser == "opera") { + + oEl.appendChild(oSubmenuIndicator); + + oMenu.renderEvent.subscribe(function() { + + oSubmenuIndicator.parentNode.insertBefore( + oSubmenuIndicator, + oMenu.element + ); + + }); + + } + else { + + oEl.insertBefore(oSubmenuIndicator, oMenu.element); + + } + + } + else { + + oEl.appendChild(oSubmenuIndicator); + + } + + this.submenuIndicator = oSubmenuIndicator; + + } + + + Dom.addClass(aNodes, "hassubmenu"); + + + if(oConfig.getProperty("disabled")) { + + oConfig.refireEvent("disabled"); + + } + + if(oConfig.getProperty("selected")) { + + oConfig.refireEvent("selected"); + + } + + } + + } + else { + + Dom.removeClass(aNodes, "hassubmenu"); + + if(oSubmenuIndicator) { + + oEl.removeChild(oSubmenuIndicator); + + } + + if(this._oSubmenu) { + + this._oSubmenu.destroy(); + + } + + } + + }, + + + /** + * @method configOnClick + * @description Event handler for when the "onclick" configuration property + * of the menu item changes. + * @param {String} p_sType String representing the name of the event that + * was fired. + * @param {Array} p_aArgs Array of arguments sent when the event was fired. + * @param {YAHOO.widget.MenuItem} p_oItem Object representing the menu item + * that fired the event. + */ + configOnClick: function(p_sType, p_aArgs, p_oItem) { + + var oObject = p_aArgs[0]; + + /* + Remove any existing listeners if a "click" event handler has + already been specified. + */ + + if( + this._oOnclickAttributeValue && + (this._oOnclickAttributeValue != oObject) + ) { + + this.clickEvent.unsubscribe( + this._oOnclickAttributeValue.fn, + this._oOnclickAttributeValue.obj + ); + + this._oOnclickAttributeValue = null; + + } + + + if( + !this._oOnclickAttributeValue && + typeof oObject == "object" && + typeof oObject.fn == "function" + ) { + + this.clickEvent.subscribe( + oObject.fn, + (oObject.obj || this), + oObject.scope + ); + + this._oOnclickAttributeValue = oObject; + + } + + }, + + + /** + * @method configClassName + * @description Event handler for when the "classname" configuration + * property of a menu item changes. + * @param {String} p_sType String representing the name of the event that + * was fired. + * @param {Array} p_aArgs Array of arguments sent when the event was fired. + * @param {YAHOO.widget.MenuItem} p_oItem Object representing the menu item + * that fired the event. + */ + configClassName: function(p_sType, p_aArgs, p_oItem) { + + var sClassName = p_aArgs[0]; + + if(this._sClassName) { + + Dom.removeClass(this.element, this._sClassName); + + } + + Dom.addClass(this.element, sClassName); + this._sClassName = sClassName; + + }, + + + + // Public methods + + + /** + * @method initDefaultConfig + * @description Initializes an item's configurable properties. + */ + initDefaultConfig : function() { + + var oConfig = this.cfg, + CheckBoolean = oConfig.checkBoolean; + + + // Define the configuration attributes + + /** + * @config text + * @description String specifying the text label for the menu item. + * When building a menu from existing HTML the value of this property + * will be interpreted from the menu's markup. + * @default "" + * @type String + */ + oConfig.addProperty( + "text", + { + value: "", + handler: this.configText, + validator: this._checkString, + suppressEvent: true + } + ); + + + /** + * @config helptext + * @description String specifying additional instructional text to + * accompany the text for the nenu item. + * @default null + * @type String| + * HTMLElement + */ + oConfig.addProperty("helptext", { handler: this.configHelpText }); + + + /** + * @config url + * @description String specifying the URL for the menu item's anchor's + * "href" attribute. When building a menu from existing HTML the value + * of this property will be interpreted from the menu's markup. + * @default "#" + * @type String + */ + oConfig.addProperty( + "url", + { value: "#", handler: this.configURL, suppressEvent: true } + ); + + + /** + * @config target + * @description String specifying the value for the "target" attribute + * of the menu item's anchor element. Specifying a target will + * require the user to click directly on the menu item's anchor node in + * order to cause the browser to navigate to the specified URL. + * When building a menu from existing HTML the value of this property + * will be interpreted from the menu's markup. + * @default null + * @type String + */ + oConfig.addProperty( + "target", + { handler: this.configTarget, suppressEvent: true } + ); + + + /** + * @config emphasis + * @description Boolean indicating if the text of the menu item will be + * rendered with emphasis. When building a menu from existing HTML the + * value of this property will be interpreted from the menu's markup. + * @default false + * @type Boolean + */ + oConfig.addProperty( + "emphasis", + { + value: false, + handler: this.configEmphasis, + validator: CheckBoolean, + suppressEvent: true + } + ); + + + /** + * @config strongemphasis + * @description Boolean indicating if the text of the menu item will be + * rendered with strong emphasis. When building a menu from existing + * HTML the value of this property will be interpreted from the + * menu's markup. + * @default false + * @type Boolean + */ + oConfig.addProperty( + "strongemphasis", + { + value: false, + handler: this.configStrongEmphasis, + validator: CheckBoolean, + suppressEvent: true + } + ); + + + /** + * @config checked + * @description Boolean indicating if the menu item should be rendered + * with a checkmark. + * @default false + * @type Boolean + */ + oConfig.addProperty( + "checked", + { + value: false, + handler: this.configChecked, + validator: this.cfg.checkBoolean, + suppressEvent: true, + supercedes:["disabled"] + } + ); + + + /** + * @config disabled + * @description Boolean indicating if the menu item should be disabled. + * (Disabled menu items are dimmed and will not respond to user input + * or fire events.) + * @default false + * @type Boolean + */ + oConfig.addProperty( + "disabled", + { + value: false, + handler: this.configDisabled, + validator: CheckBoolean, + suppressEvent: true + } + ); + + + /** + * @config selected + * @description Boolean indicating if the menu item should + * be highlighted. + * @default false + * @type Boolean + */ + oConfig.addProperty( + "selected", + { + value: false, + handler: this.configSelected, + validator: CheckBoolean, + suppressEvent: true + } + ); + + + /** + * @config submenu + * @description Object specifying the submenu to be appended to the + * menu item. The value can be one of the following:
    • Object + * specifying a Menu instance.
    • Object literal specifying the + * menu to be created. Format: { id: [menu id], itemdata: + * [array of values for + * items] }.
    • String specifying the id attribute + * of the <div> element of the menu.
    • + * Object specifying the <div> element of the + * menu.
    + * @default null + * @type Menu|String|Object| + * HTMLElement + */ + oConfig.addProperty("submenu", { handler: this.configSubmenu }); + + + /** + * @config onclick + * @description Object literal representing the code to be executed when + * the button is clicked. Format:
    {
    + * fn: Function, // The handler to call when + * the event fires.
    obj: Object, // An + * object to pass back to the handler.
    scope: + * Object // The object to use for the scope of the handler. + *
    }
    + * @type Object + * @default null + */ + oConfig.addProperty("onclick", { handler: this.configOnClick }); + + + /** + * @config classname + * @description CSS class to be applied to the menu item's root + * <li> element. The specified class(es) are + * appended in addition to the default class as specified by the menu + * item's CSS_CLASS_NAME constant. + * @default null + * @type String + */ + oConfig.addProperty( + "classname", + { + value: null, + handler: this.configClassName, + validator: this._checkString + } + ); + + }, + + + /** + * @method getNextEnabledSibling + * @description Finds the menu item's next enabled sibling. + * @return YAHOO.widget.MenuItem + */ + getNextEnabledSibling: function() { + + if(this.parent instanceof Menu) { + + var nGroupIndex = this.groupIndex; + + function getNextArrayItem(p_aArray, p_nStartIndex) { + + return p_aArray[p_nStartIndex] || + getNextArrayItem(p_aArray, (p_nStartIndex+1)); + + } + + + var aItemGroups = this.parent.getItemGroups(), + oNextItem; + + + if(this.index < (aItemGroups[nGroupIndex].length - 1)) { + + oNextItem = getNextArrayItem( + aItemGroups[nGroupIndex], + (this.index+1) + ); + + } + else { + + var nNextGroupIndex; + + if(nGroupIndex < (aItemGroups.length - 1)) { + + nNextGroupIndex = nGroupIndex + 1; + + } + else { + + nNextGroupIndex = 0; + + } + + var aNextGroup = getNextArrayItem(aItemGroups, nNextGroupIndex); + + // Retrieve the first menu item in the next group + + oNextItem = getNextArrayItem(aNextGroup, 0); + + } + + return ( + oNextItem.cfg.getProperty("disabled") || + oNextItem.element.style.display == "none" + ) ? + oNextItem.getNextEnabledSibling() : oNextItem; + + } + + }, + + + /** + * @method getPreviousEnabledSibling + * @description Finds the menu item's previous enabled sibling. + * @return {YAHOO.widget.MenuItem} + */ + getPreviousEnabledSibling: function() { + + if(this.parent instanceof Menu) { + + var nGroupIndex = this.groupIndex; + + function getPreviousArrayItem(p_aArray, p_nStartIndex) { + + return p_aArray[p_nStartIndex] || + getPreviousArrayItem(p_aArray, (p_nStartIndex-1)); + + } + + function getFirstItemIndex(p_aArray, p_nStartIndex) { + + return p_aArray[p_nStartIndex] ? + p_nStartIndex : + getFirstItemIndex(p_aArray, (p_nStartIndex+1)); + + } + + var aItemGroups = this.parent.getItemGroups(), + oPreviousItem; + + if( + this.index > getFirstItemIndex(aItemGroups[nGroupIndex], 0) + ) { + + oPreviousItem = + getPreviousArrayItem( + aItemGroups[nGroupIndex], + (this.index-1) + ); + + } + else { + + var nPreviousGroupIndex; + + if(nGroupIndex > getFirstItemIndex(aItemGroups, 0)) { + + nPreviousGroupIndex = nGroupIndex - 1; + + } + else { + + nPreviousGroupIndex = aItemGroups.length - 1; + + } + + var aPreviousGroup = + getPreviousArrayItem(aItemGroups, nPreviousGroupIndex); + + oPreviousItem = + getPreviousArrayItem( + aPreviousGroup, + (aPreviousGroup.length - 1) + ); + + } + + return ( + oPreviousItem.cfg.getProperty("disabled") || + oPreviousItem.element.style.display == "none" + ) ? + oPreviousItem.getPreviousEnabledSibling() : oPreviousItem; + + } + + }, + + + /** + * @method focus + * @description Causes the menu item to receive the focus and fires the + * focus event. + */ + focus: function() { + + var oParent = this.parent, + oAnchor = this._oAnchor, + oActiveItem = oParent.activeItem; + + + function setFocus() { + + try { + + oAnchor.focus(); + + } + catch(e) { + + } + + } + + + if( + !this.cfg.getProperty("disabled") && + oParent && + oParent.cfg.getProperty("visible") && + this.element.style.display != "none" + ) { + + if(oActiveItem) { + + oActiveItem.blur(); + + } + + + /* + Setting focus via a timer fixes a race condition in Firefox, IE + and Opera where the browser viewport jumps as it trys to + position and focus the menu. + */ + + window.setTimeout(setFocus, 0); + + this.focusEvent.fire(); + + } + + }, + + + /** + * @method blur + * @description Causes the menu item to lose focus and fires the + * onblur event. + */ + blur: function() { + + var oParent = this.parent; + + if( + !this.cfg.getProperty("disabled") && + oParent && + Dom.getStyle(oParent.element, "visibility") == "visible" + ) { + + this._oAnchor.blur(); + + this.blurEvent.fire(); + + } + + }, + + + /** + * @method destroy + * @description Removes the menu item's <li> element + * from its parent <ul> element. + */ + destroy: function() { + + var oEl = this.element; + + if(oEl) { + + + // If the item has a submenu, destroy it first + + var oSubmenu = this.cfg.getProperty("submenu"); + + if(oSubmenu) { + + oSubmenu.destroy(); + + } + + + // Remove CustomEvent listeners + + this.mouseOverEvent.unsubscribeAll(); + this.mouseOutEvent.unsubscribeAll(); + this.mouseDownEvent.unsubscribeAll(); + this.mouseUpEvent.unsubscribeAll(); + this.clickEvent.unsubscribeAll(); + this.keyPressEvent.unsubscribeAll(); + this.keyDownEvent.unsubscribeAll(); + this.keyUpEvent.unsubscribeAll(); + this.focusEvent.unsubscribeAll(); + this.blurEvent.unsubscribeAll(); + this.cfg.configChangedEvent.unsubscribeAll(); + + + // Remove the element from the parent node + + var oParentNode = oEl.parentNode; + + if(oParentNode) { + + oParentNode.removeChild(oEl); + + this.destroyEvent.fire(); + + } + + this.destroyEvent.unsubscribeAll(); + + } + + }, + + + /** + * @method toString + * @description Returns a string representing the menu item. + * @return {String} + */ + toString: function() { + + return ("MenuItem: " + this.cfg.getProperty("text")); + + } + +}; + +})(); + + + +/** +* Creates a list of options or commands which are made visible in response to +* an HTML element's "contextmenu" event ("mousedown" for Opera). +* +* @param {String} p_oElement String specifying the id attribute of the +* <div> element of the context menu. +* @param {String} p_oElement String specifying the id attribute of the +* <select> element to be used as the data source for the +* context menu. +* @param {HTMLDivElement} p_oElement Object specifying the +* <div> element of the context menu. +* @param {HTMLSelectElement} p_oElement Object specifying +* the <select> element to be used as the data source for +* the context menu. +* @param {Object} p_oConfig Optional. Object literal specifying the +* configuration for the context menu. See configuration class documentation +* for more details. +* @class ContextMenu +* @constructor +* @extends YAHOO.widget.Menu +* @namespace YAHOO.widget +*/ +YAHOO.widget.ContextMenu = function(p_oElement, p_oConfig) { + + YAHOO.widget.ContextMenu.superclass.constructor.call( + this, + p_oElement, + p_oConfig + ); + +}; + + +YAHOO.lang.extend(YAHOO.widget.ContextMenu, YAHOO.widget.Menu, { + + + +// Private properties + + +/** +* @property _oTrigger +* @description Object reference to the current value of the "trigger" +* configuration property. +* @default null +* @private +* @type String|HTMLElement|Array +*/ +_oTrigger: null, + + +/** +* @property _bCancelled +* @description Boolean indicating if the display of the context menu should +* be cancelled. +* @default false +* @private +* @type Boolean +*/ +_bCancelled: false, + + +// Public properties + + +/** +* @property contextEventTarget +* @description Object reference for the HTML element that was the target of the +* "contextmenu" DOM event ("mousedown" for Opera) that triggered the display of +* the context menu. +* @default null +* @type HTMLElement +*/ +contextEventTarget: null, + + + +// Events + + +/** +* @event triggerContextMenuEvent +* @description Custom Event wrapper for the "contextmenu" DOM event +* ("mousedown" for Opera) fired by the element(s) that trigger the display of +* the context menu. +*/ +triggerContextMenuEvent: null, + + + + + +/** +* @method init +* @description The ContextMenu class's initialization method. This method is +* automatically called by the constructor, and sets up all DOM references for +* pre-existing markup, and creates required markup if it is not already present. +* @param {String} p_oElement String specifying the id attribute of the +* <div> element of the context menu. +* @param {String} p_oElement String specifying the id attribute of the +* <select> element to be used as the data source for +* the context menu. +* @param {HTMLDivElement} p_oElement Object specifying the +* <div> element of the context menu. +* @param {HTMLSelectElement} p_oElement Object specifying +* the <select> element to be used as the data source for +* the context menu. +* @param {Object} p_oConfig Optional. Object literal specifying the +* configuration for the context menu. See configuration class documentation +* for more details. +*/ +init: function(p_oElement, p_oConfig) { + + if(!this.ITEM_TYPE) { + + this.ITEM_TYPE = YAHOO.widget.ContextMenuItem; + + } + + + // Call the init of the superclass (YAHOO.widget.Menu) + + YAHOO.widget.ContextMenu.superclass.init.call(this, p_oElement); + + + this.beforeInitEvent.fire(YAHOO.widget.ContextMenu); + + + if(p_oConfig) { + + this.cfg.applyConfig(p_oConfig, true); + + } + + + this.initEvent.fire(YAHOO.widget.ContextMenu); + +}, + + +/** +* @method initEvents +* @description Initializes the custom events for the context menu. +*/ +initEvents: function() { + + YAHOO.widget.ContextMenu.superclass.initEvents.call(this); + + // Create custom events + + this.triggerContextMenuEvent = + new YAHOO.util.CustomEvent("triggerContextMenuEvent", this); + +}, + + +/** +* @method cancel +* @description Cancels the display of the context menu. +*/ +cancel: function() { + + this._bCancelled = true; + +}, + + + +// Private methods + + +/** +* @method _removeEventHandlers +* @description Removes all of the DOM event handlers from the HTML element(s) +* whose "context menu" event ("click" for Opera) trigger the display of +* the context menu. +* @private +*/ +_removeEventHandlers: function() { + + var Event = YAHOO.util.Event, + oTrigger = this._oTrigger, + bOpera = (this.browser == "opera"); + + + // Remove the event handlers from the trigger(s) + + Event.removeListener( + oTrigger, + (bOpera ? "mousedown" : "contextmenu"), + this._onTriggerContextMenu + ); + + if(bOpera) { + + Event.removeListener(oTrigger, "click", this._onTriggerClick); + + } + +}, + + + +// Private event handlers + + +/** +* @method _onTriggerClick +* @description "click" event handler for the HTML element(s) identified as the +* "trigger" for the context menu. Used to cancel default behaviors in Opera. +* @private +* @param {Event} p_oEvent Object representing the DOM event object passed back +* by the event utility (YAHOO.util.Event). +* @param {YAHOO.widget.ContextMenu} p_oMenu Object representing the context +* menu that is handling the event. +*/ +_onTriggerClick: function(p_oEvent, p_oMenu) { + + if(p_oEvent.ctrlKey) { + + YAHOO.util.Event.stopEvent(p_oEvent); + + } + +}, + + +/** +* @method _onTriggerContextMenu +* @description "contextmenu" event handler ("mousedown" for Opera) for the HTML +* element(s) that trigger the display of the context menu. +* @private +* @param {Event} p_oEvent Object representing the DOM event object passed back +* by the event utility (YAHOO.util.Event). +* @param {YAHOO.widget.ContextMenu} p_oMenu Object representing the context +* menu that is handling the event. +*/ +_onTriggerContextMenu: function(p_oEvent, p_oMenu) { + + var Event = YAHOO.util.Event; + + if(p_oEvent.type == "mousedown" && !p_oEvent.ctrlKey) { + + return; + + } + + + /* + Prevent the browser's default context menu from appearing and + stop the propagation of the "contextmenu" event so that + other ContextMenu instances are not displayed. + */ + + Event.stopEvent(p_oEvent); + + + // Hide any other ContextMenu instances that might be visible + + YAHOO.widget.MenuManager.hideVisible(); + + + this.contextEventTarget = Event.getTarget(p_oEvent); + + this.triggerContextMenuEvent.fire(p_oEvent); + + + if(!this._bCancelled) { + + // Position and display the context menu + + this.cfg.setProperty("xy", Event.getXY(p_oEvent)); + + this.show(); + + } + + this._bCancelled = false; + +}, + + + +// Public methods + + +/** +* @method toString +* @description Returns a string representing the context menu. +* @return {String} +*/ +toString: function() { + + return ("ContextMenu " + this.id); + +}, + + +/** +* @method initDefaultConfig +* @description Initializes the class's configurable properties which can be +* changed using the context menu's Config object ("cfg"). +*/ +initDefaultConfig: function() { + + YAHOO.widget.ContextMenu.superclass.initDefaultConfig.call(this); + + /** + * @config trigger + * @description The HTML element(s) whose "contextmenu" event ("mousedown" + * for Opera) trigger the display of the context menu. Can be a string + * representing the id attribute of the HTML element, an object reference + * for the HTML element, or an array of strings or HTML element references. + * @default null + * @type String|HTMLElement|Array + */ + this.cfg.addProperty("trigger", { handler: this.configTrigger }); + +}, + + +/** +* @method destroy +* @description Removes the context menu's <div> element +* (and accompanying child nodes) from the document. +*/ +destroy: function() { + + // Remove the DOM event handlers from the current trigger(s) + + this._removeEventHandlers(); + + + // Continue with the superclass implementation of this method + + YAHOO.widget.ContextMenu.superclass.destroy.call(this); + +}, + + + +// Public event handlers for configuration properties + + +/** +* @method configTrigger +* @description Event handler for when the value of the "trigger" configuration +* property changes. +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.ContextMenu} p_oMenu Object representing the context +* menu that fired the event. +*/ +configTrigger: function(p_sType, p_aArgs, p_oMenu) { + + var Event = YAHOO.util.Event, + oTrigger = p_aArgs[0]; + + if(oTrigger) { + + /* + If there is a current "trigger" - remove the event handlers + from that element(s) before assigning new ones + */ + + if(this._oTrigger) { + + this._removeEventHandlers(); + + } + + this._oTrigger = oTrigger; + + + /* + Listen for the "mousedown" event in Opera b/c it does not + support the "contextmenu" event + */ + + var bOpera = (this.browser == "opera"); + + Event.addListener( + oTrigger, + (bOpera ? "mousedown" : "contextmenu"), + this._onTriggerContextMenu, + this, + true + ); + + + /* + Assign a "click" event handler to the trigger element(s) for + Opera to prevent default browser behaviors. + */ + + if(bOpera) { + + Event.addListener( + oTrigger, + "click", + this._onTriggerClick, + this, + true + ); + + } + + } + else { + + this._removeEventHandlers(); + + } + +} + +}); // END YAHOO.lang.extend + + + +/** +* Creates an item for a context menu. +* +* @param {String} p_oObject String specifying the text of the context menu item. +* @param {HTMLLIElement} p_oObject Object specifying the +* <li> element of the context menu item. +* @param {HTMLOptGroupElement} p_oObject Object +* specifying the <optgroup> element of the context +* menu item. +* @param {HTMLOptionElement} p_oObject Object specifying +* the <option> element of the context menu item. +* @param {Object} p_oConfig Optional. Object literal specifying the +* configuration for the context menu item. See configuration class +* documentation for more details. +* @class ContextMenuItem +* @constructor +* @extends YAHOO.widget.MenuItem +*/ +YAHOO.widget.ContextMenuItem = function(p_oObject, p_oConfig) { + + YAHOO.widget.ContextMenuItem.superclass.constructor.call( + this, + p_oObject, + p_oConfig + ); + +}; + +YAHOO.lang.extend(YAHOO.widget.ContextMenuItem, YAHOO.widget.MenuItem, { + + +/** +* @method init +* @description The ContextMenuItem class's initialization method. This method +* is automatically called by the constructor, and sets up all DOM references +* for pre-existing markup, and creates required markup if it is not +* already present. +* @param {String} p_oObject String specifying the text of the context menu item. +* @param {HTMLLIElement} p_oObject Object specifying the +* <li> element of the context menu item. +* @param {HTMLOptGroupElement} p_oObject Object +* specifying the <optgroup> element of the context +* menu item. +* @param {HTMLOptionElement} p_oObject Object specifying +* the <option> element of the context menu item. +* @param {Object} p_oConfig Optional. Object literal specifying the +* configuration for the context menu item. See configuration class +* documentation for more details. +*/ +init: function(p_oObject, p_oConfig) { + + if(!this.SUBMENU_TYPE) { + + this.SUBMENU_TYPE = YAHOO.widget.ContextMenu; + + } + + + /* + Call the init of the superclass (YAHOO.widget.MenuItem) + Note: We don't pass the user config in here yet + because we only want it executed once, at the lowest + subclass level. + */ + + YAHOO.widget.ContextMenuItem.superclass.init.call(this, p_oObject); + + var oConfig = this.cfg; + + if(p_oConfig) { + + oConfig.applyConfig(p_oConfig, true); + + } + + oConfig.fireQueue(); + +}, + + + +// Public methods + + +/** +* @method toString +* @description Returns a string representing the context menu item. +* @return {String} +*/ +toString: function() { + + return ("ContextMenuItem: " + this.cfg.getProperty("text")); + +} + +}); // END YAHOO.lang.extend + + + +/** +* Horizontal collection of items, each of which can contain a submenu. +* +* @param {String} p_oElement String specifying the id attribute of the +* <div> element of the menu bar. +* @param {String} p_oElement String specifying the id attribute of the +* <select> element to be used as the data source for the +* menu bar. +* @param {HTMLDivElement} p_oElement Object specifying +* the <div> element of the menu bar. +* @param {HTMLSelectElement} p_oElement Object +* specifying the <select> element to be used as the data +* source for the menu bar. +* @param {Object} p_oConfig Optional. Object literal specifying the +* configuration for the menu bar. See configuration class documentation for +* more details. +* @class Menubar +* @constructor +* @extends YAHOO.widget.Menu +* @namespace YAHOO.widget +*/ +YAHOO.widget.MenuBar = function(p_oElement, p_oConfig) { + + YAHOO.widget.MenuBar.superclass.constructor.call( + this, + p_oElement, + p_oConfig + ); + +}; + +YAHOO.lang.extend(YAHOO.widget.MenuBar, YAHOO.widget.Menu, { + +/** +* @method init +* @description The MenuBar class's initialization method. This method is +* automatically called by the constructor, and sets up all DOM references for +* pre-existing markup, and creates required markup if it is not already present. +* @param {String} p_oElement String specifying the id attribute of the +* <div> element of the menu bar. +* @param {String} p_oElement String specifying the id attribute of the +* <select> element to be used as the data source for the +* menu bar. +* @param {HTMLDivElement} p_oElement Object specifying +* the <div> element of the menu bar. +* @param {HTMLSelectElement} p_oElement Object +* specifying the <select> element to be used as the data +* source for the menu bar. +* @param {Object} p_oConfig Optional. Object literal specifying the +* configuration for the menu bar. See configuration class documentation for +* more details. +*/ +init: function(p_oElement, p_oConfig) { + + if(!this.ITEM_TYPE) { + + this.ITEM_TYPE = YAHOO.widget.MenuBarItem; + + } + + + // Call the init of the superclass (YAHOO.widget.Menu) + + YAHOO.widget.MenuBar.superclass.init.call(this, p_oElement); + + + this.beforeInitEvent.fire(YAHOO.widget.MenuBar); + + + if(p_oConfig) { + + this.cfg.applyConfig(p_oConfig, true); + + } + + this.initEvent.fire(YAHOO.widget.MenuBar); + +}, + + + +// Constants + + +/** +* @property CSS_CLASS_NAME +* @description String representing the CSS class(es) to be applied to the menu +* bar's <div> element. +* @default "yuimenubar" +* @final +* @type String +*/ +CSS_CLASS_NAME: "yuimenubar", + + + +// Protected event handlers + + +/** +* @method _onKeyDown +* @description "keydown" Custom Event handler for the menu bar. +* @private +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.MenuBar} p_oMenuBar Object representing the menu bar +* that fired the event. +*/ +_onKeyDown: function(p_sType, p_aArgs, p_oMenuBar) { + + var Event = YAHOO.util.Event, + oEvent = p_aArgs[0], + oItem = p_aArgs[1], + oSubmenu; + + + if(oItem && !oItem.cfg.getProperty("disabled")) { + + var oItemCfg = oItem.cfg; + + switch(oEvent.keyCode) { + + case 37: // Left arrow + case 39: // Right arrow + + if( + oItem == this.activeItem && + !oItemCfg.getProperty("selected") + ) { + + oItemCfg.setProperty("selected", true); + + } + else { + + var oNextItem = (oEvent.keyCode == 37) ? + oItem.getPreviousEnabledSibling() : + oItem.getNextEnabledSibling(); + + if(oNextItem) { + + this.clearActiveItem(); + + oNextItem.cfg.setProperty("selected", true); + + + if(this.cfg.getProperty("autosubmenudisplay")) { + + oSubmenu = oNextItem.cfg.getProperty("submenu"); + + if(oSubmenu) { + + oSubmenu.show(); + oSubmenu.activeItem.blur(); + oSubmenu.activeItem = null; + + } + + } + + oNextItem.focus(); + + } + + } + + Event.preventDefault(oEvent); + + break; + + case 40: // Down arrow + + if(this.activeItem != oItem) { + + this.clearActiveItem(); + + oItemCfg.setProperty("selected", true); + oItem.focus(); + + } + + oSubmenu = oItemCfg.getProperty("submenu"); + + if(oSubmenu) { + + if(oSubmenu.cfg.getProperty("visible")) { + + oSubmenu.setInitialSelection(); + oSubmenu.setInitialFocus(); + + } + else { + + oSubmenu.show(); + + } + + } + + Event.preventDefault(oEvent); + + break; + + } + + } + + + if(oEvent.keyCode == 27 && this.activeItem) { // Esc key + + oSubmenu = this.activeItem.cfg.getProperty("submenu"); + + if(oSubmenu && oSubmenu.cfg.getProperty("visible")) { + + oSubmenu.hide(); + this.activeItem.focus(); + + } + else { + + this.activeItem.cfg.setProperty("selected", false); + this.activeItem.blur(); + + } + + Event.preventDefault(oEvent); + + } + +}, + + +/** +* @method _onClick +* @description "click" event handler for the menu bar. +* @protected +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.MenuBar} p_oMenuBar Object representing the menu bar +* that fired the event. +*/ +_onClick: function(p_sType, p_aArgs, p_oMenuBar) { + + YAHOO.widget.MenuBar.superclass._onClick.call( + this, + p_sType, + p_aArgs, + p_oMenuBar + ); + + + var oItem = p_aArgs[1]; + + if(oItem && !oItem.cfg.getProperty("disabled")) { + + var Event = YAHOO.util.Event, + Dom = YAHOO.util.Dom, + + oEvent = p_aArgs[0], + oTarget = Event.getTarget(oEvent), + + oActiveItem = this.activeItem, + oConfig = this.cfg; + + + // Hide any other submenus that might be visible + + if(oActiveItem && oActiveItem != oItem) { + + this.clearActiveItem(); + + } + + + // Select and focus the current item + + oItem.cfg.setProperty("selected", true); + oItem.focus(); + + + // Show the submenu for the item + + var oSubmenu = oItem.cfg.getProperty("submenu"); + + + if(oSubmenu && oTarget != oItem.submenuIndicator) { + + if(oSubmenu.cfg.getProperty("visible")) { + + oSubmenu.hide(); + + } + else { + + oSubmenu.show(); + + } + + } + + } + +}, + + + +// Public methods + + +/** +* @method toString +* @description Returns a string representing the menu bar. +* @return {String} +*/ +toString: function() { + + return ("MenuBar " + this.id); + +}, + + +/** +* @description Initializes the class's configurable properties which can be +* changed using the menu bar's Config object ("cfg"). +* @method initDefaultConfig +*/ +initDefaultConfig: function() { + + YAHOO.widget.MenuBar.superclass.initDefaultConfig.call(this); + + var oConfig = this.cfg; + + // Add configuration properties + + + /* + Set the default value for the "position" configuration property + to "static" by re-adding the property. + */ + + /** + * @config position + * @description String indicating how a menu bar should be positioned on the + * screen. Possible values are "static" and "dynamic." Static menu bars + * are visible by default and reside in the normal flow of the document + * (CSS position: static). Dynamic menu bars are hidden by default, reside + * out of the normal flow of the document (CSS position: absolute), and can + * overlay other elements on the screen. + * @default static + * @type String + */ + oConfig.addProperty( + "position", + { + value: "static", + handler: this.configPosition, + validator: this._checkPosition, + supercedes: ["visible"] + } + ); + + + /* + Set the default value for the "submenualignment" configuration property + to ["tl","bl"] by re-adding the property. + */ + + /** + * @config submenualignment + * @description Array defining how submenus should be aligned to their + * parent menu bar item. The format is: [itemCorner, submenuCorner]. + * @default ["tl","bl"] + * @type Array + */ + oConfig.addProperty("submenualignment", { value: ["tl","bl"] } ); + + + /* + Change the default value for the "autosubmenudisplay" configuration + property to "false" by re-adding the property. + */ + + /** + * @config autosubmenudisplay + * @description Boolean indicating if submenus are automatically made + * visible when the user mouses over the menu bar's items. + * @default false + * @type Boolean + */ + oConfig.addProperty( + "autosubmenudisplay", + { value: false, validator: oConfig.checkBoolean } + ); + +} + +}); // END YAHOO.lang.extend + + + +/** +* Creates an item for a menu bar. +* +* @param {String} p_oObject String specifying the text of the menu bar item. +* @param {HTMLLIElement} p_oObject Object specifying the +* <li> element of the menu bar item. +* @param {HTMLOptGroupElement} p_oObject Object +* specifying the <optgroup> element of the menu bar item. +* @param {HTMLOptionElement} p_oObject Object specifying +* the <option> element of the menu bar item. +* @param {Object} p_oConfig Optional. Object literal specifying the +* configuration for the menu bar item. See configuration class documentation +* for more details. +* @class MenuBarItem +* @constructor +* @extends YAHOO.widget.MenuItem +*/ +YAHOO.widget.MenuBarItem = function(p_oObject, p_oConfig) { + + YAHOO.widget.MenuBarItem.superclass.constructor.call( + this, + p_oObject, + p_oConfig + ); + +}; + +YAHOO.lang.extend(YAHOO.widget.MenuBarItem, YAHOO.widget.MenuItem, { + + +/** +* @method init +* @description The MenuBarItem class's initialization method. This method is +* automatically called by the constructor, and sets up all DOM references for +* pre-existing markup, and creates required markup if it is not already present. +* @param {String} p_oObject String specifying the text of the menu bar item. +* @param {HTMLLIElement} p_oObject Object specifying the +* <li> element of the menu bar item. +* @param {HTMLOptGroupElement} p_oObject Object +* specifying the <optgroup> element of the menu bar item. +* @param {HTMLOptionElement} p_oObject Object specifying +* the <option> element of the menu bar item. +* @param {Object} p_oConfig Optional. Object literal specifying the +* configuration for the menu bar item. See configuration class documentation +* for more details. +*/ +init: function(p_oObject, p_oConfig) { + + if(!this.SUBMENU_TYPE) { + + this.SUBMENU_TYPE = YAHOO.widget.Menu; + + } + + + /* + Call the init of the superclass (YAHOO.widget.MenuItem) + Note: We don't pass the user config in here yet + because we only want it executed once, at the lowest + subclass level. + */ + + YAHOO.widget.MenuBarItem.superclass.init.call(this, p_oObject); + + + var oConfig = this.cfg; + + if(p_oConfig) { + + oConfig.applyConfig(p_oConfig, true); + + } + + oConfig.fireQueue(); + +}, + + + +// Constants + +/** +* @property CSS_CLASS_NAME +* @description String representing the CSS class(es) to be applied to the +* <li> element of the menu bar item. +* @default "yuimenubaritem" +* @final +* @type String +*/ +CSS_CLASS_NAME: "yuimenubaritem", + + + +// Public methods + + +/** +* @method toString +* @description Returns a string representing the menu bar item. +* @return {String} +*/ +toString: function() { + + return ("MenuBarItem: " + this.cfg.getProperty("text")); + +} + +}); // END YAHOO.lang.extend +YAHOO.register("menu", YAHOO.widget.Menu, {version: "2.2.0", build: "127"}); diff --git a/interface/ispconfig/interface/js/yui/reset-fonts-grids/README b/interface/ispconfig/interface/js/yui/reset-fonts-grids/README new file mode 100644 index 0000000000000000000000000000000000000000..d0b211725a45021e0273c5777352ba30cbab9cdd --- /dev/null +++ b/interface/ispconfig/interface/js/yui/reset-fonts-grids/README @@ -0,0 +1,24 @@ +YUI Library - Reset+Fonts+Grids (RFG) - Release Notes + +*** NOTE *** + +This document is not updated with each release. Changes to +the reset-fonts-grids.css source are noted in the README +file for each component that comprises this aggregate: + +reset/README +fonts/README +grids/README + +************ + +Version 2.2.0 + + * No changes. + +Version 0.12.0 + + * Initial release. + + * This file is a convenience file containing an in-order + concatonation of Reset, Fonts, and Grids. \ No newline at end of file diff --git a/interface/ispconfig/interface/js/yui/reset-fonts-grids/reset-fonts-grids.css b/interface/ispconfig/interface/js/yui/reset-fonts-grids/reset-fonts-grids.css new file mode 100644 index 0000000000000000000000000000000000000000..43d99e7547d80041ceec08c6102d060929814977 --- /dev/null +++ b/interface/ispconfig/interface/js/yui/reset-fonts-grids/reset-fonts-grids.css @@ -0,0 +1,9 @@ +/* +Copyright (c) 2007, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.2.0 +*/ +/*reset.css*/body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,textarea,p,blockquote,th,td{margin:0;padding:0;}table{border-collapse:collapse;border-spacing:0;}fieldset,img{border:0;}address,caption,cite,code,dfn,em,strong,th,var{font-style:normal;font-weight:normal;}ol,ul {list-style:none;}caption,th {text-align:left;}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal;}q:before,q:after{content:'';}abbr,acronym {border:0;} +/*fonts.css*/body{font:13px arial,helvetica,clean,sans-serif;*font-size:small;*font:x-small;}table {font-size:inherit;font:100%;}select, input, textarea {font:99% arial,helvetica,clean,sans-serif;}pre, code {font:115% monospace;*font-size:100%;}body * {line-height:1.22em;} +/*grids.css*/body{text-align:center;}#ft{clear:both;}#doc,#doc2,#doc3,.yui-t1,.yui-t2,.yui-t3,.yui-t4,.yui-t5,.yui-t6,.yui-t7{margin:auto;text-align:left;width:57.69em;*width:56.3em;min-width:750px;}#doc2{width:73.074em;*width:71.313em;min-width:950px;}#doc3{margin:auto 10px;width:auto;}.yui-b{position:relative;}.yui-b{_position:static;}#yui-main .yui-b{position:static;}#yui-main{width:100%;}.yui-t1 #yui-main,.yui-t2 #yui-main,.yui-t3 #yui-main{float:right;margin-left:-25em;}.yui-t4 #yui-main,.yui-t5 #yui-main,.yui-t6 #yui-main{float:left;margin-right:-25em;}.yui-t1 .yui-b{float:left;width:12.3207em;*width:12.0106em;}.yui-t1 #yui-main .yui-b{margin-left:13.3207em;*margin-left:13.0106em;}.yui-t2 .yui-b{float:left;width:13.8456em;*width:13.512em;}.yui-t2 #yui-main .yui-b{margin-left:14.8456em;*margin-left:14.512em;}.yui-t3 .yui-b{float:left;width:23.0759em;*width:22.52em;}.yui-t3 #yui-main .yui-b{margin-left:24.0759em;*margin-left:23.52em;}.yui-t4 .yui-b{float:right;width:13.8456em;*width:13.512em;}.yui-t4 #yui-main .yui-b{margin-right:14.8456em;*margin-right:14.512em;}.yui-t5 .yui-b{float:right;width:18.4608em;*width:18.016em;}.yui-t5 #yui-main .yui-b{margin-right:19.4608em;*margin-right:19.016em;}.yui-t6 .yui-b{float:right;width:23.0759em;*width:22.52em;}.yui-t6 #yui-main .yui-b{margin-right:24.0759em;*margin-right:23.52em;}.yui-t7 #yui-main .yui-b{display:block;margin:0 0 1em 0;}#yui-main .yui-b{float:none;width:auto;}.yui-g .yui-u,.yui-g .yui-g,.yui-gc .yui-u,.yui-gc .yui-g .yui-u,.yui-ge .yui-u,.yui-gf .yui-u{float:right;display:inline;}.yui-g div.first,.yui-gc div.first,.yui-gc div.first div.first,.yui-gd div.first,.yui-ge div.first,.yui-gf div.first{float:left;}.yui-g .yui-u,.yui-g .yui-g{width:49.1%;}.yui-g .yui-g .yui-u,.yui-gc .yui-g .yui-u{width:48.1%;}.yui-gb .yui-u,.yui-gc .yui-u,.yui-gd .yui-u{float:left;margin-left:2%;*margin-left:1.895%;width:32%;}.yui-gb div.first,.yui-gc div.first,.yui-gd div.first{margin-left:0;}.yui-gc div.first,.yui-gd .yui-u{width:66%;}.yui-gd div.first{width:32%;}.yui-ge .yui-u{width:24%;}.yui-ge div.first,.yui-gf .yui-u{width:74.2%;}.yui-gf div.first{width:24%;}.yui-ge div.first{width:74.2%;}#bd:after,.yui-g:after,.yui-gb:after,.yui-gc:after,.yui-gd:after,.yui-ge:after,.yui-gf:after{content:".";display:block;height:0;clear:both;visibility:hidden;}#bd,.yui-g,.yui-gb,.yui-gc,.yui-gd,.yui-ge,.yui-gf{zoom:1;} \ No newline at end of file diff --git a/interface/ispconfig/interface/js/yui/reset/README b/interface/ispconfig/interface/js/yui/reset/README new file mode 100644 index 0000000000000000000000000000000000000000..e25df68269f15a87d579c3bddc8947beddfdf72c --- /dev/null +++ b/interface/ispconfig/interface/js/yui/reset/README @@ -0,0 +1,25 @@ +YUI Library - Reset - Release Notes + +Version 2.2.0 + + * No changes. + +Version 0.12.1 - 0.12.2 + + * No changes. + +Version 0.12.0 + + * Added: h1,h2,h3,h4,h5,h6{font-weight:normal;} + + * Added: abbr,acronym {border:0;} + + * Added: textarea {padding:0;margin:0;} + +Version 0.11.0 + + * No changes. + +Version 0.10.0 + + * Initial release. \ No newline at end of file diff --git a/interface/ispconfig/interface/js/yui/reset/reset-min.css b/interface/ispconfig/interface/js/yui/reset/reset-min.css new file mode 100644 index 0000000000000000000000000000000000000000..5ca0723fca25bcdf4c44f1cef3da6a7ba96cbafc --- /dev/null +++ b/interface/ispconfig/interface/js/yui/reset/reset-min.css @@ -0,0 +1,7 @@ +/* +Copyright (c) 2007, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.2.0 +*/ +body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,textarea,p,blockquote,th,td{margin:0;padding:0;}table{border-collapse:collapse;border-spacing:0;}fieldset,img{border:0;}address,caption,cite,code,dfn,em,strong,th,var{font-style:normal;font-weight:normal;}ol,ul {list-style:none;}caption,th {text-align:left;}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal;}q:before,q:after{content:'';}abbr,acronym {border:0;} \ No newline at end of file diff --git a/interface/ispconfig/interface/js/yui/reset/reset.css b/interface/ispconfig/interface/js/yui/reset/reset.css new file mode 100644 index 0000000000000000000000000000000000000000..e5c5357da20ab6ecde295215c8b82a033105b769 --- /dev/null +++ b/interface/ispconfig/interface/js/yui/reset/reset.css @@ -0,0 +1,15 @@ +/* +Copyright (c) 2007, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.2.0 +*/ +body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,textarea,p,blockquote,th,td{margin:0;padding:0;} +table{border-collapse:collapse;border-spacing:0;} +fieldset,img{border:0;} +address,caption,cite,code,dfn,em,strong,th,var{font-style:normal;font-weight:normal;} +ol,ul {list-style:none;} +caption,th {text-align:left;} +h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal;} +q:before,q:after{content:'';} +abbr,acronym {border:0;} \ No newline at end of file diff --git a/interface/ispconfig/interface/js/yui/slider/README b/interface/ispconfig/interface/js/yui/slider/README new file mode 100644 index 0000000000000000000000000000000000000000..e435635fa41e8b36a7641e05d4e87a2a83e7919f --- /dev/null +++ b/interface/ispconfig/interface/js/yui/slider/README @@ -0,0 +1,69 @@ +Slider - Release Notes + +2.2.0 + + * Added the missing "force" parameter to the signature for setRegionValue + + * deprecated the moveComplete flag + +0.12.2 + + * No change + +0.12.1 + + * Removed unneccessary getXY calls that were contribuing to slower performance + in FireFox when the slider was deeply nested in the DOM. + +0.12.0 + + * Added "slideStart", "slideEnd", and "change" custom events. The abstract + methods these will eventually replace still work. + + * The default animation duration is 0.2 seconds (reduced from 0.4 seconds), + and is configurable via the animationDuration property. + + * Keyboard navigation is now built in. The background needs a tabindex for + keyboard nav to work. Keyboard nav can be disabled by setting enableKeys + to false. The number of pixels the slider moves when the arrow keys + are pressed is controlled by keyIncrement, and defaults to 20. Note, + Safari support limited to background element types that support focus + in that browser. http://bugs.webkit.org/show_bug.cgi?id=7138 + + * Fixed broken doctype in examples/index.html + + * Catching an unhandled script exception in FF that could occur when + attempting to focus the slider background while a text field without + autocomplete="false" has focus + +0.11.3 + + * No change + +0.11.0 + + * When the thumb is clicked and dragged, the click position delta is properly + applied. + + * The slider background can be disabled by setting backgroundEnabled to false. + + * Added SliderThumb->clearTicks + + * Incorporated updated drag and drop performance improvements + +0.10.0 + + * Drag and drop's autoscroll feature is now turned off by default + in the slider. + + * The slider no longer sets its initial value upon initialization + + * RGB slider example fixed for IE7. + + * Updated to work with the onAvailable feature in Drag and Drop. + + * Updated the basic slider example page to make the control more + accessible to non-FF1.5 browsers. + + * Split the examples into separate pages + diff --git a/interface/ispconfig/interface/js/yui/slider/slider-debug.js b/interface/ispconfig/interface/js/yui/slider/slider-debug.js new file mode 100644 index 0000000000000000000000000000000000000000..815d514dc4bfdf954dc090812b90c170b5494e00 --- /dev/null +++ b/interface/ispconfig/interface/js/yui/slider/slider-debug.js @@ -0,0 +1,1259 @@ +/* +Copyright (c) 2007, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.2.0 +*/ +/** + * The Slider component is a UI control that enables the user to adjust + * values in a finite range along one or two axes. Typically, the Slider + * control is used in a web application as a rich, visual replacement + * for an input box that takes a number as input. The Slider control can + * also easily accommodate a second dimension, providing x,y output for + * a selection point chosen from a rectangular region. + * + * @module slider + * @title Slider Widget + * @namespace YAHOO.widget + * @requires yahoo,dom,dragdrop,event + * @optional animation + */ + +/** + * A DragDrop implementation that can be used as a background for a + * slider. It takes a reference to the thumb instance + * so it can delegate some of the events to it. The goal is to make the + * thumb jump to the location on the background when the background is + * clicked. + * + * @class Slider + * @extends YAHOO.util.DragDrop + * @uses YAHOO.util.EventProvider + * @constructor + * @param {String} id The id of the element linked to this instance + * @param {String} sGroup The group of related DragDrop items + * @param {SliderThumb} oThumb The thumb for this slider + * @param {String} sType The type of slider (horiz, vert, region) + */ +YAHOO.widget.Slider = function(sElementId, sGroup, oThumb, sType) { + if (sElementId) { + this.init(sElementId, sGroup, true); + this.initSlider(sType); + this.initThumb(oThumb); + } +}; + +/** + * Factory method for creating a horizontal slider + * @method YAHOO.widget.Slider.getHorizSlider + * @static + * @param {String} sBGElId the id of the slider's background element + * @param {String} sHandleElId the id of the thumb element + * @param {int} iLeft the number of pixels the element can move left + * @param {int} iRight the number of pixels the element can move right + * @param {int} iTickSize optional parameter for specifying that the element + * should move a certain number pixels at a time. + * @return {Slider} a horizontal slider control + */ +YAHOO.widget.Slider.getHorizSlider = + function (sBGElId, sHandleElId, iLeft, iRight, iTickSize) { + return new YAHOO.widget.Slider(sBGElId, sBGElId, + new YAHOO.widget.SliderThumb(sHandleElId, sBGElId, + iLeft, iRight, 0, 0, iTickSize), "horiz"); +}; + +/** + * Factory method for creating a vertical slider + * @method YAHOO.widget.Slider.getVertSlider + * @static + * @param {String} sBGElId the id of the slider's background element + * @param {String} sHandleElId the id of the thumb element + * @param {int} iUp the number of pixels the element can move up + * @param {int} iDown the number of pixels the element can move down + * @param {int} iTickSize optional parameter for specifying that the element + * should move a certain number pixels at a time. + * @return {Slider} a vertical slider control + */ +YAHOO.widget.Slider.getVertSlider = + function (sBGElId, sHandleElId, iUp, iDown, iTickSize) { + return new YAHOO.widget.Slider(sBGElId, sBGElId, + new YAHOO.widget.SliderThumb(sHandleElId, sBGElId, 0, 0, + iUp, iDown, iTickSize), "vert"); +}; + +/** + * Factory method for creating a slider region like the one in the color + * picker example + * @method YAHOO.widget.Slider.getSliderRegion + * @static + * @param {String} sBGElId the id of the slider's background element + * @param {String} sHandleElId the id of the thumb element + * @param {int} iLeft the number of pixels the element can move left + * @param {int} iRight the number of pixels the element can move right + * @param {int} iUp the number of pixels the element can move up + * @param {int} iDown the number of pixels the element can move down + * @param {int} iTickSize optional parameter for specifying that the element + * should move a certain number pixels at a time. + * @return {Slider} a slider region control + */ +YAHOO.widget.Slider.getSliderRegion = + function (sBGElId, sHandleElId, iLeft, iRight, iUp, iDown, iTickSize) { + return new YAHOO.widget.Slider(sBGElId, sBGElId, + new YAHOO.widget.SliderThumb(sHandleElId, sBGElId, iLeft, iRight, + iUp, iDown, iTickSize), "region"); +}; + +/** + * By default, animation is available if the animation library is detected. + * @property YAHOO.widget.Slider.ANIM_AVAIL + * @static + * @type boolean + */ +YAHOO.widget.Slider.ANIM_AVAIL = true; + +YAHOO.extend(YAHOO.widget.Slider, YAHOO.util.DragDrop, { + + /** + * Initializes the slider. Executed in the constructor + * @method initSlider + * @param {string} sType the type of slider (horiz, vert, region) + */ + initSlider: function(sType) { + + /** + * The type of the slider (horiz, vert, region) + * @property type + * @type string + */ + this.type = sType; + + //this.removeInvalidHandleType("A"); + + this.logger = new YAHOO.widget.LogWriter(this.toString()); + + /** + * Event the fires when the value of the control changes. If + * the control is animated the event will fire every point + * along the way. + * @event change + * @param {int} newOffset|x the new offset for normal sliders, or the new + * x offset for region sliders + * @param {int} y the number of pixels the thumb has moved on the y axis + * (region sliders only) + */ + this.createEvent("change", this); + + /** + * Event that fires at the beginning of a slider thumb move. + * @event slideStart + */ + this.createEvent("slideStart", this); + + /** + * Event that fires at the end of a slider thumb move + * @event slideEnd + */ + this.createEvent("slideEnd", this); + + /** + * Overrides the isTarget property in YAHOO.util.DragDrop + * @property isTarget + * @private + */ + this.isTarget = false; + + /** + * Flag that determines if the thumb will animate when moved + * @property animate + * @type boolean + */ + this.animate = YAHOO.widget.Slider.ANIM_AVAIL; + + /** + * Set to false to disable a background click thumb move + * @property backgroundEnabled + * @type boolean + */ + this.backgroundEnabled = true; + + /** + * Adjustment factor for tick animation, the more ticks, the + * faster the animation (by default) + * @property tickPause + * @type int + */ + this.tickPause = 40; + + /** + * Enables the arrow, home and end keys, defaults to true. + * @property enableKeys + * @type boolean + */ + this.enableKeys = true; + + /** + * Specifies the number of pixels the arrow keys will move the slider. + * Default is 25. + * @property keyIncrement + * @type int + */ + this.keyIncrement = 20; + + /** + * moveComplete is set to true when the slider has moved to its final + * destination. For animated slider, this value can be checked in + * the onChange handler to make it possible to execute logic only + * when the move is complete rather than at all points along the way. + * Deprecated because this flag is only useful when the background is + * clicked and the slider is animated. If the user drags the thumb, + * the flag is updated when the drag is over ... the final onDrag event + * fires before the mouseup the ends the drag, so the implementer will + * never see it. + * + * @property moveComplete + * @type Boolean + * @deprecated use the slideEnd event instead + */ + this.moveComplete = true; + + /** + * If animation is configured, specifies the length of the animation + * in seconds. + * @property animationDuration + * @type int + * @default 0.2 + */ + this.animationDuration = 0.2; + }, + + /** + * Initializes the slider's thumb. Executed in the constructor. + * @method initThumb + * @param {YAHOO.widget.SliderThumb} t the slider thumb + */ + initThumb: function(t) { + + var self = this; + + /** + * A YAHOO.widget.SliderThumb instance that we will use to + * reposition the thumb when the background is clicked + * @property thumb + * @type YAHOO.widget.SliderThumb + */ + this.thumb = t; + t.cacheBetweenDrags = true; + + // add handler for the handle onchange event + t.onChange = function() { + self.handleThumbChange(); + }; + + if (t._isHoriz && t.xTicks && t.xTicks.length) { + this.tickPause = Math.round(360 / t.xTicks.length); + } else if (t.yTicks && t.yTicks.length) { + this.tickPause = Math.round(360 / t.yTicks.length); + } + + this.logger.log("tickPause: " + this.tickPause); + + // delegate thumb methods + t.onMouseDown = function () { return self.focus(); }; + t.onMouseUp = function() { self.thumbMouseUp(); }; + t.onDrag = function() { self.fireEvents(true); }; + t.onAvailable = function() { return self.setStartSliderState(); }; + + }, + + /** + * Executed when the slider element is available + * @method onAvailable + */ + onAvailable: function() { + var Event = YAHOO.util.Event; + Event.on(this.id, "keydown", this.handleKeyDown, this, true); + Event.on(this.id, "keypress", this.handleKeyPress, this, true); + }, + + /** + * Executed when a keypress event happens with the control focused. + * Prevents the default behavior for navigation keys. The actual + * logic for moving the slider thumb in response to a key event + * happens in handleKeyDown. + * @param {Event} e the keypress event + */ + handleKeyPress: function(e) { + if (this.enableKeys) { + var Event = YAHOO.util.Event; + var kc = Event.getCharCode(e); + switch (kc) { + case 0x25: // left + case 0x26: // up + case 0x27: // right + case 0x28: // down + case 0x24: // home + case 0x23: // end + Event.preventDefault(e); + break; + default: + } + } + }, + + /** + * Executed when a keydown event happens with the control focused. + * Updates the slider value and display when the keypress is an + * arrow key, home, or end as long as enableKeys is set to true. + * @param {Event} e the keydown event + */ + handleKeyDown: function(e) { + if (this.enableKeys) { + var Event = YAHOO.util.Event; + + var kc = Event.getCharCode(e), t=this.thumb; + var h=this.getXValue(),v=this.getYValue(); + + var horiz = false; + var changeValue = true; + switch (kc) { + + // left + case 0x25: h -= this.keyIncrement; break; + + // up + case 0x26: v -= this.keyIncrement; break; + + // right + case 0x27: h += this.keyIncrement; break; + + // down + case 0x28: v += this.keyIncrement; break; + + // home + case 0x24: h = t.leftConstraint; + v = t.topConstraint; + break; + + // end + case 0x23: h = t.rightConstraint; + v = t.bottomConstraint; + break; + + default: changeValue = false; + } + + if (changeValue) { + if (t._isRegion) { + this.setRegionValue(h, v, true); + } else { + var newVal = (t._isHoriz) ? h : v; + this.setValue(newVal, true); + } + Event.stopEvent(e); + } + + } + }, + + /** + * Initialization that sets up the value offsets once the elements are ready + * @method setStartSliderState + */ + setStartSliderState: function() { + + this.logger.log("Fixing state"); + + this.setThumbCenterPoint(); + + /** + * The basline position of the background element, used + * to determine if the background has moved since the last + * operation. + * @property baselinePos + * @type [int, int] + */ + this.baselinePos = YAHOO.util.Dom.getXY(this.getEl()); + + this.thumb.startOffset = this.thumb.getOffsetFromParent(this.baselinePos); + + if (this.thumb._isRegion) { + if (this.deferredSetRegionValue) { + this.setRegionValue.apply(this, this.deferredSetRegionValue, true); + this.deferredSetRegionValue = null; + } else { + this.setRegionValue(0, 0, true, true); + } + } else { + if (this.deferredSetValue) { + this.setValue.apply(this, this.deferredSetValue, true); + this.deferredSetValue = null; + } else { + this.setValue(0, true, true); + } + } + }, + + /** + * When the thumb is available, we cache the centerpoint of the element so + * we can position the element correctly when the background is clicked + * @method setThumbCenterPoint + */ + setThumbCenterPoint: function() { + + var el = this.thumb.getEl(); + + if (el) { + /** + * The center of the slider element is stored so we can + * place it in the correct position when the background is clicked. + * @property thumbCenterPoint + * @type {"x": int, "y": int} + */ + this.thumbCenterPoint = { + x: parseInt(el.offsetWidth/2, 10), + y: parseInt(el.offsetHeight/2, 10) + }; + } + + }, + + /** + * Locks the slider, overrides YAHOO.util.DragDrop + * @method lock + */ + lock: function() { + this.logger.log("locking"); + this.thumb.lock(); + this.locked = true; + }, + + /** + * Unlocks the slider, overrides YAHOO.util.DragDrop + * @method unlock + */ + unlock: function() { + this.logger.log("unlocking"); + this.thumb.unlock(); + this.locked = false; + }, + + /** + * Handles mouseup event on the slider background + * @method thumbMouseUp + * @private + */ + thumbMouseUp: function() { + this.logger.log("bg mouseup"); + if (!this.isLocked() && !this.moveComplete) { + this.endMove(); + } + + }, + + /** + * Returns a reference to this slider's thumb + * @method getThumb + * @return {SliderThumb} this slider's thumb + */ + getThumb: function() { + return this.thumb; + }, + + /** + * Try to focus the element when clicked so we can add + * accessibility features + * @method focus + * @private + */ + focus: function() { + this.logger.log("focus"); + + // Focus the background element if possible + var el = this.getEl(); + + if (el.focus) { + try { + el.focus(); + } catch(e) { + // Prevent permission denied unhandled exception in FF that can + // happen when setting focus while another element is handling + // the blur. @TODO this is still writing to the error log + // (unhandled error) in FF1.5 with strict error checking on. + } + } + + this.verifyOffset(); + + if (this.isLocked()) { + return false; + } else { + this.onSlideStart(); + return true; + } + }, + + /** + * Event that fires when the value of the slider has changed + * @method onChange + * @param {int} firstOffset the number of pixels the thumb has moved + * from its start position. Normal horizontal and vertical sliders will only + * have the firstOffset. Regions will have both, the first is the horizontal + * offset, the second the vertical. + * @param {int} secondOffset the y offset for region sliders + * @deprecated use instance.subscribe("change") instead + */ + onChange: function (firstOffset, secondOffset) { + /* override me */ + this.logger.log("onChange: " + firstOffset + ", " + secondOffset); + }, + + /** + * Event that fires when the at the beginning of the slider thumb move + * @method onSlideStart + * @deprecated use instance.subscribe("slideStart") instead + */ + onSlideStart: function () { + /* override me */ + this.logger.log("onSlideStart"); + }, + + /** + * Event that fires at the end of a slider thumb move + * @method onSliderEnd + * @deprecated use instance.subscribe("slideEnd") instead + */ + onSlideEnd: function () { + /* override me */ + this.logger.log("onSlideEnd"); + }, + + /** + * Returns the slider's thumb offset from the start position + * @method getValue + * @return {int} the current value + */ + getValue: function () { + return this.thumb.getValue(); + }, + + /** + * Returns the slider's thumb X offset from the start position + * @method getXValue + * @return {int} the current horizontal offset + */ + getXValue: function () { + return this.thumb.getXValue(); + }, + + /** + * Returns the slider's thumb Y offset from the start position + * @method getYValue + * @return {int} the current vertical offset + */ + getYValue: function () { + return this.thumb.getYValue(); + }, + + /** + * Internal handler for the slider thumb's onChange event + * @method handleThumbChange + * @private + */ + handleThumbChange: function () { + var t = this.thumb; + if (t._isRegion) { + t.onChange(t.getXValue(), t.getYValue()); + this.fireEvent("change", { x: t.getXValue(), y: t.getYValue() } ); + } else { + t.onChange(t.getValue()); + this.fireEvent("change", t.getValue()); + } + + }, + + /** + * Provides a way to set the value of the slider in code. + * @method setValue + * @param {int} newOffset the number of pixels the thumb should be + * positioned away from the initial start point + * @param {boolean} skipAnim set to true to disable the animation + * for this move action (but not others). + * @param {boolean} force ignore the locked setting and set value anyway + * @return {boolean} true if the move was performed, false if it failed + */ + setValue: function(newOffset, skipAnim, force) { + this.logger.log("setValue " + newOffset); + + if (!this.thumb.available) { + this.logger.log("defer setValue until after onAvailble"); + this.deferredSetValue = arguments; + return false; + } + + if (this.isLocked() && !force) { + this.logger.log("Can't set the value, the control is locked"); + return false; + } + + if ( isNaN(newOffset) ) { + this.logger.log("setValue, Illegal argument: " + newOffset); + return false; + } + + var t = this.thumb; + var newX, newY; + this.verifyOffset(true); + if (t._isRegion) { + return false; + } else if (t._isHoriz) { + this.onSlideStart(); + // this.fireEvent("slideStart"); + newX = t.initPageX + newOffset + this.thumbCenterPoint.x; + this.moveThumb(newX, t.initPageY, skipAnim); + } else { + this.onSlideStart(); + // this.fireEvent("slideStart"); + newY = t.initPageY + newOffset + this.thumbCenterPoint.y; + this.moveThumb(t.initPageX, newY, skipAnim); + } + + return true; + }, + + /** + * Provides a way to set the value of the region slider in code. + * @method setRegionValue + * @param {int} newOffset the number of pixels the thumb should be + * positioned away from the initial start point (x axis for region) + * @param {int} newOffset2 the number of pixels the thumb should be + * positioned away from the initial start point (y axis for region) + * @param {boolean} skipAnim set to true to disable the animation + * for this move action (but not others). + * @param {boolean} force ignore the locked setting and set value anyway + * @return {boolean} true if the move was performed, false if it failed + */ + setRegionValue: function(newOffset, newOffset2, skipAnim, force) { + + if (!this.thumb.available) { + this.logger.log("defer setRegionValue until after onAvailble"); + this.deferredSetRegionValue = arguments; + return false; + } + + if (this.isLocked() && !force) { + this.logger.log("Can't set the value, the control is locked"); + return false; + } + + if ( isNaN(newOffset) ) { + this.logger.log("setRegionValue, Illegal argument: " + newOffset); + return false; + } + + var t = this.thumb; + if (t._isRegion) { + this.onSlideStart(); + var newX = t.initPageX + newOffset + this.thumbCenterPoint.x; + var newY = t.initPageY + newOffset2 + this.thumbCenterPoint.y; + this.moveThumb(newX, newY, skipAnim); + return true; + } + + return false; + + }, + + /** + * Checks the background position element position. If it has moved from the + * baseline position, the constraints for the thumb are reset + * @param checkPos {boolean} check the position instead of using cached value + * @method verifyOffset + * @return {boolean} True if the offset is the same as the baseline. + */ + verifyOffset: function(checkPos) { + + var newPos = YAHOO.util.Dom.getXY(this.getEl()); + //var newPos = [this.initPageX, this.initPageY]; + + this.logger.log("newPos: " + newPos, "warn"); + + if (newPos[0] != this.baselinePos[0] || newPos[1] != this.baselinePos[1]) { + this.logger.log("background moved, resetting constraints"); + this.thumb.resetConstraints(); + this.baselinePos = newPos; + return false; + } + + return true; + }, + + /** + * Move the associated slider moved to a timeout to try to get around the + * mousedown stealing moz does when I move the slider element between the + * cursor and the background during the mouseup event + * @method moveThumb + * @param {int} x the X coordinate of the click + * @param {int} y the Y coordinate of the click + * @param {boolean} skipAnim don't animate if the move happend onDrag + * @private + */ + moveThumb: function(x, y, skipAnim) { + + // this.logger.log("move thumb", "warn"); + + var t = this.thumb; + var self = this; + + if (!t.available) { + this.logger.log("thumb is not available yet, aborting move"); + return; + } + + this.logger.log("move thumb, x: " + x + ", y: " + y); + + // this.verifyOffset(); + + t.setDelta(this.thumbCenterPoint.x, this.thumbCenterPoint.y); + + var _p = t.getTargetCoord(x, y); + var p = [_p.x, _p.y]; + + + this.fireEvent("slideStart"); + + if (this.animate && YAHOO.widget.Slider.ANIM_AVAIL && t._graduated && !skipAnim) { + this.logger.log("graduated"); + // this.thumb._animating = true; + this.lock(); + + // cache the current thumb pos + this.curCoord = YAHOO.util.Dom.getXY(this.thumb.getEl()); + + setTimeout( function() { self.moveOneTick(p); }, this.tickPause ); + + } else if (this.animate && YAHOO.widget.Slider.ANIM_AVAIL && !skipAnim) { + this.logger.log("animating to " + p); + + // this.thumb._animating = true; + this.lock(); + + var oAnim = new YAHOO.util.Motion( + t.id, { points: { to: p } }, + this.animationDuration, + YAHOO.util.Easing.easeOut ); + + oAnim.onComplete.subscribe( function() { self.endMove(); } ); + oAnim.animate(); + } else { + t.setDragElPos(x, y); + // this.fireEvents(); + this.endMove(); + } + }, + + /** + * Move the slider one tick mark towards its final coordinate. Used + * for the animation when tick marks are defined + * @method moveOneTick + * @param {int[]} the destination coordinate + * @private + */ + moveOneTick: function(finalCoord) { + + var t = this.thumb, tmp; + + + // redundant call to getXY since we set the position most of time prior + // to getting here. Moved to this.curCoord + //var curCoord = YAHOO.util.Dom.getXY(t.getEl()); + + // alignElWithMouse caches position in lastPageX, lastPageY .. doesn't work + //var curCoord = [this.lastPageX, this.lastPageY]; + + // var thresh = Math.min(t.tickSize + (Math.floor(t.tickSize/2)), 10); + // var thresh = 10; + // var thresh = t.tickSize + (Math.floor(t.tickSize/2)); + + var nextCoord = null; + + if (t._isRegion) { + nextCoord = this._getNextX(this.curCoord, finalCoord); + var tmpX = (nextCoord) ? nextCoord[0] : this.curCoord[0]; + nextCoord = this._getNextY([tmpX, this.curCoord[1]], finalCoord); + + } else if (t._isHoriz) { + nextCoord = this._getNextX(this.curCoord, finalCoord); + } else { + nextCoord = this._getNextY(this.curCoord, finalCoord); + } + + this.logger.log("moveOneTick: " + + " finalCoord: " + finalCoord + + " this.curCoord: " + this.curCoord + + " nextCoord: " + nextCoord); + + if (nextCoord) { + + // cache the position + this.curCoord = nextCoord; + + // move to the next coord + // YAHOO.util.Dom.setXY(t.getEl(), nextCoord); + + // var el = t.getEl(); + // YAHOO.util.Dom.setStyle(el, "left", (nextCoord[0] + this.thumb.deltaSetXY[0]) + "px"); + // YAHOO.util.Dom.setStyle(el, "top", (nextCoord[1] + this.thumb.deltaSetXY[1]) + "px"); + + this.thumb.alignElWithMouse(t.getEl(), nextCoord[0], nextCoord[1]); + + // check if we are in the final position, if not make a recursive call + if (!(nextCoord[0] == finalCoord[0] && nextCoord[1] == finalCoord[1])) { + var self = this; + setTimeout(function() { self.moveOneTick(finalCoord); }, + this.tickPause); + } else { + this.endMove(); + } + } else { + this.endMove(); + } + + //this.tickPause = Math.round(this.tickPause/2); + }, + + /** + * Returns the next X tick value based on the current coord and the target coord. + * @method _getNextX + * @private + */ + _getNextX: function(curCoord, finalCoord) { + this.logger.log("getNextX: " + curCoord + ", " + finalCoord); + var t = this.thumb; + var thresh; + var tmp = []; + var nextCoord = null; + if (curCoord[0] > finalCoord[0]) { + thresh = t.tickSize - this.thumbCenterPoint.x; + tmp = t.getTargetCoord( curCoord[0] - thresh, curCoord[1] ); + nextCoord = [tmp.x, tmp.y]; + } else if (curCoord[0] < finalCoord[0]) { + thresh = t.tickSize + this.thumbCenterPoint.x; + tmp = t.getTargetCoord( curCoord[0] + thresh, curCoord[1] ); + nextCoord = [tmp.x, tmp.y]; + } else { + // equal, do nothing + } + + return nextCoord; + }, + + /** + * Returns the next Y tick value based on the current coord and the target coord. + * @method _getNextY + * @private + */ + _getNextY: function(curCoord, finalCoord) { + var t = this.thumb; + var thresh; + var tmp = []; + var nextCoord = null; + + if (curCoord[1] > finalCoord[1]) { + thresh = t.tickSize - this.thumbCenterPoint.y; + tmp = t.getTargetCoord( curCoord[0], curCoord[1] - thresh ); + nextCoord = [tmp.x, tmp.y]; + } else if (curCoord[1] < finalCoord[1]) { + thresh = t.tickSize + this.thumbCenterPoint.y; + tmp = t.getTargetCoord( curCoord[0], curCoord[1] + thresh ); + nextCoord = [tmp.x, tmp.y]; + } else { + // equal, do nothing + } + + return nextCoord; + }, + + /** + * Resets the constraints before moving the thumb. + * @method b4MouseDown + * @private + */ + b4MouseDown: function(e) { + this.thumb.autoOffset(); + this.thumb.resetConstraints(); + }, + + + /** + * Handles the mousedown event for the slider background + * @method onMouseDown + * @private + */ + onMouseDown: function(e) { + // this.resetConstraints(true); + // this.thumb.resetConstraints(true); + + if (! this.isLocked() && this.backgroundEnabled) { + var x = YAHOO.util.Event.getPageX(e); + var y = YAHOO.util.Event.getPageY(e); + this.logger.log("bg mousedown: " + x + "," + y); + + this.focus(); + this.moveThumb(x, y); + } + + }, + + /** + * Handles the onDrag event for the slider background + * @method onDrag + * @private + */ + onDrag: function(e) { + if (! this.isLocked()) { + var x = YAHOO.util.Event.getPageX(e); + var y = YAHOO.util.Event.getPageY(e); + this.moveThumb(x, y, true); + } + }, + + /** + * Fired when the slider movement ends + * @method endMove + * @private + */ + endMove: function () { + // this._animating = false; + this.unlock(); + this.moveComplete = true; + this.fireEvents(); + }, + + /** + * Fires the change event if the value has been changed. Ignored if we are in + * the middle of an animation as the event will fire when the animation is + * complete + * @method fireEvents + * @param {boolean} thumbEvent set to true if this event is fired from an event + * that occurred on the thumb. If it is, the state of the + * thumb dd object should be correct. Otherwise, the event + * originated on the background, so the thumb state needs to + * be refreshed before proceeding. + * @private + */ + fireEvents: function (thumbEvent) { + + var t = this.thumb; + // this.logger.log("FireEvents: " + t._isRegion); + + if (!thumbEvent) { + t.cachePosition(); + } + + if (! this.isLocked()) { + if (t._isRegion) { + this.logger.log("region"); + var newX = t.getXValue(); + var newY = t.getYValue(); + + if (newX != this.previousX || newY != this.previousY) { + // this.logger.log("Firing onchange"); + this.onChange(newX, newY); + this.fireEvent("change", { x: newX, y: newY }); + } + + this.previousX = newX; + this.previousY = newY; + + } else { + var newVal = t.getValue(); + if (newVal != this.previousVal) { + this.logger.log("Firing onchange: " + newVal); + this.onChange( newVal ); + this.fireEvent("change", newVal); + } + this.previousVal = newVal; + } + + if (this.moveComplete) { + this.onSlideEnd(); + this.fireEvent("slideEnd"); + this.moveComplete = false; + } + + } + }, + + /** + * Slider toString + * @method toString + * @return {string} string representation of the instance + */ + toString: function () { + return ("Slider (" + this.type +") " + this.id); + } + +}); + +YAHOO.augment(YAHOO.widget.Slider, YAHOO.util.EventProvider); + +/** + * A drag and drop implementation to be used as the thumb of a slider. + * @class SliderThumb + * @extends YAHOO.util.DD + * @constructor + * @param {String} id the id of the slider html element + * @param {String} sGroup the group of related DragDrop items + * @param {int} iLeft the number of pixels the element can move left + * @param {int} iRight the number of pixels the element can move right + * @param {int} iUp the number of pixels the element can move up + * @param {int} iDown the number of pixels the element can move down + * @param {int} iTickSize optional parameter for specifying that the element + * should move a certain number pixels at a time. + */ +YAHOO.widget.SliderThumb = function(id, sGroup, iLeft, iRight, iUp, iDown, iTickSize) { + + if (id) { + //this.init(id, sGroup); + YAHOO.widget.SliderThumb.superclass.constructor.call(this, id, sGroup); + + /** + * The id of the thumbs parent HTML element (the slider background + * element). + * @property parentElId + * @type string + */ + this.parentElId = sGroup; + } + + + //this.removeInvalidHandleType("A"); + + this.logger = new YAHOO.widget.LogWriter(this.toString()); + + /** + * Overrides the isTarget property in YAHOO.util.DragDrop + * @property isTarget + * @private + */ + this.isTarget = false; + + /** + * The tick size for this slider + * @property tickSize + * @type int + * @private + */ + this.tickSize = iTickSize; + + /** + * Informs the drag and drop util that the offsets should remain when + * resetting the constraints. This preserves the slider value when + * the constraints are reset + * @property maintainOffset + * @type boolean + * @private + */ + this.maintainOffset = true; + + this.initSlider(iLeft, iRight, iUp, iDown, iTickSize); + + /** + * Turns off the autoscroll feature in drag and drop + * @property scroll + * @private + */ + this.scroll = false; + +}; + +YAHOO.extend(YAHOO.widget.SliderThumb, YAHOO.util.DD, { + + /** + * The (X and Y) difference between the thumb location and its parent + * (the slider background) when the control is instantiated. + * @property startOffset + * @type [int, int] + */ + startOffset: null, + + /** + * Flag used to figure out if this is a horizontal or vertical slider + * @property _isHoriz + * @type boolean + * @private + */ + _isHoriz: false, + + /** + * Cache the last value so we can check for change + * @property _prevVal + * @type int + * @private + */ + _prevVal: 0, + + /** + * The slider is _graduated if there is a tick interval defined + * @property _graduated + * @type boolean + * @private + */ + _graduated: false, + + + /** + * Returns the difference between the location of the thumb and its parent. + * @method getOffsetFromParent + * @param {[int, int]} parentPos Optionally accepts the position of the parent + * @type [int, int] + */ + getOffsetFromParent0: function(parentPos) { + var myPos = YAHOO.util.Dom.getXY(this.getEl()); + var ppos = parentPos || YAHOO.util.Dom.getXY(this.parentElId); + + return [ (myPos[0] - ppos[0]), (myPos[1] - ppos[1]) ]; + }, + + getOffsetFromParent: function(parentPos) { + + var el = this.getEl(); + + if (!this.deltaOffset) { + + var myPos = YAHOO.util.Dom.getXY(el); + var ppos = parentPos || YAHOO.util.Dom.getXY(this.parentElId); + + var newOffset = [ (myPos[0] - ppos[0]), (myPos[1] - ppos[1]) ]; + + var l = parseInt( YAHOO.util.Dom.getStyle(el, "left"), 10 ); + var t = parseInt( YAHOO.util.Dom.getStyle(el, "top" ), 10 ); + + var deltaX = l - newOffset[0]; + var deltaY = t - newOffset[1]; + + if (isNaN(deltaX) || isNaN(deltaY)) { + this.logger.log("element does not have a position style def yet"); + } else { + this.deltaOffset = [deltaX, deltaY]; + } + + } else { + var newLeft = parseInt( YAHOO.util.Dom.getStyle(el, "left"), 10 ); + var newTop = parseInt( YAHOO.util.Dom.getStyle(el, "top" ), 10 ); + + newOffset = [newLeft + this.deltaOffset[0], newTop + this.deltaOffset[1]]; + } + + return newOffset; + + //return [ (myPos[0] - ppos[0]), (myPos[1] - ppos[1]) ]; + }, + + /** + * Set up the slider, must be called in the constructor of all subclasses + * @method initSlider + * @param {int} iLeft the number of pixels the element can move left + * @param {int} iRight the number of pixels the element can move right + * @param {int} iUp the number of pixels the element can move up + * @param {int} iDown the number of pixels the element can move down + * @param {int} iTickSize the width of the tick interval. + */ + initSlider: function (iLeft, iRight, iUp, iDown, iTickSize) { + + + //document these. new for 0.12.1 + this.initLeft = iLeft; + this.initRight = iRight; + this.initUp = iUp; + this.initDown = iDown; + + this.setXConstraint(iLeft, iRight, iTickSize); + this.setYConstraint(iUp, iDown, iTickSize); + + if (iTickSize && iTickSize > 1) { + this._graduated = true; + } + + this._isHoriz = (iLeft || iRight); + this._isVert = (iUp || iDown); + this._isRegion = (this._isHoriz && this._isVert); + + }, + + /** + * Clear's the slider's ticks + * @method clearTicks + */ + clearTicks: function () { + YAHOO.widget.SliderThumb.superclass.clearTicks.call(this); + this.tickSize = 0; + this._graduated = false; + }, + + + /** + * Gets the current offset from the element's start position in + * pixels. + * @method getValue + * @return {int} the number of pixels (positive or negative) the + * slider has moved from the start position. + */ + getValue: function () { + if (!this.available) { return 0; } + var val = (this._isHoriz) ? this.getXValue() : this.getYValue(); + //this.logger.log("getVal: " + val); + return val; + }, + + /** + * Gets the current X offset from the element's start position in + * pixels. + * @method getXValue + * @return {int} the number of pixels (positive or negative) the + * slider has moved horizontally from the start position. + */ + getXValue: function () { + if (!this.available) { return 0; } + var newOffset = this.getOffsetFromParent(); + return (newOffset[0] - this.startOffset[0]); + }, + + /** + * Gets the current Y offset from the element's start position in + * pixels. + * @method getYValue + * @return {int} the number of pixels (positive or negative) the + * slider has moved vertically from the start position. + */ + getYValue: function () { + if (!this.available) { return 0; } + var newOffset = this.getOffsetFromParent(); + return (newOffset[1] - this.startOffset[1]); + }, + + /** + * Thumb toString + * @method toString + * @return {string} string representation of the instance + */ + toString: function () { + return "SliderThumb " + this.id; + }, + + /** + * The onchange event for the handle/thumb is delegated to the YAHOO.widget.Slider + * instance it belongs to. + * @method onChange + * @private + */ + onChange: function (x, y) { + } + +}); + +if ("undefined" == typeof YAHOO.util.Anim) { + YAHOO.widget.Slider.ANIM_AVAIL = false; +} + +YAHOO.register("slider", YAHOO.widget.Slider, {version: "2.2.0", build: "127"}); diff --git a/interface/ispconfig/interface/js/yui/slider/slider-min.js b/interface/ispconfig/interface/js/yui/slider/slider-min.js new file mode 100644 index 0000000000000000000000000000000000000000..84eeb0f28c1b497de1e7d3ba7d3c20e3e60e1f8a --- /dev/null +++ b/interface/ispconfig/interface/js/yui/slider/slider-min.js @@ -0,0 +1,36 @@ +/* +Copyright (c) 2007, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.2.0 +*/ + +YAHOO.widget.Slider=function(sElementId,sGroup,oThumb,sType){if(sElementId){this.init(sElementId,sGroup,true);this.initSlider(sType);this.initThumb(oThumb);}};YAHOO.widget.Slider.getHorizSlider=function(sBGElId,sHandleElId,iLeft,iRight,iTickSize){return new YAHOO.widget.Slider(sBGElId,sBGElId,new YAHOO.widget.SliderThumb(sHandleElId,sBGElId,iLeft,iRight,0,0,iTickSize),"horiz");};YAHOO.widget.Slider.getVertSlider=function(sBGElId,sHandleElId,iUp,iDown,iTickSize){return new YAHOO.widget.Slider(sBGElId,sBGElId,new YAHOO.widget.SliderThumb(sHandleElId,sBGElId,0,0,iUp,iDown,iTickSize),"vert");};YAHOO.widget.Slider.getSliderRegion=function(sBGElId,sHandleElId,iLeft,iRight,iUp,iDown,iTickSize){return new YAHOO.widget.Slider(sBGElId,sBGElId,new YAHOO.widget.SliderThumb(sHandleElId,sBGElId,iLeft,iRight,iUp,iDown,iTickSize),"region");};YAHOO.widget.Slider.ANIM_AVAIL=true;YAHOO.extend(YAHOO.widget.Slider,YAHOO.util.DragDrop,{initSlider:function(sType){this.type=sType;this.createEvent("change",this);this.createEvent("slideStart",this);this.createEvent("slideEnd",this);this.isTarget=false;this.animate=YAHOO.widget.Slider.ANIM_AVAIL;this.backgroundEnabled=true;this.tickPause=40;this.enableKeys=true;this.keyIncrement=20;this.moveComplete=true;this.animationDuration=0.2;},initThumb:function(t){var self=this;this.thumb=t;t.cacheBetweenDrags=true;t.onChange=function(){self.handleThumbChange();};if(t._isHoriz&&t.xTicks&&t.xTicks.length){this.tickPause=Math.round(360/t.xTicks.length);}else if(t.yTicks&&t.yTicks.length){this.tickPause=Math.round(360/t.yTicks.length);} +t.onMouseDown=function(){return self.focus();};t.onMouseUp=function(){self.thumbMouseUp();};t.onDrag=function(){self.fireEvents(true);};t.onAvailable=function(){return self.setStartSliderState();};},onAvailable:function(){var Event=YAHOO.util.Event;Event.on(this.id,"keydown",this.handleKeyDown,this,true);Event.on(this.id,"keypress",this.handleKeyPress,this,true);},handleKeyPress:function(e){if(this.enableKeys){var Event=YAHOO.util.Event;var kc=Event.getCharCode(e);switch(kc){case 0x25:case 0x26:case 0x27:case 0x28:case 0x24:case 0x23:Event.preventDefault(e);break;default:}}},handleKeyDown:function(e){if(this.enableKeys){var Event=YAHOO.util.Event;var kc=Event.getCharCode(e),t=this.thumb;var h=this.getXValue(),v=this.getYValue();var horiz=false;var changeValue=true;switch(kc){case 0x25:h-=this.keyIncrement;break;case 0x26:v-=this.keyIncrement;break;case 0x27:h+=this.keyIncrement;break;case 0x28:v+=this.keyIncrement;break;case 0x24:h=t.leftConstraint;v=t.topConstraint;break;case 0x23:h=t.rightConstraint;v=t.bottomConstraint;break;default:changeValue=false;} +if(changeValue){if(t._isRegion){this.setRegionValue(h,v,true);}else{var newVal=(t._isHoriz)?h:v;this.setValue(newVal,true);} +Event.stopEvent(e);}}},setStartSliderState:function(){this.setThumbCenterPoint();this.baselinePos=YAHOO.util.Dom.getXY(this.getEl());this.thumb.startOffset=this.thumb.getOffsetFromParent(this.baselinePos);if(this.thumb._isRegion){if(this.deferredSetRegionValue){this.setRegionValue.apply(this,this.deferredSetRegionValue,true);this.deferredSetRegionValue=null;}else{this.setRegionValue(0,0,true,true);}}else{if(this.deferredSetValue){this.setValue.apply(this,this.deferredSetValue,true);this.deferredSetValue=null;}else{this.setValue(0,true,true);}}},setThumbCenterPoint:function(){var el=this.thumb.getEl();if(el){this.thumbCenterPoint={x:parseInt(el.offsetWidth/2,10),y:parseInt(el.offsetHeight/2,10)};}},lock:function(){this.thumb.lock();this.locked=true;},unlock:function(){this.thumb.unlock();this.locked=false;},thumbMouseUp:function(){if(!this.isLocked()&&!this.moveComplete){this.endMove();}},getThumb:function(){return this.thumb;},focus:function(){var el=this.getEl();if(el.focus){try{el.focus();}catch(e){}} +this.verifyOffset();if(this.isLocked()){return false;}else{this.onSlideStart();return true;}},onChange:function(firstOffset,secondOffset){},onSlideStart:function(){},onSlideEnd:function(){},getValue:function(){return this.thumb.getValue();},getXValue:function(){return this.thumb.getXValue();},getYValue:function(){return this.thumb.getYValue();},handleThumbChange:function(){var t=this.thumb;if(t._isRegion){t.onChange(t.getXValue(),t.getYValue());this.fireEvent("change",{x:t.getXValue(),y:t.getYValue()});}else{t.onChange(t.getValue());this.fireEvent("change",t.getValue());}},setValue:function(newOffset,skipAnim,force){if(!this.thumb.available){this.deferredSetValue=arguments;return false;} +if(this.isLocked()&&!force){return false;} +if(isNaN(newOffset)){return false;} +var t=this.thumb;var newX,newY;this.verifyOffset(true);if(t._isRegion){return false;}else if(t._isHoriz){this.onSlideStart();newX=t.initPageX+newOffset+this.thumbCenterPoint.x;this.moveThumb(newX,t.initPageY,skipAnim);}else{this.onSlideStart();newY=t.initPageY+newOffset+this.thumbCenterPoint.y;this.moveThumb(t.initPageX,newY,skipAnim);} +return true;},setRegionValue:function(newOffset,newOffset2,skipAnim,force){if(!this.thumb.available){this.deferredSetRegionValue=arguments;return false;} +if(this.isLocked()&&!force){return false;} +if(isNaN(newOffset)){return false;} +var t=this.thumb;if(t._isRegion){this.onSlideStart();var newX=t.initPageX+newOffset+this.thumbCenterPoint.x;var newY=t.initPageY+newOffset2+this.thumbCenterPoint.y;this.moveThumb(newX,newY,skipAnim);return true;} +return false;},verifyOffset:function(checkPos){var newPos=YAHOO.util.Dom.getXY(this.getEl());if(newPos[0]!=this.baselinePos[0]||newPos[1]!=this.baselinePos[1]){this.thumb.resetConstraints();this.baselinePos=newPos;return false;} +return true;},moveThumb:function(x,y,skipAnim){var t=this.thumb;var self=this;if(!t.available){return;} +t.setDelta(this.thumbCenterPoint.x,this.thumbCenterPoint.y);var _p=t.getTargetCoord(x,y);var p=[_p.x,_p.y];this.fireEvent("slideStart");if(this.animate&&YAHOO.widget.Slider.ANIM_AVAIL&&t._graduated&&!skipAnim){this.lock();this.curCoord=YAHOO.util.Dom.getXY(this.thumb.getEl());setTimeout(function(){self.moveOneTick(p);},this.tickPause);}else if(this.animate&&YAHOO.widget.Slider.ANIM_AVAIL&&!skipAnim){this.lock();var oAnim=new YAHOO.util.Motion(t.id,{points:{to:p}},this.animationDuration,YAHOO.util.Easing.easeOut);oAnim.onComplete.subscribe(function(){self.endMove();});oAnim.animate();}else{t.setDragElPos(x,y);this.endMove();}},moveOneTick:function(finalCoord){var t=this.thumb,tmp;var nextCoord=null;if(t._isRegion){nextCoord=this._getNextX(this.curCoord,finalCoord);var tmpX=(nextCoord)?nextCoord[0]:this.curCoord[0];nextCoord=this._getNextY([tmpX,this.curCoord[1]],finalCoord);}else if(t._isHoriz){nextCoord=this._getNextX(this.curCoord,finalCoord);}else{nextCoord=this._getNextY(this.curCoord,finalCoord);} +if(nextCoord){this.curCoord=nextCoord;this.thumb.alignElWithMouse(t.getEl(),nextCoord[0],nextCoord[1]);if(!(nextCoord[0]==finalCoord[0]&&nextCoord[1]==finalCoord[1])){var self=this;setTimeout(function(){self.moveOneTick(finalCoord);},this.tickPause);}else{this.endMove();}}else{this.endMove();}},_getNextX:function(curCoord,finalCoord){var t=this.thumb;var thresh;var tmp=[];var nextCoord=null;if(curCoord[0]>finalCoord[0]){thresh=t.tickSize-this.thumbCenterPoint.x;tmp=t.getTargetCoord(curCoord[0]-thresh,curCoord[1]);nextCoord=[tmp.x,tmp.y];}else if(curCoord[0]finalCoord[1]){thresh=t.tickSize-this.thumbCenterPoint.y;tmp=t.getTargetCoord(curCoord[0],curCoord[1]-thresh);nextCoord=[tmp.x,tmp.y];}else if(curCoord[1]1){this._graduated=true;} +this._isHoriz=(iLeft||iRight);this._isVert=(iUp||iDown);this._isRegion=(this._isHoriz&&this._isVert);},clearTicks:function(){YAHOO.widget.SliderThumb.superclass.clearTicks.call(this);this.tickSize=0;this._graduated=false;},getValue:function(){if(!this.available){return 0;} +var val=(this._isHoriz)?this.getXValue():this.getYValue();return val;},getXValue:function(){if(!this.available){return 0;} +var newOffset=this.getOffsetFromParent();return(newOffset[0]-this.startOffset[0]);},getYValue:function(){if(!this.available){return 0;} +var newOffset=this.getOffsetFromParent();return(newOffset[1]-this.startOffset[1]);},toString:function(){return"SliderThumb "+this.id;},onChange:function(x,y){}});if("undefined"==typeof YAHOO.util.Anim){YAHOO.widget.Slider.ANIM_AVAIL=false;} +YAHOO.register("slider",YAHOO.widget.Slider,{version:"2.2.0",build:"127"}); \ No newline at end of file diff --git a/interface/ispconfig/interface/js/yui/slider/slider.js b/interface/ispconfig/interface/js/yui/slider/slider.js new file mode 100644 index 0000000000000000000000000000000000000000..9497d2c0029279b4ad389a4b4d81a418a1c7e807 --- /dev/null +++ b/interface/ispconfig/interface/js/yui/slider/slider.js @@ -0,0 +1,1222 @@ +/* +Copyright (c) 2007, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.2.0 +*/ +/** + * The Slider component is a UI control that enables the user to adjust + * values in a finite range along one or two axes. Typically, the Slider + * control is used in a web application as a rich, visual replacement + * for an input box that takes a number as input. The Slider control can + * also easily accommodate a second dimension, providing x,y output for + * a selection point chosen from a rectangular region. + * + * @module slider + * @title Slider Widget + * @namespace YAHOO.widget + * @requires yahoo,dom,dragdrop,event + * @optional animation + */ + +/** + * A DragDrop implementation that can be used as a background for a + * slider. It takes a reference to the thumb instance + * so it can delegate some of the events to it. The goal is to make the + * thumb jump to the location on the background when the background is + * clicked. + * + * @class Slider + * @extends YAHOO.util.DragDrop + * @uses YAHOO.util.EventProvider + * @constructor + * @param {String} id The id of the element linked to this instance + * @param {String} sGroup The group of related DragDrop items + * @param {SliderThumb} oThumb The thumb for this slider + * @param {String} sType The type of slider (horiz, vert, region) + */ +YAHOO.widget.Slider = function(sElementId, sGroup, oThumb, sType) { + if (sElementId) { + this.init(sElementId, sGroup, true); + this.initSlider(sType); + this.initThumb(oThumb); + } +}; + +/** + * Factory method for creating a horizontal slider + * @method YAHOO.widget.Slider.getHorizSlider + * @static + * @param {String} sBGElId the id of the slider's background element + * @param {String} sHandleElId the id of the thumb element + * @param {int} iLeft the number of pixels the element can move left + * @param {int} iRight the number of pixels the element can move right + * @param {int} iTickSize optional parameter for specifying that the element + * should move a certain number pixels at a time. + * @return {Slider} a horizontal slider control + */ +YAHOO.widget.Slider.getHorizSlider = + function (sBGElId, sHandleElId, iLeft, iRight, iTickSize) { + return new YAHOO.widget.Slider(sBGElId, sBGElId, + new YAHOO.widget.SliderThumb(sHandleElId, sBGElId, + iLeft, iRight, 0, 0, iTickSize), "horiz"); +}; + +/** + * Factory method for creating a vertical slider + * @method YAHOO.widget.Slider.getVertSlider + * @static + * @param {String} sBGElId the id of the slider's background element + * @param {String} sHandleElId the id of the thumb element + * @param {int} iUp the number of pixels the element can move up + * @param {int} iDown the number of pixels the element can move down + * @param {int} iTickSize optional parameter for specifying that the element + * should move a certain number pixels at a time. + * @return {Slider} a vertical slider control + */ +YAHOO.widget.Slider.getVertSlider = + function (sBGElId, sHandleElId, iUp, iDown, iTickSize) { + return new YAHOO.widget.Slider(sBGElId, sBGElId, + new YAHOO.widget.SliderThumb(sHandleElId, sBGElId, 0, 0, + iUp, iDown, iTickSize), "vert"); +}; + +/** + * Factory method for creating a slider region like the one in the color + * picker example + * @method YAHOO.widget.Slider.getSliderRegion + * @static + * @param {String} sBGElId the id of the slider's background element + * @param {String} sHandleElId the id of the thumb element + * @param {int} iLeft the number of pixels the element can move left + * @param {int} iRight the number of pixels the element can move right + * @param {int} iUp the number of pixels the element can move up + * @param {int} iDown the number of pixels the element can move down + * @param {int} iTickSize optional parameter for specifying that the element + * should move a certain number pixels at a time. + * @return {Slider} a slider region control + */ +YAHOO.widget.Slider.getSliderRegion = + function (sBGElId, sHandleElId, iLeft, iRight, iUp, iDown, iTickSize) { + return new YAHOO.widget.Slider(sBGElId, sBGElId, + new YAHOO.widget.SliderThumb(sHandleElId, sBGElId, iLeft, iRight, + iUp, iDown, iTickSize), "region"); +}; + +/** + * By default, animation is available if the animation library is detected. + * @property YAHOO.widget.Slider.ANIM_AVAIL + * @static + * @type boolean + */ +YAHOO.widget.Slider.ANIM_AVAIL = true; + +YAHOO.extend(YAHOO.widget.Slider, YAHOO.util.DragDrop, { + + /** + * Initializes the slider. Executed in the constructor + * @method initSlider + * @param {string} sType the type of slider (horiz, vert, region) + */ + initSlider: function(sType) { + + /** + * The type of the slider (horiz, vert, region) + * @property type + * @type string + */ + this.type = sType; + + //this.removeInvalidHandleType("A"); + + + /** + * Event the fires when the value of the control changes. If + * the control is animated the event will fire every point + * along the way. + * @event change + * @param {int} newOffset|x the new offset for normal sliders, or the new + * x offset for region sliders + * @param {int} y the number of pixels the thumb has moved on the y axis + * (region sliders only) + */ + this.createEvent("change", this); + + /** + * Event that fires at the beginning of a slider thumb move. + * @event slideStart + */ + this.createEvent("slideStart", this); + + /** + * Event that fires at the end of a slider thumb move + * @event slideEnd + */ + this.createEvent("slideEnd", this); + + /** + * Overrides the isTarget property in YAHOO.util.DragDrop + * @property isTarget + * @private + */ + this.isTarget = false; + + /** + * Flag that determines if the thumb will animate when moved + * @property animate + * @type boolean + */ + this.animate = YAHOO.widget.Slider.ANIM_AVAIL; + + /** + * Set to false to disable a background click thumb move + * @property backgroundEnabled + * @type boolean + */ + this.backgroundEnabled = true; + + /** + * Adjustment factor for tick animation, the more ticks, the + * faster the animation (by default) + * @property tickPause + * @type int + */ + this.tickPause = 40; + + /** + * Enables the arrow, home and end keys, defaults to true. + * @property enableKeys + * @type boolean + */ + this.enableKeys = true; + + /** + * Specifies the number of pixels the arrow keys will move the slider. + * Default is 25. + * @property keyIncrement + * @type int + */ + this.keyIncrement = 20; + + /** + * moveComplete is set to true when the slider has moved to its final + * destination. For animated slider, this value can be checked in + * the onChange handler to make it possible to execute logic only + * when the move is complete rather than at all points along the way. + * Deprecated because this flag is only useful when the background is + * clicked and the slider is animated. If the user drags the thumb, + * the flag is updated when the drag is over ... the final onDrag event + * fires before the mouseup the ends the drag, so the implementer will + * never see it. + * + * @property moveComplete + * @type Boolean + * @deprecated use the slideEnd event instead + */ + this.moveComplete = true; + + /** + * If animation is configured, specifies the length of the animation + * in seconds. + * @property animationDuration + * @type int + * @default 0.2 + */ + this.animationDuration = 0.2; + }, + + /** + * Initializes the slider's thumb. Executed in the constructor. + * @method initThumb + * @param {YAHOO.widget.SliderThumb} t the slider thumb + */ + initThumb: function(t) { + + var self = this; + + /** + * A YAHOO.widget.SliderThumb instance that we will use to + * reposition the thumb when the background is clicked + * @property thumb + * @type YAHOO.widget.SliderThumb + */ + this.thumb = t; + t.cacheBetweenDrags = true; + + // add handler for the handle onchange event + t.onChange = function() { + self.handleThumbChange(); + }; + + if (t._isHoriz && t.xTicks && t.xTicks.length) { + this.tickPause = Math.round(360 / t.xTicks.length); + } else if (t.yTicks && t.yTicks.length) { + this.tickPause = Math.round(360 / t.yTicks.length); + } + + + // delegate thumb methods + t.onMouseDown = function () { return self.focus(); }; + t.onMouseUp = function() { self.thumbMouseUp(); }; + t.onDrag = function() { self.fireEvents(true); }; + t.onAvailable = function() { return self.setStartSliderState(); }; + + }, + + /** + * Executed when the slider element is available + * @method onAvailable + */ + onAvailable: function() { + var Event = YAHOO.util.Event; + Event.on(this.id, "keydown", this.handleKeyDown, this, true); + Event.on(this.id, "keypress", this.handleKeyPress, this, true); + }, + + /** + * Executed when a keypress event happens with the control focused. + * Prevents the default behavior for navigation keys. The actual + * logic for moving the slider thumb in response to a key event + * happens in handleKeyDown. + * @param {Event} e the keypress event + */ + handleKeyPress: function(e) { + if (this.enableKeys) { + var Event = YAHOO.util.Event; + var kc = Event.getCharCode(e); + switch (kc) { + case 0x25: // left + case 0x26: // up + case 0x27: // right + case 0x28: // down + case 0x24: // home + case 0x23: // end + Event.preventDefault(e); + break; + default: + } + } + }, + + /** + * Executed when a keydown event happens with the control focused. + * Updates the slider value and display when the keypress is an + * arrow key, home, or end as long as enableKeys is set to true. + * @param {Event} e the keydown event + */ + handleKeyDown: function(e) { + if (this.enableKeys) { + var Event = YAHOO.util.Event; + + var kc = Event.getCharCode(e), t=this.thumb; + var h=this.getXValue(),v=this.getYValue(); + + var horiz = false; + var changeValue = true; + switch (kc) { + + // left + case 0x25: h -= this.keyIncrement; break; + + // up + case 0x26: v -= this.keyIncrement; break; + + // right + case 0x27: h += this.keyIncrement; break; + + // down + case 0x28: v += this.keyIncrement; break; + + // home + case 0x24: h = t.leftConstraint; + v = t.topConstraint; + break; + + // end + case 0x23: h = t.rightConstraint; + v = t.bottomConstraint; + break; + + default: changeValue = false; + } + + if (changeValue) { + if (t._isRegion) { + this.setRegionValue(h, v, true); + } else { + var newVal = (t._isHoriz) ? h : v; + this.setValue(newVal, true); + } + Event.stopEvent(e); + } + + } + }, + + /** + * Initialization that sets up the value offsets once the elements are ready + * @method setStartSliderState + */ + setStartSliderState: function() { + + + this.setThumbCenterPoint(); + + /** + * The basline position of the background element, used + * to determine if the background has moved since the last + * operation. + * @property baselinePos + * @type [int, int] + */ + this.baselinePos = YAHOO.util.Dom.getXY(this.getEl()); + + this.thumb.startOffset = this.thumb.getOffsetFromParent(this.baselinePos); + + if (this.thumb._isRegion) { + if (this.deferredSetRegionValue) { + this.setRegionValue.apply(this, this.deferredSetRegionValue, true); + this.deferredSetRegionValue = null; + } else { + this.setRegionValue(0, 0, true, true); + } + } else { + if (this.deferredSetValue) { + this.setValue.apply(this, this.deferredSetValue, true); + this.deferredSetValue = null; + } else { + this.setValue(0, true, true); + } + } + }, + + /** + * When the thumb is available, we cache the centerpoint of the element so + * we can position the element correctly when the background is clicked + * @method setThumbCenterPoint + */ + setThumbCenterPoint: function() { + + var el = this.thumb.getEl(); + + if (el) { + /** + * The center of the slider element is stored so we can + * place it in the correct position when the background is clicked. + * @property thumbCenterPoint + * @type {"x": int, "y": int} + */ + this.thumbCenterPoint = { + x: parseInt(el.offsetWidth/2, 10), + y: parseInt(el.offsetHeight/2, 10) + }; + } + + }, + + /** + * Locks the slider, overrides YAHOO.util.DragDrop + * @method lock + */ + lock: function() { + this.thumb.lock(); + this.locked = true; + }, + + /** + * Unlocks the slider, overrides YAHOO.util.DragDrop + * @method unlock + */ + unlock: function() { + this.thumb.unlock(); + this.locked = false; + }, + + /** + * Handles mouseup event on the slider background + * @method thumbMouseUp + * @private + */ + thumbMouseUp: function() { + if (!this.isLocked() && !this.moveComplete) { + this.endMove(); + } + + }, + + /** + * Returns a reference to this slider's thumb + * @method getThumb + * @return {SliderThumb} this slider's thumb + */ + getThumb: function() { + return this.thumb; + }, + + /** + * Try to focus the element when clicked so we can add + * accessibility features + * @method focus + * @private + */ + focus: function() { + + // Focus the background element if possible + var el = this.getEl(); + + if (el.focus) { + try { + el.focus(); + } catch(e) { + // Prevent permission denied unhandled exception in FF that can + // happen when setting focus while another element is handling + // the blur. @TODO this is still writing to the error log + // (unhandled error) in FF1.5 with strict error checking on. + } + } + + this.verifyOffset(); + + if (this.isLocked()) { + return false; + } else { + this.onSlideStart(); + return true; + } + }, + + /** + * Event that fires when the value of the slider has changed + * @method onChange + * @param {int} firstOffset the number of pixels the thumb has moved + * from its start position. Normal horizontal and vertical sliders will only + * have the firstOffset. Regions will have both, the first is the horizontal + * offset, the second the vertical. + * @param {int} secondOffset the y offset for region sliders + * @deprecated use instance.subscribe("change") instead + */ + onChange: function (firstOffset, secondOffset) { + /* override me */ + }, + + /** + * Event that fires when the at the beginning of the slider thumb move + * @method onSlideStart + * @deprecated use instance.subscribe("slideStart") instead + */ + onSlideStart: function () { + /* override me */ + }, + + /** + * Event that fires at the end of a slider thumb move + * @method onSliderEnd + * @deprecated use instance.subscribe("slideEnd") instead + */ + onSlideEnd: function () { + /* override me */ + }, + + /** + * Returns the slider's thumb offset from the start position + * @method getValue + * @return {int} the current value + */ + getValue: function () { + return this.thumb.getValue(); + }, + + /** + * Returns the slider's thumb X offset from the start position + * @method getXValue + * @return {int} the current horizontal offset + */ + getXValue: function () { + return this.thumb.getXValue(); + }, + + /** + * Returns the slider's thumb Y offset from the start position + * @method getYValue + * @return {int} the current vertical offset + */ + getYValue: function () { + return this.thumb.getYValue(); + }, + + /** + * Internal handler for the slider thumb's onChange event + * @method handleThumbChange + * @private + */ + handleThumbChange: function () { + var t = this.thumb; + if (t._isRegion) { + t.onChange(t.getXValue(), t.getYValue()); + this.fireEvent("change", { x: t.getXValue(), y: t.getYValue() } ); + } else { + t.onChange(t.getValue()); + this.fireEvent("change", t.getValue()); + } + + }, + + /** + * Provides a way to set the value of the slider in code. + * @method setValue + * @param {int} newOffset the number of pixels the thumb should be + * positioned away from the initial start point + * @param {boolean} skipAnim set to true to disable the animation + * for this move action (but not others). + * @param {boolean} force ignore the locked setting and set value anyway + * @return {boolean} true if the move was performed, false if it failed + */ + setValue: function(newOffset, skipAnim, force) { + + if (!this.thumb.available) { + this.deferredSetValue = arguments; + return false; + } + + if (this.isLocked() && !force) { + return false; + } + + if ( isNaN(newOffset) ) { + return false; + } + + var t = this.thumb; + var newX, newY; + this.verifyOffset(true); + if (t._isRegion) { + return false; + } else if (t._isHoriz) { + this.onSlideStart(); + // this.fireEvent("slideStart"); + newX = t.initPageX + newOffset + this.thumbCenterPoint.x; + this.moveThumb(newX, t.initPageY, skipAnim); + } else { + this.onSlideStart(); + // this.fireEvent("slideStart"); + newY = t.initPageY + newOffset + this.thumbCenterPoint.y; + this.moveThumb(t.initPageX, newY, skipAnim); + } + + return true; + }, + + /** + * Provides a way to set the value of the region slider in code. + * @method setRegionValue + * @param {int} newOffset the number of pixels the thumb should be + * positioned away from the initial start point (x axis for region) + * @param {int} newOffset2 the number of pixels the thumb should be + * positioned away from the initial start point (y axis for region) + * @param {boolean} skipAnim set to true to disable the animation + * for this move action (but not others). + * @param {boolean} force ignore the locked setting and set value anyway + * @return {boolean} true if the move was performed, false if it failed + */ + setRegionValue: function(newOffset, newOffset2, skipAnim, force) { + + if (!this.thumb.available) { + this.deferredSetRegionValue = arguments; + return false; + } + + if (this.isLocked() && !force) { + return false; + } + + if ( isNaN(newOffset) ) { + return false; + } + + var t = this.thumb; + if (t._isRegion) { + this.onSlideStart(); + var newX = t.initPageX + newOffset + this.thumbCenterPoint.x; + var newY = t.initPageY + newOffset2 + this.thumbCenterPoint.y; + this.moveThumb(newX, newY, skipAnim); + return true; + } + + return false; + + }, + + /** + * Checks the background position element position. If it has moved from the + * baseline position, the constraints for the thumb are reset + * @param checkPos {boolean} check the position instead of using cached value + * @method verifyOffset + * @return {boolean} True if the offset is the same as the baseline. + */ + verifyOffset: function(checkPos) { + + var newPos = YAHOO.util.Dom.getXY(this.getEl()); + //var newPos = [this.initPageX, this.initPageY]; + + + if (newPos[0] != this.baselinePos[0] || newPos[1] != this.baselinePos[1]) { + this.thumb.resetConstraints(); + this.baselinePos = newPos; + return false; + } + + return true; + }, + + /** + * Move the associated slider moved to a timeout to try to get around the + * mousedown stealing moz does when I move the slider element between the + * cursor and the background during the mouseup event + * @method moveThumb + * @param {int} x the X coordinate of the click + * @param {int} y the Y coordinate of the click + * @param {boolean} skipAnim don't animate if the move happend onDrag + * @private + */ + moveThumb: function(x, y, skipAnim) { + + + var t = this.thumb; + var self = this; + + if (!t.available) { + return; + } + + + // this.verifyOffset(); + + t.setDelta(this.thumbCenterPoint.x, this.thumbCenterPoint.y); + + var _p = t.getTargetCoord(x, y); + var p = [_p.x, _p.y]; + + + this.fireEvent("slideStart"); + + if (this.animate && YAHOO.widget.Slider.ANIM_AVAIL && t._graduated && !skipAnim) { + // this.thumb._animating = true; + this.lock(); + + // cache the current thumb pos + this.curCoord = YAHOO.util.Dom.getXY(this.thumb.getEl()); + + setTimeout( function() { self.moveOneTick(p); }, this.tickPause ); + + } else if (this.animate && YAHOO.widget.Slider.ANIM_AVAIL && !skipAnim) { + + // this.thumb._animating = true; + this.lock(); + + var oAnim = new YAHOO.util.Motion( + t.id, { points: { to: p } }, + this.animationDuration, + YAHOO.util.Easing.easeOut ); + + oAnim.onComplete.subscribe( function() { self.endMove(); } ); + oAnim.animate(); + } else { + t.setDragElPos(x, y); + // this.fireEvents(); + this.endMove(); + } + }, + + /** + * Move the slider one tick mark towards its final coordinate. Used + * for the animation when tick marks are defined + * @method moveOneTick + * @param {int[]} the destination coordinate + * @private + */ + moveOneTick: function(finalCoord) { + + var t = this.thumb, tmp; + + + // redundant call to getXY since we set the position most of time prior + // to getting here. Moved to this.curCoord + //var curCoord = YAHOO.util.Dom.getXY(t.getEl()); + + // alignElWithMouse caches position in lastPageX, lastPageY .. doesn't work + //var curCoord = [this.lastPageX, this.lastPageY]; + + // var thresh = Math.min(t.tickSize + (Math.floor(t.tickSize/2)), 10); + // var thresh = 10; + // var thresh = t.tickSize + (Math.floor(t.tickSize/2)); + + var nextCoord = null; + + if (t._isRegion) { + nextCoord = this._getNextX(this.curCoord, finalCoord); + var tmpX = (nextCoord) ? nextCoord[0] : this.curCoord[0]; + nextCoord = this._getNextY([tmpX, this.curCoord[1]], finalCoord); + + } else if (t._isHoriz) { + nextCoord = this._getNextX(this.curCoord, finalCoord); + } else { + nextCoord = this._getNextY(this.curCoord, finalCoord); + } + + + if (nextCoord) { + + // cache the position + this.curCoord = nextCoord; + + // move to the next coord + // YAHOO.util.Dom.setXY(t.getEl(), nextCoord); + + // var el = t.getEl(); + // YAHOO.util.Dom.setStyle(el, "left", (nextCoord[0] + this.thumb.deltaSetXY[0]) + "px"); + // YAHOO.util.Dom.setStyle(el, "top", (nextCoord[1] + this.thumb.deltaSetXY[1]) + "px"); + + this.thumb.alignElWithMouse(t.getEl(), nextCoord[0], nextCoord[1]); + + // check if we are in the final position, if not make a recursive call + if (!(nextCoord[0] == finalCoord[0] && nextCoord[1] == finalCoord[1])) { + var self = this; + setTimeout(function() { self.moveOneTick(finalCoord); }, + this.tickPause); + } else { + this.endMove(); + } + } else { + this.endMove(); + } + + //this.tickPause = Math.round(this.tickPause/2); + }, + + /** + * Returns the next X tick value based on the current coord and the target coord. + * @method _getNextX + * @private + */ + _getNextX: function(curCoord, finalCoord) { + var t = this.thumb; + var thresh; + var tmp = []; + var nextCoord = null; + if (curCoord[0] > finalCoord[0]) { + thresh = t.tickSize - this.thumbCenterPoint.x; + tmp = t.getTargetCoord( curCoord[0] - thresh, curCoord[1] ); + nextCoord = [tmp.x, tmp.y]; + } else if (curCoord[0] < finalCoord[0]) { + thresh = t.tickSize + this.thumbCenterPoint.x; + tmp = t.getTargetCoord( curCoord[0] + thresh, curCoord[1] ); + nextCoord = [tmp.x, tmp.y]; + } else { + // equal, do nothing + } + + return nextCoord; + }, + + /** + * Returns the next Y tick value based on the current coord and the target coord. + * @method _getNextY + * @private + */ + _getNextY: function(curCoord, finalCoord) { + var t = this.thumb; + var thresh; + var tmp = []; + var nextCoord = null; + + if (curCoord[1] > finalCoord[1]) { + thresh = t.tickSize - this.thumbCenterPoint.y; + tmp = t.getTargetCoord( curCoord[0], curCoord[1] - thresh ); + nextCoord = [tmp.x, tmp.y]; + } else if (curCoord[1] < finalCoord[1]) { + thresh = t.tickSize + this.thumbCenterPoint.y; + tmp = t.getTargetCoord( curCoord[0], curCoord[1] + thresh ); + nextCoord = [tmp.x, tmp.y]; + } else { + // equal, do nothing + } + + return nextCoord; + }, + + /** + * Resets the constraints before moving the thumb. + * @method b4MouseDown + * @private + */ + b4MouseDown: function(e) { + this.thumb.autoOffset(); + this.thumb.resetConstraints(); + }, + + + /** + * Handles the mousedown event for the slider background + * @method onMouseDown + * @private + */ + onMouseDown: function(e) { + // this.resetConstraints(true); + // this.thumb.resetConstraints(true); + + if (! this.isLocked() && this.backgroundEnabled) { + var x = YAHOO.util.Event.getPageX(e); + var y = YAHOO.util.Event.getPageY(e); + + this.focus(); + this.moveThumb(x, y); + } + + }, + + /** + * Handles the onDrag event for the slider background + * @method onDrag + * @private + */ + onDrag: function(e) { + if (! this.isLocked()) { + var x = YAHOO.util.Event.getPageX(e); + var y = YAHOO.util.Event.getPageY(e); + this.moveThumb(x, y, true); + } + }, + + /** + * Fired when the slider movement ends + * @method endMove + * @private + */ + endMove: function () { + // this._animating = false; + this.unlock(); + this.moveComplete = true; + this.fireEvents(); + }, + + /** + * Fires the change event if the value has been changed. Ignored if we are in + * the middle of an animation as the event will fire when the animation is + * complete + * @method fireEvents + * @param {boolean} thumbEvent set to true if this event is fired from an event + * that occurred on the thumb. If it is, the state of the + * thumb dd object should be correct. Otherwise, the event + * originated on the background, so the thumb state needs to + * be refreshed before proceeding. + * @private + */ + fireEvents: function (thumbEvent) { + + var t = this.thumb; + + if (!thumbEvent) { + t.cachePosition(); + } + + if (! this.isLocked()) { + if (t._isRegion) { + var newX = t.getXValue(); + var newY = t.getYValue(); + + if (newX != this.previousX || newY != this.previousY) { + this.onChange(newX, newY); + this.fireEvent("change", { x: newX, y: newY }); + } + + this.previousX = newX; + this.previousY = newY; + + } else { + var newVal = t.getValue(); + if (newVal != this.previousVal) { + this.onChange( newVal ); + this.fireEvent("change", newVal); + } + this.previousVal = newVal; + } + + if (this.moveComplete) { + this.onSlideEnd(); + this.fireEvent("slideEnd"); + this.moveComplete = false; + } + + } + }, + + /** + * Slider toString + * @method toString + * @return {string} string representation of the instance + */ + toString: function () { + return ("Slider (" + this.type +") " + this.id); + } + +}); + +YAHOO.augment(YAHOO.widget.Slider, YAHOO.util.EventProvider); + +/** + * A drag and drop implementation to be used as the thumb of a slider. + * @class SliderThumb + * @extends YAHOO.util.DD + * @constructor + * @param {String} id the id of the slider html element + * @param {String} sGroup the group of related DragDrop items + * @param {int} iLeft the number of pixels the element can move left + * @param {int} iRight the number of pixels the element can move right + * @param {int} iUp the number of pixels the element can move up + * @param {int} iDown the number of pixels the element can move down + * @param {int} iTickSize optional parameter for specifying that the element + * should move a certain number pixels at a time. + */ +YAHOO.widget.SliderThumb = function(id, sGroup, iLeft, iRight, iUp, iDown, iTickSize) { + + if (id) { + //this.init(id, sGroup); + YAHOO.widget.SliderThumb.superclass.constructor.call(this, id, sGroup); + + /** + * The id of the thumbs parent HTML element (the slider background + * element). + * @property parentElId + * @type string + */ + this.parentElId = sGroup; + } + + + //this.removeInvalidHandleType("A"); + + + /** + * Overrides the isTarget property in YAHOO.util.DragDrop + * @property isTarget + * @private + */ + this.isTarget = false; + + /** + * The tick size for this slider + * @property tickSize + * @type int + * @private + */ + this.tickSize = iTickSize; + + /** + * Informs the drag and drop util that the offsets should remain when + * resetting the constraints. This preserves the slider value when + * the constraints are reset + * @property maintainOffset + * @type boolean + * @private + */ + this.maintainOffset = true; + + this.initSlider(iLeft, iRight, iUp, iDown, iTickSize); + + /** + * Turns off the autoscroll feature in drag and drop + * @property scroll + * @private + */ + this.scroll = false; + +}; + +YAHOO.extend(YAHOO.widget.SliderThumb, YAHOO.util.DD, { + + /** + * The (X and Y) difference between the thumb location and its parent + * (the slider background) when the control is instantiated. + * @property startOffset + * @type [int, int] + */ + startOffset: null, + + /** + * Flag used to figure out if this is a horizontal or vertical slider + * @property _isHoriz + * @type boolean + * @private + */ + _isHoriz: false, + + /** + * Cache the last value so we can check for change + * @property _prevVal + * @type int + * @private + */ + _prevVal: 0, + + /** + * The slider is _graduated if there is a tick interval defined + * @property _graduated + * @type boolean + * @private + */ + _graduated: false, + + + /** + * Returns the difference between the location of the thumb and its parent. + * @method getOffsetFromParent + * @param {[int, int]} parentPos Optionally accepts the position of the parent + * @type [int, int] + */ + getOffsetFromParent0: function(parentPos) { + var myPos = YAHOO.util.Dom.getXY(this.getEl()); + var ppos = parentPos || YAHOO.util.Dom.getXY(this.parentElId); + + return [ (myPos[0] - ppos[0]), (myPos[1] - ppos[1]) ]; + }, + + getOffsetFromParent: function(parentPos) { + + var el = this.getEl(); + + if (!this.deltaOffset) { + + var myPos = YAHOO.util.Dom.getXY(el); + var ppos = parentPos || YAHOO.util.Dom.getXY(this.parentElId); + + var newOffset = [ (myPos[0] - ppos[0]), (myPos[1] - ppos[1]) ]; + + var l = parseInt( YAHOO.util.Dom.getStyle(el, "left"), 10 ); + var t = parseInt( YAHOO.util.Dom.getStyle(el, "top" ), 10 ); + + var deltaX = l - newOffset[0]; + var deltaY = t - newOffset[1]; + + if (isNaN(deltaX) || isNaN(deltaY)) { + } else { + this.deltaOffset = [deltaX, deltaY]; + } + + } else { + var newLeft = parseInt( YAHOO.util.Dom.getStyle(el, "left"), 10 ); + var newTop = parseInt( YAHOO.util.Dom.getStyle(el, "top" ), 10 ); + + newOffset = [newLeft + this.deltaOffset[0], newTop + this.deltaOffset[1]]; + } + + return newOffset; + + //return [ (myPos[0] - ppos[0]), (myPos[1] - ppos[1]) ]; + }, + + /** + * Set up the slider, must be called in the constructor of all subclasses + * @method initSlider + * @param {int} iLeft the number of pixels the element can move left + * @param {int} iRight the number of pixels the element can move right + * @param {int} iUp the number of pixels the element can move up + * @param {int} iDown the number of pixels the element can move down + * @param {int} iTickSize the width of the tick interval. + */ + initSlider: function (iLeft, iRight, iUp, iDown, iTickSize) { + + + //document these. new for 0.12.1 + this.initLeft = iLeft; + this.initRight = iRight; + this.initUp = iUp; + this.initDown = iDown; + + this.setXConstraint(iLeft, iRight, iTickSize); + this.setYConstraint(iUp, iDown, iTickSize); + + if (iTickSize && iTickSize > 1) { + this._graduated = true; + } + + this._isHoriz = (iLeft || iRight); + this._isVert = (iUp || iDown); + this._isRegion = (this._isHoriz && this._isVert); + + }, + + /** + * Clear's the slider's ticks + * @method clearTicks + */ + clearTicks: function () { + YAHOO.widget.SliderThumb.superclass.clearTicks.call(this); + this.tickSize = 0; + this._graduated = false; + }, + + + /** + * Gets the current offset from the element's start position in + * pixels. + * @method getValue + * @return {int} the number of pixels (positive or negative) the + * slider has moved from the start position. + */ + getValue: function () { + if (!this.available) { return 0; } + var val = (this._isHoriz) ? this.getXValue() : this.getYValue(); + return val; + }, + + /** + * Gets the current X offset from the element's start position in + * pixels. + * @method getXValue + * @return {int} the number of pixels (positive or negative) the + * slider has moved horizontally from the start position. + */ + getXValue: function () { + if (!this.available) { return 0; } + var newOffset = this.getOffsetFromParent(); + return (newOffset[0] - this.startOffset[0]); + }, + + /** + * Gets the current Y offset from the element's start position in + * pixels. + * @method getYValue + * @return {int} the number of pixels (positive or negative) the + * slider has moved vertically from the start position. + */ + getYValue: function () { + if (!this.available) { return 0; } + var newOffset = this.getOffsetFromParent(); + return (newOffset[1] - this.startOffset[1]); + }, + + /** + * Thumb toString + * @method toString + * @return {string} string representation of the instance + */ + toString: function () { + return "SliderThumb " + this.id; + }, + + /** + * The onchange event for the handle/thumb is delegated to the YAHOO.widget.Slider + * instance it belongs to. + * @method onChange + * @private + */ + onChange: function (x, y) { + } + +}); + +if ("undefined" == typeof YAHOO.util.Anim) { + YAHOO.widget.Slider.ANIM_AVAIL = false; +} + +YAHOO.register("slider", YAHOO.widget.Slider, {version: "2.2.0", build: "127"}); diff --git a/interface/ispconfig/interface/js/yui/tabview/README b/interface/ispconfig/interface/js/yui/tabview/README new file mode 100644 index 0000000000000000000000000000000000000000..0c598a55d5ef07b23fca669ea76873a921a4b052 --- /dev/null +++ b/interface/ispconfig/interface/js/yui/tabview/README @@ -0,0 +1,21 @@ +*** version 2.2.0 ** + +* Element broken out into seperate pkg + NOTE: new dependency required - element-beta.js + +*** version 0.12.2 *** + +* var Tab is now private +* fixed Element.configureAttribute + +*** version 0.12.1 *** + +* tabs.css renamed to tabview.css +* calls to "set" now queued so they can be made before "contentReady" + + +*** version 0.12.0 *** + +* TabView widget introduced + +* Note: border_tabs.css included as basic skin to enable "tabs" look diff --git a/interface/ispconfig/interface/js/yui/tabview/assets/border_tabs.css b/interface/ispconfig/interface/js/yui/tabview/assets/border_tabs.css new file mode 100644 index 0000000000000000000000000000000000000000..57395f62cf431115bfd3a4f87bd6ec8c7afde0a1 --- /dev/null +++ b/interface/ispconfig/interface/js/yui/tabview/assets/border_tabs.css @@ -0,0 +1,54 @@ +/* +Copyright (c) 2007, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.2.0 +*/ +.yui-navset .yui-nav li a, .yui-navset .yui-content { + border:1px solid #000; /* label and content borders */ +} + +.yui-navset .yui-nav .selected a, .yui-navset .yui-nav a:hover, .yui-navset .yui-content { + background-color:#f6f7ee; /* active tab, tab hover, and content bgcolor */ +} + +.yui-navset .yui-nav li em { padding:.5em; } /* tab padding */ + +/* defaults to orientation "top" */ +.yui-navset .yui-nav .selected a { + border-bottom-width:0; /* no bottom border for active tab */ + padding-bottom:1px; /* to match height of other tabs */ +} + +.yui-navset .yui-content { + margin-top:-1px; /* for active tab overlap */ +} + +/* overrides for other orientations */ + +.yui-navset-bottom .yui-nav .selected a { + border-width:0 1px 1px; /* no top border for active tab */ + padding:1px 0 0; /* to match height of other tabs */ +} + +.yui-navset-bottom .yui-content { + margin:0 0 -1px; /* for active tab overlap */ +} + +.yui-navset-left .yui-nav li.selected a { + border-width:1px 0 1px 1px; /* no right border for active tab */ + padding:0 1px 0 0; /* to match width of other tabs */ +} + +.yui-navset-left .yui-content { + margin:0 0 0 -1px; /* for active tab overlap */ +} + +.yui-navset-right .yui-nav li.selected a { + border-width:1px 1px 1px 0; /* no left border for active tab */ + padding:0 0 0 1px; /* to match width of other tabs */ +} + +.yui-navset-right .yui-content { + margin:0 -1px 0 0; /* for active tab overlap */ +} \ No newline at end of file diff --git a/interface/ispconfig/interface/js/yui/tabview/assets/tabview.css b/interface/ispconfig/interface/js/yui/tabview/assets/tabview.css new file mode 100644 index 0000000000000000000000000000000000000000..2d6b788f50997ea544fe6345719bbcd0bfb0bed5 --- /dev/null +++ b/interface/ispconfig/interface/js/yui/tabview/assets/tabview.css @@ -0,0 +1,75 @@ +/* +Copyright (c) 2007, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.2.0 +*/ +/* default space between tabs */ +.yui-navset .yui-nav li { + margin-right:0.5em; /* horizontal tabs */ +} +.yui-navset-left .yui-nav li, .yui-navset-right .yui-nav li { + margin:0 0 0.5em; /* vertical tabs */ +} + +/* default width for side tabs */ +.yui-navset-left .yui-nav, .yui-navset-right .yui-nav { width:6em; } +.yui-navset-left { padding-left:6em; } /* map to nav width */ +.yui-navset-right { padding-right:6em; } /* ditto */ + +/* core */ + +.yui-nav, .yui-nav li { + margin:0; + padding:0; + list-style:none; +} +.yui-navset li em { font-style:normal; } + +.yui-navset { + position:relative; /* contain absolute positioned tabs (left/right) */ + zoom:1; +} + +.yui-navset .yui-content { zoom:1; } + +.yui-navset .yui-nav li { + display:inline-block; + display:-moz-inline-stack; + *display:inline; /* IE */ + vertical-align:bottom; /* safari: for overlap */ + cursor:pointer; /* gecko: due to -moz-inline-stack on anchor */ + zoom:1; /* IE: kill space between horizontal tabs */ +} + +.yui-navset-left .yui-nav li, .yui-navset-right .yui-nav li { + display:block; +} + +.yui-navset .yui-nav a { + outline:0; /* gecko: keep from shifting */ +} + +.yui-navset .yui-nav a { position:relative; } /* IE: to allow overlap */ + +.yui-navset .yui-nav li a { + display:block; + display:inline-block; + vertical-align:bottom; /* safari: for overlap */ + zoom:1; +} + +.yui-navset-left .yui-nav li a, .yui-navset-right .yui-nav li a { + display:block; +} + +.yui-navset-bottom .yui-nav li a { + vertical-align:text-top; /* for inline overlap (reverse for Op border bug) */ +} + +.yui-navset .yui-nav li a em { display:block; } + +/* position left and right oriented tabs */ +.yui-navset-left .yui-nav, .yui-navset-right .yui-nav { position:absolute; z-index:1; } +.yui-navset-left .yui-nav { left:0; } +.yui-navset-right .yui-nav { right:0; } diff --git a/interface/ispconfig/interface/js/yui/tabview/tabview-debug.js b/interface/ispconfig/interface/js/yui/tabview/tabview-debug.js new file mode 100644 index 0000000000000000000000000000000000000000..f84511aa2897d2d14d0f127f7d7d202349656bb5 --- /dev/null +++ b/interface/ispconfig/interface/js/yui/tabview/tabview-debug.js @@ -0,0 +1,1025 @@ +/* +Copyright (c) 2007, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.2.0 +*/ +(function() { + + /** + * The tabview module provides a widget for managing content bound to tabs. + * @module tabview + * @requires yahoo, dom, event, element + * + */ + /** + * A widget to control tabbed views. + * @namespace YAHOO.widget + * @class TabView + * @extends YAHOO.util.Element + * @constructor + * @param {HTMLElement | String | Object} el(optional) The html + * element that represents the TabView, or the attribute object to use. + * An element will be created if none provided. + * @param {Object} attr (optional) A key map of the tabView's + * initial attributes. Ignored if first arg is attributes object. + */ + YAHOO.widget.TabView = function(el, attr) { + attr = attr || {}; + if (arguments.length == 1 && !YAHOO.lang.isString(el) && !el.nodeName) { + attr = el; // treat first arg as attr object + el = attr.element || null; + } + + if (!el && !attr.element) { // create if we dont have one + el = _createTabViewElement.call(this, attr); + } + YAHOO.widget.TabView.superclass.constructor.call(this, el, attr); + }; + + YAHOO.extend(YAHOO.widget.TabView, YAHOO.util.Element); + + var proto = YAHOO.widget.TabView.prototype; + var Dom = YAHOO.util.Dom; + var Event = YAHOO.util.Event; + var Tab = YAHOO.widget.Tab; + + + /** + * The className to add when building from scratch. + * @property CLASSNAME + * @default "navset" + */ + proto.CLASSNAME = 'yui-navset'; + + /** + * The className of the HTMLElement containing the TabView's tab elements + * to look for when building from existing markup, or to add when building + * from scratch. + * All childNodes of the tab container are treated as Tabs when building + * from existing markup. + * @property TAB_PARENT_CLASSNAME + * @default "nav" + */ + proto.TAB_PARENT_CLASSNAME = 'yui-nav'; + + /** + * The className of the HTMLElement containing the TabView's label elements + * to look for when building from existing markup, or to add when building + * from scratch. + * All childNodes of the content container are treated as content elements when + * building from existing markup. + * @property CONTENT_PARENT_CLASSNAME + * @default "nav-content" + */ + proto.CONTENT_PARENT_CLASSNAME = 'yui-content'; + + proto._tabParent = null; + proto._contentParent = null; + + /** + * Adds a Tab to the TabView instance. + * If no index is specified, the tab is added to the end of the tab list. + * @method addTab + * @param {YAHOO.widget.Tab} tab A Tab instance to add. + * @param {Integer} index The position to add the tab. + * @return void + */ + proto.addTab = function(tab, index) { + var tabs = this.get('tabs'); + if (!tabs) { // not ready yet + this._queue[this._queue.length] = ['addTab', arguments]; + return false; + } + + index = (index === undefined) ? tabs.length : index; + + var before = this.getTab(index); + + var self = this; + var el = this.get('element'); + var tabParent = this._tabParent; + var contentParent = this._contentParent; + + var tabElement = tab.get('element'); + var contentEl = tab.get('contentEl'); + + if ( before ) { + tabParent.insertBefore(tabElement, before.get('element')); + } else { + tabParent.appendChild(tabElement); + } + + if ( contentEl && !Dom.isAncestor(contentParent, contentEl) ) { + contentParent.appendChild(contentEl); + } + + if ( !tab.get('active') ) { + tab.set('contentVisible', false, true); /* hide if not active */ + } else { + this.set('activeTab', tab, true); + + } + + var activate = function(e) { + YAHOO.util.Event.preventDefault(e); + self.set('activeTab', this); + }; + + tab.addListener( tab.get('activationEvent'), activate); + + tab.addListener('activationEventChange', function(e) { + if (e.prevValue != e.newValue) { + tab.removeListener(e.prevValue, activate); + tab.addListener(e.newValue, activate); + } + }); + + tabs.splice(index, 0, tab); + }; + + /** + * Routes childNode events. + * @method DOMEventHandler + * @param {event} e The Dom event that is being handled. + * @return void + */ + proto.DOMEventHandler = function(e) { + var el = this.get('element'); + var target = YAHOO.util.Event.getTarget(e); + var tabParent = this._tabParent; + + if (Dom.isAncestor(tabParent, target) ) { + var tabEl; + var tab = null; + var contentEl; + var tabs = this.get('tabs'); + + for (var i = 0, len = tabs.length; i < len; i++) { + tabEl = tabs[i].get('element'); + contentEl = tabs[i].get('contentEl'); + + if ( target == tabEl || Dom.isAncestor(tabEl, target) ) { + tab = tabs[i]; + break; // note break + } + } + + if (tab) { + tab.fireEvent(e.type, e); + } + } + }; + + /** + * Returns the Tab instance at the specified index. + * @method getTab + * @param {Integer} index The position of the Tab. + * @return YAHOO.widget.Tab + */ + proto.getTab = function(index) { + return this.get('tabs')[index]; + }; + + /** + * Returns the index of given tab. + * @method getTabIndex + * @param {YAHOO.widget.Tab} tab The tab whose index will be returned. + * @return int + */ + proto.getTabIndex = function(tab) { + var index = null; + var tabs = this.get('tabs'); + for (var i = 0, len = tabs.length; i < len; ++i) { + if (tab == tabs[i]) { + index = i; + break; + } + } + + return index; + }; + + /** + * Removes the specified Tab from the TabView. + * @method removeTab + * @param {YAHOO.widget.Tab} item The Tab instance to be removed. + * @return void + */ + proto.removeTab = function(tab) { + var tabCount = this.get('tabs').length; + + var index = this.getTabIndex(tab); + var nextIndex = index + 1; + if ( tab == this.get('activeTab') ) { // select next tab + if (tabCount > 1) { + if (index + 1 == tabCount) { + this.set('activeIndex', index - 1); + } else { + this.set('activeIndex', index + 1); + } + } + } + + this._tabParent.removeChild( tab.get('element') ); + this._contentParent.removeChild( tab.get('contentEl') ); + this._configs.tabs.value.splice(index, 1); + + }; + + /** + * Provides a readable name for the TabView instance. + * @method toString + * @return String + */ + proto.toString = function() { + var name = this.get('id') || this.get('tagName'); + return "TabView " + name; + }; + + /** + * The transiton to use when switching between tabs. + * @method contentTransition + */ + proto.contentTransition = function(newTab, oldTab) { + newTab.set('contentVisible', true); + oldTab.set('contentVisible', false); + }; + + /** + * setAttributeConfigs TabView specific properties. + * @method initAttributes + * @param {Object} attr Hash of initial attributes + */ + proto.initAttributes = function(attr) { + YAHOO.widget.TabView.superclass.initAttributes.call(this, attr); + + if (!attr.orientation) { + attr.orientation = 'top'; + } + + var el = this.get('element'); + + /** + * The Tabs belonging to the TabView instance. + * @config tabs + * @type Array + */ + this.setAttributeConfig('tabs', { + value: [], + readOnly: true + }); + + /** + * The container of the tabView's label elements. + * @property _tabParent + * @private + * @type HTMLElement + */ + this._tabParent = + this.getElementsByClassName(this.TAB_PARENT_CLASSNAME, + 'ul' )[0] || _createTabParent.call(this); + + /** + * The container of the tabView's content elements. + * @property _contentParent + * @type HTMLElement + * @private + */ + this._contentParent = + this.getElementsByClassName(this.CONTENT_PARENT_CLASSNAME, + 'div')[0] || _createContentParent.call(this); + + /** + * How the Tabs should be oriented relative to the TabView. + * @config orientation + * @type String + * @default "top" + */ + this.setAttributeConfig('orientation', { + value: attr.orientation, + method: function(value) { + var current = this.get('orientation'); + this.addClass('yui-navset-' + value); + + if (current != value) { + this.removeClass('yui-navset-' + current); + } + + switch(value) { + case 'bottom': + this.appendChild(this._tabParent); + break; + } + } + }); + + /** + * The index of the tab currently active. + * @config activeIndex + * @type Int + */ + this.setAttributeConfig('activeIndex', { + value: attr.activeIndex, + method: function(value) { + this.set('activeTab', this.getTab(value)); + }, + validator: function(value) { + return !this.getTab(value).get('disabled'); // cannot activate if disabled + } + }); + + /** + * The tab currently active. + * @config activeTab + * @type YAHOO.widget.Tab + */ + this.setAttributeConfig('activeTab', { + value: attr.activeTab, + method: function(tab) { + var activeTab = this.get('activeTab'); + + if (tab) { + tab.set('active', true); + this._configs['activeIndex'].value = this.getTabIndex(tab); // keep in sync + } + + if (activeTab && activeTab != tab) { + activeTab.set('active', false); + } + + if (activeTab && tab != activeTab) { // no transition if only 1 + this.contentTransition(tab, activeTab); + } else if (tab) { + tab.set('contentVisible', true); + } + }, + validator: function(value) { + return !value.get('disabled'); // cannot activate if disabled + } + }); + + if ( this._tabParent ) { + _initTabs.call(this); + } + + for (var type in this.DOM_EVENTS) { + if ( YAHOO.lang.hasOwnProperty(this.DOM_EVENTS, type) ) { + this.addListener.call(this, type, this.DOMEventHandler); + } + } + }; + + /** + * Creates Tab instances from a collection of HTMLElements. + * @method createTabs + * @private + * @param {Array|HTMLCollection} elements The elements to use for Tabs. + * @return void + */ + var _initTabs = function() { + var tab, + attr, + contentEl; + + var el = this.get('element'); + var tabs = _getChildNodes(this._tabParent); + var contentElements = _getChildNodes(this._contentParent); + + for (var i = 0, len = tabs.length; i < len; ++i) { + attr = {}; + + if (contentElements[i]) { + attr.contentEl = contentElements[i]; + } + + tab = new YAHOO.widget.Tab(tabs[i], attr); + this.addTab(tab); + + if (tab.hasClass(tab.ACTIVE_CLASSNAME) ) { + this._configs.activeTab.value = tab; // dont invoke method + } + } + }; + + var _createTabViewElement = function(attr) { + var el = document.createElement('div'); + + if ( this.CLASSNAME ) { + el.className = this.CLASSNAME; + } + + return el; + }; + + var _createTabParent = function(attr) { + var el = document.createElement('ul'); + + if ( this.TAB_PARENT_CLASSNAME ) { + el.className = this.TAB_PARENT_CLASSNAME; + } + + this.get('element').appendChild(el); + + return el; + }; + + var _createContentParent = function(attr) { + var el = document.createElement('div'); + + if ( this.CONTENT_PARENT_CLASSNAME ) { + el.className = this.CONTENT_PARENT_CLASSNAME; + } + + this.get('element').appendChild(el); + + return el; + }; + + var _getChildNodes = function(el) { + var nodes = []; + var childNodes = el.childNodes; + + for (var i = 0, len = childNodes.length; i < len; ++i) { + if (childNodes[i].nodeType == 1) { + nodes[nodes.length] = childNodes[i]; + } + } + + return nodes; + }; + +/** + * Fires before the activeTab is changed. + *

    See: Element.addListener

    + *

    If handler returns false, the change will be cancelled, and the value will not + * be set.

    + *

    Event fields:
    + * <String> type beforeActiveTabChange
    + * <YAHOO.widget.Tab> + * prevValue the currently active tab
    + * <YAHOO.widget.Tab> + * newValue the tab to be made active

    + *

    Usage:
    + * var handler = function(e) {var previous = e.prevValue};
    + * myTabs.addListener('beforeActiveTabChange', handler);

    + * @event beforeActiveTabChange + */ + +/** + * Fires after the activeTab is changed. + *

    See: Element.addListener

    + *

    Event fields:
    + * <String> type activeTabChange
    + * <YAHOO.widget.Tab> + * prevValue the formerly active tab
    + * <YAHOO.widget.Tab> + * newValue the new active tab

    + *

    Usage:
    + * var handler = function(e) {var previous = e.prevValue};
    + * myTabs.addListener('activeTabChange', handler);

    + * @event activeTabChange + */ + +/** + * Fires before the orientation is changed. + *

    See: Element.addListener

    + *

    If handler returns false, the change will be cancelled, and the value will not + * be set.

    + *

    Event fields:
    + * <String> type beforeOrientationChange
    + * <String> + * prevValue the current orientation
    + * <String> + * newValue the new orientation to be applied

    + *

    Usage:
    + * var handler = function(e) {var previous = e.prevValue};
    + * myTabs.addListener('beforeOrientationChange', handler);

    + * @event beforeOrientationChange + */ + +/** + * Fires after the orientation is changed. + *

    See: Element.addListener

    + *

    Event fields:
    + * <String> type orientationChange
    + * <String> + * prevValue the former orientation
    + * <String> + * newValue the new orientation

    + *

    Usage:
    + * var handler = function(e) {var previous = e.prevValue};
    + * myTabs.addListener('orientationChange', handler);

    + * @event orientationChange + */ +})(); + +(function() { + var Dom = YAHOO.util.Dom, + Event = YAHOO.util.Event; + + /** + * A representation of a Tab's label and content. + * @namespace YAHOO.widget + * @class Tab + * @extends YAHOO.util.Element + * @constructor + * @param element {HTMLElement | String} (optional) The html element that + * represents the TabView. An element will be created if none provided. + * @param {Object} properties A key map of initial properties + */ + var Tab = function(el, attr) { + attr = attr || {}; + if (arguments.length == 1 && !YAHOO.lang.isString(el) && !el.nodeName) { + attr = el; + el = attr.element; + } + + if (!el && !attr.element) { + el = _createTabElement.call(this, attr); + } + + this.loadHandler = { + success: function(o) { + this.set('content', o.responseText); + }, + failure: function(o) { + YAHOO.log('loading failed: ' + o.statusText, + 'error', 'Tab'); + } + }; + + Tab.superclass.constructor.call(this, el, attr); + + this.DOM_EVENTS = {}; // delegating to tabView + }; + + YAHOO.extend(Tab, YAHOO.util.Element); + var proto = Tab.prototype; + + /** + * The default tag name for a Tab's inner element. + * @property LABEL_INNER_TAGNAME + * @type String + * @default "em" + */ + proto.LABEL_TAGNAME = 'em'; + + /** + * The class name applied to active tabs. + * @property ACTIVE_CLASSNAME + * @type String + * @default "on" + */ + proto.ACTIVE_CLASSNAME = 'selected'; + + /** + * The class name applied to disabled tabs. + * @property DISABLED_CLASSNAME + * @type String + * @default "disabled" + */ + proto.DISABLED_CLASSNAME = 'disabled'; + + /** + * The class name applied to dynamic tabs while loading. + * @property LOADING_CLASSNAME + * @type String + * @default "disabled" + */ + proto.LOADING_CLASSNAME = 'loading'; + + /** + * Provides a reference to the connection request object when data is + * loaded dynamically. + * @property dataConnection + * @type Object + */ + proto.dataConnection = null; + + /** + * Object containing success and failure callbacks for loading data. + * @property loadHandler + * @type object + */ + proto.loadHandler = null; + + /** + * Provides a readable name for the tab. + * @method toString + * @return String + */ + proto.toString = function() { + var el = this.get('element'); + var id = el.id || el.tagName; + return "Tab " + id; + }; + + /** + * setAttributeConfigs TabView specific properties. + * @method initAttributes + * @param {Object} attr Hash of initial attributes + */ + proto.initAttributes = function(attr) { + attr = attr || {}; + Tab.superclass.initAttributes.call(this, attr); + + var el = this.get('element'); + + /** + * The event that triggers the tab's activation. + * @config activationEvent + * @type String + */ + this.setAttributeConfig('activationEvent', { + value: attr.activationEvent || 'click' + }); + + /** + * The element that contains the tab's label. + * @config labelEl + * @type HTMLElement + */ + this.setAttributeConfig('labelEl', { + value: attr.labelEl || _getlabelEl.call(this), + method: function(value) { + var current = this.get('labelEl'); + + if (current) { + if (current == value) { + return false; // already set + } + + this.replaceChild(value, current); + } else if (el.firstChild) { // ensure label is firstChild by default + this.insertBefore(value, el.firstChild); + } else { + this.appendChild(value); + } + } + }); + + /** + * The tab's label text (or innerHTML). + * @config label + * @type String + */ + this.setAttributeConfig('label', { + value: attr.label || _getLabel.call(this), + method: function(value) { + var labelEl = this.get('labelEl'); + if (!labelEl) { // create if needed + this.set('labelEl', _createlabelEl.call(this)); + } + + _setLabel.call(this, value); + } + }); + + /** + * The HTMLElement that contains the tab's content. + * @config contentEl + * @type HTMLElement + */ + this.setAttributeConfig('contentEl', { + value: attr.contentEl || document.createElement('div'), + method: function(value) { + var current = this.get('contentEl'); + + if (current) { + if (current == value) { + return false; // already set + } + this.replaceChild(value, current); + } + } + }); + + /** + * The tab's content. + * @config content + * @type String + */ + this.setAttributeConfig('content', { + value: attr.content, + method: function(value) { + this.get('contentEl').innerHTML = value; + } + }); + + var _dataLoaded = false; + + /** + * The tab's data source, used for loading content dynamically. + * @config dataSrc + * @type String + */ + this.setAttributeConfig('dataSrc', { + value: attr.dataSrc + }); + + /** + * Whether or not content should be reloaded for every view. + * @config cacheData + * @type Boolean + * @default false + */ + this.setAttributeConfig('cacheData', { + value: attr.cacheData || false, + validator: YAHOO.lang.isBoolean + }); + + /** + * The method to use for the data request. + * @config loadMethod + * @type String + * @default "GET" + */ + this.setAttributeConfig('loadMethod', { + value: attr.loadMethod || 'GET', + validator: YAHOO.lang.isString + }); + + /** + * Whether or not any data has been loaded from the server. + * @config dataLoaded + * @type Boolean + */ + this.setAttributeConfig('dataLoaded', { + value: false, + validator: YAHOO.lang.isBoolean, + writeOnce: true + }); + + /** + * Number if milliseconds before aborting and calling failure handler. + * @config dataTimeout + * @type Number + * @default null + */ + this.setAttributeConfig('dataTimeout', { + value: attr.dataTimeout || null, + validator: YAHOO.lang.isNumber + }); + + /** + * Whether or not the tab is currently active. + * If a dataSrc is set for the tab, the content will be loaded from + * the given source. + * @config active + * @type Boolean + */ + this.setAttributeConfig('active', { + value: attr.active || this.hasClass(this.ACTIVE_CLASSNAME), + method: function(value) { + if (value === true) { + this.addClass(this.ACTIVE_CLASSNAME); + this.set('title', 'active'); + } else { + this.removeClass(this.ACTIVE_CLASSNAME); + this.set('title', ''); + } + }, + validator: function(value) { + return YAHOO.lang.isBoolean(value) && !this.get('disabled') ; + } + }); + + /** + * Whether or not the tab is disabled. + * @config disabled + * @type Boolean + */ + this.setAttributeConfig('disabled', { + value: attr.disabled || this.hasClass(this.DISABLED_CLASSNAME), + method: function(value) { + if (value === true) { + Dom.addClass(this.get('element'), this.DISABLED_CLASSNAME); + } else { + Dom.removeClass(this.get('element'), this.DISABLED_CLASSNAME); + } + }, + validator: YAHOO.lang.isBoolean + }); + + /** + * The href of the tab's anchor element. + * @config href + * @type String + * @default '#' + */ + this.setAttributeConfig('href', { + value: attr.href || '#', + method: function(value) { + this.getElementsByTagName('a')[0].href = value; + }, + validator: YAHOO.lang.isString + }); + + /** + * The Whether or not the tab's content is visible. + * @config contentVisible + * @type Boolean + * @default false + */ + this.setAttributeConfig('contentVisible', { + value: attr.contentVisible, + method: function(value) { + if (value) { + this.get('contentEl').style.display = 'block'; + + if ( this.get('dataSrc') ) { + // load dynamic content unless already loaded and caching + if ( !this.get('dataLoaded') || !this.get('cacheData') ) { + _dataConnect.call(this); + } + } + } else { + this.get('contentEl').style.display = 'none'; + } + }, + validator: YAHOO.lang.isBoolean + }); + }; + + var _createTabElement = function(attr) { + var el = document.createElement('li'); + var a = document.createElement('a'); + + a.href = attr.href || '#'; + + el.appendChild(a); + + var label = attr.label || null; + var labelEl = attr.labelEl || null; + + if (labelEl) { // user supplied labelEl + if (!label) { // user supplied label + label = _getLabel.call(this, labelEl); + } + } else { + labelEl = _createlabelEl.call(this); + } + + a.appendChild(labelEl); + + return el; + }; + + var _getlabelEl = function() { + return this.getElementsByTagName(this.LABEL_TAGNAME)[0]; + }; + + var _createlabelEl = function() { + var el = document.createElement(this.LABEL_TAGNAME); + return el; + }; + + var _setLabel = function(label) { + var el = this.get('labelEl'); + el.innerHTML = label; + }; + + var _getLabel = function() { + var label, + el = this.get('labelEl'); + + if (!el) { + return undefined; + } + + return el.innerHTML; + }; + + var _dataConnect = function() { + if (!YAHOO.util.Connect) { + YAHOO.log('YAHOO.util.Connect dependency not met', + 'error', 'Tab'); + return false; + } + + Dom.addClass(this.get('contentEl').parentNode, this.LOADING_CLASSNAME); + + this.dataConnection = YAHOO.util.Connect.asyncRequest( + this.get('loadMethod'), + this.get('dataSrc'), + { + success: function(o) { + this.loadHandler.success.call(this, o); + this.set('dataLoaded', true); + this.dataConnection = null; + Dom.removeClass(this.get('contentEl').parentNode, + this.LOADING_CLASSNAME); + }, + failure: function(o) { + this.loadHandler.failure.call(this, o); + this.dataConnection = null; + Dom.removeClass(this.get('contentEl').parentNode, + this.LOADING_CLASSNAME); + }, + scope: this, + timeout: this.get('dataTimeout') + } + ); + }; + + YAHOO.widget.Tab = Tab; + + /** + * Fires before the active state is changed. + *

    See: Element.addListener

    + *

    If handler returns false, the change will be cancelled, and the value will not + * be set.

    + *

    Event fields:
    + * <String> type beforeActiveChange
    + * <Boolean> + * prevValue the current value
    + * <Boolean> + * newValue the new value

    + *

    Usage:
    + * var handler = function(e) {var previous = e.prevValue};
    + * myTabs.addListener('beforeActiveChange', handler);

    + * @event beforeActiveChange + */ + + /** + * Fires after the active state is changed. + *

    See: Element.addListener

    + *

    Event fields:
    + * <String> type activeChange
    + * <Boolean> + * prevValue the previous value
    + * <Boolean> + * newValue the updated value

    + *

    Usage:
    + * var handler = function(e) {var previous = e.prevValue};
    + * myTabs.addListener('activeChange', handler);

    + * @event activeChange + */ + + /** + * Fires before the tab label is changed. + *

    See: Element.addListener

    + *

    If handler returns false, the change will be cancelled, and the value will not + * be set.

    + *

    Event fields:
    + * <String> type beforeLabelChange
    + * <String> + * prevValue the current value
    + * <String> + * newValue the new value

    + *

    Usage:
    + * var handler = function(e) {var previous = e.prevValue};
    + * myTabs.addListener('beforeLabelChange', handler);

    + * @event beforeLabelChange + */ + + /** + * Fires after the tab label is changed. + *

    See: Element.addListener

    + *

    Event fields:
    + * <String> type labelChange
    + * <String> + * prevValue the previous value
    + * <String> + * newValue the updated value

    + *

    Usage:
    + * var handler = function(e) {var previous = e.prevValue};
    + * myTabs.addListener('labelChange', handler);

    + * @event labelChange + */ + + /** + * Fires before the tab content is changed. + *

    See: Element.addListener

    + *

    If handler returns false, the change will be cancelled, and the value will not + * be set.

    + *

    Event fields:
    + * <String> type beforeContentChange
    + * <String> + * prevValue the current value
    + * <String> + * newValue the new value

    + *

    Usage:
    + * var handler = function(e) {var previous = e.prevValue};
    + * myTabs.addListener('beforeContentChange', handler);

    + * @event beforeContentChange + */ + + /** + * Fires after the tab content is changed. + *

    See: Element.addListener

    + *

    Event fields:
    + * <String> type contentChange
    + * <String> + * prevValue the previous value
    + * <Boolean> + * newValue the updated value

    + *

    Usage:
    + * var handler = function(e) {var previous = e.prevValue};
    + * myTabs.addListener('contentChange', handler);

    + * @event contentChange + */ +})(); + +YAHOO.register("tabview", YAHOO.widget.TabView, {version: "2.2.0", build: "127"}); diff --git a/interface/ispconfig/interface/js/yui/tabview/tabview-min.js b/interface/ispconfig/interface/js/yui/tabview/tabview-min.js new file mode 100644 index 0000000000000000000000000000000000000000..0985d81f806433f89cf17e5faf982ef02342576f --- /dev/null +++ b/interface/ispconfig/interface/js/yui/tabview/tabview-min.js @@ -0,0 +1,35 @@ +/* +Copyright (c) 2007, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.2.0 +*/ + +(function(){YAHOO.widget.TabView=function(el,attr){attr=attr||{};if(arguments.length==1&&!YAHOO.lang.isString(el)&&!el.nodeName){attr=el;el=attr.element||null;} +if(!el&&!attr.element){el=_createTabViewElement.call(this,attr);} +YAHOO.widget.TabView.superclass.constructor.call(this,el,attr);};YAHOO.extend(YAHOO.widget.TabView,YAHOO.util.Element);var proto=YAHOO.widget.TabView.prototype;var Dom=YAHOO.util.Dom;var Event=YAHOO.util.Event;var Tab=YAHOO.widget.Tab;proto.CLASSNAME='yui-navset';proto.TAB_PARENT_CLASSNAME='yui-nav';proto.CONTENT_PARENT_CLASSNAME='yui-content';proto._tabParent=null;proto._contentParent=null;proto.addTab=function(tab,index){var tabs=this.get('tabs');if(!tabs){this._queue[this._queue.length]=['addTab',arguments];return false;} +index=(index===undefined)?tabs.length:index;var before=this.getTab(index);var self=this;var el=this.get('element');var tabParent=this._tabParent;var contentParent=this._contentParent;var tabElement=tab.get('element');var contentEl=tab.get('contentEl');if(before){tabParent.insertBefore(tabElement,before.get('element'));}else{tabParent.appendChild(tabElement);} +if(contentEl&&!Dom.isAncestor(contentParent,contentEl)){contentParent.appendChild(contentEl);} +if(!tab.get('active')){tab.set('contentVisible',false,true);}else{this.set('activeTab',tab,true);} +var activate=function(e){YAHOO.util.Event.preventDefault(e);self.set('activeTab',this);};tab.addListener(tab.get('activationEvent'),activate);tab.addListener('activationEventChange',function(e){if(e.prevValue!=e.newValue){tab.removeListener(e.prevValue,activate);tab.addListener(e.newValue,activate);}});tabs.splice(index,0,tab);};proto.DOMEventHandler=function(e){var el=this.get('element');var target=YAHOO.util.Event.getTarget(e);var tabParent=this._tabParent;if(Dom.isAncestor(tabParent,target)){var tabEl;var tab=null;var contentEl;var tabs=this.get('tabs');for(var i=0,len=tabs.length;i1){if(index+1==tabCount){this.set('activeIndex',index-1);}else{this.set('activeIndex',index+1);}}} +this._tabParent.removeChild(tab.get('element'));this._contentParent.removeChild(tab.get('contentEl'));this._configs.tabs.value.splice(index,1);};proto.toString=function(){var name=this.get('id')||this.get('tagName');return"TabView "+name;};proto.contentTransition=function(newTab,oldTab){newTab.set('contentVisible',true);oldTab.set('contentVisible',false);};proto.initAttributes=function(attr){YAHOO.widget.TabView.superclass.initAttributes.call(this,attr);if(!attr.orientation){attr.orientation='top';} +var el=this.get('element');this.setAttributeConfig('tabs',{value:[],readOnly:true});this._tabParent=this.getElementsByClassName(this.TAB_PARENT_CLASSNAME,'ul')[0]||_createTabParent.call(this);this._contentParent=this.getElementsByClassName(this.CONTENT_PARENT_CLASSNAME,'div')[0]||_createContentParent.call(this);this.setAttributeConfig('orientation',{value:attr.orientation,method:function(value){var current=this.get('orientation');this.addClass('yui-navset-'+value);if(current!=value){this.removeClass('yui-navset-'+current);} +switch(value){case'bottom':this.appendChild(this._tabParent);break;}}});this.setAttributeConfig('activeIndex',{value:attr.activeIndex,method:function(value){this.set('activeTab',this.getTab(value));},validator:function(value){return!this.getTab(value).get('disabled');}});this.setAttributeConfig('activeTab',{value:attr.activeTab,method:function(tab){var activeTab=this.get('activeTab');if(tab){tab.set('active',true);this._configs['activeIndex'].value=this.getTabIndex(tab);} +if(activeTab&&activeTab!=tab){activeTab.set('active',false);} +if(activeTab&&tab!=activeTab){this.contentTransition(tab,activeTab);}else if(tab){tab.set('contentVisible',true);}},validator:function(value){return!value.get('disabled');}});if(this._tabParent){_initTabs.call(this);} +for(var type in this.DOM_EVENTS){if(YAHOO.lang.hasOwnProperty(this.DOM_EVENTS,type)){this.addListener.call(this,type,this.DOMEventHandler);}}};var _initTabs=function(){var tab,attr,contentEl;var el=this.get('element');var tabs=_getChildNodes(this._tabParent);var contentElements=_getChildNodes(this._contentParent);for(var i=0,len=tabs.length;i 1) { + if (index + 1 == tabCount) { + this.set('activeIndex', index - 1); + } else { + this.set('activeIndex', index + 1); + } + } + } + + this._tabParent.removeChild( tab.get('element') ); + this._contentParent.removeChild( tab.get('contentEl') ); + this._configs.tabs.value.splice(index, 1); + + }; + + /** + * Provides a readable name for the TabView instance. + * @method toString + * @return String + */ + proto.toString = function() { + var name = this.get('id') || this.get('tagName'); + return "TabView " + name; + }; + + /** + * The transiton to use when switching between tabs. + * @method contentTransition + */ + proto.contentTransition = function(newTab, oldTab) { + newTab.set('contentVisible', true); + oldTab.set('contentVisible', false); + }; + + /** + * setAttributeConfigs TabView specific properties. + * @method initAttributes + * @param {Object} attr Hash of initial attributes + */ + proto.initAttributes = function(attr) { + YAHOO.widget.TabView.superclass.initAttributes.call(this, attr); + + if (!attr.orientation) { + attr.orientation = 'top'; + } + + var el = this.get('element'); + + /** + * The Tabs belonging to the TabView instance. + * @config tabs + * @type Array + */ + this.setAttributeConfig('tabs', { + value: [], + readOnly: true + }); + + /** + * The container of the tabView's label elements. + * @property _tabParent + * @private + * @type HTMLElement + */ + this._tabParent = + this.getElementsByClassName(this.TAB_PARENT_CLASSNAME, + 'ul' )[0] || _createTabParent.call(this); + + /** + * The container of the tabView's content elements. + * @property _contentParent + * @type HTMLElement + * @private + */ + this._contentParent = + this.getElementsByClassName(this.CONTENT_PARENT_CLASSNAME, + 'div')[0] || _createContentParent.call(this); + + /** + * How the Tabs should be oriented relative to the TabView. + * @config orientation + * @type String + * @default "top" + */ + this.setAttributeConfig('orientation', { + value: attr.orientation, + method: function(value) { + var current = this.get('orientation'); + this.addClass('yui-navset-' + value); + + if (current != value) { + this.removeClass('yui-navset-' + current); + } + + switch(value) { + case 'bottom': + this.appendChild(this._tabParent); + break; + } + } + }); + + /** + * The index of the tab currently active. + * @config activeIndex + * @type Int + */ + this.setAttributeConfig('activeIndex', { + value: attr.activeIndex, + method: function(value) { + this.set('activeTab', this.getTab(value)); + }, + validator: function(value) { + return !this.getTab(value).get('disabled'); // cannot activate if disabled + } + }); + + /** + * The tab currently active. + * @config activeTab + * @type YAHOO.widget.Tab + */ + this.setAttributeConfig('activeTab', { + value: attr.activeTab, + method: function(tab) { + var activeTab = this.get('activeTab'); + + if (tab) { + tab.set('active', true); + this._configs['activeIndex'].value = this.getTabIndex(tab); // keep in sync + } + + if (activeTab && activeTab != tab) { + activeTab.set('active', false); + } + + if (activeTab && tab != activeTab) { // no transition if only 1 + this.contentTransition(tab, activeTab); + } else if (tab) { + tab.set('contentVisible', true); + } + }, + validator: function(value) { + return !value.get('disabled'); // cannot activate if disabled + } + }); + + if ( this._tabParent ) { + _initTabs.call(this); + } + + for (var type in this.DOM_EVENTS) { + if ( YAHOO.lang.hasOwnProperty(this.DOM_EVENTS, type) ) { + this.addListener.call(this, type, this.DOMEventHandler); + } + } + }; + + /** + * Creates Tab instances from a collection of HTMLElements. + * @method createTabs + * @private + * @param {Array|HTMLCollection} elements The elements to use for Tabs. + * @return void + */ + var _initTabs = function() { + var tab, + attr, + contentEl; + + var el = this.get('element'); + var tabs = _getChildNodes(this._tabParent); + var contentElements = _getChildNodes(this._contentParent); + + for (var i = 0, len = tabs.length; i < len; ++i) { + attr = {}; + + if (contentElements[i]) { + attr.contentEl = contentElements[i]; + } + + tab = new YAHOO.widget.Tab(tabs[i], attr); + this.addTab(tab); + + if (tab.hasClass(tab.ACTIVE_CLASSNAME) ) { + this._configs.activeTab.value = tab; // dont invoke method + } + } + }; + + var _createTabViewElement = function(attr) { + var el = document.createElement('div'); + + if ( this.CLASSNAME ) { + el.className = this.CLASSNAME; + } + + return el; + }; + + var _createTabParent = function(attr) { + var el = document.createElement('ul'); + + if ( this.TAB_PARENT_CLASSNAME ) { + el.className = this.TAB_PARENT_CLASSNAME; + } + + this.get('element').appendChild(el); + + return el; + }; + + var _createContentParent = function(attr) { + var el = document.createElement('div'); + + if ( this.CONTENT_PARENT_CLASSNAME ) { + el.className = this.CONTENT_PARENT_CLASSNAME; + } + + this.get('element').appendChild(el); + + return el; + }; + + var _getChildNodes = function(el) { + var nodes = []; + var childNodes = el.childNodes; + + for (var i = 0, len = childNodes.length; i < len; ++i) { + if (childNodes[i].nodeType == 1) { + nodes[nodes.length] = childNodes[i]; + } + } + + return nodes; + }; + +/** + * Fires before the activeTab is changed. + *

    See: Element.addListener

    + *

    If handler returns false, the change will be cancelled, and the value will not + * be set.

    + *

    Event fields:
    + * <String> type beforeActiveTabChange
    + * <YAHOO.widget.Tab> + * prevValue the currently active tab
    + * <YAHOO.widget.Tab> + * newValue the tab to be made active

    + *

    Usage:
    + * var handler = function(e) {var previous = e.prevValue};
    + * myTabs.addListener('beforeActiveTabChange', handler);

    + * @event beforeActiveTabChange + */ + +/** + * Fires after the activeTab is changed. + *

    See: Element.addListener

    + *

    Event fields:
    + * <String> type activeTabChange
    + * <YAHOO.widget.Tab> + * prevValue the formerly active tab
    + * <YAHOO.widget.Tab> + * newValue the new active tab

    + *

    Usage:
    + * var handler = function(e) {var previous = e.prevValue};
    + * myTabs.addListener('activeTabChange', handler);

    + * @event activeTabChange + */ + +/** + * Fires before the orientation is changed. + *

    See: Element.addListener

    + *

    If handler returns false, the change will be cancelled, and the value will not + * be set.

    + *

    Event fields:
    + * <String> type beforeOrientationChange
    + * <String> + * prevValue the current orientation
    + * <String> + * newValue the new orientation to be applied

    + *

    Usage:
    + * var handler = function(e) {var previous = e.prevValue};
    + * myTabs.addListener('beforeOrientationChange', handler);

    + * @event beforeOrientationChange + */ + +/** + * Fires after the orientation is changed. + *

    See: Element.addListener

    + *

    Event fields:
    + * <String> type orientationChange
    + * <String> + * prevValue the former orientation
    + * <String> + * newValue the new orientation

    + *

    Usage:
    + * var handler = function(e) {var previous = e.prevValue};
    + * myTabs.addListener('orientationChange', handler);

    + * @event orientationChange + */ +})(); + +(function() { + var Dom = YAHOO.util.Dom, + Event = YAHOO.util.Event; + + /** + * A representation of a Tab's label and content. + * @namespace YAHOO.widget + * @class Tab + * @extends YAHOO.util.Element + * @constructor + * @param element {HTMLElement | String} (optional) The html element that + * represents the TabView. An element will be created if none provided. + * @param {Object} properties A key map of initial properties + */ + var Tab = function(el, attr) { + attr = attr || {}; + if (arguments.length == 1 && !YAHOO.lang.isString(el) && !el.nodeName) { + attr = el; + el = attr.element; + } + + if (!el && !attr.element) { + el = _createTabElement.call(this, attr); + } + + this.loadHandler = { + success: function(o) { + this.set('content', o.responseText); + }, + failure: function(o) { + } + }; + + Tab.superclass.constructor.call(this, el, attr); + + this.DOM_EVENTS = {}; // delegating to tabView + }; + + YAHOO.extend(Tab, YAHOO.util.Element); + var proto = Tab.prototype; + + /** + * The default tag name for a Tab's inner element. + * @property LABEL_INNER_TAGNAME + * @type String + * @default "em" + */ + proto.LABEL_TAGNAME = 'em'; + + /** + * The class name applied to active tabs. + * @property ACTIVE_CLASSNAME + * @type String + * @default "on" + */ + proto.ACTIVE_CLASSNAME = 'selected'; + + /** + * The class name applied to disabled tabs. + * @property DISABLED_CLASSNAME + * @type String + * @default "disabled" + */ + proto.DISABLED_CLASSNAME = 'disabled'; + + /** + * The class name applied to dynamic tabs while loading. + * @property LOADING_CLASSNAME + * @type String + * @default "disabled" + */ + proto.LOADING_CLASSNAME = 'loading'; + + /** + * Provides a reference to the connection request object when data is + * loaded dynamically. + * @property dataConnection + * @type Object + */ + proto.dataConnection = null; + + /** + * Object containing success and failure callbacks for loading data. + * @property loadHandler + * @type object + */ + proto.loadHandler = null; + + /** + * Provides a readable name for the tab. + * @method toString + * @return String + */ + proto.toString = function() { + var el = this.get('element'); + var id = el.id || el.tagName; + return "Tab " + id; + }; + + /** + * setAttributeConfigs TabView specific properties. + * @method initAttributes + * @param {Object} attr Hash of initial attributes + */ + proto.initAttributes = function(attr) { + attr = attr || {}; + Tab.superclass.initAttributes.call(this, attr); + + var el = this.get('element'); + + /** + * The event that triggers the tab's activation. + * @config activationEvent + * @type String + */ + this.setAttributeConfig('activationEvent', { + value: attr.activationEvent || 'click' + }); + + /** + * The element that contains the tab's label. + * @config labelEl + * @type HTMLElement + */ + this.setAttributeConfig('labelEl', { + value: attr.labelEl || _getlabelEl.call(this), + method: function(value) { + var current = this.get('labelEl'); + + if (current) { + if (current == value) { + return false; // already set + } + + this.replaceChild(value, current); + } else if (el.firstChild) { // ensure label is firstChild by default + this.insertBefore(value, el.firstChild); + } else { + this.appendChild(value); + } + } + }); + + /** + * The tab's label text (or innerHTML). + * @config label + * @type String + */ + this.setAttributeConfig('label', { + value: attr.label || _getLabel.call(this), + method: function(value) { + var labelEl = this.get('labelEl'); + if (!labelEl) { // create if needed + this.set('labelEl', _createlabelEl.call(this)); + } + + _setLabel.call(this, value); + } + }); + + /** + * The HTMLElement that contains the tab's content. + * @config contentEl + * @type HTMLElement + */ + this.setAttributeConfig('contentEl', { + value: attr.contentEl || document.createElement('div'), + method: function(value) { + var current = this.get('contentEl'); + + if (current) { + if (current == value) { + return false; // already set + } + this.replaceChild(value, current); + } + } + }); + + /** + * The tab's content. + * @config content + * @type String + */ + this.setAttributeConfig('content', { + value: attr.content, + method: function(value) { + this.get('contentEl').innerHTML = value; + } + }); + + var _dataLoaded = false; + + /** + * The tab's data source, used for loading content dynamically. + * @config dataSrc + * @type String + */ + this.setAttributeConfig('dataSrc', { + value: attr.dataSrc + }); + + /** + * Whether or not content should be reloaded for every view. + * @config cacheData + * @type Boolean + * @default false + */ + this.setAttributeConfig('cacheData', { + value: attr.cacheData || false, + validator: YAHOO.lang.isBoolean + }); + + /** + * The method to use for the data request. + * @config loadMethod + * @type String + * @default "GET" + */ + this.setAttributeConfig('loadMethod', { + value: attr.loadMethod || 'GET', + validator: YAHOO.lang.isString + }); + + /** + * Whether or not any data has been loaded from the server. + * @config dataLoaded + * @type Boolean + */ + this.setAttributeConfig('dataLoaded', { + value: false, + validator: YAHOO.lang.isBoolean, + writeOnce: true + }); + + /** + * Number if milliseconds before aborting and calling failure handler. + * @config dataTimeout + * @type Number + * @default null + */ + this.setAttributeConfig('dataTimeout', { + value: attr.dataTimeout || null, + validator: YAHOO.lang.isNumber + }); + + /** + * Whether or not the tab is currently active. + * If a dataSrc is set for the tab, the content will be loaded from + * the given source. + * @config active + * @type Boolean + */ + this.setAttributeConfig('active', { + value: attr.active || this.hasClass(this.ACTIVE_CLASSNAME), + method: function(value) { + if (value === true) { + this.addClass(this.ACTIVE_CLASSNAME); + this.set('title', 'active'); + } else { + this.removeClass(this.ACTIVE_CLASSNAME); + this.set('title', ''); + } + }, + validator: function(value) { + return YAHOO.lang.isBoolean(value) && !this.get('disabled') ; + } + }); + + /** + * Whether or not the tab is disabled. + * @config disabled + * @type Boolean + */ + this.setAttributeConfig('disabled', { + value: attr.disabled || this.hasClass(this.DISABLED_CLASSNAME), + method: function(value) { + if (value === true) { + Dom.addClass(this.get('element'), this.DISABLED_CLASSNAME); + } else { + Dom.removeClass(this.get('element'), this.DISABLED_CLASSNAME); + } + }, + validator: YAHOO.lang.isBoolean + }); + + /** + * The href of the tab's anchor element. + * @config href + * @type String + * @default '#' + */ + this.setAttributeConfig('href', { + value: attr.href || '#', + method: function(value) { + this.getElementsByTagName('a')[0].href = value; + }, + validator: YAHOO.lang.isString + }); + + /** + * The Whether or not the tab's content is visible. + * @config contentVisible + * @type Boolean + * @default false + */ + this.setAttributeConfig('contentVisible', { + value: attr.contentVisible, + method: function(value) { + if (value) { + this.get('contentEl').style.display = 'block'; + + if ( this.get('dataSrc') ) { + // load dynamic content unless already loaded and caching + if ( !this.get('dataLoaded') || !this.get('cacheData') ) { + _dataConnect.call(this); + } + } + } else { + this.get('contentEl').style.display = 'none'; + } + }, + validator: YAHOO.lang.isBoolean + }); + }; + + var _createTabElement = function(attr) { + var el = document.createElement('li'); + var a = document.createElement('a'); + + a.href = attr.href || '#'; + + el.appendChild(a); + + var label = attr.label || null; + var labelEl = attr.labelEl || null; + + if (labelEl) { // user supplied labelEl + if (!label) { // user supplied label + label = _getLabel.call(this, labelEl); + } + } else { + labelEl = _createlabelEl.call(this); + } + + a.appendChild(labelEl); + + return el; + }; + + var _getlabelEl = function() { + return this.getElementsByTagName(this.LABEL_TAGNAME)[0]; + }; + + var _createlabelEl = function() { + var el = document.createElement(this.LABEL_TAGNAME); + return el; + }; + + var _setLabel = function(label) { + var el = this.get('labelEl'); + el.innerHTML = label; + }; + + var _getLabel = function() { + var label, + el = this.get('labelEl'); + + if (!el) { + return undefined; + } + + return el.innerHTML; + }; + + var _dataConnect = function() { + if (!YAHOO.util.Connect) { + return false; + } + + Dom.addClass(this.get('contentEl').parentNode, this.LOADING_CLASSNAME); + + this.dataConnection = YAHOO.util.Connect.asyncRequest( + this.get('loadMethod'), + this.get('dataSrc'), + { + success: function(o) { + this.loadHandler.success.call(this, o); + this.set('dataLoaded', true); + this.dataConnection = null; + Dom.removeClass(this.get('contentEl').parentNode, + this.LOADING_CLASSNAME); + }, + failure: function(o) { + this.loadHandler.failure.call(this, o); + this.dataConnection = null; + Dom.removeClass(this.get('contentEl').parentNode, + this.LOADING_CLASSNAME); + }, + scope: this, + timeout: this.get('dataTimeout') + } + ); + }; + + YAHOO.widget.Tab = Tab; + + /** + * Fires before the active state is changed. + *

    See: Element.addListener

    + *

    If handler returns false, the change will be cancelled, and the value will not + * be set.

    + *

    Event fields:
    + * <String> type beforeActiveChange
    + * <Boolean> + * prevValue the current value
    + * <Boolean> + * newValue the new value

    + *

    Usage:
    + * var handler = function(e) {var previous = e.prevValue};
    + * myTabs.addListener('beforeActiveChange', handler);

    + * @event beforeActiveChange + */ + + /** + * Fires after the active state is changed. + *

    See: Element.addListener

    + *

    Event fields:
    + * <String> type activeChange
    + * <Boolean> + * prevValue the previous value
    + * <Boolean> + * newValue the updated value

    + *

    Usage:
    + * var handler = function(e) {var previous = e.prevValue};
    + * myTabs.addListener('activeChange', handler);

    + * @event activeChange + */ + + /** + * Fires before the tab label is changed. + *

    See: Element.addListener

    + *

    If handler returns false, the change will be cancelled, and the value will not + * be set.

    + *

    Event fields:
    + * <String> type beforeLabelChange
    + * <String> + * prevValue the current value
    + * <String> + * newValue the new value

    + *

    Usage:
    + * var handler = function(e) {var previous = e.prevValue};
    + * myTabs.addListener('beforeLabelChange', handler);

    + * @event beforeLabelChange + */ + + /** + * Fires after the tab label is changed. + *

    See: Element.addListener

    + *

    Event fields:
    + * <String> type labelChange
    + * <String> + * prevValue the previous value
    + * <String> + * newValue the updated value

    + *

    Usage:
    + * var handler = function(e) {var previous = e.prevValue};
    + * myTabs.addListener('labelChange', handler);

    + * @event labelChange + */ + + /** + * Fires before the tab content is changed. + *

    See: Element.addListener

    + *

    If handler returns false, the change will be cancelled, and the value will not + * be set.

    + *

    Event fields:
    + * <String> type beforeContentChange
    + * <String> + * prevValue the current value
    + * <String> + * newValue the new value

    + *

    Usage:
    + * var handler = function(e) {var previous = e.prevValue};
    + * myTabs.addListener('beforeContentChange', handler);

    + * @event beforeContentChange + */ + + /** + * Fires after the tab content is changed. + *

    See: Element.addListener

    + *

    Event fields:
    + * <String> type contentChange
    + * <String> + * prevValue the previous value
    + * <Boolean> + * newValue the updated value

    + *

    Usage:
    + * var handler = function(e) {var previous = e.prevValue};
    + * myTabs.addListener('contentChange', handler);

    + * @event contentChange + */ +})(); + +YAHOO.register("tabview", YAHOO.widget.TabView, {version: "2.2.0", build: "127"}); diff --git a/interface/ispconfig/interface/js/yui/treeview/README b/interface/ispconfig/interface/js/yui/treeview/README new file mode 100644 index 0000000000000000000000000000000000000000..6b24d39ee9494838d3b06adde6cd3a6a7b9c8395 --- /dev/null +++ b/interface/ispconfig/interface/js/yui/treeview/README @@ -0,0 +1,147 @@ +TreeView - Release Notes + +2.2.0 + + * Node::insertAfter properly nulls the nextSibling attribute when the + inserted before the firstChild. + + * MenuNodes inserted at the root level will no longer lose the menu behavior. + + * TextNode::setUpLabel sets the data.label property as well as the label property. + + * TaskNode example: made the logger optional, and moved the creation of the logger + instance to the proper location. + + * TaskNodes added to a node that is in a fully selected state will update the + parent to a partially selected state. + + * TaskNode example fixed to propagate the labelClick event + + +0.12.2 + + * removeChildren will now work properly on the root node. + +0.12.1 + + * Added custom events for expandComplete and collapseComplete. These events are + needed in situations where the implementer needs to resize or reposition + something based on the new offset. + + * Added a "nowrap" property to Node, and set the default to false. Specifies + whether or not the content area of the node should be allowed to wrap + naturally. + + * Added additional HTML elements to preserve the tree presentation when constrained + by a parent element. + +0.12.0 + + * TreeView now augments EventProvider, and has custom events for expand, + collapse, animStart, animComplete, and labelClick. Existing implementations + using abstract methods for these events (if they exist) will still work. + New events can be plugged into the tree by the Node implementation. For + example, TaskNode adds a checkClick event. EventProvider makes it safe + to do this because implementing code can call subscribe() prior to the + event creation. + + * YAHOO.util.Event is now a requirement for the widget + + * TreeView::removeChildren no longer expands and collapses the node. + + * Documented the moveComplete property + + * createElement("DIV") changed to createElement("div") + +0.11.4 + + * Fixed a javascript error on the HTML node example page. + +0.11.3 + + * popNode now clears the tree, previousSibling, nextSibling, and parent + properties of the node that is being removed from the tree. + + * Fixed the paths to the images in the tree.css file that is included in + build/assets. + +0.11.0 + + * Added TreeView -> popNode, which differs from removeNode in that the + node's children are preserved so the entire branch can be re-inserted + into another part of the tree, or another tree. + + * Added TreeView -> getNodesByProperty, which differs from + getNodeByProperty by returning an array of all nodes that have the + specified property rather than just the first one. + + * Added Node -> insertBefore, insertAfter, and appendTo. These method + can be used to reorganize the tree. + + * removeChildren properly resets the node icon when executed against a + collpased node. + + * Moved depth assignment from the constructor to appendChild so that the + value is set properly if the node is moved within the tree. + + * Fixed broken loop in removeChildren. + + * RootNode -> loadComplete calls tree.draw for hot-wiring the dynamic load + feature for the top level nodes. + + * The treeview constructor will accept an element instead of an id. + +0.10.0 + + * If the child collection changes prior to a refresh(), the icon is now + changed appropriately. + + * Added TreeView removeChildren(node). This will recursively purge the node's + children, and reset its dynamic load state. + + * previousSibling and nextSibling are now adjusted correctly when a + node is deleted. + + * expand()/collapse() now will not expand/collapse the node if false is + returned from the onExpand/onCollapse event handlers. + + * The onExpand and onCollapse events now fire before the node is expanded + or collapsed so that the implementer can modify the node's child collection + prior to display. + + * The childrenRendered property previous was used to indicate both that + a dynamically loaded node has received its data, and also to indicate + that the children html has been created. This has been split into + two properties. dynamicLoadComplete and childrenRendered. + + * Implemented the renderHidden flag. If set to true, the html for the entire + tree will be created when tree.draw() is called, not just the html for the + visible nodes. + + * Added an onLabelClick listener to TextNode + + * TreeView.removeNode no longer automatically refreshes the tree. It has an + optional parameter to perform the refresh. + + * removeNode can now be executed on nodes that have not been rendered. + + * You can now delete top-level nodes. + + * Added onCheckClick listener to the TaskNode example + + * Added Node.iconMode, which is a property that configures the way + dynamically loaded nodes are displayed when they are expanded and contain + no children. + + * TreeView/Node.setDynamicLoad now accepts an optional second parameter to + set the iconMode property. + + * Fixed an issue in the TaskNode.js example that prevented setting the checked + state of a node through the constructor. + + * Fixed an issue in HTMLNode that caused rendering issues when hasIcon was + set to true. + + * Added TreeView.removeNode + + * Added Node.refresh diff --git a/interface/ispconfig/interface/js/yui/treeview/assets/lm.gif b/interface/ispconfig/interface/js/yui/treeview/assets/lm.gif new file mode 100644 index 0000000000000000000000000000000000000000..e7d0a3ce92eb825a95ca188133567cd4f8f31499 Binary files /dev/null and b/interface/ispconfig/interface/js/yui/treeview/assets/lm.gif differ diff --git a/interface/ispconfig/interface/js/yui/treeview/assets/lmh.gif b/interface/ispconfig/interface/js/yui/treeview/assets/lmh.gif new file mode 100644 index 0000000000000000000000000000000000000000..3ff6302723f154dfea4f21bfcd754097d491f51b Binary files /dev/null and b/interface/ispconfig/interface/js/yui/treeview/assets/lmh.gif differ diff --git a/interface/ispconfig/interface/js/yui/treeview/assets/ln.gif b/interface/ispconfig/interface/js/yui/treeview/assets/ln.gif new file mode 100644 index 0000000000000000000000000000000000000000..b7b3e55cd044af047e571b8e46d99dd4b801ee60 Binary files /dev/null and b/interface/ispconfig/interface/js/yui/treeview/assets/ln.gif differ diff --git a/interface/ispconfig/interface/js/yui/treeview/assets/loading.gif b/interface/ispconfig/interface/js/yui/treeview/assets/loading.gif new file mode 100644 index 0000000000000000000000000000000000000000..0bbf3bc0c0e5e635553e8d1bf9ceddefbc402396 Binary files /dev/null and b/interface/ispconfig/interface/js/yui/treeview/assets/loading.gif differ diff --git a/interface/ispconfig/interface/js/yui/treeview/assets/lp.gif b/interface/ispconfig/interface/js/yui/treeview/assets/lp.gif new file mode 100644 index 0000000000000000000000000000000000000000..b87f003154502f8e9f569fefb12d57a5a1ebb515 Binary files /dev/null and b/interface/ispconfig/interface/js/yui/treeview/assets/lp.gif differ diff --git a/interface/ispconfig/interface/js/yui/treeview/assets/lph.gif b/interface/ispconfig/interface/js/yui/treeview/assets/lph.gif new file mode 100644 index 0000000000000000000000000000000000000000..e3478d8e37dadeba8c9d68c84ad29c3b2843a69b Binary files /dev/null and b/interface/ispconfig/interface/js/yui/treeview/assets/lph.gif differ diff --git a/interface/ispconfig/interface/js/yui/treeview/assets/tm.gif b/interface/ispconfig/interface/js/yui/treeview/assets/tm.gif new file mode 100644 index 0000000000000000000000000000000000000000..e30abad8900c51fd87ac22beaafb50abb77f884a Binary files /dev/null and b/interface/ispconfig/interface/js/yui/treeview/assets/tm.gif differ diff --git a/interface/ispconfig/interface/js/yui/treeview/assets/tmh.gif b/interface/ispconfig/interface/js/yui/treeview/assets/tmh.gif new file mode 100644 index 0000000000000000000000000000000000000000..ad7e5579378d80b7e89b647d7955844984ae3390 Binary files /dev/null and b/interface/ispconfig/interface/js/yui/treeview/assets/tmh.gif differ diff --git a/interface/ispconfig/interface/js/yui/treeview/assets/tn.gif b/interface/ispconfig/interface/js/yui/treeview/assets/tn.gif new file mode 100644 index 0000000000000000000000000000000000000000..4a280397de0ae7564f625d9356204a1cb6a1f399 Binary files /dev/null and b/interface/ispconfig/interface/js/yui/treeview/assets/tn.gif differ diff --git a/interface/ispconfig/interface/js/yui/treeview/assets/tp.gif b/interface/ispconfig/interface/js/yui/treeview/assets/tp.gif new file mode 100644 index 0000000000000000000000000000000000000000..d6d0ed0aed40f3a5ab43dcea1ed5e0ad67e76304 Binary files /dev/null and b/interface/ispconfig/interface/js/yui/treeview/assets/tp.gif differ diff --git a/interface/ispconfig/interface/js/yui/treeview/assets/tph.gif b/interface/ispconfig/interface/js/yui/treeview/assets/tph.gif new file mode 100644 index 0000000000000000000000000000000000000000..e4d7d991e44f0ebbe5f05ec261eb831d96332a4e Binary files /dev/null and b/interface/ispconfig/interface/js/yui/treeview/assets/tph.gif differ diff --git a/interface/ispconfig/interface/js/yui/treeview/assets/tree.css b/interface/ispconfig/interface/js/yui/treeview/assets/tree.css new file mode 100644 index 0000000000000000000000000000000000000000..afd444d78c6dbc277a0e31e77e2674d52196358d --- /dev/null +++ b/interface/ispconfig/interface/js/yui/treeview/assets/tree.css @@ -0,0 +1,102 @@ +/* +Copyright (c) 2007, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.2.0 +*/ +/* first or middle sibling, no children */ +.ygtvtn { + width:16px; height:22px; + background: url(tn.gif) 0 0 no-repeat; +} + +/* first or middle sibling, collapsable */ +.ygtvtm { + width:16px; height:22px; + cursor:pointer ; + background: url(tm.gif) 0 0 no-repeat; +} + +/* first or middle sibling, collapsable, hover */ +.ygtvtmh { + width:16px; height:22px; + cursor:pointer ; + background: url(tmh.gif) 0 0 no-repeat; +} + +/* first or middle sibling, expandable */ +.ygtvtp { + width:16px; height:22px; + cursor:pointer ; + background: url(tp.gif) 0 0 no-repeat; +} + +/* first or middle sibling, expandable, hover */ +.ygtvtph { + width:16px; height:22px; + cursor:pointer ; + background: url(tph.gif) 0 0 no-repeat; +} + +/* last sibling, no children */ +.ygtvln { + width:16px; height:22px; + background: url(ln.gif) 0 0 no-repeat; +} + +/* Last sibling, collapsable */ +.ygtvlm { + width:16px; height:22px; + cursor:pointer ; + background: url(lm.gif) 0 0 no-repeat; +} + +/* Last sibling, collapsable, hover */ +.ygtvlmh { + width:16px; height:22px; + cursor:pointer ; + background: url(lmh.gif) 0 0 no-repeat; +} + +/* Last sibling, expandable */ +.ygtvlp { + width:16px; height:22px; + cursor:pointer ; + background: url(lp.gif) 0 0 no-repeat; +} + +/* Last sibling, expandable, hover */ +.ygtvlph { + width:16px; height:22px; cursor:pointer ; + background: url(lph.gif) 0 0 no-repeat; +} + +/* Loading icon */ +.ygtvloading { + width:16px; height:22px; + background: url(loading.gif) 0 0 no-repeat; +} + +/* the style for the empty cells that are used for rendering the depth + * of the node */ +.ygtvdepthcell { + width:16px; height:22px; + background: url(vline.gif) 0 0 no-repeat; +} + +.ygtvblankdepthcell { width:16px; height:22px; } + +/* the style of the div around each node */ +.ygtvitem { } + +/* the style of the div around each node's collection of children */ +.ygtvchildren { } +* html .ygtvchildren { height:2%; } + +/* the style of the text label in ygTextNode */ +.ygtvlabel, .ygtvlabel:link, .ygtvlabel:visited, .ygtvlabel:hover { + margin-left:2px; + text-decoration: none; +} + +.ygtvspacer { height: 10px; width: 10px; margin: 2px; } diff --git a/interface/ispconfig/interface/js/yui/treeview/assets/vline.gif b/interface/ispconfig/interface/js/yui/treeview/assets/vline.gif new file mode 100644 index 0000000000000000000000000000000000000000..1fb0de8bb2911a51ff29f91fe7d231c0a5529091 Binary files /dev/null and b/interface/ispconfig/interface/js/yui/treeview/assets/vline.gif differ diff --git a/interface/ispconfig/interface/js/yui/treeview/treeview-debug.js b/interface/ispconfig/interface/js/yui/treeview/treeview-debug.js new file mode 100644 index 0000000000000000000000000000000000000000..1259a971d82f1a2700c4a6c2a30346eded24f9f8 --- /dev/null +++ b/interface/ispconfig/interface/js/yui/treeview/treeview-debug.js @@ -0,0 +1,2287 @@ +/* +Copyright (c) 2007, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.2.0 +*/ +/** + * The treeview widget is a generic tree building tool. + * @module treeview + * @title TreeView Widget + * @requires yahoo, event + * @optional animation + * @namespace YAHOO.widget + */ + +/** + * Contains the tree view state data and the root node. + * + * @class TreeView + * @uses YAHOO.util.EventProvider + * @constructor + * @param {string|HTMLElement} id The id of the element, or the element + * itself that the tree will be inserted into. + */ +YAHOO.widget.TreeView = function(id) { + if (id) { this.init(id); } +}; + +YAHOO.widget.TreeView.prototype = { + + /** + * The id of tree container element + * @property id + * @type String + */ + id: null, + + /** + * The host element for this tree + * @property _el + * @private + */ + _el: null, + + /** + * Flat collection of all nodes in this tree. This is a sparse + * array, so the length property can't be relied upon for a + * node count for the tree. + * @property _nodes + * @type Node[] + * @private + */ + _nodes: null, + + /** + * We lock the tree control while waiting for the dynamic loader to return + * @property locked + * @type boolean + */ + locked: false, + + /** + * The animation to use for expanding children, if any + * @property _expandAnim + * @type string + * @private + */ + _expandAnim: null, + + /** + * The animation to use for collapsing children, if any + * @property _collapseAnim + * @type string + * @private + */ + _collapseAnim: null, + + /** + * The current number of animations that are executing + * @property _animCount + * @type int + * @private + */ + _animCount: 0, + + /** + * The maximum number of animations to run at one time. + * @property maxAnim + * @type int + */ + maxAnim: 2, + + /** + * Sets up the animation for expanding children + * @method setExpandAnim + * @param {string} type the type of animation (acceptable values defined + * in YAHOO.widget.TVAnim) + */ + setExpandAnim: function(type) { + if (YAHOO.widget.TVAnim.isValid(type)) { + this._expandAnim = type; + } + }, + + /** + * Sets up the animation for collapsing children + * @method setCollapseAnim + * @param {string} the type of animation (acceptable values defined in + * YAHOO.widget.TVAnim) + */ + setCollapseAnim: function(type) { + if (YAHOO.widget.TVAnim.isValid(type)) { + this._collapseAnim = type; + } + }, + + /** + * Perform the expand animation if configured, or just show the + * element if not configured or too many animations are in progress + * @method animateExpand + * @param el {HTMLElement} the element to animate + * @param node {YAHOO.util.Node} the node that was expanded + * @return {boolean} true if animation could be invoked, false otherwise + */ + animateExpand: function(el, node) { + this.logger.log("animating expand"); + + if (this._expandAnim && this._animCount < this.maxAnim) { + // this.locked = true; + var tree = this; + var a = YAHOO.widget.TVAnim.getAnim(this._expandAnim, el, + function() { tree.expandComplete(node); }); + if (a) { + ++this._animCount; + this.fireEvent("animStart", { + "node": node, + "type": "expand" + }); + a.animate(); + } + + return true; + } + + return false; + }, + + /** + * Perform the collapse animation if configured, or just show the + * element if not configured or too many animations are in progress + * @method animateCollapse + * @param el {HTMLElement} the element to animate + * @param node {YAHOO.util.Node} the node that was expanded + * @return {boolean} true if animation could be invoked, false otherwise + */ + animateCollapse: function(el, node) { + this.logger.log("animating collapse"); + + if (this._collapseAnim && this._animCount < this.maxAnim) { + // this.locked = true; + var tree = this; + var a = YAHOO.widget.TVAnim.getAnim(this._collapseAnim, el, + function() { tree.collapseComplete(node); }); + if (a) { + ++this._animCount; + this.fireEvent("animStart", { + "node": node, + "type": "collapse" + }); + a.animate(); + } + + return true; + } + + return false; + }, + + /** + * Function executed when the expand animation completes + * @method expandComplete + */ + expandComplete: function(node) { + this.logger.log("expand complete: " + this.id); + --this._animCount; + this.fireEvent("animComplete", { + "node": node, + "type": "expand" + }); + // this.locked = false; + }, + + /** + * Function executed when the collapse animation completes + * @method collapseComplete + */ + collapseComplete: function(node) { + this.logger.log("collapse complete: " + this.id); + --this._animCount; + this.fireEvent("animComplete", { + "node": node, + "type": "collapse" + }); + // this.locked = false; + }, + + /** + * Initializes the tree + * @method init + * @parm {string|HTMLElement} id the id of the element that will hold the tree + * @private + */ + init: function(id) { + + this.id = id; + + if ("string" !== typeof id) { + this._el = id; + this.id = this.generateId(id); + } + + /** + * When animation is enabled, this event fires when the animation + * starts + * @event animStart + * @type CustomEvent + * @param {YAHOO.widget.Node} node the node that is expanding/collapsing + * @parm {String} type the type of animation ("expand" or "collapse") + */ + this.createEvent("animStart", this); + + /** + * When animation is enabled, this event fires when the animation + * completes + * @event animComplete + * @type CustomEvent + * @param {YAHOO.widget.Node} node the node that is expanding/collapsing + * @parm {String} type the type of animation ("expand" or "collapse") + */ + this.createEvent("animComplete", this); + + /** + * Fires when a node is going to be collapsed. Return false to stop + * the collapse. + * @event collapse + * @type CustomEvent + * @param {YAHOO.widget.Node} node the node that is collapsing + */ + this.createEvent("collapse", this); + + /** + * Fires after a node is successfully collapsed. This event will not fire + * if the "collapse" event was cancelled. + * @event collapseComplete + * @type CustomEvent + * @param {YAHOO.widget.Node} node the node that was collapsed + */ + this.createEvent("collapseComplete", this); + + /** + * Fires when a node is going to be expanded. Return false to stop + * the collapse. + * @event expand + * @type CustomEvent + * @param {YAHOO.widget.Node} node the node that is expanding + */ + this.createEvent("expand", this); + + /** + * Fires after a node is successfully expanded. This event will not fire + * if the "expand" event was cancelled. + * @event expandComplete + * @type CustomEvent + * @param {YAHOO.widget.Node} node the node that was expanded + */ + this.createEvent("expandComplete", this); + + this._nodes = []; + + // store a global reference + YAHOO.widget.TreeView.trees[this.id] = this; + + // Set up the root node + this.root = new YAHOO.widget.RootNode(this); + + this.logger = new YAHOO.widget.LogWriter(this.toString()); + + this.logger.log("tree init: " + this.id); + + //YAHOO.util.Event.onContentReady(this.id, this.handleAvailable, this, true); + YAHOO.util.Event.on(this.id, "click", this.handleClick, this, true); + }, + + + //handleAvailable: function() { + //var Event = YAHOO.util.Event; + //Event.on(this.id, + //}, + + /** + * Renders the tree boilerplate and visible nodes + * @method draw + */ + draw: function() { + var html = this.root.getHtml(); + this.getEl().innerHTML = html; + this.firstDraw = false; + }, + + /** + * Returns the tree's host element + * @method getEl + * @return {HTMLElement} the host element + */ + getEl: function() { + if (! this._el) { + this._el = document.getElementById(this.id); + } + return this._el; + }, + + /** + * Nodes register themselves with the tree instance when they are created. + * @method regNode + * @param node {Node} the node to register + * @private + */ + regNode: function(node) { + this._nodes[node.index] = node; + }, + + /** + * Returns the root node of this tree + * @method getRoot + * @return {Node} the root node + */ + getRoot: function() { + return this.root; + }, + + /** + * Configures this tree to dynamically load all child data + * @method setDynamicLoad + * @param {function} fnDataLoader the function that will be called to get the data + * @param iconMode {int} configures the icon that is displayed when a dynamic + * load node is expanded the first time without children. By default, the + * "collapse" icon will be used. If set to 1, the leaf node icon will be + * displayed. + */ + setDynamicLoad: function(fnDataLoader, iconMode) { + this.root.setDynamicLoad(fnDataLoader, iconMode); + }, + + /** + * Expands all child nodes. Note: this conflicts with the "multiExpand" + * node property. If expand all is called in a tree with nodes that + * do not allow multiple siblings to be displayed, only the last sibling + * will be expanded. + * @method expandAll + */ + expandAll: function() { + if (!this.locked) { + this.root.expandAll(); + } + }, + + /** + * Collapses all expanded child nodes in the entire tree. + * @method collapseAll + */ + collapseAll: function() { + if (!this.locked) { + this.root.collapseAll(); + } + }, + + /** + * Returns a node in the tree that has the specified index (this index + * is created internally, so this function probably will only be used + * in html generated for a given node.) + * @method getNodeByIndex + * @param {int} nodeIndex the index of the node wanted + * @return {Node} the node with index=nodeIndex, null if no match + */ + getNodeByIndex: function(nodeIndex) { + var n = this._nodes[nodeIndex]; + return (n) ? n : null; + }, + + /** + * Returns a node that has a matching property and value in the data + * object that was passed into its constructor. + * @method getNodeByProperty + * @param {object} property the property to search (usually a string) + * @param {object} value the value we want to find (usuall an int or string) + * @return {Node} the matching node, null if no match + */ + getNodeByProperty: function(property, value) { + for (var i in this._nodes) { + var n = this._nodes[i]; + if (n.data && value == n.data[property]) { + return n; + } + } + + return null; + }, + + /** + * Returns a collection of nodes that have a matching property + * and value in the data object that was passed into its constructor. + * @method getNodesByProperty + * @param {object} property the property to search (usually a string) + * @param {object} value the value we want to find (usuall an int or string) + * @return {Array} the matching collection of nodes, null if no match + */ + getNodesByProperty: function(property, value) { + var values = []; + for (var i in this._nodes) { + var n = this._nodes[i]; + if (n.data && value == n.data[property]) { + values.push(n); + } + } + + return (values.length) ? values : null; + }, + + /** + * Removes the node and its children, and optionally refreshes the + * branch of the tree that was affected. + * @method removeNode + * @param {Node} The node to remove + * @param {boolean} autoRefresh automatically refreshes branch if true + * @return {boolean} False is there was a problem, true otherwise. + */ + removeNode: function(node, autoRefresh) { + + // Don't delete the root node + if (node.isRoot()) { + return false; + } + + // Get the branch that we may need to refresh + var p = node.parent; + if (p.parent) { + p = p.parent; + } + + // Delete the node and its children + this._deleteNode(node); + + // Refresh the parent of the parent + if (autoRefresh && p && p.childrenRendered) { + p.refresh(); + } + + return true; + }, + + /** + * Deletes this nodes child collection, recursively. Also collapses + * the node, and resets the dynamic load flag. The primary use for + * this method is to purge a node and allow it to fetch its data + * dynamically again. + * @method removeChildren + * @param {Node} node the node to purge + */ + removeChildren: function(node) { + this.logger.log("Removing children for " + node); + while (node.children.length) { + this._deleteNode(node.children[0]); + } + + node.childrenRendered = false; + node.dynamicLoadComplete = false; + if (node.expanded) { + node.collapse(); + } else { + node.updateIcon(); + } + }, + + /** + * Deletes the node and recurses children + * @method _deleteNode + * @private + */ + _deleteNode: function(node) { + // Remove all the child nodes first + this.removeChildren(node); + + // Remove the node from the tree + this.popNode(node); + }, + + /** + * Removes the node from the tree, preserving the child collection + * to make it possible to insert the branch into another part of the + * tree, or another tree. + * @method popNode + * @param {Node} the node to remove + */ + popNode: function(node) { + var p = node.parent; + + // Update the parent's collection of children + var a = []; + + for (var i=0, len=p.children.length;i '; + } + + var f = document.createElement("div"); + var s = f.style; + s.position = "absolute"; + s.top = "-1000px"; + s.left = "-1000px"; + f.innerHTML = sb.join(""); + + document.body.appendChild(f); + + YAHOO.widget.TreeView.removeHandler(window, + "load", YAHOO.widget.TreeView.preload); + +}; + +YAHOO.widget.TreeView.addHandler(window, + "load", YAHOO.widget.TreeView.preload); + +/** + * The base class for all tree nodes. The node's presentation and behavior in + * response to mouse events is handled in Node subclasses. + * @namespace YAHOO.widget + * @class Node + * @uses YAHOO.util.EventProvider + * @param oData {object} a string or object containing the data that will + * be used to render this node + * @param oParent {Node} this node's parent node + * @param expanded {boolean} the initial expanded/collapsed state + * @constructor + */ +YAHOO.widget.Node = function(oData, oParent, expanded) { + if (oData) { this.init(oData, oParent, expanded); } +}; + +YAHOO.widget.Node.prototype = { + + /** + * The index for this instance obtained from global counter in YAHOO.widget.TreeView. + * @property index + * @type int + */ + index: 0, + + /** + * This node's child node collection. + * @property children + * @type Node[] + */ + children: null, + + /** + * Tree instance this node is part of + * @property tree + * @type TreeView + */ + tree: null, + + /** + * The data linked to this node. This can be any object or primitive + * value, and the data can be used in getNodeHtml(). + * @property data + * @type object + */ + data: null, + + /** + * Parent node + * @property parent + * @type Node + */ + parent: null, + + /** + * The depth of this node. We start at -1 for the root node. + * @property depth + * @type int + */ + depth: -1, + + /** + * The href for the node's label. If one is not specified, the href will + * be set so that it toggles the node. + * @property href + * @type string + */ + href: null, + + /** + * The label href target, defaults to current window + * @property target + * @type string + */ + target: "_self", + + /** + * The node's expanded/collapsed state + * @property expanded + * @type boolean + */ + expanded: false, + + /** + * Can multiple children be expanded at once? + * @property multiExpand + * @type boolean + */ + multiExpand: true, + + /** + * Should we render children for a collapsed node? It is possible that the + * implementer will want to render the hidden data... @todo verify that we + * need this, and implement it if we do. + * @property renderHidden + * @type boolean + */ + renderHidden: false, + + /** + * This flag is set to true when the html is generated for this node's + * children, and set to false when new children are added. + * @property childrenRendered + * @type boolean + */ + childrenRendered: false, + + /** + * Dynamically loaded nodes only fetch the data the first time they are + * expanded. This flag is set to true once the data has been fetched. + * @property dynamicLoadComplete + * @type boolean + */ + dynamicLoadComplete: false, + + /** + * This node's previous sibling + * @property previousSibling + * @type Node + */ + previousSibling: null, + + /** + * This node's next sibling + * @property nextSibling + * @type Node + */ + nextSibling: null, + + /** + * We can set the node up to call an external method to get the child + * data dynamically. + * @property _dynLoad + * @type boolean + * @private + */ + _dynLoad: false, + + /** + * Function to execute when we need to get this node's child data. + * @property dataLoader + * @type function + */ + dataLoader: null, + + /** + * This is true for dynamically loading nodes while waiting for the + * callback to return. + * @property isLoading + * @type boolean + */ + isLoading: false, + + /** + * The toggle/branch icon will not show if this is set to false. This + * could be useful if the implementer wants to have the child contain + * extra info about the parent, rather than an actual node. + * @property hasIcon + * @type boolean + */ + hasIcon: true, + + /** + * Used to configure what happens when a dynamic load node is expanded + * and we discover that it does not have children. By default, it is + * treated as if it still could have children (plus/minus icon). Set + * iconMode to have it display like a leaf node instead. + * @property iconMode + * @type int + */ + iconMode: 0, + + /** + * Specifies whether or not the content area of the node should be allowed + * to wrap. + * @property nowrap + * @type boolean + * @default true + */ + nowrap: false, + + /** + * The node type + * @property _type + * @private + */ + _type: "Node", + + /* + spacerPath: "http://us.i1.yimg.com/us.yimg.com/i/space.gif", + expandedText: "Expanded", + collapsedText: "Collapsed", + loadingText: "Loading", + */ + + /** + * Initializes this node, gets some of the properties from the parent + * @method init + * @param oData {object} a string or object containing the data that will + * be used to render this node + * @param oParent {Node} this node's parent node + * @param expanded {boolean} the initial expanded/collapsed state + */ + init: function(oData, oParent, expanded) { + + this.data = oData; + this.children = []; + this.index = YAHOO.widget.TreeView.nodeCount; + ++YAHOO.widget.TreeView.nodeCount; + this.expanded = expanded; + this.logger = new YAHOO.widget.LogWriter(this.toString()); + + /** + * The parentChange event is fired when a parent element is applied + * to the node. This is useful if you need to apply tree-level + * properties to a tree that need to happen if a node is moved from + * one tree to another. + * + * @event parentChange + * @type CustomEvent + */ + this.createEvent("parentChange", this); + + // oParent should never be null except when we create the root node. + if (oParent) { + oParent.appendChild(this); + } + }, + + /** + * Certain properties for the node cannot be set until the parent + * is known. This is called after the node is inserted into a tree. + * the parent is also applied to this node's children in order to + * make it possible to move a branch from one tree to another. + * @method applyParent + * @param {Node} parentNode this node's parent node + * @return {boolean} true if the application was successful + */ + applyParent: function(parentNode) { + if (!parentNode) { + return false; + } + + this.tree = parentNode.tree; + this.parent = parentNode; + this.depth = parentNode.depth + 1; + + if (!this.href) { + this.href = "javascript:" + this.getToggleLink(); + } + + // @todo why was this put here. This causes new nodes added at the + // root level to lose the menu behavior. + // if (! this.multiExpand) { + // this.multiExpand = parentNode.multiExpand; + // } + + this.tree.regNode(this); + parentNode.childrenRendered = false; + + // cascade update existing children + for (var i=0, len=this.children.length;i 0 || + (checkForLazyLoad && this.isDynamic() && !this.dynamicLoadComplete) ); + }, + + /** + * Expands if node is collapsed, collapses otherwise. + * @method toggle + */ + toggle: function() { + if (!this.tree.locked && ( this.hasChildren(true) || this.isDynamic()) ) { + if (this.expanded) { this.collapse(); } else { this.expand(); } + } + }, + + /** + * Returns the markup for this node and its children. + * @method getHtml + * @return {string} the markup for this node and its expanded children. + */ + getHtml: function() { + + this.childrenRendered = false; + + var sb = []; + sb[sb.length] = '
    '; + sb[sb.length] = this.getNodeHtml(); + sb[sb.length] = this.getChildrenHtml(); + sb[sb.length] = '
    '; + return sb.join(""); + }, + + /** + * Called when first rendering the tree. We always build the div that will + * contain this nodes children, but we don't render the children themselves + * unless this node is expanded. + * @method getChildrenHtml + * @return {string} the children container div html and any expanded children + * @private + */ + getChildrenHtml: function() { + + var sb = []; + sb[sb.length] = '
    = this.depth || depth < 0) { + this.logger.log("illegal getAncestor depth: " + depth); + return null; + } + + var p = this.parent; + + while (p.depth > depth) { + p = p.parent; + } + + return p; + }, + + /** + * Returns the css class for the spacer at the specified depth for + * this node. If this node's ancestor at the specified depth + * has a next sibling the presentation is different than if it + * does not have a next sibling + * @method getDepthStyle + * @param {int} depth the depth of the ancestor. + * @return {string} the css class for the spacer + */ + getDepthStyle: function(depth) { + return (this.getAncestor(depth).nextSibling) ? + "ygtvdepthcell" : "ygtvblankdepthcell"; + }, + + /** + * Get the markup for the node. This is designed to be overrided so that we can + * support different types of nodes. + * @method getNodeHtml + * @return {string} The HTML that will render this node. + */ + getNodeHtml: function() { + this.logger.log("Generating html"); + return ""; + }, + + /** + * Regenerates the html for this node and its children. To be used when the + * node is expanded and new children have been added. + * @method refresh + */ + refresh: function() { + // this.loadComplete(); + this.getChildrenEl().innerHTML = this.completeRender(); + + if (this.hasIcon) { + var el = this.getToggleEl(); + if (el) { + el.className = this.getStyle(); + } + } + }, + + /** + * Node toString + * @method toString + * @return {string} string representation of the node + */ + toString: function() { + return "Node (" + this.index + ")"; + } + +}; + +YAHOO.augment(YAHOO.widget.Node, YAHOO.util.EventProvider); + +/** + * The default node presentation. The first parameter should be + * either a string that will be used as the node's label, or an object + * that has a string propery called label. By default, the clicking the + * label will toggle the expanded/collapsed state of the node. By + * changing the href property of the instance, this behavior can be + * changed so that the label will go to the specified href. + * @namespace YAHOO.widget + * @class TextNode + * @extends YAHOO.widget.Node + * @constructor + * @param oData {object} a string or object containing the data that will + * be used to render this node + * @param oParent {YAHOO.widget.Node} this node's parent node + * @param expanded {boolean} the initial expanded/collapsed state + */ +YAHOO.widget.TextNode = function(oData, oParent, expanded) { + + if (oData) { + this.init(oData, oParent, expanded); + this.setUpLabel(oData); + } + + this.logger = new YAHOO.widget.LogWriter(this.toString()); +}; + +YAHOO.extend(YAHOO.widget.TextNode, YAHOO.widget.Node, { + + /** + * The CSS class for the label href. Defaults to ygtvlabel, but can be + * overridden to provide a custom presentation for a specific node. + * @property labelStyle + * @type string + */ + labelStyle: "ygtvlabel", + + /** + * The derived element id of the label for this node + * @property labelElId + * @type string + */ + labelElId: null, + + /** + * The text for the label. It is assumed that the oData parameter will + * either be a string that will be used as the label, or an object that + * has a property called "label" that we will use. + * @property label + * @type string + */ + label: null, + + textNodeParentChange: function() { + + /** + * Custom event that is fired when the text node label is clicked. The + * custom event is defined on the tree instance, so there is a single + * event that handles all nodes in the tree. The node clicked is + * provided as an argument + * + * @event labelClick + * @for YAHOO.widget.TreeView + * @param {YAHOO.widget.Node} node the node clicked + */ + if (this.tree && !this.tree.hasEvent("labelClick")) { + this.tree.createEvent("labelClick", this.tree); + } + + }, + + /** + * Sets up the node label + * @method setUpLabel + * @param oData string containing the label, or an object with a label property + */ + setUpLabel: function(oData) { + + // set up the custom event on the tree + this.textNodeParentChange(); + this.subscribe("parentChange", this.textNodeParentChange); + + if (typeof oData == "string") { + oData = { label: oData }; + } + this.label = oData.label; + this.data.label = oData.label; + + // update the link + if (oData.href) { + this.href = oData.href; + } + + // set the target + if (oData.target) { + this.target = oData.target; + } + + if (oData.style) { + this.labelStyle = oData.style; + } + + this.labelElId = "ygtvlabelel" + this.index; + }, + + /** + * Returns the label element + * @for YAHOO.widget.TextNode + * @method getLabelEl + * @return {object} the element + */ + getLabelEl: function() { + return document.getElementById(this.labelElId); + }, + + // overrides YAHOO.widget.Node + getNodeHtml: function() { + this.logger.log("Generating html"); + var sb = []; + + sb[sb.length] = ''; + sb[sb.length] = ''; + + for (var i=0;i '; + //sb[sb.length] = ''; + sb[sb.length] = ''; + } + + var getNode = 'YAHOO.widget.TreeView.getNode(\'' + + this.tree.id + '\',' + this.index + ')'; + + sb[sb.length] = ''; + + sb[sb.length] = '
    '; + + /* + sb[sb.length] = ' '; + sb[sb.length] = '
    '; + } + + if (this.hasIcon) { + sb[sb.length] = ' ';} +var f=document.createElement("div");var s=f.style;s.position="absolute";s.top="-1000px";s.left="-1000px";f.innerHTML=sb.join("");document.body.appendChild(f);YAHOO.widget.TreeView.removeHandler(window,"load",YAHOO.widget.TreeView.preload);};YAHOO.widget.TreeView.addHandler(window,"load",YAHOO.widget.TreeView.preload);YAHOO.widget.Node=function(oData,oParent,expanded){if(oData){this.init(oData,oParent,expanded);}};YAHOO.widget.Node.prototype={index:0,children:null,tree:null,data:null,parent:null,depth:-1,href:null,target:"_self",expanded:false,multiExpand:true,renderHidden:false,childrenRendered:false,dynamicLoadComplete:false,previousSibling:null,nextSibling:null,_dynLoad:false,dataLoader:null,isLoading:false,hasIcon:true,iconMode:0,nowrap:false,_type:"Node",init:function(oData,oParent,expanded){this.data=oData;this.children=[];this.index=YAHOO.widget.TreeView.nodeCount;++YAHOO.widget.TreeView.nodeCount;this.expanded=expanded;this.createEvent("parentChange",this);if(oParent){oParent.appendChild(this);}},applyParent:function(parentNode){if(!parentNode){return false;} +this.tree=parentNode.tree;this.parent=parentNode;this.depth=parentNode.depth+1;if(!this.href){this.href="javascript:"+this.getToggleLink();} +this.tree.regNode(this);parentNode.childrenRendered=false;for(var i=0,len=this.children.length;i0||(checkForLazyLoad&&this.isDynamic()&&!this.dynamicLoadComplete));},toggle:function(){if(!this.tree.locked&&(this.hasChildren(true)||this.isDynamic())){if(this.expanded){this.collapse();}else{this.expand();}}},getHtml:function(){this.childrenRendered=false;var sb=[];sb[sb.length]='
    ';sb[sb.length]=this.getNodeHtml();sb[sb.length]=this.getChildrenHtml();sb[sb.length]='
    ';return sb.join("");},getChildrenHtml:function(){var sb=[];sb[sb.length]='
    =this.depth||depth<0){return null;} +var p=this.parent;while(p.depth>depth){p=p.parent;} +return p;},getDepthStyle:function(depth){return(this.getAncestor(depth).nextSibling)?"ygtvdepthcell":"ygtvblankdepthcell";},getNodeHtml:function(){return"";},refresh:function(){this.getChildrenEl().innerHTML=this.completeRender();if(this.hasIcon){var el=this.getToggleEl();if(el){el.className=this.getStyle();}}},toString:function(){return"Node ("+this.index+")";}};YAHOO.augment(YAHOO.widget.Node,YAHOO.util.EventProvider);YAHOO.widget.TextNode=function(oData,oParent,expanded){if(oData){this.init(oData,oParent,expanded);this.setUpLabel(oData);}};YAHOO.extend(YAHOO.widget.TextNode,YAHOO.widget.Node,{labelStyle:"ygtvlabel",labelElId:null,label:null,textNodeParentChange:function(){if(this.tree&&!this.tree.hasEvent("labelClick")){this.tree.createEvent("labelClick",this.tree);}},setUpLabel:function(oData){this.textNodeParentChange();this.subscribe("parentChange",this.textNodeParentChange);if(typeof oData=="string"){oData={label:oData};} +this.label=oData.label;this.data.label=oData.label;if(oData.href){this.href=oData.href;} +if(oData.target){this.target=oData.target;} +if(oData.style){this.labelStyle=oData.style;} +this.labelElId="ygtvlabelel"+this.index;},getLabelEl:function(){return document.getElementById(this.labelElId);},getNodeHtml:function(){var sb=[];sb[sb.length]='
    ';sb[sb.length]='';for(var i=0;i
    ';} +var getNode='YAHOO.widget.TreeView.getNode(\''+ +this.tree.id+'\','+this.index+')';sb[sb.length]='';sb[sb.length]='
    ';sb[sb.length]='
    ';sb[sb.length]='';sb[sb.length]='
    ';sb[sb.length]='';sb[sb.length]='
    ';sb[sb.length]='
    ';return sb.join("");},onLabelClick:function(me){return me.tree.fireEvent("labelClick",me);},toString:function(){return"TextNode ("+this.index+") "+this.label;}});YAHOO.widget.RootNode=function(oTree){this.init(null,null,true);this.tree=oTree;};YAHOO.extend(YAHOO.widget.RootNode,YAHOO.widget.Node,{getNodeHtml:function(){return"";},toString:function(){return"RootNode";},loadComplete:function(){this.tree.draw();},collapse:function(){},expand:function(){}});YAHOO.widget.HTMLNode=function(oData,oParent,expanded,hasIcon){if(oData){this.init(oData,oParent,expanded);this.initContent(oData,hasIcon);}};YAHOO.extend(YAHOO.widget.HTMLNode,YAHOO.widget.Node,{contentStyle:"ygtvhtml",contentElId:null,content:null,initContent:function(oData,hasIcon){if(typeof oData=="string"){oData={html:oData};} +this.html=oData.html;this.contentElId="ygtvcontentel"+this.index;this.hasIcon=hasIcon;},getContentEl:function(){return document.getElementById(this.contentElId);},getNodeHtml:function(){var sb=[];sb[sb.length]='';sb[sb.length]='';for(var i=0;i
    ';} +if(this.hasIcon){sb[sb.length]='';sb[sb.length]='
    ';sb[sb.length]='
    ';return sb.join("");},toString:function(){return"HTMLNode ("+this.index+")";}});YAHOO.widget.MenuNode=function(oData,oParent,expanded){if(oData){this.init(oData,oParent,expanded);this.setUpLabel(oData);} +this.multiExpand=false;};YAHOO.extend(YAHOO.widget.MenuNode,YAHOO.widget.TextNode,{toString:function(){return"MenuNode ("+this.index+") "+this.label;}});YAHOO.widget.TVAnim=function(){return{FADE_IN:"TVFadeIn",FADE_OUT:"TVFadeOut",getAnim:function(type,el,callback){if(YAHOO.widget[type]){return new YAHOO.widget[type](el,callback);}else{return null;}},isValid:function(type){return(YAHOO.widget[type]);}};}();YAHOO.widget.TVFadeIn=function(el,callback){this.el=el;this.callback=callback;};YAHOO.widget.TVFadeIn.prototype={animate:function(){var tvanim=this;var s=this.el.style;s.opacity=0.1;s.filter="alpha(opacity=10)";s.display="";var dur=0.4;var a=new YAHOO.util.Anim(this.el,{opacity:{from:0.1,to:1,unit:""}},dur);a.onComplete.subscribe(function(){tvanim.onComplete();});a.animate();},onComplete:function(){this.callback();},toString:function(){return"TVFadeIn";}};YAHOO.widget.TVFadeOut=function(el,callback){this.el=el;this.callback=callback;};YAHOO.widget.TVFadeOut.prototype={animate:function(){var tvanim=this;var dur=0.4;var a=new YAHOO.util.Anim(this.el,{opacity:{from:1,to:0.1,unit:""}},dur);a.onComplete.subscribe(function(){tvanim.onComplete();});a.animate();},onComplete:function(){var s=this.el.style;s.display="none";s.filter="alpha(opacity=100)";this.callback();},toString:function(){return"TVFadeOut";}};YAHOO.register("treeview",YAHOO.widget.TreeView,{version:"2.2.0",build:"127"}); \ No newline at end of file diff --git a/interface/ispconfig/interface/js/yui/treeview/treeview.js b/interface/ispconfig/interface/js/yui/treeview/treeview.js new file mode 100644 index 0000000000000000000000000000000000000000..2551856e9ca82896e889a3ca371ea4f3fc0ded27 --- /dev/null +++ b/interface/ispconfig/interface/js/yui/treeview/treeview.js @@ -0,0 +1,2248 @@ +/* +Copyright (c) 2007, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.2.0 +*/ +/** + * The treeview widget is a generic tree building tool. + * @module treeview + * @title TreeView Widget + * @requires yahoo, event + * @optional animation + * @namespace YAHOO.widget + */ + +/** + * Contains the tree view state data and the root node. + * + * @class TreeView + * @uses YAHOO.util.EventProvider + * @constructor + * @param {string|HTMLElement} id The id of the element, or the element + * itself that the tree will be inserted into. + */ +YAHOO.widget.TreeView = function(id) { + if (id) { this.init(id); } +}; + +YAHOO.widget.TreeView.prototype = { + + /** + * The id of tree container element + * @property id + * @type String + */ + id: null, + + /** + * The host element for this tree + * @property _el + * @private + */ + _el: null, + + /** + * Flat collection of all nodes in this tree. This is a sparse + * array, so the length property can't be relied upon for a + * node count for the tree. + * @property _nodes + * @type Node[] + * @private + */ + _nodes: null, + + /** + * We lock the tree control while waiting for the dynamic loader to return + * @property locked + * @type boolean + */ + locked: false, + + /** + * The animation to use for expanding children, if any + * @property _expandAnim + * @type string + * @private + */ + _expandAnim: null, + + /** + * The animation to use for collapsing children, if any + * @property _collapseAnim + * @type string + * @private + */ + _collapseAnim: null, + + /** + * The current number of animations that are executing + * @property _animCount + * @type int + * @private + */ + _animCount: 0, + + /** + * The maximum number of animations to run at one time. + * @property maxAnim + * @type int + */ + maxAnim: 2, + + /** + * Sets up the animation for expanding children + * @method setExpandAnim + * @param {string} type the type of animation (acceptable values defined + * in YAHOO.widget.TVAnim) + */ + setExpandAnim: function(type) { + if (YAHOO.widget.TVAnim.isValid(type)) { + this._expandAnim = type; + } + }, + + /** + * Sets up the animation for collapsing children + * @method setCollapseAnim + * @param {string} the type of animation (acceptable values defined in + * YAHOO.widget.TVAnim) + */ + setCollapseAnim: function(type) { + if (YAHOO.widget.TVAnim.isValid(type)) { + this._collapseAnim = type; + } + }, + + /** + * Perform the expand animation if configured, or just show the + * element if not configured or too many animations are in progress + * @method animateExpand + * @param el {HTMLElement} the element to animate + * @param node {YAHOO.util.Node} the node that was expanded + * @return {boolean} true if animation could be invoked, false otherwise + */ + animateExpand: function(el, node) { + + if (this._expandAnim && this._animCount < this.maxAnim) { + // this.locked = true; + var tree = this; + var a = YAHOO.widget.TVAnim.getAnim(this._expandAnim, el, + function() { tree.expandComplete(node); }); + if (a) { + ++this._animCount; + this.fireEvent("animStart", { + "node": node, + "type": "expand" + }); + a.animate(); + } + + return true; + } + + return false; + }, + + /** + * Perform the collapse animation if configured, or just show the + * element if not configured or too many animations are in progress + * @method animateCollapse + * @param el {HTMLElement} the element to animate + * @param node {YAHOO.util.Node} the node that was expanded + * @return {boolean} true if animation could be invoked, false otherwise + */ + animateCollapse: function(el, node) { + + if (this._collapseAnim && this._animCount < this.maxAnim) { + // this.locked = true; + var tree = this; + var a = YAHOO.widget.TVAnim.getAnim(this._collapseAnim, el, + function() { tree.collapseComplete(node); }); + if (a) { + ++this._animCount; + this.fireEvent("animStart", { + "node": node, + "type": "collapse" + }); + a.animate(); + } + + return true; + } + + return false; + }, + + /** + * Function executed when the expand animation completes + * @method expandComplete + */ + expandComplete: function(node) { + --this._animCount; + this.fireEvent("animComplete", { + "node": node, + "type": "expand" + }); + // this.locked = false; + }, + + /** + * Function executed when the collapse animation completes + * @method collapseComplete + */ + collapseComplete: function(node) { + --this._animCount; + this.fireEvent("animComplete", { + "node": node, + "type": "collapse" + }); + // this.locked = false; + }, + + /** + * Initializes the tree + * @method init + * @parm {string|HTMLElement} id the id of the element that will hold the tree + * @private + */ + init: function(id) { + + this.id = id; + + if ("string" !== typeof id) { + this._el = id; + this.id = this.generateId(id); + } + + /** + * When animation is enabled, this event fires when the animation + * starts + * @event animStart + * @type CustomEvent + * @param {YAHOO.widget.Node} node the node that is expanding/collapsing + * @parm {String} type the type of animation ("expand" or "collapse") + */ + this.createEvent("animStart", this); + + /** + * When animation is enabled, this event fires when the animation + * completes + * @event animComplete + * @type CustomEvent + * @param {YAHOO.widget.Node} node the node that is expanding/collapsing + * @parm {String} type the type of animation ("expand" or "collapse") + */ + this.createEvent("animComplete", this); + + /** + * Fires when a node is going to be collapsed. Return false to stop + * the collapse. + * @event collapse + * @type CustomEvent + * @param {YAHOO.widget.Node} node the node that is collapsing + */ + this.createEvent("collapse", this); + + /** + * Fires after a node is successfully collapsed. This event will not fire + * if the "collapse" event was cancelled. + * @event collapseComplete + * @type CustomEvent + * @param {YAHOO.widget.Node} node the node that was collapsed + */ + this.createEvent("collapseComplete", this); + + /** + * Fires when a node is going to be expanded. Return false to stop + * the collapse. + * @event expand + * @type CustomEvent + * @param {YAHOO.widget.Node} node the node that is expanding + */ + this.createEvent("expand", this); + + /** + * Fires after a node is successfully expanded. This event will not fire + * if the "expand" event was cancelled. + * @event expandComplete + * @type CustomEvent + * @param {YAHOO.widget.Node} node the node that was expanded + */ + this.createEvent("expandComplete", this); + + this._nodes = []; + + // store a global reference + YAHOO.widget.TreeView.trees[this.id] = this; + + // Set up the root node + this.root = new YAHOO.widget.RootNode(this); + + + + //YAHOO.util.Event.onContentReady(this.id, this.handleAvailable, this, true); + YAHOO.util.Event.on(this.id, "click", this.handleClick, this, true); + }, + + + //handleAvailable: function() { + //var Event = YAHOO.util.Event; + //Event.on(this.id, + //}, + + /** + * Renders the tree boilerplate and visible nodes + * @method draw + */ + draw: function() { + var html = this.root.getHtml(); + this.getEl().innerHTML = html; + this.firstDraw = false; + }, + + /** + * Returns the tree's host element + * @method getEl + * @return {HTMLElement} the host element + */ + getEl: function() { + if (! this._el) { + this._el = document.getElementById(this.id); + } + return this._el; + }, + + /** + * Nodes register themselves with the tree instance when they are created. + * @method regNode + * @param node {Node} the node to register + * @private + */ + regNode: function(node) { + this._nodes[node.index] = node; + }, + + /** + * Returns the root node of this tree + * @method getRoot + * @return {Node} the root node + */ + getRoot: function() { + return this.root; + }, + + /** + * Configures this tree to dynamically load all child data + * @method setDynamicLoad + * @param {function} fnDataLoader the function that will be called to get the data + * @param iconMode {int} configures the icon that is displayed when a dynamic + * load node is expanded the first time without children. By default, the + * "collapse" icon will be used. If set to 1, the leaf node icon will be + * displayed. + */ + setDynamicLoad: function(fnDataLoader, iconMode) { + this.root.setDynamicLoad(fnDataLoader, iconMode); + }, + + /** + * Expands all child nodes. Note: this conflicts with the "multiExpand" + * node property. If expand all is called in a tree with nodes that + * do not allow multiple siblings to be displayed, only the last sibling + * will be expanded. + * @method expandAll + */ + expandAll: function() { + if (!this.locked) { + this.root.expandAll(); + } + }, + + /** + * Collapses all expanded child nodes in the entire tree. + * @method collapseAll + */ + collapseAll: function() { + if (!this.locked) { + this.root.collapseAll(); + } + }, + + /** + * Returns a node in the tree that has the specified index (this index + * is created internally, so this function probably will only be used + * in html generated for a given node.) + * @method getNodeByIndex + * @param {int} nodeIndex the index of the node wanted + * @return {Node} the node with index=nodeIndex, null if no match + */ + getNodeByIndex: function(nodeIndex) { + var n = this._nodes[nodeIndex]; + return (n) ? n : null; + }, + + /** + * Returns a node that has a matching property and value in the data + * object that was passed into its constructor. + * @method getNodeByProperty + * @param {object} property the property to search (usually a string) + * @param {object} value the value we want to find (usuall an int or string) + * @return {Node} the matching node, null if no match + */ + getNodeByProperty: function(property, value) { + for (var i in this._nodes) { + var n = this._nodes[i]; + if (n.data && value == n.data[property]) { + return n; + } + } + + return null; + }, + + /** + * Returns a collection of nodes that have a matching property + * and value in the data object that was passed into its constructor. + * @method getNodesByProperty + * @param {object} property the property to search (usually a string) + * @param {object} value the value we want to find (usuall an int or string) + * @return {Array} the matching collection of nodes, null if no match + */ + getNodesByProperty: function(property, value) { + var values = []; + for (var i in this._nodes) { + var n = this._nodes[i]; + if (n.data && value == n.data[property]) { + values.push(n); + } + } + + return (values.length) ? values : null; + }, + + /** + * Removes the node and its children, and optionally refreshes the + * branch of the tree that was affected. + * @method removeNode + * @param {Node} The node to remove + * @param {boolean} autoRefresh automatically refreshes branch if true + * @return {boolean} False is there was a problem, true otherwise. + */ + removeNode: function(node, autoRefresh) { + + // Don't delete the root node + if (node.isRoot()) { + return false; + } + + // Get the branch that we may need to refresh + var p = node.parent; + if (p.parent) { + p = p.parent; + } + + // Delete the node and its children + this._deleteNode(node); + + // Refresh the parent of the parent + if (autoRefresh && p && p.childrenRendered) { + p.refresh(); + } + + return true; + }, + + /** + * Deletes this nodes child collection, recursively. Also collapses + * the node, and resets the dynamic load flag. The primary use for + * this method is to purge a node and allow it to fetch its data + * dynamically again. + * @method removeChildren + * @param {Node} node the node to purge + */ + removeChildren: function(node) { + while (node.children.length) { + this._deleteNode(node.children[0]); + } + + node.childrenRendered = false; + node.dynamicLoadComplete = false; + if (node.expanded) { + node.collapse(); + } else { + node.updateIcon(); + } + }, + + /** + * Deletes the node and recurses children + * @method _deleteNode + * @private + */ + _deleteNode: function(node) { + // Remove all the child nodes first + this.removeChildren(node); + + // Remove the node from the tree + this.popNode(node); + }, + + /** + * Removes the node from the tree, preserving the child collection + * to make it possible to insert the branch into another part of the + * tree, or another tree. + * @method popNode + * @param {Node} the node to remove + */ + popNode: function(node) { + var p = node.parent; + + // Update the parent's collection of children + var a = []; + + for (var i=0, len=p.children.length;i '; + } + + var f = document.createElement("div"); + var s = f.style; + s.position = "absolute"; + s.top = "-1000px"; + s.left = "-1000px"; + f.innerHTML = sb.join(""); + + document.body.appendChild(f); + + YAHOO.widget.TreeView.removeHandler(window, + "load", YAHOO.widget.TreeView.preload); + +}; + +YAHOO.widget.TreeView.addHandler(window, + "load", YAHOO.widget.TreeView.preload); + +/** + * The base class for all tree nodes. The node's presentation and behavior in + * response to mouse events is handled in Node subclasses. + * @namespace YAHOO.widget + * @class Node + * @uses YAHOO.util.EventProvider + * @param oData {object} a string or object containing the data that will + * be used to render this node + * @param oParent {Node} this node's parent node + * @param expanded {boolean} the initial expanded/collapsed state + * @constructor + */ +YAHOO.widget.Node = function(oData, oParent, expanded) { + if (oData) { this.init(oData, oParent, expanded); } +}; + +YAHOO.widget.Node.prototype = { + + /** + * The index for this instance obtained from global counter in YAHOO.widget.TreeView. + * @property index + * @type int + */ + index: 0, + + /** + * This node's child node collection. + * @property children + * @type Node[] + */ + children: null, + + /** + * Tree instance this node is part of + * @property tree + * @type TreeView + */ + tree: null, + + /** + * The data linked to this node. This can be any object or primitive + * value, and the data can be used in getNodeHtml(). + * @property data + * @type object + */ + data: null, + + /** + * Parent node + * @property parent + * @type Node + */ + parent: null, + + /** + * The depth of this node. We start at -1 for the root node. + * @property depth + * @type int + */ + depth: -1, + + /** + * The href for the node's label. If one is not specified, the href will + * be set so that it toggles the node. + * @property href + * @type string + */ + href: null, + + /** + * The label href target, defaults to current window + * @property target + * @type string + */ + target: "_self", + + /** + * The node's expanded/collapsed state + * @property expanded + * @type boolean + */ + expanded: false, + + /** + * Can multiple children be expanded at once? + * @property multiExpand + * @type boolean + */ + multiExpand: true, + + /** + * Should we render children for a collapsed node? It is possible that the + * implementer will want to render the hidden data... @todo verify that we + * need this, and implement it if we do. + * @property renderHidden + * @type boolean + */ + renderHidden: false, + + /** + * This flag is set to true when the html is generated for this node's + * children, and set to false when new children are added. + * @property childrenRendered + * @type boolean + */ + childrenRendered: false, + + /** + * Dynamically loaded nodes only fetch the data the first time they are + * expanded. This flag is set to true once the data has been fetched. + * @property dynamicLoadComplete + * @type boolean + */ + dynamicLoadComplete: false, + + /** + * This node's previous sibling + * @property previousSibling + * @type Node + */ + previousSibling: null, + + /** + * This node's next sibling + * @property nextSibling + * @type Node + */ + nextSibling: null, + + /** + * We can set the node up to call an external method to get the child + * data dynamically. + * @property _dynLoad + * @type boolean + * @private + */ + _dynLoad: false, + + /** + * Function to execute when we need to get this node's child data. + * @property dataLoader + * @type function + */ + dataLoader: null, + + /** + * This is true for dynamically loading nodes while waiting for the + * callback to return. + * @property isLoading + * @type boolean + */ + isLoading: false, + + /** + * The toggle/branch icon will not show if this is set to false. This + * could be useful if the implementer wants to have the child contain + * extra info about the parent, rather than an actual node. + * @property hasIcon + * @type boolean + */ + hasIcon: true, + + /** + * Used to configure what happens when a dynamic load node is expanded + * and we discover that it does not have children. By default, it is + * treated as if it still could have children (plus/minus icon). Set + * iconMode to have it display like a leaf node instead. + * @property iconMode + * @type int + */ + iconMode: 0, + + /** + * Specifies whether or not the content area of the node should be allowed + * to wrap. + * @property nowrap + * @type boolean + * @default true + */ + nowrap: false, + + /** + * The node type + * @property _type + * @private + */ + _type: "Node", + + /* + spacerPath: "http://us.i1.yimg.com/us.yimg.com/i/space.gif", + expandedText: "Expanded", + collapsedText: "Collapsed", + loadingText: "Loading", + */ + + /** + * Initializes this node, gets some of the properties from the parent + * @method init + * @param oData {object} a string or object containing the data that will + * be used to render this node + * @param oParent {Node} this node's parent node + * @param expanded {boolean} the initial expanded/collapsed state + */ + init: function(oData, oParent, expanded) { + + this.data = oData; + this.children = []; + this.index = YAHOO.widget.TreeView.nodeCount; + ++YAHOO.widget.TreeView.nodeCount; + this.expanded = expanded; + + /** + * The parentChange event is fired when a parent element is applied + * to the node. This is useful if you need to apply tree-level + * properties to a tree that need to happen if a node is moved from + * one tree to another. + * + * @event parentChange + * @type CustomEvent + */ + this.createEvent("parentChange", this); + + // oParent should never be null except when we create the root node. + if (oParent) { + oParent.appendChild(this); + } + }, + + /** + * Certain properties for the node cannot be set until the parent + * is known. This is called after the node is inserted into a tree. + * the parent is also applied to this node's children in order to + * make it possible to move a branch from one tree to another. + * @method applyParent + * @param {Node} parentNode this node's parent node + * @return {boolean} true if the application was successful + */ + applyParent: function(parentNode) { + if (!parentNode) { + return false; + } + + this.tree = parentNode.tree; + this.parent = parentNode; + this.depth = parentNode.depth + 1; + + if (!this.href) { + this.href = "javascript:" + this.getToggleLink(); + } + + // @todo why was this put here. This causes new nodes added at the + // root level to lose the menu behavior. + // if (! this.multiExpand) { + // this.multiExpand = parentNode.multiExpand; + // } + + this.tree.regNode(this); + parentNode.childrenRendered = false; + + // cascade update existing children + for (var i=0, len=this.children.length;i 0 || + (checkForLazyLoad && this.isDynamic() && !this.dynamicLoadComplete) ); + }, + + /** + * Expands if node is collapsed, collapses otherwise. + * @method toggle + */ + toggle: function() { + if (!this.tree.locked && ( this.hasChildren(true) || this.isDynamic()) ) { + if (this.expanded) { this.collapse(); } else { this.expand(); } + } + }, + + /** + * Returns the markup for this node and its children. + * @method getHtml + * @return {string} the markup for this node and its expanded children. + */ + getHtml: function() { + + this.childrenRendered = false; + + var sb = []; + sb[sb.length] = '
    '; + sb[sb.length] = this.getNodeHtml(); + sb[sb.length] = this.getChildrenHtml(); + sb[sb.length] = '
    '; + return sb.join(""); + }, + + /** + * Called when first rendering the tree. We always build the div that will + * contain this nodes children, but we don't render the children themselves + * unless this node is expanded. + * @method getChildrenHtml + * @return {string} the children container div html and any expanded children + * @private + */ + getChildrenHtml: function() { + + var sb = []; + sb[sb.length] = '
    = this.depth || depth < 0) { + return null; + } + + var p = this.parent; + + while (p.depth > depth) { + p = p.parent; + } + + return p; + }, + + /** + * Returns the css class for the spacer at the specified depth for + * this node. If this node's ancestor at the specified depth + * has a next sibling the presentation is different than if it + * does not have a next sibling + * @method getDepthStyle + * @param {int} depth the depth of the ancestor. + * @return {string} the css class for the spacer + */ + getDepthStyle: function(depth) { + return (this.getAncestor(depth).nextSibling) ? + "ygtvdepthcell" : "ygtvblankdepthcell"; + }, + + /** + * Get the markup for the node. This is designed to be overrided so that we can + * support different types of nodes. + * @method getNodeHtml + * @return {string} The HTML that will render this node. + */ + getNodeHtml: function() { + return ""; + }, + + /** + * Regenerates the html for this node and its children. To be used when the + * node is expanded and new children have been added. + * @method refresh + */ + refresh: function() { + // this.loadComplete(); + this.getChildrenEl().innerHTML = this.completeRender(); + + if (this.hasIcon) { + var el = this.getToggleEl(); + if (el) { + el.className = this.getStyle(); + } + } + }, + + /** + * Node toString + * @method toString + * @return {string} string representation of the node + */ + toString: function() { + return "Node (" + this.index + ")"; + } + +}; + +YAHOO.augment(YAHOO.widget.Node, YAHOO.util.EventProvider); + +/** + * The default node presentation. The first parameter should be + * either a string that will be used as the node's label, or an object + * that has a string propery called label. By default, the clicking the + * label will toggle the expanded/collapsed state of the node. By + * changing the href property of the instance, this behavior can be + * changed so that the label will go to the specified href. + * @namespace YAHOO.widget + * @class TextNode + * @extends YAHOO.widget.Node + * @constructor + * @param oData {object} a string or object containing the data that will + * be used to render this node + * @param oParent {YAHOO.widget.Node} this node's parent node + * @param expanded {boolean} the initial expanded/collapsed state + */ +YAHOO.widget.TextNode = function(oData, oParent, expanded) { + + if (oData) { + this.init(oData, oParent, expanded); + this.setUpLabel(oData); + } + +}; + +YAHOO.extend(YAHOO.widget.TextNode, YAHOO.widget.Node, { + + /** + * The CSS class for the label href. Defaults to ygtvlabel, but can be + * overridden to provide a custom presentation for a specific node. + * @property labelStyle + * @type string + */ + labelStyle: "ygtvlabel", + + /** + * The derived element id of the label for this node + * @property labelElId + * @type string + */ + labelElId: null, + + /** + * The text for the label. It is assumed that the oData parameter will + * either be a string that will be used as the label, or an object that + * has a property called "label" that we will use. + * @property label + * @type string + */ + label: null, + + textNodeParentChange: function() { + + /** + * Custom event that is fired when the text node label is clicked. The + * custom event is defined on the tree instance, so there is a single + * event that handles all nodes in the tree. The node clicked is + * provided as an argument + * + * @event labelClick + * @for YAHOO.widget.TreeView + * @param {YAHOO.widget.Node} node the node clicked + */ + if (this.tree && !this.tree.hasEvent("labelClick")) { + this.tree.createEvent("labelClick", this.tree); + } + + }, + + /** + * Sets up the node label + * @method setUpLabel + * @param oData string containing the label, or an object with a label property + */ + setUpLabel: function(oData) { + + // set up the custom event on the tree + this.textNodeParentChange(); + this.subscribe("parentChange", this.textNodeParentChange); + + if (typeof oData == "string") { + oData = { label: oData }; + } + this.label = oData.label; + this.data.label = oData.label; + + // update the link + if (oData.href) { + this.href = oData.href; + } + + // set the target + if (oData.target) { + this.target = oData.target; + } + + if (oData.style) { + this.labelStyle = oData.style; + } + + this.labelElId = "ygtvlabelel" + this.index; + }, + + /** + * Returns the label element + * @for YAHOO.widget.TextNode + * @method getLabelEl + * @return {object} the element + */ + getLabelEl: function() { + return document.getElementById(this.labelElId); + }, + + // overrides YAHOO.widget.Node + getNodeHtml: function() { + var sb = []; + + sb[sb.length] = ''; + sb[sb.length] = ''; + + for (var i=0;i '; + //sb[sb.length] = ''; + sb[sb.length] = ''; + } + + var getNode = 'YAHOO.widget.TreeView.getNode(\'' + + this.tree.id + '\',' + this.index + ')'; + + sb[sb.length] = ''; + + sb[sb.length] = '
    '; + + /* + sb[sb.length] = ' '; + sb[sb.length] = '
    '; + } + + if (this.hasIcon) { + sb[sb.length] = '-1){return true;}else{return YAHOO.lang.isObject(obj)&&obj.constructor==Array;}},isBoolean:function(obj){return typeof obj=='boolean';},isFunction:function(obj){return typeof obj=='function';},isNull:function(obj){return obj===null;},isNumber:function(obj){return typeof obj=='number'&&isFinite(obj);},isObject:function(obj){return typeof obj=='object'||YAHOO.lang.isFunction(obj);},isString:function(obj){return typeof obj=='string';},isUndefined:function(obj){return typeof obj=='undefined';},hasOwnProperty:function(obj,prop){if(Object.prototype.hasOwnProperty){return obj.hasOwnProperty(prop);} +return!YAHOO.lang.isUndefined(obj[prop])&&obj.constructor.prototype[prop]!==obj[prop];},extend:function(subc,superc,overrides){var F=function(){};F.prototype=superc.prototype;subc.prototype=new F();subc.prototype.constructor=subc;subc.superclass=superc.prototype;if(superc.prototype.constructor==Object.prototype.constructor){superc.prototype.constructor=superc;} +if(overrides){for(var i in overrides){subc.prototype[i]=overrides[i];}}},augment:function(r,s){var rp=r.prototype,sp=s.prototype,a=arguments,i,p;if(a[2]){for(i=2;i-1),isSafari=(ua.indexOf('safari')>-1),isGecko=(!isOpera&&!isSafari&&ua.indexOf('gecko')>-1),isIE=(!isOpera&&ua.indexOf('msie')>-1);var patterns={HYPHEN:/(-[a-z])/i};var toCamel=function(property){if(!patterns.HYPHEN.test(property)){return property;} +if(propertyCache[property]){return propertyCache[property];} +while(patterns.HYPHEN.exec(property)){property=property.replace(RegExp.$1,RegExp.$1.substr(1).toUpperCase());} +propertyCache[property]=property;return property;};if(document.defaultView&&document.defaultView.getComputedStyle){getStyle=function(el,property){var value=null;var computed=document.defaultView.getComputedStyle(el,'');if(computed){value=computed[toCamel(property)];} +return el.style[property]||value;};}else if(document.documentElement.currentStyle&&isIE){getStyle=function(el,property){switch(toCamel(property)){case'opacity':var val=100;try{val=el.filters['DXImageTransform.Microsoft.Alpha'].opacity;}catch(e){try{val=el.filters('alpha').opacity;}catch(e){}} +return val/100;break;default:var value=el.currentStyle?el.currentStyle[property]:null;return(el.style[property]||value);}};}else{getStyle=function(el,property){return el.style[property];};} +if(isIE){setStyle=function(el,property,val){switch(property){case'opacity':if(typeof el.style.filter=='string'){el.style.filter='alpha(opacity='+val*100+')';if(!el.currentStyle||!el.currentStyle.hasLayout){el.style.zoom=1;}} +break;default:el.style[property]=val;}};}else{setStyle=function(el,property,val){el.style[property]=val;};} +YAHOO.util.Dom={get:function(el){if(!el){return null;} +if(typeof el!='string'&&!(el instanceof Array)){return el;} +if(typeof el=='string'){return document.getElementById(el);} +else{var collection=[];for(var i=0,len=el.length;i=this.left&®ion.right<=this.right&®ion.top>=this.top&®ion.bottom<=this.bottom);};YAHOO.util.Region.prototype.getArea=function(){return((this.bottom-this.top)*(this.right-this.left));};YAHOO.util.Region.prototype.intersect=function(region){var t=Math.max(this.top,region.top);var r=Math.min(this.right,region.right);var b=Math.min(this.bottom,region.bottom);var l=Math.max(this.left,region.left);if(b>=t&&r>=l){return new YAHOO.util.Region(t,r,b,l);}else{return null;}};YAHOO.util.Region.prototype.union=function(region){var t=Math.min(this.top,region.top);var r=Math.max(this.right,region.right);var b=Math.max(this.bottom,region.bottom);var l=Math.min(this.left,region.left);return new YAHOO.util.Region(t,r,b,l);};YAHOO.util.Region.prototype.toString=function(){return("Region {"+"top: "+this.top+", right: "+this.right+", bottom: "+this.bottom+", left: "+this.left+"}");};YAHOO.util.Region.getRegion=function(el){var p=YAHOO.util.Dom.getXY(el);var t=p[1];var r=p[0]+el.offsetWidth;var b=p[1]+el.offsetHeight;var l=p[0];return new YAHOO.util.Region(t,r,b,l);};YAHOO.util.Point=function(x,y){if(x instanceof Array){y=x[1];x=x[0];} +this.x=this.right=this.left=this[0]=x;this.y=this.top=this.bottom=this[1]=y;};YAHOO.util.Point.prototype=new YAHOO.util.Region();YAHOO.register("dom",YAHOO.util.Dom,{version:"2.2.0",build:"127"}); +if(!YAHOO.util.Event){YAHOO.util.Event=function(){var loadComplete=false;var listeners=[];var unloadListeners=[];var legacyEvents=[];var legacyHandlers=[];var retryCount=0;var onAvailStack=[];var legacyMap=[];var counter=0;var lastError=null;return{POLL_RETRYS:200,POLL_INTERVAL:20,EL:0,TYPE:1,FN:2,WFN:3,OBJ:3,ADJ_SCOPE:4,isSafari:(/KHTML/gi).test(navigator.userAgent),webkit:function(){var v=navigator.userAgent.match(/AppleWebKit\/([^ ]*)/);if(v&&v[1]){return v[1];} +return null;}(),isIE:(!this.webkit&&!navigator.userAgent.match(/opera/gi)&&navigator.userAgent.match(/msie/gi)),_interval:null,startInterval:function(){if(!this._interval){var self=this;var callback=function(){self._tryPreloadAttach();};this._interval=setInterval(callback,this.POLL_INTERVAL);}},onAvailable:function(p_id,p_fn,p_obj,p_override){onAvailStack.push({id:p_id,fn:p_fn,obj:p_obj,override:p_override,checkReady:false});retryCount=this.POLL_RETRYS;this.startInterval();},onContentReady:function(p_id,p_fn,p_obj,p_override){onAvailStack.push({id:p_id,fn:p_fn,obj:p_obj,override:p_override,checkReady:true});retryCount=this.POLL_RETRYS;this.startInterval();},addListener:function(el,sType,fn,obj,override){if(!fn||!fn.call){return false;} +if(this._isValidCollection(el)){var ok=true;for(var i=0,len=el.length;i=0){cacheItem=listeners[index];} +if(!el||!cacheItem){return false;} +if(this.useLegacyEvent(el,sType)){var legacyIndex=this.getLegacyIndex(el,sType);var llist=legacyHandlers[legacyIndex];if(llist){for(i=0,len=llist.length;i0);} +var notAvail=[];for(var i=0,len=onAvailStack.length;i0){for(var i=0,len=searchList.length;i0){j=listeners.length;while(j){index=j-1;l=listeners[index];if(l){EU.removeListener(l[EU.EL],l[EU.TYPE],l[EU.FN],index);} +j=j-1;} +l=null;EU.clearCache();} +for(i=0,len=legacyEvents.length;i0){param=args[0];} +ret=s.fn.call(scope,param,s.obj);}else{ret=s.fn.call(scope,this.type,args,s.obj);} +if(false===ret){if(!this.silent){} +return false;}}} +return true;},unsubscribeAll:function(){for(var i=0,len=this.subscribers.length;i=200&&httpStatus<300){responseObject=this.createResponseObject(o,callback.argument);if(callback.success){if(!callback.scope){callback.success(responseObject);} +else{callback.success.apply(callback.scope,[responseObject]);}}} +else{switch(httpStatus){case 12002:case 12029:case 12030:case 12031:case 12152:case 13030:responseObject=this.createExceptionObject(o.tId,callback.argument,(isAbort?isAbort:false));if(callback.failure){if(!callback.scope){callback.failure(responseObject);} +else{callback.failure.apply(callback.scope,[responseObject]);}} +break;default:responseObject=this.createResponseObject(o,callback.argument);if(callback.failure){if(!callback.scope){callback.failure(responseObject);} +else{callback.failure.apply(callback.scope,[responseObject]);}}}} +this.releaseObject(o);responseObject=null;},createResponseObject:function(o,callbackArg) +{var obj={};var headerObj={};try +{var headerStr=o.conn.getAllResponseHeaders();var header=headerStr.split('\n');for(var i=0;i');if(typeof secureUri=='boolean'){io.src='javascript:false';} +else if(typeof secureURI=='string'){io.src=secureUri;}} +else{var io=document.createElement('iframe');io.id=frameId;io.name=frameId;} +io.style.position='absolute';io.style.top='-1000px';io.style.left='-1000px';document.body.appendChild(io);},appendPostData:function(postData) +{var formElements=[];var postMessage=postData.split('&');for(var i=0;i0){for(var i=0;i0)?val:0;} +YAHOO.util.Dom.setStyle(this.getEl(),attr,val+unit);},getAttribute:function(attr){var el=this.getEl();var val=YAHOO.util.Dom.getStyle(el,attr);if(val!=='auto'&&!this.patterns.offsetUnit.test(val)){return parseFloat(val);} +var a=this.patterns.offsetAttribute.exec(attr)||[];var pos=!!(a[3]);var box=!!(a[2]);if(box||(YAHOO.util.Dom.getStyle(el,'position')=='absolute'&&pos)){val=el['offset'+a[0].charAt(0).toUpperCase()+a[0].substr(1)];}else{val=0;} +return val;},getDefaultUnit:function(attr){if(this.patterns.defaultUnit.test(attr)){return'px';} +return'';},setRuntimeAttribute:function(attr){var start;var end;var attributes=this.attributes;this.runtimeAttributes[attr]={};var isset=function(prop){return(typeof prop!=='undefined');};if(!isset(attributes[attr]['to'])&&!isset(attributes[attr]['by'])){return false;} +start=(isset(attributes[attr]['from']))?attributes[attr]['from']:this.getAttribute(attr);if(isset(attributes[attr]['to'])){end=attributes[attr]['to'];}else if(isset(attributes[attr]['by'])){if(start.constructor==Array){end=[];for(var i=0,len=start.length;i0&&isFinite(tweak)){if(tween.currentFrame+tweak>=frames){tweak=frames-(frame+1);} +tween.currentFrame+=tweak;}};};YAHOO.util.Bezier=new function(){this.getPosition=function(points,t){var n=points.length;var tmp=[];for(var i=0;i0&&!(control[0]instanceof Array)){control=[control];}else{var tmp=[];for(i=0,len=control.length;i0){this.runtimeAttributes[attr]=this.runtimeAttributes[attr].concat(control);} +this.runtimeAttributes[attr][this.runtimeAttributes[attr].length]=end;} +else{superclass.setRuntimeAttribute.call(this,attr);}};var translateValues=function(val,start){var pageXY=Y.Dom.getXY(this.getEl());val=[val[0]-pageXY[0]+start[0],val[1]-pageXY[1]+start[1]];return val;};var isset=function(prop){return(typeof prop!=='undefined');};})();(function(){YAHOO.util.Scroll=function(el,attributes,duration,method){if(el){YAHOO.util.Scroll.superclass.constructor.call(this,el,attributes,duration,method);}};YAHOO.extend(YAHOO.util.Scroll,YAHOO.util.ColorAnim);var Y=YAHOO.util;var superclass=Y.Scroll.superclass;var proto=Y.Scroll.prototype;proto.toString=function(){var el=this.getEl();var id=el.id||el.tagName;return("Scroll "+id);};proto.doMethod=function(attr,start,end){var val=null;if(attr=='scroll'){val=[this.method(this.currentFrame,start[0],end[0]-start[0],this.totalFrames),this.method(this.currentFrame,start[1],end[1]-start[1],this.totalFrames)];}else{val=superclass.doMethod.call(this,attr,start,end);} +return val;};proto.getAttribute=function(attr){var val=null;var el=this.getEl();if(attr=='scroll'){val=[el.scrollLeft,el.scrollTop];}else{val=superclass.getAttribute.call(this,attr);} +return val;};proto.setAttribute=function(attr,val,unit){var el=this.getEl();if(attr=='scroll'){el.scrollLeft=val[0];el.scrollTop=val[1];}else{superclass.setAttribute.call(this,attr,val,unit);}};})();YAHOO.register("animation",YAHOO.util.Anim,{version:"2.2.0",build:"127"}); +if(!YAHOO.util.DragDropMgr){YAHOO.util.DragDropMgr=function(){var Event=YAHOO.util.Event;return{ids:{},handleIds:{},dragCurrent:null,dragOvers:{},deltaX:0,deltaY:0,preventDefault:true,stopPropagation:true,initalized:false,locked:false,init:function(){this.initialized=true;},POINT:0,INTERSECT:1,STRICT_INTERSECT:2,mode:0,_execOnAll:function(sMethod,args){for(var i in this.ids){for(var j in this.ids[i]){var oDD=this.ids[i][j];if(!this.isTypeOfDD(oDD)){continue;} +oDD[sMethod].apply(oDD,args);}}},_onLoad:function(){this.init();Event.on(document,"mouseup",this.handleMouseUp,this,true);Event.on(document,"mousemove",this.handleMouseMove,this,true);Event.on(window,"unload",this._onUnload,this,true);Event.on(window,"resize",this._onResize,this,true);},_onResize:function(e){this._execOnAll("resetConstraints",[]);},lock:function(){this.locked=true;},unlock:function(){this.locked=false;},isLocked:function(){return this.locked;},locationCache:{},useCache:true,clickPixelThresh:3,clickTimeThresh:1000,dragThreshMet:false,clickTimeout:null,startX:0,startY:0,regDragDrop:function(oDD,sGroup){if(!this.initialized){this.init();} +if(!this.ids[sGroup]){this.ids[sGroup]={};} +this.ids[sGroup][oDD.id]=oDD;},removeDDFromGroup:function(oDD,sGroup){if(!this.ids[sGroup]){this.ids[sGroup]={};} +var obj=this.ids[sGroup];if(obj&&obj[oDD.id]){delete obj[oDD.id];}},_remove:function(oDD){for(var g in oDD.groups){if(g&&this.ids[g][oDD.id]){delete this.ids[g][oDD.id];}} +delete this.handleIds[oDD.id];},regHandle:function(sDDId,sHandleId){if(!this.handleIds[sDDId]){this.handleIds[sDDId]={};} +this.handleIds[sDDId][sHandleId]=sHandleId;},isDragDrop:function(id){return(this.getDDById(id))?true:false;},getRelated:function(p_oDD,bTargetsOnly){var oDDs=[];for(var i in p_oDD.groups){for(j in this.ids[i]){var dd=this.ids[i][j];if(!this.isTypeOfDD(dd)){continue;} +if(!bTargetsOnly||dd.isTarget){oDDs[oDDs.length]=dd;}}} +return oDDs;},isLegalTarget:function(oDD,oTargetDD){var targets=this.getRelated(oDD,true);for(var i=0,len=targets.length;ithis.clickPixelThresh||diffY>this.clickPixelThresh){this.startDrag(this.startX,this.startY);}} +if(this.dragThreshMet){this.dragCurrent.b4Drag(e);this.dragCurrent.onDrag(e);this.fireEvents(e,false);} +this.stopEvent(e);return true;},fireEvents:function(e,isDrop){var dc=this.dragCurrent;if(!dc||dc.isLocked()){return;} +var x=YAHOO.util.Event.getPageX(e);var y=YAHOO.util.Event.getPageY(e);var pt=new YAHOO.util.Point(x,y);var oldOvers=[];var outEvts=[];var overEvts=[];var dropEvts=[];var enterEvts=[];for(var i in this.dragOvers){var ddo=this.dragOvers[i];if(!this.isTypeOfDD(ddo)){continue;} +if(!this.isOverTarget(pt,ddo,this.mode)){outEvts.push(ddo);} +oldOvers[i]=true;delete this.dragOvers[i];} +for(var sGroup in dc.groups){if("string"!=typeof sGroup){continue;} +for(i in this.ids[sGroup]){var oDD=this.ids[sGroup][i];if(!this.isTypeOfDD(oDD)){continue;} +if(oDD.isTarget&&!oDD.isLocked()&&oDD!=dc){if(this.isOverTarget(pt,oDD,this.mode)){if(isDrop){dropEvts.push(oDD);}else{if(!oldOvers[oDD.id]){enterEvts.push(oDD);}else{overEvts.push(oDD);} +this.dragOvers[oDD.id]=oDD;}}}}} +if(this.mode){if(outEvts.length){dc.b4DragOut(e,outEvts);dc.onDragOut(e,outEvts);} +if(enterEvts.length){dc.onDragEnter(e,enterEvts);} +if(overEvts.length){dc.b4DragOver(e,overEvts);dc.onDragOver(e,overEvts);} +if(dropEvts.length){dc.b4DragDrop(e,dropEvts);dc.onDragDrop(e,dropEvts);}}else{var len=0;for(i=0,len=outEvts.length;i2000){}else{setTimeout(DDM._addListeners,10);if(document&&document.body){DDM._timeoutCount+=1;}}}},handleWasClicked:function(node,id){if(this.isHandle(id,node.id)){return true;}else{var p=node.parentNode;while(p){if(this.isHandle(id,p.id)){return true;}else{p=p.parentNode;}}} +return false;}};}();YAHOO.util.DDM=YAHOO.util.DragDropMgr;YAHOO.util.DDM._addListeners();} +(function(){var Event=YAHOO.util.Event;var Dom=YAHOO.util.Dom;YAHOO.util.DragDrop=function(id,sGroup,config){if(id){this.init(id,sGroup,config);}};YAHOO.util.DragDrop.prototype={id:null,config:null,dragElId:null,handleElId:null,invalidHandleTypes:null,invalidHandleIds:null,invalidHandleClasses:null,startPageX:0,startPageY:0,groups:null,locked:false,lock:function(){this.locked=true;},unlock:function(){this.locked=false;},isTarget:true,padding:null,_domRef:null,__ygDragDrop:true,constrainX:false,constrainY:false,minX:0,maxX:0,minY:0,maxY:0,maintainOffset:false,xTicks:null,yTicks:null,primaryButtonOnly:true,available:false,hasOuterHandles:false,b4StartDrag:function(x,y){},startDrag:function(x,y){},b4Drag:function(e){},onDrag:function(e){},onDragEnter:function(e,id){},b4DragOver:function(e){},onDragOver:function(e,id){},b4DragOut:function(e){},onDragOut:function(e,id){},b4DragDrop:function(e){},onDragDrop:function(e,id){},onInvalidDrop:function(e){},b4EndDrag:function(e){},endDrag:function(e){},b4MouseDown:function(e){},onMouseDown:function(e){},onMouseUp:function(e){},onAvailable:function(){},getEl:function(){if(!this._domRef){this._domRef=Dom.get(this.id);} +return this._domRef;},getDragEl:function(){return Dom.get(this.dragElId);},init:function(id,sGroup,config){this.initTarget(id,sGroup,config);Event.on(this.id,"mousedown",this.handleMouseDown,this,true);},initTarget:function(id,sGroup,config){this.config=config||{};this.DDM=YAHOO.util.DDM;this.groups={};if(typeof id!=="string"){id=Dom.generateId(id);} +this.id=id;this.addToGroup((sGroup)?sGroup:"default");this.handleElId=id;Event.onAvailable(id,this.handleOnAvailable,this,true);this.setDragElId(id);this.invalidHandleTypes={A:"A"};this.invalidHandleIds={};this.invalidHandleClasses=[];this.applyConfig();},applyConfig:function(){this.padding=this.config.padding||[0,0,0,0];this.isTarget=(this.config.isTarget!==false);this.maintainOffset=(this.config.maintainOffset);this.primaryButtonOnly=(this.config.primaryButtonOnly!==false);},handleOnAvailable:function(){this.available=true;this.resetConstraints();this.onAvailable();},setPadding:function(iTop,iRight,iBot,iLeft){if(!iRight&&0!==iRight){this.padding=[iTop,iTop,iTop,iTop];}else if(!iBot&&0!==iBot){this.padding=[iTop,iRight,iTop,iRight];}else{this.padding=[iTop,iRight,iBot,iLeft];}},setInitPosition:function(diffX,diffY){var el=this.getEl();if(!this.DDM.verifyEl(el)){return;} +var dx=diffX||0;var dy=diffY||0;var p=Dom.getXY(el);this.initPageX=p[0]-dx;this.initPageY=p[1]-dy;this.lastPageX=p[0];this.lastPageY=p[1];this.setStartPosition(p);},setStartPosition:function(pos){var p=pos||Dom.getXY(this.getEl());this.deltaSetXY=null;this.startPageX=p[0];this.startPageY=p[1];},addToGroup:function(sGroup){this.groups[sGroup]=true;this.DDM.regDragDrop(this,sGroup);},removeFromGroup:function(sGroup){if(this.groups[sGroup]){delete this.groups[sGroup];} +this.DDM.removeDDFromGroup(this,sGroup);},setDragElId:function(id){this.dragElId=id;},setHandleElId:function(id){if(typeof id!=="string"){id=Dom.generateId(id);} +this.handleElId=id;this.DDM.regHandle(this.id,id);},setOuterHandleElId:function(id){if(typeof id!=="string"){id=Dom.generateId(id);} +Event.on(id,"mousedown",this.handleMouseDown,this,true);this.setHandleElId(id);this.hasOuterHandles=true;},unreg:function(){Event.removeListener(this.id,"mousedown",this.handleMouseDown);this._domRef=null;this.DDM._remove(this);},isLocked:function(){return(this.DDM.isLocked()||this.locked);},handleMouseDown:function(e,oDD){var button=e.which||e.button;if(this.primaryButtonOnly&&button>1){return;} +if(this.isLocked()){return;} +this.b4MouseDown(e);this.onMouseDown(e);this.DDM.refreshCache(this.groups);var pt=new YAHOO.util.Point(Event.getPageX(e),Event.getPageY(e));if(!this.hasOuterHandles&&!this.DDM.isOverTarget(pt,this)){}else{if(this.clickValidator(e)){this.setStartPosition();this.DDM.handleMouseDown(e,this);this.DDM.stopEvent(e);}else{}}},clickValidator:function(e){var target=Event.getTarget(e);return(this.isValidHandleChild(target)&&(this.id==this.handleElId||this.DDM.handleWasClicked(target,this.id)));},addInvalidHandleType:function(tagName){var type=tagName.toUpperCase();this.invalidHandleTypes[type]=type;},addInvalidHandleId:function(id){if(typeof id!=="string"){id=Dom.generateId(id);} +this.invalidHandleIds[id]=id;},addInvalidHandleClass:function(cssClass){this.invalidHandleClasses.push(cssClass);},removeInvalidHandleType:function(tagName){var type=tagName.toUpperCase();delete this.invalidHandleTypes[type];},removeInvalidHandleId:function(id){if(typeof id!=="string"){id=Dom.generateId(id);} +delete this.invalidHandleIds[id];},removeInvalidHandleClass:function(cssClass){for(var i=0,len=this.invalidHandleClasses.length;i=this.minX;i=i-iTickSize){if(!tickMap[i]){this.xTicks[this.xTicks.length]=i;tickMap[i]=true;}} +for(i=this.initPageX;i<=this.maxX;i=i+iTickSize){if(!tickMap[i]){this.xTicks[this.xTicks.length]=i;tickMap[i]=true;}} +this.xTicks.sort(this.DDM.numericSort);},setYTicks:function(iStartY,iTickSize){this.yTicks=[];this.yTickSize=iTickSize;var tickMap={};for(var i=this.initPageY;i>=this.minY;i=i-iTickSize){if(!tickMap[i]){this.yTicks[this.yTicks.length]=i;tickMap[i]=true;}} +for(i=this.initPageY;i<=this.maxY;i=i+iTickSize){if(!tickMap[i]){this.yTicks[this.yTicks.length]=i;tickMap[i]=true;}} +this.yTicks.sort(this.DDM.numericSort);},setXConstraint:function(iLeft,iRight,iTickSize){this.leftConstraint=parseInt(iLeft,10);this.rightConstraint=parseInt(iRight,10);this.minX=this.initPageX-this.leftConstraint;this.maxX=this.initPageX+this.rightConstraint;if(iTickSize){this.setXTicks(this.initPageX,iTickSize);} +this.constrainX=true;},clearConstraints:function(){this.constrainX=false;this.constrainY=false;this.clearTicks();},clearTicks:function(){this.xTicks=null;this.yTicks=null;this.xTickSize=0;this.yTickSize=0;},setYConstraint:function(iUp,iDown,iTickSize){this.topConstraint=parseInt(iUp,10);this.bottomConstraint=parseInt(iDown,10);this.minY=this.initPageY-this.topConstraint;this.maxY=this.initPageY+this.bottomConstraint;if(iTickSize){this.setYTicks(this.initPageY,iTickSize);} +this.constrainY=true;},resetConstraints:function(){if(this.initPageX||this.initPageX===0){var dx=(this.maintainOffset)?this.lastPageX-this.initPageX:0;var dy=(this.maintainOffset)?this.lastPageY-this.initPageY:0;this.setInitPosition(dx,dy);}else{this.setInitPosition();} +if(this.constrainX){this.setXConstraint(this.leftConstraint,this.rightConstraint,this.xTickSize);} +if(this.constrainY){this.setYConstraint(this.topConstraint,this.bottomConstraint,this.yTickSize);}},getTick:function(val,tickArray){if(!tickArray){return val;}else if(tickArray[0]>=val){return tickArray[0];}else{for(var i=0,len=tickArray.length;i=val){var diff1=val-tickArray[i];var diff2=tickArray[next]-val;return(diff2>diff1)?tickArray[i]:tickArray[next];}} +return tickArray[tickArray.length-1];}},toString:function(){return("DragDrop "+this.id);}};})();YAHOO.util.DD=function(id,sGroup,config){if(id){this.init(id,sGroup,config);}};YAHOO.extend(YAHOO.util.DD,YAHOO.util.DragDrop,{scroll:true,autoOffset:function(iPageX,iPageY){var x=iPageX-this.startPageX;var y=iPageY-this.startPageY;this.setDelta(x,y);},setDelta:function(iDeltaX,iDeltaY){this.deltaX=iDeltaX;this.deltaY=iDeltaY;},setDragElPos:function(iPageX,iPageY){var el=this.getDragEl();this.alignElWithMouse(el,iPageX,iPageY);},alignElWithMouse:function(el,iPageX,iPageY){var oCoord=this.getTargetCoord(iPageX,iPageY);if(!this.deltaSetXY){var aCoord=[oCoord.x,oCoord.y];YAHOO.util.Dom.setXY(el,aCoord);var newLeft=parseInt(YAHOO.util.Dom.getStyle(el,"left"),10);var newTop=parseInt(YAHOO.util.Dom.getStyle(el,"top"),10);this.deltaSetXY=[newLeft-oCoord.x,newTop-oCoord.y];}else{YAHOO.util.Dom.setStyle(el,"left",(oCoord.x+this.deltaSetXY[0])+"px");YAHOO.util.Dom.setStyle(el,"top",(oCoord.y+this.deltaSetXY[1])+"px");} +this.cachePosition(oCoord.x,oCoord.y);this.autoScroll(oCoord.x,oCoord.y,el.offsetHeight,el.offsetWidth);},cachePosition:function(iPageX,iPageY){if(iPageX){this.lastPageX=iPageX;this.lastPageY=iPageY;}else{var aCoord=YAHOO.util.Dom.getXY(this.getEl());this.lastPageX=aCoord[0];this.lastPageY=aCoord[1];}},autoScroll:function(x,y,h,w){if(this.scroll){var clientH=this.DDM.getClientHeight();var clientW=this.DDM.getClientWidth();var st=this.DDM.getScrollTop();var sl=this.DDM.getScrollLeft();var bot=h+y;var right=w+x;var toBot=(clientH+st-y-this.deltaY);var toRight=(clientW+sl-x-this.deltaX);var thresh=40;var scrAmt=(document.all)?80:30;if(bot>clientH&&toBot0&&y-stclientW&&toRight0&&x-slthis.maxX){x=this.maxX;}} +if(this.constrainY){if(ythis.maxY){y=this.maxY;}} +x=this.getTick(x,this.xTicks);y=this.getTick(y,this.yTicks);return{x:x,y:y};},applyConfig:function(){YAHOO.util.DD.superclass.applyConfig.call(this);this.scroll=(this.config.scroll!==false);},b4MouseDown:function(e){this.setStartPosition();this.autoOffset(YAHOO.util.Event.getPageX(e),YAHOO.util.Event.getPageY(e));},b4Drag:function(e){this.setDragElPos(YAHOO.util.Event.getPageX(e),YAHOO.util.Event.getPageY(e));},toString:function(){return("DD "+this.id);}});YAHOO.util.DDProxy=function(id,sGroup,config){if(id){this.init(id,sGroup,config);this.initFrame();}};YAHOO.util.DDProxy.dragElId="ygddfdiv";YAHOO.extend(YAHOO.util.DDProxy,YAHOO.util.DD,{resizeFrame:true,centerFrame:false,createFrame:function(){var self=this;var body=document.body;if(!body||!body.firstChild){setTimeout(function(){self.createFrame();},50);return;} +var div=this.getDragEl();if(!div){div=document.createElement("div");div.id=this.dragElId;var s=div.style;s.position="absolute";s.visibility="hidden";s.cursor="move";s.border="2px solid #aaa";s.zIndex=999;body.insertBefore(div,body.firstChild);}},initFrame:function(){this.createFrame();},applyConfig:function(){YAHOO.util.DDProxy.superclass.applyConfig.call(this);this.resizeFrame=(this.config.resizeFrame!==false);this.centerFrame=(this.config.centerFrame);this.setDragElId(this.config.dragElId||YAHOO.util.DDProxy.dragElId);},showFrame:function(iPageX,iPageY){var el=this.getEl();var dragEl=this.getDragEl();var s=dragEl.style;this._resizeProxy();if(this.centerFrame){this.setDelta(Math.round(parseInt(s.width,10)/2),Math.round(parseInt(s.height,10)/2));} +this.setDragElPos(iPageX,iPageY);YAHOO.util.Dom.setStyle(dragEl,"visibility","visible");},_resizeProxy:function(){if(this.resizeFrame){var DOM=YAHOO.util.Dom;var el=this.getEl();var dragEl=this.getDragEl();var bt=parseInt(DOM.getStyle(dragEl,"borderTopWidth"),10);var br=parseInt(DOM.getStyle(dragEl,"borderRightWidth"),10);var bb=parseInt(DOM.getStyle(dragEl,"borderBottomWidth"),10);var bl=parseInt(DOM.getStyle(dragEl,"borderLeftWidth"),10);if(isNaN(bt)){bt=0;} +if(isNaN(br)){br=0;} +if(isNaN(bb)){bb=0;} +if(isNaN(bl)){bl=0;} +var newWidth=Math.max(0,el.offsetWidth-br-bl);var newHeight=Math.max(0,el.offsetHeight-bt-bb);DOM.setStyle(dragEl,"width",newWidth+"px");DOM.setStyle(dragEl,"height",newHeight+"px");}},b4MouseDown:function(e){this.setStartPosition();var x=YAHOO.util.Event.getPageX(e);var y=YAHOO.util.Event.getPageY(e);this.autoOffset(x,y);this.setDragElPos(x,y);},b4StartDrag:function(x,y){this.showFrame(x,y);},b4EndDrag:function(e){YAHOO.util.Dom.setStyle(this.getDragEl(),"visibility","hidden");},endDrag:function(e){var DOM=YAHOO.util.Dom;var lel=this.getEl();var del=this.getDragEl();DOM.setStyle(del,"visibility","");DOM.setStyle(lel,"visibility","hidden");YAHOO.util.DDM.moveToEl(lel,del);DOM.setStyle(del,"visibility","hidden");DOM.setStyle(lel,"visibility","");},toString:function(){return("DDProxy "+this.id);}});YAHOO.util.DDTarget=function(id,sGroup,config){if(id){this.initTarget(id,sGroup,config);}};YAHOO.extend(YAHOO.util.DDTarget,YAHOO.util.DragDrop,{toString:function(){return("DDTarget "+this.id);}});YAHOO.register("dragdrop",YAHOO.util.DragDropMgr,{version:"2.2.0",build:"127"}); +YAHOO.util.Attribute=function(hash,owner){if(owner){this.owner=owner;this.configure(hash,true);}};YAHOO.util.Attribute.prototype={name:undefined,value:null,owner:null,readOnly:false,writeOnce:false,_initialConfig:null,_written:false,method:null,validator:null,getValue:function(){return this.value;},setValue:function(value,silent){var beforeRetVal;var owner=this.owner;var name=this.name;var event={type:name,prevValue:this.getValue(),newValue:value};if(this.readOnly||(this.writeOnce&&this._written)){return false;} +if(this.validator&&!this.validator.call(owner,value)){return false;} +if(!silent){beforeRetVal=owner.fireBeforeChangeEvent(event);if(beforeRetVal===false){return false;}} +if(this.method){this.method.call(owner,value);} +this.value=value;this._written=true;event.type=name;if(!silent){this.owner.fireChangeEvent(event);} +return true;},configure:function(map,init){map=map||{};this._written=false;this._initialConfig=this._initialConfig||{};for(var key in map){if(key&&YAHOO.lang.hasOwnProperty(map,key)){this[key]=map[key];if(init){this._initialConfig[key]=map[key];}}}},resetValue:function(){return this.setValue(this._initialConfig.value);},resetConfig:function(){this.configure(this._initialConfig);},refresh:function(silent){this.setValue(this.value,silent);}};(function(){var Lang=YAHOO.util.Lang;YAHOO.util.AttributeProvider=function(){};YAHOO.util.AttributeProvider.prototype={_configs:null,get:function(key){var configs=this._configs||{};var config=configs[key];if(!config){return undefined;} +return config.value;},set:function(key,value,silent){var configs=this._configs||{};var config=configs[key];if(!config){return false;} +return config.setValue(value,silent);},getAttributeKeys:function(){var configs=this._configs;var keys=[];var config;for(var key in configs){config=configs[key];if(Lang.hasOwnProperty(configs,key)&&!Lang.isUndefined(config)){keys[keys.length]=key;}} +return keys;},setAttributes:function(map,silent){for(var key in map){if(Lang.hasOwnProperty(map,key)){this.set(key,map[key],silent);}}},resetValue:function(key,silent){var configs=this._configs||{};if(configs[key]){this.set(key,configs[key]._initialConfig.value,silent);return true;} +return false;},refresh:function(key,silent){var configs=this._configs;key=((Lang.isString(key))?[key]:key)||this.getAttributeKeys();for(var i=0,len=key.length;i-1){return true;}else{return YAHOO.lang.isObject(obj)&&obj.constructor==Array;}},isBoolean:function(obj){return typeof obj=='boolean';},isFunction:function(obj){return typeof obj=='function';},isNull:function(obj){return obj===null;},isNumber:function(obj){return typeof obj=='number'&&isFinite(obj);},isObject:function(obj){return typeof obj=='object'||YAHOO.lang.isFunction(obj);},isString:function(obj){return typeof obj=='string';},isUndefined:function(obj){return typeof obj=='undefined';},hasOwnProperty:function(obj,prop){if(Object.prototype.hasOwnProperty){return obj.hasOwnProperty(prop);} +return!YAHOO.lang.isUndefined(obj[prop])&&obj.constructor.prototype[prop]!==obj[prop];},extend:function(subc,superc,overrides){var F=function(){};F.prototype=superc.prototype;subc.prototype=new F();subc.prototype.constructor=subc;subc.superclass=superc.prototype;if(superc.prototype.constructor==Object.prototype.constructor){superc.prototype.constructor=superc;} +if(overrides){for(var i in overrides){subc.prototype[i]=overrides[i];}}},augment:function(r,s){var rp=r.prototype,sp=s.prototype,a=arguments,i,p;if(a[2]){for(i=2;i-1),isSafari=(ua.indexOf('safari')>-1),isGecko=(!isOpera&&!isSafari&&ua.indexOf('gecko')>-1),isIE=(!isOpera&&ua.indexOf('msie')>-1);var patterns={HYPHEN:/(-[a-z])/i};var toCamel=function(property){if(!patterns.HYPHEN.test(property)){return property;} +if(propertyCache[property]){return propertyCache[property];} +while(patterns.HYPHEN.exec(property)){property=property.replace(RegExp.$1,RegExp.$1.substr(1).toUpperCase());} +propertyCache[property]=property;return property;};if(document.defaultView&&document.defaultView.getComputedStyle){getStyle=function(el,property){var value=null;var computed=document.defaultView.getComputedStyle(el,'');if(computed){value=computed[toCamel(property)];} +return el.style[property]||value;};}else if(document.documentElement.currentStyle&&isIE){getStyle=function(el,property){switch(toCamel(property)){case'opacity':var val=100;try{val=el.filters['DXImageTransform.Microsoft.Alpha'].opacity;}catch(e){try{val=el.filters('alpha').opacity;}catch(e){}} +return val/100;break;default:var value=el.currentStyle?el.currentStyle[property]:null;return(el.style[property]||value);}};}else{getStyle=function(el,property){return el.style[property];};} +if(isIE){setStyle=function(el,property,val){switch(property){case'opacity':if(typeof el.style.filter=='string'){el.style.filter='alpha(opacity='+val*100+')';if(!el.currentStyle||!el.currentStyle.hasLayout){el.style.zoom=1;}} +break;default:el.style[property]=val;}};}else{setStyle=function(el,property,val){el.style[property]=val;};} +YAHOO.util.Dom={get:function(el){if(!el){return null;} +if(typeof el!='string'&&!(el instanceof Array)){return el;} +if(typeof el=='string'){return document.getElementById(el);} +else{var collection=[];for(var i=0,len=el.length;i=this.left&®ion.right<=this.right&®ion.top>=this.top&®ion.bottom<=this.bottom);};YAHOO.util.Region.prototype.getArea=function(){return((this.bottom-this.top)*(this.right-this.left));};YAHOO.util.Region.prototype.intersect=function(region){var t=Math.max(this.top,region.top);var r=Math.min(this.right,region.right);var b=Math.min(this.bottom,region.bottom);var l=Math.max(this.left,region.left);if(b>=t&&r>=l){return new YAHOO.util.Region(t,r,b,l);}else{return null;}};YAHOO.util.Region.prototype.union=function(region){var t=Math.min(this.top,region.top);var r=Math.max(this.right,region.right);var b=Math.max(this.bottom,region.bottom);var l=Math.min(this.left,region.left);return new YAHOO.util.Region(t,r,b,l);};YAHOO.util.Region.prototype.toString=function(){return("Region {"+"top: "+this.top+", right: "+this.right+", bottom: "+this.bottom+", left: "+this.left+"}");};YAHOO.util.Region.getRegion=function(el){var p=YAHOO.util.Dom.getXY(el);var t=p[1];var r=p[0]+el.offsetWidth;var b=p[1]+el.offsetHeight;var l=p[0];return new YAHOO.util.Region(t,r,b,l);};YAHOO.util.Point=function(x,y){if(x instanceof Array){y=x[1];x=x[0];} +this.x=this.right=this.left=this[0]=x;this.y=this.top=this.bottom=this[1]=y;};YAHOO.util.Point.prototype=new YAHOO.util.Region();YAHOO.register("dom",YAHOO.util.Dom,{version:"2.2.0",build:"127"}); +if(!YAHOO.util.Event){YAHOO.util.Event=function(){var loadComplete=false;var listeners=[];var unloadListeners=[];var legacyEvents=[];var legacyHandlers=[];var retryCount=0;var onAvailStack=[];var legacyMap=[];var counter=0;var lastError=null;return{POLL_RETRYS:200,POLL_INTERVAL:20,EL:0,TYPE:1,FN:2,WFN:3,OBJ:3,ADJ_SCOPE:4,isSafari:(/KHTML/gi).test(navigator.userAgent),webkit:function(){var v=navigator.userAgent.match(/AppleWebKit\/([^ ]*)/);if(v&&v[1]){return v[1];} +return null;}(),isIE:(!this.webkit&&!navigator.userAgent.match(/opera/gi)&&navigator.userAgent.match(/msie/gi)),_interval:null,startInterval:function(){if(!this._interval){var self=this;var callback=function(){self._tryPreloadAttach();};this._interval=setInterval(callback,this.POLL_INTERVAL);}},onAvailable:function(p_id,p_fn,p_obj,p_override){onAvailStack.push({id:p_id,fn:p_fn,obj:p_obj,override:p_override,checkReady:false});retryCount=this.POLL_RETRYS;this.startInterval();},onContentReady:function(p_id,p_fn,p_obj,p_override){onAvailStack.push({id:p_id,fn:p_fn,obj:p_obj,override:p_override,checkReady:true});retryCount=this.POLL_RETRYS;this.startInterval();},addListener:function(el,sType,fn,obj,override){if(!fn||!fn.call){return false;} +if(this._isValidCollection(el)){var ok=true;for(var i=0,len=el.length;i=0){cacheItem=listeners[index];} +if(!el||!cacheItem){return false;} +if(this.useLegacyEvent(el,sType)){var legacyIndex=this.getLegacyIndex(el,sType);var llist=legacyHandlers[legacyIndex];if(llist){for(i=0,len=llist.length;i0);} +var notAvail=[];for(var i=0,len=onAvailStack.length;i0){for(var i=0,len=searchList.length;i0){j=listeners.length;while(j){index=j-1;l=listeners[index];if(l){EU.removeListener(l[EU.EL],l[EU.TYPE],l[EU.FN],index);} +j=j-1;} +l=null;EU.clearCache();} +for(i=0,len=legacyEvents.length;i0){param=args[0];} +ret=s.fn.call(scope,param,s.obj);}else{ret=s.fn.call(scope,this.type,args,s.obj);} +if(false===ret){if(!this.silent){} +return false;}}} +return true;},unsubscribeAll:function(){for(var i=0,len=this.subscribers.length;i + * YAHOO.env.getVersion for the description of the version data structure. + * @property listener + * @static + */ +if (typeof YAHOO == "undefined") { + /** + * The YAHOO global namespace object. If YAHOO is already defined, the + * existing YAHOO object will not be overwritten so that defined + * namespaces are preserved. + * @class YAHOO + * @static + */ + var YAHOO = {}; +} + +/** + * Returns the namespace specified and creates it if it doesn't exist + *
    + * YAHOO.namespace("property.package");
    + * YAHOO.namespace("YAHOO.property.package");
    + * 
    + * Either of the above would create YAHOO.property, then + * YAHOO.property.package + * + * Be careful when naming packages. Reserved words may work in some browsers + * and not others. For instance, the following will fail in Safari: + *
    + * YAHOO.namespace("really.long.nested.namespace");
    + * 
    + * This fails because "long" is a future reserved word in ECMAScript + * + * @method namespace + * @static + * @param {String*} arguments 1-n namespaces to create + * @return {Object} A reference to the last namespace object created + */ +YAHOO.namespace = function() { + var a=arguments, o=null, i, j, d; + for (i=0; i + *
    name:
    The name of the module
    + *
    version:
    The version in use
    + *
    build:
    The build number in use
    + *
    versions:
    All versions that were registered
    + *
    builds:
    All builds that were registered.
    + *
    mainClass:
    An object that was was stamped with the + * current version and build. If + * mainClass.VERSION != version or mainClass.BUILD != build, + * multiple versions of pieces of the library have been + * loaded, potentially causing issues.
    + * + * + * @method getVersion + * @static + * @param {String} name the name of the module (event, slider, etc) + * @return {Object} The version info + */ + getVersion: function(name) { + return YAHOO.env.modules[name] || null; + } +}; + +/** + * Provides the language utilites and extensions used by the library + * @class YAHOO.lang + */ +YAHOO.lang = { + /** + * Determines whether or not the provided object is an array + * @method isArray + * @param {any} obj The object being testing + * @return Boolean + */ + isArray: function(obj) { // frames lose type, so test constructor string + if (obj.constructor && obj.constructor.toString().indexOf('Array') > -1) { + return true; + } else { + return YAHOO.lang.isObject(obj) && obj.constructor == Array; + } + }, + + /** + * Determines whether or not the provided object is a boolean + * @method isBoolean + * @param {any} obj The object being testing + * @return Boolean + */ + isBoolean: function(obj) { + return typeof obj == 'boolean'; + }, + + /** + * Determines whether or not the provided object is a function + * @method isFunction + * @param {any} obj The object being testing + * @return Boolean + */ + isFunction: function(obj) { + return typeof obj == 'function'; + }, + + /** + * Determines whether or not the provided object is null + * @method isNull + * @param {any} obj The object being testing + * @return Boolean + */ + isNull: function(obj) { + return obj === null; + }, + + /** + * Determines whether or not the provided object is a legal number + * @method isNumber + * @param {any} obj The object being testing + * @return Boolean + */ + isNumber: function(obj) { + return typeof obj == 'number' && isFinite(obj); + }, + + /** + * Determines whether or not the provided object is of type object + * or function + * @method isObject + * @param {any} obj The object being testing + * @return Boolean + */ + isObject: function(obj) { + return typeof obj == 'object' || YAHOO.lang.isFunction(obj); + }, + + /** + * Determines whether or not the provided object is a string + * @method isString + * @param {any} obj The object being testing + * @return Boolean + */ + isString: function(obj) { + return typeof obj == 'string'; + }, + + /** + * Determines whether or not the provided object is undefined + * @method isUndefined + * @param {any} obj The object being testing + * @return Boolean + */ + isUndefined: function(obj) { + return typeof obj == 'undefined'; + }, + + /** + * Determines whether or not the property was added + * to the object instance. Returns false if the property is not present + * in the object, or was inherited from the prototype. + * This abstraction is provided to enable hasOwnProperty for Safari 1.3.x. + * There is a discrepancy between YAHOO.lang.hasOwnProperty and + * Object.prototype.hasOwnProperty when the property is a primitive added to + * both the instance AND prototype with the same value: + *
    +     * var A = function() {};
    +     * A.prototype.foo = 'foo';
    +     * var a = new A();
    +     * a.foo = 'foo';
    +     * alert(a.hasOwnProperty('foo')); // true
    +     * alert(YAHOO.lang.hasOwnProperty(a, 'foo')); // false when using fallback
    +     * 
    + * @method hasOwnProperty + * @param {any} obj The object being testing + * @return Boolean + */ + hasOwnProperty: function(obj, prop) { + if (Object.prototype.hasOwnProperty) { + return obj.hasOwnProperty(prop); + } + + return !YAHOO.lang.isUndefined(obj[prop]) && + obj.constructor.prototype[prop] !== obj[prop]; + }, + + /** + * Utility to set up the prototype, constructor and superclass properties to + * support an inheritance strategy that can chain constructors and methods. + * + * @method extend + * @static + * @param {Function} subc the object to modify + * @param {Function} superc the object to inherit + * @param {Object} overrides additional properties/methods to add to the + * subclass prototype. These will override the + * matching items obtained from the superclass + * if present. + */ + extend: function(subc, superc, overrides) { + var F = function() {}; + F.prototype=superc.prototype; + subc.prototype=new F(); + subc.prototype.constructor=subc; + subc.superclass=superc.prototype; + if (superc.prototype.constructor == Object.prototype.constructor) { + superc.prototype.constructor=superc; + } + + if (overrides) { + for (var i in overrides) { + subc.prototype[i]=overrides[i]; + } + } + }, + + /** + * Applies all prototype properties in the supplier to the receiver if the + * receiver does not have these properties yet. Optionally, one or more + * methods/properties can be specified (as additional parameters). This + * option will overwrite the property if receiver has it already. + * + * @method augment + * @static + * @param {Function} r the object to receive the augmentation + * @param {Function} s the object that supplies the properties to augment + * @param {String*} arguments zero or more properties methods to augment the + * receiver with. If none specified, everything + * in the supplier will be used unless it would + * overwrite an existing property in the receiver + */ + augment: function(r, s) { + var rp=r.prototype, sp=s.prototype, a=arguments, i, p; + if (a[2]) { + for (i=2; iYAHOO.lang + * @class YAHOO.util.Lang + */ +YAHOO.util.Lang = YAHOO.lang; + +/** + * An alias for YAHOO.lang.augment + * @for YAHOO + * @method augment + * @static + * @param {Function} r the object to receive the augmentation + * @param {Function} s the object that supplies the properties to augment + * @param {String*} arguments zero or more properties methods to augment the + * receiver with. If none specified, everything + * in the supplier will be used unless it would + * overwrite an existing property in the receiver + */ +YAHOO.augment = YAHOO.lang.augment; + +/** + * An alias for YAHOO.lang.extend + * @method extend + * @static + * @param {Function} subc the object to modify + * @param {Function} superc the object to inherit + * @param {Object} overrides additional properties/methods to add to the + * subclass prototype. These will override the + * matching items obtained from the superclass + * if present. + */ +YAHOO.extend = YAHOO.lang.extend; + +YAHOO.register("yahoo", YAHOO, {version: "2.2.0", build: "127"}); diff --git a/interface/ispconfig/interface/js/yui/yahoo/yahoo-min.js b/interface/ispconfig/interface/js/yui/yahoo/yahoo-min.js new file mode 100644 index 0000000000000000000000000000000000000000..0747668a4f4f2e8f18433a0f8f6afd26c7754694 --- /dev/null +++ b/interface/ispconfig/interface/js/yui/yahoo/yahoo-min.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2007, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.2.0 +*/ + +if(typeof YAHOO=="undefined"){var YAHOO={};} +YAHOO.namespace=function(){var a=arguments,o=null,i,j,d;for(i=0;i-1){return true;}else{return YAHOO.lang.isObject(obj)&&obj.constructor==Array;}},isBoolean:function(obj){return typeof obj=='boolean';},isFunction:function(obj){return typeof obj=='function';},isNull:function(obj){return obj===null;},isNumber:function(obj){return typeof obj=='number'&&isFinite(obj);},isObject:function(obj){return typeof obj=='object'||YAHOO.lang.isFunction(obj);},isString:function(obj){return typeof obj=='string';},isUndefined:function(obj){return typeof obj=='undefined';},hasOwnProperty:function(obj,prop){if(Object.prototype.hasOwnProperty){return obj.hasOwnProperty(prop);} +return!YAHOO.lang.isUndefined(obj[prop])&&obj.constructor.prototype[prop]!==obj[prop];},extend:function(subc,superc,overrides){var F=function(){};F.prototype=superc.prototype;subc.prototype=new F();subc.prototype.constructor=subc;subc.superclass=superc.prototype;if(superc.prototype.constructor==Object.prototype.constructor){superc.prototype.constructor=superc;} +if(overrides){for(var i in overrides){subc.prototype[i]=overrides[i];}}},augment:function(r,s){var rp=r.prototype,sp=s.prototype,a=arguments,i,p;if(a[2]){for(i=2;i + * YAHOO.env.getVersion for the description of the version data structure. + * @property listener + * @static + */ +if (typeof YAHOO == "undefined") { + /** + * The YAHOO global namespace object. If YAHOO is already defined, the + * existing YAHOO object will not be overwritten so that defined + * namespaces are preserved. + * @class YAHOO + * @static + */ + var YAHOO = {}; +} + +/** + * Returns the namespace specified and creates it if it doesn't exist + *
    + * YAHOO.namespace("property.package");
    + * YAHOO.namespace("YAHOO.property.package");
    + * 
    + * Either of the above would create YAHOO.property, then + * YAHOO.property.package + * + * Be careful when naming packages. Reserved words may work in some browsers + * and not others. For instance, the following will fail in Safari: + *
    + * YAHOO.namespace("really.long.nested.namespace");
    + * 
    + * This fails because "long" is a future reserved word in ECMAScript + * + * @method namespace + * @static + * @param {String*} arguments 1-n namespaces to create + * @return {Object} A reference to the last namespace object created + */ +YAHOO.namespace = function() { + var a=arguments, o=null, i, j, d; + for (i=0; i + *
    name:
    The name of the module
    + *
    version:
    The version in use
    + *
    build:
    The build number in use
    + *
    versions:
    All versions that were registered
    + *
    builds:
    All builds that were registered.
    + *
    mainClass:
    An object that was was stamped with the + * current version and build. If + * mainClass.VERSION != version or mainClass.BUILD != build, + * multiple versions of pieces of the library have been + * loaded, potentially causing issues.
    + * + * + * @method getVersion + * @static + * @param {String} name the name of the module (event, slider, etc) + * @return {Object} The version info + */ + getVersion: function(name) { + return YAHOO.env.modules[name] || null; + } +}; + +/** + * Provides the language utilites and extensions used by the library + * @class YAHOO.lang + */ +YAHOO.lang = { + /** + * Determines whether or not the provided object is an array + * @method isArray + * @param {any} obj The object being testing + * @return Boolean + */ + isArray: function(obj) { // frames lose type, so test constructor string + if (obj.constructor && obj.constructor.toString().indexOf('Array') > -1) { + return true; + } else { + return YAHOO.lang.isObject(obj) && obj.constructor == Array; + } + }, + + /** + * Determines whether or not the provided object is a boolean + * @method isBoolean + * @param {any} obj The object being testing + * @return Boolean + */ + isBoolean: function(obj) { + return typeof obj == 'boolean'; + }, + + /** + * Determines whether or not the provided object is a function + * @method isFunction + * @param {any} obj The object being testing + * @return Boolean + */ + isFunction: function(obj) { + return typeof obj == 'function'; + }, + + /** + * Determines whether or not the provided object is null + * @method isNull + * @param {any} obj The object being testing + * @return Boolean + */ + isNull: function(obj) { + return obj === null; + }, + + /** + * Determines whether or not the provided object is a legal number + * @method isNumber + * @param {any} obj The object being testing + * @return Boolean + */ + isNumber: function(obj) { + return typeof obj == 'number' && isFinite(obj); + }, + + /** + * Determines whether or not the provided object is of type object + * or function + * @method isObject + * @param {any} obj The object being testing + * @return Boolean + */ + isObject: function(obj) { + return typeof obj == 'object' || YAHOO.lang.isFunction(obj); + }, + + /** + * Determines whether or not the provided object is a string + * @method isString + * @param {any} obj The object being testing + * @return Boolean + */ + isString: function(obj) { + return typeof obj == 'string'; + }, + + /** + * Determines whether or not the provided object is undefined + * @method isUndefined + * @param {any} obj The object being testing + * @return Boolean + */ + isUndefined: function(obj) { + return typeof obj == 'undefined'; + }, + + /** + * Determines whether or not the property was added + * to the object instance. Returns false if the property is not present + * in the object, or was inherited from the prototype. + * This abstraction is provided to enable hasOwnProperty for Safari 1.3.x. + * There is a discrepancy between YAHOO.lang.hasOwnProperty and + * Object.prototype.hasOwnProperty when the property is a primitive added to + * both the instance AND prototype with the same value: + *
    +     * var A = function() {};
    +     * A.prototype.foo = 'foo';
    +     * var a = new A();
    +     * a.foo = 'foo';
    +     * alert(a.hasOwnProperty('foo')); // true
    +     * alert(YAHOO.lang.hasOwnProperty(a, 'foo')); // false when using fallback
    +     * 
    + * @method hasOwnProperty + * @param {any} obj The object being testing + * @return Boolean + */ + hasOwnProperty: function(obj, prop) { + if (Object.prototype.hasOwnProperty) { + return obj.hasOwnProperty(prop); + } + + return !YAHOO.lang.isUndefined(obj[prop]) && + obj.constructor.prototype[prop] !== obj[prop]; + }, + + /** + * Utility to set up the prototype, constructor and superclass properties to + * support an inheritance strategy that can chain constructors and methods. + * + * @method extend + * @static + * @param {Function} subc the object to modify + * @param {Function} superc the object to inherit + * @param {Object} overrides additional properties/methods to add to the + * subclass prototype. These will override the + * matching items obtained from the superclass + * if present. + */ + extend: function(subc, superc, overrides) { + var F = function() {}; + F.prototype=superc.prototype; + subc.prototype=new F(); + subc.prototype.constructor=subc; + subc.superclass=superc.prototype; + if (superc.prototype.constructor == Object.prototype.constructor) { + superc.prototype.constructor=superc; + } + + if (overrides) { + for (var i in overrides) { + subc.prototype[i]=overrides[i]; + } + } + }, + + /** + * Applies all prototype properties in the supplier to the receiver if the + * receiver does not have these properties yet. Optionally, one or more + * methods/properties can be specified (as additional parameters). This + * option will overwrite the property if receiver has it already. + * + * @method augment + * @static + * @param {Function} r the object to receive the augmentation + * @param {Function} s the object that supplies the properties to augment + * @param {String*} arguments zero or more properties methods to augment the + * receiver with. If none specified, everything + * in the supplier will be used unless it would + * overwrite an existing property in the receiver + */ + augment: function(r, s) { + var rp=r.prototype, sp=s.prototype, a=arguments, i, p; + if (a[2]) { + for (i=2; iYAHOO.lang + * @class YAHOO.util.Lang + */ +YAHOO.util.Lang = YAHOO.lang; + +/** + * An alias for YAHOO.lang.augment + * @for YAHOO + * @method augment + * @static + * @param {Function} r the object to receive the augmentation + * @param {Function} s the object that supplies the properties to augment + * @param {String*} arguments zero or more properties methods to augment the + * receiver with. If none specified, everything + * in the supplier will be used unless it would + * overwrite an existing property in the receiver + */ +YAHOO.augment = YAHOO.lang.augment; + +/** + * An alias for YAHOO.lang.extend + * @method extend + * @static + * @param {Function} subc the object to modify + * @param {Function} superc the object to inherit + * @param {Object} overrides additional properties/methods to add to the + * subclass prototype. These will override the + * matching items obtained from the superclass + * if present. + */ +YAHOO.extend = YAHOO.lang.extend; + +YAHOO.register("yahoo", YAHOO, {version: "2.2.0", build: "127"}); diff --git a/interface/ispconfig/interface/keepalive.php b/interface/ispconfig/interface/keepalive.php new file mode 100644 index 0000000000000000000000000000000000000000..6ba2b8f5915ea0b754ddd988c5dd7d9f5d9019f8 --- /dev/null +++ b/interface/ispconfig/interface/keepalive.php @@ -0,0 +1,36 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/login/index.php b/interface/ispconfig/interface/login/index.php new file mode 100644 index 0000000000000000000000000000000000000000..a1e2befa499079da5c322af35a8f9fcfbb9ef76e --- /dev/null +++ b/interface/ispconfig/interface/login/index.php @@ -0,0 +1,203 @@ +uses('tpl'); + $app->tpl->newTemplate('form.tpl.htm'); + + $error = ''; + + $app->load_language_file('web/login/lib/lang/'.$conf["language"].'.lng'); + + + //* Login Form was send + if(count($_POST) > 0) { + + //** Check variables + if(!preg_match("/^[\w\.\-\_]{1,64}$/", $_POST['username'])) $error = $app->lng('user_regex_error'); + if(!preg_match("/^.{1,64}$/i", $_POST['passwort'])) $error = $app->lng('pw_error_length'); + + //** iporting variables + $ip = $app->db->quote(ip2long($_SERVER['REMOTE_ADDR'])); + $username = $app->db->quote($_POST['username']); + $passwort = $app->db->quote($_POST['passwort']); + $loginAs = false; + $time = time(); + + if($username != '' && $passwort != '' && $error == '') { + /* + * Check, if there is a "login as" instead of a "normal" login + */ + if (isset($_SESSION['s']['user']) && $_SESSION['s']['user']['active'] == 1){ + /* + * only the admin can "login as" so if the user is NOT a admin, we + * open the startpage (after killing the old session), so the user + * is logout and has to start again! + */ + if ($_SESSION['s']['user']['typ'] != 'admin') { + /* + * The actual user is NOT a admin, but maybe the admin + * has logged in as "normal" user bevore... + */ + if (isset($_SESSION['s_old'])&& ($_SESSION['s_old']['user']['typ'] == 'admin')){ + /* The "old" user is admin, so everything is ok */ + } + else { + die("You don't have the right to 'login as'!"); + } + } + $loginAs = true; + } + else { + /* normal login */ + $loginAs = false; + } + + //* Check if there are already wrong logins + $sql = "SELECT * FROM `attempts_login` WHERE `ip`= '{$ip}' AND `login_time` > (NOW() - INTERVAL 1 MINUTE) LIMIT 1"; + $alreadyfailed = $app->db->queryOneRecord($sql); + //* login to much wrong + if($alreadyfailed['times'] > 5) { + $error = $app->lng('error_user_too_many_logins'); + } else { + if ($loginAs){ + $sql = "SELECT * FROM sys_user WHERE USERNAME = '$username' and PASSWORT = '". $passwort. "'"; + $user = $app->db->queryOneRecord($sql); + } else { + $sql = "SELECT * FROM sys_user WHERE USERNAME = '$username'"; + $user = $app->db->queryOneRecord($sql); + if($user && $user['active'] == 1) { + $saved_password = stripslashes($user['passwort']); + if(substr($saved_password,0,3) == '$1$') { + //* The password is crypt-md5 encrypted + $salt = '$1$'.substr($saved_password,3,8).'$'; + if(crypt($passwort,$salt) != $saved_password) { + $user = false; + } + } else { + //* The password is md5 encrypted + if(md5($passwort) != $saved_password) { + $user = false; + } + } + } else { + $user = false; + } + } + + if($user) { + if($user['active'] == 1) { + // User login right, so attempts can be deleted + $sql = "DELETE FROM `attempts_login` WHERE `ip`='{$ip}'"; + $app->db->query($sql); + $user = $app->db->toLower($user); + if ($loginAs) $oldSession = $_SESSION['s']; + $_SESSION = array(); + if ($loginAs) $_SESSION['s_old'] = $oldSession; // keep the way back! + $_SESSION['s']['user'] = $user; + $_SESSION['s']['user']['theme'] = isset($user['app_theme']) ? $user['app_theme'] : 'default'; + $_SESSION['s']['language'] = $user['language']; + $_SESSION["s"]['theme'] = $_SESSION['s']['user']['theme']; + + if(is_file($_SESSION['s']['user']['startmodule'].'/lib/module.conf.php')) { + include_once($_SESSION['s']['user']['startmodule'].'/lib/module.conf.php'); + $_SESSION['s']['module'] = $module; + } + + $app->plugin->raiseEvent('login',$this); + + echo 'HEADER_REDIRECT:'.$_SESSION['s']['module']['startpage']; + + exit; + } else { + $error = $app->lng('error_user_blocked'); + } + } else { + if(!$alreadyfailed['times'] ) + { + //* user login the first time wrong + $sql = "INSERT INTO `attempts_login` (`ip`, `times`, `login_time`) VALUES ('{$ip}', 1, NOW())"; + $app->db->query($sql); + } elseif($alreadyfailed['times'] >= 1) { + //* update times wrong + $sql = "UPDATE `attempts_login` SET `times`=`times`+1, `login_time`=NOW() WHERE `login_time` >= '{$time}' LIMIT 1"; + $app->db->query($sql); + } + //* Incorrect login - Username and password incorrect + $error = $app->lng('error_user_password_incorrect'); + if($app->db->errorMessage != '') $error .= '
    '.$app->db->errorMessage != ''; + } + } + } else { + //* Username or password empty + if($error == '') $error = $app->lng('error_user_password_empty'); + } + } + if($error != ''){ + $error = '

    Error

    '.$error.'
    '; + } + + + + $app->tpl->setVar('error', $error); + $app->tpl->setVar('username_txt', $app->lng('username_txt')); + $app->tpl->setVar('password_txt', $app->lng('password_txt')); + $app->tpl->setVar('login_button_txt', $app->lng('login_button_txt')); + $app->tpl->setInclude('content_tpl','login/templates/index.htm'); + $app->tpl_defaults(); + + $this->status = 'OK'; + + return $app->tpl->grab(); + + } // << end function + +} // << end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/login/lib/lang/bg.lng b/interface/ispconfig/interface/login/lib/lang/bg.lng new file mode 100644 index 0000000000000000000000000000000000000000..9a9103417392acca32c7e2470f9189efff13319c --- /dev/null +++ b/interface/ispconfig/interface/login/lib/lang/bg.lng @@ -0,0 +1,17 @@ + 64 characters.'; +$wb['error_user_password_empty'] = 'Username or Password empty.'; +$wb['error_user_password_incorrect'] = 'Username or Password wrong.'; +$wb['error_user_blocked'] = 'User is blocked.'; +$wb['error_user_too_many_logins'] = 'To many wrong logins, Please retry it after 15 minutes'; +$wb['username_txt'] = 'Username'; +$wb['password_txt'] = 'Password'; +$wb['login_button_txt'] = 'Login'; +?> diff --git a/interface/ispconfig/interface/login/lib/lang/br.lng b/interface/ispconfig/interface/login/lib/lang/br.lng new file mode 100644 index 0000000000000000000000000000000000000000..4f2d676d65db3bbba255af4a91dd1b529d5037b1 --- /dev/null +++ b/interface/ispconfig/interface/login/lib/lang/br.lng @@ -0,0 +1,17 @@ + diff --git a/interface/ispconfig/interface/login/lib/lang/de.lng b/interface/ispconfig/interface/login/lib/lang/de.lng new file mode 100644 index 0000000000000000000000000000000000000000..855798aa6c108c0c25f059ec23aba636270109ec --- /dev/null +++ b/interface/ispconfig/interface/login/lib/lang/de.lng @@ -0,0 +1,17 @@ + 64 Zeichen.'; +$wb['error_user_password_empty'] = 'Bwnutzername oder Passwort leer.'; +$wb['error_user_password_incorrect'] = 'Benutzername oder Passwort falsch.'; +$wb['error_user_blocked'] = 'Benutzer ist gesperrt.'; +$wb['error_user_too_many_logins'] = 'Zu viele falsche Logins. Bitte nach 15 Minuten nochmal probieren.'; +$wb['username_txt'] = 'Benutzername'; +$wb['password_txt'] = 'Passwort'; +$wb['login_button_txt'] = 'Login'; +?> diff --git a/interface/ispconfig/interface/login/lib/lang/en.lng b/interface/ispconfig/interface/login/lib/lang/en.lng new file mode 100644 index 0000000000000000000000000000000000000000..fc488cd56d42462f7ffcab1f33ad6399a9e39492 --- /dev/null +++ b/interface/ispconfig/interface/login/lib/lang/en.lng @@ -0,0 +1,22 @@ + 64 characters.'; + +$wb['username_txt'] = "Username"; +$wb['password_txt'] = "Password"; +$wb['login_button_txt'] = "Login"; + +?> diff --git a/interface/ispconfig/interface/login/lib/lang/es.lng b/interface/ispconfig/interface/login/lib/lang/es.lng new file mode 100644 index 0000000000000000000000000000000000000000..9db2714ea4d8467f2447ac81b23ee48d065dec80 --- /dev/null +++ b/interface/ispconfig/interface/login/lib/lang/es.lng @@ -0,0 +1,17 @@ + diff --git a/interface/ispconfig/interface/login/lib/lang/fi.lng b/interface/ispconfig/interface/login/lib/lang/fi.lng new file mode 100644 index 0000000000000000000000000000000000000000..7385385af2e929eca94c6c783b63377869d4fa37 --- /dev/null +++ b/interface/ispconfig/interface/login/lib/lang/fi.lng @@ -0,0 +1,17 @@ + diff --git a/interface/ispconfig/interface/login/lib/lang/fr.lng b/interface/ispconfig/interface/login/lib/lang/fr.lng new file mode 100644 index 0000000000000000000000000000000000000000..115a33a20f23a13b08b09349293eef411ae8c46d --- /dev/null +++ b/interface/ispconfig/interface/login/lib/lang/fr.lng @@ -0,0 +1,17 @@ + diff --git a/interface/ispconfig/interface/login/lib/lang/hu.lng b/interface/ispconfig/interface/login/lib/lang/hu.lng new file mode 100644 index 0000000000000000000000000000000000000000..109276262cef32dc0b39a04d5d477e30adb6bd4e --- /dev/null +++ b/interface/ispconfig/interface/login/lib/lang/hu.lng @@ -0,0 +1,17 @@ + diff --git a/interface/ispconfig/interface/login/lib/lang/it.lng b/interface/ispconfig/interface/login/lib/lang/it.lng new file mode 100644 index 0000000000000000000000000000000000000000..23940d3f291be7887d8bda4d34b4ed20fa703fb1 --- /dev/null +++ b/interface/ispconfig/interface/login/lib/lang/it.lng @@ -0,0 +1,17 @@ + 64 characters.'; +$wb['error_user_password_empty'] = 'Username or Password empty.'; +$wb['error_user_password_incorrect'] = 'Username or Password wrong.'; +$wb['error_user_blocked'] = 'User is blocked.'; +$wb['error_user_too_many_logins'] = 'To many wrong logins, Please retry it after 15 minutes'; +$wb['username_txt'] = 'Username'; +$wb['password_txt'] = 'Password'; +$wb['login_button_txt'] = 'Login'; +?> diff --git a/interface/ispconfig/interface/login/lib/lang/ja.lng b/interface/ispconfig/interface/login/lib/lang/ja.lng new file mode 100644 index 0000000000000000000000000000000000000000..7cfb1d8bb27d629a33ec10cbddfad28bf9dc7187 --- /dev/null +++ b/interface/ispconfig/interface/login/lib/lang/ja.lng @@ -0,0 +1,17 @@ + diff --git a/interface/ispconfig/interface/login/lib/lang/nl.lng b/interface/ispconfig/interface/login/lib/lang/nl.lng new file mode 100644 index 0000000000000000000000000000000000000000..46e1175c8ac1ece33e4b6dc7ef7a10a5139ff476 --- /dev/null +++ b/interface/ispconfig/interface/login/lib/lang/nl.lng @@ -0,0 +1,17 @@ + diff --git a/interface/ispconfig/interface/login/lib/lang/pl.lng b/interface/ispconfig/interface/login/lib/lang/pl.lng new file mode 100644 index 0000000000000000000000000000000000000000..52f31b61b28f8107bc8bc6681fb0329ad25ea142 --- /dev/null +++ b/interface/ispconfig/interface/login/lib/lang/pl.lng @@ -0,0 +1,17 @@ + 64 znaki.'; +$wb['error_user_password_empty'] = 'Username or Password empty.'; +$wb['error_user_password_incorrect'] = 'Username or Password wrong.'; +$wb['error_user_blocked'] = 'User is blocked.'; +$wb['error_user_too_many_logins'] = 'To many wrong logins, Please retry it after 15 minutes'; +$wb['username_txt'] = 'Username'; +$wb['password_txt'] = 'Password'; +$wb['login_button_txt'] = 'Login'; +?> diff --git a/interface/ispconfig/interface/login/lib/lang/pt.lng b/interface/ispconfig/interface/login/lib/lang/pt.lng new file mode 100644 index 0000000000000000000000000000000000000000..48e217f598081726a8eb4c9c9906bfe995c7f71d --- /dev/null +++ b/interface/ispconfig/interface/login/lib/lang/pt.lng @@ -0,0 +1,18 @@ + + diff --git a/interface/ispconfig/interface/login/lib/lang/ro.lng b/interface/ispconfig/interface/login/lib/lang/ro.lng new file mode 100644 index 0000000000000000000000000000000000000000..bcd64f446e1eabdd5df34c769bc31ac8b9497bff --- /dev/null +++ b/interface/ispconfig/interface/login/lib/lang/ro.lng @@ -0,0 +1,17 @@ + 64 caractere.'; +$wb['error_user_password_empty'] = 'Username or Password empty.'; +$wb['error_user_password_incorrect'] = 'Username or Password wrong.'; +$wb['error_user_blocked'] = 'User is blocked.'; +$wb['error_user_too_many_logins'] = 'To many wrong logins, Please retry it after 15 minutes'; +$wb['username_txt'] = 'Username'; +$wb['password_txt'] = 'Password'; +$wb['login_button_txt'] = 'Login'; +?> diff --git a/interface/ispconfig/interface/login/lib/lang/ru.lng b/interface/ispconfig/interface/login/lib/lang/ru.lng new file mode 100644 index 0000000000000000000000000000000000000000..200d43d97e445060b132ef0719a652516467828c --- /dev/null +++ b/interface/ispconfig/interface/login/lib/lang/ru.lng @@ -0,0 +1,18 @@ + + diff --git a/interface/ispconfig/interface/login/lib/lang/se.lng b/interface/ispconfig/interface/login/lib/lang/se.lng new file mode 100644 index 0000000000000000000000000000000000000000..24fbbe1e09eb2b008949016098ef1eff8c269218 --- /dev/null +++ b/interface/ispconfig/interface/login/lib/lang/se.lng @@ -0,0 +1,17 @@ + 64 characters.'; +$wb['error_user_password_empty'] = 'Username or Password empty.'; +$wb['error_user_password_incorrect'] = 'Username or Password wrong.'; +$wb['error_user_blocked'] = 'User is blocked.'; +$wb['error_user_too_many_logins'] = 'To many wrong logins, Please retry it after 15 minutes'; +$wb['username_txt'] = 'Username'; +$wb['password_txt'] = 'Password'; +$wb['login_button_txt'] = 'Login'; +?> diff --git a/interface/ispconfig/interface/login/lib/lang/sk.lng b/interface/ispconfig/interface/login/lib/lang/sk.lng new file mode 100644 index 0000000000000000000000000000000000000000..ff376aef1c78e46fea14da885d776e2e542f9580 --- /dev/null +++ b/interface/ispconfig/interface/login/lib/lang/sk.lng @@ -0,0 +1,17 @@ + 64 znakov.'; +$wb['username_txt'] = 'Uvate?sk meno'; +$wb['password_txt'] = 'Heslo'; +$wb['login_button_txt'] = 'Prihlsenie'; +?> diff --git a/interface/ispconfig/interface/login/lib/lang/tr.lng b/interface/ispconfig/interface/login/lib/lang/tr.lng new file mode 100644 index 0000000000000000000000000000000000000000..73d464b8ad97785ccbe9dbc4e55ccee3d2288ded --- /dev/null +++ b/interface/ispconfig/interface/login/lib/lang/tr.lng @@ -0,0 +1,17 @@ + diff --git a/interface/ispconfig/interface/login/lib/module.conf.php b/interface/ispconfig/interface/login/lib/module.conf.php new file mode 100644 index 0000000000000000000000000000000000000000..b199ad575d5c9b4b4247dfa54aba12370164fb6f --- /dev/null +++ b/interface/ispconfig/interface/login/lib/module.conf.php @@ -0,0 +1,6 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/login/logout.php b/interface/ispconfig/interface/login/logout.php new file mode 100644 index 0000000000000000000000000000000000000000..bb3ba95eb93fd2d6469ec639f831642920c2739c --- /dev/null +++ b/interface/ispconfig/interface/login/logout.php @@ -0,0 +1,80 @@ +


    + Do you want to re-login as admin or log out?
    +
    + + +
    + + +
    + + +
    + '; + exit; +} + +$app->plugin->raiseEvent('logout',true); + +$_SESSION["s"]["user"] = null; +$_SESSION["s"]["module"] = null; +$_SESSION['s_old'] = null; + +//header("Location: ../index.php?phpsessid=".$_SESSION["s"]["id"]); + +if($_SESSION["s"]["site"]["logout"] != '') { + echo('URL_REDIRECT:'.$_SESSION["s"]["site"]["logout"]); +} else { + if($conf["interface_logout_url"] != '') { + echo('URL_REDIRECT:'.$conf["interface_logout_url"]); + } else { + echo('URL_REDIRECT:index.php'); + } +} +exit; +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/login/password_reset.php b/interface/ispconfig/interface/login/password_reset.php new file mode 100644 index 0000000000000000000000000000000000000000..ebe8154e466baba6c4b46f070d319c5f5c459a2a --- /dev/null +++ b/interface/ispconfig/interface/login/password_reset.php @@ -0,0 +1,92 @@ +uses('tpl'); +$app->tpl->newTemplate("form.tpl.htm"); +$app->tpl->setInclude('content_tpl','templates/password_reset.htm'); + +$app->tpl_defaults(); + +include(ISPC_ROOT_PATH.'/web/login/lib/lang/'.$_SESSION['s']['language'].'.lng'); +$app->tpl->setVar($wb); + +if(isset($_POST['username']) && $_POST['username'] != '' && $_POST['email'] != '' && $_POST['username'] != 'admin') { + + if(!preg_match("/^[\w\.\-\_]{1,64}$/", $_POST['username'])) die($app->lng('user_regex_error')); + if(!preg_match("/^\w+[\w.-]*\w+@\w+[\w.-]*\w+\.[a-z]{2,10}$/i", $_POST['email'])) die($app->lng('email_error')); + + $username = $app->db->quote($_POST['username']); + $email = $app->db->quote($_POST['email']); + + $client = $app->db->queryOneRecord("SELECT * FROM client WHERE username = '$username' AND email = '$email'"); + + if($client['client_id'] > 0) { + $new_password = md5 (uniqid (rand())); + $salt="$1$"; + $base64_alphabet='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; + for ($n=0;$n<8;$n++) { + //$salt.=chr(mt_rand(64,126)); + $salt.=$base64_alphabet[mt_rand(0,63)]; + } + $salt.="$"; + $new_password_encrypted = crypt($new_password,$salt); + $new_password_encrypted = $app->db->quote($new_password_encrypted); + + $username = $app->db->quote($client['username']); + $app->db->query("UPDATE sys_user SET passwort = '$new_password_encrypted' WHERE username = '$username'"); + $app->db->query("UPDATE client SET password = '$new_password_encrypted' WHERE username = '$username'"); + $app->tpl->setVar("message",$wb['pw_reset']); + + mail($client['email'],$wb['pw_reset_mail_title'],$wb['pw_reset_mail_msg'].$new_password); + + $app->plugin->raiseEvent('password_reset',true); + + } else { + $app->tpl->setVar("message",$wb['pw_error']); + } + +} else { + $app->tpl->setVar("message",$wb['pw_error_noinput']); +} + + + +$app->tpl_defaults(); +$app->tpl->pparse(); + + + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/login/templates/index.htm b/interface/ispconfig/interface/login/templates/index.htm new file mode 100644 index 0000000000000000000000000000000000000000..cd12199a513451d073ab8e8ab48ef6d7a779be90 --- /dev/null +++ b/interface/ispconfig/interface/login/templates/index.htm @@ -0,0 +1,33 @@ +

    Login

    +

    + + diff --git a/interface/ispconfig/interface/login/templates/password_reset.htm b/interface/ispconfig/interface/login/templates/password_reset.htm new file mode 100644 index 0000000000000000000000000000000000000000..f3f99d2250fc3d2ffbad4eb24400873f7fdcb2c3 --- /dev/null +++ b/interface/ispconfig/interface/login/templates/password_reset.htm @@ -0,0 +1,33 @@ +

    Password Reset

    +

    + +
    + + +

    +
    + +

    ERROR

    +
    + +
    +
    Password reset +
    + + +
    +
    + + +
    +
    + + + + +
    + +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/form/mail_alias.tform.php b/interface/ispconfig/interface/mail/form/mail_alias.tform.php new file mode 100644 index 0000000000000000000000000000000000000000..b74e36a124088b907fc049325d3a11e694d7d3cf --- /dev/null +++ b/interface/ispconfig/interface/mail/form/mail_alias.tform.php @@ -0,0 +1,114 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['alias'] = array ( + 'title' => "Email Alias", + 'width' => 100, + 'template' => "templates/mail_alias_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'source' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISEMAIL', + 'errmsg'=> 'email_error_isemail'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'destination' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => '', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT email FROM mail_user WHERE {AUTHSQL} ORDER BY email', + 'keyfield' => 'email', + 'valuefield' => 'email' + ), + 'validators' => array ( 0 => array ( 'type' => 'ISEMAIL', + 'errmsg'=> 'destination_error_isemail'), + ), + 'value' => '' + ), + 'type' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => '', + 'value' => array('alias' => 'Alias','forward'=>'Forward') + ), + 'active' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(0 => 'n',1 => 'y') + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/form/mail_aliasdomain.tform.php b/interface/ispconfig/interface/mail/form/mail_aliasdomain.tform.php new file mode 100644 index 0000000000000000000000000000000000000000..cc60cec1f226f20fa3659ff5fc79245ee591242a --- /dev/null +++ b/interface/ispconfig/interface/mail/form/mail_aliasdomain.tform.php @@ -0,0 +1,113 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['alias'] = array ( + 'title' => "Domain Alias", + 'width' => 100, + 'template' => "templates/mail_aliasdomain_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'source' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'source_error_empty'), + 1 => array ( 'type' => 'UNIQUE', + 'errmsg'=> 'source_error_unique'), + 2 => array ( 'type' => 'REGEX', + 'regex' => '/^\@[\w\.\-]{2,64}\.[a-zA-Z]{2,10}$/', + 'errmsg'=> 'source_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'destination' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'type' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => '', + 'value' => array('alias' => 'Alias','forward'=>'Forward') + ), + 'active' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(0 => 'n',1 => 'y') + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/form/mail_blacklist.tform.php b/interface/ispconfig/interface/mail/form/mail_blacklist.tform.php new file mode 100644 index 0000000000000000000000000000000000000000..83fc255d404cfe5ab7712bdb37d49be5f9c7fe00 --- /dev/null +++ b/interface/ispconfig/interface/mail/form/mail_blacklist.tform.php @@ -0,0 +1,110 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['blacklist'] = array ( + 'title' => "Blacklist", + 'width' => 100, + 'template' => "templates/mail_blacklist_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE mirror_server_id = 0 AND {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'value' => '' + ), + 'source' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'source_error_notempty'), + ), + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'access' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => 'REJECT', + 'value' => 'REJECT', + 'width' => '30', + 'maxlength' => '255' + ), + 'type' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => 'y', + 'value' => array('recipient' => 'Recipient', 'sender' => 'Sender', 'client' => 'Client') + ), + 'active' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(0 => 'n',1 => 'y') + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/form/mail_content_filter.tform.php b/interface/ispconfig/interface/mail/form/mail_content_filter.tform.php new file mode 100644 index 0000000000000000000000000000000000000000..d07cb561d38eebdfec8af2b1cde1141f604b75af --- /dev/null +++ b/interface/ispconfig/interface/mail/form/mail_content_filter.tform.php @@ -0,0 +1,116 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['filter'] = array ( + 'title' => "Filter", + 'width' => 100, + 'template' => "templates/mail_content_filter_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE mirror_server_id = 0 AND {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'value' => '' + ), + 'type' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => '', + 'value' => array('header' => 'Header Filter','body' => 'Body Filter','mime_header' => 'MIME-Header Filter','nested_header' => 'Nested-Header Filter') + ), + 'pattern' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'pattern_error_empty'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'data' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'action' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => '', + 'value' => array('DISCARD' => 'DISCARD','DUNNO'=>'DUNNO','FILTER'=>'FILTER','HOLD'=>'HOLD','IGNORE'=>'IGNORE','PREPEND'=>'PREPEND','REDIRECT'=>'REDIRECT','REPLACE'=>'REPLACE','REJECT'=>'REJECT','WARN'=>'WARN') + ), + 'active' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(0 => 'n',1 => 'y') + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/form/mail_domain.tform.php b/interface/ispconfig/interface/mail/form/mail_domain.tform.php new file mode 100644 index 0000000000000000000000000000000000000000..35f3218d6f865e982767d17ca3df3630cba31406 --- /dev/null +++ b/interface/ispconfig/interface/mail/form/mail_domain.tform.php @@ -0,0 +1,101 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['domain'] = array ( + 'title' => "Domain", + 'width' => 100, + 'template' => "templates/mail_domain_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE mail_server = 1 AND mirror_server_id = 0 AND {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'value' => '' + ), + 'domain' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'domain_error_empty'), + 1 => array ( 'type' => 'UNIQUE', + 'errmsg'=> 'domain_error_unique'), + 2 => array ( 'type' => 'REGEX', + 'regex' => '/^[\w\.\-]{2,255}\.[a-zA-Z]{2,10}$/', + 'errmsg'=> 'domain_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'active' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(0 => 'n',1 => 'y') + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/form/mail_domain_catchall.tform.php b/interface/ispconfig/interface/mail/form/mail_domain_catchall.tform.php new file mode 100644 index 0000000000000000000000000000000000000000..a5982507d5322cd059b62e16d6946542c2e99983 --- /dev/null +++ b/interface/ispconfig/interface/mail/form/mail_domain_catchall.tform.php @@ -0,0 +1,119 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['catchall'] = array ( + 'title' => "Email Catchall", + 'width' => 100, + 'template' => "templates/mail_domain_catchall_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'source' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'domain_error_empty'), + 1 => array ( 'type' => 'UNIQUE', + 'errmsg'=> 'domain_error_unique'), + 2 => array ( 'type' => 'REGEX', + 'regex' => '/^\@[\w\.\-]{2,255}\.[a-zA-Z]{2,10}$/', + 'errmsg'=> 'domain_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'destination' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => '', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT email FROM mail_user WHERE {AUTHSQL} ORDER BY email', + 'keyfield' => 'email', + 'valuefield' => 'email' + ), + 'validators' => array ( 0 => array ( 'type' => 'ISEMAIL', + 'errmsg'=> 'destination_error_isemail'), + ), + 'value' => '' + ), + 'type' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => '', + 'value' => array('alias' => 'Alias','forward'=>'Forward','catchall'=>'Catchall') + ), + 'active' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(0 => 'n',1 => 'y') + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/form/mail_forward.tform.php b/interface/ispconfig/interface/mail/form/mail_forward.tform.php new file mode 100644 index 0000000000000000000000000000000000000000..ef348f97705e466fc765241d3e00b82949682416 --- /dev/null +++ b/interface/ispconfig/interface/mail/form/mail_forward.tform.php @@ -0,0 +1,108 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['forward'] = array ( + 'title' => "Email Forward", + 'width' => 100, + 'template' => "templates/mail_forward_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'source' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISEMAIL', + 'errmsg'=> 'email_error_isemail'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'destination' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'type' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => '', + 'value' => array('forward'=>'Forward','alias' => 'Alias') + ), + 'active' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(0 => 'n',1 => 'y') + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/form/mail_get.tform.php b/interface/ispconfig/interface/mail/form/mail_get.tform.php new file mode 100644 index 0000000000000000000000000000000000000000..41bc014732ea22566c983ecb486fdb4330dd3460 --- /dev/null +++ b/interface/ispconfig/interface/mail/form/mail_get.tform.php @@ -0,0 +1,148 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['mailget'] = array ( + 'title' => "Get Email", + 'width' => 100, + 'template' => "templates/mail_get_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE mirror_server_id = 0 AND {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'value' => '' + ), + 'type' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => '', + 'value' => array('pop3' => 'POP3','imap'=>'IMAP','pop3ssl' => 'POP3SSL','imapssl'=>'IMAPSSL') + ), + 'source_server' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'source_server_error_isempty'), + 1 => array ( 'type' => 'REGEX', + 'regex' => '/^[\w\.\-]{2,64}\.[a-zA-Z]{2,10}$/', + 'errmsg'=> 'source_server_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'source_username' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'source_username_error_isempty'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'source_password' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'source_password_error_isempty'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'source_delete' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(0 => 'n',1 => 'y') + ), + 'destination' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => '', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT email FROM mail_user WHERE {AUTHSQL} ORDER BY email', + 'keyfield' => 'email', + 'valuefield' => 'email' + ), + 'validators' => array ( 0 => array ( 'type' => 'ISEMAIL', + 'errmsg'=> 'destination_error_isemail'), + ), + 'value' => '' + ), + 'active' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(0 => 'n',1 => 'y') + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/form/mail_relay_recipient.tform.php b/interface/ispconfig/interface/mail/form/mail_relay_recipient.tform.php new file mode 100644 index 0000000000000000000000000000000000000000..b89a7997f58281d10f2571e327c9d2476f37c7fb --- /dev/null +++ b/interface/ispconfig/interface/mail/form/mail_relay_recipient.tform.php @@ -0,0 +1,104 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['relay_recipient'] = array ( + 'title' => "Relay recipient", + 'width' => 100, + 'template' => "templates/mail_relay_recipient_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'value' => '' + ), + 'source' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'source_error_notempty'), + ), + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'access' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => 'OK', + 'value' => 'OK', + 'width' => '30', + 'maxlength' => '255' + ), + 'active' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(0 => 'n',1 => 'y') + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/form/mail_spamfilter.tform.php b/interface/ispconfig/interface/mail/form/mail_spamfilter.tform.php new file mode 100644 index 0000000000000000000000000000000000000000..e85f7ffdc9586f7ba36d6a0fefe43e4505ea8bd6 --- /dev/null +++ b/interface/ispconfig/interface/mail/form/mail_spamfilter.tform.php @@ -0,0 +1,146 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['spamfilter'] = array ( + 'title' => "Spamfilter", + 'width' => 100, + 'template' => "templates/mail_spamfilter_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'email' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'email_error_notempty'), + 1 => array ( 'type' => 'UNIQUE', + 'errmsg'=> 'email_error_unique'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'spam_rewrite_score_int' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '5.00', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + 'spam_redirect_score_int' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '7.00', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + 'spam_delete_score_int' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '15.00', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + 'spam_rewrite_subject' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '***SPAM***', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'spam_redirect_maildir' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT mailbox_id,email FROM mail_box WHERE {AUTHSQL} ORDER BY email', + 'keyfield'=> 'mailbox_id', + 'valuefield'=> 'email' + ), + 'default' => '', + 'value' => '' + ), + 'spam_redirect_maildir_purge' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '7', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + 'active' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(0 => 'n',1 => 'y') + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/form/mail_transport.tform.php b/interface/ispconfig/interface/mail/form/mail_transport.tform.php new file mode 100644 index 0000000000000000000000000000000000000000..f277f927081c04ab63e52ec7476cc381be7cb0ee --- /dev/null +++ b/interface/ispconfig/interface/mail/form/mail_transport.tform.php @@ -0,0 +1,111 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['transport'] = array ( + 'title' => "Email transport", + 'width' => 100, + 'template' => "templates/mail_transport_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE mirror_server_id = 0 AND {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'value' => '' + ), + 'domain' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'UNIQUE', + 'errmsg'=> 'domain_error_unique'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'transport' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'sort_order' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => 5, + 'value' => array(1 => 1, 2 => 2, 3 => 3, 4 => 4, 5 => 5, 6 => 6, 7 => 7, 8 => 8, 9 => 9, 10 => 10) + ), + 'active' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(0 => 'n',1 => 'y') + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/form/mail_user.tform.php b/interface/ispconfig/interface/mail/form/mail_user.tform.php new file mode 100644 index 0000000000000000000000000000000000000000..570ccb4ea1833cca668208ddc83ff8d347fff9a3 --- /dev/null +++ b/interface/ispconfig/interface/mail/form/mail_user.tform.php @@ -0,0 +1,280 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['mailuser'] = array ( + 'title' => "Mailbox", + 'width' => 100, + 'template' => "templates/mail_user_mailbox_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'email' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISEMAIL', + 'errmsg'=> 'email_error_isemail'), + 1 => array ( 'type' => 'UNIQUE', + 'errmsg'=> 'email_error_unique'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'password' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'PASSWORD', + 'encryption'=> 'ENCRYPT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'name' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'quota' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'quota_error_isint'), + 1 => array ( 'type' => 'REGEX', + 'regex' => '/^([0-9]*)$/', + 'errmsg'=> 'quota_error_value'), + ), + 'default' => '-1', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'maildir' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'homedir' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'uid' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + 'gid' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + 'postfix' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(1 => 'y',0 => 'n') + ), + /* + 'access' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(1 => 'y',0 => 'n') + ), + */ + 'disableimap' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'n', + 'value' => array(1 => 'y',0 => 'n') + ), + 'disablepop3' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'n', + 'value' => array(1 => 'y',0 => 'n') + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + +$form["tabs"]['autoresponder'] = array ( + 'title' => "Autoresponder", + 'width' => 100, + 'template' => "templates/mail_user_autoresponder_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'autoresponder_text' => array ( + 'datatype' => 'TEXT', + 'formtype' => 'TEXTAREA', + 'default' => '', + 'value' => '', + 'cols' => '30', + 'rows' => '15' + ), + 'autoresponder' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'n', + 'value' => array(1 => 'y',0 => 'n') + ), + 'autoresponder_start_date' => array ( + 'datatype' => 'DATETIME', + 'formtype' => 'DATETIME', + 'validators'=> array ( 0 => array ( 'type' => 'CUSTOM', + 'class' => 'validate_autoresponder', + 'function' => 'start_date', + 'errmsg'=> 'autoresponder_start_date_isfuture'), + ), + ), + 'autoresponder_end_date' => array ( + 'datatype' => 'DATETIME', + 'formtype' => 'DATETIME', + 'validators'=> array ( 0 => array ( 'type' => 'CUSTOM', + 'class' => 'validate_autoresponder', + 'function' => 'end_date', + 'errmsg'=> 'autoresponder_end_date_isgreater'), + ), + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + +$form["tabs"]['filter_records'] = array ( + 'title' => "Mail Filter", + 'width' => 100, + 'template' => "templates/mail_user_mailfilter_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'move_junk' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'n', + 'value' => array(0 => 'n',1 => 'y') + ), + ################################## + # ENDE Datatable fields + ################################## + ), + 'plugins' => array ( + 'filter_records' => array ( + 'class' => 'plugin_listview', + 'options' => array( + 'listdef' => 'list/mail_user_filter.list.php', + 'sqlextwhere' => "mailuser_id = ".@intval(@$_REQUEST['id']), + 'sql_order_by' => "ORDER BY rulename" + ) + ) + ) +); + +if($_SESSION["s"]["user"]["typ"] == 'admin' || 'user') { + +$form["tabs"]['mailfilter'] = array ( + 'title' => "Custom Rules", + 'width' => 100, + 'template' => "templates/mail_user_custom_rules_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'custom_mailfilter' => array ( + 'datatype' => 'TEXT', + 'formtype' => 'TEXTAREA', + 'default' => '', + 'value' => '', + 'cols' => '30', + 'rows' => '15' + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + +} + + +?> diff --git a/interface/ispconfig/interface/mail/form/mail_user.tform.php.orig b/interface/ispconfig/interface/mail/form/mail_user.tform.php.orig new file mode 100644 index 0000000000000000000000000000000000000000..5214b6209090453ff920ad88c430e112375fdae2 --- /dev/null +++ b/interface/ispconfig/interface/mail/form/mail_user.tform.php.orig @@ -0,0 +1,280 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['mailuser'] = array ( + 'title' => "Mailbox", + 'width' => 100, + 'template' => "templates/mail_user_mailbox_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'email' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISEMAIL', + 'errmsg'=> 'email_error_isemail'), + 1 => array ( 'type' => 'UNIQUE', + 'errmsg'=> 'email_error_unique'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'password' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'PASSWORD', + 'encryption'=> 'CRYPT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'name' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'quota' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'quota_error_isint'), + 1 => array ( 'type' => 'REGEX', + 'regex' => '/^([0-9]*)$/', + 'errmsg'=> 'quota_error_value'), + ), + 'default' => '-1', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'maildir' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'homedir' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'uid' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + 'gid' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + 'postfix' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(1 => 'y',0 => 'n') + ), + /* + 'access' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(1 => 'y',0 => 'n') + ), + */ + 'disableimap' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'n', + 'value' => array(1 => 'y',0 => 'n') + ), + 'disablepop3' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'n', + 'value' => array(1 => 'y',0 => 'n') + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + +$form["tabs"]['autoresponder'] = array ( + 'title' => "Autoresponder", + 'width' => 100, + 'template' => "templates/mail_user_autoresponder_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'autoresponder_text' => array ( + 'datatype' => 'TEXT', + 'formtype' => 'TEXTAREA', + 'default' => '', + 'value' => '', + 'cols' => '30', + 'rows' => '15' + ), + 'autoresponder' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'n', + 'value' => array(1 => 'y',0 => 'n') + ), + 'autoresponder_start_date' => array ( + 'datatype' => 'DATETIME', + 'formtype' => 'DATETIME', + 'validators'=> array ( 0 => array ( 'type' => 'CUSTOM', + 'class' => 'validate_autoresponder', + 'function' => 'start_date', + 'errmsg'=> 'autoresponder_start_date_isfuture'), + ), + ), + 'autoresponder_end_date' => array ( + 'datatype' => 'DATETIME', + 'formtype' => 'DATETIME', + 'validators'=> array ( 0 => array ( 'type' => 'CUSTOM', + 'class' => 'validate_autoresponder', + 'function' => 'end_date', + 'errmsg'=> 'autoresponder_end_date_isgreater'), + ), + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + +$form["tabs"]['filter_records'] = array ( + 'title' => "Mail Filter", + 'width' => 100, + 'template' => "templates/mail_user_mailfilter_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'move_junk' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'n', + 'value' => array(0 => 'n',1 => 'y') + ), + ################################## + # ENDE Datatable fields + ################################## + ), + 'plugins' => array ( + 'filter_records' => array ( + 'class' => 'plugin_listview', + 'options' => array( + 'listdef' => 'list/mail_user_filter.list.php', + 'sqlextwhere' => "mailuser_id = ".@intval(@$_REQUEST['id']), + 'sql_order_by' => "ORDER BY rulename" + ) + ) + ) +); + +if($_SESSION["s"]["user"]["typ"] == 'admin') { + +$form["tabs"]['mailfilter'] = array ( + 'title' => "Custom Rules", + 'width' => 100, + 'template' => "templates/mail_user_custom_rules_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'custom_mailfilter' => array ( + 'datatype' => 'TEXT', + 'formtype' => 'TEXTAREA', + 'default' => '', + 'value' => '', + 'cols' => '30', + 'rows' => '15' + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + +} + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/form/mail_user_filter.tform.php b/interface/ispconfig/interface/mail/form/mail_user_filter.tform.php new file mode 100644 index 0000000000000000000000000000000000000000..cafab8ad6e8a2f642dcf85579d208c07d8bee17c --- /dev/null +++ b/interface/ispconfig/interface/mail/form/mail_user_filter.tform.php @@ -0,0 +1,135 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = 'r'; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['filter'] = array ( + 'title' => "Filter", + 'width' => 100, + 'template' => "templates/mail_user_filter_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'mailuser_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => @intval($_REQUEST["mailuser_id"]), + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'rulename' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'rulename_error_empty'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'source' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => '', + 'value' => array('Subject' => 'Subject','From'=>'From','To'=>'To') + ), + 'op' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => '', + 'value' => array('contains'=>'Contains','is' => 'Is','begins'=>'Begins with','ends'=>'Ends with') + ), + 'searchterm' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'searchterm_is_empty'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'action' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => '', + 'value' => array('move' => 'Move to','delete'=>'Delete') + ), + 'target' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'REGEX', + 'regex' => '/^[a-zA-Z0-9\.\-\_\ ]{0,100}$/', + 'errmsg'=> 'target_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'active' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(0 => 'n',1 => 'y') + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + + +?> diff --git a/interface/ispconfig/interface/mail/form/mail_user_filter.tform.php.orig b/interface/ispconfig/interface/mail/form/mail_user_filter.tform.php.orig new file mode 100644 index 0000000000000000000000000000000000000000..565d5c49796b916941e56b041e9818aa49066698 --- /dev/null +++ b/interface/ispconfig/interface/mail/form/mail_user_filter.tform.php.orig @@ -0,0 +1,135 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = 'r'; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['filter'] = array ( + 'title' => "Filter", + 'width' => 100, + 'template' => "templates/mail_user_filter_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'mailuser_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => @intval($_REQUEST["mailuser_id"]), + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'rulename' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'rulename_error_empty'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'source' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => '', + 'value' => array('Subject' => 'Subject','From'=>'From','To'=>'To') + ), + 'op' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => '', + 'value' => array('contains'=>'Contains','is' => 'Is','begins'=>'Begins with','ends'=>'Ends with') + ), + 'searchterm' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'searchterm_is_empty'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'action' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => '', + 'value' => array('move' => 'Move to','delete'=>'Delete') + ), + 'target' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'REGEX', + 'regex' => '/^[a-zA-Z0-9\.\-\_\ ]{0,100}$/', + 'errmsg'=> 'target_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'active' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(0 => 'n',1 => 'y') + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + + +?> diff --git a/interface/ispconfig/interface/mail/form/mail_whitelist.tform.php b/interface/ispconfig/interface/mail/form/mail_whitelist.tform.php new file mode 100644 index 0000000000000000000000000000000000000000..bf52f561a12c2153def7f2ff08aefe060888b632 --- /dev/null +++ b/interface/ispconfig/interface/mail/form/mail_whitelist.tform.php @@ -0,0 +1,110 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['whitelist'] = array ( + 'title' => "Witelist", + 'width' => 100, + 'template' => "templates/mail_whitelist_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'value' => '' + ), + 'source' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'source_error_notempty'), + ), + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'access' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => 'OK', + 'value' => 'OK', + 'width' => '30', + 'maxlength' => '255' + ), + 'type' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => 'y', + 'value' => array('recipient' => 'Recipient', 'sender' => 'Sender', 'client' => 'Client') + ), + 'active' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(0 => 'n',1 => 'y') + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/form/spamfilter_blacklist.tform.php b/interface/ispconfig/interface/mail/form/spamfilter_blacklist.tform.php new file mode 100644 index 0000000000000000000000000000000000000000..098c0dadc11e893bed2ebf875b7da8c68f1a3cd1 --- /dev/null +++ b/interface/ispconfig/interface/mail/form/spamfilter_blacklist.tform.php @@ -0,0 +1,119 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['blacklist'] = array ( + 'title' => "Blacklist", + 'width' => 100, + 'template' => "templates/spamfilter_blacklist_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE mirror_server_id = 0 AND {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'value' => '' + ), + 'wb' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => 'B', + 'value' => array('W' => 'blacklist', 'B' => 'Blacklist') + ), + 'rid' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT id,email FROM spamfilter_users WHERE {AUTHSQL} ORDER BY email', + 'keyfield'=> 'id', + 'valuefield'=> 'email' + ), + 'value' => '' + ), + 'email' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'email_error_notempty'), + ), + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'priority' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => 5, + 'value' => array(1 => 1, 2 => 2, 3 => 3, 4 => 4, 5 => 5, 6 => 6, 7 => 7, 8 => 8, 9 => 9, 10 => 10) + ), + 'active' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(0 => 'n',1 => 'y') + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/form/spamfilter_config.tform.php b/interface/ispconfig/interface/mail/form/spamfilter_config.tform.php new file mode 100644 index 0000000000000000000000000000000000000000..c04b50e7762e0fb1c787f675769852a00690cdef --- /dev/null +++ b/interface/ispconfig/interface/mail/form/spamfilter_config.tform.php @@ -0,0 +1,275 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['server'] = array ( + 'title' => "Server", + 'width' => 100, + 'template' => "templates/spamfilter_config_server_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'ip_address' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '192.168.0.105', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'ip_address_error_empty'), + ), + 'value' => '', + 'width' => '15', + 'maxlength' => '255' + ), + 'netmask' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '255.255.255.0', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'netmask_error_empty'), + ), + 'value' => '', + 'width' => '15', + 'maxlength' => '255' + ), + 'gateway' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '192.168.0.1', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'gateway_error_empty'), + ), + 'value' => '', + 'width' => '15', + 'maxlength' => '255' + ), + 'hostname' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => 'server1.domain.tld', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'hostname_error_empty'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + 'nameservers' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '192.168.0.1,192.168.0.2', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'nameservers_error_empty'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + +$form["tabs"]['mail'] = array ( + 'title' => "Mail", + 'width' => 100, + 'template' => "templates/spamfilter_config_mail_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'module' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => '', + 'value' => array('postfix_mysql' => 'postfix_mysql') + ), + 'maildir_path' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '/home/vmail/[domain]/[localpart]/', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'maildir_path_error_empty'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + 'homedir_path' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '/home/vmail/', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'homedir_path_error_empty'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + 'mailuser_uid' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '5000', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'mailuser_uid_error_empty'), + ), + 'value' => '', + 'width' => '10', + 'maxlength' => '255' + ), + 'mailuser_gid' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '5000', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'mailuser_gid_error_empty'), + ), + 'value' => '', + 'width' => '10', + 'maxlength' => '255' + ), + 'mailuser_name' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => 'vmail', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'mailuser_name_error_empty'), + ), + 'value' => '', + 'width' => '10', + 'maxlength' => '255' + ), + 'mailuser_group' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => 'vmail', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'mailuser_group_error_empty'), + ), + 'value' => '', + 'width' => '10', + 'maxlength' => '255' + ), + 'relayhost' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + 'relayhost_user' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + 'relayhost_password' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + 'mailbox_size_limit' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '0', + 'value' => '', + 'width' => '10', + 'maxlength' => '15' + ), + 'message_size_limit' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '0', + 'value' => '', + 'width' => '10', + 'maxlength' => '15' + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + +$form["tabs"]['getmail'] = array ( + 'title' => "Getmail", + 'width' => 100, + 'template' => "templates/spamfilter_config_getmail_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'getmail_config_dir' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'getmail_config_dir_error_empty'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/form/spamfilter_policy.tform.php b/interface/ispconfig/interface/mail/form/spamfilter_policy.tform.php new file mode 100644 index 0000000000000000000000000000000000000000..bf6588c52fa8b16aa71b84d6fd651dcbf40e1e85 --- /dev/null +++ b/interface/ispconfig/interface/mail/form/spamfilter_policy.tform.php @@ -0,0 +1,382 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = 'r'; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['policy'] = array ( + 'title' => "Policy", + 'width' => 100, + 'template' => "templates/spamfilter_policy_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'policy_name' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'policyname_error_notempty'), + ), + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'virus_lover' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => 'N', + 'value' => array('N' => 'No','Y' => 'Yes') + ), + 'spam_lover' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => 'N', + 'value' => array('N' => 'No','Y' => 'Yes') + ), + 'banned_files_lover' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => 'N', + 'value' => array('N' => 'No','Y' => 'Yes') + ), + 'bad_header_lover' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => 'N', + 'value' => array('N' => 'No','Y' => 'Yes') + ), + 'bypass_virus_checks' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => 'N', + 'value' => array('N' => 'No','Y' => 'Yes') + ), + 'bypass_banned_checks' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => 'N', + 'value' => array('N' => 'No','Y' => 'Yes') + ), + 'bypass_header_checks' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => 'N', + 'value' => array('N' => 'No','Y' => 'Yes') + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + +$form["tabs"]['quarantine'] = array ( + 'title' => "Quarantine", + 'width' => 100, + 'template' => "templates/spamfilter_quarantine_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'virus_quarantine_to' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'spam_quarantine_to' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'banned_quarantine_to' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'bad_header_quarantine_to' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'clean_quarantine_to' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'other_quarantine_to' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + +$form["tabs"]['taglevel'] = array ( + 'title' => "Tag-Level", + 'width' => 100, + 'template' => "templates/spamfilter_taglevel_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'spam_tag_level' => array ( + 'datatype' => 'DOUBLE', + 'formtype' => 'TEXT', + 'default' => '0', + 'value' => '', + 'width' => '10', + 'maxlength' => '255' + ), + 'spam_tag2_level' => array ( + 'datatype' => 'DOUBLE', + 'formtype' => 'TEXT', + 'default' => '0', + 'value' => '', + 'width' => '10', + 'maxlength' => '255' + ), + 'spam_kill_level' => array ( + 'datatype' => 'DOUBLE', + 'formtype' => 'TEXT', + 'default' => '0', + 'value' => '', + 'width' => '10', + 'maxlength' => '255' + ), + 'spam_dsn_cutoff_level' => array ( + 'datatype' => 'DOUBLE', + 'formtype' => 'TEXT', + 'default' => '0', + 'value' => '', + 'width' => '10', + 'maxlength' => '255' + ), + 'spam_quarantine_cutoff_level' => array ( + 'datatype' => 'DOUBLE', + 'formtype' => 'TEXT', + 'default' => '0', + 'value' => '', + 'width' => '10', + 'maxlength' => '255' + ), + 'spam_modifies_subj' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => 'N', + 'value' => array('N' => 'No','Y' => 'Yes') + ), + 'spam_subject_tag' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'spam_subject_tag2' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + +$form["tabs"]['other'] = array ( + 'title' => "Other", + 'width' => 100, + 'template' => "templates/spamfilter_other_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'addr_extension_virus' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'addr_extension_spam' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'addr_extension_banned' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'addr_extension_bad_header' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'warnvirusrecip' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => 'N', + 'value' => array('N' => 'No','Y' => 'Yes') + ), + 'warnbannedrecip' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => 'N', + 'value' => array('N' => 'No','Y' => 'Yes') + ), + 'warnbadhrecip' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => 'N', + 'value' => array('N' => 'No','Y' => 'Yes') + ), + 'newvirus_admin' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'virus_admin' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'banned_admin' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'bad_header_admin' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'spam_admin' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + + 'message_size_limit' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '10', + 'maxlength' => '255' + ), + 'banned_rulenames' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + + ################################## + # ENDE Datatable fields + ################################## + ) +); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/form/spamfilter_users.tform.php b/interface/ispconfig/interface/mail/form/spamfilter_users.tform.php new file mode 100644 index 0000000000000000000000000000000000000000..75cc35dc9253556d9dd91ca0a6f3881b7edb5764 --- /dev/null +++ b/interface/ispconfig/interface/mail/form/spamfilter_users.tform.php @@ -0,0 +1,125 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['users'] = array ( + 'title' => "Users", + 'width' => 100, + 'template' => "templates/spamfilter_users_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE mirror_server_id = 0 AND {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'value' => '' + ), + 'priority' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => 5, + 'value' => array(1 => 1, 2 => 2, 3 => 3, 4 => 4, 5 => 5, 6 => 6, 7 => 7, 8 => 8, 9 => 9, 10 => 10) + ), + 'policy_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT id,policy_name FROM spamfilter_policy WHERE {AUTHSQL} ORDER BY policy_name', + 'keyfield'=> 'id', + 'valuefield'=> 'policy_name' + ), + 'value' => '' + ), + 'email' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'email_error_notempty'), + ), + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'fullname' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'fullname_error_notempty'), + ), + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'local' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => 'Y', + 'value' => array('Y' => 'Yes','N' => 'No') + ), + + ################################## + # ENDE Datatable fields + ################################## + ) +); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/form/spamfilter_whitelist.tform.php b/interface/ispconfig/interface/mail/form/spamfilter_whitelist.tform.php new file mode 100644 index 0000000000000000000000000000000000000000..f3b5414082a20156166f18abe5fb7fc550154d38 --- /dev/null +++ b/interface/ispconfig/interface/mail/form/spamfilter_whitelist.tform.php @@ -0,0 +1,119 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['whitelist'] = array ( + 'title' => "Whitelist", + 'width' => 100, + 'template' => "templates/spamfilter_whitelist_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE mirror_server_id = 0 AND {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'value' => '' + ), + 'wb' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => 'W', + 'value' => array('W' => 'Whitelist', 'B' => 'Blacklist') + ), + 'rid' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT id,email FROM spamfilter_users WHERE {AUTHSQL} ORDER BY email', + 'keyfield'=> 'id', + 'valuefield'=> 'email' + ), + 'value' => '' + ), + 'email' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'email_error_notempty'), + ), + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'priority' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => 5, + 'value' => array(1 => 1, 2 => 2, 3 => 3, 4 => 4, 5 => 5, 6 => 6, 7 => 7, 8 => 8, 9 => 9, 10 => 10) + ), + 'active' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(0 => 'n',1 => 'y') + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/admin.conf.php b/interface/ispconfig/interface/mail/lib/admin.conf.php new file mode 100644 index 0000000000000000000000000000000000000000..a45d4403455c5c46f438046f088398e241cbc3d9 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/admin.conf.php @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/bg.lng b/interface/ispconfig/interface/mail/lib/lang/bg.lng new file mode 100644 index 0000000000000000000000000000000000000000..e3a31e332f3521f303403574d36fd33ac7559d8d --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/bg.lng @@ -0,0 +1,47 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/bg_mail_alias.lng b/interface/ispconfig/interface/mail/lib/lang/bg_mail_alias.lng new file mode 100644 index 0000000000000000000000000000000000000000..44b6fed86b1834dd04b88ee8e106fd5cfe2894ed --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/bg_mail_alias.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/bg_mail_alias_list.lng b/interface/ispconfig/interface/mail/lib/lang/bg_mail_alias_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..0a44ea4f72868d80dcb76fed178b8b2172ffe4b5 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/bg_mail_alias_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/bg_mail_aliasdomain.lng b/interface/ispconfig/interface/mail/lib/lang/bg_mail_aliasdomain.lng new file mode 100644 index 0000000000000000000000000000000000000000..5815d1e6099a56a7282966cef5c88f89fad9a321 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/bg_mail_aliasdomain.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/bg_mail_aliasdomain_list.lng b/interface/ispconfig/interface/mail/lib/lang/bg_mail_aliasdomain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..d96a63e2a4db69d1cc277febcdc1e21afe3f8366 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/bg_mail_aliasdomain_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/bg_mail_blacklist.lng b/interface/ispconfig/interface/mail/lib/lang/bg_mail_blacklist.lng new file mode 100644 index 0000000000000000000000000000000000000000..5b2815c0d00a2e2c3f96064cfd11561472e8ed78 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/bg_mail_blacklist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/bg_mail_blacklist_list.lng b/interface/ispconfig/interface/mail/lib/lang/bg_mail_blacklist_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..a72052f085daf8d9fea34a8e90de8c45767b0d6c --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/bg_mail_blacklist_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/bg_mail_content_filter.lng b/interface/ispconfig/interface/mail/lib/lang/bg_mail_content_filter.lng new file mode 100644 index 0000000000000000000000000000000000000000..9d5e5f9baf6e94e57b85c4e390cbc37d4d6e57ca --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/bg_mail_content_filter.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/bg_mail_content_filter_list.lng b/interface/ispconfig/interface/mail/lib/lang/bg_mail_content_filter_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..8c1e5e2e753bccf56cb15ecc4a130546378cb93c --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/bg_mail_content_filter_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/bg_mail_domain.lng b/interface/ispconfig/interface/mail/lib/lang/bg_mail_domain.lng new file mode 100644 index 0000000000000000000000000000000000000000..6120e82b7dc518f9d496329f38d0cf57257e3941 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/bg_mail_domain.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/bg_mail_domain_catchall.lng b/interface/ispconfig/interface/mail/lib/lang/bg_mail_domain_catchall.lng new file mode 100644 index 0000000000000000000000000000000000000000..382e97f0e11bf60d4aea2734fdb3e3eb456be700 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/bg_mail_domain_catchall.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/bg_mail_domain_catchall_list.lng b/interface/ispconfig/interface/mail/lib/lang/bg_mail_domain_catchall_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..7d076dd4c444ff04b721a810cee0ab7e5e955f72 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/bg_mail_domain_catchall_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/bg_mail_domain_list.lng b/interface/ispconfig/interface/mail/lib/lang/bg_mail_domain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..d844781311c418578094d9e94f1b271d501d9331 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/bg_mail_domain_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/bg_mail_forward.lng b/interface/ispconfig/interface/mail/lib/lang/bg_mail_forward.lng new file mode 100644 index 0000000000000000000000000000000000000000..7d237e14f7920e64a1d69dc74d675af9147bbf7b --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/bg_mail_forward.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/bg_mail_forward_list.lng b/interface/ispconfig/interface/mail/lib/lang/bg_mail_forward_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..f4529440c1c487cc62752ed7bb92aaa81d247053 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/bg_mail_forward_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/bg_mail_get.lng b/interface/ispconfig/interface/mail/lib/lang/bg_mail_get.lng new file mode 100644 index 0000000000000000000000000000000000000000..5e42823b67151b778e87ce5bdd380318935acd42 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/bg_mail_get.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/bg_mail_get_list.lng b/interface/ispconfig/interface/mail/lib/lang/bg_mail_get_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..4baf67e0251cd77ba86cd566e8c14d2f3a1e2fee --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/bg_mail_get_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/bg_mail_relay_recipient.lng b/interface/ispconfig/interface/mail/lib/lang/bg_mail_relay_recipient.lng new file mode 100644 index 0000000000000000000000000000000000000000..b5c8724da3a5c1f264ff46ee92bec05b2cd223d0 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/bg_mail_relay_recipient.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/bg_mail_relay_recipient_list.lng b/interface/ispconfig/interface/mail/lib/lang/bg_mail_relay_recipient_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..36045f4e35d3674336045b6b272ff31c571772c4 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/bg_mail_relay_recipient_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/bg_mail_spamfilter.lng b/interface/ispconfig/interface/mail/lib/lang/bg_mail_spamfilter.lng new file mode 100644 index 0000000000000000000000000000000000000000..e0a2a2f9aff0864b0dbb35fbd88d977807c1114a --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/bg_mail_spamfilter.lng @@ -0,0 +1,17 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/bg_mail_spamfilter_list.lng b/interface/ispconfig/interface/mail/lib/lang/bg_mail_spamfilter_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..728f3d365d655d41137581cc52e2201f12ff3a9f --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/bg_mail_spamfilter_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/bg_mail_transport.lng b/interface/ispconfig/interface/mail/lib/lang/bg_mail_transport.lng new file mode 100644 index 0000000000000000000000000000000000000000..a4d7bbc44ccd4ea9ca7d30fd9a3884807fbe505c --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/bg_mail_transport.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/bg_mail_transport_list.lng b/interface/ispconfig/interface/mail/lib/lang/bg_mail_transport_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..a96c081e63319df7ba9067464c9f2dc2a646b909 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/bg_mail_transport_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/bg_mail_user.lng b/interface/ispconfig/interface/mail/lib/lang/bg_mail_user.lng new file mode 100644 index 0000000000000000000000000000000000000000..37450364393de714816ecafebbaba15abb29336f --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/bg_mail_user.lng @@ -0,0 +1,41 @@ + 1'; +$wb['autoresponder_start_date_txt'] = 'Start on'; +$wb['autoresponder_start_date_isfuture'] = 'Start date cannot be in the past.'; +$wb['autoresponder_end_date_txt'] = 'End by'; +$wb['autoresponder_end_date_isgreater'] = 'End date must be set and be later than start date.'; +$wb['move_junk_txt'] = 'Move Spam Emails to Junk directory'; +$wb['name_txt'] = 'Realname'; +$wb['name_optional_txt'] = '(Optional)'; +?> diff --git a/interface/ispconfig/interface/mail/lib/lang/bg_mail_user_filter.lng b/interface/ispconfig/interface/mail/lib/lang/bg_mail_user_filter.lng new file mode 100644 index 0000000000000000000000000000000000000000..e633c1bd1e4c09a7bb86cf84f5aec2fd7838d9fa --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/bg_mail_user_filter.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/bg_mail_user_filter_list.lng b/interface/ispconfig/interface/mail/lib/lang/bg_mail_user_filter_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..2754259f47a28bfc2eb7b844f87627b86316fded --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/bg_mail_user_filter_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/bg_mail_user_list.lng b/interface/ispconfig/interface/mail/lib/lang/bg_mail_user_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..6063cef128dfb24ede1089c29d04ca329c374e5f --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/bg_mail_user_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/bg_mail_user_stats_list.lng b/interface/ispconfig/interface/mail/lib/lang/bg_mail_user_stats_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..edde65bd7a8b860128f4f53769c7afebbfb78daf --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/bg_mail_user_stats_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/bg_mail_whitelist.lng b/interface/ispconfig/interface/mail/lib/lang/bg_mail_whitelist.lng new file mode 100644 index 0000000000000000000000000000000000000000..92c365ba2b55b1f47c63880b3722132cf6842950 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/bg_mail_whitelist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/bg_mail_whitelist_list.lng b/interface/ispconfig/interface/mail/lib/lang/bg_mail_whitelist_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..eaa7eb3fc58a897b7d606e2476ed3658db7d7d29 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/bg_mail_whitelist_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/bg_spamfilter_blacklist.lng b/interface/ispconfig/interface/mail/lib/lang/bg_spamfilter_blacklist.lng new file mode 100644 index 0000000000000000000000000000000000000000..5a85949ab68a2dc40878e5804446e89f3e0ecc09 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/bg_spamfilter_blacklist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/bg_spamfilter_blacklist_list.lng b/interface/ispconfig/interface/mail/lib/lang/bg_spamfilter_blacklist_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..1b17e644252ee06fd6767145d4437741a1b31809 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/bg_spamfilter_blacklist_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/bg_spamfilter_config.lng b/interface/ispconfig/interface/mail/lib/lang/bg_spamfilter_config.lng new file mode 100644 index 0000000000000000000000000000000000000000..2843133ca3638ec86a1cd4e921cabbe415825b34 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/bg_spamfilter_config.lng @@ -0,0 +1,20 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/bg_spamfilter_config_list.lng b/interface/ispconfig/interface/mail/lib/lang/bg_spamfilter_config_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..70e49e22b8f2c5feba878d5713622819de78fbc4 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/bg_spamfilter_config_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/bg_spamfilter_policy.lng b/interface/ispconfig/interface/mail/lib/lang/bg_spamfilter_policy.lng new file mode 100644 index 0000000000000000000000000000000000000000..e876330a68c7c365b12bf9a3f3cf6b5a652a6093 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/bg_spamfilter_policy.lng @@ -0,0 +1,38 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/bg_spamfilter_policy_list.lng b/interface/ispconfig/interface/mail/lib/lang/bg_spamfilter_policy_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..04491ae4cd85667a4e62826f4213d54339f6c266 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/bg_spamfilter_policy_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/bg_spamfilter_users.lng b/interface/ispconfig/interface/mail/lib/lang/bg_spamfilter_users.lng new file mode 100644 index 0000000000000000000000000000000000000000..a93d94dbae5a1d6f25133988fefceaa2ddc3bc13 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/bg_spamfilter_users.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/bg_spamfilter_users_list.lng b/interface/ispconfig/interface/mail/lib/lang/bg_spamfilter_users_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..ed3d7a399df134fbb4870271df6362d9000b2bb1 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/bg_spamfilter_users_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/bg_spamfilter_whitelist.lng b/interface/ispconfig/interface/mail/lib/lang/bg_spamfilter_whitelist.lng new file mode 100644 index 0000000000000000000000000000000000000000..5a85949ab68a2dc40878e5804446e89f3e0ecc09 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/bg_spamfilter_whitelist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/bg_spamfilter_whitelist_list.lng b/interface/ispconfig/interface/mail/lib/lang/bg_spamfilter_whitelist_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..d209d17a4c941e9b49aa154e154d767fe3d3cb18 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/bg_spamfilter_whitelist_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/br.lng b/interface/ispconfig/interface/mail/lib/lang/br.lng new file mode 100644 index 0000000000000000000000000000000000000000..5e325a5677eac6d899f45d7f8d2fa7e645a27449 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/br.lng @@ -0,0 +1,47 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/br_mail_alias.lng b/interface/ispconfig/interface/mail/lib/lang/br_mail_alias.lng new file mode 100644 index 0000000000000000000000000000000000000000..b3b08e349e33b6e0e419ea57d05fc90b5fc4b747 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/br_mail_alias.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/br_mail_alias_list.lng b/interface/ispconfig/interface/mail/lib/lang/br_mail_alias_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..c503b0bcc8f0b8a236bb9a8a19486b6322b3e448 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/br_mail_alias_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/br_mail_aliasdomain.lng b/interface/ispconfig/interface/mail/lib/lang/br_mail_aliasdomain.lng new file mode 100644 index 0000000000000000000000000000000000000000..7d8602823248ea4b1cc4b5f07338cc96f9fe3712 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/br_mail_aliasdomain.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/br_mail_aliasdomain_list.lng b/interface/ispconfig/interface/mail/lib/lang/br_mail_aliasdomain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..beb2c82058abbb01e3e84ea86bd397672a01f6b8 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/br_mail_aliasdomain_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/br_mail_blacklist.lng b/interface/ispconfig/interface/mail/lib/lang/br_mail_blacklist.lng new file mode 100644 index 0000000000000000000000000000000000000000..6d2cdb2a2f3f77e9cdb200290143a59c960166a3 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/br_mail_blacklist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/br_mail_blacklist_list.lng b/interface/ispconfig/interface/mail/lib/lang/br_mail_blacklist_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..9395a2ccb3268cd732a83a7e6c44124bdc24dab0 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/br_mail_blacklist_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/br_mail_content_filter.lng b/interface/ispconfig/interface/mail/lib/lang/br_mail_content_filter.lng new file mode 100644 index 0000000000000000000000000000000000000000..d5cda471fc4163cd8e2d068697bdea662eec83e6 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/br_mail_content_filter.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/br_mail_content_filter_list.lng b/interface/ispconfig/interface/mail/lib/lang/br_mail_content_filter_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..c3a616ef311eecbc1a9b40eb72241bf773ff0d6e --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/br_mail_content_filter_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/br_mail_domain.lng b/interface/ispconfig/interface/mail/lib/lang/br_mail_domain.lng new file mode 100644 index 0000000000000000000000000000000000000000..a1cab1cfae8d2c50ce6e9912b201c03dab044827 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/br_mail_domain.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/br_mail_domain_catchall.lng b/interface/ispconfig/interface/mail/lib/lang/br_mail_domain_catchall.lng new file mode 100644 index 0000000000000000000000000000000000000000..1b794de61ae431668200e8ff447db083fde32f64 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/br_mail_domain_catchall.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/br_mail_domain_catchall_list.lng b/interface/ispconfig/interface/mail/lib/lang/br_mail_domain_catchall_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..c4d5481734439c780e7a1bbcdef8a2e3bc4ad73f --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/br_mail_domain_catchall_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/br_mail_domain_list.lng b/interface/ispconfig/interface/mail/lib/lang/br_mail_domain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..2afb7db7f605a6a7aac8806adfbfc0b1b76e5966 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/br_mail_domain_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/br_mail_forward.lng b/interface/ispconfig/interface/mail/lib/lang/br_mail_forward.lng new file mode 100644 index 0000000000000000000000000000000000000000..1dab622ddc50cfcd6c59b5a94becdd11b3299845 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/br_mail_forward.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/br_mail_forward_list.lng b/interface/ispconfig/interface/mail/lib/lang/br_mail_forward_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..f9f7ce406cb1aebbc269b3d68b20b8e33a98e85c --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/br_mail_forward_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/br_mail_get.lng b/interface/ispconfig/interface/mail/lib/lang/br_mail_get.lng new file mode 100644 index 0000000000000000000000000000000000000000..bd3a3c221c6331b3d24cfaf520b93f0d2f59a1f1 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/br_mail_get.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/br_mail_get_list.lng b/interface/ispconfig/interface/mail/lib/lang/br_mail_get_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..9eaf45b7378e95672df4425901635c46006290fb --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/br_mail_get_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/br_mail_relay_recipient.lng b/interface/ispconfig/interface/mail/lib/lang/br_mail_relay_recipient.lng new file mode 100644 index 0000000000000000000000000000000000000000..cdbf7ca737b87fe9dc82a7fb570fce6356c8edd6 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/br_mail_relay_recipient.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/br_mail_relay_recipient_list.lng b/interface/ispconfig/interface/mail/lib/lang/br_mail_relay_recipient_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..e6d898c97b027e973055aeb7296560cb8a73202f --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/br_mail_relay_recipient_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/br_mail_spamfilter.lng b/interface/ispconfig/interface/mail/lib/lang/br_mail_spamfilter.lng new file mode 100644 index 0000000000000000000000000000000000000000..7f8a336420e3559defd066d7b39b725028a5ae0b --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/br_mail_spamfilter.lng @@ -0,0 +1,17 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/br_mail_spamfilter_list.lng b/interface/ispconfig/interface/mail/lib/lang/br_mail_spamfilter_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..9b549a939024730105b2ee3c715b653162467a76 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/br_mail_spamfilter_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/br_mail_transport.lng b/interface/ispconfig/interface/mail/lib/lang/br_mail_transport.lng new file mode 100644 index 0000000000000000000000000000000000000000..51df05db4149fee4ac582fb65bb67c0fa8e55ed1 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/br_mail_transport.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/br_mail_transport_list.lng b/interface/ispconfig/interface/mail/lib/lang/br_mail_transport_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..4c672805619ab543662988774ea11f59dfa8b454 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/br_mail_transport_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/br_mail_user.lng b/interface/ispconfig/interface/mail/lib/lang/br_mail_user.lng new file mode 100644 index 0000000000000000000000000000000000000000..46449972f5c696fec0c550228ba5fea8ddece4b5 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/br_mail_user.lng @@ -0,0 +1,39 @@ + 1'; +$wb['autoresponder_start_date_txt'] = 'Início:'; +$wb['autoresponder_start_date_isfuture'] = 'A data de ínicio não pode estar no passado.'; +$wb['autoresponder_end_date_txt'] = 'Termino:'; +$wb['autoresponder_end_date_isgreater'] = 'A data de início deve ser menor que a data de termino.'; +$wb['move_junk_txt'] = 'Mover Spam para o diretório JUNK'; +$wb['name_txt'] = 'Realname'; +$wb['name_optional_txt'] = '(Optional)'; +?> diff --git a/interface/ispconfig/interface/mail/lib/lang/br_mail_user_filter.lng b/interface/ispconfig/interface/mail/lib/lang/br_mail_user_filter.lng new file mode 100644 index 0000000000000000000000000000000000000000..a9c054b37ef10a041903e41efc3c67eee294bc05 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/br_mail_user_filter.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/br_mail_user_filter_list.lng b/interface/ispconfig/interface/mail/lib/lang/br_mail_user_filter_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..847d72c3abc5af2a259f3bf1db9ee76888ad83f4 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/br_mail_user_filter_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/br_mail_user_list.lng b/interface/ispconfig/interface/mail/lib/lang/br_mail_user_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..d399f482deea8b80f9aeca5d6d40ebbc23217aff --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/br_mail_user_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/br_mail_user_stats_list.lng b/interface/ispconfig/interface/mail/lib/lang/br_mail_user_stats_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..0457c2da5430d32e805f644d4a21cf18cb1718a5 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/br_mail_user_stats_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/br_mail_whitelist.lng b/interface/ispconfig/interface/mail/lib/lang/br_mail_whitelist.lng new file mode 100644 index 0000000000000000000000000000000000000000..15db38f28cc512d5118e44d0be47f55494d01c2b --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/br_mail_whitelist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/br_mail_whitelist_list.lng b/interface/ispconfig/interface/mail/lib/lang/br_mail_whitelist_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..bd84205e40eabcec1597f80fafe281804c4e958b --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/br_mail_whitelist_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/br_spamfilter_blacklist.lng b/interface/ispconfig/interface/mail/lib/lang/br_spamfilter_blacklist.lng new file mode 100644 index 0000000000000000000000000000000000000000..c282beab91ed87854cfd9d7b1582ce58efbc40d4 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/br_spamfilter_blacklist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/br_spamfilter_blacklist_list.lng b/interface/ispconfig/interface/mail/lib/lang/br_spamfilter_blacklist_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..81906532ae9d6d46549dc3e1079c2770fd5ad253 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/br_spamfilter_blacklist_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/br_spamfilter_config.lng b/interface/ispconfig/interface/mail/lib/lang/br_spamfilter_config.lng new file mode 100644 index 0000000000000000000000000000000000000000..30d01386c962f757d3616987dd7cbd713663188c --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/br_spamfilter_config.lng @@ -0,0 +1,20 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/br_spamfilter_config_list.lng b/interface/ispconfig/interface/mail/lib/lang/br_spamfilter_config_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..345903fe5c040d08457be6b475b7d2956a96b628 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/br_spamfilter_config_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/br_spamfilter_policy.lng b/interface/ispconfig/interface/mail/lib/lang/br_spamfilter_policy.lng new file mode 100644 index 0000000000000000000000000000000000000000..24eb2ed0a9e652f14b56ade24996b6fee37e44d1 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/br_spamfilter_policy.lng @@ -0,0 +1,38 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/br_spamfilter_policy_list.lng b/interface/ispconfig/interface/mail/lib/lang/br_spamfilter_policy_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..7247b2a1759b73da5a629957923197a53603ef57 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/br_spamfilter_policy_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/br_spamfilter_users.lng b/interface/ispconfig/interface/mail/lib/lang/br_spamfilter_users.lng new file mode 100644 index 0000000000000000000000000000000000000000..451500940879441ebdfc489351cde65f80e68451 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/br_spamfilter_users.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/br_spamfilter_users_list.lng b/interface/ispconfig/interface/mail/lib/lang/br_spamfilter_users_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..1fe408eb4e22cd22d08e6c5f1d5f6229bdec12b8 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/br_spamfilter_users_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/br_spamfilter_whitelist.lng b/interface/ispconfig/interface/mail/lib/lang/br_spamfilter_whitelist.lng new file mode 100644 index 0000000000000000000000000000000000000000..951c3f46860606eb445705c075e8b1ddeeb66385 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/br_spamfilter_whitelist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/br_spamfilter_whitelist_list.lng b/interface/ispconfig/interface/mail/lib/lang/br_spamfilter_whitelist_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..4420bca63b2c04c306cc51dae53b6d9196485407 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/br_spamfilter_whitelist_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/de.lng b/interface/ispconfig/interface/mail/lib/lang/de.lng new file mode 100644 index 0000000000000000000000000000000000000000..e4a2347c7dc97049ca5c021f8e1b6054db9a40c4 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/de.lng @@ -0,0 +1,47 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/de_mail_alias.lng b/interface/ispconfig/interface/mail/lib/lang/de_mail_alias.lng new file mode 100644 index 0000000000000000000000000000000000000000..f9112df59eca8a145f0d2153dfa62db9075e3e1d --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/de_mail_alias.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/de_mail_alias_list.lng b/interface/ispconfig/interface/mail/lib/lang/de_mail_alias_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..f249060240e9405a6f2741e473d0480fcb635d94 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/de_mail_alias_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/de_mail_aliasdomain.lng b/interface/ispconfig/interface/mail/lib/lang/de_mail_aliasdomain.lng new file mode 100644 index 0000000000000000000000000000000000000000..4ea7715fdf0f9d620041278bfaa0168a91e11328 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/de_mail_aliasdomain.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/de_mail_aliasdomain_list.lng b/interface/ispconfig/interface/mail/lib/lang/de_mail_aliasdomain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..1c486c92d22c5a64c807b2dc50b429b5dfe01611 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/de_mail_aliasdomain_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/de_mail_blacklist.lng b/interface/ispconfig/interface/mail/lib/lang/de_mail_blacklist.lng new file mode 100644 index 0000000000000000000000000000000000000000..75b20e201e179711c09143e7a206f357f4f2d59b --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/de_mail_blacklist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/de_mail_blacklist_list.lng b/interface/ispconfig/interface/mail/lib/lang/de_mail_blacklist_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..276d3a62d7df06d22bba8fc5a906a07b003d22a4 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/de_mail_blacklist_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/de_mail_content_filter.lng b/interface/ispconfig/interface/mail/lib/lang/de_mail_content_filter.lng new file mode 100644 index 0000000000000000000000000000000000000000..9ea5422498ca02ee535e54101947445c1f4e9f5e --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/de_mail_content_filter.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/de_mail_content_filter_list.lng b/interface/ispconfig/interface/mail/lib/lang/de_mail_content_filter_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..126f23ce4e72ffce038ed3294a28edd16bc35622 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/de_mail_content_filter_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/de_mail_domain.lng b/interface/ispconfig/interface/mail/lib/lang/de_mail_domain.lng new file mode 100644 index 0000000000000000000000000000000000000000..e1cf325dc8f2b3c28f7a36cd26fed680bb8887cd --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/de_mail_domain.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/de_mail_domain_catchall.lng b/interface/ispconfig/interface/mail/lib/lang/de_mail_domain_catchall.lng new file mode 100644 index 0000000000000000000000000000000000000000..d67fa10d9a94d43fe22d7507918ddece7485c74f --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/de_mail_domain_catchall.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/de_mail_domain_catchall_list.lng b/interface/ispconfig/interface/mail/lib/lang/de_mail_domain_catchall_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..2c5763f05c4617b87073b781047de7ad582209bd --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/de_mail_domain_catchall_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/de_mail_domain_list.lng b/interface/ispconfig/interface/mail/lib/lang/de_mail_domain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..0449bc9a98815253cd1361a1a50d323637c1da71 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/de_mail_domain_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/de_mail_forward.lng b/interface/ispconfig/interface/mail/lib/lang/de_mail_forward.lng new file mode 100644 index 0000000000000000000000000000000000000000..7fcf306c13601c007027ab07721e5ad4a78bb8c9 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/de_mail_forward.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/de_mail_forward_list.lng b/interface/ispconfig/interface/mail/lib/lang/de_mail_forward_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..2eee574b05380824186b0229f8541e703c8e2ee7 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/de_mail_forward_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/de_mail_get.lng b/interface/ispconfig/interface/mail/lib/lang/de_mail_get.lng new file mode 100644 index 0000000000000000000000000000000000000000..eb4a3b0c10dabbacfd5a04ecd99ca9f85cd762cf --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/de_mail_get.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/de_mail_get_list.lng b/interface/ispconfig/interface/mail/lib/lang/de_mail_get_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..3f7cf24860b23c77e15f79b55ef7b5ebe06ec466 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/de_mail_get_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/de_mail_relay_recipient.lng b/interface/ispconfig/interface/mail/lib/lang/de_mail_relay_recipient.lng new file mode 100644 index 0000000000000000000000000000000000000000..535ceb33c974349525e032debc64d0aabbbb25e4 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/de_mail_relay_recipient.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/de_mail_relay_recipient_list.lng b/interface/ispconfig/interface/mail/lib/lang/de_mail_relay_recipient_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..fc5d6f47c545a835f0f438b46064e289cf69450b --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/de_mail_relay_recipient_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/de_mail_spamfilter.lng b/interface/ispconfig/interface/mail/lib/lang/de_mail_spamfilter.lng new file mode 100644 index 0000000000000000000000000000000000000000..d411cb14c6773d06371e2f63e3d07a244c7caede --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/de_mail_spamfilter.lng @@ -0,0 +1,17 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/de_mail_spamfilter_list.lng b/interface/ispconfig/interface/mail/lib/lang/de_mail_spamfilter_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..f0acef3c27099dde39fb06855fc9347ef0720be7 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/de_mail_spamfilter_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/de_mail_transport.lng b/interface/ispconfig/interface/mail/lib/lang/de_mail_transport.lng new file mode 100644 index 0000000000000000000000000000000000000000..16d1e64055f34e468affa48699fd590cd115a3a7 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/de_mail_transport.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/de_mail_transport_list.lng b/interface/ispconfig/interface/mail/lib/lang/de_mail_transport_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..3efda20ee001dca8be774daba52a2635ac4a4b0b --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/de_mail_transport_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/de_mail_user.lng b/interface/ispconfig/interface/mail/lib/lang/de_mail_user.lng new file mode 100644 index 0000000000000000000000000000000000000000..6312cd8b26915d0b5431b9b3a3839f3ecd1e1d2b --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/de_mail_user.lng @@ -0,0 +1,39 @@ + 1'; +$wb['autoresponder_start_date_txt'] = 'Startet am'; +$wb['autoresponder_start_date_isfuture'] = 'Startdatum kann nicht in der Vergangenheit liegen.'; +$wb['autoresponder_end_date_txt'] = 'Endet am'; +$wb['autoresponder_end_date_isgreater'] = 'Enddatum muss angegeben werden und muss später als das Startdatum sein.'; +$wb['move_junk_txt'] = 'Spam Emails in den Junk Ordner verschieben'; +$wb['name_txt'] = 'Realname'; +$wb['name_optional_txt'] = '(Optional)'; +?> diff --git a/interface/ispconfig/interface/mail/lib/lang/de_mail_user_filter.lng b/interface/ispconfig/interface/mail/lib/lang/de_mail_user_filter.lng new file mode 100644 index 0000000000000000000000000000000000000000..cc6d3d180b3bc83574eedc7568ab3c3328716718 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/de_mail_user_filter.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/de_mail_user_filter_list.lng b/interface/ispconfig/interface/mail/lib/lang/de_mail_user_filter_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..3d9fd82db6d0734d66c87f2ea81ef3ea8f3dd436 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/de_mail_user_filter_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/de_mail_user_list.lng b/interface/ispconfig/interface/mail/lib/lang/de_mail_user_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..f2e3d7a11a223df38e439d4b27c099f89c6874a4 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/de_mail_user_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/de_mail_user_stats_list.lng b/interface/ispconfig/interface/mail/lib/lang/de_mail_user_stats_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..88ad07a60f28f764cc1000c28e4b046fd4176218 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/de_mail_user_stats_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/de_mail_whitelist.lng b/interface/ispconfig/interface/mail/lib/lang/de_mail_whitelist.lng new file mode 100644 index 0000000000000000000000000000000000000000..528c7cfce885b00f585987fc6e4be61fdfdae439 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/de_mail_whitelist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/de_mail_whitelist_list.lng b/interface/ispconfig/interface/mail/lib/lang/de_mail_whitelist_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..cb7f293b3645ecc574a3e2c7ffe1245460fd4cae --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/de_mail_whitelist_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/de_spamfilter_blacklist.lng b/interface/ispconfig/interface/mail/lib/lang/de_spamfilter_blacklist.lng new file mode 100644 index 0000000000000000000000000000000000000000..f2bc79a6b2b97806bd4770769dbe1b128f6cbd71 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/de_spamfilter_blacklist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/de_spamfilter_blacklist_list.lng b/interface/ispconfig/interface/mail/lib/lang/de_spamfilter_blacklist_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..ca726a90d7b945760fc4b529f05d0da9e270625f --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/de_spamfilter_blacklist_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/de_spamfilter_config.lng b/interface/ispconfig/interface/mail/lib/lang/de_spamfilter_config.lng new file mode 100644 index 0000000000000000000000000000000000000000..f82f27f5cee96ec5d97c7c3e87122691f0468d48 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/de_spamfilter_config.lng @@ -0,0 +1,20 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/de_spamfilter_config_list.lng b/interface/ispconfig/interface/mail/lib/lang/de_spamfilter_config_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..db92a4bd07e30257b74f3ccda5354bb60d98e60b --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/de_spamfilter_config_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/de_spamfilter_policy.lng b/interface/ispconfig/interface/mail/lib/lang/de_spamfilter_policy.lng new file mode 100644 index 0000000000000000000000000000000000000000..ff2426f7002c93cb41241b52ce3ba3f5366b4226 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/de_spamfilter_policy.lng @@ -0,0 +1,38 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/de_spamfilter_policy_list.lng b/interface/ispconfig/interface/mail/lib/lang/de_spamfilter_policy_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..8f77a6475e3d8650cd6b72a5ebb30246ef34972d --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/de_spamfilter_policy_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/de_spamfilter_users.lng b/interface/ispconfig/interface/mail/lib/lang/de_spamfilter_users.lng new file mode 100644 index 0000000000000000000000000000000000000000..fcb58114f0a5dbe34ee83884183795268565a2da --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/de_spamfilter_users.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/de_spamfilter_users_list.lng b/interface/ispconfig/interface/mail/lib/lang/de_spamfilter_users_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..b85e23de3e140a45793af73c74ecf3b95aa68e12 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/de_spamfilter_users_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/de_spamfilter_whitelist.lng b/interface/ispconfig/interface/mail/lib/lang/de_spamfilter_whitelist.lng new file mode 100644 index 0000000000000000000000000000000000000000..1f47c716dd6ea87da934fed212a95cf4a9ec8ce3 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/de_spamfilter_whitelist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/de_spamfilter_whitelist_list.lng b/interface/ispconfig/interface/mail/lib/lang/de_spamfilter_whitelist_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..ea53892ffc7f4c81e9df19bac443b9598d60d19f --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/de_spamfilter_whitelist_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/en.lng b/interface/ispconfig/interface/mail/lib/lang/en.lng new file mode 100644 index 0000000000000000000000000000000000000000..0570dfa403a9457ccca864c7c4c4b4b79d3c596b --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/en.lng @@ -0,0 +1,51 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/en_mail_alias.lng b/interface/ispconfig/interface/mail/lib/lang/en_mail_alias.lng new file mode 100644 index 0000000000000000000000000000000000000000..d7c5e7a076d5751aaa9d96d33b94203b5b09957d --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/en_mail_alias.lng @@ -0,0 +1,11 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/en_mail_alias_list.lng b/interface/ispconfig/interface/mail/lib/lang/en_mail_alias_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..10d5a6c7eb58b2fd7730655f879b0ee7ac586d9c --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/en_mail_alias_list.lng @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/en_mail_aliasdomain.lng b/interface/ispconfig/interface/mail/lib/lang/en_mail_aliasdomain.lng new file mode 100644 index 0000000000000000000000000000000000000000..241eb64ce5e77bea645b35b2876794fbe78671f2 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/en_mail_aliasdomain.lng @@ -0,0 +1,11 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/en_mail_aliasdomain_list.lng b/interface/ispconfig/interface/mail/lib/lang/en_mail_aliasdomain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..8ebfa7decb87a9fdfd8443c35ad8f1e8d5e52882 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/en_mail_aliasdomain_list.lng @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/en_mail_blacklist.lng b/interface/ispconfig/interface/mail/lib/lang/en_mail_blacklist.lng new file mode 100644 index 0000000000000000000000000000000000000000..440784775913305350df45b502b3a92fadd4fb28 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/en_mail_blacklist.lng @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/en_mail_blacklist_list.lng b/interface/ispconfig/interface/mail/lib/lang/en_mail_blacklist_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..9eb28ce3bca51a08d3e0eed34a81932165754827 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/en_mail_blacklist_list.lng @@ -0,0 +1,10 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/en_mail_content_filter.lng b/interface/ispconfig/interface/mail/lib/lang/en_mail_content_filter.lng new file mode 100644 index 0000000000000000000000000000000000000000..c72c78bd2c9815e20f8c473e9f3b373d00ab3d84 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/en_mail_content_filter.lng @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/en_mail_content_filter_list.lng b/interface/ispconfig/interface/mail/lib/lang/en_mail_content_filter_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..58de44a5170ee46d8c36676ea3c6c5815f49403b --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/en_mail_content_filter_list.lng @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/en_mail_domain.lng b/interface/ispconfig/interface/mail/lib/lang/en_mail_domain.lng new file mode 100644 index 0000000000000000000000000000000000000000..ad93100696d4c75e62bf26f88ab0ba4c5293e088 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/en_mail_domain.lng @@ -0,0 +1,13 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/en_mail_domain_catchall.lng b/interface/ispconfig/interface/mail/lib/lang/en_mail_domain_catchall.lng new file mode 100644 index 0000000000000000000000000000000000000000..211ea3d3a9ab024922d8ab2fa5497067b02a2ea3 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/en_mail_domain_catchall.lng @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/en_mail_domain_catchall_list.lng b/interface/ispconfig/interface/mail/lib/lang/en_mail_domain_catchall_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..589423b9a51521719255d5647bbde53ffc29ebed --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/en_mail_domain_catchall_list.lng @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/en_mail_domain_list.lng b/interface/ispconfig/interface/mail/lib/lang/en_mail_domain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..787216c3c4373070f031ba4a00ef76b710cb79aa --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/en_mail_domain_list.lng @@ -0,0 +1,7 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/en_mail_forward.lng b/interface/ispconfig/interface/mail/lib/lang/en_mail_forward.lng new file mode 100644 index 0000000000000000000000000000000000000000..dee6271537d2b1b98609fcaa28c5b3140264773f --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/en_mail_forward.lng @@ -0,0 +1,7 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/en_mail_forward_list.lng b/interface/ispconfig/interface/mail/lib/lang/en_mail_forward_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..f850512f1db646dc081cf68f5efee6ecb96b4786 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/en_mail_forward_list.lng @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/en_mail_get.lng b/interface/ispconfig/interface/mail/lib/lang/en_mail_get.lng new file mode 100644 index 0000000000000000000000000000000000000000..e2180e5eb21bd87011963615609f21262bba9993 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/en_mail_get.lng @@ -0,0 +1,16 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/en_mail_get_list.lng b/interface/ispconfig/interface/mail/lib/lang/en_mail_get_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..f8b307d3cd3bb857f44fdd69f8686ce0a20bf59c --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/en_mail_get_list.lng @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/en_mail_relay_recipient.lng b/interface/ispconfig/interface/mail/lib/lang/en_mail_relay_recipient.lng new file mode 100644 index 0000000000000000000000000000000000000000..fdec9ab0a4407dff4051f577b8d28fc71a1ce114 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/en_mail_relay_recipient.lng @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/en_mail_relay_recipient_list.lng b/interface/ispconfig/interface/mail/lib/lang/en_mail_relay_recipient_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..44cd894ac2c426dea1d8adb1add200370e81806d --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/en_mail_relay_recipient_list.lng @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/en_mail_spamfilter.lng b/interface/ispconfig/interface/mail/lib/lang/en_mail_spamfilter.lng new file mode 100644 index 0000000000000000000000000000000000000000..72c126cd9cfa44af337209cc283a0210b382e222 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/en_mail_spamfilter.lng @@ -0,0 +1,17 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/en_mail_spamfilter_list.lng b/interface/ispconfig/interface/mail/lib/lang/en_mail_spamfilter_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..22316fa12becc29f34382a1279ea038272fe1a33 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/en_mail_spamfilter_list.lng @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/en_mail_transport.lng b/interface/ispconfig/interface/mail/lib/lang/en_mail_transport.lng new file mode 100644 index 0000000000000000000000000000000000000000..152c2eba4458dede84d6919235cfcf2c5fa9901a --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/en_mail_transport.lng @@ -0,0 +1,10 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/en_mail_transport_list.lng b/interface/ispconfig/interface/mail/lib/lang/en_mail_transport_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..febadb874b365d63dee83ca7342fede8b98d6ca5 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/en_mail_transport_list.lng @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/en_mail_user.lng b/interface/ispconfig/interface/mail/lib/lang/en_mail_user.lng new file mode 100644 index 0000000000000000000000000000000000000000..c393e0ce71fe98c4fccf741de1abe63cb9146c1b --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/en_mail_user.lng @@ -0,0 +1,40 @@ + 1'; +$wb["move_junk_txt"] = 'Move Spam Emails to Junk directory'; +$wb["name_txt"] = 'Realname'; +$wb["name_optional_txt"] = '(Optional)'; +$wb['autoresponder_active'] = 'Enable the autoresponder'; +?> diff --git a/interface/ispconfig/interface/mail/lib/lang/en_mail_user_filter.lng b/interface/ispconfig/interface/mail/lib/lang/en_mail_user_filter.lng new file mode 100644 index 0000000000000000000000000000000000000000..3245a095dfc9751d940c2d7cdd51824a94ac3b54 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/en_mail_user_filter.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/en_mail_user_filter_list.lng b/interface/ispconfig/interface/mail/lib/lang/en_mail_user_filter_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..97cc11a6114c697987cec199fc0428294b669952 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/en_mail_user_filter_list.lng @@ -0,0 +1,7 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/en_mail_user_list.lng b/interface/ispconfig/interface/mail/lib/lang/en_mail_user_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..70497def668fbd7ec12a62ce587147fda49ca741 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/en_mail_user_list.lng @@ -0,0 +1,7 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/en_mail_user_stats_list.lng b/interface/ispconfig/interface/mail/lib/lang/en_mail_user_stats_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..a2947f7406369178e6d0b40f57d1250cfea18648 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/en_mail_user_stats_list.lng @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/en_mail_whitelist.lng b/interface/ispconfig/interface/mail/lib/lang/en_mail_whitelist.lng new file mode 100644 index 0000000000000000000000000000000000000000..6c6bed933ae6941dfe54fe6dd87e14410717a100 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/en_mail_whitelist.lng @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/en_mail_whitelist_list.lng b/interface/ispconfig/interface/mail/lib/lang/en_mail_whitelist_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..22aedf23d097a3e10f04a9b6f37289815c754c84 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/en_mail_whitelist_list.lng @@ -0,0 +1,10 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/en_spamfilter_blacklist.lng b/interface/ispconfig/interface/mail/lib/lang/en_spamfilter_blacklist.lng new file mode 100644 index 0000000000000000000000000000000000000000..6478b1f2fce33f0b06ed467983d5eae977913b1a --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/en_spamfilter_blacklist.lng @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/en_spamfilter_blacklist_list.lng b/interface/ispconfig/interface/mail/lib/lang/en_spamfilter_blacklist_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..ca387fba3e4aa3a0abfd9dd7138416e4619283b6 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/en_spamfilter_blacklist_list.lng @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/en_spamfilter_config.lng b/interface/ispconfig/interface/mail/lib/lang/en_spamfilter_config.lng new file mode 100644 index 0000000000000000000000000000000000000000..28c6b34077d1317d3d7ecd5f012d35175139ce1c --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/en_spamfilter_config.lng @@ -0,0 +1,20 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/en_spamfilter_config_list.lng b/interface/ispconfig/interface/mail/lib/lang/en_spamfilter_config_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..710e22b00c78a85d9f426156f9447ea08ce96a4b --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/en_spamfilter_config_list.lng @@ -0,0 +1,5 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/en_spamfilter_policy.lng b/interface/ispconfig/interface/mail/lib/lang/en_spamfilter_policy.lng new file mode 100644 index 0000000000000000000000000000000000000000..2e0f05d6c0019511862054456e91a503b60a29af --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/en_spamfilter_policy.lng @@ -0,0 +1,38 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/en_spamfilter_policy_list.lng b/interface/ispconfig/interface/mail/lib/lang/en_spamfilter_policy_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..1e87733a0f1706934569a5f298424944e7fbfc4a --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/en_spamfilter_policy_list.lng @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/en_spamfilter_users.lng b/interface/ispconfig/interface/mail/lib/lang/en_spamfilter_users.lng new file mode 100644 index 0000000000000000000000000000000000000000..78b346c3eb7a443ae4dfb53d2230f77424238995 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/en_spamfilter_users.lng @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/en_spamfilter_users_list.lng b/interface/ispconfig/interface/mail/lib/lang/en_spamfilter_users_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..75fc98e76cb493f1d9bf7825e8f91aef5fc0578f --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/en_spamfilter_users_list.lng @@ -0,0 +1,10 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/en_spamfilter_whitelist.lng b/interface/ispconfig/interface/mail/lib/lang/en_spamfilter_whitelist.lng new file mode 100644 index 0000000000000000000000000000000000000000..6478b1f2fce33f0b06ed467983d5eae977913b1a --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/en_spamfilter_whitelist.lng @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/en_spamfilter_whitelist_list.lng b/interface/ispconfig/interface/mail/lib/lang/en_spamfilter_whitelist_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..72495f5e0931baa5e08f041f192b6fadbdeea216 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/en_spamfilter_whitelist_list.lng @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/es.lng b/interface/ispconfig/interface/mail/lib/lang/es.lng new file mode 100644 index 0000000000000000000000000000000000000000..fb3317046dd4692ea933e13aec3e0a50abe11f13 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/es.lng @@ -0,0 +1,47 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/es_mail_alias.lng b/interface/ispconfig/interface/mail/lib/lang/es_mail_alias.lng new file mode 100644 index 0000000000000000000000000000000000000000..c2395689091d5d424f34dcd64fa687af6469c815 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/es_mail_alias.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/es_mail_alias_list.lng b/interface/ispconfig/interface/mail/lib/lang/es_mail_alias_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..2f5df201fdbe0c8cdbbeca9450ceeb165f8811cc --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/es_mail_alias_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/es_mail_aliasdomain.lng b/interface/ispconfig/interface/mail/lib/lang/es_mail_aliasdomain.lng new file mode 100644 index 0000000000000000000000000000000000000000..5815d1e6099a56a7282966cef5c88f89fad9a321 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/es_mail_aliasdomain.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/es_mail_aliasdomain_list.lng b/interface/ispconfig/interface/mail/lib/lang/es_mail_aliasdomain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..d96a63e2a4db69d1cc277febcdc1e21afe3f8366 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/es_mail_aliasdomain_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/es_mail_blacklist.lng b/interface/ispconfig/interface/mail/lib/lang/es_mail_blacklist.lng new file mode 100644 index 0000000000000000000000000000000000000000..8efc603bef4326097d7535a42c1c214e71826b78 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/es_mail_blacklist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/es_mail_blacklist_list.lng b/interface/ispconfig/interface/mail/lib/lang/es_mail_blacklist_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..a7394e2f8a6e31cbe44332f464d14df85407a568 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/es_mail_blacklist_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/es_mail_content_filter.lng b/interface/ispconfig/interface/mail/lib/lang/es_mail_content_filter.lng new file mode 100644 index 0000000000000000000000000000000000000000..ec1ca96213af7139816fa174ed4b02f096206518 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/es_mail_content_filter.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/es_mail_content_filter_list.lng b/interface/ispconfig/interface/mail/lib/lang/es_mail_content_filter_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..d70bf425f602006d9f2bd667fb1ae0749c64c1a1 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/es_mail_content_filter_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/es_mail_domain.lng b/interface/ispconfig/interface/mail/lib/lang/es_mail_domain.lng new file mode 100644 index 0000000000000000000000000000000000000000..1bf9bc3f64e45c31cfd4abd53924793c95ddf088 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/es_mail_domain.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/es_mail_domain_catchall.lng b/interface/ispconfig/interface/mail/lib/lang/es_mail_domain_catchall.lng new file mode 100644 index 0000000000000000000000000000000000000000..f29db05333499d87cbdba54743e28b9f76efd4f8 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/es_mail_domain_catchall.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/es_mail_domain_catchall_list.lng b/interface/ispconfig/interface/mail/lib/lang/es_mail_domain_catchall_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..c70887eb12d045f698ea3ea19aec74a8b2b9cf5a --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/es_mail_domain_catchall_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/es_mail_domain_list.lng b/interface/ispconfig/interface/mail/lib/lang/es_mail_domain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..c647e23afbf01671db3dc7e171955e02524a6383 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/es_mail_domain_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/es_mail_forward.lng b/interface/ispconfig/interface/mail/lib/lang/es_mail_forward.lng new file mode 100644 index 0000000000000000000000000000000000000000..771ef28772c12dfb7c4fa7c5be1690982da9934b --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/es_mail_forward.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/es_mail_forward_list.lng b/interface/ispconfig/interface/mail/lib/lang/es_mail_forward_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..2c5d9af253a5b7aa3a7948811d9115e617aab2a0 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/es_mail_forward_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/es_mail_get.lng b/interface/ispconfig/interface/mail/lib/lang/es_mail_get.lng new file mode 100644 index 0000000000000000000000000000000000000000..c0c57ce99f6b3819f4ac4fb17b7b6498d7c5e430 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/es_mail_get.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/es_mail_get_list.lng b/interface/ispconfig/interface/mail/lib/lang/es_mail_get_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..3c133e7236561d88aa88612bd824923b1dccd982 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/es_mail_get_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/es_mail_relay_recipient.lng b/interface/ispconfig/interface/mail/lib/lang/es_mail_relay_recipient.lng new file mode 100644 index 0000000000000000000000000000000000000000..b5c8724da3a5c1f264ff46ee92bec05b2cd223d0 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/es_mail_relay_recipient.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/es_mail_relay_recipient_list.lng b/interface/ispconfig/interface/mail/lib/lang/es_mail_relay_recipient_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..36045f4e35d3674336045b6b272ff31c571772c4 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/es_mail_relay_recipient_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/es_mail_spamfilter.lng b/interface/ispconfig/interface/mail/lib/lang/es_mail_spamfilter.lng new file mode 100644 index 0000000000000000000000000000000000000000..e4e615c943b1f84067096a26fa7b14c3a7a45a7d --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/es_mail_spamfilter.lng @@ -0,0 +1,17 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/es_mail_spamfilter_list.lng b/interface/ispconfig/interface/mail/lib/lang/es_mail_spamfilter_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..f2e2cb1b8f6328f2ae136d0dcafe098ae9bee208 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/es_mail_spamfilter_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/es_mail_transport.lng b/interface/ispconfig/interface/mail/lib/lang/es_mail_transport.lng new file mode 100644 index 0000000000000000000000000000000000000000..87904c398308c851f4dbec7566e571efcf86c44a --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/es_mail_transport.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/es_mail_transport_list.lng b/interface/ispconfig/interface/mail/lib/lang/es_mail_transport_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..b23483f6c08cf120a83bfcd6cb2e31162ca01481 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/es_mail_transport_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/es_mail_user.lng b/interface/ispconfig/interface/mail/lib/lang/es_mail_user.lng new file mode 100644 index 0000000000000000000000000000000000000000..172b2bfcb86ea458c6d409f06e6863202115823a --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/es_mail_user.lng @@ -0,0 +1,39 @@ + 1'; +$wb['autoresponder_start_date_txt'] = 'Start on'; +$wb['autoresponder_start_date_isfuture'] = 'Start date cannot be in the past.'; +$wb['autoresponder_end_date_txt'] = 'End by'; +$wb['autoresponder_end_date_isgreater'] = 'End date must be set and be later than start date.'; +$wb['move_junk_txt'] = 'Move Spam Emails to Junk directory'; +$wb['name_txt'] = 'Realname'; +$wb['name_optional_txt'] = '(Optional)'; +?> diff --git a/interface/ispconfig/interface/mail/lib/lang/es_mail_user_filter.lng b/interface/ispconfig/interface/mail/lib/lang/es_mail_user_filter.lng new file mode 100644 index 0000000000000000000000000000000000000000..743e53fded7ffd2ec82d44dd7059a5221086e968 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/es_mail_user_filter.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/es_mail_user_filter_list.lng b/interface/ispconfig/interface/mail/lib/lang/es_mail_user_filter_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..31e0e9855e6a703aab91d0b2839655b28ddaade0 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/es_mail_user_filter_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/es_mail_user_list.lng b/interface/ispconfig/interface/mail/lib/lang/es_mail_user_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..163033d249be7cce4bf101e0fb3d8b9799c2e27b --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/es_mail_user_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/es_mail_user_stats_list.lng b/interface/ispconfig/interface/mail/lib/lang/es_mail_user_stats_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..9837a3ff84db8bc18e290e0d83b5f7a89a1d4a15 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/es_mail_user_stats_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/es_mail_whitelist.lng b/interface/ispconfig/interface/mail/lib/lang/es_mail_whitelist.lng new file mode 100644 index 0000000000000000000000000000000000000000..1d681a72e4948da5ca21d3a7d434f1c800443905 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/es_mail_whitelist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/es_mail_whitelist_list.lng b/interface/ispconfig/interface/mail/lib/lang/es_mail_whitelist_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..233a25cbe4671c77f4c72470b8dcd78fa13edeb5 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/es_mail_whitelist_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/es_spamfilter_blacklist.lng b/interface/ispconfig/interface/mail/lib/lang/es_spamfilter_blacklist.lng new file mode 100644 index 0000000000000000000000000000000000000000..a411046a4f64f6a0201f671c1005f1f64f7ed24f --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/es_spamfilter_blacklist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/es_spamfilter_blacklist_list.lng b/interface/ispconfig/interface/mail/lib/lang/es_spamfilter_blacklist_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..628510699684cdfeee3539ec1f1af518e77ce324 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/es_spamfilter_blacklist_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/es_spamfilter_config.lng b/interface/ispconfig/interface/mail/lib/lang/es_spamfilter_config.lng new file mode 100644 index 0000000000000000000000000000000000000000..f2ba6932df4a8ff9b6c9cc4ac69c7c9479487003 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/es_spamfilter_config.lng @@ -0,0 +1,20 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/es_spamfilter_config_list.lng b/interface/ispconfig/interface/mail/lib/lang/es_spamfilter_config_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..a46257a3c12d71f7ef81d502f811c34cc830cb76 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/es_spamfilter_config_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/es_spamfilter_policy.lng b/interface/ispconfig/interface/mail/lib/lang/es_spamfilter_policy.lng new file mode 100644 index 0000000000000000000000000000000000000000..2932f560729d24fba80e9fdc12e2e1a65ab1a54b --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/es_spamfilter_policy.lng @@ -0,0 +1,38 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/es_spamfilter_policy_list.lng b/interface/ispconfig/interface/mail/lib/lang/es_spamfilter_policy_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..ce196bb0cbfee84e5d7576a60b241a4d87f3b5fb --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/es_spamfilter_policy_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/es_spamfilter_users.lng b/interface/ispconfig/interface/mail/lib/lang/es_spamfilter_users.lng new file mode 100644 index 0000000000000000000000000000000000000000..361c2fe1c1c68e41d822a6ae3bb781a58f87b5ee --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/es_spamfilter_users.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/es_spamfilter_users_list.lng b/interface/ispconfig/interface/mail/lib/lang/es_spamfilter_users_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..60d8388a8b7fb351112ce4a1c6fda61a656ecb12 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/es_spamfilter_users_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/es_spamfilter_whitelist.lng b/interface/ispconfig/interface/mail/lib/lang/es_spamfilter_whitelist.lng new file mode 100644 index 0000000000000000000000000000000000000000..a411046a4f64f6a0201f671c1005f1f64f7ed24f --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/es_spamfilter_whitelist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/es_spamfilter_whitelist_list.lng b/interface/ispconfig/interface/mail/lib/lang/es_spamfilter_whitelist_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..e1c7f66b1e6b5a74459801f14c363b14ec42471f --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/es_spamfilter_whitelist_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fi.lng b/interface/ispconfig/interface/mail/lib/lang/fi.lng new file mode 100644 index 0000000000000000000000000000000000000000..840936608de9022bd808db7ac0c063181449861d --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fi.lng @@ -0,0 +1,47 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fi_mail_alias.lng b/interface/ispconfig/interface/mail/lib/lang/fi_mail_alias.lng new file mode 100644 index 0000000000000000000000000000000000000000..135c179c2be4c36beb7345c4dc157ce869ef4984 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fi_mail_alias.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fi_mail_alias_list.lng b/interface/ispconfig/interface/mail/lib/lang/fi_mail_alias_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..37dad6eaa63d3a5d35ff71618b752a91055b28a7 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fi_mail_alias_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fi_mail_aliasdomain.lng b/interface/ispconfig/interface/mail/lib/lang/fi_mail_aliasdomain.lng new file mode 100644 index 0000000000000000000000000000000000000000..5815d1e6099a56a7282966cef5c88f89fad9a321 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fi_mail_aliasdomain.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fi_mail_aliasdomain_list.lng b/interface/ispconfig/interface/mail/lib/lang/fi_mail_aliasdomain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..d96a63e2a4db69d1cc277febcdc1e21afe3f8366 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fi_mail_aliasdomain_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fi_mail_blacklist.lng b/interface/ispconfig/interface/mail/lib/lang/fi_mail_blacklist.lng new file mode 100644 index 0000000000000000000000000000000000000000..66cb93004e643e787eb070d5a9fc237ace48f8a1 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fi_mail_blacklist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fi_mail_blacklist_list.lng b/interface/ispconfig/interface/mail/lib/lang/fi_mail_blacklist_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..2d792ffc6a9b212a14044bef5e85ac44fbffa09d --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fi_mail_blacklist_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fi_mail_content_filter.lng b/interface/ispconfig/interface/mail/lib/lang/fi_mail_content_filter.lng new file mode 100644 index 0000000000000000000000000000000000000000..9cac6d38ff53e70b8a03d751b54bec1e43f14a88 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fi_mail_content_filter.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fi_mail_content_filter_list.lng b/interface/ispconfig/interface/mail/lib/lang/fi_mail_content_filter_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..ccd1b895e4730e88e73dbaba961d580344885f86 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fi_mail_content_filter_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fi_mail_domain.lng b/interface/ispconfig/interface/mail/lib/lang/fi_mail_domain.lng new file mode 100644 index 0000000000000000000000000000000000000000..fc92040a1c5d540b443f9211db44a28ce75be2d3 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fi_mail_domain.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fi_mail_domain_catchall.lng b/interface/ispconfig/interface/mail/lib/lang/fi_mail_domain_catchall.lng new file mode 100644 index 0000000000000000000000000000000000000000..802f83d819adf8f823292878ee55a90fc94ded5b --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fi_mail_domain_catchall.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fi_mail_domain_catchall_list.lng b/interface/ispconfig/interface/mail/lib/lang/fi_mail_domain_catchall_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..73f8c7598e6acaa6cb59c11f48c57bc009cc50fe --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fi_mail_domain_catchall_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fi_mail_domain_list.lng b/interface/ispconfig/interface/mail/lib/lang/fi_mail_domain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..e8c4d2862c74db94ad8949eacbe97e43a73abb4e --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fi_mail_domain_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fi_mail_forward.lng b/interface/ispconfig/interface/mail/lib/lang/fi_mail_forward.lng new file mode 100644 index 0000000000000000000000000000000000000000..2368ddeb7b2d948e32062d3d2670afbb3ab9a9bf --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fi_mail_forward.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fi_mail_forward_list.lng b/interface/ispconfig/interface/mail/lib/lang/fi_mail_forward_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..15aab44bf9ee42b91af14eafc00ed7cabd3e3874 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fi_mail_forward_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fi_mail_get.lng b/interface/ispconfig/interface/mail/lib/lang/fi_mail_get.lng new file mode 100644 index 0000000000000000000000000000000000000000..5db3b0cd90b2085f1c0d22641e808307db29687b --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fi_mail_get.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fi_mail_get_list.lng b/interface/ispconfig/interface/mail/lib/lang/fi_mail_get_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..be7a29f7c4639c7b605a9b36b6d010bd9f940abd --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fi_mail_get_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fi_mail_relay_recipient.lng b/interface/ispconfig/interface/mail/lib/lang/fi_mail_relay_recipient.lng new file mode 100644 index 0000000000000000000000000000000000000000..b5c8724da3a5c1f264ff46ee92bec05b2cd223d0 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fi_mail_relay_recipient.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fi_mail_relay_recipient_list.lng b/interface/ispconfig/interface/mail/lib/lang/fi_mail_relay_recipient_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..36045f4e35d3674336045b6b272ff31c571772c4 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fi_mail_relay_recipient_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fi_mail_spamfilter.lng b/interface/ispconfig/interface/mail/lib/lang/fi_mail_spamfilter.lng new file mode 100644 index 0000000000000000000000000000000000000000..a833ecacfc94f2c630f0203cd977fcf6ff856f46 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fi_mail_spamfilter.lng @@ -0,0 +1,17 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fi_mail_spamfilter_list.lng b/interface/ispconfig/interface/mail/lib/lang/fi_mail_spamfilter_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..41f6e3b0d724ca56d6d5589cfc1996327ca0acb3 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fi_mail_spamfilter_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fi_mail_transport.lng b/interface/ispconfig/interface/mail/lib/lang/fi_mail_transport.lng new file mode 100644 index 0000000000000000000000000000000000000000..4b4ad896a3f9563c25e9b38560ab04859a524761 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fi_mail_transport.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fi_mail_transport_list.lng b/interface/ispconfig/interface/mail/lib/lang/fi_mail_transport_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..e91c76e29a60041e0fbbdc6aa4588fa06f353480 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fi_mail_transport_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fi_mail_user.lng b/interface/ispconfig/interface/mail/lib/lang/fi_mail_user.lng new file mode 100644 index 0000000000000000000000000000000000000000..71e74404a6e23ee8fc30366871e4ecb2055d10c6 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fi_mail_user.lng @@ -0,0 +1,39 @@ + 1 tai 0 rajoittamattomalle.'; +$wb['autoresponder_start_date_txt'] = 'Start on'; +$wb['autoresponder_start_date_isfuture'] = 'Start date cannot be in the past.'; +$wb['autoresponder_end_date_txt'] = 'End by'; +$wb['autoresponder_end_date_isgreater'] = 'End date must be set and be later than start date.'; +$wb['move_junk_txt'] = 'Move Spam Emails to Junk directory'; +$wb['name_txt'] = 'Realname'; +$wb['name_optional_txt'] = '(Optional)'; +?> diff --git a/interface/ispconfig/interface/mail/lib/lang/fi_mail_user_filter.lng b/interface/ispconfig/interface/mail/lib/lang/fi_mail_user_filter.lng new file mode 100644 index 0000000000000000000000000000000000000000..a9f7a2b8fc80841538373d4f117f2525128d66c8 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fi_mail_user_filter.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fi_mail_user_filter_list.lng b/interface/ispconfig/interface/mail/lib/lang/fi_mail_user_filter_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..ed6639a5e0b5aafef93992f145ae1f5d14c6cdbd --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fi_mail_user_filter_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fi_mail_user_list.lng b/interface/ispconfig/interface/mail/lib/lang/fi_mail_user_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..f37a7b808dfc7bc08592ee42531dfbb4aadb8c02 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fi_mail_user_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fi_mail_user_stats_list.lng b/interface/ispconfig/interface/mail/lib/lang/fi_mail_user_stats_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..5f5b0391fc2b2b090e41ebac9b0648e24658e26e --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fi_mail_user_stats_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fi_mail_whitelist.lng b/interface/ispconfig/interface/mail/lib/lang/fi_mail_whitelist.lng new file mode 100644 index 0000000000000000000000000000000000000000..abd8e85f2b9cb8ca60adac31dc76acce40396ed2 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fi_mail_whitelist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fi_mail_whitelist_list.lng b/interface/ispconfig/interface/mail/lib/lang/fi_mail_whitelist_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..d6b134948c952c8117f4a6d0f96dbc98f82689dd --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fi_mail_whitelist_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fi_spamfilter_blacklist.lng b/interface/ispconfig/interface/mail/lib/lang/fi_spamfilter_blacklist.lng new file mode 100644 index 0000000000000000000000000000000000000000..287d968cf2692b45f82c8be73ffe278d9dd2c520 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fi_spamfilter_blacklist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fi_spamfilter_blacklist_list.lng b/interface/ispconfig/interface/mail/lib/lang/fi_spamfilter_blacklist_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..d448876ef2a59e2a04c8e9a9e3495ebc284a0e72 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fi_spamfilter_blacklist_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fi_spamfilter_config.lng b/interface/ispconfig/interface/mail/lib/lang/fi_spamfilter_config.lng new file mode 100644 index 0000000000000000000000000000000000000000..7447b48c77ced26ba8a7008c57bdfd14e2d27f09 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fi_spamfilter_config.lng @@ -0,0 +1,20 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fi_spamfilter_config_list.lng b/interface/ispconfig/interface/mail/lib/lang/fi_spamfilter_config_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..aee0c817374002ec90b8f49326ad9c49fbae0efd --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fi_spamfilter_config_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fi_spamfilter_policy.lng b/interface/ispconfig/interface/mail/lib/lang/fi_spamfilter_policy.lng new file mode 100644 index 0000000000000000000000000000000000000000..8f61ba411b64d7bc3b9541af4d39f086e488c7fa --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fi_spamfilter_policy.lng @@ -0,0 +1,38 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fi_spamfilter_policy_list.lng b/interface/ispconfig/interface/mail/lib/lang/fi_spamfilter_policy_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..3074d45ff09a6c4c3e1c163e8e011600c74165f5 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fi_spamfilter_policy_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fi_spamfilter_users.lng b/interface/ispconfig/interface/mail/lib/lang/fi_spamfilter_users.lng new file mode 100644 index 0000000000000000000000000000000000000000..d960f5c82ad490ae19dadeb4005dc30ab24020c5 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fi_spamfilter_users.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fi_spamfilter_users_list.lng b/interface/ispconfig/interface/mail/lib/lang/fi_spamfilter_users_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..385d617a7485bb731793d356ff2abd086f7a8014 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fi_spamfilter_users_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fi_spamfilter_whitelist.lng b/interface/ispconfig/interface/mail/lib/lang/fi_spamfilter_whitelist.lng new file mode 100644 index 0000000000000000000000000000000000000000..9dee91858fe2b35320af1d5971064936714fc17e --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fi_spamfilter_whitelist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fi_spamfilter_whitelist_list.lng b/interface/ispconfig/interface/mail/lib/lang/fi_spamfilter_whitelist_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..a3f00fc848e39bf3283a4893b9bbb7f3275a9028 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fi_spamfilter_whitelist_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fr.lng b/interface/ispconfig/interface/mail/lib/lang/fr.lng new file mode 100644 index 0000000000000000000000000000000000000000..be44ddafd78a2bede70952e4020775e5aaaffca5 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fr.lng @@ -0,0 +1,47 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fr_mail_alias.lng b/interface/ispconfig/interface/mail/lib/lang/fr_mail_alias.lng new file mode 100644 index 0000000000000000000000000000000000000000..8c4921b3d2050e926b68358a8a86bbf0f68bec1c --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fr_mail_alias.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fr_mail_alias_list.lng b/interface/ispconfig/interface/mail/lib/lang/fr_mail_alias_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..ae4947afebf7eb10ae880bb32e3905ae6353647f --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fr_mail_alias_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fr_mail_aliasdomain.lng b/interface/ispconfig/interface/mail/lib/lang/fr_mail_aliasdomain.lng new file mode 100644 index 0000000000000000000000000000000000000000..5815d1e6099a56a7282966cef5c88f89fad9a321 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fr_mail_aliasdomain.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fr_mail_aliasdomain_list.lng b/interface/ispconfig/interface/mail/lib/lang/fr_mail_aliasdomain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..d96a63e2a4db69d1cc277febcdc1e21afe3f8366 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fr_mail_aliasdomain_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fr_mail_blacklist.lng b/interface/ispconfig/interface/mail/lib/lang/fr_mail_blacklist.lng new file mode 100644 index 0000000000000000000000000000000000000000..ca715af0b11112a2390afbb0d7f38ecbf586abfd --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fr_mail_blacklist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fr_mail_blacklist_list.lng b/interface/ispconfig/interface/mail/lib/lang/fr_mail_blacklist_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..18ae28f519ff64a26e8d540bed339ebcd95c4a26 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fr_mail_blacklist_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fr_mail_content_filter.lng b/interface/ispconfig/interface/mail/lib/lang/fr_mail_content_filter.lng new file mode 100644 index 0000000000000000000000000000000000000000..5aa0caac01be348278e5eb9f86fbe6e041d0a995 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fr_mail_content_filter.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fr_mail_content_filter_list.lng b/interface/ispconfig/interface/mail/lib/lang/fr_mail_content_filter_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..bee77a2cbf4db6c795ab37365379c0fc521ef9e0 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fr_mail_content_filter_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fr_mail_domain.lng b/interface/ispconfig/interface/mail/lib/lang/fr_mail_domain.lng new file mode 100644 index 0000000000000000000000000000000000000000..da7e9839bb5fca15b19f09966ccc4a60e1c6ea3f --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fr_mail_domain.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fr_mail_domain_catchall.lng b/interface/ispconfig/interface/mail/lib/lang/fr_mail_domain_catchall.lng new file mode 100644 index 0000000000000000000000000000000000000000..49c9fab11a435fb380a1518382d3b2017e39dd80 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fr_mail_domain_catchall.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fr_mail_domain_catchall_list.lng b/interface/ispconfig/interface/mail/lib/lang/fr_mail_domain_catchall_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..44542bf4014bc2c87e2af23aed73dbba605b6e99 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fr_mail_domain_catchall_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fr_mail_domain_list.lng b/interface/ispconfig/interface/mail/lib/lang/fr_mail_domain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..0d89f254b2499634e871d79ee4ffe9a3f1219754 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fr_mail_domain_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fr_mail_forward.lng b/interface/ispconfig/interface/mail/lib/lang/fr_mail_forward.lng new file mode 100644 index 0000000000000000000000000000000000000000..dc04099fb13ad51de51efcff516ebd0a12a9600f --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fr_mail_forward.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fr_mail_forward_list.lng b/interface/ispconfig/interface/mail/lib/lang/fr_mail_forward_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..d8d5db2d9cedbafdf7db44265f0605ad11c19cf6 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fr_mail_forward_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fr_mail_get.lng b/interface/ispconfig/interface/mail/lib/lang/fr_mail_get.lng new file mode 100644 index 0000000000000000000000000000000000000000..9aeb863893c22aaec58ea3012ad30efd90d4ad6d --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fr_mail_get.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fr_mail_get_list.lng b/interface/ispconfig/interface/mail/lib/lang/fr_mail_get_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..86fb4d171a4d9d094955ee9addda7e0825563a0c --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fr_mail_get_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fr_mail_relay_recipient.lng b/interface/ispconfig/interface/mail/lib/lang/fr_mail_relay_recipient.lng new file mode 100644 index 0000000000000000000000000000000000000000..b5c8724da3a5c1f264ff46ee92bec05b2cd223d0 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fr_mail_relay_recipient.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fr_mail_relay_recipient_list.lng b/interface/ispconfig/interface/mail/lib/lang/fr_mail_relay_recipient_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..36045f4e35d3674336045b6b272ff31c571772c4 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fr_mail_relay_recipient_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fr_mail_spamfilter.lng b/interface/ispconfig/interface/mail/lib/lang/fr_mail_spamfilter.lng new file mode 100644 index 0000000000000000000000000000000000000000..f93f485c59834a5b445c4ef7e69ed0e5bdd7e402 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fr_mail_spamfilter.lng @@ -0,0 +1,17 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fr_mail_spamfilter_list.lng b/interface/ispconfig/interface/mail/lib/lang/fr_mail_spamfilter_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..1a7c0fb42a3207bd6df5a6cf3ba800cff092f94c --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fr_mail_spamfilter_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fr_mail_transport.lng b/interface/ispconfig/interface/mail/lib/lang/fr_mail_transport.lng new file mode 100644 index 0000000000000000000000000000000000000000..7fcdca0c5246eebeb0030cb0bad2dea6d50b2072 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fr_mail_transport.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fr_mail_transport_list.lng b/interface/ispconfig/interface/mail/lib/lang/fr_mail_transport_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..4430c77d80a51c8a3a916d86c4b0f3b08d23146e --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fr_mail_transport_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fr_mail_user.lng b/interface/ispconfig/interface/mail/lib/lang/fr_mail_user.lng new file mode 100644 index 0000000000000000000000000000000000000000..c7a818bb4223d0f9d86ac47e272d30f26e4822c6 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fr_mail_user.lng @@ -0,0 +1,41 @@ + 1'; +$wb['move_junk_txt'] = 'Move Spam Emails to Junk directory'; +$wb['name_txt'] = 'Realname'; +$wb['name_optional_txt'] = '(Optional)'; +?> diff --git a/interface/ispconfig/interface/mail/lib/lang/fr_mail_user_filter.lng b/interface/ispconfig/interface/mail/lib/lang/fr_mail_user_filter.lng new file mode 100644 index 0000000000000000000000000000000000000000..aaa31129a00bd588b8526e591c76d62ba8fd3749 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fr_mail_user_filter.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fr_mail_user_filter_list.lng b/interface/ispconfig/interface/mail/lib/lang/fr_mail_user_filter_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..96bde24ea7808740ee3ea2e818a4e7dea8146374 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fr_mail_user_filter_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fr_mail_user_list.lng b/interface/ispconfig/interface/mail/lib/lang/fr_mail_user_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..3e037c04013d3bf2a48fa547056f36b61e8c26c8 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fr_mail_user_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fr_mail_user_stats_list.lng b/interface/ispconfig/interface/mail/lib/lang/fr_mail_user_stats_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..341dfdd7ea600e5dcf897a4ef97ff914462452e6 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fr_mail_user_stats_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fr_mail_whitelist.lng b/interface/ispconfig/interface/mail/lib/lang/fr_mail_whitelist.lng new file mode 100644 index 0000000000000000000000000000000000000000..2d80229bccffb6e058646c16fe11131776e8d066 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fr_mail_whitelist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fr_mail_whitelist_list.lng b/interface/ispconfig/interface/mail/lib/lang/fr_mail_whitelist_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..1537a96f81322ad6da2d9431c1755a5601764e43 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fr_mail_whitelist_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fr_spamfilter_blacklist.lng b/interface/ispconfig/interface/mail/lib/lang/fr_spamfilter_blacklist.lng new file mode 100644 index 0000000000000000000000000000000000000000..530a59e540ab443d2794c43c1b210fc2651613d7 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fr_spamfilter_blacklist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fr_spamfilter_blacklist_list.lng b/interface/ispconfig/interface/mail/lib/lang/fr_spamfilter_blacklist_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..e13895c9aaef7483b616da8b7ed8a8fd0ed223c8 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fr_spamfilter_blacklist_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fr_spamfilter_config.lng b/interface/ispconfig/interface/mail/lib/lang/fr_spamfilter_config.lng new file mode 100644 index 0000000000000000000000000000000000000000..2843133ca3638ec86a1cd4e921cabbe415825b34 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fr_spamfilter_config.lng @@ -0,0 +1,20 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fr_spamfilter_config_list.lng b/interface/ispconfig/interface/mail/lib/lang/fr_spamfilter_config_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..d59ed84c2c2408a814375d56fe50bc66a284d264 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fr_spamfilter_config_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fr_spamfilter_policy.lng b/interface/ispconfig/interface/mail/lib/lang/fr_spamfilter_policy.lng new file mode 100644 index 0000000000000000000000000000000000000000..d40fd4a0c8acec50184d80da06458785f9b018a9 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fr_spamfilter_policy.lng @@ -0,0 +1,38 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fr_spamfilter_policy_list.lng b/interface/ispconfig/interface/mail/lib/lang/fr_spamfilter_policy_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..81e5ebfdea653754f43bf06db978d4c0d0fc3f6c --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fr_spamfilter_policy_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fr_spamfilter_users.lng b/interface/ispconfig/interface/mail/lib/lang/fr_spamfilter_users.lng new file mode 100644 index 0000000000000000000000000000000000000000..e88d33e39625a73fdaf29dab14ef4d12a048908b --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fr_spamfilter_users.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fr_spamfilter_users_list.lng b/interface/ispconfig/interface/mail/lib/lang/fr_spamfilter_users_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..55448926a81ac5b542eaac4f09dd9b00c1da247f --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fr_spamfilter_users_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fr_spamfilter_whitelist.lng b/interface/ispconfig/interface/mail/lib/lang/fr_spamfilter_whitelist.lng new file mode 100644 index 0000000000000000000000000000000000000000..dc51f7b5e74abceea63b1a5ba0cd1524ca75b907 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fr_spamfilter_whitelist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fr_spamfilter_whitelist_list.lng b/interface/ispconfig/interface/mail/lib/lang/fr_spamfilter_whitelist_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..d209d17a4c941e9b49aa154e154d767fe3d3cb18 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fr_spamfilter_whitelist_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/hu.lng b/interface/ispconfig/interface/mail/lib/lang/hu.lng new file mode 100644 index 0000000000000000000000000000000000000000..c799c35020bae2c39a276e52eb13e525d120d335 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/hu.lng @@ -0,0 +1,47 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/hu_mail_alias.lng b/interface/ispconfig/interface/mail/lib/lang/hu_mail_alias.lng new file mode 100644 index 0000000000000000000000000000000000000000..f6fb8276025eb51c75419484b60dff55e1978926 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/hu_mail_alias.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/hu_mail_alias_list.lng b/interface/ispconfig/interface/mail/lib/lang/hu_mail_alias_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..a349fba2b3bd1e6be6939ca762929d47e67071ac --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/hu_mail_alias_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/hu_mail_aliasdomain.lng b/interface/ispconfig/interface/mail/lib/lang/hu_mail_aliasdomain.lng new file mode 100644 index 0000000000000000000000000000000000000000..5815d1e6099a56a7282966cef5c88f89fad9a321 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/hu_mail_aliasdomain.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/hu_mail_aliasdomain_list.lng b/interface/ispconfig/interface/mail/lib/lang/hu_mail_aliasdomain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..d96a63e2a4db69d1cc277febcdc1e21afe3f8366 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/hu_mail_aliasdomain_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/hu_mail_blacklist.lng b/interface/ispconfig/interface/mail/lib/lang/hu_mail_blacklist.lng new file mode 100644 index 0000000000000000000000000000000000000000..1d2f0e014ecac7e1d1c3f940ab6b84c0e4b45721 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/hu_mail_blacklist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/hu_mail_blacklist_list.lng b/interface/ispconfig/interface/mail/lib/lang/hu_mail_blacklist_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..0552cdae7c25ea90aaf9b6e3d671b52d0ffa020f --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/hu_mail_blacklist_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/hu_mail_content_filter.lng b/interface/ispconfig/interface/mail/lib/lang/hu_mail_content_filter.lng new file mode 100644 index 0000000000000000000000000000000000000000..687443d2423ec37d7654fdb56c9fcc9f833ffa6f --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/hu_mail_content_filter.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/hu_mail_content_filter_list.lng b/interface/ispconfig/interface/mail/lib/lang/hu_mail_content_filter_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..557c9baedd7dc3b63a378efe5a180aa210e5ffee --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/hu_mail_content_filter_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/hu_mail_domain.lng b/interface/ispconfig/interface/mail/lib/lang/hu_mail_domain.lng new file mode 100644 index 0000000000000000000000000000000000000000..abaf7595b5944a844b5c4397c1fad9172cbfdfa7 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/hu_mail_domain.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/hu_mail_domain_catchall.lng b/interface/ispconfig/interface/mail/lib/lang/hu_mail_domain_catchall.lng new file mode 100644 index 0000000000000000000000000000000000000000..e064f30560daa71b346436d909414197b8d62a80 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/hu_mail_domain_catchall.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/hu_mail_domain_catchall_list.lng b/interface/ispconfig/interface/mail/lib/lang/hu_mail_domain_catchall_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..effd9791401bebe15d745b8e8b7d634eb72d8a11 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/hu_mail_domain_catchall_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/hu_mail_domain_list.lng b/interface/ispconfig/interface/mail/lib/lang/hu_mail_domain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..aa90c422c8ad28fe8d0d0251208243f11b28776c --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/hu_mail_domain_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/hu_mail_forward.lng b/interface/ispconfig/interface/mail/lib/lang/hu_mail_forward.lng new file mode 100644 index 0000000000000000000000000000000000000000..ec3e281a87a967bbc7b66f56d6a7f9c65b882f43 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/hu_mail_forward.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/hu_mail_forward_list.lng b/interface/ispconfig/interface/mail/lib/lang/hu_mail_forward_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..d9f9177098daf98d539bf6675597e98fd4f66e3b --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/hu_mail_forward_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/hu_mail_get.lng b/interface/ispconfig/interface/mail/lib/lang/hu_mail_get.lng new file mode 100644 index 0000000000000000000000000000000000000000..d3e0661755aaf99ff57bb68e3b87b7358388159a --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/hu_mail_get.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/hu_mail_get_list.lng b/interface/ispconfig/interface/mail/lib/lang/hu_mail_get_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..bb18a849cc9ff12569d4488fcafdcf2640f122fe --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/hu_mail_get_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/hu_mail_relay_recipient.lng b/interface/ispconfig/interface/mail/lib/lang/hu_mail_relay_recipient.lng new file mode 100644 index 0000000000000000000000000000000000000000..b5c8724da3a5c1f264ff46ee92bec05b2cd223d0 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/hu_mail_relay_recipient.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/hu_mail_relay_recipient_list.lng b/interface/ispconfig/interface/mail/lib/lang/hu_mail_relay_recipient_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..36045f4e35d3674336045b6b272ff31c571772c4 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/hu_mail_relay_recipient_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/hu_mail_spamfilter.lng b/interface/ispconfig/interface/mail/lib/lang/hu_mail_spamfilter.lng new file mode 100644 index 0000000000000000000000000000000000000000..1aeef9c88a233fa6bc87777db1a28d8aae27fd4d --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/hu_mail_spamfilter.lng @@ -0,0 +1,17 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/hu_mail_spamfilter_list.lng b/interface/ispconfig/interface/mail/lib/lang/hu_mail_spamfilter_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..aa5879e327462bcf6e3bdb1a1d16c8ab37096465 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/hu_mail_spamfilter_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/hu_mail_transport.lng b/interface/ispconfig/interface/mail/lib/lang/hu_mail_transport.lng new file mode 100644 index 0000000000000000000000000000000000000000..d5089f3c18693950168cd3d566ee466397584a80 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/hu_mail_transport.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/hu_mail_transport_list.lng b/interface/ispconfig/interface/mail/lib/lang/hu_mail_transport_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..c2e7bf2a4352590a2e877a7cf09ff9c4fef8702b --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/hu_mail_transport_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/hu_mail_user.lng b/interface/ispconfig/interface/mail/lib/lang/hu_mail_user.lng new file mode 100644 index 0000000000000000000000000000000000000000..3aaeca1468d33f8812b540d6e3bd7827d7100c9b --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/hu_mail_user.lng @@ -0,0 +1,39 @@ + 1'; +$wb['autoresponder_start_date_txt'] = 'Start on'; +$wb['autoresponder_start_date_isfuture'] = 'Start date cannot be in the past.'; +$wb['autoresponder_end_date_txt'] = 'End by'; +$wb['autoresponder_end_date_isgreater'] = 'End date must be set and be later than start date.'; +$wb['move_junk_txt'] = 'Move Spam Emails to Junk directory'; +$wb['name_txt'] = 'Realname'; +$wb['name_optional_txt'] = '(Optional)'; +?> diff --git a/interface/ispconfig/interface/mail/lib/lang/hu_mail_user_filter.lng b/interface/ispconfig/interface/mail/lib/lang/hu_mail_user_filter.lng new file mode 100644 index 0000000000000000000000000000000000000000..e51ddd0cf028cbcd107c7c6fab4714814527cee9 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/hu_mail_user_filter.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/hu_mail_user_filter_list.lng b/interface/ispconfig/interface/mail/lib/lang/hu_mail_user_filter_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..1adaa5ecd57708af16e0d69308b344ce076c787f --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/hu_mail_user_filter_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/hu_mail_user_list.lng b/interface/ispconfig/interface/mail/lib/lang/hu_mail_user_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..71d8e6beb9971a96b4f2a94cbd6d64fd98a9508b --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/hu_mail_user_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/hu_mail_user_stats_list.lng b/interface/ispconfig/interface/mail/lib/lang/hu_mail_user_stats_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..88b4b81bfdfc3f23b24f5344da072947bc409c9d --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/hu_mail_user_stats_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/hu_mail_whitelist.lng b/interface/ispconfig/interface/mail/lib/lang/hu_mail_whitelist.lng new file mode 100644 index 0000000000000000000000000000000000000000..71c3cf39bbc118667588f71ab6a18b66794e96df --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/hu_mail_whitelist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/hu_mail_whitelist_list.lng b/interface/ispconfig/interface/mail/lib/lang/hu_mail_whitelist_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..b5bc4682501f6d91f82506baf972a7be48cb6898 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/hu_mail_whitelist_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/hu_spamfilter_blacklist.lng b/interface/ispconfig/interface/mail/lib/lang/hu_spamfilter_blacklist.lng new file mode 100644 index 0000000000000000000000000000000000000000..077a7bc23eb1ab1ac3f6c7cc8254af07b1f353d3 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/hu_spamfilter_blacklist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/hu_spamfilter_blacklist_list.lng b/interface/ispconfig/interface/mail/lib/lang/hu_spamfilter_blacklist_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..c526bbb10947e87db61f70702617e6fb0f7b2051 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/hu_spamfilter_blacklist_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/hu_spamfilter_config.lng b/interface/ispconfig/interface/mail/lib/lang/hu_spamfilter_config.lng new file mode 100644 index 0000000000000000000000000000000000000000..c137e9a6866535a775231a3b9e29b8c60bddd8c0 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/hu_spamfilter_config.lng @@ -0,0 +1,20 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/hu_spamfilter_config_list.lng b/interface/ispconfig/interface/mail/lib/lang/hu_spamfilter_config_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..59d0449d8c0731a8a7c170af84caf2d3fe350884 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/hu_spamfilter_config_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/hu_spamfilter_policy.lng b/interface/ispconfig/interface/mail/lib/lang/hu_spamfilter_policy.lng new file mode 100644 index 0000000000000000000000000000000000000000..06cbda576e0887e41987a8e4edcceded5ae1c1cc --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/hu_spamfilter_policy.lng @@ -0,0 +1,38 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/hu_spamfilter_policy_list.lng b/interface/ispconfig/interface/mail/lib/lang/hu_spamfilter_policy_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..a592422d59b5511c165108182243865007c79275 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/hu_spamfilter_policy_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/hu_spamfilter_users.lng b/interface/ispconfig/interface/mail/lib/lang/hu_spamfilter_users.lng new file mode 100644 index 0000000000000000000000000000000000000000..4fd29bbd53c3a1cac0a0733299a882617dfced3c --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/hu_spamfilter_users.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/hu_spamfilter_users_list.lng b/interface/ispconfig/interface/mail/lib/lang/hu_spamfilter_users_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..796a5f9591437a005a9b79d08f6a1992b8c53c15 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/hu_spamfilter_users_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/hu_spamfilter_whitelist.lng b/interface/ispconfig/interface/mail/lib/lang/hu_spamfilter_whitelist.lng new file mode 100644 index 0000000000000000000000000000000000000000..077a7bc23eb1ab1ac3f6c7cc8254af07b1f353d3 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/hu_spamfilter_whitelist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/hu_spamfilter_whitelist_list.lng b/interface/ispconfig/interface/mail/lib/lang/hu_spamfilter_whitelist_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..9a1a635878ef89a24eb1cede9a24c30b5696a2e4 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/hu_spamfilter_whitelist_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/it.lng b/interface/ispconfig/interface/mail/lib/lang/it.lng new file mode 100644 index 0000000000000000000000000000000000000000..e3a31e332f3521f303403574d36fd33ac7559d8d --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/it.lng @@ -0,0 +1,47 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/it_mail_alias.lng b/interface/ispconfig/interface/mail/lib/lang/it_mail_alias.lng new file mode 100644 index 0000000000000000000000000000000000000000..44b6fed86b1834dd04b88ee8e106fd5cfe2894ed --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/it_mail_alias.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/it_mail_alias_list.lng b/interface/ispconfig/interface/mail/lib/lang/it_mail_alias_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..0a44ea4f72868d80dcb76fed178b8b2172ffe4b5 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/it_mail_alias_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/it_mail_aliasdomain.lng b/interface/ispconfig/interface/mail/lib/lang/it_mail_aliasdomain.lng new file mode 100644 index 0000000000000000000000000000000000000000..5815d1e6099a56a7282966cef5c88f89fad9a321 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/it_mail_aliasdomain.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/it_mail_aliasdomain_list.lng b/interface/ispconfig/interface/mail/lib/lang/it_mail_aliasdomain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..d96a63e2a4db69d1cc277febcdc1e21afe3f8366 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/it_mail_aliasdomain_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/it_mail_blacklist.lng b/interface/ispconfig/interface/mail/lib/lang/it_mail_blacklist.lng new file mode 100644 index 0000000000000000000000000000000000000000..5b2815c0d00a2e2c3f96064cfd11561472e8ed78 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/it_mail_blacklist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/it_mail_blacklist_list.lng b/interface/ispconfig/interface/mail/lib/lang/it_mail_blacklist_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..a72052f085daf8d9fea34a8e90de8c45767b0d6c --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/it_mail_blacklist_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/it_mail_content_filter.lng b/interface/ispconfig/interface/mail/lib/lang/it_mail_content_filter.lng new file mode 100644 index 0000000000000000000000000000000000000000..9d5e5f9baf6e94e57b85c4e390cbc37d4d6e57ca --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/it_mail_content_filter.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/it_mail_content_filter_list.lng b/interface/ispconfig/interface/mail/lib/lang/it_mail_content_filter_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..8c1e5e2e753bccf56cb15ecc4a130546378cb93c --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/it_mail_content_filter_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/it_mail_domain.lng b/interface/ispconfig/interface/mail/lib/lang/it_mail_domain.lng new file mode 100644 index 0000000000000000000000000000000000000000..6120e82b7dc518f9d496329f38d0cf57257e3941 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/it_mail_domain.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/it_mail_domain_catchall.lng b/interface/ispconfig/interface/mail/lib/lang/it_mail_domain_catchall.lng new file mode 100644 index 0000000000000000000000000000000000000000..382e97f0e11bf60d4aea2734fdb3e3eb456be700 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/it_mail_domain_catchall.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/it_mail_domain_catchall_list.lng b/interface/ispconfig/interface/mail/lib/lang/it_mail_domain_catchall_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..7d076dd4c444ff04b721a810cee0ab7e5e955f72 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/it_mail_domain_catchall_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/it_mail_domain_list.lng b/interface/ispconfig/interface/mail/lib/lang/it_mail_domain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..d844781311c418578094d9e94f1b271d501d9331 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/it_mail_domain_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/it_mail_forward.lng b/interface/ispconfig/interface/mail/lib/lang/it_mail_forward.lng new file mode 100644 index 0000000000000000000000000000000000000000..7d237e14f7920e64a1d69dc74d675af9147bbf7b --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/it_mail_forward.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/it_mail_forward_list.lng b/interface/ispconfig/interface/mail/lib/lang/it_mail_forward_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..f4529440c1c487cc62752ed7bb92aaa81d247053 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/it_mail_forward_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/it_mail_get.lng b/interface/ispconfig/interface/mail/lib/lang/it_mail_get.lng new file mode 100644 index 0000000000000000000000000000000000000000..5e42823b67151b778e87ce5bdd380318935acd42 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/it_mail_get.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/it_mail_get_list.lng b/interface/ispconfig/interface/mail/lib/lang/it_mail_get_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..4baf67e0251cd77ba86cd566e8c14d2f3a1e2fee --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/it_mail_get_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/it_mail_relay_recipient.lng b/interface/ispconfig/interface/mail/lib/lang/it_mail_relay_recipient.lng new file mode 100644 index 0000000000000000000000000000000000000000..b5c8724da3a5c1f264ff46ee92bec05b2cd223d0 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/it_mail_relay_recipient.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/it_mail_relay_recipient_list.lng b/interface/ispconfig/interface/mail/lib/lang/it_mail_relay_recipient_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..36045f4e35d3674336045b6b272ff31c571772c4 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/it_mail_relay_recipient_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/it_mail_spamfilter.lng b/interface/ispconfig/interface/mail/lib/lang/it_mail_spamfilter.lng new file mode 100644 index 0000000000000000000000000000000000000000..e0a2a2f9aff0864b0dbb35fbd88d977807c1114a --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/it_mail_spamfilter.lng @@ -0,0 +1,17 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/it_mail_spamfilter_list.lng b/interface/ispconfig/interface/mail/lib/lang/it_mail_spamfilter_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..728f3d365d655d41137581cc52e2201f12ff3a9f --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/it_mail_spamfilter_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/it_mail_transport.lng b/interface/ispconfig/interface/mail/lib/lang/it_mail_transport.lng new file mode 100644 index 0000000000000000000000000000000000000000..a4d7bbc44ccd4ea9ca7d30fd9a3884807fbe505c --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/it_mail_transport.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/it_mail_transport_list.lng b/interface/ispconfig/interface/mail/lib/lang/it_mail_transport_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..a96c081e63319df7ba9067464c9f2dc2a646b909 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/it_mail_transport_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/it_mail_user.lng b/interface/ispconfig/interface/mail/lib/lang/it_mail_user.lng new file mode 100644 index 0000000000000000000000000000000000000000..37450364393de714816ecafebbaba15abb29336f --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/it_mail_user.lng @@ -0,0 +1,41 @@ + 1'; +$wb['autoresponder_start_date_txt'] = 'Start on'; +$wb['autoresponder_start_date_isfuture'] = 'Start date cannot be in the past.'; +$wb['autoresponder_end_date_txt'] = 'End by'; +$wb['autoresponder_end_date_isgreater'] = 'End date must be set and be later than start date.'; +$wb['move_junk_txt'] = 'Move Spam Emails to Junk directory'; +$wb['name_txt'] = 'Realname'; +$wb['name_optional_txt'] = '(Optional)'; +?> diff --git a/interface/ispconfig/interface/mail/lib/lang/it_mail_user_filter.lng b/interface/ispconfig/interface/mail/lib/lang/it_mail_user_filter.lng new file mode 100644 index 0000000000000000000000000000000000000000..e633c1bd1e4c09a7bb86cf84f5aec2fd7838d9fa --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/it_mail_user_filter.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/it_mail_user_filter_list.lng b/interface/ispconfig/interface/mail/lib/lang/it_mail_user_filter_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..2754259f47a28bfc2eb7b844f87627b86316fded --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/it_mail_user_filter_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/it_mail_user_list.lng b/interface/ispconfig/interface/mail/lib/lang/it_mail_user_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..6063cef128dfb24ede1089c29d04ca329c374e5f --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/it_mail_user_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/it_mail_user_stats_list.lng b/interface/ispconfig/interface/mail/lib/lang/it_mail_user_stats_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..edde65bd7a8b860128f4f53769c7afebbfb78daf --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/it_mail_user_stats_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/it_mail_whitelist.lng b/interface/ispconfig/interface/mail/lib/lang/it_mail_whitelist.lng new file mode 100644 index 0000000000000000000000000000000000000000..92c365ba2b55b1f47c63880b3722132cf6842950 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/it_mail_whitelist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/it_mail_whitelist_list.lng b/interface/ispconfig/interface/mail/lib/lang/it_mail_whitelist_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..eaa7eb3fc58a897b7d606e2476ed3658db7d7d29 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/it_mail_whitelist_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/it_spamfilter_blacklist.lng b/interface/ispconfig/interface/mail/lib/lang/it_spamfilter_blacklist.lng new file mode 100644 index 0000000000000000000000000000000000000000..5a85949ab68a2dc40878e5804446e89f3e0ecc09 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/it_spamfilter_blacklist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/it_spamfilter_blacklist_list.lng b/interface/ispconfig/interface/mail/lib/lang/it_spamfilter_blacklist_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..1b17e644252ee06fd6767145d4437741a1b31809 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/it_spamfilter_blacklist_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/it_spamfilter_config.lng b/interface/ispconfig/interface/mail/lib/lang/it_spamfilter_config.lng new file mode 100644 index 0000000000000000000000000000000000000000..2843133ca3638ec86a1cd4e921cabbe415825b34 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/it_spamfilter_config.lng @@ -0,0 +1,20 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/it_spamfilter_config_list.lng b/interface/ispconfig/interface/mail/lib/lang/it_spamfilter_config_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..70e49e22b8f2c5feba878d5713622819de78fbc4 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/it_spamfilter_config_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/it_spamfilter_policy.lng b/interface/ispconfig/interface/mail/lib/lang/it_spamfilter_policy.lng new file mode 100644 index 0000000000000000000000000000000000000000..e876330a68c7c365b12bf9a3f3cf6b5a652a6093 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/it_spamfilter_policy.lng @@ -0,0 +1,38 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/it_spamfilter_policy_list.lng b/interface/ispconfig/interface/mail/lib/lang/it_spamfilter_policy_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..04491ae4cd85667a4e62826f4213d54339f6c266 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/it_spamfilter_policy_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/it_spamfilter_users.lng b/interface/ispconfig/interface/mail/lib/lang/it_spamfilter_users.lng new file mode 100644 index 0000000000000000000000000000000000000000..a93d94dbae5a1d6f25133988fefceaa2ddc3bc13 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/it_spamfilter_users.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/it_spamfilter_users_list.lng b/interface/ispconfig/interface/mail/lib/lang/it_spamfilter_users_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..ed3d7a399df134fbb4870271df6362d9000b2bb1 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/it_spamfilter_users_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/it_spamfilter_whitelist.lng b/interface/ispconfig/interface/mail/lib/lang/it_spamfilter_whitelist.lng new file mode 100644 index 0000000000000000000000000000000000000000..5a85949ab68a2dc40878e5804446e89f3e0ecc09 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/it_spamfilter_whitelist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/it_spamfilter_whitelist_list.lng b/interface/ispconfig/interface/mail/lib/lang/it_spamfilter_whitelist_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..d209d17a4c941e9b49aa154e154d767fe3d3cb18 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/it_spamfilter_whitelist_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ja.lng b/interface/ispconfig/interface/mail/lib/lang/ja.lng new file mode 100644 index 0000000000000000000000000000000000000000..91dcde5ca1e6d64e4ad0da07904507636a55d31c --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ja.lng @@ -0,0 +1,47 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ja_mail_alias.lng b/interface/ispconfig/interface/mail/lib/lang/ja_mail_alias.lng new file mode 100644 index 0000000000000000000000000000000000000000..032fb286f43e0b3661056e7e742f69cdf7f0eee3 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ja_mail_alias.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ja_mail_alias_list.lng b/interface/ispconfig/interface/mail/lib/lang/ja_mail_alias_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..d7782802c9ebdfa49eee7ff09b8c0e56a74b8041 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ja_mail_alias_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ja_mail_aliasdomain.lng b/interface/ispconfig/interface/mail/lib/lang/ja_mail_aliasdomain.lng new file mode 100644 index 0000000000000000000000000000000000000000..5815d1e6099a56a7282966cef5c88f89fad9a321 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ja_mail_aliasdomain.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ja_mail_aliasdomain_list.lng b/interface/ispconfig/interface/mail/lib/lang/ja_mail_aliasdomain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..d96a63e2a4db69d1cc277febcdc1e21afe3f8366 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ja_mail_aliasdomain_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ja_mail_blacklist.lng b/interface/ispconfig/interface/mail/lib/lang/ja_mail_blacklist.lng new file mode 100644 index 0000000000000000000000000000000000000000..9007f6bb03de75efbc9877f14001161a3455e838 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ja_mail_blacklist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ja_mail_blacklist_list.lng b/interface/ispconfig/interface/mail/lib/lang/ja_mail_blacklist_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..35bea5fc6637863dfdc802a7f56e1ec52d75982a --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ja_mail_blacklist_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ja_mail_content_filter.lng b/interface/ispconfig/interface/mail/lib/lang/ja_mail_content_filter.lng new file mode 100644 index 0000000000000000000000000000000000000000..ba657bbae5d2fab52d86d9b0ce2d7297eee6a57b --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ja_mail_content_filter.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ja_mail_content_filter_list.lng b/interface/ispconfig/interface/mail/lib/lang/ja_mail_content_filter_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..58470067c43fd2037359f950a47a83d1c0bb0ecf --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ja_mail_content_filter_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ja_mail_domain.lng b/interface/ispconfig/interface/mail/lib/lang/ja_mail_domain.lng new file mode 100644 index 0000000000000000000000000000000000000000..37867b047f34cc545aab849df17c5c378bb4e19a --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ja_mail_domain.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ja_mail_domain_catchall.lng b/interface/ispconfig/interface/mail/lib/lang/ja_mail_domain_catchall.lng new file mode 100644 index 0000000000000000000000000000000000000000..9c29cfbb92ae09818516a2ad3402ad980277f76b --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ja_mail_domain_catchall.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ja_mail_domain_catchall_list.lng b/interface/ispconfig/interface/mail/lib/lang/ja_mail_domain_catchall_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..e459645b27a87d471a703220280ac3af07448579 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ja_mail_domain_catchall_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ja_mail_domain_list.lng b/interface/ispconfig/interface/mail/lib/lang/ja_mail_domain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..89eaf06f34c5e80563eb38de399fcc1ac9f482b6 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ja_mail_domain_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ja_mail_forward.lng b/interface/ispconfig/interface/mail/lib/lang/ja_mail_forward.lng new file mode 100644 index 0000000000000000000000000000000000000000..e52a15d8612e32e2e35bf182b8d73a810934474d --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ja_mail_forward.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ja_mail_forward_list.lng b/interface/ispconfig/interface/mail/lib/lang/ja_mail_forward_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..bf0deec1482d460ca948894f91edb0b75614bf51 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ja_mail_forward_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ja_mail_get.lng b/interface/ispconfig/interface/mail/lib/lang/ja_mail_get.lng new file mode 100644 index 0000000000000000000000000000000000000000..a4dd18c4c6b643f2740ce14a6ffb591d26cfb860 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ja_mail_get.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ja_mail_get_list.lng b/interface/ispconfig/interface/mail/lib/lang/ja_mail_get_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..1bf625eef86b07d2dfd9a1d4f3aa72a3ddef6e9f --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ja_mail_get_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ja_mail_relay_recipient.lng b/interface/ispconfig/interface/mail/lib/lang/ja_mail_relay_recipient.lng new file mode 100644 index 0000000000000000000000000000000000000000..b5c8724da3a5c1f264ff46ee92bec05b2cd223d0 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ja_mail_relay_recipient.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ja_mail_relay_recipient_list.lng b/interface/ispconfig/interface/mail/lib/lang/ja_mail_relay_recipient_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..36045f4e35d3674336045b6b272ff31c571772c4 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ja_mail_relay_recipient_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ja_mail_spamfilter.lng b/interface/ispconfig/interface/mail/lib/lang/ja_mail_spamfilter.lng new file mode 100644 index 0000000000000000000000000000000000000000..77ef6dd16f2254179c3b366321e79feae143f65e --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ja_mail_spamfilter.lng @@ -0,0 +1,17 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ja_mail_spamfilter_list.lng b/interface/ispconfig/interface/mail/lib/lang/ja_mail_spamfilter_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..bcc2a12c849a5b6780d4ab969ee0fc165b2a2fe6 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ja_mail_spamfilter_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ja_mail_transport.lng b/interface/ispconfig/interface/mail/lib/lang/ja_mail_transport.lng new file mode 100644 index 0000000000000000000000000000000000000000..b922a0e0276ca8c2d3ffd5eb2b5d6e5d7415b5cf --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ja_mail_transport.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ja_mail_transport_list.lng b/interface/ispconfig/interface/mail/lib/lang/ja_mail_transport_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..77684972ddbd8fe3bfaf7087add466caa0bd9f1c --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ja_mail_transport_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ja_mail_user.lng b/interface/ispconfig/interface/mail/lib/lang/ja_mail_user.lng new file mode 100644 index 0000000000000000000000000000000000000000..35eecb9a011b27a9ddd1740dc9b439f96662d023 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ja_mail_user.lng @@ -0,0 +1,39 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ja_mail_user_filter.lng b/interface/ispconfig/interface/mail/lib/lang/ja_mail_user_filter.lng new file mode 100644 index 0000000000000000000000000000000000000000..94d29d41311168ff0e7b1b788cabbfa188801d3d --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ja_mail_user_filter.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ja_mail_user_filter_list.lng b/interface/ispconfig/interface/mail/lib/lang/ja_mail_user_filter_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..847a415cc4f9e604da266dc220e964e941de7feb --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ja_mail_user_filter_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ja_mail_user_list.lng b/interface/ispconfig/interface/mail/lib/lang/ja_mail_user_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..6063cef128dfb24ede1089c29d04ca329c374e5f --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ja_mail_user_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ja_mail_user_stats_list.lng b/interface/ispconfig/interface/mail/lib/lang/ja_mail_user_stats_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..ee0b9b9af086b86d265b4628500cdf7521bf706d --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ja_mail_user_stats_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ja_mail_whitelist.lng b/interface/ispconfig/interface/mail/lib/lang/ja_mail_whitelist.lng new file mode 100644 index 0000000000000000000000000000000000000000..74d51da927e3d437cdcf64b026dd43674bc3c932 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ja_mail_whitelist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ja_mail_whitelist_list.lng b/interface/ispconfig/interface/mail/lib/lang/ja_mail_whitelist_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..3f9d10414f87132b4a033264845872d3f442d165 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ja_mail_whitelist_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ja_spamfilter_blacklist.lng b/interface/ispconfig/interface/mail/lib/lang/ja_spamfilter_blacklist.lng new file mode 100644 index 0000000000000000000000000000000000000000..3e85ceeb414ab8e57f02f24031e8491df706762b --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ja_spamfilter_blacklist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ja_spamfilter_blacklist_list.lng b/interface/ispconfig/interface/mail/lib/lang/ja_spamfilter_blacklist_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..2e3cc45f9672b0caa40c5297e321d6c6f42fb52b --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ja_spamfilter_blacklist_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ja_spamfilter_config.lng b/interface/ispconfig/interface/mail/lib/lang/ja_spamfilter_config.lng new file mode 100644 index 0000000000000000000000000000000000000000..30211081ba2aabbe9842e01ab20749cec4928e89 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ja_spamfilter_config.lng @@ -0,0 +1,20 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ja_spamfilter_config_list.lng b/interface/ispconfig/interface/mail/lib/lang/ja_spamfilter_config_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..49e2dbe372b64d4306294cecd009b4a0f560e29c --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ja_spamfilter_config_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ja_spamfilter_policy.lng b/interface/ispconfig/interface/mail/lib/lang/ja_spamfilter_policy.lng new file mode 100644 index 0000000000000000000000000000000000000000..89d377a38429c6870ab5fccff09de4cf92cb7cc5 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ja_spamfilter_policy.lng @@ -0,0 +1,38 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ja_spamfilter_policy_list.lng b/interface/ispconfig/interface/mail/lib/lang/ja_spamfilter_policy_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..b2656b78e20c7cd31ce4576dabada1c539c55ece --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ja_spamfilter_policy_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ja_spamfilter_users.lng b/interface/ispconfig/interface/mail/lib/lang/ja_spamfilter_users.lng new file mode 100644 index 0000000000000000000000000000000000000000..815e723c2f9aaedac8acfb4362bc674fb6ffec42 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ja_spamfilter_users.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ja_spamfilter_users_list.lng b/interface/ispconfig/interface/mail/lib/lang/ja_spamfilter_users_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..00459dc549ccf6e4e6e6463b3e222163c1cb428f --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ja_spamfilter_users_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ja_spamfilter_whitelist.lng b/interface/ispconfig/interface/mail/lib/lang/ja_spamfilter_whitelist.lng new file mode 100644 index 0000000000000000000000000000000000000000..3e85ceeb414ab8e57f02f24031e8491df706762b --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ja_spamfilter_whitelist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ja_spamfilter_whitelist_list.lng b/interface/ispconfig/interface/mail/lib/lang/ja_spamfilter_whitelist_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..36009973d710c7d1bfc105eeabdd84407d56d526 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ja_spamfilter_whitelist_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/nl.lng b/interface/ispconfig/interface/mail/lib/lang/nl.lng new file mode 100644 index 0000000000000000000000000000000000000000..b903ae51c56392825d3688184ba33b805607ada1 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/nl.lng @@ -0,0 +1,47 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/nl_mail_alias.lng b/interface/ispconfig/interface/mail/lib/lang/nl_mail_alias.lng new file mode 100644 index 0000000000000000000000000000000000000000..5ee32421de8556722438d1de0dfca83ade48e369 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/nl_mail_alias.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/nl_mail_alias_list.lng b/interface/ispconfig/interface/mail/lib/lang/nl_mail_alias_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..28fe08fb00285ce6acf7566857755dabd81059e2 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/nl_mail_alias_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/nl_mail_aliasdomain.lng b/interface/ispconfig/interface/mail/lib/lang/nl_mail_aliasdomain.lng new file mode 100644 index 0000000000000000000000000000000000000000..c6d8352dc1333b38c5cbd4baf067faf3f76a9091 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/nl_mail_aliasdomain.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/nl_mail_aliasdomain_list.lng b/interface/ispconfig/interface/mail/lib/lang/nl_mail_aliasdomain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..860e583ae4347725e43b5db0292ee7a64160c37c --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/nl_mail_aliasdomain_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/nl_mail_blacklist.lng b/interface/ispconfig/interface/mail/lib/lang/nl_mail_blacklist.lng new file mode 100644 index 0000000000000000000000000000000000000000..f3dd2f4871bb0f3c2d7d89abaca44be92551c6cb --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/nl_mail_blacklist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/nl_mail_blacklist_list.lng b/interface/ispconfig/interface/mail/lib/lang/nl_mail_blacklist_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..a44f067d055cf93529b8b65f814b1dc71636ccee --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/nl_mail_blacklist_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/nl_mail_content_filter.lng b/interface/ispconfig/interface/mail/lib/lang/nl_mail_content_filter.lng new file mode 100644 index 0000000000000000000000000000000000000000..97f102ad7f1920580b1e1d24c44adaffddaca971 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/nl_mail_content_filter.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/nl_mail_content_filter_list.lng b/interface/ispconfig/interface/mail/lib/lang/nl_mail_content_filter_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..bb92651dcc455cd009e94d122ffdd0bfa7a9a750 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/nl_mail_content_filter_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/nl_mail_domain.lng b/interface/ispconfig/interface/mail/lib/lang/nl_mail_domain.lng new file mode 100644 index 0000000000000000000000000000000000000000..5fbdeac2738653202c81578fd67b247a31042b88 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/nl_mail_domain.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/nl_mail_domain_catchall.lng b/interface/ispconfig/interface/mail/lib/lang/nl_mail_domain_catchall.lng new file mode 100644 index 0000000000000000000000000000000000000000..d68f7d821d8c241766ce1f884bfd4a185a59cebe --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/nl_mail_domain_catchall.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/nl_mail_domain_catchall_list.lng b/interface/ispconfig/interface/mail/lib/lang/nl_mail_domain_catchall_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..379f879aa06dd7d26bde69bb5ffa158b2db9e0af --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/nl_mail_domain_catchall_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/nl_mail_domain_list.lng b/interface/ispconfig/interface/mail/lib/lang/nl_mail_domain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..0218e9c59f4b149e38e52f57bd6eb0673eae439a --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/nl_mail_domain_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/nl_mail_forward.lng b/interface/ispconfig/interface/mail/lib/lang/nl_mail_forward.lng new file mode 100644 index 0000000000000000000000000000000000000000..180a13846b5177132b1b94fcd53b9aeed9d7b09f --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/nl_mail_forward.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/nl_mail_forward_list.lng b/interface/ispconfig/interface/mail/lib/lang/nl_mail_forward_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..88cf50b91a05d17b4a0e3f6c61e2f461b5e7acfd --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/nl_mail_forward_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/nl_mail_get.lng b/interface/ispconfig/interface/mail/lib/lang/nl_mail_get.lng new file mode 100644 index 0000000000000000000000000000000000000000..f5097afadaa70cdd435827e2647911774dea2bde --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/nl_mail_get.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/nl_mail_get_list.lng b/interface/ispconfig/interface/mail/lib/lang/nl_mail_get_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..e680ab12ce2bcd5cef52e51849f0588daf0a039b --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/nl_mail_get_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/nl_mail_relay_recipient.lng b/interface/ispconfig/interface/mail/lib/lang/nl_mail_relay_recipient.lng new file mode 100644 index 0000000000000000000000000000000000000000..68e0739e54f076cd3da537e8c1e94ea49e3d8678 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/nl_mail_relay_recipient.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/nl_mail_relay_recipient_list.lng b/interface/ispconfig/interface/mail/lib/lang/nl_mail_relay_recipient_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..57e83235472045a2a044927f289fc93efadbe7d4 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/nl_mail_relay_recipient_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/nl_mail_spamfilter.lng b/interface/ispconfig/interface/mail/lib/lang/nl_mail_spamfilter.lng new file mode 100644 index 0000000000000000000000000000000000000000..707c6f7d3a07748b887a33d5ebf69d270ae69969 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/nl_mail_spamfilter.lng @@ -0,0 +1,17 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/nl_mail_spamfilter_list.lng b/interface/ispconfig/interface/mail/lib/lang/nl_mail_spamfilter_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..556cb5da29561c23e36895830ba1921a79fac022 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/nl_mail_spamfilter_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/nl_mail_transport.lng b/interface/ispconfig/interface/mail/lib/lang/nl_mail_transport.lng new file mode 100644 index 0000000000000000000000000000000000000000..447fde8479f67a1793b62cedc2de9f8f5674eee5 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/nl_mail_transport.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/nl_mail_transport_list.lng b/interface/ispconfig/interface/mail/lib/lang/nl_mail_transport_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..99f3d4175e2261d351d2b8a8ec781d7cd433ea5c --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/nl_mail_transport_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/nl_mail_user.lng b/interface/ispconfig/interface/mail/lib/lang/nl_mail_user.lng new file mode 100644 index 0000000000000000000000000000000000000000..85a08bb62bbf4af57768aa0a7973f6184670893a --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/nl_mail_user.lng @@ -0,0 +1,39 @@ +1)'; +$wb['autoresponder_start_date_txt'] = 'Begin'; +$wb['autoresponder_start_date_isfuture'] = 'Begin-datum kan niet in het verleden liggen.'; +$wb['autoresponder_end_date_txt'] = 'Einde'; +$wb['autoresponder_end_date_isgreater'] = 'Eind-datum mag niet eerder zijn dan de begin-datum.'; +$wb['move_junk_txt'] = 'Verplaats SPAM naar map Ongewenste e-mail'; +$wb['name_txt'] = 'Realname'; +$wb['name_optional_txt'] = '(Optional)'; +?> diff --git a/interface/ispconfig/interface/mail/lib/lang/nl_mail_user_filter.lng b/interface/ispconfig/interface/mail/lib/lang/nl_mail_user_filter.lng new file mode 100644 index 0000000000000000000000000000000000000000..1a89f900988857c0d4e731919fd747cfcc7d5927 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/nl_mail_user_filter.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/nl_mail_user_filter_list.lng b/interface/ispconfig/interface/mail/lib/lang/nl_mail_user_filter_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..fc0af5b2f7b3aba070401efbd4ef02a692ccc875 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/nl_mail_user_filter_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/nl_mail_user_list.lng b/interface/ispconfig/interface/mail/lib/lang/nl_mail_user_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..efd76bf795fb5aa8ccd113b5df1d16c95459b160 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/nl_mail_user_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/nl_mail_user_stats_list.lng b/interface/ispconfig/interface/mail/lib/lang/nl_mail_user_stats_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..7d9406b49b6fd5f3a69ba7043ec1360349b32760 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/nl_mail_user_stats_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/nl_mail_whitelist.lng b/interface/ispconfig/interface/mail/lib/lang/nl_mail_whitelist.lng new file mode 100644 index 0000000000000000000000000000000000000000..8bdc7a744ea47f1bafb895c83ed5d89df5bc47a7 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/nl_mail_whitelist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/nl_mail_whitelist_list.lng b/interface/ispconfig/interface/mail/lib/lang/nl_mail_whitelist_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..e9ed520fb918d72647b7e8dc292761ade8b38691 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/nl_mail_whitelist_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/nl_spamfilter_blacklist.lng b/interface/ispconfig/interface/mail/lib/lang/nl_spamfilter_blacklist.lng new file mode 100644 index 0000000000000000000000000000000000000000..7c3d30c9497d3c9fba6aab2b9b72d0abbc2ea99c --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/nl_spamfilter_blacklist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/nl_spamfilter_blacklist_list.lng b/interface/ispconfig/interface/mail/lib/lang/nl_spamfilter_blacklist_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..adf40b954e4a7a6b50f555d5eb8cc93e7e81c603 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/nl_spamfilter_blacklist_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/nl_spamfilter_config.lng b/interface/ispconfig/interface/mail/lib/lang/nl_spamfilter_config.lng new file mode 100644 index 0000000000000000000000000000000000000000..7e487c94bbf11f60520e17e3d28c23bf3b99e782 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/nl_spamfilter_config.lng @@ -0,0 +1,20 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/nl_spamfilter_config_list.lng b/interface/ispconfig/interface/mail/lib/lang/nl_spamfilter_config_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..cbae14cde5f6b75b792176557993b8153f56138e --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/nl_spamfilter_config_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/nl_spamfilter_policy.lng b/interface/ispconfig/interface/mail/lib/lang/nl_spamfilter_policy.lng new file mode 100644 index 0000000000000000000000000000000000000000..d2ea79df23772efa5ed5206255f51cc6c8e0971a --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/nl_spamfilter_policy.lng @@ -0,0 +1,38 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/nl_spamfilter_policy_list.lng b/interface/ispconfig/interface/mail/lib/lang/nl_spamfilter_policy_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..139e395f8a2b6a98beb87d88d5b3fe718edab3e9 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/nl_spamfilter_policy_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/nl_spamfilter_users.lng b/interface/ispconfig/interface/mail/lib/lang/nl_spamfilter_users.lng new file mode 100644 index 0000000000000000000000000000000000000000..acf65d6ab4b2ff1260ec845dc897aaa4a6573333 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/nl_spamfilter_users.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/nl_spamfilter_users_list.lng b/interface/ispconfig/interface/mail/lib/lang/nl_spamfilter_users_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..51f63097ecf2e2507aa851fb7d2575888f7e20b7 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/nl_spamfilter_users_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/nl_spamfilter_whitelist.lng b/interface/ispconfig/interface/mail/lib/lang/nl_spamfilter_whitelist.lng new file mode 100644 index 0000000000000000000000000000000000000000..7c3d30c9497d3c9fba6aab2b9b72d0abbc2ea99c --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/nl_spamfilter_whitelist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/nl_spamfilter_whitelist_list.lng b/interface/ispconfig/interface/mail/lib/lang/nl_spamfilter_whitelist_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..aa4fe00b348587aa14a5b27e16da4a339da3fc9c --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/nl_spamfilter_whitelist_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/pl.lng b/interface/ispconfig/interface/mail/lib/lang/pl.lng new file mode 100644 index 0000000000000000000000000000000000000000..2e9f8d975f226179814b078a6eb73f0dc7e9b8c7 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pl.lng @@ -0,0 +1,47 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/pl_mail_alias.lng b/interface/ispconfig/interface/mail/lib/lang/pl_mail_alias.lng new file mode 100644 index 0000000000000000000000000000000000000000..8556be818f5a0918074369d760c7a97738531fe4 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pl_mail_alias.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/pl_mail_alias_list.lng b/interface/ispconfig/interface/mail/lib/lang/pl_mail_alias_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..b6ce95d0c77a8a73e4ba729f13dd0f105a1c85f4 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pl_mail_alias_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/pl_mail_aliasdomain.lng b/interface/ispconfig/interface/mail/lib/lang/pl_mail_aliasdomain.lng new file mode 100644 index 0000000000000000000000000000000000000000..5815d1e6099a56a7282966cef5c88f89fad9a321 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pl_mail_aliasdomain.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/pl_mail_aliasdomain_list.lng b/interface/ispconfig/interface/mail/lib/lang/pl_mail_aliasdomain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..d96a63e2a4db69d1cc277febcdc1e21afe3f8366 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pl_mail_aliasdomain_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/pl_mail_blacklist.lng b/interface/ispconfig/interface/mail/lib/lang/pl_mail_blacklist.lng new file mode 100644 index 0000000000000000000000000000000000000000..528f2f741aee3944e1f99f015010dee5fc0a140a --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pl_mail_blacklist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/pl_mail_blacklist_list.lng b/interface/ispconfig/interface/mail/lib/lang/pl_mail_blacklist_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..ebef66657b51451a74459325416366ceaec7e4e6 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pl_mail_blacklist_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/pl_mail_content_filter.lng b/interface/ispconfig/interface/mail/lib/lang/pl_mail_content_filter.lng new file mode 100644 index 0000000000000000000000000000000000000000..54efa4fed020b24309cff19e25bde14247741d56 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pl_mail_content_filter.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/pl_mail_content_filter_list.lng b/interface/ispconfig/interface/mail/lib/lang/pl_mail_content_filter_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..6b0dd9bb8e8b580905cbe9f175a6b7e35bdc74ff --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pl_mail_content_filter_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/pl_mail_domain.lng b/interface/ispconfig/interface/mail/lib/lang/pl_mail_domain.lng new file mode 100644 index 0000000000000000000000000000000000000000..6f9c68cdc64ba0a55299d1c645e395bc4ef41557 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pl_mail_domain.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/pl_mail_domain_catchall.lng b/interface/ispconfig/interface/mail/lib/lang/pl_mail_domain_catchall.lng new file mode 100644 index 0000000000000000000000000000000000000000..c77cc73ba247c42a44d82b37a22d88484d92752f --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pl_mail_domain_catchall.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/pl_mail_domain_catchall_list.lng b/interface/ispconfig/interface/mail/lib/lang/pl_mail_domain_catchall_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..1f0aad197d337e0f1f57cc44fa09336cd3e5d687 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pl_mail_domain_catchall_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/pl_mail_domain_list.lng b/interface/ispconfig/interface/mail/lib/lang/pl_mail_domain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..ec51e2cdb569c89bdac5328c67bea293e847194f --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pl_mail_domain_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/pl_mail_forward.lng b/interface/ispconfig/interface/mail/lib/lang/pl_mail_forward.lng new file mode 100644 index 0000000000000000000000000000000000000000..4e100d6150de6a94ba4fa88f400aca7cac0fe1af --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pl_mail_forward.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/pl_mail_forward_list.lng b/interface/ispconfig/interface/mail/lib/lang/pl_mail_forward_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..1044bd51210f9056a1c7f41ccde185fa4df35ed5 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pl_mail_forward_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/pl_mail_get.lng b/interface/ispconfig/interface/mail/lib/lang/pl_mail_get.lng new file mode 100644 index 0000000000000000000000000000000000000000..66fe5a1f8fba5ec0989f2781e5d7da22e380dd18 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pl_mail_get.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/pl_mail_get_list.lng b/interface/ispconfig/interface/mail/lib/lang/pl_mail_get_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..cd473d9ded2ecbd9802e267807e96fea4498aea9 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pl_mail_get_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/pl_mail_relay_recipient.lng b/interface/ispconfig/interface/mail/lib/lang/pl_mail_relay_recipient.lng new file mode 100644 index 0000000000000000000000000000000000000000..b5c8724da3a5c1f264ff46ee92bec05b2cd223d0 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pl_mail_relay_recipient.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/pl_mail_relay_recipient_list.lng b/interface/ispconfig/interface/mail/lib/lang/pl_mail_relay_recipient_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..36045f4e35d3674336045b6b272ff31c571772c4 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pl_mail_relay_recipient_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/pl_mail_spamfilter.lng b/interface/ispconfig/interface/mail/lib/lang/pl_mail_spamfilter.lng new file mode 100644 index 0000000000000000000000000000000000000000..3879f24247c4576d814349c4b6de7c58bbb5fa57 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pl_mail_spamfilter.lng @@ -0,0 +1,17 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/pl_mail_spamfilter_list.lng b/interface/ispconfig/interface/mail/lib/lang/pl_mail_spamfilter_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..d6097bb3365c2352e7b55185c6f9235f4354e516 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pl_mail_spamfilter_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/pl_mail_transport.lng b/interface/ispconfig/interface/mail/lib/lang/pl_mail_transport.lng new file mode 100644 index 0000000000000000000000000000000000000000..035a5b0499519d0d327b929526d9b44503dbc0bf --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pl_mail_transport.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/pl_mail_transport_list.lng b/interface/ispconfig/interface/mail/lib/lang/pl_mail_transport_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..fa5c584318b4d5a0588b7c8046102bb5e2ee3a31 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pl_mail_transport_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/pl_mail_user.lng b/interface/ispconfig/interface/mail/lib/lang/pl_mail_user.lng new file mode 100644 index 0000000000000000000000000000000000000000..12f4f7ec67e63b3813cb2895b9f029c7a32397ef --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pl_mail_user.lng @@ -0,0 +1,39 @@ + 1'; +$wb['autoresponder_start_date_txt'] = 'Start on'; +$wb['autoresponder_start_date_isfuture'] = 'Start date cannot be in the past.'; +$wb['autoresponder_end_date_txt'] = 'End by'; +$wb['autoresponder_end_date_isgreater'] = 'End date must be set and be later than start date.'; +$wb['move_junk_txt'] = 'Move Spam Emails to Junk directory'; +$wb['name_txt'] = 'Realname'; +$wb['name_optional_txt'] = '(Optional)'; +?> diff --git a/interface/ispconfig/interface/mail/lib/lang/pl_mail_user_filter.lng b/interface/ispconfig/interface/mail/lib/lang/pl_mail_user_filter.lng new file mode 100644 index 0000000000000000000000000000000000000000..129fdae9dfefe967c69d23ba753c5d41c1b55f18 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pl_mail_user_filter.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/pl_mail_user_filter_list.lng b/interface/ispconfig/interface/mail/lib/lang/pl_mail_user_filter_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..cea7c44db5a56384bd763d3fd9c57cfa5c578119 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pl_mail_user_filter_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/pl_mail_user_list.lng b/interface/ispconfig/interface/mail/lib/lang/pl_mail_user_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..287f520f6359b442f97b745e90699e687bd185d0 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pl_mail_user_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/pl_mail_user_stats_list.lng b/interface/ispconfig/interface/mail/lib/lang/pl_mail_user_stats_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..b9780687d79ba053a6e07842b3079e35716b4002 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pl_mail_user_stats_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/pl_mail_whitelist.lng b/interface/ispconfig/interface/mail/lib/lang/pl_mail_whitelist.lng new file mode 100644 index 0000000000000000000000000000000000000000..203c5bae73b49489f47af28011cae1646f4880fd --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pl_mail_whitelist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/pl_mail_whitelist_list.lng b/interface/ispconfig/interface/mail/lib/lang/pl_mail_whitelist_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..10e6dfcf0bb03424f92c145e3582481e6bc8e2a9 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pl_mail_whitelist_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/pl_spamfilter_blacklist.lng b/interface/ispconfig/interface/mail/lib/lang/pl_spamfilter_blacklist.lng new file mode 100644 index 0000000000000000000000000000000000000000..6da8ddc9d97080df44893b5c4d23aadb859215b5 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pl_spamfilter_blacklist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/pl_spamfilter_blacklist_list.lng b/interface/ispconfig/interface/mail/lib/lang/pl_spamfilter_blacklist_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..c237a7a778821b6d5b19a3669848325bef0ca392 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pl_spamfilter_blacklist_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/pl_spamfilter_config.lng b/interface/ispconfig/interface/mail/lib/lang/pl_spamfilter_config.lng new file mode 100644 index 0000000000000000000000000000000000000000..c750d9593773b8362f19dd6ab18885a76516acc9 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pl_spamfilter_config.lng @@ -0,0 +1,20 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/pl_spamfilter_config_list.lng b/interface/ispconfig/interface/mail/lib/lang/pl_spamfilter_config_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..45b3f315cdf378a9bfffb77c7b64fd031de9bd90 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pl_spamfilter_config_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/pl_spamfilter_policy.lng b/interface/ispconfig/interface/mail/lib/lang/pl_spamfilter_policy.lng new file mode 100644 index 0000000000000000000000000000000000000000..0e4df55a37777c3e43dcdb4b0416075bdeedfd80 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pl_spamfilter_policy.lng @@ -0,0 +1,38 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/pl_spamfilter_policy_list.lng b/interface/ispconfig/interface/mail/lib/lang/pl_spamfilter_policy_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..43d9d414d6d48636df7802aebcfed05e6469c69e --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pl_spamfilter_policy_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/pl_spamfilter_users.lng b/interface/ispconfig/interface/mail/lib/lang/pl_spamfilter_users.lng new file mode 100644 index 0000000000000000000000000000000000000000..573f9bec08f37a2775f4097cd5da9b6b9e5eb4fc --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pl_spamfilter_users.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/pl_spamfilter_users_list.lng b/interface/ispconfig/interface/mail/lib/lang/pl_spamfilter_users_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..dde2a62c6ae1ca99ed1b7ae9a49d28989a82644b --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pl_spamfilter_users_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/pl_spamfilter_whitelist.lng b/interface/ispconfig/interface/mail/lib/lang/pl_spamfilter_whitelist.lng new file mode 100644 index 0000000000000000000000000000000000000000..be836015dbccef70847b84d7199f6e7d7ad55fc4 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pl_spamfilter_whitelist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/pl_spamfilter_whitelist_list.lng b/interface/ispconfig/interface/mail/lib/lang/pl_spamfilter_whitelist_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..6517cf41a1e86272d49ab38f544fa4975d78f280 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pl_spamfilter_whitelist_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/pt.lng b/interface/ispconfig/interface/mail/lib/lang/pt.lng new file mode 100644 index 0000000000000000000000000000000000000000..2c051ce57a41aad36be62f9cc78e9792621f0177 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pt.lng @@ -0,0 +1,48 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/pt_mail_alias.lng b/interface/ispconfig/interface/mail/lib/lang/pt_mail_alias.lng new file mode 100644 index 0000000000000000000000000000000000000000..abb37dc553a90d1db43e7228f1e8d8fe714d192a --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pt_mail_alias.lng @@ -0,0 +1,12 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/pt_mail_alias_list.lng b/interface/ispconfig/interface/mail/lib/lang/pt_mail_alias_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..7c5c9e3fc25adebc5900deb520c2f3c0ef1df0c5 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pt_mail_alias_list.lng @@ -0,0 +1,9 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/pt_mail_aliasdomain.lng b/interface/ispconfig/interface/mail/lib/lang/pt_mail_aliasdomain.lng new file mode 100644 index 0000000000000000000000000000000000000000..f98f59e764543c6cc86e9643c7d07ae2b702b5dc --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pt_mail_aliasdomain.lng @@ -0,0 +1,12 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/pt_mail_aliasdomain_list.lng b/interface/ispconfig/interface/mail/lib/lang/pt_mail_aliasdomain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..518720679586ad419db40f44a4517edd260a8abb --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pt_mail_aliasdomain_list.lng @@ -0,0 +1,8 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/pt_mail_blacklist.lng b/interface/ispconfig/interface/mail/lib/lang/pt_mail_blacklist.lng new file mode 100644 index 0000000000000000000000000000000000000000..5a2da4f48e7f70653a4796d7dd509d25f4691511 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pt_mail_blacklist.lng @@ -0,0 +1,10 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/pt_mail_blacklist_list.lng b/interface/ispconfig/interface/mail/lib/lang/pt_mail_blacklist_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..efb50b1d9a063a90f1f8d74c3086333a9966ec12 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pt_mail_blacklist_list.lng @@ -0,0 +1,11 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/pt_mail_content_filter.lng b/interface/ispconfig/interface/mail/lib/lang/pt_mail_content_filter.lng new file mode 100644 index 0000000000000000000000000000000000000000..39c0a618dfa358708bee0509c8230e5e346c3830 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pt_mail_content_filter.lng @@ -0,0 +1,10 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/pt_mail_content_filter_list.lng b/interface/ispconfig/interface/mail/lib/lang/pt_mail_content_filter_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..e81fded7bc3bb1cf6350fc77f48e2da0fc50a49d --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pt_mail_content_filter_list.lng @@ -0,0 +1,9 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/pt_mail_domain.lng b/interface/ispconfig/interface/mail/lib/lang/pt_mail_domain.lng new file mode 100644 index 0000000000000000000000000000000000000000..ec01a7eb789aedc7ce56b5133f46e49de6fc78cd --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pt_mail_domain.lng @@ -0,0 +1,14 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/pt_mail_domain_catchall.lng b/interface/ispconfig/interface/mail/lib/lang/pt_mail_domain_catchall.lng new file mode 100644 index 0000000000000000000000000000000000000000..3a18b2f55ec6aa48911edd9df0768a59b24b085c --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pt_mail_domain_catchall.lng @@ -0,0 +1,10 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/pt_mail_domain_catchall_list.lng b/interface/ispconfig/interface/mail/lib/lang/pt_mail_domain_catchall_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..f23bc678169138ee8c0e40edfd6b0b5418db1f5e --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pt_mail_domain_catchall_list.lng @@ -0,0 +1,10 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/pt_mail_domain_list.lng b/interface/ispconfig/interface/mail/lib/lang/pt_mail_domain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..6a493a18702efb790d0728625442abb59d9dbbb7 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pt_mail_domain_list.lng @@ -0,0 +1,8 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/pt_mail_forward.lng b/interface/ispconfig/interface/mail/lib/lang/pt_mail_forward.lng new file mode 100644 index 0000000000000000000000000000000000000000..9acc18a911a3417551fe5e61150b81e9a1c56733 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pt_mail_forward.lng @@ -0,0 +1,8 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/pt_mail_forward_list.lng b/interface/ispconfig/interface/mail/lib/lang/pt_mail_forward_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..db6622f6babefcc84f2518bd82cfa1287dc65418 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pt_mail_forward_list.lng @@ -0,0 +1,9 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/pt_mail_get.lng b/interface/ispconfig/interface/mail/lib/lang/pt_mail_get.lng new file mode 100644 index 0000000000000000000000000000000000000000..0d86fe648aa0dee923b0d04a69f00c13ca80f2cd --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pt_mail_get.lng @@ -0,0 +1,17 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/pt_mail_get_list.lng b/interface/ispconfig/interface/mail/lib/lang/pt_mail_get_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..3ec9b263ce1258ebf8faa7005c0fd12f8bf1f584 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pt_mail_get_list.lng @@ -0,0 +1,10 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/pt_mail_relay_recipient.lng b/interface/ispconfig/interface/mail/lib/lang/pt_mail_relay_recipient.lng new file mode 100644 index 0000000000000000000000000000000000000000..fe741e2719f92674b6024ba909ac448ea8bf3b49 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pt_mail_relay_recipient.lng @@ -0,0 +1,10 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/pt_mail_relay_recipient_list.lng b/interface/ispconfig/interface/mail/lib/lang/pt_mail_relay_recipient_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..4e2ca4c9304e9a9e6da62a45228308c906a738ce --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pt_mail_relay_recipient_list.lng @@ -0,0 +1,10 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/pt_mail_spamfilter.lng b/interface/ispconfig/interface/mail/lib/lang/pt_mail_spamfilter.lng new file mode 100644 index 0000000000000000000000000000000000000000..580c204b55ffc634c3d1ee9e7626a1d77c0fce7b --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pt_mail_spamfilter.lng @@ -0,0 +1,18 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/pt_mail_spamfilter_list.lng b/interface/ispconfig/interface/mail/lib/lang/pt_mail_spamfilter_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..03ef40df84183d6f6e599a235603be54988554fe --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pt_mail_spamfilter_list.lng @@ -0,0 +1,9 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/pt_mail_transport.lng b/interface/ispconfig/interface/mail/lib/lang/pt_mail_transport.lng new file mode 100644 index 0000000000000000000000000000000000000000..c749a81574b849a5d91000637f0f717019e9bf56 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pt_mail_transport.lng @@ -0,0 +1,11 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/pt_mail_transport_list.lng b/interface/ispconfig/interface/mail/lib/lang/pt_mail_transport_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..43136582a6a2f7b1ebbe393daaecf8837e7b676f --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pt_mail_transport_list.lng @@ -0,0 +1,10 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/pt_mail_user.lng b/interface/ispconfig/interface/mail/lib/lang/pt_mail_user.lng new file mode 100644 index 0000000000000000000000000000000000000000..939dade35e62683cb3afd8812ca503e1e017f268 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pt_mail_user.lng @@ -0,0 +1,40 @@ + 1'; +$wb['autoresponder_start_date_txt'] = 'Início:'; +$wb['autoresponder_start_date_isfuture'] = 'A data de ínicio não pode estar no passado.'; +$wb['autoresponder_end_date_txt'] = 'Termino:'; +$wb['autoresponder_end_date_isgreater'] = 'A data de início deve ser menor que a data de termino.'; +$wb['move_junk_txt'] = 'Mover Spam para a pasta JUNK'; +$wb['name_txt'] = 'Realname'; +$wb['name_optional_txt'] = '(Optional)'; +?> + diff --git a/interface/ispconfig/interface/mail/lib/lang/pt_mail_user_filter.lng b/interface/ispconfig/interface/mail/lib/lang/pt_mail_user_filter.lng new file mode 100644 index 0000000000000000000000000000000000000000..7554389ffb64314c4abf56e1b5d915545a73da32 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pt_mail_user_filter.lng @@ -0,0 +1,11 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/pt_mail_user_filter_list.lng b/interface/ispconfig/interface/mail/lib/lang/pt_mail_user_filter_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..f0075f92ba46a46e6929c6e7d8bf7c0949ea9495 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pt_mail_user_filter_list.lng @@ -0,0 +1,8 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/pt_mail_user_list.lng b/interface/ispconfig/interface/mail/lib/lang/pt_mail_user_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..6150045615d82d45e6cf43345a9eb2ba30eb9118 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pt_mail_user_list.lng @@ -0,0 +1,8 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/pt_mail_user_stats_list.lng b/interface/ispconfig/interface/mail/lib/lang/pt_mail_user_stats_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..bb8a6a4cde9a107ee18d62b6c610b282daa9c67d --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pt_mail_user_stats_list.lng @@ -0,0 +1,9 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/pt_mail_whitelist.lng b/interface/ispconfig/interface/mail/lib/lang/pt_mail_whitelist.lng new file mode 100644 index 0000000000000000000000000000000000000000..6853a4b83a04326bb8705d174eff3bcdf1da1264 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pt_mail_whitelist.lng @@ -0,0 +1,10 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/pt_mail_whitelist_list.lng b/interface/ispconfig/interface/mail/lib/lang/pt_mail_whitelist_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..1ec69a34bb8364f8de607ffce4889eb4e5a88dc4 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pt_mail_whitelist_list.lng @@ -0,0 +1,11 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/pt_spamfilter_blacklist.lng b/interface/ispconfig/interface/mail/lib/lang/pt_spamfilter_blacklist.lng new file mode 100644 index 0000000000000000000000000000000000000000..16b8bc6329bafc39477c1def39a0ac2632f5e9ff --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pt_spamfilter_blacklist.lng @@ -0,0 +1,10 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/pt_spamfilter_blacklist_list.lng b/interface/ispconfig/interface/mail/lib/lang/pt_spamfilter_blacklist_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..b93d91b8d947d36c08975159ffa7530390f3990f --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pt_spamfilter_blacklist_list.lng @@ -0,0 +1,10 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/pt_spamfilter_config.lng b/interface/ispconfig/interface/mail/lib/lang/pt_spamfilter_config.lng new file mode 100644 index 0000000000000000000000000000000000000000..5d2d639a16b2f1cbf5df1dd3144456894b716687 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pt_spamfilter_config.lng @@ -0,0 +1,21 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/pt_spamfilter_config_list.lng b/interface/ispconfig/interface/mail/lib/lang/pt_spamfilter_config_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..9857bc7599d1f64d9afc44ca767936a0b8c2a0f7 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pt_spamfilter_config_list.lng @@ -0,0 +1,6 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/pt_spamfilter_policy.lng b/interface/ispconfig/interface/mail/lib/lang/pt_spamfilter_policy.lng new file mode 100644 index 0000000000000000000000000000000000000000..18df72b1f689034a19a9f880dbc96eb9c825ba4b --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pt_spamfilter_policy.lng @@ -0,0 +1,39 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/pt_spamfilter_policy_list.lng b/interface/ispconfig/interface/mail/lib/lang/pt_spamfilter_policy_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..7675b1de2758cf683e9669169d3ef53b940559a3 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pt_spamfilter_policy_list.lng @@ -0,0 +1,10 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/pt_spamfilter_users.lng b/interface/ispconfig/interface/mail/lib/lang/pt_spamfilter_users.lng new file mode 100644 index 0000000000000000000000000000000000000000..aa8eea9d19b5657581b0d515923a2fb0b85d5703 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pt_spamfilter_users.lng @@ -0,0 +1,9 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/pt_spamfilter_users_list.lng b/interface/ispconfig/interface/mail/lib/lang/pt_spamfilter_users_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..b2398ddcf0a567d42e339d3be4ec3644fb0a4c37 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pt_spamfilter_users_list.lng @@ -0,0 +1,11 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/pt_spamfilter_whitelist.lng b/interface/ispconfig/interface/mail/lib/lang/pt_spamfilter_whitelist.lng new file mode 100644 index 0000000000000000000000000000000000000000..092bf347a5d6afd3271b45580bf0c301e78a8ead --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pt_spamfilter_whitelist.lng @@ -0,0 +1,10 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/pt_spamfilter_whitelist_list.lng b/interface/ispconfig/interface/mail/lib/lang/pt_spamfilter_whitelist_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..b5b68ba1e4b7bbca63c10e0f0ba0d7f70212b859 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pt_spamfilter_whitelist_list.lng @@ -0,0 +1,10 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/ro.lng b/interface/ispconfig/interface/mail/lib/lang/ro.lng new file mode 100644 index 0000000000000000000000000000000000000000..f9ad4e65c8ee00349c36a9a47a530938c23ed66d --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ro.lng @@ -0,0 +1,47 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ro_mail_alias.lng b/interface/ispconfig/interface/mail/lib/lang/ro_mail_alias.lng new file mode 100644 index 0000000000000000000000000000000000000000..dbc2f7abfbf1ed5b204aadeb3302be03cfa96ff6 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ro_mail_alias.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ro_mail_alias_list.lng b/interface/ispconfig/interface/mail/lib/lang/ro_mail_alias_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..e9f37c807b382f94a7c245db1c73a230fc6cb34d --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ro_mail_alias_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ro_mail_aliasdomain.lng b/interface/ispconfig/interface/mail/lib/lang/ro_mail_aliasdomain.lng new file mode 100644 index 0000000000000000000000000000000000000000..241eb64ce5e77bea645b35b2876794fbe78671f2 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ro_mail_aliasdomain.lng @@ -0,0 +1,11 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/ro_mail_aliasdomain_list.lng b/interface/ispconfig/interface/mail/lib/lang/ro_mail_aliasdomain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..8ebfa7decb87a9fdfd8443c35ad8f1e8d5e52882 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ro_mail_aliasdomain_list.lng @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/ro_mail_blacklist.lng b/interface/ispconfig/interface/mail/lib/lang/ro_mail_blacklist.lng new file mode 100644 index 0000000000000000000000000000000000000000..a0feb782628495633fa6eda926e034ff859b1b43 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ro_mail_blacklist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ro_mail_blacklist_list.lng b/interface/ispconfig/interface/mail/lib/lang/ro_mail_blacklist_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..b0342fcf1f4e6a06aa96fba3d39189d4d0667f50 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ro_mail_blacklist_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ro_mail_content_filter.lng b/interface/ispconfig/interface/mail/lib/lang/ro_mail_content_filter.lng new file mode 100644 index 0000000000000000000000000000000000000000..d6f2d8cd1cfa7dc093222af21983b2a7f909b800 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ro_mail_content_filter.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ro_mail_content_filter_list.lng b/interface/ispconfig/interface/mail/lib/lang/ro_mail_content_filter_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..8cd0f8377b6f508cd862b461de67692f0aec06fc --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ro_mail_content_filter_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ro_mail_domain.lng b/interface/ispconfig/interface/mail/lib/lang/ro_mail_domain.lng new file mode 100644 index 0000000000000000000000000000000000000000..ce579c2040a673ddf4ce1097f9d04a3e427fab44 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ro_mail_domain.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ro_mail_domain_catchall.lng b/interface/ispconfig/interface/mail/lib/lang/ro_mail_domain_catchall.lng new file mode 100644 index 0000000000000000000000000000000000000000..9b7134d8489405041c0f8e50d877ccebeb999210 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ro_mail_domain_catchall.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ro_mail_domain_catchall_list.lng b/interface/ispconfig/interface/mail/lib/lang/ro_mail_domain_catchall_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..362af948a07104b3b89e413d6ed0bb5aa035d675 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ro_mail_domain_catchall_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ro_mail_domain_list.lng b/interface/ispconfig/interface/mail/lib/lang/ro_mail_domain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..600eefc7ce2802cf9fd948b4448369a907d3f2d9 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ro_mail_domain_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ro_mail_forward.lng b/interface/ispconfig/interface/mail/lib/lang/ro_mail_forward.lng new file mode 100644 index 0000000000000000000000000000000000000000..f75e39630182d51ec4ee1c041ee1818b873d0f5b --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ro_mail_forward.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ro_mail_forward_list.lng b/interface/ispconfig/interface/mail/lib/lang/ro_mail_forward_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..620cb0de8e2be00af9a984468df2807ab7ed2b4c --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ro_mail_forward_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ro_mail_get.lng b/interface/ispconfig/interface/mail/lib/lang/ro_mail_get.lng new file mode 100644 index 0000000000000000000000000000000000000000..7a8ea8ec8a797ec1299f8fb7e723166756015464 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ro_mail_get.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ro_mail_get_list.lng b/interface/ispconfig/interface/mail/lib/lang/ro_mail_get_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..dcfa65c0f5b83b42cf66a66363ddc4043eea3276 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ro_mail_get_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ro_mail_relay_recipient.lng b/interface/ispconfig/interface/mail/lib/lang/ro_mail_relay_recipient.lng new file mode 100644 index 0000000000000000000000000000000000000000..fdec9ab0a4407dff4051f577b8d28fc71a1ce114 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ro_mail_relay_recipient.lng @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/ro_mail_relay_recipient_list.lng b/interface/ispconfig/interface/mail/lib/lang/ro_mail_relay_recipient_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..44cd894ac2c426dea1d8adb1add200370e81806d --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ro_mail_relay_recipient_list.lng @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/ro_mail_spamfilter.lng b/interface/ispconfig/interface/mail/lib/lang/ro_mail_spamfilter.lng new file mode 100644 index 0000000000000000000000000000000000000000..ce7b3a98c5916006d8294f119e0b4b7f43d8e116 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ro_mail_spamfilter.lng @@ -0,0 +1,17 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ro_mail_spamfilter_list.lng b/interface/ispconfig/interface/mail/lib/lang/ro_mail_spamfilter_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..f398413619ec5e842e95a8ef0d14949aef66a820 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ro_mail_spamfilter_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ro_mail_transport.lng b/interface/ispconfig/interface/mail/lib/lang/ro_mail_transport.lng new file mode 100644 index 0000000000000000000000000000000000000000..6693e9fa87bd549708db113a415a8a8944b83526 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ro_mail_transport.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ro_mail_transport_list.lng b/interface/ispconfig/interface/mail/lib/lang/ro_mail_transport_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..5775d2717938a349f4966c789a2d118b53c8c31b --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ro_mail_transport_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ro_mail_user.lng b/interface/ispconfig/interface/mail/lib/lang/ro_mail_user.lng new file mode 100644 index 0000000000000000000000000000000000000000..19928116fbda93ca0b86c5f55c1b578d99b926b9 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ro_mail_user.lng @@ -0,0 +1,39 @@ + 1'; +$wb['move_junk_txt'] = 'Move Spam Emails to Junk directory'; +$wb['name_txt'] = 'Realname'; +$wb['name_optional_txt'] = '(Optional)'; +?> diff --git a/interface/ispconfig/interface/mail/lib/lang/ro_mail_user_filter.lng b/interface/ispconfig/interface/mail/lib/lang/ro_mail_user_filter.lng new file mode 100644 index 0000000000000000000000000000000000000000..5442a3da011db16bacddc1337f280a3e4ddcf7d1 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ro_mail_user_filter.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ro_mail_user_filter_list.lng b/interface/ispconfig/interface/mail/lib/lang/ro_mail_user_filter_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..d0df167661a2edd2c658aebea3f4cca4df1187e8 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ro_mail_user_filter_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ro_mail_user_list.lng b/interface/ispconfig/interface/mail/lib/lang/ro_mail_user_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..6d45a926b4ce62baab153d7ec716b1950c38b2b0 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ro_mail_user_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ro_mail_user_stats_list.lng b/interface/ispconfig/interface/mail/lib/lang/ro_mail_user_stats_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..525483d85ec1465f2132819ba313c93c4e7693dd --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ro_mail_user_stats_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ro_mail_whitelist.lng b/interface/ispconfig/interface/mail/lib/lang/ro_mail_whitelist.lng new file mode 100644 index 0000000000000000000000000000000000000000..7a3f9f515cff3ecdfb765e7b21ad3f5e6dfc5ae4 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ro_mail_whitelist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ro_mail_whitelist_list.lng b/interface/ispconfig/interface/mail/lib/lang/ro_mail_whitelist_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..e2ab48b662d625f594e83dc0dac1a954e7d5f5b9 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ro_mail_whitelist_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ro_spamfilter_blacklist.lng b/interface/ispconfig/interface/mail/lib/lang/ro_spamfilter_blacklist.lng new file mode 100644 index 0000000000000000000000000000000000000000..f24efb5512d034bc87b0864c05eacaf16ae2d6e3 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ro_spamfilter_blacklist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ro_spamfilter_blacklist_list.lng b/interface/ispconfig/interface/mail/lib/lang/ro_spamfilter_blacklist_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..de9cbc9759fdb33c75c49c741c5dc2a0809cf507 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ro_spamfilter_blacklist_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ro_spamfilter_config.lng b/interface/ispconfig/interface/mail/lib/lang/ro_spamfilter_config.lng new file mode 100644 index 0000000000000000000000000000000000000000..1ed8aac8c32502a22d03ac29c9d66081cad35411 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ro_spamfilter_config.lng @@ -0,0 +1,20 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ro_spamfilter_config_list.lng b/interface/ispconfig/interface/mail/lib/lang/ro_spamfilter_config_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..0590011114c10ccccc632b7abdedeb61bee34943 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ro_spamfilter_config_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ro_spamfilter_policy.lng b/interface/ispconfig/interface/mail/lib/lang/ro_spamfilter_policy.lng new file mode 100644 index 0000000000000000000000000000000000000000..3645b3e1d1c444f8cfc66b514cd7ff847069952b --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ro_spamfilter_policy.lng @@ -0,0 +1,38 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ro_spamfilter_policy_list.lng b/interface/ispconfig/interface/mail/lib/lang/ro_spamfilter_policy_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..d72f802075c3346d52b688afffff6f2b55435b86 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ro_spamfilter_policy_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ro_spamfilter_users.lng b/interface/ispconfig/interface/mail/lib/lang/ro_spamfilter_users.lng new file mode 100644 index 0000000000000000000000000000000000000000..d07cd4987f1c441a9a135be4884b2371a2c06b92 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ro_spamfilter_users.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ro_spamfilter_users_list.lng b/interface/ispconfig/interface/mail/lib/lang/ro_spamfilter_users_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..fb352a16b091fba775bc93212f723bbd50c17ed6 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ro_spamfilter_users_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ro_spamfilter_whitelist.lng b/interface/ispconfig/interface/mail/lib/lang/ro_spamfilter_whitelist.lng new file mode 100644 index 0000000000000000000000000000000000000000..f24efb5512d034bc87b0864c05eacaf16ae2d6e3 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ro_spamfilter_whitelist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ro_spamfilter_whitelist_list.lng b/interface/ispconfig/interface/mail/lib/lang/ro_spamfilter_whitelist_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..adb312d4101caf82920092a1552f751f7ff8ecb8 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ro_spamfilter_whitelist_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ru.lng b/interface/ispconfig/interface/mail/lib/lang/ru.lng new file mode 100644 index 0000000000000000000000000000000000000000..eaeaf4d24b4d5a489b7e067a950301f001b7fa8c --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ru.lng @@ -0,0 +1,48 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/ru_mail_alias.lng b/interface/ispconfig/interface/mail/lib/lang/ru_mail_alias.lng new file mode 100644 index 0000000000000000000000000000000000000000..31408f90a029bad137c27d0e3c7d1a15ef16d7a4 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ru_mail_alias.lng @@ -0,0 +1,12 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/ru_mail_alias_list.lng b/interface/ispconfig/interface/mail/lib/lang/ru_mail_alias_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..079c7697a2f30906ad1e0422858717f1a50a1db5 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ru_mail_alias_list.lng @@ -0,0 +1,9 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/ru_mail_aliasdomain.lng b/interface/ispconfig/interface/mail/lib/lang/ru_mail_aliasdomain.lng new file mode 100644 index 0000000000000000000000000000000000000000..10f6db67cd4f1ab90c1b2e6b7d717857edf1c117 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ru_mail_aliasdomain.lng @@ -0,0 +1,12 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/ru_mail_aliasdomain_list.lng b/interface/ispconfig/interface/mail/lib/lang/ru_mail_aliasdomain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..cfc133851dad9aa4cfdc8963637614d93e438aa6 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ru_mail_aliasdomain_list.lng @@ -0,0 +1,8 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/ru_mail_blacklist.lng b/interface/ispconfig/interface/mail/lib/lang/ru_mail_blacklist.lng new file mode 100644 index 0000000000000000000000000000000000000000..e0136d21d8f306320651b4e3d7b208ff7b33a019 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ru_mail_blacklist.lng @@ -0,0 +1,10 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/ru_mail_blacklist_list.lng b/interface/ispconfig/interface/mail/lib/lang/ru_mail_blacklist_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..239741682f9ae2390f64353f6d50f104f5638c89 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ru_mail_blacklist_list.lng @@ -0,0 +1,11 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/ru_mail_content_filter.lng b/interface/ispconfig/interface/mail/lib/lang/ru_mail_content_filter.lng new file mode 100644 index 0000000000000000000000000000000000000000..74514c3e40f4dd28fa25e7aa436a12d6acdf4037 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ru_mail_content_filter.lng @@ -0,0 +1,10 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/ru_mail_content_filter_list.lng b/interface/ispconfig/interface/mail/lib/lang/ru_mail_content_filter_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..f3925847a5fbecf2580347d37bb14645792f46b8 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ru_mail_content_filter_list.lng @@ -0,0 +1,9 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/ru_mail_domain.lng b/interface/ispconfig/interface/mail/lib/lang/ru_mail_domain.lng new file mode 100644 index 0000000000000000000000000000000000000000..1ce7bcff783eb983f5dda9fd70649da258e80d27 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ru_mail_domain.lng @@ -0,0 +1,14 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/ru_mail_domain_catchall.lng b/interface/ispconfig/interface/mail/lib/lang/ru_mail_domain_catchall.lng new file mode 100644 index 0000000000000000000000000000000000000000..c33e7ed55da06e4438566a46df9dffd89eef897e --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ru_mail_domain_catchall.lng @@ -0,0 +1,10 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/ru_mail_domain_catchall_list.lng b/interface/ispconfig/interface/mail/lib/lang/ru_mail_domain_catchall_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..53fba7f13c8d50a9899452737ce5923a750781bb --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ru_mail_domain_catchall_list.lng @@ -0,0 +1,10 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/ru_mail_domain_list.lng b/interface/ispconfig/interface/mail/lib/lang/ru_mail_domain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..d79119142fd420a969924ef968b88bafae2a2676 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ru_mail_domain_list.lng @@ -0,0 +1,8 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/ru_mail_forward.lng b/interface/ispconfig/interface/mail/lib/lang/ru_mail_forward.lng new file mode 100644 index 0000000000000000000000000000000000000000..91c8de4f7af4254e84b6a7ecb10f038e333bfaa4 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ru_mail_forward.lng @@ -0,0 +1,8 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/ru_mail_forward_list.lng b/interface/ispconfig/interface/mail/lib/lang/ru_mail_forward_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..6fbccc23166c69debdbdaac0b9af5f1e71677985 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ru_mail_forward_list.lng @@ -0,0 +1,9 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/ru_mail_get.lng b/interface/ispconfig/interface/mail/lib/lang/ru_mail_get.lng new file mode 100644 index 0000000000000000000000000000000000000000..d1df0ca6e83614b4761cc85ded05247cb3d58df3 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ru_mail_get.lng @@ -0,0 +1,17 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/ru_mail_get_list.lng b/interface/ispconfig/interface/mail/lib/lang/ru_mail_get_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..624356864885eac7d9712f44065b2dcaade739c9 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ru_mail_get_list.lng @@ -0,0 +1,10 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/ru_mail_relay_recipient.lng b/interface/ispconfig/interface/mail/lib/lang/ru_mail_relay_recipient.lng new file mode 100644 index 0000000000000000000000000000000000000000..f01fe7313c4330a0d39189ef22998cba397fe11d --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ru_mail_relay_recipient.lng @@ -0,0 +1,10 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/ru_mail_relay_recipient_list.lng b/interface/ispconfig/interface/mail/lib/lang/ru_mail_relay_recipient_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..e3196412494792e5daf5b5b498ca6ea289cf5acc --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ru_mail_relay_recipient_list.lng @@ -0,0 +1,10 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/ru_mail_spamfilter.lng b/interface/ispconfig/interface/mail/lib/lang/ru_mail_spamfilter.lng new file mode 100644 index 0000000000000000000000000000000000000000..4b9003bb69d0d965972db3c6ec0be9f67f67e1e0 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ru_mail_spamfilter.lng @@ -0,0 +1,18 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/ru_mail_spamfilter_list.lng b/interface/ispconfig/interface/mail/lib/lang/ru_mail_spamfilter_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..60ea0a80456a69700846096b0d26fb41ca15681a --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ru_mail_spamfilter_list.lng @@ -0,0 +1,9 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/ru_mail_transport.lng b/interface/ispconfig/interface/mail/lib/lang/ru_mail_transport.lng new file mode 100644 index 0000000000000000000000000000000000000000..8120616f64481e3b3025351fafd16e04c3b7e8e7 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ru_mail_transport.lng @@ -0,0 +1,11 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/ru_mail_transport_list.lng b/interface/ispconfig/interface/mail/lib/lang/ru_mail_transport_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..7a83161727e8ea41d60722a42ef757b9bfc9b1d5 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ru_mail_transport_list.lng @@ -0,0 +1,10 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/ru_mail_user.lng b/interface/ispconfig/interface/mail/lib/lang/ru_mail_user.lng new file mode 100644 index 0000000000000000000000000000000000000000..e704e5b0c5c35a04fcdc7a47d2517f3259848ae6 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ru_mail_user.lng @@ -0,0 +1,42 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/ru_mail_user_filter.lng b/interface/ispconfig/interface/mail/lib/lang/ru_mail_user_filter.lng new file mode 100644 index 0000000000000000000000000000000000000000..2c4ec75931f688d6056178854f7b7aaa4dab700e --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ru_mail_user_filter.lng @@ -0,0 +1,11 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/ru_mail_user_filter_list.lng b/interface/ispconfig/interface/mail/lib/lang/ru_mail_user_filter_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..31cdd369008de978cd45e2f6ce7e99890fe26728 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ru_mail_user_filter_list.lng @@ -0,0 +1,8 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/ru_mail_user_list.lng b/interface/ispconfig/interface/mail/lib/lang/ru_mail_user_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..50504e9c2370734f22d4dbe01576323d8a23f145 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ru_mail_user_list.lng @@ -0,0 +1,8 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/ru_mail_user_stats_list.lng b/interface/ispconfig/interface/mail/lib/lang/ru_mail_user_stats_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..8d2d0a5cfda7fccdb4b27c0582f4ed5f1c2076f8 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ru_mail_user_stats_list.lng @@ -0,0 +1,9 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/ru_mail_whitelist.lng b/interface/ispconfig/interface/mail/lib/lang/ru_mail_whitelist.lng new file mode 100644 index 0000000000000000000000000000000000000000..b2da2503bf42750d427fef69c5652e07af675bf4 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ru_mail_whitelist.lng @@ -0,0 +1,10 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/ru_mail_whitelist_list.lng b/interface/ispconfig/interface/mail/lib/lang/ru_mail_whitelist_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..9d1bc96586e0fdf554d16f1a870a3f6262a70aeb --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ru_mail_whitelist_list.lng @@ -0,0 +1,11 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/ru_spamfilter_blacklist.lng b/interface/ispconfig/interface/mail/lib/lang/ru_spamfilter_blacklist.lng new file mode 100644 index 0000000000000000000000000000000000000000..2254ce98d6d9faf2e19989f3361df459f6b551e5 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ru_spamfilter_blacklist.lng @@ -0,0 +1,10 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/ru_spamfilter_blacklist_list.lng b/interface/ispconfig/interface/mail/lib/lang/ru_spamfilter_blacklist_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..2a9bad5a5a17156ce60716691c6a74e419895193 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ru_spamfilter_blacklist_list.lng @@ -0,0 +1,10 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/ru_spamfilter_config.lng b/interface/ispconfig/interface/mail/lib/lang/ru_spamfilter_config.lng new file mode 100644 index 0000000000000000000000000000000000000000..96ab7c2abed8023567fa9488eb6b46f239a79126 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ru_spamfilter_config.lng @@ -0,0 +1,21 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/ru_spamfilter_config_list.lng b/interface/ispconfig/interface/mail/lib/lang/ru_spamfilter_config_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..8d7fb329ef6a16b3799baa659a2a38f951978b94 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ru_spamfilter_config_list.lng @@ -0,0 +1,6 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/ru_spamfilter_policy.lng b/interface/ispconfig/interface/mail/lib/lang/ru_spamfilter_policy.lng new file mode 100644 index 0000000000000000000000000000000000000000..39c08439f17d7eb38030826ebd917e3c8282ad78 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ru_spamfilter_policy.lng @@ -0,0 +1,39 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/ru_spamfilter_policy_list.lng b/interface/ispconfig/interface/mail/lib/lang/ru_spamfilter_policy_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..e629986104d661d9a53abc69022d0ce35434ddd2 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ru_spamfilter_policy_list.lng @@ -0,0 +1,10 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/ru_spamfilter_users.lng b/interface/ispconfig/interface/mail/lib/lang/ru_spamfilter_users.lng new file mode 100644 index 0000000000000000000000000000000000000000..d529a4124adad95c264233998379eb9d5791365a --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ru_spamfilter_users.lng @@ -0,0 +1,9 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/ru_spamfilter_users_list.lng b/interface/ispconfig/interface/mail/lib/lang/ru_spamfilter_users_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..f7bd251f54a441364bae1926accc151e90e563de --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ru_spamfilter_users_list.lng @@ -0,0 +1,11 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/ru_spamfilter_whitelist.lng b/interface/ispconfig/interface/mail/lib/lang/ru_spamfilter_whitelist.lng new file mode 100644 index 0000000000000000000000000000000000000000..df2fb91ec076f56364b82a18776f5ef7589b67e4 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ru_spamfilter_whitelist.lng @@ -0,0 +1,10 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/ru_spamfilter_whitelist_list.lng b/interface/ispconfig/interface/mail/lib/lang/ru_spamfilter_whitelist_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..b81b3e9ad4e628294f835caaec3412618d523771 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ru_spamfilter_whitelist_list.lng @@ -0,0 +1,10 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/se.lng b/interface/ispconfig/interface/mail/lib/lang/se.lng new file mode 100644 index 0000000000000000000000000000000000000000..e3a31e332f3521f303403574d36fd33ac7559d8d --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/se.lng @@ -0,0 +1,47 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/se_mail_alias.lng b/interface/ispconfig/interface/mail/lib/lang/se_mail_alias.lng new file mode 100644 index 0000000000000000000000000000000000000000..742a20aff49fb68387d321fb2d36fce4acb76912 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/se_mail_alias.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/se_mail_alias_list.lng b/interface/ispconfig/interface/mail/lib/lang/se_mail_alias_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..c2fd19e36dd76f0cc101d727c7966cc5a5e43a05 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/se_mail_alias_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/se_mail_aliasdomain.lng b/interface/ispconfig/interface/mail/lib/lang/se_mail_aliasdomain.lng new file mode 100644 index 0000000000000000000000000000000000000000..5815d1e6099a56a7282966cef5c88f89fad9a321 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/se_mail_aliasdomain.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/se_mail_aliasdomain_list.lng b/interface/ispconfig/interface/mail/lib/lang/se_mail_aliasdomain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..d96a63e2a4db69d1cc277febcdc1e21afe3f8366 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/se_mail_aliasdomain_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/se_mail_blacklist.lng b/interface/ispconfig/interface/mail/lib/lang/se_mail_blacklist.lng new file mode 100644 index 0000000000000000000000000000000000000000..a1581416441269676f54788cc945ce5458c4525c --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/se_mail_blacklist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/se_mail_blacklist_list.lng b/interface/ispconfig/interface/mail/lib/lang/se_mail_blacklist_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..497e24d8bdf70fdbd0490a0190a710f257ed7a81 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/se_mail_blacklist_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/se_mail_content_filter.lng b/interface/ispconfig/interface/mail/lib/lang/se_mail_content_filter.lng new file mode 100644 index 0000000000000000000000000000000000000000..9d5e5f9baf6e94e57b85c4e390cbc37d4d6e57ca --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/se_mail_content_filter.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/se_mail_content_filter_list.lng b/interface/ispconfig/interface/mail/lib/lang/se_mail_content_filter_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..8c1e5e2e753bccf56cb15ecc4a130546378cb93c --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/se_mail_content_filter_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/se_mail_domain.lng b/interface/ispconfig/interface/mail/lib/lang/se_mail_domain.lng new file mode 100644 index 0000000000000000000000000000000000000000..dc8cf7bfdda8ca49c7cd1c5bfd3b46395a13f0ec --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/se_mail_domain.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/se_mail_domain_catchall.lng b/interface/ispconfig/interface/mail/lib/lang/se_mail_domain_catchall.lng new file mode 100644 index 0000000000000000000000000000000000000000..8108545c289dfbe90004f0e485da059da4953953 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/se_mail_domain_catchall.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/se_mail_domain_catchall_list.lng b/interface/ispconfig/interface/mail/lib/lang/se_mail_domain_catchall_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..9f4b84cdf987af34ebdfa9f7dc69a37028a7b21d --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/se_mail_domain_catchall_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/se_mail_domain_list.lng b/interface/ispconfig/interface/mail/lib/lang/se_mail_domain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..d0c8ba9798757ed5b4d482511528bd6cbd7b1218 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/se_mail_domain_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/se_mail_forward.lng b/interface/ispconfig/interface/mail/lib/lang/se_mail_forward.lng new file mode 100644 index 0000000000000000000000000000000000000000..be714f48ce24f9435492a059728f48350f652206 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/se_mail_forward.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/se_mail_forward_list.lng b/interface/ispconfig/interface/mail/lib/lang/se_mail_forward_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..1856a7205c96231f940b2a141b6b70d67f170b7a --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/se_mail_forward_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/se_mail_get.lng b/interface/ispconfig/interface/mail/lib/lang/se_mail_get.lng new file mode 100644 index 0000000000000000000000000000000000000000..5e42823b67151b778e87ce5bdd380318935acd42 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/se_mail_get.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/se_mail_get_list.lng b/interface/ispconfig/interface/mail/lib/lang/se_mail_get_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..4baf67e0251cd77ba86cd566e8c14d2f3a1e2fee --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/se_mail_get_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/se_mail_relay_recipient.lng b/interface/ispconfig/interface/mail/lib/lang/se_mail_relay_recipient.lng new file mode 100644 index 0000000000000000000000000000000000000000..b5c8724da3a5c1f264ff46ee92bec05b2cd223d0 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/se_mail_relay_recipient.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/se_mail_relay_recipient_list.lng b/interface/ispconfig/interface/mail/lib/lang/se_mail_relay_recipient_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..36045f4e35d3674336045b6b272ff31c571772c4 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/se_mail_relay_recipient_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/se_mail_spamfilter.lng b/interface/ispconfig/interface/mail/lib/lang/se_mail_spamfilter.lng new file mode 100644 index 0000000000000000000000000000000000000000..e0a2a2f9aff0864b0dbb35fbd88d977807c1114a --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/se_mail_spamfilter.lng @@ -0,0 +1,17 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/se_mail_spamfilter_list.lng b/interface/ispconfig/interface/mail/lib/lang/se_mail_spamfilter_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..728f3d365d655d41137581cc52e2201f12ff3a9f --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/se_mail_spamfilter_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/se_mail_transport.lng b/interface/ispconfig/interface/mail/lib/lang/se_mail_transport.lng new file mode 100644 index 0000000000000000000000000000000000000000..a4d7bbc44ccd4ea9ca7d30fd9a3884807fbe505c --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/se_mail_transport.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/se_mail_transport_list.lng b/interface/ispconfig/interface/mail/lib/lang/se_mail_transport_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..a96c081e63319df7ba9067464c9f2dc2a646b909 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/se_mail_transport_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/se_mail_user.lng b/interface/ispconfig/interface/mail/lib/lang/se_mail_user.lng new file mode 100644 index 0000000000000000000000000000000000000000..37450364393de714816ecafebbaba15abb29336f --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/se_mail_user.lng @@ -0,0 +1,41 @@ + 1'; +$wb['autoresponder_start_date_txt'] = 'Start on'; +$wb['autoresponder_start_date_isfuture'] = 'Start date cannot be in the past.'; +$wb['autoresponder_end_date_txt'] = 'End by'; +$wb['autoresponder_end_date_isgreater'] = 'End date must be set and be later than start date.'; +$wb['move_junk_txt'] = 'Move Spam Emails to Junk directory'; +$wb['name_txt'] = 'Realname'; +$wb['name_optional_txt'] = '(Optional)'; +?> diff --git a/interface/ispconfig/interface/mail/lib/lang/se_mail_user_filter.lng b/interface/ispconfig/interface/mail/lib/lang/se_mail_user_filter.lng new file mode 100644 index 0000000000000000000000000000000000000000..e633c1bd1e4c09a7bb86cf84f5aec2fd7838d9fa --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/se_mail_user_filter.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/se_mail_user_filter_list.lng b/interface/ispconfig/interface/mail/lib/lang/se_mail_user_filter_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..2754259f47a28bfc2eb7b844f87627b86316fded --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/se_mail_user_filter_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/se_mail_user_list.lng b/interface/ispconfig/interface/mail/lib/lang/se_mail_user_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..6063cef128dfb24ede1089c29d04ca329c374e5f --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/se_mail_user_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/se_mail_user_stats_list.lng b/interface/ispconfig/interface/mail/lib/lang/se_mail_user_stats_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..edde65bd7a8b860128f4f53769c7afebbfb78daf --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/se_mail_user_stats_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/se_mail_whitelist.lng b/interface/ispconfig/interface/mail/lib/lang/se_mail_whitelist.lng new file mode 100644 index 0000000000000000000000000000000000000000..355f8be34afe7366c1a62078eb3f9bfc4823720c --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/se_mail_whitelist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/se_mail_whitelist_list.lng b/interface/ispconfig/interface/mail/lib/lang/se_mail_whitelist_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..5534d58528c73edaaaaa7f0b1c304c40a1fa2123 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/se_mail_whitelist_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/se_spamfilter_blacklist.lng b/interface/ispconfig/interface/mail/lib/lang/se_spamfilter_blacklist.lng new file mode 100644 index 0000000000000000000000000000000000000000..5a85949ab68a2dc40878e5804446e89f3e0ecc09 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/se_spamfilter_blacklist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/se_spamfilter_blacklist_list.lng b/interface/ispconfig/interface/mail/lib/lang/se_spamfilter_blacklist_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..1b17e644252ee06fd6767145d4437741a1b31809 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/se_spamfilter_blacklist_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/se_spamfilter_config.lng b/interface/ispconfig/interface/mail/lib/lang/se_spamfilter_config.lng new file mode 100644 index 0000000000000000000000000000000000000000..2843133ca3638ec86a1cd4e921cabbe415825b34 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/se_spamfilter_config.lng @@ -0,0 +1,20 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/se_spamfilter_config_list.lng b/interface/ispconfig/interface/mail/lib/lang/se_spamfilter_config_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..70e49e22b8f2c5feba878d5713622819de78fbc4 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/se_spamfilter_config_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/se_spamfilter_policy.lng b/interface/ispconfig/interface/mail/lib/lang/se_spamfilter_policy.lng new file mode 100644 index 0000000000000000000000000000000000000000..e876330a68c7c365b12bf9a3f3cf6b5a652a6093 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/se_spamfilter_policy.lng @@ -0,0 +1,38 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/se_spamfilter_policy_list.lng b/interface/ispconfig/interface/mail/lib/lang/se_spamfilter_policy_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..04491ae4cd85667a4e62826f4213d54339f6c266 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/se_spamfilter_policy_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/se_spamfilter_users.lng b/interface/ispconfig/interface/mail/lib/lang/se_spamfilter_users.lng new file mode 100644 index 0000000000000000000000000000000000000000..a93d94dbae5a1d6f25133988fefceaa2ddc3bc13 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/se_spamfilter_users.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/se_spamfilter_users_list.lng b/interface/ispconfig/interface/mail/lib/lang/se_spamfilter_users_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..ed3d7a399df134fbb4870271df6362d9000b2bb1 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/se_spamfilter_users_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/se_spamfilter_whitelist.lng b/interface/ispconfig/interface/mail/lib/lang/se_spamfilter_whitelist.lng new file mode 100644 index 0000000000000000000000000000000000000000..5a85949ab68a2dc40878e5804446e89f3e0ecc09 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/se_spamfilter_whitelist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/se_spamfilter_whitelist_list.lng b/interface/ispconfig/interface/mail/lib/lang/se_spamfilter_whitelist_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..d209d17a4c941e9b49aa154e154d767fe3d3cb18 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/se_spamfilter_whitelist_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/sk.lng b/interface/ispconfig/interface/mail/lib/lang/sk.lng new file mode 100644 index 0000000000000000000000000000000000000000..f981e016b84db0516db815b5d6ff8fa2a482efdf --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/sk.lng @@ -0,0 +1,47 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/sk_mail_alias.lng b/interface/ispconfig/interface/mail/lib/lang/sk_mail_alias.lng new file mode 100644 index 0000000000000000000000000000000000000000..9bc1f12da1f204815c87358dabaa6984d67d6d9b --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/sk_mail_alias.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/sk_mail_alias_list.lng b/interface/ispconfig/interface/mail/lib/lang/sk_mail_alias_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..de07deadad2df04245fbb9bd79ebfd9b9f7dcaef --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/sk_mail_alias_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/sk_mail_aliasdomain.lng b/interface/ispconfig/interface/mail/lib/lang/sk_mail_aliasdomain.lng new file mode 100644 index 0000000000000000000000000000000000000000..5815d1e6099a56a7282966cef5c88f89fad9a321 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/sk_mail_aliasdomain.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/sk_mail_aliasdomain_list.lng b/interface/ispconfig/interface/mail/lib/lang/sk_mail_aliasdomain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..d96a63e2a4db69d1cc277febcdc1e21afe3f8366 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/sk_mail_aliasdomain_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/sk_mail_blacklist.lng b/interface/ispconfig/interface/mail/lib/lang/sk_mail_blacklist.lng new file mode 100644 index 0000000000000000000000000000000000000000..40723a2b05c6c207d71ee5efff10a95fbb6c0eea --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/sk_mail_blacklist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/sk_mail_blacklist_list.lng b/interface/ispconfig/interface/mail/lib/lang/sk_mail_blacklist_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..f5ffaad58971b22d33d48c387dd1badb6b463da6 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/sk_mail_blacklist_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/sk_mail_content_filter.lng b/interface/ispconfig/interface/mail/lib/lang/sk_mail_content_filter.lng new file mode 100644 index 0000000000000000000000000000000000000000..973c522591e107c138c75152adb03e00afb49c14 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/sk_mail_content_filter.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/sk_mail_content_filter_list.lng b/interface/ispconfig/interface/mail/lib/lang/sk_mail_content_filter_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..6f9e80ae8bd1ed96d4c9e3b1c439c0451d481b35 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/sk_mail_content_filter_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/sk_mail_domain.lng b/interface/ispconfig/interface/mail/lib/lang/sk_mail_domain.lng new file mode 100644 index 0000000000000000000000000000000000000000..3f944d820eea4c38b30025e4baa07e292acaf36a --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/sk_mail_domain.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/sk_mail_domain_catchall.lng b/interface/ispconfig/interface/mail/lib/lang/sk_mail_domain_catchall.lng new file mode 100644 index 0000000000000000000000000000000000000000..57d42f51037a52910fd74e71c4630d4f1dd1d540 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/sk_mail_domain_catchall.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/sk_mail_domain_catchall_list.lng b/interface/ispconfig/interface/mail/lib/lang/sk_mail_domain_catchall_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..b9ea643b57ffa71b8768998b27f3fc3763b5d1eb --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/sk_mail_domain_catchall_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/sk_mail_domain_list.lng b/interface/ispconfig/interface/mail/lib/lang/sk_mail_domain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..e954961cebc042c3d9a124001b711ee08382427e --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/sk_mail_domain_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/sk_mail_forward.lng b/interface/ispconfig/interface/mail/lib/lang/sk_mail_forward.lng new file mode 100644 index 0000000000000000000000000000000000000000..6ff58d70334d9dfe538577f76dfd3e0274134f72 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/sk_mail_forward.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/sk_mail_forward_list.lng b/interface/ispconfig/interface/mail/lib/lang/sk_mail_forward_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..1f2f724884403bde85d1c17a7401a66c466a9cfa --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/sk_mail_forward_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/sk_mail_get.lng b/interface/ispconfig/interface/mail/lib/lang/sk_mail_get.lng new file mode 100644 index 0000000000000000000000000000000000000000..c1bd07915909f3cfb895466407ccd55e50b5fdf5 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/sk_mail_get.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/sk_mail_get_list.lng b/interface/ispconfig/interface/mail/lib/lang/sk_mail_get_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..deb73fa708015f12c9d3226c7ba34774d648978f --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/sk_mail_get_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/sk_mail_relay_recipient.lng b/interface/ispconfig/interface/mail/lib/lang/sk_mail_relay_recipient.lng new file mode 100644 index 0000000000000000000000000000000000000000..b5c8724da3a5c1f264ff46ee92bec05b2cd223d0 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/sk_mail_relay_recipient.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/sk_mail_relay_recipient_list.lng b/interface/ispconfig/interface/mail/lib/lang/sk_mail_relay_recipient_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..36045f4e35d3674336045b6b272ff31c571772c4 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/sk_mail_relay_recipient_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/sk_mail_spamfilter.lng b/interface/ispconfig/interface/mail/lib/lang/sk_mail_spamfilter.lng new file mode 100644 index 0000000000000000000000000000000000000000..03a632d566f0aa0295d348c1d98489574dd511c5 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/sk_mail_spamfilter.lng @@ -0,0 +1,17 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/sk_mail_spamfilter_list.lng b/interface/ispconfig/interface/mail/lib/lang/sk_mail_spamfilter_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..05736a842357fdc78ce4a0ead60faa08a56d63d8 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/sk_mail_spamfilter_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/sk_mail_transport.lng b/interface/ispconfig/interface/mail/lib/lang/sk_mail_transport.lng new file mode 100644 index 0000000000000000000000000000000000000000..e259510b80dfcb8eea5d59631bea79d7529e547c --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/sk_mail_transport.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/sk_mail_transport_list.lng b/interface/ispconfig/interface/mail/lib/lang/sk_mail_transport_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..c4c17c65aaf05edcc2efb9881b1c201bf6d956be --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/sk_mail_transport_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/sk_mail_user.lng b/interface/ispconfig/interface/mail/lib/lang/sk_mail_user.lng new file mode 100644 index 0000000000000000000000000000000000000000..e769110497986fe3155e5197fc5b0fc785f0e3f0 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/sk_mail_user.lng @@ -0,0 +1,39 @@ + 1'; +$wb['autoresponder_start_date_txt'] = 'Start on'; +$wb['autoresponder_start_date_isfuture'] = 'Start date cannot be in the past.'; +$wb['autoresponder_end_date_txt'] = 'End by'; +$wb['autoresponder_end_date_isgreater'] = 'End date must be set and be later than start date.'; +$wb['move_junk_txt'] = 'Move Spam Emails to Junk directory'; +$wb['name_txt'] = 'Realname'; +$wb['name_optional_txt'] = '(Optional)'; +?> diff --git a/interface/ispconfig/interface/mail/lib/lang/sk_mail_user_filter.lng b/interface/ispconfig/interface/mail/lib/lang/sk_mail_user_filter.lng new file mode 100644 index 0000000000000000000000000000000000000000..1d3966dcb35c304597ab09d0c682762fd3e3687f --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/sk_mail_user_filter.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/sk_mail_user_filter_list.lng b/interface/ispconfig/interface/mail/lib/lang/sk_mail_user_filter_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..f2ae6e92c51fc3e6401d6406a523345bc43119f9 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/sk_mail_user_filter_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/sk_mail_user_list.lng b/interface/ispconfig/interface/mail/lib/lang/sk_mail_user_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..aa3a3c20ceb2a8dab1ea9c851bbbc83ee5ea8d41 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/sk_mail_user_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/sk_mail_user_stats_list.lng b/interface/ispconfig/interface/mail/lib/lang/sk_mail_user_stats_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..8d9361ee5e15baae6ee867e9f59b2705f10efbc2 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/sk_mail_user_stats_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/sk_mail_whitelist.lng b/interface/ispconfig/interface/mail/lib/lang/sk_mail_whitelist.lng new file mode 100644 index 0000000000000000000000000000000000000000..b5caaf4504986c6c8413ad5b05ebae6868332ecf --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/sk_mail_whitelist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/sk_mail_whitelist_list.lng b/interface/ispconfig/interface/mail/lib/lang/sk_mail_whitelist_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..00c2e4d9c96a84d8c3fbf3d926f81c6693b0d906 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/sk_mail_whitelist_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/sk_spamfilter_blacklist.lng b/interface/ispconfig/interface/mail/lib/lang/sk_spamfilter_blacklist.lng new file mode 100644 index 0000000000000000000000000000000000000000..844c9f3236038802ff05c6f46e952cd93cd5c865 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/sk_spamfilter_blacklist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/sk_spamfilter_blacklist_list.lng b/interface/ispconfig/interface/mail/lib/lang/sk_spamfilter_blacklist_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..707477f3aa2843a3823e0bf6a38d406018aa6f35 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/sk_spamfilter_blacklist_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/sk_spamfilter_config.lng b/interface/ispconfig/interface/mail/lib/lang/sk_spamfilter_config.lng new file mode 100644 index 0000000000000000000000000000000000000000..c8de92cb0739bff5145363cec2f0ce92f8c1e07e --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/sk_spamfilter_config.lng @@ -0,0 +1,20 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/sk_spamfilter_config_list.lng b/interface/ispconfig/interface/mail/lib/lang/sk_spamfilter_config_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..f2199097e1789f79eaf19d97fec4d994c7ac6250 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/sk_spamfilter_config_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/sk_spamfilter_policy.lng b/interface/ispconfig/interface/mail/lib/lang/sk_spamfilter_policy.lng new file mode 100644 index 0000000000000000000000000000000000000000..4cd6a4303672950510c8eeb12b7f3665f10a781d --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/sk_spamfilter_policy.lng @@ -0,0 +1,38 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/sk_spamfilter_policy_list.lng b/interface/ispconfig/interface/mail/lib/lang/sk_spamfilter_policy_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..cb21bd264093e9a8ebdb84db17be8921ff8d3d00 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/sk_spamfilter_policy_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/sk_spamfilter_users.lng b/interface/ispconfig/interface/mail/lib/lang/sk_spamfilter_users.lng new file mode 100644 index 0000000000000000000000000000000000000000..f193d421cfd1ff096a35734287d2338b12b8adee --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/sk_spamfilter_users.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/sk_spamfilter_users_list.lng b/interface/ispconfig/interface/mail/lib/lang/sk_spamfilter_users_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..2865596d38d8f9c6c56700d3374008cbd1394d03 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/sk_spamfilter_users_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/sk_spamfilter_whitelist.lng b/interface/ispconfig/interface/mail/lib/lang/sk_spamfilter_whitelist.lng new file mode 100644 index 0000000000000000000000000000000000000000..351ae0e9398fc30589c78587a874fb2ce65f66e8 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/sk_spamfilter_whitelist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/sk_spamfilter_whitelist_list.lng b/interface/ispconfig/interface/mail/lib/lang/sk_spamfilter_whitelist_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..3e6e0e830d9ccfa93c31a29613842183780a79da --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/sk_spamfilter_whitelist_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/tr.lng b/interface/ispconfig/interface/mail/lib/lang/tr.lng new file mode 100644 index 0000000000000000000000000000000000000000..5878a9822b4c561bcf196eb7eedd24d1786ad26c --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/tr.lng @@ -0,0 +1,47 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/tr_mail_alias.lng b/interface/ispconfig/interface/mail/lib/lang/tr_mail_alias.lng new file mode 100644 index 0000000000000000000000000000000000000000..1c94997506903c21d3181645838110234cc42e8d --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/tr_mail_alias.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/tr_mail_alias_list.lng b/interface/ispconfig/interface/mail/lib/lang/tr_mail_alias_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..4f0690d9aca682145f4553d543b786238913e6b2 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/tr_mail_alias_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/tr_mail_aliasdomain.lng b/interface/ispconfig/interface/mail/lib/lang/tr_mail_aliasdomain.lng new file mode 100644 index 0000000000000000000000000000000000000000..5815d1e6099a56a7282966cef5c88f89fad9a321 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/tr_mail_aliasdomain.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/tr_mail_aliasdomain_list.lng b/interface/ispconfig/interface/mail/lib/lang/tr_mail_aliasdomain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..d96a63e2a4db69d1cc277febcdc1e21afe3f8366 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/tr_mail_aliasdomain_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/tr_mail_blacklist.lng b/interface/ispconfig/interface/mail/lib/lang/tr_mail_blacklist.lng new file mode 100644 index 0000000000000000000000000000000000000000..77bb386eaf60b508599772b1b52d0283c515d56f --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/tr_mail_blacklist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/tr_mail_blacklist_list.lng b/interface/ispconfig/interface/mail/lib/lang/tr_mail_blacklist_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..a32e81e64ac0da3f76089fae290fd3f8c0447854 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/tr_mail_blacklist_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/tr_mail_content_filter.lng b/interface/ispconfig/interface/mail/lib/lang/tr_mail_content_filter.lng new file mode 100644 index 0000000000000000000000000000000000000000..fc3901f0dd662bda51d505a1b98d0540ac733de3 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/tr_mail_content_filter.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/tr_mail_content_filter_list.lng b/interface/ispconfig/interface/mail/lib/lang/tr_mail_content_filter_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..8dae6291790f26abc31a0508db5211cc197be7f7 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/tr_mail_content_filter_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/tr_mail_domain.lng b/interface/ispconfig/interface/mail/lib/lang/tr_mail_domain.lng new file mode 100644 index 0000000000000000000000000000000000000000..e8696816e0fdeed9b8b13334330b08203ae0c9a9 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/tr_mail_domain.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/tr_mail_domain_catchall.lng b/interface/ispconfig/interface/mail/lib/lang/tr_mail_domain_catchall.lng new file mode 100644 index 0000000000000000000000000000000000000000..3c6338b42e1072db5c2baa042969e1ee60ded895 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/tr_mail_domain_catchall.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/tr_mail_domain_catchall_list.lng b/interface/ispconfig/interface/mail/lib/lang/tr_mail_domain_catchall_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..fdec4fd538ad0268d31d1324c64507aef6e587dc --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/tr_mail_domain_catchall_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/tr_mail_domain_list.lng b/interface/ispconfig/interface/mail/lib/lang/tr_mail_domain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..596262449c3dab535baddea81c649e0e9a00d87c --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/tr_mail_domain_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/tr_mail_forward.lng b/interface/ispconfig/interface/mail/lib/lang/tr_mail_forward.lng new file mode 100644 index 0000000000000000000000000000000000000000..154641e99dad19760b3f358081d5774d12c79def --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/tr_mail_forward.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/tr_mail_forward_list.lng b/interface/ispconfig/interface/mail/lib/lang/tr_mail_forward_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..88df7144c379ffed8affe25812cb15ef89cde97a --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/tr_mail_forward_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/tr_mail_get.lng b/interface/ispconfig/interface/mail/lib/lang/tr_mail_get.lng new file mode 100644 index 0000000000000000000000000000000000000000..641c6c267d57e7b1ac5d9c3df0ec9d225a391e1b --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/tr_mail_get.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/tr_mail_get_list.lng b/interface/ispconfig/interface/mail/lib/lang/tr_mail_get_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..7cd54a18a4b009dcdab50e13e70c3d296c94fe2d --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/tr_mail_get_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/tr_mail_relay_recipient.lng b/interface/ispconfig/interface/mail/lib/lang/tr_mail_relay_recipient.lng new file mode 100644 index 0000000000000000000000000000000000000000..b5c8724da3a5c1f264ff46ee92bec05b2cd223d0 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/tr_mail_relay_recipient.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/tr_mail_relay_recipient_list.lng b/interface/ispconfig/interface/mail/lib/lang/tr_mail_relay_recipient_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..36045f4e35d3674336045b6b272ff31c571772c4 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/tr_mail_relay_recipient_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/tr_mail_spamfilter.lng b/interface/ispconfig/interface/mail/lib/lang/tr_mail_spamfilter.lng new file mode 100644 index 0000000000000000000000000000000000000000..08e90f9fc7ee89a7d282e9f75b7260345f8bcd15 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/tr_mail_spamfilter.lng @@ -0,0 +1,17 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/tr_mail_spamfilter_list.lng b/interface/ispconfig/interface/mail/lib/lang/tr_mail_spamfilter_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..5caf3441497efbff6aa5204698486bcee30ad116 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/tr_mail_spamfilter_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/tr_mail_transport.lng b/interface/ispconfig/interface/mail/lib/lang/tr_mail_transport.lng new file mode 100644 index 0000000000000000000000000000000000000000..b9c1d90d9f9f0212bcd43bd140a31188d6c58717 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/tr_mail_transport.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/tr_mail_transport_list.lng b/interface/ispconfig/interface/mail/lib/lang/tr_mail_transport_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..44d1e00a3953f4097cdfd107c8eb7dec330f19ea --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/tr_mail_transport_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/tr_mail_user.lng b/interface/ispconfig/interface/mail/lib/lang/tr_mail_user.lng new file mode 100644 index 0000000000000000000000000000000000000000..ed15471ccd3ce95b6b0fb56e8300f4cdddd16dfe --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/tr_mail_user.lng @@ -0,0 +1,39 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/tr_mail_user_filter.lng b/interface/ispconfig/interface/mail/lib/lang/tr_mail_user_filter.lng new file mode 100644 index 0000000000000000000000000000000000000000..abf45c443c070aea1f055d4095e07e8afb18ba1c --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/tr_mail_user_filter.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/tr_mail_user_filter_list.lng b/interface/ispconfig/interface/mail/lib/lang/tr_mail_user_filter_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..cd8b0780dd4437cfab032ba4b2d986fa221ea0f0 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/tr_mail_user_filter_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/tr_mail_user_list.lng b/interface/ispconfig/interface/mail/lib/lang/tr_mail_user_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..ee99944db3d399c7b1670982611ce905c5356981 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/tr_mail_user_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/tr_mail_user_stats_list.lng b/interface/ispconfig/interface/mail/lib/lang/tr_mail_user_stats_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..ddb4fa9f77c1640c8b20c4daf02a5afacdbb5716 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/tr_mail_user_stats_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/tr_mail_whitelist.lng b/interface/ispconfig/interface/mail/lib/lang/tr_mail_whitelist.lng new file mode 100644 index 0000000000000000000000000000000000000000..05ada4ae072f6320cb58f928eb526b5fffacb8fe --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/tr_mail_whitelist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/tr_mail_whitelist_list.lng b/interface/ispconfig/interface/mail/lib/lang/tr_mail_whitelist_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..5f795797d8cd09b257a3ad7831f8688820babac6 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/tr_mail_whitelist_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/tr_spamfilter_blacklist.lng b/interface/ispconfig/interface/mail/lib/lang/tr_spamfilter_blacklist.lng new file mode 100644 index 0000000000000000000000000000000000000000..fe6afeeb0b975cec5d85dcc53923d5fc6e55035b --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/tr_spamfilter_blacklist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/tr_spamfilter_blacklist_list.lng b/interface/ispconfig/interface/mail/lib/lang/tr_spamfilter_blacklist_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..f9dd9ed6d5805462296c0b6b49f818cd51af75da --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/tr_spamfilter_blacklist_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/tr_spamfilter_config.lng b/interface/ispconfig/interface/mail/lib/lang/tr_spamfilter_config.lng new file mode 100644 index 0000000000000000000000000000000000000000..1f4a076d7ae3a42d9f1b02872bdae882679d8646 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/tr_spamfilter_config.lng @@ -0,0 +1,20 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/tr_spamfilter_config_list.lng b/interface/ispconfig/interface/mail/lib/lang/tr_spamfilter_config_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..dd5ce0f349d3cb40eaa2b35f6a624540c47ad350 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/tr_spamfilter_config_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/tr_spamfilter_policy.lng b/interface/ispconfig/interface/mail/lib/lang/tr_spamfilter_policy.lng new file mode 100644 index 0000000000000000000000000000000000000000..11dedf40b77da1316147a158ac340545880f33a8 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/tr_spamfilter_policy.lng @@ -0,0 +1,38 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/tr_spamfilter_policy_list.lng b/interface/ispconfig/interface/mail/lib/lang/tr_spamfilter_policy_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..1344e8573e6896cb06e8a48cfb118128b9483a66 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/tr_spamfilter_policy_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/tr_spamfilter_users.lng b/interface/ispconfig/interface/mail/lib/lang/tr_spamfilter_users.lng new file mode 100644 index 0000000000000000000000000000000000000000..b1e3ff81b81d7b1f8bf036459ec6c33c38633100 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/tr_spamfilter_users.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/tr_spamfilter_users_list.lng b/interface/ispconfig/interface/mail/lib/lang/tr_spamfilter_users_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..095a4bd7715a246e279d5024bae6fafedc04070f --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/tr_spamfilter_users_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/tr_spamfilter_whitelist.lng b/interface/ispconfig/interface/mail/lib/lang/tr_spamfilter_whitelist.lng new file mode 100644 index 0000000000000000000000000000000000000000..fe6afeeb0b975cec5d85dcc53923d5fc6e55035b --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/tr_spamfilter_whitelist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/tr_spamfilter_whitelist_list.lng b/interface/ispconfig/interface/mail/lib/lang/tr_spamfilter_whitelist_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..7b9bf435133f5193381892a1348dad61ebcd6a77 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/tr_spamfilter_whitelist_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/module.conf.php b/interface/ispconfig/interface/mail/lib/module.conf.php new file mode 100644 index 0000000000000000000000000000000000000000..4ea0529d699a94dc0e1c12628638ec8e907479b9 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/module.conf.php @@ -0,0 +1,125 @@ + 'Domain', + 'target' => 'content', + 'link' => 'mail/mail_domain_list.php'); + +$items[] = array( 'title' => 'Domain Alias', + 'target' => 'content', + 'link' => 'mail/mail_aliasdomain_list.php'); + +$items[] = array( 'title' => 'Email Mailbox', + 'target' => 'content', + 'link' => 'mail/mail_user_list.php'); + +$items[] = array( 'title' => 'Email Alias', + 'target' => 'content', + 'link' => 'mail/mail_alias_list.php'); + +$items[] = array( 'title' => 'Email Forward', + 'target' => 'content', + 'link' => 'mail/mail_forward_list.php'); + +$items[] = array( 'title' => 'Email Catchall', + 'target' => 'content', + 'link' => 'mail/mail_domain_catchall_list.php'); + +$items[] = array( 'title' => 'Email Routing', + 'target' => 'content', + 'link' => 'mail/mail_transport_list.php'); + +$module['nav'][] = array( 'title' => 'Email Accounts', + 'open' => 1, + 'items' => $items); + +//**** Spamfilter menu +$items = array(); + +$items[] = array( 'title' => 'Whitelist', + 'target' => 'content', + 'link' => 'mail/spamfilter_whitelist_list.php'); + +$items[] = array( 'title' => 'Blacklist', + 'target' => 'content', + 'link' => 'mail/spamfilter_blacklist_list.php'); + +if($_SESSION['s']['user']['typ'] == 'admin') { + + $items[] = array( 'title' => 'User / Domain', + 'target' => 'content', + 'link' => 'mail/spamfilter_users_list.php'); + + $items[] = array( 'title' => 'Policy', + 'target' => 'content', + 'link' => 'mail/spamfilter_policy_list.php'); + +// $items[] = array( 'title' => 'Server Settings', +// 'target' => 'content', +// 'link' => 'mail/spamfilter_config_list.php'); +} + +$module['nav'][] = array( 'title' => 'Spamfilter', + 'open' => 1, + 'items' => $items); + +//**** Fetchmail menu +$items = array(); + +$items[] = array( 'title' => 'Fetchmail', + 'target' => 'content', + 'link' => 'mail/mail_get_list.php'); + + +$module['nav'][] = array( 'title' => 'Fetchmail', + 'open' => 1, + 'items' => $items); + +//**** Statistics menu +$items = array(); + +$items[] = array( 'title' => 'Mailbox traffic', + 'target' => 'content', + 'link' => 'mail/mail_user_stats.php'); + + +$module['nav'][] = array( 'title' => 'Statistics', + 'open' => 1, + 'items' => $items); + + +//**** Global filters menu +$items = array(); +if($_SESSION['s']['user']['typ'] == 'admin') { + + $items[] = array( 'title' => 'Postfix Whitelist', + 'target' => 'content', + 'link' => 'mail/mail_whitelist_list.php'); + + $items[] = array( 'title' => 'Postfix Blacklist', + 'target' => 'content', + 'link' => 'mail/mail_blacklist_list.php'); + + $items[] = array( 'title' => 'Content Filter', + 'target' => 'content', + 'link' => 'mail/mail_content_filter_list.php'); + + $items[] = array( 'title' => 'Relay Recipients', + 'target' => 'content', + 'link' => 'mail/mail_relay_recipient_list.php'); + + $module['nav'][] = array( 'title' => 'Global Filters', + 'open' => 1, + 'items' => $items); +} + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/list/mail_alias.list.php b/interface/ispconfig/interface/mail/list/mail_alias.list.php new file mode 100644 index 0000000000000000000000000000000000000000..57b7ef663c8b330604cd33f34c02620eba8e5572 --- /dev/null +++ b/interface/ispconfig/interface/mail/list/mail_alias.list.php @@ -0,0 +1,79 @@ + "active", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array('y' => "
    Yes
    ", 'n' => "
    No
    ")); + + +$liste["item"][] = array( 'field' => "source", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "destination", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/list/mail_aliasdomain.list.php b/interface/ispconfig/interface/mail/list/mail_aliasdomain.list.php new file mode 100644 index 0000000000000000000000000000000000000000..7cb7a9ee2f22179850be6c596100c159a82cebf7 --- /dev/null +++ b/interface/ispconfig/interface/mail/list/mail_aliasdomain.list.php @@ -0,0 +1,79 @@ + "active", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array('y' => "
    Yes
    ", 'n' => "
    No
    ")); + + +$liste["item"][] = array( 'field' => "source", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "destination", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/list/mail_blacklist.list.php b/interface/ispconfig/interface/mail/list/mail_blacklist.list.php new file mode 100644 index 0000000000000000000000000000000000000000..8f730125f560fa6f154932f93f6c1efe974b9b1b --- /dev/null +++ b/interface/ispconfig/interface/mail/list/mail_blacklist.list.php @@ -0,0 +1,95 @@ + "active", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array('y' => "
    Yes
    ", 'n' => "
    No
    ")); + + + +$liste["item"][] = array( 'field' => "server_id", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "source", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + + +$liste["item"][] = array( 'field' => "type", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array('recipient' => 'Recipient', 'sender' => 'Sender', 'client' => 'Client')); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/list/mail_content_filter.list.php b/interface/ispconfig/interface/mail/list/mail_content_filter.list.php new file mode 100644 index 0000000000000000000000000000000000000000..2d16f7dc0b6c5a0fd717293ce6b3c25a423a8b8c --- /dev/null +++ b/interface/ispconfig/interface/mail/list/mail_content_filter.list.php @@ -0,0 +1,96 @@ + "active", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array('y' => "
    Yes
    ", 'n' => "
    No
    ")); + + + +$liste["item"][] = array( 'field' => "server_id", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "pattern", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "action", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => array('DISCARD' => 'DISCARD','DUNNO'=>'DUNNO','FILTER'=>'FILTER','HOLD'=>'HOLD','IGNORE'=>'IGNORE','PREPEND'=>'PREPEND','REDIRECT'=>'REDIRECT','REPLACE'=>'REPLACE','REJECT'=>'REJECT','WARN'=>'WARN')); + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/list/mail_domain.list.php b/interface/ispconfig/interface/mail/list/mail_domain.list.php new file mode 100644 index 0000000000000000000000000000000000000000..34b1fb1fdd285bb3350d0cdce2bf0ecafd7e5d97 --- /dev/null +++ b/interface/ispconfig/interface/mail/list/mail_domain.list.php @@ -0,0 +1,86 @@ + "active", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array('y' => "
    Yes
    ", 'n' => "
    No
    ")); + + + +$liste["item"][] = array( 'field' => "server_id", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "domain", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/list/mail_domain_catchall.list.php b/interface/ispconfig/interface/mail/list/mail_domain_catchall.list.php new file mode 100644 index 0000000000000000000000000000000000000000..118856b092e4a2de4c009be63009ef0d2363c630 --- /dev/null +++ b/interface/ispconfig/interface/mail/list/mail_domain_catchall.list.php @@ -0,0 +1,79 @@ + "active", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array('y' => "
    Yes
    ", 'n' => "
    No
    ")); + + +$liste["item"][] = array( 'field' => "source", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "destination", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/list/mail_forward.list.php b/interface/ispconfig/interface/mail/list/mail_forward.list.php new file mode 100644 index 0000000000000000000000000000000000000000..7af79a5fbd819c30c45a685b77475fcc8896e151 --- /dev/null +++ b/interface/ispconfig/interface/mail/list/mail_forward.list.php @@ -0,0 +1,79 @@ + "active", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array('y' => "
    Yes
    ", 'n' => "
    No
    ")); + + +$liste["item"][] = array( 'field' => "source", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "destination", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/list/mail_get.list.php b/interface/ispconfig/interface/mail/list/mail_get.list.php new file mode 100644 index 0000000000000000000000000000000000000000..0e0beb0c0080b0230e0bc9f495545d056e799a5e --- /dev/null +++ b/interface/ispconfig/interface/mail/list/mail_get.list.php @@ -0,0 +1,102 @@ + "active", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array('y' => "
    Yes
    ", 'n' => "
    No
    ")); + + +$liste["item"][] = array( 'field' => "server_id", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "source_server", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "source_username", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "destination", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/list/mail_relay_recipient.list.php b/interface/ispconfig/interface/mail/list/mail_relay_recipient.list.php new file mode 100644 index 0000000000000000000000000000000000000000..0302fff7d2da02123adaa4b6a5ed40c75679427c --- /dev/null +++ b/interface/ispconfig/interface/mail/list/mail_relay_recipient.list.php @@ -0,0 +1,85 @@ + "active", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array('y' => "
    Yes
    ", 'n' => "
    No
    ")); + + +$liste["item"][] = array( 'field' => "server_id", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'width' => "", + 'value' => ""); + + +$liste["item"][] = array( 'field' => "source", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/list/mail_spamfilter.list.php b/interface/ispconfig/interface/mail/list/mail_spamfilter.list.php new file mode 100644 index 0000000000000000000000000000000000000000..91963c0ec53b8fc3d0f181216ef44d797fff8c81 --- /dev/null +++ b/interface/ispconfig/interface/mail/list/mail_spamfilter.list.php @@ -0,0 +1,85 @@ + "active", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array('1' => "
    Yes
    ", '0' => "
    No
    ")); + + +$liste["item"][] = array( 'field' => "server_id", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "server_name", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/list/mail_transport.list.php b/interface/ispconfig/interface/mail/list/mail_transport.list.php new file mode 100644 index 0000000000000000000000000000000000000000..5d3afdd7964521d07afce3885afae788f1cc7d75 --- /dev/null +++ b/interface/ispconfig/interface/mail/list/mail_transport.list.php @@ -0,0 +1,104 @@ + "active", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array('y' => "
    Yes
    ", 'n' => "
    No
    ")); + + +$liste["item"][] = array( 'field' => "server_id", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "domain", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + + +$liste["item"][] = array( 'field' => "transport", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + + +$liste["item"][] = array( 'field' => "sort_order", + 'datatype' => "INTEGER", + 'formtype' => "TEXT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => ""); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/list/mail_user.list.php b/interface/ispconfig/interface/mail/list/mail_user.list.php new file mode 100644 index 0000000000000000000000000000000000000000..a3fc54b990bf95d41f53711124a906b7136c7eb9 --- /dev/null +++ b/interface/ispconfig/interface/mail/list/mail_user.list.php @@ -0,0 +1,78 @@ + "email", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "name", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "autoresponder", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/list/mail_user_filter.list.php b/interface/ispconfig/interface/mail/list/mail_user_filter.list.php new file mode 100644 index 0000000000000000000000000000000000000000..d4c29a57c28518e1bdba7947fd2d20491704fccd --- /dev/null +++ b/interface/ispconfig/interface/mail/list/mail_user_filter.list.php @@ -0,0 +1,60 @@ + "rulename", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/list/mail_user_stats.list.php b/interface/ispconfig/interface/mail/list/mail_user_stats.list.php new file mode 100644 index 0000000000000000000000000000000000000000..f7bc46486fc65fc6b1b5323926e210aa9caa244b --- /dev/null +++ b/interface/ispconfig/interface/mail/list/mail_user_stats.list.php @@ -0,0 +1,60 @@ + "email", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/list/mail_whitelist.list.php b/interface/ispconfig/interface/mail/list/mail_whitelist.list.php new file mode 100644 index 0000000000000000000000000000000000000000..b34d97fdc67f85b39d7a7353339ccbf0a9577e1d --- /dev/null +++ b/interface/ispconfig/interface/mail/list/mail_whitelist.list.php @@ -0,0 +1,94 @@ + "active", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array('y' => "
    Yes
    ", 'n' => "
    No
    ")); + + +$liste["item"][] = array( 'field' => "server_id", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'width' => "", + 'value' => ""); + + +$liste["item"][] = array( 'field' => "source", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "type", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array('recipient' => 'Recipient', 'sender' => 'Sender', 'client' => 'Client')); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/list/spamfilter_blacklist.list.php b/interface/ispconfig/interface/mail/list/spamfilter_blacklist.list.php new file mode 100644 index 0000000000000000000000000000000000000000..d0827844f05ac58d0069cb4beff4dd7ffdb25bf6 --- /dev/null +++ b/interface/ispconfig/interface/mail/list/spamfilter_blacklist.list.php @@ -0,0 +1,108 @@ + "active", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array('y' => "
    Yes
    ", 'n' => "
    No
    ")); + + +$liste["item"][] = array( 'field' => "server_id", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'width' => "", + 'value' => ""); + + +$liste["item"][] = array( 'field' => "priority", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array(1 => 1, 2 => 2, 3 => 3, 4 => 4, 5 => 5, 6 => 6, 7 => 7, 8 => 8, 9 => 9, 10 => 10)); + +$liste["item"][] = array( 'field' => "rid", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT id,email FROM spamfilter_users WHERE {AUTHSQL} ORDER BY email', + 'keyfield'=> 'id', + 'valuefield'=> 'email' + ), + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "email", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/list/spamfilter_config.list.php b/interface/ispconfig/interface/mail/list/spamfilter_config.list.php new file mode 100644 index 0000000000000000000000000000000000000000..8d672ff1f5230816872205ccf577ca0062d53503 --- /dev/null +++ b/interface/ispconfig/interface/mail/list/spamfilter_config.list.php @@ -0,0 +1,60 @@ + "server_name", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/list/spamfilter_policy.list.php b/interface/ispconfig/interface/mail/list/spamfilter_policy.list.php new file mode 100644 index 0000000000000000000000000000000000000000..2b60ff053e014319448ea7b6ba1340633bcd0414 --- /dev/null +++ b/interface/ispconfig/interface/mail/list/spamfilter_policy.list.php @@ -0,0 +1,116 @@ + "policy_name", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + + +$liste["item"][] = array( 'field' => "virus_lover", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array('Y' => "
    Yes
    ", 'N' => "
    No
    ")); + + +$liste["item"][] = array( 'field' => "spam_lover", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array('Y' => "
    Yes
    ", 'N' => "
    No
    ")); + + +$liste["item"][] = array( 'field' => "banned_files_lover", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array('Y' => "
    Yes
    ", 'N' => "
    No
    ")); + + +$liste["item"][] = array( 'field' => "bad_header_lover", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array('Y' => "
    Yes
    ", 'N' => "
    No
    ")); + + + + + + + + + + + + + + + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/list/spamfilter_users.list.php b/interface/ispconfig/interface/mail/list/spamfilter_users.list.php new file mode 100644 index 0000000000000000000000000000000000000000..e088a3bc62eb18dece489ef9c36375bf7774e1fb --- /dev/null +++ b/interface/ispconfig/interface/mail/list/spamfilter_users.list.php @@ -0,0 +1,108 @@ + "local", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array('Y' => "
    Yes
    ", 'N' => "
    No
    ")); + + +$liste["item"][] = array( 'field' => "server_id", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'width' => "", + 'value' => ""); + + +$liste["item"][] = array( 'field' => "priority", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array(1 => 1, 2 => 2, 3 => 3, 4 => 4, 5 => 5, 6 => 6, 7 => 7, 8 => 8, 9 => 9, 10 => 10)); + +$liste["item"][] = array( 'field' => "policy_id", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT id,policy_name FROM spamfilter_policy WHERE {AUTHSQL} ORDER BY policy_name', + 'keyfield'=> 'id', + 'valuefield'=> 'policy_name' + ), + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "fullname", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/list/spamfilter_whitelist.list.php b/interface/ispconfig/interface/mail/list/spamfilter_whitelist.list.php new file mode 100644 index 0000000000000000000000000000000000000000..f765fd89f934d5ed3be004b4b680fcdbe77ea5ed --- /dev/null +++ b/interface/ispconfig/interface/mail/list/spamfilter_whitelist.list.php @@ -0,0 +1,108 @@ + "active", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array('y' => "
    Yes
    ", 'n' => "
    No
    ")); + + +$liste["item"][] = array( 'field' => "server_id", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'width' => "", + 'value' => ""); + + +$liste["item"][] = array( 'field' => "priority", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array(1 => 1, 2 => 2, 3 => 3, 4 => 4, 5 => 5, 6 => 6, 7 => 7, 8 => 8, 9 => 9, 10 => 10)); + +$liste["item"][] = array( 'field' => "rid", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT id,email FROM spamfilter_users WHERE {AUTHSQL} ORDER BY email', + 'keyfield'=> 'id', + 'valuefield'=> 'email' + ), + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "email", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/mail_alias_del.php b/interface/ispconfig/interface/mail/mail_alias_del.php new file mode 100644 index 0000000000000000000000000000000000000000..4d4c5b2bfbd89fbffdb0562a4ffaec989e80165f --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_alias_del.php @@ -0,0 +1,51 @@ +auth->check_module_permissions('mail'); + +$app->uses("tform_actions"); +$app->tform_actions->onDelete(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/mail_alias_edit.php b/interface/ispconfig/interface/mail/mail_alias_edit.php new file mode 100644 index 0000000000000000000000000000000000000000..d031d29f27fa762474ec1bb96f13854eca6fd5bb --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_alias_edit.php @@ -0,0 +1,145 @@ +auth->check_module_permissions('mail'); + +// Loading classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onShowNew() { + global $app, $conf; + + // we will check only users, not admins + if($_SESSION["s"]["user"]["typ"] == 'user') { + if(!$app->tform->checkClientLimit('limit_mailalias',"type = 'alias'")) { + $app->error($app->tform->wordbook["limit_mailalias_txt"]); + } + if(!$app->tform->checkResellerLimit('limit_mailalias',"type = 'alias'")) { + $app->error('Reseller: '.$app->tform->wordbook["limit_mailalias_txt"]); + } + } + + parent::onShowNew(); + } + + function onShowEnd() { + global $app, $conf; + + $email = $this->dataRecord["source"]; + $email_parts = explode("@",$email); + $app->tpl->setVar("email_local_part",$email_parts[0]); + + // Getting Domains of the user + $sql = "SELECT domain FROM mail_domain WHERE ".$app->tform->getAuthSQL('r').' ORDER BY domain'; + $domains = $app->db->queryAllRecords($sql); + $domain_select = ''; + if(is_array($domains)) { + foreach( $domains as $domain) { + $selected = ($domain["domain"] == @$email_parts[1])?'SELECTED':''; + $domain_select .= "\r\n"; + } + } + $app->tpl->setVar("email_domain",$domain_select); + + parent::onShowEnd(); + } + + function onSubmit() { + global $app, $conf; + + // Check if Domain belongs to user + $domain = $app->db->queryOneRecord("SELECT server_id, domain FROM mail_domain WHERE domain = '".$app->db->quote($_POST["email_domain"])."' AND ".$app->tform->getAuthSQL('r')); + if($domain["domain"] != $_POST["email_domain"]) $app->tform->errorMessage .= $app->tform->wordbook["no_domain_perm"]; + + // Check the client limits, if user is not the admin + if($_SESSION["s"]["user"]["typ"] != 'admin') { // if user is not admin + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_mailalias FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Check if the user may add another mailbox. + if($this->id == 0 && $client["limit_mailalias"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(forwarding_id) as number FROM mail_forwarding WHERE sys_groupid = $client_group_id AND type = 'alias'"); + if($tmp["number"] >= $client["limit_mailalias"]) { + $app->tform->errorMessage .= $app->tform->wordbook["limit_mailalias_txt"]."
    "; + } + unset($tmp); + } + } // end if user is not admin + + + // compose the email field + $this->dataRecord["source"] = $_POST["email_local_part"]."@".$_POST["email_domain"]; + // Set the server id of the mailbox = server ID of mail domain. + $this->dataRecord["server_id"] = $domain["server_id"]; + + unset($this->dataRecord["email_local_part"]); + unset($this->dataRecord["email_domain"]); + + //* Check if there is no active mailbox with this address + $tmp = $app->db->queryOneRecord("SELECT count(mailuser_id) as number FROM mail_user WHERE postfix = 'y' AND email = '".$app->db->quote($this->dataRecord["source"])."'"); + if($tmp['number'] > 0) $app->tform->errorMessage .= $app->tform->lng("duplicate_mailbox_txt")."
    "; + unset($tmp); + + parent::onSubmit(); + } + + function onAfterInsert() { + global $app; + + $domain = $app->db->queryOneRecord("SELECT sys_groupid FROM mail_domain WHERE domain = '".$app->db->quote($_POST["email_domain"])."' AND ".$app->tform->getAuthSQL('r')); + $app->db->query("update mail_forwarding SET sys_groupid = ".$domain['sys_groupid']." WHERE forwarding_id = ".$this->id); + + } + + +} + +$page = new page_action; +$page->onLoad(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/mail_alias_list.php b/interface/ispconfig/interface/mail/mail_alias_list.php new file mode 100644 index 0000000000000000000000000000000000000000..f4a3d7cefb215d26fee1f3f0ca611561734e97ea --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_alias_list.php @@ -0,0 +1,26 @@ +auth->check_module_permissions('mail'); + +$app->uses('listform_actions'); + +// Limit the results to alias domains +$app->listform_actions->SQLExtWhere = "type = 'alias'"; + +$app->listform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/mail_aliasdomain_del.php b/interface/ispconfig/interface/mail/mail_aliasdomain_del.php new file mode 100644 index 0000000000000000000000000000000000000000..52a54a1cc6c63a45d3b27c540e0008986fefe1fd --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_aliasdomain_del.php @@ -0,0 +1,51 @@ +auth->check_module_permissions('mail'); + +$app->uses("tform_actions"); +$app->tform_actions->onDelete(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/mail_aliasdomain_edit.php b/interface/ispconfig/interface/mail/mail_aliasdomain_edit.php new file mode 100644 index 0000000000000000000000000000000000000000..91fbf930aa5179001864e4586cee79c7263ff088 --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_aliasdomain_edit.php @@ -0,0 +1,141 @@ +auth->check_module_permissions('mail'); + +// Loading classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onShowNew() { + global $app, $conf; + + // we will check only users, not admins + if($_SESSION["s"]["user"]["typ"] == 'user') { + if(!$app->tform->checkClientLimit('limit_mailaliasdomain',"type = 'aliasdomain'")) { + $app->error($app->tform->wordbook["limit_mailaliasdomain_txt"]); + } + if(!$app->tform->checkResellerLimit('limit_mailaliasdomain',"type = 'aliasdomain'")) { + $app->error('Reseller: '.$app->tform->wordbook["limit_mailaliasdomain_txt"]); + } + } + + parent::onShowNew(); + } + + function onShowEnd() { + global $app, $conf; + + $source_domain = substr($this->dataRecord["source"],1); + $destination_domain = substr($this->dataRecord["destination"],1); + + // Getting Domains of the user + $sql = "SELECT domain FROM mail_domain WHERE ".$app->tform->getAuthSQL('r').' ORDER BY domain'; + $domains = $app->db->queryAllRecords($sql); + + $source_select = ''; + $destination_select = ''; + if(is_array($domains)) { + foreach( $domains as $domain) { + $selected = ($domain["domain"] == @$source_domain)?'SELECTED':''; + $source_select .= "\r\n"; + $selected = ($domain["domain"] == @$destination_domain)?'SELECTED':''; + $destination_select .= "\r\n"; + } + } + $app->tpl->setVar("source_domain",$source_select); + $app->tpl->setVar("destination_domain",$destination_select); + + parent::onShowEnd(); + } + + function onSubmit() { + global $app, $conf; + + // Check if source Domain belongs to user + $domain = $app->db->queryOneRecord("SELECT server_id, domain FROM mail_domain WHERE domain = '".$app->db->quote($_POST["source"])."' AND ".$app->tform->getAuthSQL('r')); + if($domain["domain"] != $_POST["source"]) $app->tform->errorMessage .= $app->tform->wordbook["no_domain_perm"]; + + // Check if the destination domain belongs to the user + $domain = $app->db->queryOneRecord("SELECT server_id, domain FROM mail_domain WHERE domain = '".$app->db->quote($_POST["destination"])."' AND ".$app->tform->getAuthSQL('r')); + if($domain["domain"] != $_POST["destination"]) $app->tform->errorMessage .= $app->tform->wordbook["no_domain_perm"]; + + // Check the client limits, if user is not the admin + if($_SESSION["s"]["user"]["typ"] != 'admin') { // if user is not admin + if(!$app->tform->checkClientLimit('limit_mailaliasdomain',"type = 'aliasdomain'")) { + $app->error($app->tform->wordbook["limit_mailaliasdomain_txt"]); + } + if(!$app->tform->checkResellerLimit('limit_mailaliasdomain',"type = 'aliasdomain'")) { + $app->error('Reseller: '.$app->tform->wordbook["limit_mailaliasdomain_txt"]); + } + } // end if user is not admin + + if($this->dataRecord["source"] == $this->dataRecord["destination"]) $app->tform->errorMessage .= $app->tform->wordbook["source_destination_identical_txt"]; + + // compose the source and destination field + $this->dataRecord["source"] = "@".$app->db->quote($this->dataRecord["source"]); + $this->dataRecord["destination"] = "@".$app->db->quote($this->dataRecord["destination"]); + // Set the server id of the mailbox = server ID of mail domain. + $this->dataRecord["server_id"] = $domain["server_id"]; + + parent::onSubmit(); + } + + function onAfterInsert() { + global $app; + + $domain = $app->db->queryOneRecord("SELECT sys_groupid FROM mail_domain WHERE domain = '".$app->db->quote($_POST["destination"])."' AND ".$app->tform->getAuthSQL('r')); + $app->db->query("update mail_forwarding SET sys_groupid = ".$domain['sys_groupid']." WHERE forwarding_id = ".$this->id); + + } + + +} + +$page = new page_action; +$page->onLoad(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/mail_aliasdomain_list.php b/interface/ispconfig/interface/mail/mail_aliasdomain_list.php new file mode 100644 index 0000000000000000000000000000000000000000..2725d4553778348afe87f813106735a47946edd6 --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_aliasdomain_list.php @@ -0,0 +1,26 @@ +auth->check_module_permissions('mail'); + +$app->uses('listform_actions'); + +// Limit the results to alias domains +$app->listform_actions->SQLExtWhere = "type = 'aliasdomain'"; + +$app->listform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/mail_blacklist_del.php b/interface/ispconfig/interface/mail/mail_blacklist_del.php new file mode 100644 index 0000000000000000000000000000000000000000..b11d70d056579f57766bd49a7428f206e6951169 --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_blacklist_del.php @@ -0,0 +1,51 @@ +auth->check_module_permissions('mail'); + +$app->uses("tform_actions"); +$app->tform_actions->onDelete(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/mail_blacklist_edit.php b/interface/ispconfig/interface/mail/mail_blacklist_edit.php new file mode 100644 index 0000000000000000000000000000000000000000..b0ac8c8be6e78fdcba98578b9fe57fd38a060fc2 --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_blacklist_edit.php @@ -0,0 +1,114 @@ +auth->check_module_permissions('mail'); + +// Loading classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onShowNew() { + global $app, $conf; + + // we will check only users, not admins + if($_SESSION["s"]["user"]["typ"] == 'user') { + if(!$app->tform->checkClientLimit('limit_mailfilter')) { + $app->error($app->tform->wordbook["limit_mailfilter_txt"]); + } + if(!$app->tform->checkResellerLimit('limit_mailfilter')) { + $app->error('Reseller: '.$app->tform->wordbook["limit_mailfilter_txt"]); + } + } + + parent::onShowNew(); + } + + + function onBeforeUpdate() { + global $app, $conf; + + //* Check if the server has been changed + // We do this only for the admin or reseller users, as normal clients can not change the server ID anyway + if($_SESSION["s"]["user"]["typ"] == 'admin' || $app->auth->has_clients($_SESSION['s']['user']['userid'])) { + $rec = $app->db->queryOneRecord("SELECT server_id from mail_access WHERE access_id = ".$this->id); + if($rec['server_id'] != $this->dataRecord["server_id"]) { + //* Add a error message and switch back to old server + $app->tform->errorMessage .= $app->lng('The Server can not be changed.'); + $this->dataRecord["server_id"] = $rec['server_id']; + } + unset($rec); + } + } + + function onSubmit() { + global $app, $conf; + + // Check the client limits, if user is not the admin + if($_SESSION["s"]["user"]["typ"] != 'admin') { // if user is not admin + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_mailfilter FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Check if the user may add another mailbox. + if($this->id == 0 && $client["limit_mailfilter"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(access_id) as number FROM mail_access WHERE sys_groupid = $client_group_id"); + if($tmp["number"] >= $client["limit_mailfilter"]) { + $app->tform->errorMessage .= $app->tform->wordbook["limit_mailfilter_txt"]."
    "; + } + unset($tmp); + } + } // end if user is not admin + + parent::onSubmit(); + } + +} + +$app->tform_actions = new page_action; +$app->tform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/mail_blacklist_list.php b/interface/ispconfig/interface/mail/mail_blacklist_list.php new file mode 100644 index 0000000000000000000000000000000000000000..7e144758b508284d6749bfd1a54d16cb8293ee51 --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_blacklist_list.php @@ -0,0 +1,24 @@ +auth->check_module_permissions('mail'); + +$app->uses('listform_actions'); +$app->listform_actions->SQLExtWhere = "access = 'REJECT'"; + +$app->listform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/mail_content_filter_del.php b/interface/ispconfig/interface/mail/mail_content_filter_del.php new file mode 100644 index 0000000000000000000000000000000000000000..872658997fc0986b4d17eef61b3ed26e8206b6e7 --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_content_filter_del.php @@ -0,0 +1,51 @@ +auth->check_module_permissions('mail'); + +$app->uses("tform_actions"); +$app->tform_actions->onDelete(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/mail_content_filter_edit.php b/interface/ispconfig/interface/mail/mail_content_filter_edit.php new file mode 100644 index 0000000000000000000000000000000000000000..d2cd61850ce81cdc448a934b5a23792dfdd61149 --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_content_filter_edit.php @@ -0,0 +1,75 @@ +auth->check_module_permissions('mail'); + +if(!$_SESSION["s"]["user"]["typ"] == 'admin') die('These Filters are only for Admins.'); + + +// Loading classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + function onBeforeUpdate() { + global $app, $conf; + + //* Check if the server has been changed + // We do this only for the admin or reseller users, as normal clients can not change the server ID anyway + if($_SESSION["s"]["user"]["typ"] == 'admin' || $app->auth->has_clients($_SESSION['s']['user']['userid'])) { + $rec = $app->db->queryOneRecord("SELECT server_id from mail_content_filter WHERE content_filter_id = ".$this->id); + if($rec['server_id'] != $this->dataRecord["server_id"]) { + //* Add a error message and switch back to old server + $app->tform->errorMessage .= $app->lng('The Server can not be changed.'); + $this->dataRecord["server_id"] = $rec['server_id']; + } + unset($rec); + } + } +} + +$page = new page_action; +$page->onLoad(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/mail_content_filter_list.php b/interface/ispconfig/interface/mail/mail_content_filter_list.php new file mode 100644 index 0000000000000000000000000000000000000000..aa47d9d405dfee241ca808c3e854a1b0e38d6685 --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_content_filter_list.php @@ -0,0 +1,26 @@ +auth->check_module_permissions('mail'); + +$app->uses('listform_actions'); + +// Limit the results to alias domains +// $app->listform_actions->SQLExtWhere = "type = 'local'"; + +$app->listform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/mail_domain_catchall_del.php b/interface/ispconfig/interface/mail/mail_domain_catchall_del.php new file mode 100644 index 0000000000000000000000000000000000000000..2560facdd911ba3953a3c69ebf2f7164077782e1 --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_domain_catchall_del.php @@ -0,0 +1,51 @@ +auth->check_module_permissions('mail'); + +$app->uses("tform_actions"); +$app->tform_actions->onDelete(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/mail_domain_catchall_edit.php b/interface/ispconfig/interface/mail/mail_domain_catchall_edit.php new file mode 100644 index 0000000000000000000000000000000000000000..219926e3c5e04366f41e5b26a9f615b2d2f3eaa8 --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_domain_catchall_edit.php @@ -0,0 +1,138 @@ +auth->check_module_permissions('mail'); + +// Loading classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onShowNew() { + global $app, $conf; + + // we will check only users, not admins + if($_SESSION["s"]["user"]["typ"] == 'user') { + if(!$app->tform->checkClientLimit('limit_mailcatchall',"type = 'catchall'")) { + $app->error($app->tform->wordbook["limit_mailcatchall_txt"]); + } + if(!$app->tform->checkResellerLimit('limit_mailcatchall',"type = 'catchall'")) { + $app->error('Reseller: '.$app->tform->wordbook["limit_mailcatchall_txt"]); + } + } + + parent::onShowNew(); + } + + function onShowEnd() { + global $app, $conf; + + $email = $this->dataRecord["source"]; + $email_parts = explode("@",$email); + $app->tpl->setVar("email_local_part",$email_parts[0]); + + // Getting Domains of the user + $sql = "SELECT domain FROM mail_domain WHERE ".$app->tform->getAuthSQL('r'); + $domains = $app->db->queryAllRecords($sql); + $domain_select = ''; + if(is_array($domains)) { + foreach( $domains as $domain) { + $selected = (isset($email_parts[1]) && $domain["domain"] == $email_parts[1])?'SELECTED':''; + $domain_select .= "\r\n"; + } + } + $app->tpl->setVar("email_domain",$domain_select); + + parent::onShowEnd(); + } + + function onSubmit() { + global $app, $conf; + + // Check if Domain belongs to user + $domain = $app->db->queryOneRecord("SELECT server_id, domain FROM mail_domain WHERE domain = '".$app->db->quote($_POST["email_domain"])."' AND ".$app->tform->getAuthSQL('r')); + if($domain["domain"] != $_POST["email_domain"]) $app->tform->errorMessage .= $app->tform->wordbook["no_domain_perm"]; + + // Check the client limits, if user is not the admin + if($_SESSION["s"]["user"]["typ"] != 'admin') { // if user is not admin + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_mailcatchall FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Check if the user may add another catchall + if($this->id == 0 && $client["limit_mailcatchall"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(forwarding_id) as number FROM mail_forwarding WHERE sys_groupid = $client_group_id AND type = 'catchall'"); + if($tmp["number"] >= $client["limit_mailcatchall"]) { + $app->tform->errorMessage .= $app->tform->wordbook["limit_mailcatchall_txt"]."
    "; + } + unset($tmp); + } + } // end if user is not admin + + // compose the email field + $this->dataRecord["source"] = "@".$_POST["email_domain"]; + // Set the server id of the mailbox = server ID of mail domain. + $this->dataRecord["server_id"] = $domain["server_id"]; + + //unset($this->dataRecord["email_local_part"]); + unset($this->dataRecord["email_domain"]); + + parent::onSubmit(); + } + + function onAfterInsert() { + global $app; + + $domain = $app->db->queryOneRecord("SELECT sys_groupid FROM mail_domain WHERE domain = '".$app->db->quote($_POST["email_domain"])."' AND ".$app->tform->getAuthSQL('r')); + $app->db->query("update mail_forwarding SET sys_groupid = ".$domain['sys_groupid']." WHERE forwarding_id = ".$this->id); + + } + +} + +$page = new page_action; +$page->onLoad(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/mail_domain_catchall_list.php b/interface/ispconfig/interface/mail/mail_domain_catchall_list.php new file mode 100644 index 0000000000000000000000000000000000000000..f698668b72289f5013e1b804ca8a3cb20abda44a --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_domain_catchall_list.php @@ -0,0 +1,26 @@ +auth->check_module_permissions('mail'); + +$app->uses('listform_actions'); + +// Limit the results to alias domains +$app->listform_actions->SQLExtWhere = "type = 'catchall'"; + +$app->listform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/mail_domain_del.php b/interface/ispconfig/interface/mail/mail_domain_del.php new file mode 100644 index 0000000000000000000000000000000000000000..9713642dc2feded8055c2e249dd5ac50b14b053b --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_domain_del.php @@ -0,0 +1,92 @@ +auth->check_module_permissions('mail'); + +// Loading classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onBeforeDelete() { + global $app; $conf; + + $domain = $this->dataRecord['domain']; + + // Before we delete the email domain, + // we will delete all depending records. + + // Delete all forwardings where the osurce or destination belongs to this domain + $records = $app->db->queryAllRecords("SELECT forwarding_id as id FROM mail_forwarding WHERE source like '%@".$app->db->quote($domain)."' OR destination like '%@".$app->db->quote($domain)."'"); + foreach($records as $rec) { + $app->db->datalogDelete('mail_forwarding','forwarding_id',$rec['id']); + } + + // Delete all fetchmail accounts where destination belongs to this domain + $records = $app->db->queryAllRecords("SELECT mailget_id as id FROM mail_get WHERE destination like '%@".$app->db->quote($domain)."'"); + foreach($records as $rec) { + $app->db->datalogDelete('mail_get','mailget_id',$rec['id']); + } + + // Delete all mailboxes where destination belongs to this domain + $records = $app->db->queryAllRecords("SELECT mailuser_id as id FROM mail_user WHERE email like '%@".$app->db->quote($domain)."'"); + foreach($records as $rec) { + $app->db->datalogDelete('mail_user','mailuser_id',$rec['id']); + } + + // Delete all spamfilters that belong to this domain + $records = $app->db->queryAllRecords("SELECT id FROM spamfilter_users WHERE email = '@".$app->db->quote($domain)."'"); + foreach($records as $rec) { + $app->db->datalogDelete('spamfilter_users','id',$rec['id']); + } + + } +} + +$page = new page_action; +$page->onDelete(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/mail_domain_edit.php b/interface/ispconfig/interface/mail/mail_domain_edit.php new file mode 100644 index 0000000000000000000000000000000000000000..7acf67367e9f75d80edb06c58def8f440e26fff9 --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_domain_edit.php @@ -0,0 +1,327 @@ +auth->check_module_permissions('mail'); + +// Loading classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onShowNew() { + global $app, $conf; + + // we will check only users, not admins + if($_SESSION["s"]["user"]["typ"] == 'user') { + if(!$app->tform->checkClientLimit('limit_maildomain')) { + $app->error($app->tform->wordbook["limit_maildomain_txt"]); + } + if(!$app->tform->checkResellerLimit('limit_maildomain')) { + $app->error('Reseller: '.$app->tform->wordbook["limit_maildomain_txt"]); + } + } + + parent::onShowNew(); + } + + function onShowEnd() { + global $app, $conf; + + if($_SESSION["s"]["user"]["typ"] == 'admin') { + // Getting Clients of the user + if($_SESSION["s"]["user"]["typ"] == 'admin') { + $sql = "SELECT groupid, name FROM sys_group WHERE client_id > 0 ORDER BY name"; + } else { + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $sql = "SELECT client.client_id, limit_web_domain, default_webserver FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"; + } + $clients = $app->db->queryAllRecords($sql); + $client_select = ''; + if($_SESSION["s"]["user"]["typ"] == 'admin') $client_select .= ""; + $tmp_data_record = $app->tform->getDataRecord($this->id); + if(is_array($clients)) { + foreach( $clients as $client) { + $selected = ($client["groupid"] == $tmp_data_record["sys_groupid"])?'SELECTED':''; + $client_select .= "\r\n"; + } + } + $app->tpl->setVar("client_group_id",$client_select); + + } elseif ($_SESSION["s"]["user"]["typ"] != 'admin' && $app->auth->has_clients($_SESSION['s']['user']['userid'])) { + + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT client.client_id, contact_name FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id order by contact_name"); + + // Set the webserver to the default server of the client + $tmp = $app->db->queryOneRecord("SELECT server_name FROM server WHERE server_id = $client[default_webserver]"); + $app->tpl->setVar("server_id",""); + unset($tmp); + + // Fill the client select field + $sql = "SELECT groupid, name FROM sys_group, client WHERE sys_group.client_id = client.client_id AND client.parent_client_id = ".$client['client_id']; + $clients = $app->db->queryAllRecords($sql); + $tmp = $app->db->queryOneRecord("SELECT groupid FROM sys_group WHERE client_id = ".$client['client_id']); + $client_select = ''; + $tmp_data_record = $app->tform->getDataRecord($this->id); + if(is_array($clients)) { + foreach( $clients as $client) { + $selected = @($client["groupid"] == $tmp_data_record["sys_groupid"])?'SELECTED':''; + $client_select .= "\r\n"; + } + } + $app->tpl->setVar("client_group_id",$client_select); + + } + + + + + // Get the spamfilter policys for the user + $tmp_user = $app->db->queryOneRecord("SELECT policy_id FROM spamfilter_users WHERE email = '@".$this->dataRecord["domain"]."'"); + $sql = "SELECT id, policy_name FROM spamfilter_policy WHERE ".$app->tform->getAuthSQL('r'); + $policys = $app->db->queryAllRecords($sql); + $policy_select = ""; + if(is_array($policys)) { + foreach( $policys as $p) { + $selected = ($p["id"] == $tmp_user["policy_id"])?'SELECTED':''; + $policy_select .= "\r\n"; + } + } + $app->tpl->setVar("policy",$policy_select); + unset($policys); + unset($policy_select); + unset($tmp_user); + + if($this->id > 0) { + //* we are editing a existing record + $app->tpl->setVar("edit_disabled", 1); + $app->tpl->setVar("server_id_value", $this->dataRecord["server_id"]); + } else { + $app->tpl->setVar("edit_disabled", 0); + } + + parent::onShowEnd(); + } + + function onSubmit() { + global $app, $conf; + if($_SESSION["s"]["user"]["typ"] != 'admin') { + + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_maildomain, default_mailserver FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // When the record is updated + if($this->id > 0) { + // restore the server ID if the user is not admin and record is edited + $tmp = $app->db->queryOneRecord("SELECT server_id FROM mail_domain WHERE domain_id = ".intval($this->id)); + $this->dataRecord["server_id"] = $tmp["server_id"]; + unset($tmp); + // When the record is inserted + } else { + // set the server ID to the default mailserver of the client + $this->dataRecord["server_id"] = $client["default_mailserver"]; + + // Check if the user may add another mail_domain + if($client["limit_maildomain"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(domain_id) as number FROM mail_domain WHERE sys_groupid = $client_group_id"); + if($tmp["number"] >= $client["limit_maildomain"]) { + $app->error($app->tform->wordbook["limit_maildomain_txt"]); + } + } + } + + // Clients may not set the client_group_id, so we unset them if user is not a admin + if(!$app->auth->has_clients($_SESSION['s']['user']['userid'])) unset($this->dataRecord["client_group_id"]); + } + + //* make sure that the email domain is lowercase + if(isset($this->dataRecord["domain"])) $this->dataRecord["domain"] = strtolower($this->dataRecord["domain"]); + + + parent::onSubmit(); + } + + function onAfterInsert() { + global $app, $conf; + + // make sure that the record belongs to the client group and not the admin group when a dmin inserts it + // also make sure that the user can not delete domain created by a admin + if($_SESSION["s"]["user"]["typ"] == 'admin' && isset($this->dataRecord["client_group_id"])) { + $client_group_id = intval($this->dataRecord["client_group_id"]); + $app->db->query("UPDATE mail_domain SET sys_groupid = $client_group_id, sys_perm_group = 'ru' WHERE domain_id = ".$this->id); + } + if($app->auth->has_clients($_SESSION['s']['user']['userid']) && isset($this->dataRecord["client_group_id"])) { + $client_group_id = intval($this->dataRecord["client_group_id"]); + $app->db->query("UPDATE mail_domain SET sys_groupid = $client_group_id, sys_perm_group = 'riud' WHERE domain_id = ".$this->id); + } + + // Spamfilter policy + $policy_id = intval($this->dataRecord["policy"]); + if($policy_id > 0) { + $tmp_user = $app->db->queryOneRecord("SELECT id FROM spamfilter_users WHERE email = '@".mysql_real_escape_string($this->dataRecord["domain"])."'"); + if($tmp_user["id"] > 0) { + // There is already a record that we will update + $app->db->datalogUpdate('spamfilter_users', "policy_id = $ploicy_id", 'id', $tmp_user["id"]); + } else { + $tmp_domain = $app->db->queryOneRecord("SELECT sys_groupid FROM mail_domain WHERE domain_id = ".$this->id); + // We create a new record + $insert_data = "(`sys_userid`, `sys_groupid`, `sys_perm_user`, `sys_perm_group`, `sys_perm_other`, `server_id`, `priority`, `policy_id`, `email`, `fullname`, `local`) + VALUES (".$_SESSION["s"]["user"]["userid"].", ".$tmp_domain["sys_groupid"].", 'riud', 'riud', '', ".$this->dataRecord["server_id"].", 5, ".$policy_id.", '@".mysql_real_escape_string($this->dataRecord["domain"])."', '@".mysql_real_escape_string($this->dataRecord["domain"])."', 'Y')"; + $app->db->datalogInsert('spamfilter_users', $insert_data, 'id'); + unset($tmp_domain); + } + } // endif spamfilter policy + } + + function onBeforeUpdate() { + global $app, $conf; + + //* Check if the server has been changed + // We do this only for the admin or reseller users, as normal clients can not change the server ID anyway + if($_SESSION["s"]["user"]["typ"] == 'admin' || $app->auth->has_clients($_SESSION['s']['user']['userid'])) { + $rec = $app->db->queryOneRecord("SELECT server_id, domain from mail_domain WHERE domain_id = ".$this->id); + if($rec['server_id'] != $this->dataRecord["server_id"]) { + //* Add a error message and switch back to old server + $app->tform->errorMessage .= $app->lng('The Server can not be changed.'); + $this->dataRecord["server_id"] = $rec['server_id']; + } + unset($rec); + //* If the user is neither admin nor reseller + } else { + //* We do not allow users to change a domain which has been created by the admin + $rec = $app->db->queryOneRecord("SELECT domain from mail_domain WHERE domain_id = ".$this->id); + if($rec['domain'] != $this->dataRecord["domain"] && $app->tform->checkPerm($this->id,'u')) { + //* Add a error message and switch back to old server + $app->tform->errorMessage .= $app->lng('The Domain can not be changed. Please ask your Administrator if you want to change the domain name.'); + $this->dataRecord["domain"] = $rec['domain']; + } + unset($rec); + } + } + + + + function onAfterUpdate() { + global $app, $conf; + + // make sure that the record belongs to the clinet group and not the admin group when admin inserts it + // also make sure that the user can not delete domain created by a admin + if($_SESSION["s"]["user"]["typ"] == 'admin' && isset($this->dataRecord["client_group_id"])) { + $client_group_id = intval($this->dataRecord["client_group_id"]); + $app->db->query("UPDATE mail_domain SET sys_groupid = $client_group_id, sys_perm_group = 'ru' WHERE domain_id = ".$this->id); + } + if($app->auth->has_clients($_SESSION['s']['user']['userid']) && isset($this->dataRecord["client_group_id"])) { + $client_group_id = intval($this->dataRecord["client_group_id"]); + $app->db->query("UPDATE mail_domain SET sys_groupid = $client_group_id, sys_perm_group = 'riud' WHERE domain_id = ".$this->id); + } + + // Spamfilter policy + $policy_id = intval($this->dataRecord["policy"]); + $tmp_user = $app->db->queryOneRecord("SELECT id FROM spamfilter_users WHERE email = '@".mysql_real_escape_string($this->dataRecord["domain"])."'"); + if($policy_id > 0) { + if($tmp_user["id"] > 0) { + // There is already a record that we will update + $app->db->datalogUpdate('spamfilter_users', "policy_id = $policy_id", 'id', $tmp_user["id"]); + } else { + $tmp_domain = $app->db->queryOneRecord("SELECT sys_groupid FROM mail_domain WHERE domain_id = ".$this->id); + // We create a new record + $insert_data = "(`sys_userid`, `sys_groupid`, `sys_perm_user`, `sys_perm_group`, `sys_perm_other`, `server_id`, `priority`, `policy_id`, `email`, `fullname`, `local`) + VALUES (".$_SESSION["s"]["user"]["userid"].", ".$tmp_domain["sys_groupid"].", 'riud', 'riud', '', ".$this->dataRecord["server_id"].", 5, ".$policy_id.", '@".mysql_real_escape_string($this->dataRecord["domain"])."', '@".mysql_real_escape_string($this->dataRecord["domain"])."', 'Y')"; + $app->db->datalogInsert('spamfilter_users', $insert_data, 'id'); + unset($tmp_domain); + } + } else { + if($tmp_user["id"] > 0) { + // There is already a record but the user shall have no policy, so we delete it + $app->db->datalogDelete('spamfilter_users', 'id', $tmp_user["id"]); + } + } // endif spamfilter policy + //** If the domain name or owner has been changed, change the domain and owner in all mailbox records + if($this->oldDataRecord['domain'] != $this->dataRecord['domain'] || (isset($this->dataRecord['client_group_id']) && $this->oldDataRecord['sys_groupid'] != $this->dataRecord['client_group_id'])) { + $app->uses('getconf'); + $mail_config = $app->getconf->get_server_config($this->dataRecord["server_id"],'mail'); + + //* Update the mailboxes + $mailusers = $app->db->queryAllRecords("SELECT * FROM mail_user WHERE email like '%@".mysql_real_escape_string($this->oldDataRecord['domain'])."'"); + $sys_groupid = (isset($this->dataRecord['client_group_id']))?$this->dataRecord['client_group_id']:$this->oldDataRecord['sys_groupid']; + if(is_array($mailusers)) { + foreach($mailusers as $rec) { + // setting Maildir, Homedir, UID and GID + $mail_parts = explode("@",$rec['email']); + $maildir = str_replace("[domain]",$this->dataRecord['domain'],$mail_config["maildir_path"]); + $maildir = str_replace("[localpart]",$mail_parts[0],$maildir); + $maildir = mysql_real_escape_string($maildir); + $email = mysql_real_escape_string($mail_parts[0].'@'.$this->dataRecord['domain']); + $app->db->datalogUpdate('mail_user', "maildir = '$maildir', email = '$email', sys_groupid = '$sys_groupid'", 'mailuser_id', $rec['mailuser_id']); + } + } + + //* Update the aliases + $forwardings = $app->db->queryAllRecords("SELECT * FROM mail_forwarding WHERE source like '%@".mysql_real_escape_string($this->oldDataRecord['domain'])."' OR destination like '%@".mysql_real_escape_string($this->oldDataRecord['domain'])."'"); + if(is_array($forwardings)) { + foreach($forwardings as $rec) { + $destination = mysql_real_escape_string(str_replace($this->oldDataRecord['domain'],$this->dataRecord['domain'],$rec['destination'])); + $source = mysql_real_escape_string(str_replace($this->oldDataRecord['domain'],$this->dataRecord['domain'],$rec['source'])); + $app->db->datalogUpdate('mail_forwarding', "source = '$source', destination = '$destination', sys_groupid = '$sys_groupid'", 'forwarding_id', $rec['forwarding_id']); + } + } + + //* Delete the old spamfilter record + $tmp = $app->db->queryOneRecord("SELECT id FROM spamfilter_users WHERE email = '@".mysql_real_escape_string($this->oldDataRecord["domain"])."'"); + $app->db->datalogDelete('spamfilter_users', 'id', $tmp["id"]); + unset($tmp); + + } // end if domain name changed + + } + +} + +$page = new page_action; +$page->onLoad(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/mail_domain_list.php b/interface/ispconfig/interface/mail/mail_domain_list.php new file mode 100644 index 0000000000000000000000000000000000000000..0d26bd917d64eccb66373ab7292515f9a72fdd78 --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_domain_list.php @@ -0,0 +1,27 @@ +auth->check_module_permissions('mail'); + +$app->uses('listform_actions'); + +// Limit the results to alias domains +// $app->listform_actions->SQLExtWhere = "type = 'local'"; + +$app->listform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/mail_forward_del.php b/interface/ispconfig/interface/mail/mail_forward_del.php new file mode 100644 index 0000000000000000000000000000000000000000..9fc76db421a8c068ab23bf2ee1b1b19def26ece9 --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_forward_del.php @@ -0,0 +1,51 @@ +auth->check_module_permissions('mail'); + +$app->uses("tform_actions"); +$app->tform_actions->onDelete(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/mail_forward_edit.php b/interface/ispconfig/interface/mail/mail_forward_edit.php new file mode 100644 index 0000000000000000000000000000000000000000..0fef7a506032f22187da6eaf041998f1f00702d7 --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_forward_edit.php @@ -0,0 +1,141 @@ +auth->check_module_permissions('mail'); + +// Loading classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onShowNew() { + global $app, $conf; + + // we will check only users, not admins + if($_SESSION["s"]["user"]["typ"] == 'user') { + if(!$app->tform->checkClientLimit('limit_mailforward',"type = 'forward'")) { + $app->error($app->tform->wordbook["limit_mailforward_txt"]); + } + if(!$app->tform->checkResellerLimit('limit_mailforward',"type = 'forward'")) { + $app->error('Reseller: '.$app->tform->wordbook["limit_mailforward_txt"]); + } + } + + parent::onShowNew(); + } + + function onShowEnd() { + global $app, $conf; + + $email = $this->dataRecord["source"]; + $email_parts = explode("@",$email); + $app->tpl->setVar("email_local_part",$email_parts[0]); + + // Getting Domains of the user + $sql = "SELECT domain FROM mail_domain WHERE ".$app->tform->getAuthSQL('r').' ORDER BY domain'; + $domains = $app->db->queryAllRecords($sql); + $domain_select = ''; + foreach( $domains as $domain) { + $selected = (isset($email_parts[1]) && $domain["domain"] == $email_parts[1])?'SELECTED':''; + $domain_select .= "\r\n"; + } + $app->tpl->setVar("email_domain",$domain_select); + + parent::onShowEnd(); + } + + function onSubmit() { + global $app, $conf; + + // Check if Domain belongs to user + $domain = $app->db->queryOneRecord("SELECT server_id, domain FROM mail_domain WHERE domain = '".$app->db->quote($_POST["email_domain"])."' AND ".$app->tform->getAuthSQL('r')); + if($domain["domain"] != $_POST["email_domain"]) $app->tform->errorMessage .= $app->tform->wordbook["no_domain_perm"]; + + // Check the client limits, if user is not the admin + if($_SESSION["s"]["user"]["typ"] != 'admin') { // if user is not admin + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_mailforward FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Check if the user may add another mailbox. + if($this->id == 0 && $client["limit_mailforward"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(forwarding_id) as number FROM mail_forwarding WHERE sys_groupid = $client_group_id AND type = 'forward'"); + if($tmp["number"] >= $client["limit_mailforward"]) { + $app->tform->errorMessage .= $app->tform->wordbook["limit_mailforward_txt"]."
    "; + } + unset($tmp); + } + } // end if user is not admin + + // compose the email field + $this->dataRecord["source"] = $_POST["email_local_part"]."@".$_POST["email_domain"]; + // Set the server id of the mailbox = server ID of mail domain. + $this->dataRecord["server_id"] = $domain["server_id"]; + + unset($this->dataRecord["email_local_part"]); + unset($this->dataRecord["email_domain"]); + + //* Check if there is no active mailbox with this address + $tmp = $app->db->queryOneRecord("SELECT count(mailuser_id) as number FROM mail_user WHERE postfix = 'y' AND email = '".$app->db->quote($this->dataRecord["source"])."'"); + if($tmp['number'] > 0) $app->tform->errorMessage .= $app->tform->lng("duplicate_mailbox_txt")."
    "; + unset($tmp); + + parent::onSubmit(); + } + + function onAfterInsert() { + global $app; + + $domain = $app->db->queryOneRecord("SELECT sys_groupid FROM mail_domain WHERE domain = '".$app->db->quote($_POST["email_domain"])."' AND ".$app->tform->getAuthSQL('r')); + $app->db->query("update mail_forwarding SET sys_groupid = ".$domain['sys_groupid']." WHERE forwarding_id = ".$this->id); + + } + +} + +$page = new page_action; +$page->onLoad(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/mail_forward_list.php b/interface/ispconfig/interface/mail/mail_forward_list.php new file mode 100644 index 0000000000000000000000000000000000000000..da5c57d930d64ec273d8a0bb69dc0d73a621d1c0 --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_forward_list.php @@ -0,0 +1,26 @@ +auth->check_module_permissions('mail'); + +$app->uses('listform_actions'); + +// Limit the results to alias domains +$app->listform_actions->SQLExtWhere = "type = 'forward'"; + +$app->listform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/mail_get_del.php b/interface/ispconfig/interface/mail/mail_get_del.php new file mode 100644 index 0000000000000000000000000000000000000000..e66f852023ae59a54ed6b386da2675baa867c240 --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_get_del.php @@ -0,0 +1,51 @@ +auth->check_module_permissions('mail'); + +$app->uses("tform_actions"); +$app->tform_actions->onDelete(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/mail_get_edit.php b/interface/ispconfig/interface/mail/mail_get_edit.php new file mode 100644 index 0000000000000000000000000000000000000000..f088e220a7b3fc7f80fbeddd1aa8240d69fd9928 --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_get_edit.php @@ -0,0 +1,109 @@ +auth->check_module_permissions('mail'); + +// Loading classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onShowNew() { + global $app, $conf; + + // we will check only users, not admins + if($_SESSION["s"]["user"]["typ"] == 'user') { + if(!$app->tform->checkClientLimit('limit_fetchmail')) { + $app->error($app->tform->wordbook["limit_fetchmail_txt"]); + } + if(!$app->tform->checkResellerLimit('limit_fetchmail')) { + $app->error('Reseller: '.$app->tform->wordbook["limit_fetchmail_txt"]); + } + } + + parent::onShowNew(); + } + + function onSubmit() { + global $app, $conf; + + // Check the client limits, if user is not the admin + if($_SESSION["s"]["user"]["typ"] != 'admin') { // if user is not admin + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_fetchmail FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Check if the user may add another transport. + if($this->id == 0 && $client["limit_fetchmail"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(mailget_id) as number FROM mail_get WHERE sys_groupid = $client_group_id"); + if($tmp["number"] >= $client["limit_fetchmail"]) { + $app->tform->errorMessage .= $app->tform->wordbook["limit_fetchmail_txt"]."
    "; + } + unset($tmp); + } + } // end if user is not admin + + // Set the server ID according to the selected destination + $tmp = $app->db->queryOneRecord("SELECT server_id FROM mail_user WHERE email = '".$app->db->quote($this->dataRecord["destination"])."'"); + $this->dataRecord["server_id"] = $tmp["server_id"]; + unset($tmp); + + parent::onSubmit(); + } + + function onAfterInsert() { + global $app; + + $tmp = $app->db->queryOneRecord("SELECT sys_groupid FROM mail_user WHERE email = '".$app->db->quote($this->dataRecord["destination"])."'"); + $app->db->query("update mail_get SET sys_groupid = ".$tmp['sys_groupid']." WHERE mailget_id = ".$this->id); + + } + +} + +$page = new page_action; +$page->onLoad(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/mail_get_list.php b/interface/ispconfig/interface/mail/mail_get_list.php new file mode 100644 index 0000000000000000000000000000000000000000..c08b0645ca40374cfafa5c51f381c64e279757b5 --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_get_list.php @@ -0,0 +1,26 @@ +auth->check_module_permissions('mail'); + +$app->uses('listform_actions'); + +// Limit the results to alias domains +// $app->listform_actions->SQLExtWhere = ""; + +$app->listform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/mail_relay_recipient_del.php b/interface/ispconfig/interface/mail/mail_relay_recipient_del.php new file mode 100644 index 0000000000000000000000000000000000000000..acb264c03571703e7267d7fa99278f07d5a83fca --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_relay_recipient_del.php @@ -0,0 +1,51 @@ +auth->check_module_permissions('mail'); + +$app->uses("tform_actions"); +$app->tform_actions->onDelete(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/mail_relay_recipient_edit.php b/interface/ispconfig/interface/mail/mail_relay_recipient_edit.php new file mode 100644 index 0000000000000000000000000000000000000000..70a18bd3b6e7fd556d9f2257ca46ef5f62768918 --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_relay_recipient_edit.php @@ -0,0 +1,59 @@ +auth->check_module_permissions('mail'); + +// Loading classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + +} + +$app->tform_actions = new page_action; +$app->tform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/mail_relay_recipient_list.php b/interface/ispconfig/interface/mail/mail_relay_recipient_list.php new file mode 100644 index 0000000000000000000000000000000000000000..6c9f3b4a6c628f872037883f8195e89476f72a5b --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_relay_recipient_list.php @@ -0,0 +1,24 @@ +auth->check_module_permissions('mail'); + +$app->uses('listform_actions'); +# $app->listform_actions->SQLExtWhere = "access = 'OK'"; + +$app->listform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/mail_spamfilter_del.php b/interface/ispconfig/interface/mail/mail_spamfilter_del.php new file mode 100644 index 0000000000000000000000000000000000000000..02832b87807b866eaaab9cea627374c800a653a9 --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_spamfilter_del.php @@ -0,0 +1,51 @@ +auth->check_module_permissions('mail'); + +$app->uses("tform_actions"); +$app->tform_actions->onDelete(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/mail_spamfilter_edit.php b/interface/ispconfig/interface/mail/mail_spamfilter_edit.php new file mode 100644 index 0000000000000000000000000000000000000000..bafdfb4eb9ff27eb1c89dd9575bfc7061e9ffbdb --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_spamfilter_edit.php @@ -0,0 +1,124 @@ +auth->check_module_permissions('mail'); + +// Loading classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onShowEnd() { + global $app, $conf; + + // Getting email from data record + $email = $this->dataRecord["email"]; + $email_parts = explode("@",$email); + $app->tpl->setVar("email_local_part",$email_parts[0]); + + // Getting Domains of the user + $sql = "SELECT domain FROM mail_domain WHERE type = 'local' AND ".$app->tform->getAuthSQL('r'); + $domains = $app->db->queryAllRecords($sql); + $domain_select = ''; + foreach( $domains as $domain) { + $selected = ($domain["domain"] == $email_parts[1])?'SELECTED':''; + $domain_select .= "\r\n"; + } + $app->tpl->setVar("email_domain",$domain_select); + + // calculate scores + if(count($this->dataRecord) > 0) { + $app->tpl->setVar("spam_rewrite_score_int",number_format($this->dataRecord["spam_rewrite_score_int"] / 100, 2, '.', '')); + $app->tpl->setVar("spam_redirect_score_int",number_format($this->dataRecord["spam_redirect_score_int"] / 100, 2, '.', '')); + $app->tpl->setVar("spam_delete_score_int",number_format($this->dataRecord["spam_delete_score_int"] / 100, 2, '.', '')); + } + + // Changing maildir to mailbox_id + $sql = "SELECT mailbox_id FROM mail_box WHERE maildir = '".$this->dataRecord["spam_redirect_maildir"]."' AND ".$app->tform->getAuthSQL('r'); + $mailbox = $app->db->queryOneRecord($sql); + $this->dataRecord["spam_redirect_maildir"] = $mailbox["mailbox_id"]; + + parent::onShowEnd(); + } + + function onSubmit() { + global $app, $conf; + + // Check if Domain belongs to user + $domain = $app->db->queryOneRecord("SELECT server_id, domain FROM mail_domain WHERE domain = '".$app->db->quote($_POST["email_domain"])."' AND ".$app->tform->getAuthSQL('r')); + if($domain["domain"] != $_POST["email_domain"]) $app->tform->errorMessage .= $app->tform->wordbook["no_domain_perm"]; + + // compose the email field + if($_POST["email_local_part"] != '') { + $this->dataRecord["email"] = $_POST["email_local_part"]."@".$_POST["email_domain"]; + } else { + $this->dataRecord["email"] = $_POST["email_domain"]; + } + // Set the server id of the mailbox = server ID of mail domain. + $this->dataRecord["server_id"] = $domain["server_id"]; + + unset($this->dataRecord["email_local_part"]); + unset($this->dataRecord["email_domain"]); + + // calculate scores + $this->dataRecord["spam_rewrite_score_int"] = $_POST["spam_rewrite_score_int"] * 100; + $this->dataRecord["spam_redirect_score_int"] = $_POST["spam_redirect_score_int"] * 100; + $this->dataRecord["spam_delete_score_int"] = $_POST["spam_delete_score_int"] * 100; + + // Changing mailbox_id to maildir + $sql = "SELECT maildir FROM mail_box WHERE mailbox_id = '".intval($_POST["spam_redirect_maildir"])."' AND ".$app->tform->getAuthSQL('r'); + $mailbox = $app->db->queryOneRecord($sql); + $this->dataRecord["spam_redirect_maildir"] = $mailbox["maildir"]; + + parent::onSubmit(); + } + +} + +$app->tform_actions = new page_action; +$app->tform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/mail_spamfilter_list.php b/interface/ispconfig/interface/mail/mail_spamfilter_list.php new file mode 100644 index 0000000000000000000000000000000000000000..51c75b4cb5b384f850a0c7817cd2b8da720a0154 --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_spamfilter_list.php @@ -0,0 +1,23 @@ +auth->check_module_permissions('mail'); + +$app->uses('listform_actions'); + +$app->listform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/mail_transport_del.php b/interface/ispconfig/interface/mail/mail_transport_del.php new file mode 100644 index 0000000000000000000000000000000000000000..b6463a21a87f1a3b658e2b9d4e0062c2db8d711d --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_transport_del.php @@ -0,0 +1,51 @@ +auth->check_module_permissions('mail'); + +$app->uses("tform_actions"); +$app->tform_actions->onDelete(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/mail_transport_edit.php b/interface/ispconfig/interface/mail/mail_transport_edit.php new file mode 100644 index 0000000000000000000000000000000000000000..4223a8132f73ab482e17c2a4e8df3d81368effe1 --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_transport_edit.php @@ -0,0 +1,179 @@ +auth->check_module_permissions('mail'); + + +// Loading classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onShowNew() { + global $app, $conf; + + // we will check only users, not admins + if($_SESSION["s"]["user"]["typ"] == 'user') { + if(!$app->tform->checkClientLimit('limit_mailrouting')) { + $app->error($app->tform->wordbook["limit_mailrouting_txt"]); + } + if(!$app->tform->checkResellerLimit('limit_mailrouting')) { + $app->error('Reseller: '.$app->tform->wordbook["limit_mailrouting_txt"]); + } + } + + parent::onShowNew(); + } + + function onShowEnd() { + global $app, $conf; + + $tmp_parts = explode(":",$this->dataRecord["transport"]); + if(!empty($this->id) && !stristr($this->dataRecord["transport"],':')) { + $rec["type"] = 'custom'; + } else { + if(empty($this->id) && empty($tmp_parts[0])) { + $rec["type"] = 'smtp'; + } else { + $rec["type"] = $tmp_parts[0]; + } + } + if(@$tmp_parts[2] != '') { + $dest = @$tmp_parts[1].':'.@$tmp_parts[2]; + } elseif($tmp_parts[1] != '') { + $dest = $tmp_parts[1]; + } else { + $dest = $this->dataRecord["transport"]; + } + if(@substr($dest,0,1) == '[') { + $rec["mx"] = 'checked="CHECKED"'; + $rec["destination"] = @str_replace(']','',@str_replace('[','',$dest)); + } else { + $rec["mx"] = ''; + $rec["destination"] = @$dest; + } + + $types = array('smtp' => 'smtp','uucp' => 'uucp','slow' => 'slow', 'error' => 'error', 'custom' => 'custom','' => 'null'); + $type_select = ''; + if(is_array($types)) { + foreach( $types as $key => $val) { + $selected = ($key == $rec["type"])?'SELECTED':''; + $type_select .= "\r\n"; + } + } + $rec["type"] = $type_select; + $app->tpl->setVar($rec); + unset($type); + unset($types); + + parent::onShowEnd(); + } + + function onBeforeUpdate() { + global $app, $conf; + + //* Check if the server has been changed + // We do this only for the admin or reseller users, as normal clients can not change the server ID anyway + if($_SESSION["s"]["user"]["typ"] == 'admin' || $app->auth->has_clients($_SESSION['s']['user']['userid'])) { + $rec = $app->db->queryOneRecord("SELECT server_id from mail_transport WHERE transport_id = ".$this->id); + if($rec['server_id'] != $this->dataRecord["server_id"]) { + //* Add a error message and switch back to old server + $app->tform->errorMessage .= $app->lng('The Server can not be changed.'); + $this->dataRecord["server_id"] = $rec['server_id']; + } + unset($rec); + } + } + + function onSubmit() { + global $app, $conf; + + // Check the client limits, if user is not the admin + if($_SESSION["s"]["user"]["typ"] != 'admin') { // if user is not admin + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_mailrouting FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Check if the user may add another transport. + if($this->id == 0 && $client["limit_mailrouting"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(transport_id) as number FROM mail_transport WHERE sys_groupid = $client_group_id"); + if($tmp["number"] >= $client["limit_mailrouting"]) { + $app->tform->errorMessage .= $app->tform->wordbook["limit_mailrouting_txt"]."
    "; + } + unset($tmp); + } + } // end if user is not admin + + //* Compose transport field + if($this->dataRecord["mx"] == 'y') { + if(stristr($this->dataRecord["destination"],':')) { + $tmp_parts = explode(":",$this->dataRecord["destination"]); + $transport = '['.$tmp_parts[0].']:'.$tmp_parts[1]; + } else { + $transport = '['.$this->dataRecord["destination"].']'; + } + } else { + $transport = $this->dataRecord["destination"]; + } + + if($this->dataRecord["type"] == 'custom') { + $this->dataRecord["transport"] = $transport; + } else { + $this->dataRecord["transport"] = $this->dataRecord["type"].':'.$transport; + } + + unset($this->dataRecord["type"]); + unset($this->dataRecord["mx"]); + unset($this->dataRecord["destination"]); + + parent::onSubmit(); + } + +} + +$page = new page_action; +$page->onLoad(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/mail_transport_list.php b/interface/ispconfig/interface/mail/mail_transport_list.php new file mode 100644 index 0000000000000000000000000000000000000000..42db6aec173c7cbe3e0a2a0b1d9f0af19e7a1653 --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_transport_list.php @@ -0,0 +1,26 @@ +auth->check_module_permissions('mail'); + +$app->uses('listform_actions'); + +// Limit the results to alias domains +// $app->listform_actions->SQLExtWhere = "type = 'local'"; + +$app->listform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/mail_user_del.php b/interface/ispconfig/interface/mail/mail_user_del.php new file mode 100644 index 0000000000000000000000000000000000000000..cb180fc9013b132bc6a28d3f9e129bc0a072fbc4 --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_user_del.php @@ -0,0 +1,66 @@ +auth->check_module_permissions('mail'); + +// Loading classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onBeforeDelete() { + global $app; $conf; + + $tmp_user = $app->db->queryOneRecord("SELECT id FROM spamfilter_users WHERE email = '".mysql_real_escape_string($this->dataRecord["email"])."'"); + $app->db->datalogDelete('spamfilter_users', 'id', $tmp_user["id"]); + + } +} + +$page = new page_action; +$page->onDelete(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/mail_user_edit.php b/interface/ispconfig/interface/mail/mail_user_edit.php new file mode 100644 index 0000000000000000000000000000000000000000..3e769753dcaa6a6c60123ea9c4eb15347c7319dd --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_user_edit.php @@ -0,0 +1,328 @@ +auth->check_module_permissions('mail'); + +// Loading classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + + function onShowNew() { + global $app, $conf; + + // we will check only users, not admins + if($_SESSION["s"]["user"]["typ"] == 'user') { + if(!$app->tform->checkClientLimit('limit_mailbox')) { + $app->error($app->tform->wordbook["limit_mailbox_txt"]); + } + if(!$app->tform->checkResellerLimit('limit_mailbox')) { + $app->error('Reseller: '.$app->tform->wordbook["limit_mailbox_txt"]); + } + } + + parent::onShowNew(); + } + + function onShowEnd() { + global $app, $conf; + + $email = $this->dataRecord["email"]; + $email_parts = explode("@",$email); + $app->tpl->setVar("email_local_part",$email_parts[0]); + + // Getting Domains of the user + $sql = "SELECT domain FROM mail_domain WHERE ".$app->tform->getAuthSQL('r').' ORDER BY domain'; + $domains = $app->db->queryAllRecords($sql); + $domain_select = ''; + if(is_array($domains)) { + foreach( $domains as $domain) { + $selected = ($domain["domain"] == @$email_parts[1])?'SELECTED':''; + $domain_select .= "\r\n"; + } + } + $app->tpl->setVar("email_domain",$domain_select); + unset($domains); + unset($domain_select); + + // Get the spamfilter policys for the user + $tmp_user = $app->db->queryOneRecord("SELECT policy_id FROM spamfilter_users WHERE email = '".$this->dataRecord["email"]."'"); + $sql = "SELECT id, policy_name FROM spamfilter_policy WHERE ".$app->tform->getAuthSQL('r'); + $policys = $app->db->queryAllRecords($sql); + $policy_select = ""; + if(is_array($policys)) { + foreach( $policys as $p) { + $selected = ($p["id"] == $tmp_user["policy_id"])?'SELECTED':''; + $policy_select .= "\r\n"; + } + } + $app->tpl->setVar("policy",$policy_select); + unset($policys); + unset($policy_select); + unset($tmp_user); + + // Convert quota from Bytes to MB + if($this->dataRecord["quota"] != -1) $app->tpl->setVar("quota",$this->dataRecord["quota"] / 1024 / 1024); + + // Is autoresponder set? + if ($this->dataRecord['autoresponder'] == 'y') { + $app->tpl->setVar("ar_active", 'checked="checked"'); + } else { + $app->tpl->setVar("ar_active", ''); + } + + parent::onShowEnd(); + } + + function onSubmit() { + global $app, $conf; + + //* Check if Domain belongs to user + if(isset($_POST["email_domain"])) { + $domain = $app->db->queryOneRecord("SELECT server_id, domain FROM mail_domain WHERE domain = '".$app->db->quote($_POST["email_domain"])."' AND ".$app->tform->getAuthSQL('r')); + if($domain["domain"] != $_POST["email_domain"]) $app->tform->errorMessage .= $app->tform->lng("no_domain_perm"); + } + + + //* if its an insert, check that the password is not empty + if($this->id == 0 && $_POST["password"] == '') { + $app->tform->errorMessage .= $app->tform->lng("error_no_pwd")."
    "; + } + + //* Check the client limits, if user is not the admin + if($_SESSION["s"]["user"]["typ"] != 'admin') { // if user is not admin + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_mailbox, limit_mailquota FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + + // Check if the user may add another mailbox. + if($this->id == 0 && $client["limit_mailbox"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(mailuser_id) as number FROM mail_user WHERE sys_groupid = $client_group_id"); + if($tmp["number"] >= $client["limit_mailbox"]) { + $app->tform->errorMessage .= $app->tform->lng("limit_mailbox_txt")."
    "; + } + unset($tmp); + } + + // Check the quota and adjust + if(isset($_POST["quota"]) && $client["limit_mailquota"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT sum(quota) as mailquota FROM mail_user WHERE mailuser_id != ".intval($this->id)." AND ".$app->tform->getAuthSQL('u')); + $mailquota = $tmp["mailquota"] / 1024 / 1024; + $new_mailbox_quota = intval($this->dataRecord["quota"]); + if(($mailquota + $new_mailbox_quota > $client["limit_mailquota"]) || ($new_mailbox_quota == 0 && $client["limit_mailquota"] != -1)) { + $max_free_quota = $client["limit_mailquota"] - $mailquota; + $app->tform->errorMessage .= $app->tform->lng("limit_mailquota_txt").": ".$max_free_quota."
    "; + // Set the quota field to the max free space + $this->dataRecord["quota"] = $max_free_quota; + } + unset($tmp); + unset($tmp_quota); + } + } // end if user is not admin + + + //* compose the email field + if(isset($_POST["email_local_part"]) && isset($_POST["email_domain"])) { + $this->dataRecord["email"] = strtolower($_POST["email_local_part"]."@".$_POST["email_domain"]); + + // Set the server id of the mailbox = server ID of mail domain. + $this->dataRecord["server_id"] = $domain["server_id"]; + + unset($this->dataRecord["email_local_part"]); + unset($this->dataRecord["email_domain"]); + + // Convert quota from MB to Bytes + if($this->dataRecord["quota"] != -1) $this->dataRecord["quota"] = $this->dataRecord["quota"] * 1024 * 1024; + + // setting Maildir, Homedir, UID and GID + $app->uses('getconf'); + $mail_config = $app->getconf->get_server_config($domain["server_id"],'mail'); + $maildir = str_replace("[domain]",$domain["domain"],$mail_config["maildir_path"]); + $maildir = str_replace("[localpart]",strtolower($_POST["email_local_part"]),$maildir); + $this->dataRecord["maildir"] = $maildir; + $this->dataRecord["homedir"] = $mail_config["homedir_path"]; + $this->dataRecord["uid"] = $mail_config["mailuser_uid"]; + $this->dataRecord["gid"] = $mail_config["mailuser_gid"]; + + //* Check if there is no alias or forward with this address + $tmp = $app->db->queryOneRecord("SELECT count(forwarding_id) as number FROM mail_forwarding WHERE active = 'y' AND source = '".$app->db->quote($this->dataRecord["email"])."'"); + if($tmp['number'] > 0) $app->tform->errorMessage .= $app->tform->lng("duplicate_alias_or_forward_txt")."
    "; + unset($tmp); + + } + + //* if autoresponder checkbox not selected, do not save dates + if (!isset($_POST['autoresponder']) && array_key_exists('autoresponder_start_date', $_POST)) { + $this->dataRecord['autoresponder_start_date'] = array_map(create_function('$item','return 0;'), $this->dataRecord['autoresponder_start_date']); + $this->dataRecord['autoresponder_end_date'] = array_map(create_function('$item','return 0;'), $this->dataRecord['autoresponder_end_date']); + } + + parent::onSubmit(); + } + + function onAfterInsert() { + global $app, $conf; + + // Set the domain owner as mailbox owner + $domain = $app->db->queryOneRecord("SELECT sys_groupid, server_id FROM mail_domain WHERE domain = '".$app->db->quote($_POST["email_domain"])."' AND ".$app->tform->getAuthSQL('r')); + $app->db->query("UPDATE mail_user SET sys_groupid = ".$domain["sys_groupid"]." WHERE mailuser_id = ".$this->id); + + // send a welcome email to create the mailbox +// mail($this->dataRecord["email"],$app->tform->wordbook["welcome_mail_subject"],$app->tform->wordbook["welcome_mail_message"]); + + // tries to detect current charset, and encode subject-header and body from it to ISO-8859-1. + $fromCharset = mb_detect_encoding($app->tform->lng("welcome_mail_subject")); + $iconvPreferences = array("input-charset" => $fromCharset, + "output-charset" => "ISO-8859-1", + "line-length" => 76, + "line-break-chars" => "\n", + "scheme" => "Q"); + + $welcomeFromName = $app->tform->lng("welcome_mail_fromname_txt"); + $welcomeFromEmail = $app->tform->lng("welcome_mail_fromemail_txt"); + $mailHeaders = "MIME-Version: 1.0" . "\n"; + $mailHeaders .= "Content-type: text/plain; charset=iso-8859-1" . "\n"; + $mailHeaders .= "From: $welcomeFromName <$welcomeFromEmail>" . "\n"; + $mailHeaders .= "Reply-To: <$welcomeFromEmail>" . "\n"; + $mailTarget = $this->dataRecord["email"]; + $mailSubject = iconv_mime_encode("trimoff", $app->tform->lng("welcome_mail_subject"), $iconvPreferences); + $mailSubject = str_replace("trimoff: ", "", $mailSubject); + $mailBody = iconv ($fromCharset, "ISO-8859-1", $app->tform->lng("welcome_mail_message")); + + mail($mailTarget, $mailSubject, $mailBody, $mailHeaders); + + // Spamfilter policy + $policy_id = intval($this->dataRecord["policy"]); + if($policy_id > 0) { + $tmp_user = $app->db->queryOneRecord("SELECT id FROM spamfilter_users WHERE email = '".mysql_real_escape_string($this->dataRecord["email"])."'"); + if($tmp_user["id"] > 0) { + // There is already a record that we will update + $app->db->datalogUpdate('spamfilter_users', "policy_id = $ploicy_id", 'id', $tmp_user["id"]); + } else { + // We create a new record + $insert_data = "(`sys_userid`, `sys_groupid`, `sys_perm_user`, `sys_perm_group`, `sys_perm_other`, `server_id`, `priority`, `policy_id`, `email`, `fullname`, `local`) + VALUES (".$_SESSION["s"]["user"]["userid"].", ".$domain["sys_groupid"].", 'riud', 'riud', '', ".$domain["server_id"].", 10, ".$policy_id.", '".mysql_real_escape_string($this->dataRecord["email"])."', '".mysql_real_escape_string($this->dataRecord["email"])."', 'Y')"; + $app->db->datalogInsert('spamfilter_users', $insert_data, 'id'); + } + } // endif spamfilter policy + + + // Set the fields for dovecot + if(isset($this->dataRecord["email"])) { + $disableimap = ($this->dataRecord["disableimap"])?'y':'n'; + $disablepop3 = ($this->dataRecord["disablepop3"])?'y':'n'; + $disabledeliver = ($this->dataRecord["postfix"] == 'y')?'n':'y'; + $disablesmtp = ($this->dataRecord["postfix"] == 'y')?'n':'y'; + + $sql = "UPDATE mail_user SET disableimap = '$disableimap', disablepop3 = '$disablepop3', disablesmtp = '$disablesmtp', disabledeliver = '$disabledeliver' WHERE mailuser_id = ".$this->id; + $app->db->query($sql); + } + } + + function onAfterUpdate() { + global $app, $conf; + + // Set the domain owner as mailbox owner + if(isset($_POST["email_domain"])) { + $domain = $app->db->queryOneRecord("SELECT sys_groupid, server_id FROM mail_domain WHERE domain = '".$app->db->quote($_POST["email_domain"])."' AND ".$app->tform->getAuthSQL('r')); + $app->db->query("UPDATE mail_user SET sys_groupid = ".$domain["sys_groupid"]." WHERE mailuser_id = ".$this->id); + + // Spamfilter policy + $policy_id = intval($this->dataRecord["policy"]); + $tmp_user = $app->db->queryOneRecord("SELECT id FROM spamfilter_users WHERE email = '".mysql_real_escape_string($this->dataRecord["email"])."'"); + if($policy_id > 0) { + if($tmp_user["id"] > 0) { + // There is already a record that we will update + $app->db->datalogUpdate('spamfilter_users', "policy_id = $policy_id", 'id', $tmp_user["id"]); + } else { + // We create a new record + $insert_data = "(`sys_userid`, `sys_groupid`, `sys_perm_user`, `sys_perm_group`, `sys_perm_other`, `server_id`, `priority`, `policy_id`, `email`, `fullname`, `local`) + VALUES (".$_SESSION["s"]["user"]["userid"].", ".$domain["sys_groupid"].", 'riud', 'riud', '', ".$domain["server_id"].", 10, ".$policy_id.", '".mysql_real_escape_string($this->dataRecord["email"])."', '".mysql_real_escape_string($this->dataRecord["email"])."', 'Y')"; + $app->db->datalogInsert('spamfilter_users', $insert_data, 'id'); + } + }else { + if($tmp_user["id"] > 0) { + // There is already a record but the user shall have no policy, so we delete it + $app->db->datalogDelete('spamfilter_users', 'id', $tmp_user["id"]); + } + } // endif spamfilter policy + } + + // Set the fields for dovecot + if(isset($this->dataRecord["email"])) { + $disableimap = ($this->dataRecord["disableimap"])?'y':'n'; + $disablepop3 = ($this->dataRecord["disablepop3"])?'y':'n'; + $disabledeliver = ($this->dataRecord["postfix"] == 'y')?'n':'y'; + $disablesmtp = ($this->dataRecord["postfix"] == 'y')?'n':'y'; + + $sql = "UPDATE mail_user SET disableimap = '$disableimap', disablepop3 = '$disablepop3', disablesmtp = '$disablesmtp', disabledeliver = '$disabledeliver' WHERE mailuser_id = ".$this->id; + $app->db->query($sql); + } + + //** If the email address has been changed, change it in all aliases too + if(isset($this->dataRecord['email']) && $this->oldDataRecord['email'] != $this->dataRecord['email']) { + //if($this->oldDataRecord['email'] != $this->dataRecord['email']) { + + //* Update the aliases + $forwardings = $app->db->queryAllRecords("SELECT * FROM mail_forwarding WHERE destination = '".$app->db->quote($this->oldDataRecord['email'])."'"); + if(is_array($forwardings)) { + foreach($forwardings as $rec) { + $destination = $app->db->quote($this->dataRecord['email']); + $app->db->datalogUpdate('mail_forwarding', "destination = '$destination'", 'forwarding_id', $rec['forwarding_id']); + } + } + + } // end if email addess changed + + } + +} + +$app->tform_actions = new page_action; +$app->tform_actions->onLoad(); + +?> diff --git a/interface/ispconfig/interface/mail/mail_user_filter_del.php b/interface/ispconfig/interface/mail/mail_user_filter_del.php new file mode 100644 index 0000000000000000000000000000000000000000..81689b17bbd37d9bf0336d2eace3095d705c5064 --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_user_filter_del.php @@ -0,0 +1,83 @@ +auth->check_module_permissions('mail'); + +// Loading classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onAfterDelete() { + global $app, $conf; + + $mailuser = $app->db->queryOneRecord("SELECT custom_mailfilter FROM mail_user WHERE mailuser_id = ".$this->dataRecord["mailuser_id"]); + $skip = false; + $lines = explode("\n",$mailuser['custom_mailfilter']); + $out = ''; + + foreach($lines as $line) { + $line = trim($line); + if($line == '### BEGIN FILTER_ID:'.$this->id) { + $skip = true; + } + if($skip == false && $line != '') $out .= $line ."\n"; + if($line == '### END FILTER_ID:'.$this->id) { + $skip = false; + } + } + + $out = mysql_real_escape_string($out); + $app->db->datalogUpdate('mail_user', "custom_mailfilter = '$out'", 'mailuser_id', $this->dataRecord["mailuser_id"]); + + } + +} + +$page = new page_action; +$page->onDelete(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/mail_user_filter_edit.php b/interface/ispconfig/interface/mail/mail_user_filter_edit.php new file mode 100644 index 0000000000000000000000000000000000000000..382460a01360f736be70a4bd9e69144e0ca33b51 --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_user_filter_edit.php @@ -0,0 +1,232 @@ +auth->check_module_permissions('mail'); + +// Loading classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onSubmit() { + global $app, $conf; + + // Get the parent mail_user record + $mailuser = $app->db->queryOneRecord("SELECT * FROM mail_user WHERE mailuser_id = '".intval($_REQUEST["mailuser_id"])."' AND ".$app->tform->getAuthSQL('r')); + + // Check if Domain belongs to user + if($mailuser["mailuser_id"] != $_POST["mailuser_id"]) $app->tform->errorMessage .= $app->tform->wordbook["no_mailuser_perm"]; + + // Set the mailuser_id + $this->dataRecord["mailuser_id"] = $mailuser["mailuser_id"]; + + // Remove leading dots + if(substr($this->dataRecord['target'],0,1) == '.') $this->dataRecord['target'] = substr($this->dataRecord['target'],1); + + parent::onSubmit(); + } + + /* + function onAfterInsert() { + global $app, $conf; + + $this->onAfterUpdate(); + + $app->db->query("UPDATE mail_user_filter SET sys_groupid = ".$mailuser['sys_groupid']." WHERE filter_id = ".$this->id); + } + + function onAfterUpdate() { + global $app, $conf; + + $mailuser = $app->db->queryOneRecord("SELECT custom_mailfilter FROM mail_user WHERE mailuser_id = ".$this->dataRecord["mailuser_id"]); + $skip = false; + $lines = explode("\n",$mailuser['custom_mailfilter']); + $out = ''; + $found = false; + + foreach($lines as $line) { + $line = rtrim($line); + if($line == '### BEGIN FILTER_ID:'.$this->id) { + $skip = true; + $found = true; + } + if($skip == false && $line != '') $out .= $line ."\n"; + if($line == '### END FILTER_ID:'.$this->id) { + $out .= $this->getRule(); + $skip = false; + } + } + + // We did not found our rule, so we add it now as first rule. + if($found == false) { + $new_rule = $this->getRule(); + $out = $new_rule . $out; + } + + $out = $app->db->quote($out); + $app->db->datalogUpdate('mail_user', "custom_mailfilter = '$out'", 'mailuser_id', $this->dataRecord["mailuser_id"]); + + } + + function getRule() { + + global $app,$conf; + + $app->uses("getconf"); + $mailuser_rec = $app->db->queryOneRecord("SELECT server_id FROM mail_user WHERE mailuser_id = ".intval($this->dataRecord["mailuser_id"])); + $mail_config = $app->getconf->get_server_config(intval($mailuser_rec["server_id"]),'mail'); + + if($mail_config['mail_filter_syntax'] == 'sieve') { + + // ####################################################### + // Filter in Sieve Syntax + // ####################################################### + + $content = ''; + $content .= '### BEGIN FILTER_ID:'.$this->id."\n"; + + //$content .= 'require ["fileinto", "regex", "vacation"];'."\n"; + + $content .= 'if header :regex ["'.strtolower($this->dataRecord["source"]).'"] ["'; + + $searchterm = preg_quote($this->dataRecord["searchterm"]); + + if($this->dataRecord["op"] == 'contains') { + $content .= ".*".$searchterm; + } elseif ($this->dataRecord["op"] == 'is') { + $content .= $searchterm."$"; + } elseif ($this->dataRecord["op"] == 'begins') { + $content .= " ".$searchterm.""; + } elseif ($this->dataRecord["op"] == 'ends') { + $content .= ".*".$searchterm."$"; + } + + $content .= '"] {'."\n"; + + if($this->dataRecord["action"] == 'move') { + $content .= ' fileinto "'.$this->dataRecord["target"].'";' . "\n"; + } else { + $content .= " discard;\n"; + } + + $content .= " stop;\n}\n"; + + $content .= '### END FILTER_ID:'.$this->id."\n"; + + } else { + + // ####################################################### + // Filter in Maildrop Syntax + // ####################################################### + $content = ''; + $content .= '### BEGIN FILTER_ID:'.$this->id."\n"; + + $TargetNoQuotes = $this->dataRecord["target"]; + $TargetQuotes = "\"$TargetNoQuotes\""; + + $TestChDirNoQuotes = '$DEFAULT/.'.$TargetNoQuotes; + $TestChDirQuotes = "\"$TestChDirNoQuotes\""; + + $MailDirMakeNoQuotes = $TargetQuotes.' $DEFAULT'; + + $EchoTargetFinal = $TargetNoQuotes; + + + if($this->dataRecord["action"] == 'move') { + + $content .= " +`test -e ".$TestChDirQuotes." && exit 1 || exit 0` +if ( ".'$RETURNCODE'." != 1 ) +{ + `maildirmake -f $MailDirMakeNoQuotes` + `chmod -R 0700 ".$TestChDirQuotes."` + `echo \"INBOX.$EchoTargetFinal\" >> ".'$DEFAULT'."/courierimapsubscribed` +} +"; + } + + $content .= "if (/^".$this->dataRecord["source"].":"; + + $searchterm = preg_quote($this->dataRecord["searchterm"]); + + if($this->dataRecord["op"] == 'contains') { + $content .= ".*".$searchterm."/:h)\n"; + } elseif ($this->dataRecord["op"] == 'is') { + $content .= $searchterm."$/:h)\n"; + } elseif ($this->dataRecord["op"] == 'begins') { + $content .= " ".$searchterm."/:h)\n"; + } elseif ($this->dataRecord["op"] == 'ends') { + $content .= ".*".$searchterm."$/:h)\n"; + } + + $content .= "{\n"; + $content .= "exception {\n"; + + if($this->dataRecord["action"] == 'move') { + $content .= 'ID' . "$this->id" . 'EndFolder = "$DEFAULT/.' . $this->dataRecord['target'] . '/"' . "\n"; + $content .= "to ". '$ID' . "$this->id" . 'EndFolder' . "\n"; + } else { + $content .= "to /dev/null\n"; + } + + $content .= "}\n"; + $content .= "}\n"; + + //} + + $content .= '### END FILTER_ID:'.$this->id."\n"; + + } + + return $content; + } + */ + +} + +$page = new page_action; +$page->onLoad(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/mail_user_list.php b/interface/ispconfig/interface/mail/mail_user_list.php new file mode 100644 index 0000000000000000000000000000000000000000..e7cb7c8ad68cee36f6da7d17682d58c553044ab9 --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_user_list.php @@ -0,0 +1,44 @@ +auth->check_module_permissions('mail'); + +$app->load('listform_actions'); + + +class list_action extends listform_actions { + + function onShow() { + global $app,$conf; + + $app->uses('getconf'); + $global_config = $app->getconf->get_global_config('mail'); + + if($global_config['mailboxlist_webmail_link'] == 'y') { + $app->tpl->setVar('mailboxlist_webmail_link',1); + } else { + $app->tpl->setVar('mailboxlist_webmail_link',0); + } + + parent::onShow(); + } + +} + +$list = new list_action; +$list->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/mail_user_stats.php b/interface/ispconfig/interface/mail/mail_user_stats.php new file mode 100644 index 0000000000000000000000000000000000000000..694202fd1af8eab4886e41ca6e664cb05c061ce2 --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_user_stats.php @@ -0,0 +1,63 @@ +auth->check_module_permissions('mail'); + +$app->load('listform_actions'); + +class list_action extends listform_actions { + + function prepareDataRow($rec) + { + global $app; + + $rec = $app->listform->decode($rec); + + //* Alternating datarow colors + $this->DataRowColor = ($this->DataRowColor == '#FFFFFF') ? '#EEEEEE' : '#FFFFFF'; + $rec['bgcolor'] = $this->DataRowColor; + + //* Set the statistics colums + //** Traffic of the current month + $tmp_date = date('Y-m'); + $tmp_rec = $app->db->queryOneRecord("SELECT traffic as t FROM mail_traffic WHERE mailuser_id = ".$rec['mailuser_id']." AND month = '$tmp_date'"); + $rec['this_month'] = number_format(intval($tmp_rec['t'])/1024/1024, 0, '.', ' '); + + //** Traffic of the current year + $tmp_date = date('Y'); + $tmp_rec = $app->db->queryOneRecord("SELECT sum(traffic) as t FROM mail_traffic WHERE mailuser_id = ".$rec['mailuser_id']." AND month like '$tmp_date%'"); + $rec['this_year'] = number_format(intval($tmp_rec['t'])/1024/1024, 0, '.', ' '); + + //** Traffic of the last month + $tmp_date = date('Y-m',mktime(0, 0, 0, date("m")-1, date("d"), date("Y"))); + $tmp_rec = $app->db->queryOneRecord("SELECT traffic as t FROM mail_traffic WHERE mailuser_id = ".$rec['mailuser_id']." AND month = '$tmp_date'"); + $rec['last_month'] = number_format(intval($tmp_rec['t'])/1024/1024, 0, '.', ' '); + + //** Traffic of the last year + $tmp_date = date('Y',mktime(0, 0, 0, date("m"), date("d"), date("Y")-1)); + $tmp_rec = $app->db->queryOneRecord("SELECT sum(traffic) as t FROM mail_traffic WHERE mailuser_id = ".$rec['mailuser_id']." AND month like '$tmp_date%'"); + $rec['last_year'] = number_format(intval($tmp_rec['t'])/1024/1024, 0, '.', ' '); + + //* The variable "id" contains always the index variable + $rec['id'] = $rec[$this->idx_key]; + return $rec; + } +} + +$list = new list_action; +$list->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/mail_whitelist_del.php b/interface/ispconfig/interface/mail/mail_whitelist_del.php new file mode 100644 index 0000000000000000000000000000000000000000..217f49e2b2f692bf3f4da85c66cee025e16a7ae3 --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_whitelist_del.php @@ -0,0 +1,51 @@ +auth->check_module_permissions('mail'); + +$app->uses("tform_actions"); +$app->tform_actions->onDelete(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/mail_whitelist_edit.php b/interface/ispconfig/interface/mail/mail_whitelist_edit.php new file mode 100644 index 0000000000000000000000000000000000000000..092f5783d4c16e7098d6592fb19dc794b4405a03 --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_whitelist_edit.php @@ -0,0 +1,113 @@ +auth->check_module_permissions('mail'); + +// Loading classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onShowNew() { + global $app, $conf; + + // we will check only users, not admins + if($_SESSION["s"]["user"]["typ"] == 'user') { + if(!$app->tform->checkClientLimit('limit_mailfilter')) { + $app->error($app->tform->wordbook["limit_mailfilter_txt"]); + } + if(!$app->tform->checkResellerLimit('limit_mailfilter')) { + $app->error('Reseller: '.$app->tform->wordbook["limit_mailfilter_txt"]); + } + } + + parent::onShowNew(); + } + + function onBeforeUpdate() { + global $app, $conf; + + //* Check if the server has been changed + // We do this only for the admin or reseller users, as normal clients can not change the server ID anyway + if($_SESSION["s"]["user"]["typ"] == 'admin' || $app->auth->has_clients($_SESSION['s']['user']['userid'])) { + $rec = $app->db->queryOneRecord("SELECT server_id from mail_access WHERE access_id = ".$this->id); + if($rec['server_id'] != $this->dataRecord["server_id"]) { + //* Add a error message and switch back to old server + $app->tform->errorMessage .= $app->lng('The Server can not be changed.'); + $this->dataRecord["server_id"] = $rec['server_id']; + } + unset($rec); + } + } + + function onSubmit() { + global $app, $conf; + + // Check the client limits, if user is not the admin + if($_SESSION["s"]["user"]["typ"] != 'admin') { // if user is not admin + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_mailfilter FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Check if the user may add another mailbox. + if($this->id == 0 && $client["limit_mailfilter"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(access_id) as number FROM mail_access WHERE sys_groupid = $client_group_id"); + if($tmp["number"] >= $client["limit_mailfilter"]) { + $app->tform->errorMessage .= $app->tform->wordbook["limit_mailfilter_txt"]."
    "; + } + unset($tmp); + } + } // end if user is not admin + + parent::onSubmit(); + } + +} + +$app->tform_actions = new page_action; +$app->tform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/mail_whitelist_list.php b/interface/ispconfig/interface/mail/mail_whitelist_list.php new file mode 100644 index 0000000000000000000000000000000000000000..b2470084a23892591ad4cc7b4b0854f3aaacfdbb --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_whitelist_list.php @@ -0,0 +1,24 @@ +auth->check_module_permissions('mail'); + +$app->uses('listform_actions'); +$app->listform_actions->SQLExtWhere = "access = 'OK'"; + +$app->listform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/spamfilter_blacklist_del.php b/interface/ispconfig/interface/mail/spamfilter_blacklist_del.php new file mode 100644 index 0000000000000000000000000000000000000000..d3ca8c40c55424574a9533cd61360e39a7de5cc0 --- /dev/null +++ b/interface/ispconfig/interface/mail/spamfilter_blacklist_del.php @@ -0,0 +1,51 @@ +auth->check_module_permissions('mail'); + +$app->uses("tform_actions"); +$app->tform_actions->onDelete(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/spamfilter_blacklist_edit.php b/interface/ispconfig/interface/mail/spamfilter_blacklist_edit.php new file mode 100644 index 0000000000000000000000000000000000000000..3f7e5f08520098c8a7552470979542f11b958b29 --- /dev/null +++ b/interface/ispconfig/interface/mail/spamfilter_blacklist_edit.php @@ -0,0 +1,118 @@ +auth->check_module_permissions('mail'); + +// Loading classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + function onShowNew() { + global $app, $conf; + + // we will check only users, not admins + if($_SESSION["s"]["user"]["typ"] == 'user') { + if(!$app->tform->checkClientLimit('limit_spamfilter_wblist')) { + $app->error($app->tform->wordbook["limit_spamfilter_wblist_txt"]); + } + if(!$app->tform->checkResellerLimit('limit_spamfilter_wblist')) { + $app->error('Reseller: '.$app->tform->wordbook["limit_spamfilter_wblist_txt"]); + } + } + + parent::onShowNew(); + } + + /* + function onBeforeUpdate() { + global $app, $conf; + + //* Check if the server has been changed + // We do this only for the admin or reseller users, as normal clients can not change the server ID anyway + if($_SESSION["s"]["user"]["typ"] == 'admin' || $app->auth->has_clients($_SESSION['s']['user']['userid'])) { + $rec = $app->db->queryOneRecord("SELECT server_id from spamfilter_wblist WHERE id = ".$this->id); + if($rec['server_id'] != $this->dataRecord["server_id"]) { + //* Add a error message and switch back to old server + $app->tform->errorMessage .= $app->lng('The Server can not be changed.'); + $this->dataRecord["server_id"] = $rec['server_id']; + } + unset($rec); + } + } + */ + +function onSubmit() { + global $app, $conf; + + // Check the client limits, if user is not the admin + if($_SESSION["s"]["user"]["typ"] != 'admin') { // if user is not admin + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_spamfilter_wblist FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Check if the user may add another mailbox. + if($this->id == 0 && $client["limit_spamfilter_wblist"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(wblist_id) as number FROM spamfilter_wblist WHERE sys_groupid = $client_group_id"); + if($tmp["number"] >= $client["limit_spamfilter_wblist"]) { + $app->tform->errorMessage .= $app->tform->wordbook["limit_spamfilter_wblist_txt"]."
    "; + } + unset($tmp); + } + } // end if user is not admin + + // Select and set the server_id so it matches the server_id of the spa,filter_users record + $tmp = $app->db->queryOneRecord("SELECT server_id FROM spamfilter_users WHERE id = ".intval($this->dataRecord["rid"])); + $this->dataRecord["server_id"] = $tmp["server_id"]; + unset($tmp); + + parent::onSubmit(); + } +} + +$app->tform_actions = new page_action; +$app->tform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/spamfilter_blacklist_list.php b/interface/ispconfig/interface/mail/spamfilter_blacklist_list.php new file mode 100644 index 0000000000000000000000000000000000000000..4733bdc77c47c4172974729ca7c8b8c85676fb8b --- /dev/null +++ b/interface/ispconfig/interface/mail/spamfilter_blacklist_list.php @@ -0,0 +1,24 @@ +auth->check_module_permissions('mail'); + +$app->uses('listform_actions'); +$app->listform_actions->SQLExtWhere = "wb = 'B'"; + +$app->listform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/spamfilter_config_del.php b/interface/ispconfig/interface/mail/spamfilter_config_del.php new file mode 100644 index 0000000000000000000000000000000000000000..31357e95f3210cd75ed1cfbb30f17bd7aaf16590 --- /dev/null +++ b/interface/ispconfig/interface/mail/spamfilter_config_del.php @@ -0,0 +1,51 @@ +auth->check_module_permissions('mail'); + +$app->uses("tform_actions"); +$app->tform_actions->onDelete(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/spamfilter_config_edit.php b/interface/ispconfig/interface/mail/spamfilter_config_edit.php new file mode 100644 index 0000000000000000000000000000000000000000..26f369de432def7651866825f7051066a095fadf --- /dev/null +++ b/interface/ispconfig/interface/mail/spamfilter_config_edit.php @@ -0,0 +1,96 @@ +auth->check_module_permissions('mail'); + +// Loading classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onShowEdit() { + global $app, $conf; + + if($_SESSION["s"]["user"]["typ"] != 'admin') die('This function needs admin priveliges'); + + if($app->tform->errorMessage == '') { + $app->uses('ini_parser,getconf'); + + $section = $this->active_tab; + $server_id = $this->id; + + $this->dataRecord = $app->getconf->get_server_config($server_id,$section); + } + + $record = $app->tform->getHTML($this->dataRecord, $this->active_tab,'EDIT'); + + $record['id'] = $this->id; + $app->tpl->setVar($record); + } + + function onUpdateSave($sql) { + global $app; + + if($_SESSION["s"]["user"]["typ"] != 'admin') die('This function needs admin priveliges'); + $app->uses('ini_parser,getconf'); + + $section = $app->tform->getCurrentTab(); + $server_id = $this->id; + + $server_config_array = $app->getconf->get_server_config($server_id); + $server_config_array[$section] = $app->tform->encode($this->dataRecord,$section); + $server_config_str = $app->ini_parser->get_ini_string($server_config_array); + + $sql = "UPDATE server SET config = '".$app->db->quote($server_config_str)."' WHERE server_id = ".$server_id; + $app->db->query($sql); + } + +} + +$app->tform_actions = new page_action; +$app->tform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/spamfilter_config_list.php b/interface/ispconfig/interface/mail/spamfilter_config_list.php new file mode 100644 index 0000000000000000000000000000000000000000..16cc359dca8bede5bf6f7a2ec3f5bb7c2c147eb9 --- /dev/null +++ b/interface/ispconfig/interface/mail/spamfilter_config_list.php @@ -0,0 +1,24 @@ +auth->check_module_permissions('mail'); + +$app->uses('listform_actions'); +//$app->listform_actions->SQLExtWhere = "wb = 'W'"; + +$app->listform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/spamfilter_policy_del.php b/interface/ispconfig/interface/mail/spamfilter_policy_del.php new file mode 100644 index 0000000000000000000000000000000000000000..04d15e07946cd9d3c9791bdd3235de62d151b202 --- /dev/null +++ b/interface/ispconfig/interface/mail/spamfilter_policy_del.php @@ -0,0 +1,51 @@ +auth->check_module_permissions('mail'); + +$app->uses("tform_actions"); +$app->tform_actions->onDelete(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/spamfilter_policy_edit.php b/interface/ispconfig/interface/mail/spamfilter_policy_edit.php new file mode 100644 index 0000000000000000000000000000000000000000..795b31b1543cb32af653185463a5bae289fb1c05 --- /dev/null +++ b/interface/ispconfig/interface/mail/spamfilter_policy_edit.php @@ -0,0 +1,95 @@ +auth->check_module_permissions('mail'); + +// Loading classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + function onShowNew() { + global $app, $conf; + + // we will check only users, not admins + if($_SESSION["s"]["user"]["typ"] == 'user') { + if(!$app->tform->checkClientLimit('limit_spamfilter_policy')) { + $app->error($app->tform->wordbook["limit_spamfilter_policy_txt"]); + } + if(!$app->tform->checkResellerLimit('limit_spamfilter_policy')) { + $app->error('Reseller: '.$app->tform->wordbook["limit_spamfilter_policy_txt"]); + } + } + + parent::onShowNew(); + } + + function onSubmit() { + global $app, $conf; + + // Check the client limits, if user is not the admin + if($_SESSION["s"]["user"]["typ"] != 'admin') { // if user is not admin + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_spamfilter_policy FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Check if the user may add another mailbox. + if($this->id == 0 && $client["limit_spamfilter_policy"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM spamfilter_policy WHERE sys_groupid = $client_group_id"); + if($tmp["number"] >= $client["limit_spamfilter_policy"]) { + $app->tform->errorMessage .= $app->tform->wordbook["limit_spamfilter_policy_txt"]."
    "; + } + unset($tmp); + } + } // end if user is not admin + + parent::onSubmit(); + } +} + +$app->tform_actions = new page_action; +$app->tform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/spamfilter_policy_list.php b/interface/ispconfig/interface/mail/spamfilter_policy_list.php new file mode 100644 index 0000000000000000000000000000000000000000..3d97b60cb701ee87e6f7af349fb78c75662ffc85 --- /dev/null +++ b/interface/ispconfig/interface/mail/spamfilter_policy_list.php @@ -0,0 +1,24 @@ +auth->check_module_permissions('mail'); + +$app->uses('listform_actions'); +//$app->listform_actions->SQLExtWhere = "wb = 'W'"; + +$app->listform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/spamfilter_users_del.php b/interface/ispconfig/interface/mail/spamfilter_users_del.php new file mode 100644 index 0000000000000000000000000000000000000000..9bc5e3154398da9d424c659d32466a9a244462a2 --- /dev/null +++ b/interface/ispconfig/interface/mail/spamfilter_users_del.php @@ -0,0 +1,51 @@ +auth->check_module_permissions('mail'); + +$app->uses("tform_actions"); +$app->tform_actions->onDelete(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/spamfilter_users_edit.php b/interface/ispconfig/interface/mail/spamfilter_users_edit.php new file mode 100644 index 0000000000000000000000000000000000000000..20ae7fe1c0b9f988a31fea554d516e5678a4d3f8 --- /dev/null +++ b/interface/ispconfig/interface/mail/spamfilter_users_edit.php @@ -0,0 +1,111 @@ +auth->check_module_permissions('mail'); + +// Loading classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + function onShowNew() { + global $app, $conf; + + // we will check only users, not admins + if($_SESSION["s"]["user"]["typ"] == 'user') { + if(!$app->tform->checkClientLimit('limit_spamfilter_user')) { + $app->error($app->tform->wordbook["limit_spamfilter_user_txt"]); + } + if(!$app->tform->checkResellerLimit('limit_spamfilter_user')) { + $app->error('Reseller: '.$app->tform->wordbook["limit_spamfilter_user_txt"]); + } + } + + parent::onShowNew(); + } + + function onBeforeUpdate() { + global $app, $conf; + + //* Check if the server has been changed + // We do this only for the admin or reseller users, as normal clients can not change the server ID anyway + if($_SESSION["s"]["user"]["typ"] == 'admin' || $app->auth->has_clients($_SESSION['s']['user']['userid'])) { + $rec = $app->db->queryOneRecord("SELECT server_id from spamfilter_users WHERE id = ".$this->id); + if($rec['server_id'] != $this->dataRecord["server_id"]) { + //* Add a error message and switch back to old server + $app->tform->errorMessage .= $app->lng('The Server can not be changed.'); + $this->dataRecord["server_id"] = $rec['server_id']; + } + unset($rec); + } + } + +function onSubmit() { + global $app, $conf; + + // Check the client limits, if user is not the admin + if($_SESSION["s"]["user"]["typ"] != 'admin') { // if user is not admin + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_spamfilter_user FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Check if the user may add another mailbox. + if($this->id == 0 && $client["limit_spamfilter_user"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM spamfilter_users WHERE sys_groupid = $client_group_id"); + if($tmp["number"] >= $client["limit_spamfilter_user"]) { + $app->tform->errorMessage .= $app->tform->wordbook["limit_spamfilter_user_txt"]."
    "; + } + unset($tmp); + } + } // end if user is not admin + + parent::onSubmit(); + } +} + +$app->tform_actions = new page_action; +$app->tform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/spamfilter_users_list.php b/interface/ispconfig/interface/mail/spamfilter_users_list.php new file mode 100644 index 0000000000000000000000000000000000000000..9d4ea2103a484acf02ae9c09d0dc3b82090c854c --- /dev/null +++ b/interface/ispconfig/interface/mail/spamfilter_users_list.php @@ -0,0 +1,24 @@ +auth->check_module_permissions('mail'); + +$app->uses('listform_actions'); +//$app->listform_actions->SQLExtWhere = "wb = 'W'"; + +$app->listform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/spamfilter_whitelist_del.php b/interface/ispconfig/interface/mail/spamfilter_whitelist_del.php new file mode 100644 index 0000000000000000000000000000000000000000..b7e2e36ac884bc678cf06a3e72989cdaa0a8ec67 --- /dev/null +++ b/interface/ispconfig/interface/mail/spamfilter_whitelist_del.php @@ -0,0 +1,51 @@ +auth->check_module_permissions('mail'); + +$app->uses("tform_actions"); +$app->tform_actions->onDelete(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/spamfilter_whitelist_edit.php b/interface/ispconfig/interface/mail/spamfilter_whitelist_edit.php new file mode 100644 index 0000000000000000000000000000000000000000..ddef3ae0801ba904632ed8baf91345b6c74d1cba --- /dev/null +++ b/interface/ispconfig/interface/mail/spamfilter_whitelist_edit.php @@ -0,0 +1,119 @@ +auth->check_module_permissions('mail'); + +// Loading classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + function onShowNew() { + global $app, $conf; + + // we will check only users, not admins + if($_SESSION["s"]["user"]["typ"] == 'user') { + if(!$app->tform->checkClientLimit('limit_spamfilter_wblist')) { + $app->error($app->tform->wordbook["limit_spamfilter_wblist_txt"]); + } + if(!$app->tform->checkResellerLimit('limit_spamfilter_wblist')) { + $app->error('Reseller: '.$app->tform->wordbook["limit_spamfilter_wblist_txt"]); + } + } + + parent::onShowNew(); + } + + /* + function onBeforeUpdate() { + global $app, $conf; + + //* Check if the server has been changed + // We do this only for the admin or reseller users, as normal clients can not change the server ID anyway + if($_SESSION["s"]["user"]["typ"] == 'admin' || $app->auth->has_clients($_SESSION['s']['user']['userid'])) { + $rec = $app->db->queryOneRecord("SELECT server_id from spamfilter_wblist WHERE id = ".$this->id); + if($rec['server_id'] != $this->dataRecord["server_id"]) { + //* Add a error message and switch back to old server + $app->tform->errorMessage .= $app->lng('The Server can not be changed.'); + $this->dataRecord["server_id"] = $rec['server_id']; + } + unset($rec); + } + } + */ + + function onSubmit() { + global $app, $conf; + + // Check the client limits, if user is not the admin + if($_SESSION["s"]["user"]["typ"] != 'admin') { // if user is not admin + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_spamfilter_wblist FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Check if the user may add another mailbox. + if($this->id == 0 && $client["limit_spamfilter_wblist"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(wblist_id) as number FROM spamfilter_wblist WHERE sys_groupid = $client_group_id"); + if($tmp["number"] >= $client["limit_spamfilter_wblist"]) { + $app->tform->errorMessage .= $app->tform->wordbook["limit_spamfilter_wblist_txt"]."
    "; + } + unset($tmp); + } + } // end if user is not admin + + // Select and set the server_id so it matches the server_id of the spa,filter_users record + $tmp = $app->db->queryOneRecord("SELECT server_id FROM spamfilter_users WHERE id = ".intval($this->dataRecord["rid"])); + $this->dataRecord["server_id"] = $tmp["server_id"]; + unset($tmp); + + + parent::onSubmit(); + } +} + +$app->tform_actions = new page_action; +$app->tform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/spamfilter_whitelist_list.php b/interface/ispconfig/interface/mail/spamfilter_whitelist_list.php new file mode 100644 index 0000000000000000000000000000000000000000..5944ee07e30c7c7ac2a508337ca29d6142c88be2 --- /dev/null +++ b/interface/ispconfig/interface/mail/spamfilter_whitelist_list.php @@ -0,0 +1,24 @@ +auth->check_module_permissions('mail'); + +$app->uses('listform_actions'); +$app->listform_actions->SQLExtWhere = "wb = 'W'"; + +$app->listform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/templates/mail_alias_edit.htm b/interface/ispconfig/interface/mail/templates/mail_alias_edit.htm new file mode 100644 index 0000000000000000000000000000000000000000..cfa724b7b8183cc17c7e3d0b5efdd5817ccc60c8 --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/mail_alias_edit.htm @@ -0,0 +1,39 @@ +

    +

    + +
    + +
    +
    +
    +

    * {tmpl_var name='email_txt'}

    +
    + + + +
    +
    +
    + + +
    +
    +

    {tmpl_var name='active_txt'}

    +
    + {tmpl_var name='active'} +
    +
    +
    + + + + +
    + + +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/mail_alias_list.htm b/interface/ispconfig/interface/mail/templates/mail_alias_list.htm new file mode 100644 index 0000000000000000000000000000000000000000..489e5af7748478bef0b118c10013ed6b6686bf76 --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/mail_alias_list.htm @@ -0,0 +1,57 @@ +

    +

    + +
    + +
    +
    {tmpl_var name="toolsarea_head_txt"} +
    + +
    +
    +
    + +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
     
    {tmpl_var name="active"}{tmpl_var name="source"}{tmpl_var name="destination"} + +
    + +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/mail_aliasdomain_edit.htm b/interface/ispconfig/interface/mail/templates/mail_aliasdomain_edit.htm new file mode 100644 index 0000000000000000000000000000000000000000..53fd3e33130d98457f03abb895ce3aa2bfe3841b --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/mail_aliasdomain_edit.htm @@ -0,0 +1,37 @@ +

    +

    + +
    + +
    +
    +
    + + +
    +
    + + +
    +
    +

    {tmpl_var name='active_txt'}

    +
    + {tmpl_var name='active'} +
    +
    +
    + + + + +
    + + +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/mail_aliasdomain_list.htm b/interface/ispconfig/interface/mail/templates/mail_aliasdomain_list.htm new file mode 100644 index 0000000000000000000000000000000000000000..8761af0837e669718441d51b9eaaecb27c0956f3 --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/mail_aliasdomain_list.htm @@ -0,0 +1,57 @@ +

    +

    + +
    + +
    +
    {tmpl_var name="toolsarea_head_txt"} +
    + +
    +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
     
    {tmpl_var name="active"}{tmpl_var name="source"}{tmpl_var name="destination"} + +
    +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/mail_blacklist_edit.htm b/interface/ispconfig/interface/mail/templates/mail_blacklist_edit.htm new file mode 100644 index 0000000000000000000000000000000000000000..e64fe2d5da009120196fac32fcf47c19321c31c7 --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/mail_blacklist_edit.htm @@ -0,0 +1,41 @@ +

    +

    + +
    + +
    +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    +

    {tmpl_var name='active_txt'}

    +
    + {tmpl_var name='active'} +
    +
    +
    + + + + +
    + + +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/mail_blacklist_list.htm b/interface/ispconfig/interface/mail/templates/mail_blacklist_list.htm new file mode 100644 index 0000000000000000000000000000000000000000..d2f37856ac7d1e012190b6991a4d5da288a9d08d --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/mail_blacklist_list.htm @@ -0,0 +1,60 @@ +

    +

    + +
    + +
    +
    {tmpl_var name="toolsarea_head_txt"} +
    + +
    +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
     
    {tmpl_var name="active"}{tmpl_var name="server_id"}{tmpl_var name="source"}{tmpl_var name="type"} + +
    +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/mail_content_filter_edit.htm b/interface/ispconfig/interface/mail/templates/mail_content_filter_edit.htm new file mode 100644 index 0000000000000000000000000000000000000000..ffe844e8d2462141db6967b866e205e8b8168fac --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/mail_content_filter_edit.htm @@ -0,0 +1,50 @@ +

    +

    + +
    + +
    +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    +

    {tmpl_var name='active_txt'}

    +
    + {tmpl_var name='active'} +
    +
    +
    + + + +
    + + +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/mail_content_filter_list.htm b/interface/ispconfig/interface/mail/templates/mail_content_filter_list.htm new file mode 100644 index 0000000000000000000000000000000000000000..87150837d7f6538e3133ffcb7498084ad276b2c6 --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/mail_content_filter_list.htm @@ -0,0 +1,60 @@ +

    +

    + +
    + +
    +
    {tmpl_var name="toolsarea_head_txt"} +
    + +
    +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
     
    {tmpl_var name="active"}{tmpl_var name="server_id"}{tmpl_var name="pattern"}{tmpl_var name="action"} + +
    +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/mail_domain_catchall_edit.htm b/interface/ispconfig/interface/mail/templates/mail_domain_catchall_edit.htm new file mode 100644 index 0000000000000000000000000000000000000000..6970fbaee892f5d226068090d459d085add735c9 --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/mail_domain_catchall_edit.htm @@ -0,0 +1,38 @@ +

    +

    + +
    + +
    +
    +
    +

    {tmpl_var name='email_txt'}

    +
    + + +
    +
    +
    + + +
    +
    +

    {tmpl_var name='active_txt'}

    +
    + {tmpl_var name='active'} +
    +
    +
    + + + + +
    + + +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/mail_domain_catchall_list.htm b/interface/ispconfig/interface/mail/templates/mail_domain_catchall_list.htm new file mode 100644 index 0000000000000000000000000000000000000000..0ae6a3189ccfbb5c979fd721627d8f02ca1f51cd --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/mail_domain_catchall_list.htm @@ -0,0 +1,57 @@ +

    +

    + +
    + +
    +
    {tmpl_var name="toolsarea_head_txt"} +
    + +
    +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
     
    {tmpl_var name="active"}{tmpl_var name="source"}{tmpl_var name="destination"} + +
    +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/mail_domain_edit.htm b/interface/ispconfig/interface/mail/templates/mail_domain_edit.htm new file mode 100644 index 0000000000000000000000000000000000000000..f0dd1a4cc6b348343ac6d6bbc58fe9aa4467fbb8 --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/mail_domain_edit.htm @@ -0,0 +1,67 @@ +

    +

    + +
    + +
    +
    + +
    + + + + + + + + +
    +
    + + +
    +
    + + +
    + + +
    +
    + +
    + + +
    +
    + + +
    +
    +

    {tmpl_var name='active_txt'}

    +
    + {tmpl_var name='active'} +
    +
    +
    + + + + +
    + + +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/mail_domain_list.htm b/interface/ispconfig/interface/mail/templates/mail_domain_list.htm new file mode 100644 index 0000000000000000000000000000000000000000..fabeaad0dd0d68623eb9d01e2f7f5a6053707d0c --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/mail_domain_list.htm @@ -0,0 +1,57 @@ +

    +

    + +
    + +
    +
    {tmpl_var name="toolsarea_head_txt"} +
    + +
    +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
     
    {tmpl_var name="active"}{tmpl_var name="server_id"}{tmpl_var name="domain"} + +
    +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/mail_forward_edit.htm b/interface/ispconfig/interface/mail/templates/mail_forward_edit.htm new file mode 100644 index 0000000000000000000000000000000000000000..d64504f1cc32ab75bc12c92e720e849d367edcba --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/mail_forward_edit.htm @@ -0,0 +1,37 @@ +

    +

    + +
    + +
    +
    +
    +

    * {tmpl_var name='email_txt'}

    +
    + + + +
    +
    +
    + + +
    +
    +

    {tmpl_var name='active_txt'}

    +
    + {tmpl_var name='active'} +
    +
    +
    + + + + +
    + + +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/mail_forward_list.htm b/interface/ispconfig/interface/mail/templates/mail_forward_list.htm new file mode 100644 index 0000000000000000000000000000000000000000..833a433af23187454647f843a9dfcac8935fca6c --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/mail_forward_list.htm @@ -0,0 +1,57 @@ +

    +

    + +
    + +
    +
    {tmpl_var name="toolsarea_head_txt"} +
    + +
    +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
     
    {tmpl_var name="active"}{tmpl_var name="source"}{tmpl_var name="destination"} + +
    +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/mail_get_edit.htm b/interface/ispconfig/interface/mail/templates/mail_get_edit.htm new file mode 100644 index 0000000000000000000000000000000000000000..2da485e38d04d3ee07a06802c01356b33aa21a91 --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/mail_get_edit.htm @@ -0,0 +1,54 @@ +

    +

    + +
    + +
    +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    +

    {tmpl_var name='source_delete_txt'}

    +
    + {tmpl_var name='source_delete'} +
    +
    +
    + + +
    +
    +

    {tmpl_var name='active_txt'}

    +
    + {tmpl_var name='active'} +
    +
    +
    + + + +
    + + +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/mail_get_list.htm b/interface/ispconfig/interface/mail/templates/mail_get_list.htm new file mode 100644 index 0000000000000000000000000000000000000000..924aa31d656fd004144f5b159f44bf3332aa3c57 --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/mail_get_list.htm @@ -0,0 +1,63 @@ +

    +

    + +
    + +
    +
    {tmpl_var name="toolsarea_head_txt"} +
    + +
    +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
     
    {tmpl_var name="active"}{tmpl_var name="server_id"}{tmpl_var name="source_server"}{tmpl_var name="source_username"}{tmpl_var name="destination"} + +
    +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/mail_relay_recipient_edit.htm b/interface/ispconfig/interface/mail/templates/mail_relay_recipient_edit.htm new file mode 100644 index 0000000000000000000000000000000000000000..4d02075d4d888884e19cbd00f28b1f715795966c --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/mail_relay_recipient_edit.htm @@ -0,0 +1,35 @@ +

    +

    + +
    + +
    +
    Relay recipient +
    + + +
    +
    + + +
    +
    +

    {tmpl_var name='active_txt'}

    +
    + {tmpl_var name='active'} +
    +
    +
    + + + + +
    + + +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/mail_relay_recipient_list.htm b/interface/ispconfig/interface/mail/templates/mail_relay_recipient_list.htm new file mode 100644 index 0000000000000000000000000000000000000000..072e9f88778e130b58acbd9159259b1f3e85f75b --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/mail_relay_recipient_list.htm @@ -0,0 +1,55 @@ +

    + +
    + +
    +
    {tmpl_var name="toolsarea_head_txt"} +
    + +
    +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
     
    {tmpl_var name="active"}{tmpl_var name="server_id"}{tmpl_var name="source"} + +
    +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/mail_transport_edit.htm b/interface/ispconfig/interface/mail/templates/mail_transport_edit.htm new file mode 100644 index 0000000000000000000000000000000000000000..5f16db366232a0d3e0faf56f91a46c87cf0e1f68 --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/mail_transport_edit.htm @@ -0,0 +1,56 @@ +

    +

    + +
    + +
    +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    +

    {tmpl_var name='mx_txt'}

    +
    + +
    +
    +
    + + +
    +
    + + +
    +
    +

    {tmpl_var name='active_txt'}

    +
    + {tmpl_var name='active'} +
    +
    +
    + + + +
    + + +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/mail_transport_list.htm b/interface/ispconfig/interface/mail/templates/mail_transport_list.htm new file mode 100644 index 0000000000000000000000000000000000000000..ede0f231213b44cba5cdf12ca2d090e99f065f36 --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/mail_transport_list.htm @@ -0,0 +1,63 @@ +

    +

    + +
    + +
    +
    {tmpl_var name="toolsarea_head_txt"} +
    + +
    +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
     
    {tmpl_var name="active"}{tmpl_var name="server_id"}{tmpl_var name="domain"}{tmpl_var name="transport"}{tmpl_var name="sort_order"} + +
    +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/mail_user_autoresponder_edit.htm b/interface/ispconfig/interface/mail/templates/mail_user_autoresponder_edit.htm new file mode 100644 index 0000000000000000000000000000000000000000..594f2e416850ed361af0bc4a620ef5b97208a697 --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/mail_user_autoresponder_edit.htm @@ -0,0 +1,37 @@ +

    +

    + +
    + +
    +
    +
    + + +
    +
    +

    {tmpl_var name='autoresponder_txt'}

    +
    +
    +  {tmpl_var name='autoresponder_active'}
    +
    + +

    + + {tmpl_var name='autoresponder_start_date'} now

    + + + {tmpl_var name='autoresponder_end_date'} +
    +
    +
    + + + +
    + + +
    +
    + +
    \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/templates/mail_user_custom_rules_edit.htm b/interface/ispconfig/interface/mail/templates/mail_user_custom_rules_edit.htm new file mode 100644 index 0000000000000000000000000000000000000000..0ca1b3c6ec6e0612eff92b029e6e067a0cbe6f6f --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/mail_user_custom_rules_edit.htm @@ -0,0 +1,22 @@ +

    +

    + +
    + +
    +
    +
    + + +
    +
    + + + +
    + + +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/mail_user_filter_edit.htm b/interface/ispconfig/interface/mail/templates/mail_user_filter_edit.htm new file mode 100644 index 0000000000000000000000000000000000000000..8a99287fc73acfa823be402358f0e71e0663f863 --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/mail_user_filter_edit.htm @@ -0,0 +1,38 @@ +

    +

    + +
    + +
    +
    +
    + + +
    +
    + + + + +
    +
    + + + +
    +
    + + {tmpl_var name='active'} +
    +
    + + + + +
    + + +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/mail_user_filter_list.htm b/interface/ispconfig/interface/mail/templates/mail_user_filter_list.htm new file mode 100644 index 0000000000000000000000000000000000000000..22b3c23acd4ff6deecfbb2b18ded9559b24c8af8 --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/mail_user_filter_list.htm @@ -0,0 +1,45 @@ + +
    +
    {tmpl_var name="toolsarea_head_txt"} +
    + +
    +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
     
    {tmpl_var name="rulename"} + +
    +
    +
    diff --git a/interface/ispconfig/interface/mail/templates/mail_user_list.htm b/interface/ispconfig/interface/mail/templates/mail_user_list.htm new file mode 100644 index 0000000000000000000000000000000000000000..254fd8c12c98d4f37d3d305f14afdc90a5ab923e --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/mail_user_list.htm @@ -0,0 +1,58 @@ +

    +

    + +
    + +
    +
    {tmpl_var name="toolsarea_head_txt"} +
    + +
    +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
     
    {tmpl_var name="email"}{tmpl_var name="name"}{tmpl_var name="autoresponder"} + +
    +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/mail_user_mailbox_edit.htm b/interface/ispconfig/interface/mail/templates/mail_user_mailbox_edit.htm new file mode 100644 index 0000000000000000000000000000000000000000..80f142224ab1bf9303ea6579defa615e8cf04dfa --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/mail_user_mailbox_edit.htm @@ -0,0 +1,67 @@ +

    +

    + +
    + +
    +
    +
    + +   {tmpl_var name='name_optional_txt'} +
    +
    +

    * {tmpl_var name='email_txt'}

    +
    + + + +
    +
    +
    + + +
    +
    +

    {tmpl_var name='password_strength_txt'}

    +
    +

     

    +
    +
    + +

     MB

    +
    +
    + + +
    +
    +

    {tmpl_var name='postfix_txt'}

    +
    + {tmpl_var name='postfix'} +
    +
    +
    +

    {tmpl_var name='disableimap_txt'}

    +
    + {tmpl_var name='disableimap'} +
    +
    +
    +

    {tmpl_var name='disablepop3_txt'}

    +
    + {tmpl_var name='disablepop3'} +
    +
    +
    + + + +
    + + +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/mail_user_mailfilter_edit.htm b/interface/ispconfig/interface/mail/templates/mail_user_mailfilter_edit.htm new file mode 100644 index 0000000000000000000000000000000000000000..12a6f627bba66435cd35cb9edb6469066b64838b --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/mail_user_mailfilter_edit.htm @@ -0,0 +1,26 @@ +

    +

    + +
    + +
    +
    +
    +

    {tmpl_var name='move_junk_txt'}

    +
    + {tmpl_var name='move_junk'} +
    +
    +
    + + {tmpl_var name='filter_records'} + + + +
    + + +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/mail_user_stats_list.htm b/interface/ispconfig/interface/mail/templates/mail_user_stats_list.htm new file mode 100644 index 0000000000000000000000000000000000000000..47e4b07b67c62c37253a5d3dd0295512a9f978ef --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/mail_user_stats_list.htm @@ -0,0 +1,52 @@ +

    +

    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
     
    {tmpl_var name="email"}{tmpl_var name="this_month"} MB{tmpl_var name="last_month"} MB{tmpl_var name="this_year"} MB{tmpl_var name="last_year"} MB +
    +
    +
    +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/mail_whitelist_edit.htm b/interface/ispconfig/interface/mail/templates/mail_whitelist_edit.htm new file mode 100644 index 0000000000000000000000000000000000000000..d8e6b8b53bdd0f0d9e2e62ec47d9acc65db33356 --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/mail_whitelist_edit.htm @@ -0,0 +1,41 @@ +

    +

    + +
    + +
    +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    +

    {tmpl_var name='active_txt'}

    +
    + {tmpl_var name='active'} +
    +
    +
    + + + + +
    + + +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/mail_whitelist_list.htm b/interface/ispconfig/interface/mail/templates/mail_whitelist_list.htm new file mode 100644 index 0000000000000000000000000000000000000000..ad8a69a76f6822cc314f5682476a66a4e5eacfe1 --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/mail_whitelist_list.htm @@ -0,0 +1,60 @@ +

    +

    + +
    + +
    +
    {tmpl_var name="toolsarea_head_txt"} +
    + +
    +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
     
    {tmpl_var name="active"}{tmpl_var name="server_id"}{tmpl_var name="source"}{tmpl_var name="type"} + +
    +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/spamfilter_blacklist_edit.htm b/interface/ispconfig/interface/mail/templates/spamfilter_blacklist_edit.htm new file mode 100644 index 0000000000000000000000000000000000000000..36058d9a4c8a10d59d540bbc2c2f8c977a055327 --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/spamfilter_blacklist_edit.htm @@ -0,0 +1,49 @@ +

    +

    + +
    + +
    +
    + +
    + + +
    +
    + + +
    +
    + + +
    +
    +

    {tmpl_var name='active_txt'}

    +
    + {tmpl_var name='active'} +
    +
    +
    + + + + +
    + + +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/spamfilter_blacklist_list.htm b/interface/ispconfig/interface/mail/templates/spamfilter_blacklist_list.htm new file mode 100644 index 0000000000000000000000000000000000000000..5594044c4173e0159a728d70d36a1922d48317d8 --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/spamfilter_blacklist_list.htm @@ -0,0 +1,63 @@ +

    +

    + +
    + +
    +
    {tmpl_var name="toolsarea_head_txt"} +
    + +
    +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
     
    {tmpl_var name="active"}{tmpl_var name="server_id"}{tmpl_var name="priority"}{tmpl_var name="rid"}{tmpl_var name="email"} + +
    +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/spamfilter_config_getmail_edit.htm b/interface/ispconfig/interface/mail/templates/spamfilter_config_getmail_edit.htm new file mode 100644 index 0000000000000000000000000000000000000000..1bdb88675bb5c6f4ed8b3a86b505271d4848f198 --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/spamfilter_config_getmail_edit.htm @@ -0,0 +1,22 @@ +

    +

    + +
    + +
    +
    + + + + +
    + + + +
    + + +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/spamfilter_config_list.htm b/interface/ispconfig/interface/mail/templates/spamfilter_config_list.htm new file mode 100644 index 0000000000000000000000000000000000000000..0a6680a6f764bb87400f665f227ea7997e9458f6 --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/spamfilter_config_list.htm @@ -0,0 +1,51 @@ +

    +

    + +
    + +
    +
    {tmpl_var name="toolsarea_head_txt"} +
    + +
    +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
     
    {tmpl_var name="server_name"} + +
    +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/spamfilter_config_mail_edit.htm b/interface/ispconfig/interface/mail/templates/spamfilter_config_mail_edit.htm new file mode 100644 index 0000000000000000000000000000000000000000..3526589ab1d6918b387c7aea5647796af6609288 --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/spamfilter_config_mail_edit.htm @@ -0,0 +1,66 @@ +

    +

    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/spamfilter_config_server_edit.htm b/interface/ispconfig/interface/mail/templates/spamfilter_config_server_edit.htm new file mode 100644 index 0000000000000000000000000000000000000000..ac45009fd285f23f4338fbc2277c50f7b7a22760 --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/spamfilter_config_server_edit.htm @@ -0,0 +1,38 @@ +

    +

    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/spamfilter_other_edit.htm b/interface/ispconfig/interface/mail/templates/spamfilter_other_edit.htm new file mode 100644 index 0000000000000000000000000000000000000000..404067198daa2f6e86f192e0db47a1163eacb579 --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/spamfilter_other_edit.htm @@ -0,0 +1,80 @@ +

    +

    + +
    + +
    +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + + +
    + + +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/spamfilter_policy_edit.htm b/interface/ispconfig/interface/mail/templates/spamfilter_policy_edit.htm new file mode 100644 index 0000000000000000000000000000000000000000..b725df5fb379adb1b9567d354f254c1c3114d1eb --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/spamfilter_policy_edit.htm @@ -0,0 +1,64 @@ +

    +

    + +
    + +
    +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + + +
    + + +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/spamfilter_policy_list.htm b/interface/ispconfig/interface/mail/templates/spamfilter_policy_list.htm new file mode 100644 index 0000000000000000000000000000000000000000..276dd537b8f00753132332ffe04a6068176d3dd2 --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/spamfilter_policy_list.htm @@ -0,0 +1,63 @@ +

    +

    + +
    + +
    +
    {tmpl_var name="toolsarea_head_txt"} +
    + +
    +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
     
    {tmpl_var name="policy_name"}{tmpl_var name="virus_lover"}{tmpl_var name="spam_lover"}{tmpl_var name="banned_files_lover"}{tmpl_var name="bad_header_lover"} + +
    +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/spamfilter_quarantine_edit.htm b/interface/ispconfig/interface/mail/templates/spamfilter_quarantine_edit.htm new file mode 100644 index 0000000000000000000000000000000000000000..de33b33c8c5e26e197e0326c02e6370d3ae5dfaf --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/spamfilter_quarantine_edit.htm @@ -0,0 +1,44 @@ +

    +

    + +
    + +
    +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    + +
    + + + +
    + + +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/spamfilter_taglevel_edit.htm b/interface/ispconfig/interface/mail/templates/spamfilter_taglevel_edit.htm new file mode 100644 index 0000000000000000000000000000000000000000..aef98d3d249c83bbf9610b5d45b892db5df9a100 --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/spamfilter_taglevel_edit.htm @@ -0,0 +1,52 @@ +

    +

    + +
    + +
    +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + + +
    + + +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/spamfilter_users_edit.htm b/interface/ispconfig/interface/mail/templates/spamfilter_users_edit.htm new file mode 100644 index 0000000000000000000000000000000000000000..01d5699228b257e7eb931b027461aa8110ff54fe --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/spamfilter_users_edit.htm @@ -0,0 +1,50 @@ +

    +

    + +
    + +
    +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + + +
    + + +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/spamfilter_users_list.htm b/interface/ispconfig/interface/mail/templates/spamfilter_users_list.htm new file mode 100644 index 0000000000000000000000000000000000000000..f574327061a690f7e48589946972ff189a1d8bca --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/spamfilter_users_list.htm @@ -0,0 +1,63 @@ +

    +

    + +
    + +
    +
    {tmpl_var name="toolsarea_head_txt"} +
    + +
    +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
     
    {tmpl_var name="local"}{tmpl_var name="server_id"}{tmpl_var name="priority"}{tmpl_var name="policy_id"}{tmpl_var name="fullname"} + +
    +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/spamfilter_whitelist_edit.htm b/interface/ispconfig/interface/mail/templates/spamfilter_whitelist_edit.htm new file mode 100644 index 0000000000000000000000000000000000000000..3ef8f5fb2ff43d393011f3dbb02c946bf83d1419 --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/spamfilter_whitelist_edit.htm @@ -0,0 +1,49 @@ +

    +

    + +
    + +
    +
    + +
    + + +
    +
    + + +
    +
    + + +
    +
    +

    {tmpl_var name='active_txt'}

    +
    + {tmpl_var name='active'} +
    +
    +
    + + + + +
    + + +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/spamfilter_whitelist_list.htm b/interface/ispconfig/interface/mail/templates/spamfilter_whitelist_list.htm new file mode 100644 index 0000000000000000000000000000000000000000..e4c2b20bd749838c5beb4298cc7a3774b8638424 --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/spamfilter_whitelist_list.htm @@ -0,0 +1,63 @@ +

    +

    + +
    + +
    +
    {tmpl_var name="toolsarea_head_txt"} +
    + +
    +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
     
    {tmpl_var name="active"}{tmpl_var name="server_id"}{tmpl_var name="priority"}{tmpl_var name="rid"}{tmpl_var name="email"} + +
    +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/webmailer.php b/interface/ispconfig/interface/mail/webmailer.php new file mode 100644 index 0000000000000000000000000000000000000000..ee2ea381378561294c2ca2eb832b2e935d4fc680 --- /dev/null +++ b/interface/ispconfig/interface/mail/webmailer.php @@ -0,0 +1,68 @@ +auth->check_module_permissions('mail'); + +/* get the id of the mail (must be int!) */ +if (!isset($_GET['id'])){ + die ("No E-Mail selected!"); +} +$emailId = intval($_GET['id']); + +/* + * Get the data to connect to the database + */ +$dbData = $app->db->queryOneRecord("SELECT server_id FROM mail_user WHERE mailuser_id = " . $emailId); +$serverId = intval($dbData['server_id']); +if ($serverId == 0){ + die ("No E-Mail - Server found!"); +} + +$serverData = $app->db->queryOneRecord("SELECT server_name FROM server WHERE server_id = ".$serverId); + +$app->uses('getconf'); +$global_config = $app->getconf->get_global_config('mail'); + +if($global_config['webmail_url'] != '') { + header('Location:' . $global_config['webmail_url']); +} else { + +/* + * We only redirect to the login-form, so there is no need, to check any rights + */ + isset($_SERVER['HTTPS'])? $http = 'https' : $http = 'http'; + header('Location:' . $http . '://' . $serverData['server_name'] . '/webmail'); +} +exit; +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/monitor/datalog_del.php b/interface/ispconfig/interface/monitor/datalog_del.php new file mode 100644 index 0000000000000000000000000000000000000000..ab52f7b8a948cfd4166d71937abf9e5022b5afb6 --- /dev/null +++ b/interface/ispconfig/interface/monitor/datalog_del.php @@ -0,0 +1,51 @@ +auth->check_module_permissions('monitor'); + +$app->uses("tform_actions"); +$app->tform_actions->onDelete(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/monitor/datalog_list.php b/interface/ispconfig/interface/monitor/datalog_list.php new file mode 100644 index 0000000000000000000000000000000000000000..2a6bf42579658af39f1f80d6a700bb4e222345bf --- /dev/null +++ b/interface/ispconfig/interface/monitor/datalog_list.php @@ -0,0 +1,64 @@ +auth->check_module_permissions('monitor'); + +$app->uses('listform_actions'); + +$servers = $app->db->queryAllRecords("SELECT server_id, updated FROM server"); + +$sql = '('; +foreach($servers as $sv) { + $sql .= " (datalog_id > ".$sv['updated']." AND server_id = ".$sv['server_id'].") OR "; +} +$sql = substr($sql,0,-4); +$sql .= ')'; + +$app->listform_actions->SQLExtWhere = $sql; +$app->listform_actions->SQLOrderBy = "ORDER BY tstamp DESC, datalog_id DESC"; + +$app->listform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/monitor/lib/admin.conf.php b/interface/ispconfig/interface/monitor/lib/admin.conf.php new file mode 100644 index 0000000000000000000000000000000000000000..a45d4403455c5c46f438046f088398e241cbc3d9 --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/admin.conf.php @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/monitor/lib/lang/bg.lng b/interface/ispconfig/interface/monitor/lib/lang/bg.lng new file mode 100644 index 0000000000000000000000000000000000000000..5512e7e07f5591d15a8e4e25127121e2d61b36cb --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/bg.lng @@ -0,0 +1,138 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/bg_datalog_list.lng b/interface/ispconfig/interface/monitor/lib/lang/bg_datalog_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..8ad63ffd42b46c9c52357d5bcb5ef2f4e1cab9aa --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/bg_datalog_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/bg_syslog_list.lng b/interface/ispconfig/interface/monitor/lib/lang/bg_syslog_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..00da5abc7bf7d0ccecbc908db94a12b61b6baa91 --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/bg_syslog_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/br.lng b/interface/ispconfig/interface/monitor/lib/lang/br.lng new file mode 100644 index 0000000000000000000000000000000000000000..c0b781a897e44155ad6592d77fe6f603e80fd997 --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/br.lng @@ -0,0 +1,138 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/br_datalog_list.lng b/interface/ispconfig/interface/monitor/lib/lang/br_datalog_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..04fdf24158ba75f8efa7c2cf6f9f81ac64e75fd5 --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/br_datalog_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/br_syslog_list.lng b/interface/ispconfig/interface/monitor/lib/lang/br_syslog_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..23f3c6d5daf43245f060b7de39004ede9e1895d4 --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/br_syslog_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/de.lng b/interface/ispconfig/interface/monitor/lib/lang/de.lng new file mode 100644 index 0000000000000000000000000000000000000000..b600d280620aee6dbad0142c56c16a594a87ef9d --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/de.lng @@ -0,0 +1,138 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/de_datalog_list.lng b/interface/ispconfig/interface/monitor/lib/lang/de_datalog_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..0b6bf9a4bb65f86a0eda057b6648c58da9848c28 --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/de_datalog_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/de_syslog_list.lng b/interface/ispconfig/interface/monitor/lib/lang/de_syslog_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..bd879a0061baa5604050353707532a800858eb00 --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/de_syslog_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/en.lng b/interface/ispconfig/interface/monitor/lib/lang/en.lng new file mode 100644 index 0000000000000000000000000000000000000000..a28cf0924532d37338a60f5a2e4fc9d0e9a8a142 --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/en.lng @@ -0,0 +1,138 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/en_datalog_list.lng b/interface/ispconfig/interface/monitor/lib/lang/en_datalog_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..1cb7f590e7fa26546e5eda345e5006df3daa7cdc --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/en_datalog_list.lng @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/monitor/lib/lang/en_syslog_list.lng b/interface/ispconfig/interface/monitor/lib/lang/en_syslog_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..96c1322bdc36fa75fba75d3ea0f2b7db8968f087 --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/en_syslog_list.lng @@ -0,0 +1,7 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/monitor/lib/lang/es.lng b/interface/ispconfig/interface/monitor/lib/lang/es.lng new file mode 100644 index 0000000000000000000000000000000000000000..63363bcc8ade696ae9571555e5c91a6c14aacf4d --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/es.lng @@ -0,0 +1,138 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/es_datalog_list.lng b/interface/ispconfig/interface/monitor/lib/lang/es_datalog_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..38f384f589f348795b5101085b6b30fdc74f53ec --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/es_datalog_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/es_syslog_list.lng b/interface/ispconfig/interface/monitor/lib/lang/es_syslog_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..17f89f201961af1c1320d8cbe2636f9d9af1dc4e --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/es_syslog_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/fi.lng b/interface/ispconfig/interface/monitor/lib/lang/fi.lng new file mode 100644 index 0000000000000000000000000000000000000000..6b3978da0149aad998e17ce68cae9493f5af3401 --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/fi.lng @@ -0,0 +1,138 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/fi_datalog_list.lng b/interface/ispconfig/interface/monitor/lib/lang/fi_datalog_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..eb26582613b834c8cf809b811b133866cb00d676 --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/fi_datalog_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/fi_syslog_list.lng b/interface/ispconfig/interface/monitor/lib/lang/fi_syslog_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..54aaa4e30695755e5408424a15ccc36a2434f05b --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/fi_syslog_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/fr.lng b/interface/ispconfig/interface/monitor/lib/lang/fr.lng new file mode 100644 index 0000000000000000000000000000000000000000..a322c4f6e961cc8c0e05d8bb4354df745a7e561b --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/fr.lng @@ -0,0 +1,138 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/fr_datalog_list.lng b/interface/ispconfig/interface/monitor/lib/lang/fr_datalog_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..e47b9f09e6c0631c039d7e3652bff5c92891159e --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/fr_datalog_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/fr_syslog_list.lng b/interface/ispconfig/interface/monitor/lib/lang/fr_syslog_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..00da5abc7bf7d0ccecbc908db94a12b61b6baa91 --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/fr_syslog_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/hu.lng b/interface/ispconfig/interface/monitor/lib/lang/hu.lng new file mode 100644 index 0000000000000000000000000000000000000000..8135d99c59c7634763721fe9a4a016ec41f1fcb6 --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/hu.lng @@ -0,0 +1,138 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/hu_datalog_list.lng b/interface/ispconfig/interface/monitor/lib/lang/hu_datalog_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..a88ef9214056a7edc60b6d9e64a8a863956ff0a3 --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/hu_datalog_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/hu_syslog_list.lng b/interface/ispconfig/interface/monitor/lib/lang/hu_syslog_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..d306d66be88871bcf3eb04f0bab2f38d504e1d4c --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/hu_syslog_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/it.lng b/interface/ispconfig/interface/monitor/lib/lang/it.lng new file mode 100644 index 0000000000000000000000000000000000000000..a898c7dbbe0a7f01c03831ad2c4bcd64fc1e94c2 --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/it.lng @@ -0,0 +1,138 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/it_datalog_list.lng b/interface/ispconfig/interface/monitor/lib/lang/it_datalog_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..740dff161e891e844895055dc39a3416749b8048 --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/it_datalog_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/it_syslog_list.lng b/interface/ispconfig/interface/monitor/lib/lang/it_syslog_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..3b372ec0f817d3db27df79381951be6433170773 --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/it_syslog_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/ja.lng b/interface/ispconfig/interface/monitor/lib/lang/ja.lng new file mode 100644 index 0000000000000000000000000000000000000000..b08f3b258f87115594385eafdfb231996aa3899f --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/ja.lng @@ -0,0 +1,138 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/ja_datalog_list.lng b/interface/ispconfig/interface/monitor/lib/lang/ja_datalog_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..c1f136dae13e066b60598673e9e5859f927a2204 --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/ja_datalog_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/ja_syslog_list.lng b/interface/ispconfig/interface/monitor/lib/lang/ja_syslog_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..598b8d451a841ed13be696f3fc870225621660c4 --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/ja_syslog_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/nl.lng b/interface/ispconfig/interface/monitor/lib/lang/nl.lng new file mode 100644 index 0000000000000000000000000000000000000000..3315572688117af6c990a092a48a21672e8ef761 --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/nl.lng @@ -0,0 +1,138 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/nl_datalog_list.lng b/interface/ispconfig/interface/monitor/lib/lang/nl_datalog_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..87e01c2a235f5b675f12e1611029f58ce907af49 --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/nl_datalog_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/nl_syslog_list.lng b/interface/ispconfig/interface/monitor/lib/lang/nl_syslog_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..90a685f68bda0a5235598cc00ed78c811e951674 --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/nl_syslog_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/pl.lng b/interface/ispconfig/interface/monitor/lib/lang/pl.lng new file mode 100644 index 0000000000000000000000000000000000000000..8ffd2983113c246125bad4623ed4c22c0ba4c1d4 --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/pl.lng @@ -0,0 +1,138 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/pl_datalog_list.lng b/interface/ispconfig/interface/monitor/lib/lang/pl_datalog_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..398ca51eddc2d3e6b5f98259a57a6f0f315f4dd7 --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/pl_datalog_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/pl_syslog_list.lng b/interface/ispconfig/interface/monitor/lib/lang/pl_syslog_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..125494bf8c60c592c6c5e2b4692138e3e4e0383c --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/pl_syslog_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/pt.lng b/interface/ispconfig/interface/monitor/lib/lang/pt.lng new file mode 100644 index 0000000000000000000000000000000000000000..6720285f44e3e7bb9fce91230cddb4ac949cf871 --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/pt.lng @@ -0,0 +1,139 @@ + + diff --git a/interface/ispconfig/interface/monitor/lib/lang/pt_datalog_list.lng b/interface/ispconfig/interface/monitor/lib/lang/pt_datalog_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..655e1e3f576f9b7dabbba68fc03260ca8eeeed18 --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/pt_datalog_list.lng @@ -0,0 +1,9 @@ + + diff --git a/interface/ispconfig/interface/monitor/lib/lang/pt_syslog_list.lng b/interface/ispconfig/interface/monitor/lib/lang/pt_syslog_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..f8ff04ce03d25af283d799c48242dd610dbdf157 --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/pt_syslog_list.lng @@ -0,0 +1,8 @@ + + diff --git a/interface/ispconfig/interface/monitor/lib/lang/ro.lng b/interface/ispconfig/interface/monitor/lib/lang/ro.lng new file mode 100644 index 0000000000000000000000000000000000000000..a28cf0924532d37338a60f5a2e4fc9d0e9a8a142 --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/ro.lng @@ -0,0 +1,138 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/ro_datalog_list.lng b/interface/ispconfig/interface/monitor/lib/lang/ro_datalog_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..35c79acbb6c5071f5bc5b7515642631226240b12 --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/ro_datalog_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/ro_syslog_list.lng b/interface/ispconfig/interface/monitor/lib/lang/ro_syslog_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..572095d8da102edfb955ff717d338980956f4dea --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/ro_syslog_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/ru.lng b/interface/ispconfig/interface/monitor/lib/lang/ru.lng new file mode 100644 index 0000000000000000000000000000000000000000..a4eb13148c3b6f13ecb2a71d861116e3e1db188e --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/ru.lng @@ -0,0 +1,139 @@ + + diff --git a/interface/ispconfig/interface/monitor/lib/lang/ru_datalog_list.lng b/interface/ispconfig/interface/monitor/lib/lang/ru_datalog_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..1ad3c88e9ef7549ec56328cb5310e75605a0c91a --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/ru_datalog_list.lng @@ -0,0 +1,9 @@ + + diff --git a/interface/ispconfig/interface/monitor/lib/lang/ru_syslog_list.lng b/interface/ispconfig/interface/monitor/lib/lang/ru_syslog_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..e940f1aafbbbb5269b4abf48b2e1f6c3ee01798e --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/ru_syslog_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/se.lng b/interface/ispconfig/interface/monitor/lib/lang/se.lng new file mode 100644 index 0000000000000000000000000000000000000000..499f62cb5f62812ce9990876454dcf5cd9c906bf --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/se.lng @@ -0,0 +1,138 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/se_datalog_list.lng b/interface/ispconfig/interface/monitor/lib/lang/se_datalog_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..8ad63ffd42b46c9c52357d5bcb5ef2f4e1cab9aa --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/se_datalog_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/se_syslog_list.lng b/interface/ispconfig/interface/monitor/lib/lang/se_syslog_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..00da5abc7bf7d0ccecbc908db94a12b61b6baa91 --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/se_syslog_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/sk.lng b/interface/ispconfig/interface/monitor/lib/lang/sk.lng new file mode 100644 index 0000000000000000000000000000000000000000..4f84e6c38a8879a784162fe0586461d795463521 --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/sk.lng @@ -0,0 +1,138 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/sk_datalog_list.lng b/interface/ispconfig/interface/monitor/lib/lang/sk_datalog_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..98997242fe81b23c5f1fd0a60bfb08dcfdc04e35 --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/sk_datalog_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/sk_syslog_list.lng b/interface/ispconfig/interface/monitor/lib/lang/sk_syslog_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..6a28f385421c88f59431f8a797ccbaa2c23da85e --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/sk_syslog_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/tr.lng b/interface/ispconfig/interface/monitor/lib/lang/tr.lng new file mode 100644 index 0000000000000000000000000000000000000000..3a375a2333228df2ed1220366590c877105bfbed --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/tr.lng @@ -0,0 +1,138 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/tr_datalog_list.lng b/interface/ispconfig/interface/monitor/lib/lang/tr_datalog_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..8752c6ba99b26ccaccd6af5d8a263519739d1470 --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/tr_datalog_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/tr_syslog_list.lng b/interface/ispconfig/interface/monitor/lib/lang/tr_syslog_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..32346de9f57a20f82ebefcb6309d2e418932f919 --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/tr_syslog_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/module.conf.php b/interface/ispconfig/interface/monitor/lib/module.conf.php new file mode 100644 index 0000000000000000000000000000000000000000..5161ba8348e6f1a887de97c3c7b5a60a84f91ae5 --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/module.conf.php @@ -0,0 +1,160 @@ + "Show Overview", + 'target' => 'content', + 'link' => 'monitor/show_sys_state.php?state=system'); + +$items[] = array( 'title' => "Show System-Log", + 'target' => 'content', + 'link' => 'monitor/log_list.php'); + +$items[] = array( 'title' => 'Show Jobqueue', + 'target' => 'content', + 'link' => 'monitor/datalog_list.php'); + +$module["nav"][] = array( 'title' => 'System State (All Servers)', + 'open' => 1, + 'items' => $items); + + +/* + We need all the available servers on the left navigation. + So fetch them from the database and add then to the navigation as dropdown-list +*/ + +$servers = $app->db->queryAllRecords("SELECT server_id, server_name FROM server order by server_name"); + +$dropDown = ""; + +/* + Now add them as dropdown to the navigation + */ +unset($items); +$items[] = array( 'title' => $dropDown, + 'target' => '', // no action! + 'link' => ''); // no action! + +$module["nav"][] = array( 'title' => 'Server to Monitor', + 'open' => 1, + 'items' => $items); + +/* + The first Server at the list is the server first selected + */ +$_SESSION['monitor']['server_id'] = $servers[0]['server_id']; +$_SESSION['monitor']['server_name'] = $servers[0]['server_name']; + +/* + * Clear and set the Navigation-Items + */ +unset($items); + +$items[] = array( 'title' => "Show CPU info", + 'target' => 'content', + 'link' => 'monitor/show_data.php?type=cpu_info'); + +$module["nav"][] = array( 'title' => 'Hardware-Information', + 'open' => 1, + 'items' => $items); + +/* + * Clear and set the Navigation-Items + */ +unset($items); +$items[] = array( 'title' => "Show Overview", + 'target' => 'content', + 'link' => 'monitor/show_sys_state.php?state=server'); + +$items[] = array( 'title' => "Show Update State", + 'target' => 'content', + 'link' => 'monitor/show_data.php?type=system_update'); + +$items[] = array( 'title' => "Show RAID state", + 'target' => 'content', + 'link' => 'monitor/show_data.php?type=raid_state'); + +$items[] = array( 'title' => "Show Server load", + 'target' => 'content', + 'link' => 'monitor/show_data.php?type=server_load'); + +$items[] = array( 'title' => "Show Disk usage", + 'target' => 'content', + 'link' => 'monitor/show_data.php?type=disk_usage'); + +$items[] = array( 'title' => "Show Memory usage", + 'target' => 'content', + 'link' => 'monitor/show_data.php?type=mem_usage'); + +$items[] = array( 'title' => "Show Services", + 'target' => 'content', + 'link' => 'monitor/show_data.php?type=services'); + + +$module["nav"][] = array( 'title' => 'Server State', + 'open' => 1, + 'items' => $items); + +/* + * Clear and set the Navigation-Items + */ +unset($items); + +$items[] = array( 'title' => "Show Mail-Queue", + 'target' => 'content', + 'link' => 'monitor/show_data.php?type=mailq'); + +$items[] = array( 'title' => "Show Mail-Log", + 'target' => 'content', + 'link' => 'monitor/show_log.php?log=log_mail'); + +$items[] = array( 'title' => "Show Mail warn-Log", + 'target' => 'content', + 'link' => 'monitor/show_log.php?log=log_mail_warn'); + +$items[] = array( 'title' => "Show Mail err-Log", + 'target' => 'content', + 'link' => 'monitor/show_log.php?log=log_mail_err'); + +$items[] = array( 'title' => "Show System-Log", + 'target' => 'content', + 'link' => 'monitor/show_log.php?log=log_messages'); + +$items[] = array( 'title' => "Show ISPC Cron-Log", + 'target' => 'content', + 'link' => 'monitor/show_log.php?log=log_ispc_cron'); + +$items[] = array( 'title' => "Show Freshclam-Log", + 'target' => 'content', + 'link' => 'monitor/show_log.php?log=log_freshclam'); + +$items[] = array( 'title' => "Show Clamav-Log", + 'target' => 'content', + 'link' => 'monitor/show_log.php?log=log_clamav'); + +$items[] = array( 'title' => "Show RKHunter-Log", + 'target' => 'content', + 'link' => 'monitor/show_data.php?type=rkhunter'); + +$items[] = array( 'title' => "Show fail2ban-Log", + 'target' => 'content', + 'link' => 'monitor/show_data.php?type=fail2ban'); + +$module["nav"][] = array( 'title' => 'Logfiles', + 'open' => 1, + 'items' => $items); +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/monitor/list/datalog.list.php b/interface/ispconfig/interface/monitor/list/datalog.list.php new file mode 100644 index 0000000000000000000000000000000000000000..330e603f037c66fa5ab9ab2042ea9a938312d68a --- /dev/null +++ b/interface/ispconfig/interface/monitor/list/datalog.list.php @@ -0,0 +1,91 @@ + "tstamp", + 'datatype' => "DATETIME", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => ""); + + +$liste['item'][] = array( 'field' => 'server_id', + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'op' => 'like', + 'prefix' => '%', + 'suffix' => '%', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'width' => '', + 'value' => ''); + +$liste["item"][] = array( 'field' => "action", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array('i' => "Insert",'u' => "Update",'d' => "Delete")); + + +$liste["item"][] = array( 'field' => "dbtable", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/monitor/list/log.list.php b/interface/ispconfig/interface/monitor/list/log.list.php new file mode 100644 index 0000000000000000000000000000000000000000..12dad4a892380a169bf202899f6a6c32e35ddb16 --- /dev/null +++ b/interface/ispconfig/interface/monitor/list/log.list.php @@ -0,0 +1,90 @@ + "tstamp", + 'datatype' => "DATETIME", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => ""); + + +$liste['item'][] = array( 'field' => 'server_id', + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'op' => 'like', + 'prefix' => '%', + 'suffix' => '%', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'width' => '', + 'value' => ''); + +$liste["item"][] = array( 'field' => "loglevel", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array('0' => "Debug",'1' => "Warning",'2' => "Error")); + + +$liste["item"][] = array( 'field' => "message", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/monitor/log_del.php b/interface/ispconfig/interface/monitor/log_del.php new file mode 100644 index 0000000000000000000000000000000000000000..1c33a21a2fa72a1b0ed82e277513499cfad4522b --- /dev/null +++ b/interface/ispconfig/interface/monitor/log_del.php @@ -0,0 +1,44 @@ +auth->check_module_permissions('monitor'); + +$syslog_id = intval($_GET['id']); +$app->db->query("UPDATE sys_log SET loglevel = 0 WHERE syslog_id = '$syslog_id'"); + +header('Location: log_list.php'); +exit; + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/monitor/log_list.php b/interface/ispconfig/interface/monitor/log_list.php new file mode 100644 index 0000000000000000000000000000000000000000..c0587c06a64ece05b80918a58b236b5cb3e823b3 --- /dev/null +++ b/interface/ispconfig/interface/monitor/log_list.php @@ -0,0 +1,55 @@ +auth->check_module_permissions('monitor'); + +$app->uses('listform_actions'); +//$app->listform_actions->SQLExtWhere = "wb = 'W'"; + +$app->listform_actions->SQLOrderBy = "ORDER BY tstamp DESC, syslog_id DESC"; + +$app->listform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/monitor/show_data.php b/interface/ispconfig/interface/monitor/show_data.php new file mode 100644 index 0000000000000000000000000000000000000000..cd3f00dd54a245ba8a8e135a28ad247dd7fbbfbd --- /dev/null +++ b/interface/ispconfig/interface/monitor/show_data.php @@ -0,0 +1,139 @@ +auth->check_module_permissions('monitor'); + + +/* Get the dataType to show */ +$dataType = $_GET["type"]; + +/* Get some translations */ +$monTransDate = $app->lng("monitor_settings_datafromdate_txt"); +$monTransSrv = $app->lng("monitor_settings_server_txt"); + + +$output = ''; + +switch($dataType) { + case 'server_load': + $template = 'templates/show_data.htm'; + $output .= showServerLoad(); + $time = getDataTime('server_load'); + $title = $app->lng("Server Load").' ('. $monTransSrv .' : ' . $_SESSION['monitor']['server_name'] . ')'; + $description = ''; + break; + case 'disk_usage': + $template = 'templates/show_data.htm'; + $output .= showDiskUsage(); + $time = getDataTime('disk_usage'); + $title = $app->lng("Disk usage").' ('. $monTransSrv .' : ' . $_SESSION['monitor']['server_name'] . ')'; + $description = ''; + break; + case 'mem_usage': + $template = 'templates/show_data.htm'; + $output .= showMemUsage(); + $time = getDataTime('mem_usage'); + $title = $app->lng("Memory usage").' ('. $monTransSrv .' : ' . $_SESSION['monitor']['server_name'] . ')'; + $description = ''; + break; + case 'cpu_info': + $template = 'templates/show_data.htm'; + $output .= showCpuInfo(); + $time = getDataTime('cpu_info'); + $title = $app->lng("monitor_title_cpuinfo_txt").' ('. $monTransSrv .' : ' . $_SESSION['monitor']['server_name'] . ')'; + $description = ''; + break; + case 'services': + $template = 'templates/show_data.htm'; + $output .= showServices(); + $time = getDataTime('services'); + $title = $app->lng("Status of services").' ('. $monTransSrv .' : ' . $_SESSION['monitor']['server_name'] . ')'; + $description = ''; + break; + case 'system_update': + $template = 'templates/show_data.htm'; + $output .= showSystemUpdate(); + $time = getDataTime('system_update'); + $title = $app->lng("monitor_title_updatestate_txt"). ' ('. $monTransSrv .' : ' . $_SESSION['monitor']['server_name'] . ')'; + $description = ''; + break; + case 'mailq': + $template = 'templates/show_data.htm'; + $output .= showMailq(); + $time = getDataTime('mailq'); + $title = $app->lng("monitor_title_mailq_txt"). ' ('. $monTransSrv .' : ' . $_SESSION['monitor']['server_name'] . ')'; + $description = ''; + break; + case 'raid_state': + $template = 'templates/show_data.htm'; + $output .= showRaidState(); + $time = getDataTime('raid_state'); + $title = $app->lng("monitor_title_raidstate_txt"). ' ('. $monTransSrv .' : ' . $_SESSION['monitor']['server_name'] . ')'; + $description = ''; + break; + case 'rkhunter': + $template = 'templates/show_data.htm'; + $output .= showRKHunter(); + $time = getDataTime('rkhunter'); + $title = $app->lng("monitor_title_rkhunterlog_txt"). ' ('. $monTransSrv .' : ' . $_SESSION['monitor']['server_name'] . ')'; + $description = ''; + break; + case 'fail2ban': + $template = 'templates/show_data.htm'; + $output .= showFail2ban(); + $time = getDataTime('log_fail2ban'); + $title = $app->lng("monitor_title_fail2ban_txt") . ' (' . $monTransSrv . ' : ' . $_SESSION['monitor']['server_name'] . ')'; + $description = ''; + break; + default: + $template = ''; + break; +} + + +// Loading the template +$app->uses('tpl'); +$app->tpl->newTemplate("form.tpl.htm"); +$app->tpl->setInclude('content_tpl', $template); + +$app->tpl->setVar("output", $output); +$app->tpl->setVar("list_head_txt", $title); +$app->tpl->setVar("list_desc_txt", $description); +$app->tpl->setVar("time", $time); +$app->tpl->setVar("monTransDate", $monTransDate); + +$app->tpl_defaults(); +$app->tpl->pparse(); +?> diff --git a/interface/ispconfig/interface/monitor/show_log.php b/interface/ispconfig/interface/monitor/show_log.php new file mode 100644 index 0000000000000000000000000000000000000000..d64eedce11028da0f4ce46bdac88192d98b90e22 --- /dev/null +++ b/interface/ispconfig/interface/monitor/show_log.php @@ -0,0 +1,143 @@ +auth->check_module_permissions('monitor'); + +// Loading the template +$app->uses('tpl'); +$app->tpl->newTemplate("form.tpl.htm"); +$app->tpl->setInclude('content_tpl','templates/show_log.htm'); + +// Importing the GET values +$refresh = (isset($_GET["refresh"]))?intval($_GET["refresh"]):0; +$logParam = $_GET["log"]; + +/* Get some translations */ +$monTransDate = $app->lng("monitor_settings_datafromdate_txt"); +$monTransSrv = $app->lng("monitor_settings_server_txt"); +$monTransRefreshsq = $app->lng("monitor_settings_refreshsq_txt"); + +/* + Setting the db-type and the caption + */ +switch($logParam) { + case 'log_mail': + $logId = 'log_mail'; + $title = $app->lng("monitor_logs_mail_txt").' ('. $monTransSrv .' : ' . $_SESSION['monitor']['server_name'] . ')'; + $description = ''; + break; + case 'log_mail_warn': + $logId = 'log_mail_warn'; + $title = $app->lng("monitor_logs_mailwarn_txt").' ('. $monTransSrv .' : ' . $_SESSION['monitor']['server_name'] . ')'; + $description = ''; + break; + case 'log_mail_err': + $logId = 'log_mail_err'; + $title = $app->lng("monitor_logs_mailerr_txt").' ('. $monTransSrv .' : ' . $_SESSION['monitor']['server_name'] . ')'; + $description = ''; + break; + case 'log_messages': + $logId = 'log_messages'; + $title = $app->lng("monitor_logs_messages_txt").' ('. $monTransSrv .' : ' . $_SESSION['monitor']['server_name'] . ')'; + $description = ''; + break; + case 'log_ispc_cron': + $logId = 'log_ispc_cron'; + $title = $app->lng("monitor_logs_ispccron_txt").' ('. $monTransSrv .' : ' . $_SESSION['monitor']['server_name'] . ')'; + $description = ''; + break; + case 'log_freshclam': + $logId = 'log_freshclam'; + $title = $app->lng("monitor_logs_freshclam_txt").' ('. $monTransSrv .' : ' . $_SESSION['monitor']['server_name'] . ')'; + $description = ''; + break; + case 'log_clamav': + $logId = 'log_clamav'; + $title = $app->lng("monitor_logs_clamav_txt").' ('. $monTransSrv .' : ' . $_SESSION['monitor']['server_name'] . ')'; + $description = ''; + break; + case 'log_ispconfig': + $logId = 'log_ispconfig'; + $title = $app->lng("monitor_logs_ispc_txt").' ('. $monTransSrv .' : ' . $_SESSION['monitor']['server_name'] . ')'; + $description = ''; + break; + default: + $logId = '???'; + $title = '???'; + $description = ''; + break; +} + + +/* + Creating the array with the refresh intervals + Attention: the core-moule ist triggered every 5 minutes, + so reload every 2 minutes is impossible! +*/ +$refresh_values = array('0' => '- '.$app->lng("No Refresh").' -','5' => '5 '.$app->lng("minutes"),'10' => '10 '.$app->lng("minutes"),'15' => '15 '.$app->lng("minutes"),'30' => '30 '.$app->lng("minutes"),'60' => '60 '.$app->lng("minutes")); +$tmp = ''; +foreach($refresh_values as $key => $val) { + if($key == $refresh) { + $tmp .= ""; + } else { + $tmp .= ""; + } +} +$app->tpl->setVar("refresh",$tmp); + + +/* fetch the Data from the DB */ +$record = $app->db->queryOneRecord("SELECT data, state FROM monitor_data WHERE type = '" . $app->db->quote($logId) . "' and server_id = " . $_SESSION['monitor']['server_id'] . " order by created desc"); + +if(isset($record['data'])) { + $data = unserialize($record['data']); + + $logData = nl2br($data); + + $app->tpl->setVar("log_data", $logData); +} else { + $app->tpl->setVar("log_data", $app->lng("no_logdata_txt")); +} + +$app->tpl->setVar("title", $title); +$app->tpl->setVar("log_id",$logId); +$app->tpl->setVar("description", $description); +$app->tpl->setVar("time", getDataTime($logId)); +$app->tpl->setVar("monTransDate", $monTransDate); +$app->tpl->setVar("monTransRefreshsq", $monTransRefreshsq); + +$app->tpl_defaults(); +$app->tpl->pparse(); +?> diff --git a/interface/ispconfig/interface/monitor/show_sys_state.php b/interface/ispconfig/interface/monitor/show_sys_state.php new file mode 100644 index 0000000000000000000000000000000000000000..75353ffad4b60c9153a0a133b9f129b21d8aec46 --- /dev/null +++ b/interface/ispconfig/interface/monitor/show_sys_state.php @@ -0,0 +1,508 @@ +auth->check_module_permissions('monitor'); + +/* Change the Server if needed */ +if (isset($_GET['server'])){ + $server = explode('|', $_GET['server'], 2); + $_SESSION['monitor']['server_id'] = $server[0]; + $_SESSION['monitor']['server_name'] = $server[1]; +} + +/* + * Loading the template + */ +$app->uses('tpl'); +$app->tpl->newTemplate("form.tpl.htm"); +$app->tpl->setInclude('content_tpl','templates/show_sys_state.htm'); + +/* Get some translations */ +$monTransRefreshsq = $app->lng("monitor_settings_refreshsq_txt"); + +/* + * setting the content + */ +if ($_GET['state'] == 'server') +{ + $output = _getServerState($_SESSION['monitor']['server_id'], $_SESSION['monitor']['server_name'], true); + $title = $app->lng("monitor_general_serverstate_txt"); + $stateType = 'server'; +} +else +{ + $output = _getSysState(); + $title = $app->lng("monitor_general_systemstate_txt"); + $stateType = 'system'; +} + +$app->tpl->setVar("state_data",$output); +$app->tpl->setVar("state_type",$stateType); +$app->tpl->setVar("list_head_txt",$title); +$app->tpl->setVar("list_desc_txt",$description); +$app->tpl->setVar("monTransRefreshsq", $monTransRefreshsq); + +/* + Creating the array with the refresh intervals + Attention: the core-module ist triggered every 5 minutes, + so reload every 2 minutes is impossible! +*/ +$refresh = (isset($_GET["refresh"]))?intval($_GET["refresh"]):0; + +$refresh_values = array('0' => '- '.$app->lng("No Refresh").' -','5' => '5 '.$app->lng("minutes"),'10' => '10 '.$app->lng("minutes"),'15' => '15 '.$app->lng("minutes"),'30' => '30 '.$app->lng("minutes"),'60' => '60 '.$app->lng("minutes")); +$tmp = ''; +foreach($refresh_values as $key => $val) { + if($key == $refresh) { + $tmp .= ""; + } else { + $tmp .= ""; + } +} +$app->tpl->setVar("refresh",$tmp); + +/* + * doing the output + */ +$app->tpl_defaults(); +$app->tpl->pparse(); + + +function _getSysState(){ + global $app; + + /* + * Get all Servers and calculate the state of them + */ + $html = ''; + + $servers = $app->db->queryAllRecords("SELECT server_id, server_name FROM server order by server_name"); + foreach ($servers as $server) + { + $html .= _getServerState($server['server_id'], $server['server_name'], false); + } + + return $html; +} + +/* + * Calculates the State of ONE Server + */ +function _getServerState($serverId, $serverName, $showAll) +{ + global $app; + + /* The State of the server */ + $serverState = 'ok'; + + /** The messages */ + $messages = array(); + + /** The Result of the function */ + $res = ''; + + /* + * get all monitoring-data from the server als process then + * (count them and set the server-state) + */ + $records = $app->db->queryAllRecords("SELECT DISTINCT type FROM monitor_data WHERE server_id = " . $serverId); + foreach($records as $record){ + _processDbState($record['type'], $serverId, &$serverState, &$messages); + } + + $res .= '
    '; + $res .= '
    '; + $res .= '
    '; + $res .= $app->lng("monitor_serverstate_server_txt") . ': ' . $serverName . '
    '; + $res .= $app->lng("monitor_serverstate_state_txt") . ': ' . $serverState . '
    '; + // $res .= sizeof($messages[$app->lng("monitor_serverstate_listok_txt")]) . ' ok | '; + $res .= sizeof($messages[$app->lng("monitor_serverstate_listunknown_txt")]) . ' ' . $app->lng("monitor_serverstate_unknown_txt") . ' | '; + $res .= sizeof($messages[$app->lng("monitor_serverstate_listinfo_txt")]) . ' ' . $app->lng("monitor_serverstate_info_txt") . ' | '; + $res .= sizeof($messages[$app->lng("monitor_serverstate_listwarning_txt")]) . ' ' . $app->lng("monitor_serverstate_warning_txt") . ' | '; + $res .= sizeof($messages[$app->lng("monitor_serverstate_listcritical_txt")]) . ' ' . $app->lng("monitor_serverstate_critical_txt") . ' | '; + $res .= sizeof($messages[$app->lng("monitor_serverstate_listerror_txt")]) . ' ' . $app->lng("monitor_serverstate_error_txt") . '
    '; + $res .= '
    '; + + if ($showAll){ + /* + * if we have to show all, then we do it... + */ + + /* + * Show all messages + */ + foreach($messages as $key => $state){ + /* + * There is no need, to show the "ok" - messages + */ +// if ($key != 'ok') + { + $res .= $key . ':
    '; + foreach ($state as $msg) + { + $res .= $msg . '
    '; + } + $res .= '
    '; + } + } + } + else + { + /* + * if not, we only show a link to the server... + */ + $res .= "" . $app->lng("monitor_serverstate_moreinfo_txt") . ""; + } + $res .= '
    '; + $res .= '
    '; + $res .= '
    '; + + if ($showAll){ + /* + * Show some state-info + */ + //$res .= showServerLoad(); + //$res .= ' '. showDiskUsage(); + //$res .= ' '.showServices(); + } + + + return $res; +} + +/* + * gets the state from the db and process it + */ +function _processDbState($type, $serverId, $serverState, $messages) +{ + global $app; + + /* + * Always the NEWEST record of each monitoring is responsible for the + * state + */ + // get the State from the DB + $record = $app->db->queryOneRecord("SELECT state FROM monitor_data WHERE type = '" . $type . "' and server_id = " . $serverId . " order by created desc"); + // change the new state to the highest state + $serverState = _setState($serverState, $record['state']); + + /* + * The message depands on the type and the state + */ + if ($type == 'cpu_info'){ + /* this type has no state */ + } + if ($type == 'disk_usage'){ + switch ($record['state']) { + case 'ok': + $messages[$app->lng("monitor_serverstate_listok_txt")][] = $app->lng("monitor_serverstate_hdok_txt") . ' ' . + "[" . $app->lng("monitor_serverstate_more_txt") . "]"; + break; + case 'info': + $messages[$app->lng("monitor_serverstate_listinfo_txt")][] = $app->lng("monitor_serverstate_hdgoingfull_txt") . ' ' . + "[" . $app->lng("monitor_serverstate_more_txt") . "]"; + break; + case 'warning': + $messages[$app->lng("monitor_serverstate_listwarning_txt")][] = $app->lng("monitor_serverstate_hdnearlyfull_txt") . ' ' . + "[" . $app->lng("monitor_serverstate_more_txt") . "]"; + break; + case 'critical': + $messages[$app->lng("monitor_serverstate_listcritical_txt")][] = $app->lng("monitor_serverstate_hdveryfull_txt") . ' ' . + "[" . $app->lng("monitor_serverstate_more_txt") . "]"; + break; + case 'error': + $messages[$app->lng("monitor_serverstate_listerror_txt")][] = $app->lng("monitor_serverstate_hdfull_txt") . ' ' . + "[" . $app->lng("monitor_serverstate_more_txt") . "]"; + break; + + default: + $messages[$app->lng("monitor_serverstate_listunknown_txt")][] = $app->lng("monitor_serverstate_hdunknown_txt") . ' ' . + "[" . $app->lng("monitor_serverstate_more_txt") . "]"; + break; + } + } + if ($type == 'mem_usage'){ + /* this type has no state */ + } + if ($type == 'server_load'){ + switch ($record['state']) { + case 'ok': + $messages[$app->lng("monitor_serverstate_listok_txt")][] = $app->lng("monitor_serverstate_loadok_txt") . ' ' . + "[" . $app->lng("monitor_serverstate_more_txt") . "]"; + break; + case 'info': + $messages[$app->lng("monitor_serverstate_listinfo_txt")][] = $app->lng("monitor_serverstate_loadheavy_txt") . ' ' . + "[" . $app->lng("monitor_serverstate_more_txt") . "]"; + break; + case 'warning': + $messages[$app->lng("monitor_serverstate_listwarning_txt")][] = $app->lng("monitor_serverstate_loadhigh_txt") . ' ' . + "[" . $app->lng("monitor_serverstate_more_txt") . "]"; + break; + case 'critical': + $messages[$app->lng("monitor_serverstate_listcritical_txt")][] = $app->lng("monitor_serverstate_loadhigher_txt") . ' ' . + "[" . $app->lng("monitor_serverstate_more_txt") . "]"; + break; + case 'error': + $messages[$app->lng("monitor_serverstate_listerror_txt")][] = $app->lng("monitor_serverstate_loadhighest_txt") . ' ' . + "[" . $app->lng("monitor_serverstate_more_txt") . "]"; + break; + default: + $messages[$app->lng("monitor_serverstate_listunknown_txt")][] = $app->lng("monitor_serverstate_loadunknown_txt") . ' ' . + "[" . $app->lng("monitor_serverstate_more_txt") . "]"; + break; + } + } + if ($type == 'services'){ + switch ($record['state']) { + case 'ok': + $messages[$app->lng("monitor_serverstate_listok_txt")][] = $app->lng("monitor_serverstate_servicesonline_txt") . ' ' . + "[" . $app->lng("monitor_serverstate_more_txt") . "]"; + + break; + case 'error': + $messages[$app->lng("monitor_serverstate_listerror_txt")][] = $app->lng("monitor_serverstate_servicesoffline_txt") . ' ' . + "[" . $app->lng("monitor_serverstate_more_txt") . "]"; + break; + default: + $messages[$app->lng("monitor_serverstate_listunknown_txt")][] = $app->lng("monitor_serverstate_servicesunknown_txt") . ' ' . + "[" . $app->lng("monitor_serverstate_more_txt") . "]"; + break; + } + } + if ($type == 'system_update'){ + switch ($record['state']) { + case 'ok': + $messages[$app->lng("monitor_serverstate_listok_txt")][] = $app->lng("monitor_serverstate_updatesok_txt") . ' ' . + "[" . $app->lng("monitor_serverstate_more_txt") . "]"; + + break; + case 'warning': + $messages[$app->lng("monitor_serverstate_listwarning_txt")][] = $app->lng("monitor_serverstate_updatesneeded_txt") . ' ' . + "[" . $app->lng("monitor_serverstate_more_txt") . "]"; + break; + case 'no_state': + /* + * not debian and not Ubuntu, so the state could not be monitored... + */ + break; + default: + $messages[$app->lng("monitor_serverstate_listunknown_txt")][] = $app->lng("monitor_serverstate_updatesunknown_txt") . ' ' . + "[" . $app->lng("monitor_serverstate_more_txt") . "]"; + break; + } + } + + if ($type == 'raid_state'){ + switch ($record['state']) { + case 'ok': + $messages[$app->lng("monitor_serverstate_listok_txt")][] = $app->lng("monitor_serverstate_raidok_txt") . ' ' . + "[" . $app->lng("monitor_serverstate_more_txt") . "]"; + break; + case 'info': + $messages[$app->lng("monitor_serverstate_listinfo_txt")][] = $app->lng("monitor_serverstate_raidresync_txt") . ' ' . + "[" . $app->lng("monitor_serverstate_more_txt") . "]"; + break; + case 'critical': + $messages[$app->lng("monitor_serverstate_listcritical_txt")][] = $app->lng("monitor_serverstate_raidfault_txt") . ' ' . + "[" . $app->lng("monitor_serverstate_more_txt") . "]"; + break; + case 'error': + $messages[$app->lng("monitor_serverstate_listerror_txt")][] = $app->lng("monitor_serverstate_raiderror_txt") . ' ' . + "[" . $app->lng("monitor_serverstate_more_txt") . "]"; + break; + case 'no_state': + /* + * mdadm is not installed or the RAID is not supported... + */ + break; + default: + $messages[$app->lng("monitor_serverstate_listunknown_txt")][] = $app->lng("monitor_serverstate_raidunknown_txt") . ' ' . + "[" . $app->lng("monitor_serverstate_more_txt") . "]"; + break; + } + } + + + if ($type == 'mailq'){ + switch ($record['state']) { + case 'ok': + $messages[$app->lng("monitor_serverstate_listok_txt")][] = $app->lng("monitor_serverstate_mailqok_txt") . ' ' . + "[" . $app->lng("monitor_serverstate_more_txt") . "]"; + break; + case 'info': + $messages[$app->lng("monitor_serverstate_listinfo_txt")][] = $app->lng("monitor_serverstate_mailqheavy_txt") . ' ' . + "[" . $app->lng("monitor_serverstate_more_txt") . "]"; + break; + case 'warning': + $messages[$app->lng("monitor_serverstate_listwarning_txt")][] = $app->lng("monitor_serverstate_mailqhigh_txt") . ' ' . + "[" . $app->lng("monitor_serverstate_more_txt") . "]"; + break; + case 'critical': + $messages[$app->lng("monitor_serverstate_listcritical_txt")][] = $app->lng("monitor_serverstate_mailqhigher_txt") . ' ' . + "[" . $app->lng("monitor_serverstate_more_txt") . "]"; + break; + case 'error': + $messages[$app->lng("monitor_serverstate_listerror_txt")][] = $app->lng("monitor_serverstate_mailqhighest_txt") . ' ' . + "[" . $app->lng("monitor_serverstate_more_txt") . "]"; + break; + default: + $messages[$app->lng("monitor_serverstate_listunknown_txt")][] = $app->lng("monitor_serverstate_mailqunknown_txt") . ' ' . + "[" . $app->lng("monitor_serverstate_more_txt") . "]"; + break; + } + } + + if ($type == 'sys_log'){ + switch ($record['state']) { + case 'ok': + $messages[$app->lng("monitor_serverstate_listok_txt")][] = $app->lng("monitor_serverstate_syslogok_txt") . ' ' . + "[" . $app->lng("monitor_serverstate_more_txt") . "]"; + break; + case 'warning': + $messages[$app->lng("monitor_serverstate_listwarning_txt")][] = $app->lng("monitor_serverstate_syslogwarning_txt") . ' ' . + "[" . $app->lng("monitor_serverstate_more_txt") . "]"; + break; + case 'error': + $messages[$app->lng("monitor_serverstate_listerror_txt")][] = $app->lng("monitor_serverstate_syslogerror_txt") . ' ' . + "[" . $app->lng("monitor_serverstate_more_txt") . "]"; + break; + default: + $messages[$app->lng("monitor_serverstate_listunknown_txt")][] = $app->lng("monitor_serverstate_syslogunknown_txt") . ' ' . + "[" . $app->lng("monitor_serverstate_more_txt") . "]"; + break; + } + } + + if ($type == 'log_clamav'){ + /* this type has no state */ + } + + if ($type == 'log_freshclam'){ + switch ($record['state']) { + case 'ok': + $messages[$app->lng("monitor_serverstate_listok_txt")][] = $app->lng("monitor_serverstate_fclamok_txt") . ' ' . + "[" . $app->lng("monitor_serverstate_more_txt") . "]"; + break; + case 'warning': + $messages[$app->lng("monitor_serverstate_listwarning_txt")][] = $app->lng("monitor_serverstate_fclamoutdated_txt") . ' ' . + "[" . $app->lng("monitor_serverstate_more_txt") . "]"; + break; + default: + $messages[$app->lng("monitor_serverstate_listunknown_txt")][] = $app->lng("monitor_serverstate_fclamunknown_txt") . ' ' . + "[" . $app->lng("monitor_serverstate_more_txt") . "]"; + break; + } + } + + if ($type == 'log_ispconfig'){ + /* this type has no state */ + } + if ($type == 'log_mail'){ + /* this type has no state */ + } + if ($type == 'log_mail_err'){ + /* this type has no state */ + } + if ($type == 'log_mail_warn'){ + /* this type has no state */ + } + if ($type == 'log_messages'){ + /* this type has no state */ + } + if ($type == 'rkhunter'){ + /* this type has no state */ + } +} + + /* + * Set the state to the given level (or higher, but not lesser). + * * If the actual state is critical and you call the method with ok, + * then the state is critical. + * + * * If the actual state is critical and you call the method with error, + * then the state is error. + */ +function _setState($oldState, $newState) +{ + /* + * Calculate the weight of the old state + */ + switch ($oldState) { + case 'no_state': $oldInt = 0; + break; + case 'ok': $oldInt = 1; + break; + case 'unknown': $oldInt = 2; + break; + case 'info': $oldInt = 3; + break; + case 'warning': $oldInt = 4; + break; + case 'critical': $oldInt = 5; + break; + case 'error': $oldInt = 6; + break; + } + /* + * Calculate the weight of the new state + */ + switch ($newState) { + case 'no_state': $newInt = 0 ; + break; + case 'ok': $newInt = 1 ; + break; + case 'unknown': $newInt = 2 ; + break; + case 'info': $newInt = 3 ; + break; + case 'warning': $newInt = 4 ; + break; + case 'critical': $newInt = 5 ; + break; + case 'error': $newInt = 6 ; + break; + } + + /* + * Set to the higher level + */ + if ($newInt > $oldInt){ + return $newState; + } + else + { + return $oldState; + } +} + +?> diff --git a/interface/ispconfig/interface/monitor/templates/datalog_list.htm b/interface/ispconfig/interface/monitor/templates/datalog_list.htm new file mode 100644 index 0000000000000000000000000000000000000000..93eede0574c5b3ada76e4397548435c83387aa56 --- /dev/null +++ b/interface/ispconfig/interface/monitor/templates/datalog_list.htm @@ -0,0 +1,49 @@ +

    +

    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
     
     
    {tmpl_var name="tstamp"}{tmpl_var name="server_id"}{tmpl_var name="action"}{tmpl_var name="dbtable"} +
    + +
    +
    +
    +
    + +
    diff --git a/interface/ispconfig/interface/monitor/templates/show_data.htm b/interface/ispconfig/interface/monitor/templates/show_data.htm new file mode 100644 index 0000000000000000000000000000000000000000..f83440fe46364f905453a27fb341974e522e184b --- /dev/null +++ b/interface/ispconfig/interface/monitor/templates/show_data.htm @@ -0,0 +1,12 @@ +

    +

    + +
    + +
    +
    +
    +
    +
    + +
    diff --git a/interface/ispconfig/interface/monitor/templates/show_log.htm b/interface/ispconfig/interface/monitor/templates/show_log.htm new file mode 100644 index 0000000000000000000000000000000000000000..b6077277cdb656d06c34b3bcbce2b778585536b6 --- /dev/null +++ b/interface/ispconfig/interface/monitor/templates/show_log.htm @@ -0,0 +1,25 @@ +

    +

    + +
    + +
    +
    +
    +
    + + +
    +
    +
    +
    + +
    +
    +
    +
    +
    + +
    diff --git a/interface/ispconfig/interface/monitor/templates/show_sys_state.htm b/interface/ispconfig/interface/monitor/templates/show_sys_state.htm new file mode 100644 index 0000000000000000000000000000000000000000..904361cb1f410d0bc831c0da72fab229edc35f1d --- /dev/null +++ b/interface/ispconfig/interface/monitor/templates/show_sys_state.htm @@ -0,0 +1,25 @@ +

    +

    + +
    + +
    +
    +
    +
    + + +
    +
    +
    +
    + +
    +
    +
    +
    +
    + +
    diff --git a/interface/ispconfig/interface/monitor/templates/syslog_list.htm b/interface/ispconfig/interface/monitor/templates/syslog_list.htm new file mode 100644 index 0000000000000000000000000000000000000000..0bbb03cfbc5e5a7ee015a04bf9786f303d7ab918 --- /dev/null +++ b/interface/ispconfig/interface/monitor/templates/syslog_list.htm @@ -0,0 +1,56 @@ +

    +

    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
     
     
    {tmpl_var name="tstamp"}{tmpl_var name="server_id"}{tmpl_var name="loglevel"}{tmpl_var name="message"} + + + + + + +
    +
    +
    + +
    diff --git a/interface/ispconfig/interface/monitor/tools.inc.php b/interface/ispconfig/interface/monitor/tools.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..0001bd9313fdd47af5faae3312b8ce8cf6e873ea --- /dev/null +++ b/interface/ispconfig/interface/monitor/tools.inc.php @@ -0,0 +1,456 @@ +db->queryOneRecord("SELECT data, state FROM monitor_data WHERE type = 'server_load' and server_id = " . $_SESSION['monitor']['server_id'] . " order by created desc"); + + if(isset($record['data'])) { + $data = unserialize($record['data']); + + /* + Format the data + */ + if (strlen($data['up_minutes']) == "1") $data['up_minutes'] = "0".$data['up_minutes']; + $html = + '
    +
    + + + + + + + + + ' . + ' + + + + + + + + + + + +
    ' . $app->lng("Server online since").':' . $data['up_days'] . ' days, ' . $data['up_hours'] . ':' . $data['up_minutes'] . ' hours
    ' . $app->lng("Users online").':' . $data['user_online'] . '
    ' . $app->lng("System load 1 minute") . ':' . $data['load_1'] . '
    ' . $app->lng("System load 5 minutes") . ':' . $data['load_5'] . '
    '.$app->lng("System load 15 minutes").':' . $data['load_15'] . '
    +
    +
    '; + } else { + $html = '

    '.$app->lng("no_data_serverload_txt").'

    '; + } + + return $html; +} + +function showDiskUsage () { + global $app; + + /* fetch the Data from the DB */ + $record = $app->db->queryOneRecord("SELECT data, state FROM monitor_data WHERE type = 'disk_usage' and server_id = " . $_SESSION['monitor']['server_id'] . " order by created desc"); + + if(isset($record['data'])) { + $data = unserialize($record['data']); + + /* + Format the data + */ + $html = + '
    +
    + + + + + + + + + + '; + foreach($data as $line) { + $html .= ''; + foreach ($line as $item) { + $html .= ''; + } + $html .= ''; + } + $html .= '
    '.$app->lng("monitor_diskusage_filesystem_txt").''.$app->lng("monitor_diskusage_type_txt").''.$app->lng("monitor_diskusage_size_txt").''.$app->lng("monitor_diskusage_used_txt").''.$app->lng("monitor_diskusage_available_txt").''.$app->lng("monitor_diskusage_usage_txt").''.$app->lng("monitor_diskusage_mounted_txt").'
    ' . $item . '
    '; + $html .= '
    '; + } else { + $html = '

    '.$app->lng("no_data_diskusage_txt").'

    '; + } + + + return $html; +} + +function showMemUsage () { + global $app; + + /* fetch the Data from the DB */ + $record = $app->db->queryOneRecord("SELECT data, state FROM monitor_data WHERE type = 'mem_usage' and server_id = " . $_SESSION['monitor']['server_id'] . " order by created desc"); + + if(isset($record['data'])) { + $data = unserialize($record['data']); + + /* + Format the data + */ + $html = + '
    +
    + '; + + foreach($data as $key => $value){ + if ($key != '') { + $html .= ' + + + '; + } + } + $html .= '
    ' . $key . ':' . $value . '
    '; + $html .= '
    '; + + } else { + $html = '

    '.$app->lng("no_data_memusage_txt").'

    '; + } + + return $html; +} + +function showCpuInfo () { + global $app; + + /* fetch the Data from the DB */ + $record = $app->db->queryOneRecord("SELECT data, state FROM monitor_data WHERE type = 'cpu_info' and server_id = " . $_SESSION['monitor']['server_id'] . " order by created desc"); + + if(isset($record['data'])) { + $data = unserialize($record['data']); + + /* + Format the data + */ + $html = + '
    +
    + '; + foreach($data as $key => $value){ + if ($key != '') { + $html .= ' + + + '; + } + } + $html .= '
    ' . $key . ':' . $value . '
    '; + $html .= '
    '; + } else { + $html = '

    '.$app->lng("no_data_cpuinfo_txt").'

    '; + } + + return $html; +} + +function showServices () { + global $app; + + /* fetch the Data from the DB */ + $record = $app->db->queryOneRecord("SELECT data, state FROM monitor_data WHERE type = 'services' and server_id = " . $_SESSION['monitor']['server_id'] . " order by created desc"); + + if(isset($record['data'])) { + $data = unserialize($record['data']); + + /* + Format the data + */ + $html = + '
    +
    + '; + + if($data['webserver'] != -1) { + if($data['webserver'] == 1) { + $status = ''.$app->lng("monitor_services_online_txt").''; + } else { + $status = ''.$app->lng("monitor_services_offline_txt").''; + } + $html .= ' + + + '; + } + + + if($data['ftpserver'] != -1) { + if($data['ftpserver'] == 1) { + $status = ''.$app->lng("monitor_services_online_txt").''; + } else { + $status = ''.$app->lng("monitor_services_offline_txt").''; + } + $html .= ' + + + '; + } + + if($data['smtpserver'] != -1) { + if($data['smtpserver'] == 1) { + $status = ''.$app->lng("monitor_services_online_txt").''; + } else { + $status = ''.$app->lng("monitor_services_offline_txt").''; + } + $html .= ' + + + '; + } + + if($data['pop3server'] != -1) { + if($data['pop3server'] == 1) { + $status = ''.$app->lng("monitor_services_online_txt").''; + } else { + $status = ''.$app->lng("monitor_services_offline_txt").''; + } + $html .= ' + + + '; + } + + if($data['imapserver'] != -1) { + if($data['imapserver'] == 1) { + $status = ''.$app->lng("monitor_services_online_txt").''; + } else { + $status = ''.$app->lng("monitor_services_offline_txt").''; + } + $html .= ' + + + '; + } + + if($data['bindserver'] != -1) { + if($data['bindserver'] == 1) { + $status = ''.$app->lng("monitor_services_online_txt").''; + } else { + $status = ''.$app->lng("monitor_services_offline_txt").''; + } + $html .= ' + + + '; + } + + if($data['mysqlserver'] != -1) { + if($data['mysqlserver'] == 1) { + $status = ''.$app->lng("monitor_services_online_txt").''; + } else { + $status = ''.$app->lng("monitor_services_offline_txt").''; + } + $html .= ' + + + '; + } + + + $html .= '
    '.$app->lng("monitor_services_web_txt").''.$status.'
    '.$app->lng("monitor_services_ftp_txt").''.$status.'
    '.$app->lng("monitor_services_smtp_txt").''.$status.'
    '.$app->lng("monitor_services_pop_txt").''.$status.'
    '.$app->lng("monitor_services_imap_txt").''.$status.'
    '.$app->lng("monitor_services_mydns_txt").''.$status.'
    '.$app->lng("monitor_services_mysql_txt").''.$status.'
    '; + } else { + $html = '

    '.$app->lng("no_data_services_txt").'

    '; + } + + + return $html; +} + +function showSystemUpdate() { + global $app; + + /* fetch the Data from the DB */ + $record = $app->db->queryOneRecord("SELECT data, state FROM monitor_data WHERE type = 'system_update' and server_id = " . $_SESSION['monitor']['server_id'] . " order by created desc"); + + if(isset($record['data'])) { + $html = + '
    +
    '; + /* + * First, we have to detect, if there is any monitoring-data. + * If not (because the destribution is not supported) show this. + */ + if ($record['state'] == 'no_state'){ + $html .= '

    '.$app->lng("monitor_updates_nosupport_txt").'

    '; + } + else { + $data = unserialize($record['data']); + $html .= nl2br($data['output']); + } + $html .= '
    '; + } else { + $html = '

    '.$app->lng("no_data_updates_txt").'

    '; + } + + return $html; +} + +function showRaidState() { + global $app; + + /* fetch the Data from the DB */ + $record = $app->db->queryOneRecord("SELECT data, state FROM monitor_data WHERE type = 'raid_state' and server_id = " . $_SESSION['monitor']['server_id'] . " order by created desc"); + + if(isset($record['data'])) { + $html = + '
    +
    '; + + /* + * First, we have to detect, if there is any monitoring-data. + * If not (because the destribution is not supported) show this. + */ + if ($record['state'] == 'no_state'){ + $html .= '

    '.$app->lng("monitor_nomdadm_txt").'

    '; + } + else { + $data = unserialize($record['data']); + $html .= nl2br($data['output']); + } + $html .= '
    '; + + } else { + $html = '

    '.$app->lng("no_data_raid_txt").'

    '; + } + + return $html; +} + +function showRKHunter() { + global $app; + + /* fetch the Data from the DB */ + $record = $app->db->queryOneRecord("SELECT data, state FROM monitor_data WHERE type = 'rkhunter' and server_id = " . $_SESSION['monitor']['server_id'] . " order by created desc"); + + if(isset($record['data'])) { + $html = + '
    +
    '; + + /* + * First, we have to detect, if there is any monitoring-data. + * If not (because rkhunter is not installed) show this. + */ + $data = unserialize($record['data']); + if ($data['output'] == ''){ + $html .= '

    '.$app->lng("monitor_norkhunter_txt").'

    '; + } + else { + $html .= nl2br($data['output']); + } + $html .= '
    '; + + } else { + $html = '

    '.$app->lng("no_data_rkhunter_txt").'

    '; + } + + return $html; +} + +function showFail2ban() { + global $app; + + /* fetch the Data from the DB */ + $record = $app->db->queryOneRecord("SELECT data, state FROM monitor_data WHERE type = 'log_fail2ban' and server_id = " . $_SESSION['monitor']['server_id'] . " order by created desc"); + + if(isset($record['data'])) { + $html = + '
    +
    '; + + /* + * First, we have to detect, if there is any monitoring-data. + * If not (because fail2ban is not installed) show this. + */ + $data = unserialize($record['data']); + if ($data == ''){ + $html .= '

    '. + 'fail2ban is not installed at this server.
    ' . + 'See more (for debian) here...'. + '

    '; + } + else { + $html .= nl2br($data); + } + $html .= '
    '; + + } else { + $html = '

    There is no data available at the moment.

    '; + } + + return $html; +} + +function showMailq() { + global $app; + + /* fetch the Data from the DB */ + $record = $app->db->queryOneRecord("SELECT data, state FROM monitor_data WHERE type = 'mailq' and server_id = " . $_SESSION['monitor']['server_id'] . " order by created desc"); + + if(isset($record['data'])) { + $data = unserialize($record['data']); + $html = nl2br($data['output']); + } else { + $html = '

    '.$app->lng("no_data_mailq_txt").'

    '; + } + + return $html; +} + +function getDataTime($type) { + global $app; + + /* fetch the Data from the DB */ + $record = $app->db->queryOneRecord("SELECT created FROM monitor_data WHERE type = '" . $type . "' and server_id = " . $_SESSION['monitor']['server_id'] . " order by created desc"); + + /* TODO: datetimeformat should be set somewhat other way */ + $dateTimeFormat = $app->lng("monitor_settings_datetimeformat_txt"); + + if(isset($record['created'])) { +// $res = date('Y-m-d H:i', $record['created']); + $res = date($dateTimeFormat, $record['created']); + } else { + $res = '????-??-?? ??:??'; + } + return $res; +} +?> diff --git a/interface/ispconfig/interface/mymodule/form/support_message.tform.php b/interface/ispconfig/interface/mymodule/form/support_message.tform.php new file mode 100644 index 0000000000000000000000000000000000000000..638f6ae4a6f9fe2e48097ab3ad819de3d4019f4c --- /dev/null +++ b/interface/ispconfig/interface/mymodule/form/support_message.tform.php @@ -0,0 +1,132 @@ + 0 id must match with id of current user +$form['auth_preset']['userid'] = 0; + + // 0 = default groupid of the user, > 0 id must match with groupid of current +$form['auth_preset']['groupid'] = 0; // user + +// Permissions with the following codes: r = read, i = insert, u = update, d = delete +$form['auth_preset']['perm_user'] = 'riud'; +$form['auth_preset']['perm_group'] = 'riud'; +$form['auth_preset']['perm_other'] = ''; + +// The form definition of the first tab. The name of the tab is called 'message'. We refer +// to this name in the $form['tab_default'] setting above. +$form['tabs']['message'] = array( + 'title' => 'Message', // Title of the Tab + 'width' => 100, // Tab width + 'template' => 'templates/support_message_edit.htm', // Template file name + 'fields' => array( + + //*** BEGIN Datatable columns ********************************** + + 'recipient_id' => array( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'datasource' => array( + 'type' => 'SQL', + 'querystring' => 'SELECT userid,username FROM sys_user WHERE {AUTHSQL} ORDER BY username', + 'keyfield' => 'userid', + 'valuefield' => 'username' + ), + 'validators' => array( 0 => array( 'type' => 'ISINT', + 'errmsg'=> 'recipient_id_is_not_integer' + ), + ), + 'value' => '' + ), + + 'sender_id' => array( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'datasource' => array( + 'type' => 'SQL', + 'querystring' => 'SELECT userid,username FROM sys_user WHERE {AUTHSQL} ORDER BY username', + 'keyfield' => 'userid', + 'valuefield' => 'username' + ), + 'validators' => array( 0 => array( 'type' => 'ISINT', + 'errmsg' => 'recipient_id_is_not_integer' + ), + ), + 'value' => '' + ), + + 'subject' => array( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array( 0 => array( 'type' => 'NOTEMPTY', + 'errmsg'=> 'subject_is_empty' + ), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + + 'message' => array( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXTAREA', + 'validators' => array( 0 => array( 'type' => 'NOTEMPTY', + 'errmsg'=> 'message_is_empty' + ), + ), + 'default' => '', + 'value' => '', + 'cols' => '30', + 'rows' => '10', + 'maxlength' => '255' + ), + + 'tstamp' => array( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => time(), + 'value' => '', + 'width' => '30', + 'maxlength' => '30' + ), + + //*** END Datatable columns ********************************** + ) +); +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mymodule/lib/admin.conf.php b/interface/ispconfig/interface/mymodule/lib/admin.conf.php new file mode 100644 index 0000000000000000000000000000000000000000..3e558caea4e55b66f7ac715f4dff6d16b0363cb1 --- /dev/null +++ b/interface/ispconfig/interface/mymodule/lib/admin.conf.php @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mymodule/lib/mymodule.config.php b/interface/ispconfig/interface/mymodule/lib/mymodule.config.php new file mode 100644 index 0000000000000000000000000000000000000000..3ff9431661cb3b291fb070849bca456c17ff1f41 --- /dev/null +++ b/interface/ispconfig/interface/mymodule/lib/mymodule.config.php @@ -0,0 +1,47 @@ + 'Send message', + 'target' => 'content', + 'link' => 'mymodule/support_message_edit.php' + ); + +// Add a menu item with the label 'View messages' +$items[] = array( 'title' => 'View messages', + 'target' => 'content', + 'link' => 'mymodule/support_message_list.php' + ); + +// Append the menu $items defined above to a menu section labeled 'Support' +$module['nav'][] = array( 'title' => 'Support', + 'open' => 1, + 'items' => $items + ); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mymodule/list/support_message.list.php b/interface/ispconfig/interface/mymodule/list/support_message.list.php new file mode 100644 index 0000000000000000000000000000000000000000..e1fd4f50e54e7751811746d99571c699c78b7d9e --- /dev/null +++ b/interface/ispconfig/interface/mymodule/list/support_message.list.php @@ -0,0 +1,63 @@ + 'sender_id', + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'op' => '=', + 'prefix' => '', + 'suffix' => '', + 'width' => '', + 'datasource' => array( + 'type' => 'SQL', + 'querystring' => 'SELECT userid,username FROM sys_user WHERE {AUTHSQL} ORDER BY username', + 'keyfield' => 'userid', + 'valuefield' => 'username' + ), + 'value' => '' + ); + +$liste['item'][] = array( + 'field' => 'subject', + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'op' => 'like', + 'prefix' => '%', + 'suffix' => '%', + 'width' => '', + 'value' => '' + ); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mymodule/support_message_del.php b/interface/ispconfig/interface/mymodule/support_message_del.php new file mode 100644 index 0000000000000000000000000000000000000000..a01ba1a7358ee88450c8439a657a0fda869c195c --- /dev/null +++ b/interface/ispconfig/interface/mymodule/support_message_del.php @@ -0,0 +1,21 @@ +uses('tform_actions'); +$app->tform_actions->onDelete(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mymodule/support_message_edit.php b/interface/ispconfig/interface/mymodule/support_message_edit.php new file mode 100644 index 0000000000000000000000000000000000000000..8dee496890545dd190ebffe002fafc50ed657b0f --- /dev/null +++ b/interface/ispconfig/interface/mymodule/support_message_edit.php @@ -0,0 +1,33 @@ +uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +// Create a class page_action that extends the tform_actions base class +class page_action extends tform_actions { + + //* Customisations for the page actions will be defined here + +} + +// Create the new page object +$page = new page_action(); + +// Start the page rendering and action handling +$page->onLoad(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mymodule/support_message_list.php b/interface/ispconfig/interface/mymodule/support_message_list.php new file mode 100644 index 0000000000000000000000000000000000000000..43cd9bc1fa65c99a8097957c9c3db1497a9a1d13 --- /dev/null +++ b/interface/ispconfig/interface/mymodule/support_message_list.php @@ -0,0 +1,24 @@ +uses('listform_actions'); + +// Optional limit +// $app->listform_actions->SQLExtWhere = 'type = 'alias''; + +// Start the form rendering and action ahndling +$app->listform_actions->onLoad(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mymodule/templates/support_message_edit.html b/interface/ispconfig/interface/mymodule/templates/support_message_edit.html new file mode 100644 index 0000000000000000000000000000000000000000..6bd86f28f20cd2b4bd7c3b9f3249afd5fe398e7b --- /dev/null +++ b/interface/ispconfig/interface/mymodule/templates/support_message_edit.html @@ -0,0 +1,14 @@ + + + + + + + + +
    TODO write content
    + + diff --git a/interface/ispconfig/interface/mymodule/templates/support_message_view.html b/interface/ispconfig/interface/mymodule/templates/support_message_view.html new file mode 100644 index 0000000000000000000000000000000000000000..6bd86f28f20cd2b4bd7c3b9f3249afd5fe398e7b --- /dev/null +++ b/interface/ispconfig/interface/mymodule/templates/support_message_view.html @@ -0,0 +1,14 @@ + + + + + + + + +
    TODO write content
    + + diff --git a/interface/ispconfig/interface/nav.php b/interface/ispconfig/interface/nav.php new file mode 100644 index 0000000000000000000000000000000000000000..73a63717208be5f1a7568435ba6984b2301bee73 --- /dev/null +++ b/interface/ispconfig/interface/nav.php @@ -0,0 +1,102 @@ +uses('tpl'); + +//** Top Naviation +if(isset($_GET['nav']) && $_GET['nav'] == 'top') { + + $app->tpl->newTemplate('topnav.tpl.htm'); + + //* Check User Login and current module + if(isset($_SESSION["s"]["user"]) && $_SESSION["s"]["user"]['active'] == 1 && is_array($_SESSION['s']['module'])) { + //* Loading modules of the user and building top navigation + $modules = explode(',', $_SESSION['s']['user']['modules']); + if(is_array($modules)) { + foreach($modules as $mt) { + if(is_file($mt.'/lib/module.conf.php')) { + if(!preg_match("/^[a-z]{2,20}$/i", $mt)) die('module name contains unallowed chars.'); + include_once($mt.'/lib/module.conf.php'); + $active = ($module['name'] == $_SESSION['s']['module']['name']) ? 1 : 0; + $topnav[] = array( 'title' => $app->lng($module['title']), + 'active' => $active, + 'module' => $module['name']); + } + } + } + } else { + //* Loading Login Module + include_once('login/lib/module.conf.php'); + $_SESSION['s']['module'] = $module; + $topnav[] = array( 'title' => 'Login', + 'active' => 1); + $module = null; + unset($module); + } + + //* Topnavigation + $app->tpl->setLoop('nav_top',$topnav); + +} + +//** Side Naviation +if(isset($_GET['nav']) && $_GET['nav'] == 'side') { + + $app->tpl->newTemplate('sidenav.tpl.htm'); + + //* translating module navigation + $nav_translated = array(); + if(isset($_SESSION['s']['module']['nav']) && is_array($_SESSION['s']['module']['nav'])) { + foreach($_SESSION['s']['module']['nav'] as $nav) { + $tmp_items = array(); + foreach($nav['items'] as $item) { + $item['title'] = $app->lng($item['title']); + $tmp_items[] = $item; + } + $nav['title'] = $app->lng($nav['title']); + $nav['startpage'] = $nav['items'][0]['link']; + $nav['items'] = $tmp_items; + $nav_translated[] = $nav; + } + } else { + $nav_translated = null; + } + + $app->tpl->setLoop('nav_left',$nav_translated); + +} + +$app->tpl_defaults(); +$app->tpl->pparse(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/remote/index.php b/interface/ispconfig/interface/remote/index.php new file mode 100644 index 0000000000000000000000000000000000000000..25ebc8f0ba75ccb99dde915e17d002626f8e70d3 --- /dev/null +++ b/interface/ispconfig/interface/remote/index.php @@ -0,0 +1,15 @@ +load('remoting'); + +$server = new SoapServer(null, array('uri' => $_SERVER['REQUEST_URI'])); +$server->setClass('remoting'); +$server->handle(); + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/robots.txt b/interface/ispconfig/interface/robots.txt new file mode 100644 index 0000000000000000000000000000000000000000..61186cb254c9d9d93fcf0e8ae97378d44b8e57c0 --- /dev/null +++ b/interface/ispconfig/interface/robots.txt @@ -0,0 +1,2 @@ +User-Agent: * +Disallow: / \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/ajax_get_ip.php b/interface/ispconfig/interface/sites/ajax_get_ip.php new file mode 100644 index 0000000000000000000000000000000000000000..603c82404cda8185ee096c12b158c93db56b57d0 --- /dev/null +++ b/interface/ispconfig/interface/sites/ajax_get_ip.php @@ -0,0 +1,56 @@ +auth->check_module_permissions('sites'); + +$server_id = intval($_GET["server_id"]); + +if($_SESSION["s"]["user"]["typ"] == 'admin') { + + $sql = "SELECT ip_address FROM server_ip WHERE server_id = $server_id"; + $ips = $app->db->queryAllRecords($sql); + // $ip_select = ""; + $ip_select = "*"; + if(is_array($ips)) { + foreach( $ips as $ip) { + //$selected = ($ip["ip_address"] == $this->dataRecord["ip_address"])?'SELECTED':''; + $ip_select .= "#$ip[ip_address]"; + } + } + unset($tmp); + unset($ips); +} + +echo $ip_select; +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/cron_del.php b/interface/ispconfig/interface/sites/cron_del.php new file mode 100644 index 0000000000000000000000000000000000000000..516b4473b9eacfc9a20f89b1888033fc80d3c95b --- /dev/null +++ b/interface/ispconfig/interface/sites/cron_del.php @@ -0,0 +1,64 @@ +auth->check_module_permissions('sites'); + +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onBeforeDelete() { + global $app; $conf; + + if($app->tform->checkPerm($this->id,'d') == false) $app->error($app->lng('error_no_delete_permission')); + } +} + +$page = new page_action; +$page->onDelete(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/cron_edit.php b/interface/ispconfig/interface/sites/cron_edit.php new file mode 100644 index 0000000000000000000000000000000000000000..6301fc910ea63c037e5e7a0d92bb625ac2960e2f --- /dev/null +++ b/interface/ispconfig/interface/sites/cron_edit.php @@ -0,0 +1,221 @@ +auth->check_module_permissions('sites'); + +// Loading classes +$app->uses('tpl,tform,tform_actions,validate_cron'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onShowNew() { + global $app, $conf; + + // we will check only users, not admins + if($_SESSION["s"]["user"]["typ"] == 'user') { + if(!$app->tform->checkClientLimit('limit_cron')) { + $app->error($app->tform->wordbook["limit_cron_txt"]); + } + if(!$app->tform->checkResellerLimit('limit_cron')) { + $app->error('Reseller: '.$app->tform->wordbook["limit_cron_txt"]); + } + } + + parent::onShowNew(); + } + + function onShowEnd() { + global $app, $conf; + + if($this->id > 0) { + //* we are editing a existing record + $app->tpl->setVar("edit_disabled", 1); + $app->tpl->setVar("parent_domain_id_value", $this->dataRecord["parent_domain_id"]); + } else { + $app->tpl->setVar("edit_disabled", 0); + } + + parent::onShowEnd(); + } + + function onSubmit() { + global $app, $conf; + + if($_SESSION["s"]["user"]["typ"] != 'admin') { + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_cron, limit_cron_type FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // When the record is updated + if($this->id > 0) { + // When the record is inserted + } else { + // Check if the user may add another cron job. + if($client["limit_cron"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM cron WHERE sys_groupid = $client_group_id"); + if($tmp["number"] >= $client["limit_cron"]) { + $app->error($app->tform->wordbook["limit_cron_txt"]); + } + } + } + } + + // Get the record of the parent domain + $parent_domain = $app->db->queryOneRecord("select * FROM web_domain WHERE domain_id = ".intval(@$this->dataRecord["parent_domain_id"])); + + // Set fixed values + $this->dataRecord["server_id"] = $parent_domain["server_id"]; + + //* get type of command + $command = $this->dataRecord["command"]; + if(preg_match("'^http(s)?:\/\/'i", $command)) { + $this->dataRecord["type"] = 'url'; + } else { + $domain_owner = $app->db->queryOneRecord("SELECT limit_cron_type FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = ".intval($parent_domain["sys_groupid"])); + if($domain_owner["limit_cron_type"] == 'full') $this->dataRecord["type"] = 'full'; + else $this->dataRecord["type"] = 'chrooted'; + } + + parent::onSubmit(); + } + + function onUpdateSave($sql) { + global $app; + + $has_error = false; + //* last chance to stop this, so check frequency limit! + if($_SESSION["s"]["user"]["typ"] != 'admin') { + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_cron_frequency FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + if($client["limit_cron_frequency"] > 1) { + if($app->tform->cron_min_freq < $client["limit_cron_frequency"]) { + $app->error($app->tform->wordbook["limit_cron_frequency_txt"]); + $has_error = true; + } + } + } + + if($has_error == true) { + parent::onError(); + exit; + } + else parent::onUpdateSave($sql); + } + + function onInsertSave($sql) { + global $app; + + $has_error = false; + //* last chance to stop this, so check frequency limit! + if($_SESSION["s"]["user"]["typ"] != 'admin') { + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_cron_frequency FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + if($client["limit_cron_frequency"] > 1) { + if($app->tform->cron_min_freq < $client["limit_cron_frequency"]) { + $app->error($app->tform->wordbook["limit_cron_frequency_txt"]); + $has_error = true; + } + } + } + + if($has_error == true) { + parent::onError(); + exit; + } else { + return parent::onInsertSave($sql); + } + } + + function onAfterInsert() { + global $app, $conf; + + $web = $app->db->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ".intval($this->dataRecord["parent_domain_id"])); + $server_id = $web["server_id"]; + + // The cron shall be owned by the same group then the website + $sys_groupid = $web['sys_groupid']; + + $sql = "UPDATE shell_user SET server_id = $server_id, sys_groupid = '$sys_groupid' WHERE id = ".$this->id; + $app->db->query($sql); + } + + function onAfterUpdate() { + global $app, $conf; + + + } + + function getClientName() { + global $app, $conf; + + if($_SESSION["s"]["user"]["typ"] != 'admin') { + // Get the group-id of the user + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + } else { + // Get the group-id from the data itself + $web = $app->db->queryOneRecord("SELECT sys_groupid FROM web_domain WHERE domain_id = ".intval($this->dataRecord['parent_domain_id'])); + $client_group_id = $web['sys_groupid']; + } + /* get the name of the client */ + $tmp = $app->db->queryOneRecord("SELECT name FROM sys_group WHERE groupid = " . $client_group_id); + $clientName = $tmp['name']; + if ($clientName == "") $clientName = 'default'; + $clientName = convertClientName($clientName); + + return $clientName; + + } + +} + +$page = new page_action; +$page->onLoad(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/cron_list.php b/interface/ispconfig/interface/sites/cron_list.php new file mode 100644 index 0000000000000000000000000000000000000000..68e23163f254e410db9a24f090f87ed7df10477f --- /dev/null +++ b/interface/ispconfig/interface/sites/cron_list.php @@ -0,0 +1,23 @@ +auth->check_module_permissions('sites'); + +$app->uses('listform_actions'); + +$app->listform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/database_del.php b/interface/ispconfig/interface/sites/database_del.php new file mode 100644 index 0000000000000000000000000000000000000000..aa958a180911fd25f611a88b585bd337200a41db --- /dev/null +++ b/interface/ispconfig/interface/sites/database_del.php @@ -0,0 +1,51 @@ +auth->check_module_permissions('sites'); + +$app->uses("tform_actions"); +$app->tform_actions->onDelete(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/database_edit.php b/interface/ispconfig/interface/sites/database_edit.php new file mode 100644 index 0000000000000000000000000000000000000000..3b06bde96561a0fc34762671498c2c38fb79d6fb --- /dev/null +++ b/interface/ispconfig/interface/sites/database_edit.php @@ -0,0 +1,338 @@ +auth->check_module_permissions('sites'); + +// Loading classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onShowNew() { + global $app, $conf; + + // we will check only users, not admins + if($_SESSION["s"]["user"]["typ"] == 'user') { + if(!$app->tform->checkClientLimit('limit_database')) { + $app->error($app->tform->wordbook["limit_database_txt"]); + } + if(!$app->tform->checkResellerLimit('limit_database')) { + $app->error('Reseller: '.$app->tform->wordbook["limit_database_txt"]); + } + } + + parent::onShowNew(); + } + + function onShowEnd() { + global $app, $conf, $interfaceConf; + + if($_SESSION["s"]["user"]["typ"] != 'admin' && !$app->auth->has_clients($_SESSION['s']['user']['userid'])) { + + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT default_dbserver FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Set the webserver to the default server of the client + $tmp = $app->db->queryOneRecord("SELECT server_name FROM server WHERE server_id = $client[default_dbserver]"); + $app->tpl->setVar("server_id",""); + unset($tmp); + + } elseif ($_SESSION["s"]["user"]["typ"] != 'admin' && $app->auth->has_clients($_SESSION['s']['user']['userid'])) { + + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT client.client_id, limit_web_domain, default_webserver, contact_name FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Set the webserver to the default server of the client + $tmp = $app->db->queryOneRecord("SELECT server_name FROM server WHERE server_id = $client[default_webserver]"); + $app->tpl->setVar("server_id",""); + unset($tmp); + + // Fill the client select field + $sql = "SELECT groupid, name FROM sys_group, client WHERE sys_group.client_id = client.client_id AND client.parent_client_id = ".$client['client_id']." ORDER BY name"; + $clients = $app->db->queryAllRecords($sql); + $tmp = $app->db->queryOneRecord("SELECT groupid FROM sys_group WHERE client_id = ".$client['client_id']); + $client_select = ''; + $tmp_data_record = $app->tform->getDataRecord($this->id); + if(is_array($clients)) { + foreach( $clients as $client) { + $selected = @($client["groupid"] == $tmp_data_record["sys_groupid"])?'SELECTED':''; + $client_select .= "\r\n"; + } + } + $app->tpl->setVar("client_group_id",$client_select); + + } else { + + // The user is admin + if($this->id > 0) { + $server_id = $this->dataRecord["server_id"]; + } else { + // Get the first server ID + $tmp = $app->db->queryOneRecord("SELECT server_id FROM server WHERE web_server = 1 ORDER BY server_name LIMIT 0,1"); + $server_id = $tmp['server_id']; + } + + $sql = "SELECT ip_address FROM server_ip WHERE server_id = $server_id"; + $ips = $app->db->queryAllRecords($sql); + $ip_select = ""; + //$ip_select = ""; + if(is_array($ips)) { + foreach( $ips as $ip) { + $selected = ($ip["ip_address"] == $this->dataRecord["ip_address"])?'SELECTED':''; + $ip_select .= "\r\n"; + } + } + $app->tpl->setVar("ip_address",$ip_select); + unset($tmp); + unset($ips); + + // Fill the client select field + $sql = "SELECT groupid, name FROM sys_group WHERE client_id > 0 ORDER BY name"; + $clients = $app->db->queryAllRecords($sql); + $client_select = ""; + $tmp_data_record = $app->tform->getDataRecord($this->id); + if(is_array($clients)) { + foreach( $clients as $client) { + $selected = @($client["groupid"] == $tmp_data_record["sys_groupid"])?'SELECTED':''; + $client_select .= "\r\n"; + } + } + $app->tpl->setVar("client_group_id",$client_select); + + } + + /* + * If the names are restricted -> remove the restriction, so that the + * data can be edited + */ + + //* Get the database name and database user prefix + $app->uses('getconf'); + $global_config = $app->getconf->get_global_config('sites'); + $dbname_prefix = replacePrefix($global_config['dbname_prefix'], $this->dataRecord); + $dbuser_prefix = replacePrefix($global_config['dbuser_prefix'], $this->dataRecord); + + if ($this->dataRecord['database_name'] != ""){ + /* REMOVE the restriction */ + $app->tpl->setVar("database_name", str_replace($dbname_prefix , '', $this->dataRecord['database_name'])); + $app->tpl->setVar("database_user", str_replace($dbuser_prefix , '', $this->dataRecord['database_user'])); + } + + if($_SESSION["s"]["user"]["typ"] == 'admin' || $app->auth->has_clients($_SESSION['s']['user']['userid'])) { + $app->tpl->setVar("database_name_prefix", $global_config['dbname_prefix']); + $app->tpl->setVar("database_user_prefix", $global_config['dbuser_prefix']); + } else { + $app->tpl->setVar("database_name_prefix", $dbname_prefix); + $app->tpl->setVar("database_user_prefix", $dbuser_prefix); + } + + if($this->id > 0) { + //* we are editing a existing record + $app->tpl->setVar("edit_disabled", 1); + $app->tpl->setVar("server_id_value", $this->dataRecord["server_id"]); + $app->tpl->setVar("database_charset_value", $this->dataRecord["database_charset"]); + } else { + $app->tpl->setVar("edit_disabled", 0); + } + + parent::onShowEnd(); + } + + function onSubmit() { + global $app, $conf; + + if($_SESSION["s"]["user"]["typ"] != 'admin') { + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT default_dbserver, limit_database FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // When the record is updated + if($this->id > 0) { + // restore the server ID if the user is not admin and record is edited + $tmp = $app->db->queryOneRecord("SELECT server_id FROM web_database WHERE database_id = ".intval($this->id)); + $this->dataRecord["server_id"] = $tmp["server_id"]; + unset($tmp); + // When the record is inserted + } else { + // set the server ID to the default dbserver of the client + $this->dataRecord["server_id"] = $client["default_dbserver"]; + + + // Check if the user may add another database + if($client["limit_database"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(database_id) as number FROM web_database WHERE sys_groupid = $client_group_id"); + if($tmp["number"] >= $client["limit_database"]) { + $app->error($app->tform->wordbook["limit_database_txt"]); + } + } + + } + + // Clients may not set the client_group_id, so we unset them if user is not a admin and the client is not a reseller + if(!$app->auth->has_clients($_SESSION['s']['user']['userid'])) unset($this->dataRecord["client_group_id"]); + } + + + parent::onSubmit(); + } + + function onBeforeUpdate() { + global $app, $conf, $interfaceConf; + + /* + * If the names should be restricted -> do it! + */ + + + //* Get the database name and database user prefix + $app->uses('getconf'); + $global_config = $app->getconf->get_global_config('sites'); + $dbname_prefix = replacePrefix($global_config['dbname_prefix'], $this->dataRecord); + $dbuser_prefix = replacePrefix($global_config['dbuser_prefix'], $this->dataRecord); + + //* Prevent that the database name and charset is changed + $old_record = $app->tform->getDataRecord($this->id); + if($old_record["database_name"] != $dbname_prefix . $this->dataRecord["database_name"]) { + $app->tform->errorMessage .= $app->tform->wordbook["database_name_change_txt"].'
    '; + } + if($old_record["database_charset"] != $this->dataRecord["database_charset"]) { + $app->tform->errorMessage .= $app->tform->wordbook["database_charset_change_txt"].'
    '; + } + + //* Database username and database name shall not be empty + if($this->dataRecord['database_name'] == '') $app->tform->errorMessage .= $app->tform->wordbook["database_name_error_empty"].'
    '; + if($this->dataRecord['database_user'] == '') $app->tform->errorMessage .= $app->tform->wordbook["database_user_error_empty"].'
    '; + + //* Check if the server has been changed + // We do this only for the admin or reseller users, as normal clients can not change the server ID anyway + if($_SESSION["s"]["user"]["typ"] == 'admin' || $app->auth->has_clients($_SESSION['s']['user']['userid'])) { + if($old_record["server_id"] != $this->dataRecord["server_id"]) { + //* Add a error message and switch back to old server + $app->tform->errorMessage .= $app->lng('The Server can not be changed.'); + $this->dataRecord["server_id"] = $rec['server_id']; + } + } + unset($old_record); + + if(strlen($dbname_prefix . $this->dataRecord['database_name']) > 64) $app->tform->errorMessage .= str_replace('{db}',$dbname_prefix . $this->dataRecord['database_name'],$app->tform->wordbook["database_name_error_len"]).'
    '; + if(strlen($dbuser_prefix . $this->dataRecord['database_user']) > 16) $app->tform->errorMessage .= str_replace('{user}',$dbuser_prefix . $this->dataRecord['database_user'],$app->tform->wordbook["database_user_error_len"]).'
    '; + + if ($app->tform->errorMessage == ''){ + /* restrict the names if there is no error */ + /* crop user and db names if they are too long -> mysql: user: 16 chars / db: 64 chars */ + $this->dataRecord['database_name'] = substr($dbname_prefix . $this->dataRecord['database_name'], 0, 64); + $this->dataRecord['database_user'] = substr($dbuser_prefix . $this->dataRecord['database_user'], 0, 16); + } + + parent::onBeforeUpdate(); + } + + function onBeforeInsert() { + global $app, $conf, $interfaceConf; + + //* Database username and database name shall not be empty + if($this->dataRecord['database_name'] == '') $app->tform->errorMessage .= $app->tform->wordbook["database_name_error_empty"].'
    '; + if($this->dataRecord['database_user'] == '') $app->tform->errorMessage .= $app->tform->wordbook["database_user_error_empty"].'
    '; + + //* Get the database name and database user prefix + $app->uses('getconf'); + $global_config = $app->getconf->get_global_config('sites'); + $dbname_prefix = replacePrefix($global_config['dbname_prefix'], $this->dataRecord); + $dbuser_prefix = replacePrefix($global_config['dbuser_prefix'], $this->dataRecord); + + if(strlen($dbname_prefix . $this->dataRecord['database_name']) > 64) $app->tform->errorMessage .= str_replace('{db}',$dbname_prefix . $this->dataRecord['database_name'],$app->tform->wordbook["database_name_error_len"]).'
    '; + if(strlen($dbuser_prefix . $this->dataRecord['database_user']) > 16) $app->tform->errorMessage .= str_replace('{user}',$dbuser_prefix . $this->dataRecord['database_user'],$app->tform->wordbook["database_user_error_len"]).'
    '; + + + /* restrict the names */ + /* crop user and db names if they are too long -> mysql: user: 16 chars / db: 64 chars */ + if ($app->tform->errorMessage == ''){ + $this->dataRecord['database_name'] = substr($dbname_prefix . $this->dataRecord['database_name'], 0, 64); + $this->dataRecord['database_user'] = substr($dbuser_prefix . $this->dataRecord['database_user'], 0, 16); + } + + parent::onBeforeInsert(); + } + + function onAfterInsert() { + global $app, $conf; + + // make sure that the record belongs to the clinet group and not the admin group when a dmin inserts it + // also make sure that the user can not delete domain created by a admin + if($_SESSION["s"]["user"]["typ"] == 'admin' && isset($this->dataRecord["client_group_id"])) { + $client_group_id = intval($this->dataRecord["client_group_id"]); + $app->db->query("UPDATE web_database SET sys_groupid = $client_group_id, sys_perm_group = 'ru' WHERE database_id = ".$this->id); + } + if($app->auth->has_clients($_SESSION['s']['user']['userid']) && isset($this->dataRecord["client_group_id"])) { + $client_group_id = intval($this->dataRecord["client_group_id"]); + $app->db->query("UPDATE web_database SET sys_groupid = $client_group_id, sys_perm_group = 'riud' WHERE database_id = ".$this->id); + } + } + + function onAfterUpdate() { + global $app, $conf; + + // make sure that the record belongs to the client group and not the admin group when a admin inserts it + // also make sure that the user can not delete domain created by a admin + if($_SESSION["s"]["user"]["typ"] == 'admin' && isset($this->dataRecord["client_group_id"])) { + $client_group_id = intval($this->dataRecord["client_group_id"]); + $app->db->query("UPDATE web_database SET sys_groupid = $client_group_id, sys_perm_group = 'ru' WHERE database_id = ".$this->id); + } + if($app->auth->has_clients($_SESSION['s']['user']['userid']) && isset($this->dataRecord["client_group_id"])) { + $client_group_id = intval($this->dataRecord["client_group_id"]); + $app->db->query("UPDATE web_database SET sys_groupid = $client_group_id, sys_perm_group = 'riud' WHERE database_id = ".$this->id); + } + + } + +} + +$page = new page_action; +$page->onLoad(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/database_list.php b/interface/ispconfig/interface/sites/database_list.php new file mode 100644 index 0000000000000000000000000000000000000000..d042843684f24269b3ca4edbd7c29856d1e1a629 --- /dev/null +++ b/interface/ispconfig/interface/sites/database_list.php @@ -0,0 +1,73 @@ +auth->check_module_permissions('sites'); + +$app->load('listform_actions'); + + +class list_action extends listform_actions { + + function onShow() { + global $app,$conf; + + $app->uses('getconf'); + $global_config = $app->getconf->get_global_config('sites'); + + if($global_config['dblist_phpmyadmin_link'] == 'y') { + $app->tpl->setVar('dblist_phpmyadmin_link',1); + } else { + $app->tpl->setVar('dblist_phpmyadmin_link',0); + } + + parent::onShow(); + } + +} + +$list = new list_action; +$list->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/database_phpmyadmin.php b/interface/ispconfig/interface/sites/database_phpmyadmin.php new file mode 100644 index 0000000000000000000000000000000000000000..1dc153012efb88c840d8fb20746f8edf3f5f70e4 --- /dev/null +++ b/interface/ispconfig/interface/sites/database_phpmyadmin.php @@ -0,0 +1,70 @@ +auth->check_module_permissions('sites'); + +/* + * get the id of the database (must be int!) + */ +if (!isset($_GET['id'])){ + die ("No DB selected!"); +} +$databaseId = intval($_GET['id']); + +/* + * Get the data to connect to the database + */ +$dbData = $app->db->queryOneRecord("SELECT server_id FROM web_database WHERE database_id = " . $databaseId); +$serverId = intval($dbData['server_id']); +if ($serverId == 0){ + die ("No DB-Server found!"); +} +$serverData = $app->db->queryOneRecord( + "SELECT server_name FROM server WHERE server_id = " . + $serverId); + +$app->uses('getconf'); +$global_config = $app->getconf->get_global_config('sites'); + +/* + * We only redirect to the login-form, so there is no need, to check any rights + */ +if($global_config['phpmyadmin_url'] != '') { + header('Location:'.$global_config['phpmyadmin_url']); +} else { + isset($_SERVER['HTTPS'])? $http = 'https' : $http = 'http'; + header('location:' . $http . '://' . $serverData['server_name'] . '/phpmyadmin'); +} +exit; +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/form/cron.tform.php b/interface/ispconfig/interface/sites/form/cron.tform.php new file mode 100644 index 0000000000000000000000000000000000000000..2440271a2e968e1de2532c11e77d71d93e284c11 --- /dev/null +++ b/interface/ispconfig/interface/sites/form/cron.tform.php @@ -0,0 +1,189 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['cron'] = array ( + 'title' => "Cron Job", + 'width' => 100, + 'template' => "templates/cron_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE mirror_server_id = 0 AND web_server = 1 AND {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'server_id_error_empty'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'parent_domain_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => "SELECT domain_id,domain FROM web_domain WHERE type = 'vhost' AND {AUTHSQL} ORDER BY domain", + 'keyfield'=> 'domain_id', + 'valuefield'=> 'domain' + ), + 'value' => '' + ), + 'run_min' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'CUSTOM', + 'class' => 'validate_cron', + 'function' => 'run_time_format', + 'errmsg'=> 'run_min_error_format'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'run_hour' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'CUSTOM', + 'class' => 'validate_cron', + 'function' => 'run_time_format', + 'errmsg'=> 'run_hour_error_format'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'run_mday' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'CUSTOM', + 'class' => 'validate_cron', + 'function' => 'run_time_format', + 'errmsg'=> 'run_mday_error_format'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'run_month' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'CUSTOM', + 'class' => 'validate_cron', + 'function' => 'run_time_format', + 'errmsg'=> 'run_month_error_format'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'run_wday' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'CUSTOM', + 'class' => 'validate_cron', + 'function' => 'run_time_format', + 'errmsg'=> 'run_wday_error_format'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'command' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'command_error_empty'), + 1 => array ( 'type' => 'CUSTOM', + 'class' => 'validate_cron', + 'function' => 'command_format', + 'errmsg'=> 'command_error_format'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'type' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => 'url', + 'valuelimit' => 'list:url,full,chrooted', + 'value' => array('url' => 'Url', 'full' => 'Full', 'chrooted' => 'Chrooted') + ), + 'active' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(0 => 'n',1 => 'y') + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/form/database.tform.php b/interface/ispconfig/interface/sites/form/database.tform.php new file mode 100644 index 0000000000000000000000000000000000000000..a7e30452dada2e85979e47a62603bf2163a9066f --- /dev/null +++ b/interface/ispconfig/interface/sites/form/database.tform.php @@ -0,0 +1,155 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['database'] = array ( + 'title' => "Database", + 'width' => 100, + 'template' => "templates/database_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE mirror_server_id = 0 AND {AUTHSQL} AND db_server = 1 ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'value' => '' + ), + 'type' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => 'y', + 'value' => array('mysql' => 'MySQL') + ), + 'database_name' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'database_name_error_empty'), + 1 => array ( 'type' => 'UNIQUE', + 'errmsg'=> 'database_name_error_unique'), + 2 => array ( 'type' => 'REGEX', + 'regex' => '/^[a-zA-Z0-9_]{2,64}$/', + 'errmsg'=> 'database_name_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'database_user' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'database_user_error_empty'), + 1 => array ( 'type' => 'UNIQUE', + 'errmsg'=> 'database_user_error_unique'), + 2 => array ( 'type' => 'REGEX', + 'regex' => '/^[a-zA-Z0-9_]{2,64}$/', + 'errmsg'=> 'database_user_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'database_password' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'database_charset' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => 'y', + 'value' => array('' => 'DB-Default','latin1' => 'Latin 1','utf8' => 'UTF-8') + ), + 'remote_access' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(0 => 'n',1 => 'y') + ), + 'active' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(0 => 'n',1 => 'y') + ), + 'remote_ips' => array ( + 'datatype' => 'TEXT', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'CUSTOM', + 'class' => 'validate_database', + 'function' => 'valid_ip_list', + 'errmsg' => 'database_remote_error_ips'), + ), + 'default' => '', + 'value' => '', + 'width' => '60' + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/form/ftp_user.tform.php b/interface/ispconfig/interface/sites/form/ftp_user.tform.php new file mode 100644 index 0000000000000000000000000000000000000000..2b65c853151446e64abe3b904f1a0790e5f4903a --- /dev/null +++ b/interface/ispconfig/interface/sites/form/ftp_user.tform.php @@ -0,0 +1,253 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['ftp'] = array ( + 'title' => "FTP User", + 'width' => 100, + 'template' => "templates/ftp_user_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE mirror_server_id = 0 AND {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'value' => '' + ), + 'parent_domain_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => "SELECT domain_id,domain FROM web_domain WHERE type = 'vhost' AND {AUTHSQL} ORDER BY domain", + 'keyfield'=> 'domain_id', + 'valuefield'=> 'domain' + ), + 'value' => '' + ), + 'username' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'UNIQUE', + 'errmsg'=> 'username_error_unique'), + 1 => array ( 'type' => 'REGEX', + 'regex' => '/^[\w\.\-]{0,64}$/', + 'errmsg'=> 'username_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'password' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'PASSWORD', + 'encryption' => 'CRYPT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'quota_size' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'quota_size_error_empty'), + ), + 'default' => '-1', + 'value' => '', + 'width' => '7', + 'maxlength' => '7' + ), + 'active' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(0 => 'n',1 => 'y') + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + +if($_SESSION["s"]["user"]["typ"] == 'admin') { + +$form["tabs"]['advanced'] = array ( + 'title' => "Options", + 'width' => 100, + 'template' => "templates/ftp_user_advanced.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'uid' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'uid_error_empty'), + ), + 'default' => '0', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'gid' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'uid_error_empty'), + ), + 'default' => '0', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'dir' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'directory_error_empty'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'quota_files' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '0', + 'value' => '', + 'width' => '7', + 'maxlength' => '7' + ), + 'ul_ratio' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '0', + 'value' => '', + 'width' => '7', + 'maxlength' => '7' + ), + 'dl_ratio' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '0', + 'value' => '', + 'width' => '7', + 'maxlength' => '7' + ), + 'ul_bandwidth' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '0', + 'value' => '', + 'width' => '7', + 'maxlength' => '7' + ), + 'dl_bandwidth' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '0', + 'value' => '', + 'width' => '7', + 'maxlength' => '7' + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + +} else { + +$form["tabs"]['advanced'] = array ( + 'title' => "Options", + 'width' => 100, + 'template' => "templates/ftp_user_advanced_client.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'dir' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'directory_error_empty'), + 1 => array ( 'type' => 'CUSTOM', + 'class' => 'validate_ftpuser', + 'function' => 'ftp_dir', + 'errmsg' => 'directory_error_notinweb'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + +} + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/form/shell_user.tform.php b/interface/ispconfig/interface/sites/form/shell_user.tform.php new file mode 100644 index 0000000000000000000000000000000000000000..cd4dadff6ea575ef8c96f8575c0ccef15adac307 --- /dev/null +++ b/interface/ispconfig/interface/sites/form/shell_user.tform.php @@ -0,0 +1,196 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['shell'] = array ( + 'title' => "Shell User", + 'width' => 100, + 'template' => "templates/shell_user_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE mirror_server_id = 0 AND {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'value' => '' + ), + 'parent_domain_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => "SELECT domain_id,domain FROM web_domain WHERE type = 'vhost' AND {AUTHSQL} ORDER BY domain", + 'keyfield'=> 'domain_id', + 'valuefield'=> 'domain' + ), + 'value' => '' + ), + 'username' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'UNIQUE', + 'errmsg'=> 'username_error_unique'), + 1 => array ( 'type' => 'REGEX', + 'regex' => '/^[\w\.\-]{0,64}$/', + 'errmsg'=> 'username_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'password' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'PASSWORD', + 'encryption' => 'CRYPT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'chroot' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => '', + 'valuelimit' => 'client:ssh_chroot', + 'value' => array('no' => 'None', 'jailkit' => 'Jailkit') + ), + 'quota_size' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'quota_size_error_empty'), + ), + 'default' => '-1', + 'value' => '', + 'width' => '7', + 'maxlength' => '7' + ), + 'active' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(0 => 'n',1 => 'y') + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + +if($_SESSION["s"]["user"]["typ"] == 'admin') { + +$form["tabs"]['advanced'] = array ( + 'title' => "Options", + 'width' => 100, + 'template' => "templates/shell_user_advanced.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'puser' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'uid_error_empty'), + ), + 'default' => '0', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'pgroup' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'uid_error_empty'), + ), + 'default' => '0', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'shell' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '/bin/bash', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'dir' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'directory_error_empty'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + +} + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/form/web_aliasdomain.tform.php b/interface/ispconfig/interface/sites/form/web_aliasdomain.tform.php new file mode 100644 index 0000000000000000000000000000000000000000..1a8dc0b61e0c4b93c064326487910a445f591938 --- /dev/null +++ b/interface/ispconfig/interface/sites/form/web_aliasdomain.tform.php @@ -0,0 +1,142 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['domain'] = array ( + 'title' => "Domain", + 'width' => 100, + 'template' => "templates/web_aliasdomain_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE mirror_server_id = 0 AND {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'value' => '' + ), + 'domain' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'domain_error_empty'), + 1 => array ( 'type' => 'UNIQUE', + 'errmsg'=> 'domain_error_unique'), + 2 => array ( 'type' => 'REGEX', + 'regex' => '/^[\w\.\-]{2,255}\.[a-zA-Z]{2,10}$/', + 'errmsg'=> 'domain_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'type' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => 'y', + 'value' => array('vhost' => 'Site', 'alias' => 'Alias', 'subdomain' => 'Subdomain') + ), + 'parent_domain_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => "SELECT domain_id,domain FROM web_domain WHERE type = 'vhost' AND {AUTHSQL} ORDER BY domain", + 'keyfield'=> 'domain_id', + 'valuefield'=> 'domain' + ), + 'value' => '' + ), + 'redirect_type' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => 'y', + 'value' => array('' => 'No redirect', 'no' => 'No flag', 'R' => 'R', 'L' => 'L', 'R,L' => 'R,L') + ), + 'redirect_path' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'REGEX', + 'regex' => '@^(([.]{0})|(https?://([-\w\.]+)+(:\d+)?(/([\w/_\.\-\,\+\?]*(\?\S+)?)?)?)|(/[\w/_\.\-]{1,255}/))$@', + 'errmsg'=> 'redirect_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'subdomain' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => 'y', + 'value' => array('none' => 'none', 'www' => 'www.', '*' => '*.') + ), + 'active' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(0 => 'n',1 => 'y') + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/form/web_domain.tform.php b/interface/ispconfig/interface/sites/form/web_domain.tform.php new file mode 100644 index 0000000000000000000000000000000000000000..a91e7fb29300e7171cb098bc2251df9d69d8670e --- /dev/null +++ b/interface/ispconfig/interface/sites/form/web_domain.tform.php @@ -0,0 +1,463 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +// Clients may not change the website basic settings if they are not resellers +if($app->auth->has_clients($_SESSION['s']['user']['userid']) || $app->auth->is_admin()) { + $web_domain_edit_readonly = false; +} else { + $web_domain_edit_readonly = true; +} + + +$form["tabs"]['domain'] = array ( + 'title' => "Domain", + 'width' => 100, + 'template' => "templates/web_domain_edit.htm", + 'readonly' => $web_domain_edit_readonly, + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE mirror_server_id = 0 AND web_server = 1 AND {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'value' => '' + ), + 'ip_address' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => '', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT ip_address,ip_address FROM server_ip WHERE {AUTHSQL} ORDER BY ip_address', + 'keyfield'=> 'ip_address', + 'valuefield'=> 'ip_address' + ), + 'value' => '' + ), + 'domain' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'domain_error_empty'), + 1 => array ( 'type' => 'UNIQUE', + 'errmsg'=> 'domain_error_unique'), + 2 => array ( 'type' => 'REGEX', + 'regex' => '/^[\w\.\-]{2,255}\.[a-zA-Z]{2,10}$/', + 'errmsg'=> 'domain_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'type' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => 'y', + 'value' => array('vhost' => 'Site', 'alias' => 'Alias') + ), + 'parent_domain_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => "SELECT domain_id,domain FROM web_domain WHERE type = 'site' AND {AUTHSQL} ORDER BY domain", + 'keyfield'=> 'domain_id', + 'valuefield'=> 'domain' + ), + 'value' => '' + ), + 'vhost_type' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => 'y', + 'value' => array('name' => 'Namebased', 'ip' => 'IP-Based') + ), + 'hd_quota' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'hd_quota_error_empty'), + ), + 'default' => '-1', + 'value' => '', + 'width' => '7', + 'maxlength' => '7' + ), + 'traffic_quota' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'traffic_quota_error_empty'), + ), + 'default' => '-1', + 'value' => '', + 'width' => '7', + 'maxlength' => '7' + ), + 'cgi' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'n', + 'value' => array(0 => 'n',1 => 'y') + ), + 'ssi' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'n', + 'value' => array(0 => 'n',1 => 'y') + ), + 'suexec' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'n', + 'value' => array(0 => 'n',1 => 'y') + ), + 'errordocs' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'CHECKBOX', + 'default' => '1', + 'value' => array(0 => '0',1 => '1') + ), + 'subdomain' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => 'y', + 'value' => array('none' => 'none', 'www' => 'www.', '*' => '*.') + ), + 'ssl' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'n', + 'value' => array(0 => 'n',1 => 'y') + ), + 'php' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => 'fast-cgi', + 'valuelimit' => 'client:web_php_options', + 'value' => array('no' => 'Disabled', 'fast-cgi' => 'Fast-CGI', 'cgi' => 'CGI', 'mod' => 'Mod-PHP', 'suphp' => 'SuPHP') + ), + 'active' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(0 => 'n',1 => 'y') + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + +$form["tabs"]['redirect'] = array ( + 'title' => "Redirect", + 'width' => 100, + 'template' => "templates/web_domain_redirect.htm", + 'readonly' => false, + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'redirect_type' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => '', + 'value' => array('' => 'No redirect', 'no' => 'No flag', 'R' => 'R', 'L' => 'L', 'R,L' => 'R,L') + ), + 'redirect_path' => array ( + 'datatype' => 'VARCHAR', + 'validators' => array ( 0 => array ( 'type' => 'REGEX', + 'regex' => '@^(([.]{0})|(https?://([-\w\.]+)+(:\d+)?(/([\w/_\.\,\-\+\?]*(\?\S+)?)?)?)|(/[\w/_\.\-]{1,255}/))$@', + 'errmsg'=> 'redirect_error_regex'), + ), + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + +$form["tabs"]['ssl'] = array ( + 'title' => "SSL", + 'width' => 100, + 'template' => "templates/web_domain_ssl.htm", + 'readonly' => false, + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'ssl_state' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'REGEX', + 'regex' => '/^(([.]{0})|([a-zA-Z0-9\ \.\-\_\,]{1,255}))$/', + 'errmsg'=> 'ssl_state_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'ssl_locality' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'REGEX', + 'regex' => '/^(([.]{0})|([a-zA-Z0-9\ \.\-\_\,]{1,255}))$/', + 'errmsg'=> 'ssl_locality_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'ssl_organisation' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'REGEX', + 'regex' => '/^(([.]{0})|([a-zA-Z0-9\ \.\-\_\,]{1,255}))$/', + 'errmsg'=> 'ssl_organisation_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'ssl_organisation_unit' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'REGEX', + 'regex' => '/^(([.]{0})|([a-zA-Z0-9\ \.\-\_\,]{1,255}))$/', + 'errmsg'=> 'ssl_organistaion_unit_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'ssl_country' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'REGEX', + 'regex' => '/^(([.]{0})|([A-Z]{2,2}))$/', + 'errmsg'=> 'ssl_country_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '2', + 'maxlength' => '2' + ), + 'ssl_domain' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'ssl_request' => array ( + 'datatype' => 'TEXT', + 'formtype' => 'TEXTAREA', + 'default' => '', + 'value' => '', + 'cols' => '30', + 'rows' => '10' + ), + 'ssl_cert' => array ( + 'datatype' => 'TEXT', + 'formtype' => 'TEXTAREA', + 'default' => '', + 'value' => '', + 'cols' => '30', + 'rows' => '10' + ), + 'ssl_bundle' => array ( + 'datatype' => 'TEXT', + 'formtype' => 'TEXTAREA', + 'default' => '', + 'value' => '', + 'cols' => '30', + 'rows' => '10' + ), + 'ssl_action' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => '', + 'value' => array('' => 'None', 'save' => 'Save Certificate', 'create' => 'Create Certificate','del' => 'Delete Certificate') + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + +//* Statistics +$form["tabs"]['stats'] = array ( + 'title' => "Stats", + 'width' => 100, + 'template' => "templates/web_domain_stats.htm", + 'readonly' => false, + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'stats_password' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'PASSWORD', + 'encryption' => 'CRYPT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + +if($_SESSION["s"]["user"]["typ"] == 'admin') { + +$form["tabs"]['advanced'] = array ( + 'title' => "Options", + 'width' => 100, + 'template' => "templates/web_domain_advanced.htm", + 'readonly' => false, + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'document_root' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'documentroot_error_empty'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'system_user' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'sysuser_error_empty'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'system_group' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'sysgroup_error_empty'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'allow_override' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'allow_override_error_empty'), + ), + 'default' => 'All', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'php_open_basedir' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'php_open_basedir_error_empty'), + ), + 'default' => 'All', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'apache_directives' => array ( + 'datatype' => 'TEXT', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + +} + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/form/web_subdomain.tform.php b/interface/ispconfig/interface/sites/form/web_subdomain.tform.php new file mode 100644 index 0000000000000000000000000000000000000000..b6b1a3c291645a48d9a07a8bae3bee79ef3365ef --- /dev/null +++ b/interface/ispconfig/interface/sites/form/web_subdomain.tform.php @@ -0,0 +1,136 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['domain'] = array ( + 'title' => "Domain", + 'width' => 100, + 'template' => "templates/web_subdomain_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE mirror_server_id = 0 AND {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'value' => '' + ), + 'domain' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'domain_error_empty'), + 1 => array ( 'type' => 'UNIQUE', + 'errmsg'=> 'domain_error_unique'), + 2 => array ( 'type' => 'REGEX', + 'regex' => '/^[\w\.\-]{2,255}\.[a-zA-Z]{2,10}$/', + 'errmsg'=> 'domain_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'type' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => 'y', + 'value' => array('vhost' => 'Site', 'alias' => 'Alias', 'subdomain' => 'Subdomain') + ), + 'parent_domain_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => "SELECT domain_id,domain FROM web_domain WHERE type = 'vhost' AND {AUTHSQL} ORDER BY domain", + 'keyfield'=> 'domain_id', + 'valuefield'=> 'domain' + ), + 'value' => '' + ), + 'redirect_type' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => 'y', + 'value' => array('' => 'No redirect', 'no' => 'No flag', 'R' => 'R', 'L' => 'L', 'R,L' => 'R,L') + ), + 'redirect_path' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'REGEX', + 'regex' => '@^(([.]{0})|(https?://([-\w\.]+)+(:\d+)?(/([\w/_\.\-\,\+\?]*(\?\S+)?)?)?)|(/[\w/_\.\-]{1,255}/))$@', + 'errmsg'=> 'redirect_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'active' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(0 => 'n',1 => 'y') + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/ftp_user_del.php b/interface/ispconfig/interface/sites/ftp_user_del.php new file mode 100644 index 0000000000000000000000000000000000000000..479e19a97fe36f7efa47de6dfef05abb304f884a --- /dev/null +++ b/interface/ispconfig/interface/sites/ftp_user_del.php @@ -0,0 +1,51 @@ +auth->check_module_permissions('sites'); + +$app->uses("tform_actions"); +$app->tform_actions->onDelete(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/ftp_user_edit.php b/interface/ispconfig/interface/sites/ftp_user_edit.php new file mode 100644 index 0000000000000000000000000000000000000000..9823813e6653ce824d0fd733e01e5a424a348cbb --- /dev/null +++ b/interface/ispconfig/interface/sites/ftp_user_edit.php @@ -0,0 +1,209 @@ +auth->check_module_permissions('sites'); + +// Loading classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onShowNew() { + global $app, $conf; + + // we will check only users, not admins + if($_SESSION["s"]["user"]["typ"] == 'user') { + if(!$app->tform->checkClientLimit('limit_ftp_user')) { + $app->error($app->tform->wordbook["limit_ftp_user_txt"]); + } + if(!$app->tform->checkResellerLimit('limit_ftp_user')) { + $app->error('Reseller: '.$app->tform->wordbook["limit_ftp_user_txt"]); + } + } + + parent::onShowNew(); + } + + function onShowEnd() { + global $app, $conf, $interfaceConf; + /* + * If the names are restricted -> remove the restriction, so that the + * data can be edited + */ + + $app->uses('getconf'); + $global_config = $app->getconf->get_global_config('sites'); + // $ftpuser_prefix = ($global_config['ftpuser_prefix'] == '')?'':str_replace('[CLIENTNAME]', $this->getClientName(), $global_config['ftpuser_prefix']); + $ftpuser_prefix = replacePrefix($global_config['ftpuser_prefix'], $this->dataRecord); + + if ($this->dataRecord['username'] != ""){ + /* REMOVE the restriction */ + $app->tpl->setVar("username", str_replace($ftpuser_prefix , '', $this->dataRecord['username'])); + } + if($_SESSION["s"]["user"]["typ"] == 'admin' || $app->auth->has_clients($_SESSION['s']['user']['userid'])) { + $app->tpl->setVar("username_prefix", $global_config['ftpuser_prefix']); + } + else { + $app->tpl->setVar("username_prefix", $ftpuser_prefix); + } + + parent::onShowEnd(); + } + + function onSubmit() { + global $app, $conf; + + // Get the record of the parent domain + $parent_domain = $app->db->queryOneRecord("select * FROM web_domain WHERE domain_id = ".intval(@$this->dataRecord["parent_domain_id"])); + + // Set a few fixed values + $this->dataRecord["server_id"] = $parent_domain["server_id"]; + + //die(print_r($this->dataRecord)); + + if(isset($this->dataRecord['username']) && trim($this->dataRecord['username']) == '') $app->tform->errorMessage .= $app->tform->lng('username_error_empty').'
    '; + if(isset($this->dataRecord['username']) && empty($this->dataRecord['parent_domain_id'])) $app->tform->errorMessage .= $app->tform->lng('parent_domain_id_error_empty').'
    '; + + parent::onSubmit(); + } + + function onBeforeInsert() { + global $app, $conf, $interfaceConf; + + $app->uses('getconf'); + $global_config = $app->getconf->get_global_config('sites'); + //$ftpuser_prefix = ($global_config['ftpuser_prefix'] == '')?'':str_replace('[CLIENTNAME]', $this->getClientName(), $global_config['ftpuser_prefix']); + $ftpuser_prefix = replacePrefix($global_config['ftpuser_prefix'], $this->dataRecord); + + if ($app->tform->errorMessage == '') { + $this->dataRecord['username'] = $ftpuser_prefix . $this->dataRecord['username']; + } + + parent::onBeforeInsert(); + } + + function onAfterInsert() { + global $app, $conf; + + $web = $app->db->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ".intval($this->dataRecord["parent_domain_id"])); + $server_id = $web["server_id"]; + $dir = $web["document_root"]; + $uid = $web["system_user"]; + $gid = $web["system_group"]; + + // The FTP user shall be owned by the same group then the website + $sys_groupid = $web['sys_groupid']; + + $sql = "UPDATE ftp_user SET server_id = $server_id, dir = '$dir', uid = '$uid', gid = '$gid', sys_groupid = '$sys_groupid' WHERE ftp_user_id = ".$this->id; + $app->db->query($sql); + + + } + + function onBeforeUpdate() { + global $app, $conf, $interfaceConf; + + /* + * If the names should be restricted -> do it! + */ + + $app->uses('getconf'); + $global_config = $app->getconf->get_global_config('sites'); + //$ftpuser_prefix = ($global_config['ftpuser_prefix'] == '')?'':str_replace('[CLIENTNAME]', $this->getClientName(), $global_config['ftpuser_prefix']); + $ftpuser_prefix = replacePrefix($global_config['ftpuser_prefix'], $this->dataRecord); + + /* restrict the names */ + if ($app->tform->errorMessage == '') { + $this->dataRecord['username'] = $ftpuser_prefix . $this->dataRecord['username']; + } + } + + function onAfterUpdate() { + global $app, $conf; + + //* When the site of the FTP user has been changed + if($this->oldDataRecord['parent_domain_id'] != $this->dataRecord['parent_domain_id']) { + $web = $app->db->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ".intval($this->dataRecord["parent_domain_id"])); + $server_id = $web["server_id"]; + $dir = $web["document_root"]; + $uid = $web["system_user"]; + $gid = $web["system_group"]; + + // The FTP user shall be owned by the same group then the website + $sys_groupid = $web['sys_groupid']; + + $sql = "UPDATE ftp_user SET server_id = $server_id, dir = '$dir', uid = '$uid', gid = '$gid', sys_groupid = '$sys_groupid' WHERE ftp_user_id = ".$this->id; + $app->db->query($sql); + } + + } + + function getClientName() { + global $app, $conf; + + if($_SESSION["s"]["user"]["typ"] != 'admin' && !$app->auth->has_clients($_SESSION['s']['user']['userid'])) { + // Get the group-id of the user + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + } else { + // Get the group-id from the data itself + $web = $app->db->queryOneRecord("SELECT sys_groupid FROM web_domain WHERE domain_id = ".intval($this->dataRecord['parent_domain_id'])); + $client_group_id = $web['sys_groupid']; + } + /* get the name of the client */ + $tmp = $app->db->queryOneRecord("SELECT name FROM sys_group WHERE groupid = " . $client_group_id); + $clientName = $tmp['name']; + if ($clientName == "") $clientName = 'default'; + $clientName = convertClientName($clientName); + return $clientName; + + } + +} + +$page = new page_action; +$page->onLoad(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/ftp_user_list.php b/interface/ispconfig/interface/sites/ftp_user_list.php new file mode 100644 index 0000000000000000000000000000000000000000..2daaf6b5d84124c7c763df0a4ae286ee9b61dfb7 --- /dev/null +++ b/interface/ispconfig/interface/sites/ftp_user_list.php @@ -0,0 +1,55 @@ +auth->check_module_permissions('sites'); + +$app->uses('listform_actions'); + +// Limit the results to alias domains +//$app->listform_actions->SQLExtWhere = "type = 'subdomain'"; + +$app->listform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/lib/admin.conf.php b/interface/ispconfig/interface/sites/lib/admin.conf.php new file mode 100644 index 0000000000000000000000000000000000000000..a45d4403455c5c46f438046f088398e241cbc3d9 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/admin.conf.php @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/lib/lang/bg.lng b/interface/ispconfig/interface/sites/lib/lang/bg.lng new file mode 100644 index 0000000000000000000000000000000000000000..96c4d23e4b9c4a2a3a6e57acdc73d9f23f94dfff --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/bg.lng @@ -0,0 +1,22 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/bg_cron.lng b/interface/ispconfig/interface/sites/lib/lang/bg_cron.lng new file mode 100644 index 0000000000000000000000000000000000000000..fecb4ab45a3af2e0566a0bde5c15225761106d7c --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/bg_cron.lng @@ -0,0 +1,21 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/bg_cron_list.lng b/interface/ispconfig/interface/sites/lib/lang/bg_cron_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..ad56ea95610bf8bb2344467e0c2b796950c1e59a --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/bg_cron_list.lng @@ -0,0 +1,12 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/bg_database.lng b/interface/ispconfig/interface/sites/lib/lang/bg_database.lng new file mode 100644 index 0000000000000000000000000000000000000000..36a772a9e4e44970aa9eba5ae0735d414a47c6f1 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/bg_database.lng @@ -0,0 +1,25 @@ +any)'; +$wb['database_remote_error_ips'] = 'At least one of the entered ip addresses is invalid.'; +$wb['database_name_error_len'] = 'Database name - {db} - too long. The max. database name length incl. prefix is 64 chars.'; +$wb['database_user_error_len'] = 'Database username - {user}- too long. The max. database username length incl. prefix is 16 chars.'; +?> diff --git a/interface/ispconfig/interface/sites/lib/lang/bg_database_list.lng b/interface/ispconfig/interface/sites/lib/lang/bg_database_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..4ca18c1fd5a09f092917307b5b54b07f310b4eca --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/bg_database_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/bg_ftp_user.lng b/interface/ispconfig/interface/sites/lib/lang/bg_ftp_user.lng new file mode 100644 index 0000000000000000000000000000000000000000..7627ad7d6568b8de559870ce5fcec570312b9cae --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/bg_ftp_user.lng @@ -0,0 +1,27 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/bg_ftp_user_list.lng b/interface/ispconfig/interface/sites/lib/lang/bg_ftp_user_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..b5663c5457662fd77765c34f89021233b87ee0c6 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/bg_ftp_user_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/bg_shell_user.lng b/interface/ispconfig/interface/sites/lib/lang/bg_shell_user.lng new file mode 100644 index 0000000000000000000000000000000000000000..5e75413207d068706fe7f7c5cebc0ce057342eac --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/bg_shell_user.lng @@ -0,0 +1,22 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/bg_shell_user_list.lng b/interface/ispconfig/interface/sites/lib/lang/bg_shell_user_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..254095ecdc394418540e87ee4ade809ec0a1ff1e --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/bg_shell_user_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/bg_web_aliasdomain_list.lng b/interface/ispconfig/interface/sites/lib/lang/bg_web_aliasdomain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..c30d559a2dba75f6cef9c9cc366da0e44c20f1a5 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/bg_web_aliasdomain_list.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/bg_web_domain.lng b/interface/ispconfig/interface/sites/lib/lang/bg_web_domain.lng new file mode 100644 index 0000000000000000000000000000000000000000..d705cb4bf0ad634b7c2aecd3baf1aedaca047141 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/bg_web_domain.lng @@ -0,0 +1,60 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/bg_web_domain_list.lng b/interface/ispconfig/interface/sites/lib/lang/bg_web_domain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..57d63e5618f222dfa4ae9dc287f0c0c15ca400c1 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/bg_web_domain_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/bg_web_sites_stats_list.lng b/interface/ispconfig/interface/sites/lib/lang/bg_web_sites_stats_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..b217f80cca7a7c5c82dc96cb5fce585b510d80b6 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/bg_web_sites_stats_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/bg_web_subdomain.lng b/interface/ispconfig/interface/sites/lib/lang/bg_web_subdomain.lng new file mode 100644 index 0000000000000000000000000000000000000000..265bb171ffb086b6b2e3ddf09da695886bd3dc6d --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/bg_web_subdomain.lng @@ -0,0 +1,40 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/bg_web_subdomain_list.lng b/interface/ispconfig/interface/sites/lib/lang/bg_web_subdomain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..d08e40579f0ba319cee5fe7a8522a29013bba134 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/bg_web_subdomain_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/br.lng b/interface/ispconfig/interface/sites/lib/lang/br.lng new file mode 100644 index 0000000000000000000000000000000000000000..f78b138b745e87523368bdb715165297be931247 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/br.lng @@ -0,0 +1,22 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/br_cron.lng b/interface/ispconfig/interface/sites/lib/lang/br_cron.lng new file mode 100644 index 0000000000000000000000000000000000000000..f0739c6d70261f37e3e929a6a6a57998f1d4604e --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/br_cron.lng @@ -0,0 +1,21 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/br_cron_list.lng b/interface/ispconfig/interface/sites/lib/lang/br_cron_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..b974f0fb14d68faa6f56ed6ebdd4929ac0ba7ce4 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/br_cron_list.lng @@ -0,0 +1,12 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/br_database.lng b/interface/ispconfig/interface/sites/lib/lang/br_database.lng new file mode 100644 index 0000000000000000000000000000000000000000..a0f3d68479667ef0f07890332e8c446fc0fb26d6 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/br_database.lng @@ -0,0 +1,25 @@ +quaisquer ips)'; +$wb['database_remote_error_ips'] = 'Pelo menos um dos endereços ip informados não é válido.'; +$wb['database_name_error_len'] = 'Nome do banco de dados - {db} - é muito longo. 64 caracteres é o número máximo permitido incluindo prefixo.'; +$wb['database_user_error_len'] = 'Nome de usuário de banco - {user}- é muito longo. 16 caracteres é o número máximo permitido incluindo prefixo.'; +?> diff --git a/interface/ispconfig/interface/sites/lib/lang/br_database_list.lng b/interface/ispconfig/interface/sites/lib/lang/br_database_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..449baa8bba50dda04b17b410ec8e632cdc4fc90c --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/br_database_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/br_ftp_user.lng b/interface/ispconfig/interface/sites/lib/lang/br_ftp_user.lng new file mode 100644 index 0000000000000000000000000000000000000000..e24355fb4b218cac95bec40d4502679746080493 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/br_ftp_user.lng @@ -0,0 +1,27 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/br_ftp_user_list.lng b/interface/ispconfig/interface/sites/lib/lang/br_ftp_user_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..a9540c9cda2a37a2f2a271706961d65dabd79028 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/br_ftp_user_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/br_shell_user.lng b/interface/ispconfig/interface/sites/lib/lang/br_shell_user.lng new file mode 100644 index 0000000000000000000000000000000000000000..2a99587eb65d4f4bb34784929a604cdaf5854a52 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/br_shell_user.lng @@ -0,0 +1,22 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/br_shell_user_list.lng b/interface/ispconfig/interface/sites/lib/lang/br_shell_user_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..512f9fe837dd834b23b713b8e0fb4feb8f6ba743 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/br_shell_user_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/br_web_aliasdomain_list.lng b/interface/ispconfig/interface/sites/lib/lang/br_web_aliasdomain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..f9dbfa277141a65a0ec50b8ce8949be35aef3c24 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/br_web_aliasdomain_list.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/br_web_domain.lng b/interface/ispconfig/interface/sites/lib/lang/br_web_domain.lng new file mode 100644 index 0000000000000000000000000000000000000000..5f8321faf981240dff679f3cccd72bedaae23c00 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/br_web_domain.lng @@ -0,0 +1,60 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/br_web_domain_list.lng b/interface/ispconfig/interface/sites/lib/lang/br_web_domain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..dc520038755780f4d4d82f4630b478481f9ae3b7 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/br_web_domain_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/br_web_sites_stats_list.lng b/interface/ispconfig/interface/sites/lib/lang/br_web_sites_stats_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..903c905716a47d4545498d8cf87ea2fc8eb16cc0 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/br_web_sites_stats_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/br_web_subdomain.lng b/interface/ispconfig/interface/sites/lib/lang/br_web_subdomain.lng new file mode 100644 index 0000000000000000000000000000000000000000..0a63c460dae4737011c434973c8a646a9d9f669f --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/br_web_subdomain.lng @@ -0,0 +1,40 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/br_web_subdomain_list.lng b/interface/ispconfig/interface/sites/lib/lang/br_web_subdomain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..83511672af6d09da3b1301975658a18e758c943c --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/br_web_subdomain_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/de.lng b/interface/ispconfig/interface/sites/lib/lang/de.lng new file mode 100644 index 0000000000000000000000000000000000000000..d921ad4d86d679df4a4c1dbc506be0c475282364 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/de.lng @@ -0,0 +1,22 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/de_cron.lng b/interface/ispconfig/interface/sites/lib/lang/de_cron.lng new file mode 100644 index 0000000000000000000000000000000000000000..f002b126af0bf726f750b9fadbbb86b1cb13b20d --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/de_cron.lng @@ -0,0 +1,21 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/de_cron_list.lng b/interface/ispconfig/interface/sites/lib/lang/de_cron_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..9778e9fa98448422ac5d0c5dcfb2ba399a609972 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/de_cron_list.lng @@ -0,0 +1,12 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/de_database.lng b/interface/ispconfig/interface/sites/lib/lang/de_database.lng new file mode 100644 index 0000000000000000000000000000000000000000..f604997ba3c045da3271aca0927e7ac1f3eaa593 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/de_database.lng @@ -0,0 +1,25 @@ +alle)'; +$wb['database_remote_error_ips'] = 'Mindestens eine der eingegebenen IP Adressen ist ungültig.'; +$wb['client_txt'] = 'Kunde'; +$wb['active_txt'] = 'Aktiv'; +$wb['database_name_error_empty'] = 'Datenbankname ist leer.'; +$wb['database_name_error_unique'] = 'Es existiert bereits eine Datenbank mit diesem Namen am Server. Um einen eindeutigen Namen zu erhalten können sie z.B. den Domainnamen vor dem Datenbanknamen verwenden.'; +$wb['database_name_error_regex'] = 'Ungültiger Datenbankname. Der Datenbankname darf die Zeichen: a-z, A-Z, 0-9 und den Unterstrich beinhalten. Länge: 2 - 64 Zeichen.'; +$wb['database_user_error_empty'] = 'Datenbank Benutzer ist leer.'; +$wb['database_user_error_unique'] = 'Es existiert bereits ein Benutzer mit diesem Namen am Server. Um einen eindeutigen Namen zu erhalten können sie z.B. den Domainnamen vor dem Benutzernamen verwenden.'; +$wb['database_user_error_regex'] = 'Ungültiger Benutzername. Der Benutzername darf die Zeichen: a-z, A-Z, 0-9 und den Unterstrich beinhalten. Länge: 2 - 64 Zeichen.'; +$wb['limit_database_txt'] = 'Die maximale Anzahl an Datenbanken wurde erreicht.'; +$wb['database_name_change_txt'] = 'Der Datenbankname kann nicht geändert werden.'; +$wb['database_charset_change_txt'] = 'Der Zeichensatz der Datenbank kann nicht geändert werden.'; +$wb['password_strength_txt'] = 'Passwortkomplexität'; +$wb['database_name_error_len'] = 'Datenbank Name - {db} - zu lang. Die max. Datenbank Namen Länge inkl. Präfix ist 64 Zeichen.'; +$wb['database_user_error_len'] = 'Datenbank Benutzername - {user}- zu lang. Die max. Datenbank Benutzernamen Länge inkl. Präfix ist 16 Zeichen.'; +?> diff --git a/interface/ispconfig/interface/sites/lib/lang/de_database_list.lng b/interface/ispconfig/interface/sites/lib/lang/de_database_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..b34ac4e6913ade6e6352920cd55f03f50c999f83 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/de_database_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/de_ftp_user.lng b/interface/ispconfig/interface/sites/lib/lang/de_ftp_user.lng new file mode 100644 index 0000000000000000000000000000000000000000..dcd8b029136519c991c9af6d67d24faa8e585698 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/de_ftp_user.lng @@ -0,0 +1,27 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/de_ftp_user_list.lng b/interface/ispconfig/interface/sites/lib/lang/de_ftp_user_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..a2d162c0b0ccdc9499eeab37c8efe0bc8f3ed75a --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/de_ftp_user_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/de_shell_user.lng b/interface/ispconfig/interface/sites/lib/lang/de_shell_user.lng new file mode 100644 index 0000000000000000000000000000000000000000..92589ee77a3fea9ed1d70586eb65130a08eea317 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/de_shell_user.lng @@ -0,0 +1,22 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/de_shell_user_list.lng b/interface/ispconfig/interface/sites/lib/lang/de_shell_user_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..cd822899c0e2da08cf12f61296342d8601cf07d3 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/de_shell_user_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/de_web_aliasdomain_list.lng b/interface/ispconfig/interface/sites/lib/lang/de_web_aliasdomain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..98fb1a3e7135d8574071d8bade5aa49e8d7f0aea --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/de_web_aliasdomain_list.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/de_web_domain.lng b/interface/ispconfig/interface/sites/lib/lang/de_web_domain.lng new file mode 100644 index 0000000000000000000000000000000000000000..d8cbfcd9405d3547f4ae905178413fac7497b2e6 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/de_web_domain.lng @@ -0,0 +1,60 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/de_web_domain_list.lng b/interface/ispconfig/interface/sites/lib/lang/de_web_domain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..71f0e0ae6d85338d8ffbaec2519dce2a06356138 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/de_web_domain_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/de_web_sites_stats_list.lng b/interface/ispconfig/interface/sites/lib/lang/de_web_sites_stats_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..660abfb25eeb0aa8696299ed29f6a43f06b08854 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/de_web_sites_stats_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/de_web_subdomain.lng b/interface/ispconfig/interface/sites/lib/lang/de_web_subdomain.lng new file mode 100644 index 0000000000000000000000000000000000000000..8b1fa8ddd1c7898014dde02443da6efba0c42cc5 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/de_web_subdomain.lng @@ -0,0 +1,40 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/de_web_subdomain_list.lng b/interface/ispconfig/interface/sites/lib/lang/de_web_subdomain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..ba4fc6daddac903f1aa0f502cb7d7c40e7474d5d --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/de_web_subdomain_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/en.lng b/interface/ispconfig/interface/sites/lib/lang/en.lng new file mode 100644 index 0000000000000000000000000000000000000000..36c63bc5b368f4385796ca4956129329be404621 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/en.lng @@ -0,0 +1,22 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/lib/lang/en_cron.lng b/interface/ispconfig/interface/sites/lib/lang/en_cron.lng new file mode 100644 index 0000000000000000000000000000000000000000..8cb7f08e6d54bea35b9da3d9a60f4479fe786c45 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/en_cron.lng @@ -0,0 +1,21 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/lib/lang/en_cron_list.lng b/interface/ispconfig/interface/sites/lib/lang/en_cron_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..b5c8d1566e10c85256ba7a5a869344bba1608ffb --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/en_cron_list.lng @@ -0,0 +1,12 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/lib/lang/en_database.lng b/interface/ispconfig/interface/sites/lib/lang/en_database.lng new file mode 100644 index 0000000000000000000000000000000000000000..48d7ea3b148dbc621e4909af85368373d12ea434 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/en_database.lng @@ -0,0 +1,25 @@ +any)'; +$wb["database_remote_error_ips"] = 'At least one of the entered ip addresses is invalid.'; +$wb["client_txt"] = 'Client'; +$wb["active_txt"] = 'Active'; +$wb["database_name_error_empty"] = 'Database name is empty.'; +$wb["database_name_error_unique"] = 'There is already a database with this name on the server. To get a unique name, e.g. prepend your domain name to the database name.'; +$wb["database_name_error_regex"] = 'Invalid database name. The database name may contain these characters: a-z, A-Z, 0-9 and the underscore. Length: 2 - 64 characters.'; +$wb["database_user_error_empty"] = 'Database user is empty.'; +$wb["database_user_error_unique"] = 'There is already a database user with this name on the server. To get a unique name, e.g. prepend your domain name to the username.'; +$wb["database_user_error_regex"] = 'Invalid database user name. The username may contain these characters: a-z, A-Z, 0-9 and the underscore. Length: 2 - 64 characters.'; +$wb["limit_database_txt"] = 'The max. number of databases is reached.'; +$wb["database_name_change_txt"] = 'The database name can not be changed'; +$wb["database_charset_change_txt"] = 'The database charset can not be changed'; +$wb["database_name_error_len"] = 'Database name - {db} - too long. The max. database name length incl. prefix is 64 chars.'; +$wb["database_user_error_len"] = 'Database username - {user}- too long. The max. database username length incl. prefix is 16 chars.'; +?> diff --git a/interface/ispconfig/interface/sites/lib/lang/en_database_list.lng b/interface/ispconfig/interface/sites/lib/lang/en_database_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..ff599d270a5ad30222099ca905371556df1ded8a --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/en_database_list.lng @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/lib/lang/en_ftp_user.lng b/interface/ispconfig/interface/sites/lib/lang/en_ftp_user.lng new file mode 100644 index 0000000000000000000000000000000000000000..f5b111639ec1170b0b87bf47fd950e2a20425a61 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/en_ftp_user.lng @@ -0,0 +1,28 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/en_ftp_user_list.lng b/interface/ispconfig/interface/sites/lib/lang/en_ftp_user_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..2c4f87f7292dae34639f88bdb6cb38b29a0f61ee --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/en_ftp_user_list.lng @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/lib/lang/en_shell_user.lng b/interface/ispconfig/interface/sites/lib/lang/en_shell_user.lng new file mode 100644 index 0000000000000000000000000000000000000000..80e3e0a4fe6c34d9f5a498e67cb53d7b60f8981c --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/en_shell_user.lng @@ -0,0 +1,23 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/en_shell_user_list.lng b/interface/ispconfig/interface/sites/lib/lang/en_shell_user_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..5b6f613d6e3634540dd21f31508bc7a5c98c8138 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/en_shell_user_list.lng @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/lib/lang/en_web_aliasdomain_list.lng b/interface/ispconfig/interface/sites/lib/lang/en_web_aliasdomain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..3945d2316e73cb907bb1df7a289bb2d9e3d861b2 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/en_web_aliasdomain_list.lng @@ -0,0 +1,11 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/lib/lang/en_web_domain.lng b/interface/ispconfig/interface/sites/lib/lang/en_web_domain.lng new file mode 100644 index 0000000000000000000000000000000000000000..b26014db98aaf3bda742610e1b7568ccdec8be6d --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/en_web_domain.lng @@ -0,0 +1,61 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/en_web_domain_list.lng b/interface/ispconfig/interface/sites/lib/lang/en_web_domain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..493350e85c7bbc00c88b57ecaaccb3dab5a1cf7f --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/en_web_domain_list.lng @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/lib/lang/en_web_sites_stats_list.lng b/interface/ispconfig/interface/sites/lib/lang/en_web_sites_stats_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..20f018b82623f4e8de0a6a3ec2bab3e8569971ef --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/en_web_sites_stats_list.lng @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/lib/lang/en_web_subdomain.lng b/interface/ispconfig/interface/sites/lib/lang/en_web_subdomain.lng new file mode 100644 index 0000000000000000000000000000000000000000..6bd3b089517b0530b0539e0d91733314958c55b0 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/en_web_subdomain.lng @@ -0,0 +1,40 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/lib/lang/en_web_subdomain_list.lng b/interface/ispconfig/interface/sites/lib/lang/en_web_subdomain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..8273dbd066713780708f9e2b68f58a4c726dee27 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/en_web_subdomain_list.lng @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/lib/lang/es.lng b/interface/ispconfig/interface/sites/lib/lang/es.lng new file mode 100644 index 0000000000000000000000000000000000000000..29ce8ded6b53776fa81d07c73b92fbcf479fb37b --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/es.lng @@ -0,0 +1,22 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/es_cron.lng b/interface/ispconfig/interface/sites/lib/lang/es_cron.lng new file mode 100644 index 0000000000000000000000000000000000000000..cce69f3f8fdd1ab60dfbf85fbba346fd21b4e1ea --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/es_cron.lng @@ -0,0 +1,21 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/es_cron_list.lng b/interface/ispconfig/interface/sites/lib/lang/es_cron_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..f2d2ce4e86eabc378f1fd2e975218a81188da3aa --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/es_cron_list.lng @@ -0,0 +1,12 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/es_database.lng b/interface/ispconfig/interface/sites/lib/lang/es_database.lng new file mode 100644 index 0000000000000000000000000000000000000000..70df8eed1f65850d9e3e1ebe364238e67dfc9253 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/es_database.lng @@ -0,0 +1,25 @@ +cualquiera)'; +$wb['database_remote_error_ips'] = 'Al menos una de las IP introducidas no es válida.'; +$wb['database_name_error_len'] = 'El nombre de la base de datos - {db} - es demasiado largo. La longitud máxima del nombre de la base de datos, incluyendo el prefijo, es de 64 caracteres.'; +$wb['database_user_error_len'] = 'El nombre de usuario de la base de datos - {user}- es demasiado largo. La longitud máxima del nombre de usuario de la base de datos, incluyendo el prefijo, es de 16 caracteres.'; +?> diff --git a/interface/ispconfig/interface/sites/lib/lang/es_database_list.lng b/interface/ispconfig/interface/sites/lib/lang/es_database_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..66fcbdcaf7c5e4638cf2bfb184cbd4213933d572 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/es_database_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/es_ftp_user.lng b/interface/ispconfig/interface/sites/lib/lang/es_ftp_user.lng new file mode 100644 index 0000000000000000000000000000000000000000..efa6f3307cd8b82e3bcd961dadc189e9d3401f76 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/es_ftp_user.lng @@ -0,0 +1,27 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/es_ftp_user_list.lng b/interface/ispconfig/interface/sites/lib/lang/es_ftp_user_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..c96552304fc80e71f319b8bdc5d657c011a64fed --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/es_ftp_user_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/es_shell_user.lng b/interface/ispconfig/interface/sites/lib/lang/es_shell_user.lng new file mode 100644 index 0000000000000000000000000000000000000000..6bafd707385d382c9aaf4cd2814ce68591da78d9 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/es_shell_user.lng @@ -0,0 +1,22 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/es_shell_user_list.lng b/interface/ispconfig/interface/sites/lib/lang/es_shell_user_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..a64cc4e55833c10cd5500557cb57271c6c3637a0 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/es_shell_user_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/es_web_aliasdomain_list.lng b/interface/ispconfig/interface/sites/lib/lang/es_web_aliasdomain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..a383b3d013be8844b71d6cea3a4e53173b8a0aaf --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/es_web_aliasdomain_list.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/es_web_domain.lng b/interface/ispconfig/interface/sites/lib/lang/es_web_domain.lng new file mode 100644 index 0000000000000000000000000000000000000000..feaa5323a8ddc98d08d5fd1020606ef4c47f631c --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/es_web_domain.lng @@ -0,0 +1,60 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/es_web_domain_list.lng b/interface/ispconfig/interface/sites/lib/lang/es_web_domain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..f0248c5fe8b8e02b12b8f1d1021a432503196d03 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/es_web_domain_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/es_web_sites_stats_list.lng b/interface/ispconfig/interface/sites/lib/lang/es_web_sites_stats_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..8c31b6fc506853f1baad1415215037373db582fa --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/es_web_sites_stats_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/es_web_subdomain.lng b/interface/ispconfig/interface/sites/lib/lang/es_web_subdomain.lng new file mode 100644 index 0000000000000000000000000000000000000000..0b799ccd2dc89404fb26e335bfa149162b9ee6d1 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/es_web_subdomain.lng @@ -0,0 +1,40 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/es_web_subdomain_list.lng b/interface/ispconfig/interface/sites/lib/lang/es_web_subdomain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..2b3afa50e799c9a12afb418b8afef2d51f7f4420 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/es_web_subdomain_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/fi.lng b/interface/ispconfig/interface/sites/lib/lang/fi.lng new file mode 100644 index 0000000000000000000000000000000000000000..4e6e6b6120141ec181b35e10258d268ce9dd12ec --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/fi.lng @@ -0,0 +1,22 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/fi_cron.lng b/interface/ispconfig/interface/sites/lib/lang/fi_cron.lng new file mode 100644 index 0000000000000000000000000000000000000000..648b85c6cfb3e860a33aaf5fec9156897aa0ffe5 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/fi_cron.lng @@ -0,0 +1,21 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/fi_cron_list.lng b/interface/ispconfig/interface/sites/lib/lang/fi_cron_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..b5072ec8920b31d5b677570215a47a0074ff4e70 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/fi_cron_list.lng @@ -0,0 +1,12 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/fi_database.lng b/interface/ispconfig/interface/sites/lib/lang/fi_database.lng new file mode 100644 index 0000000000000000000000000000000000000000..2d2dcd875e6dc8c104841d105cf2eaff2880b814 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/fi_database.lng @@ -0,0 +1,25 @@ +kaikki)'; +$wb['database_remote_error_ips'] = 'Ainakin yksi annetuista ip-osoitteista on väärin.'; +$wb['database_name_error_len'] = 'Tietokannan nimi on liian pitkä. Nimen enimmäispituus etuliite mukaanlukien on 64 merkkiä.'; +$wb['database_user_error_len'] = 'Tietokanan käyttäjän nimi on liian pitkä. Nimen enimmäispituus etuliite mukaanlukien on 16 merkkiä.'; +?> diff --git a/interface/ispconfig/interface/sites/lib/lang/fi_database_list.lng b/interface/ispconfig/interface/sites/lib/lang/fi_database_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..a231a6fb95b6796cb378becaeeacf97fa18e47f8 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/fi_database_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/fi_ftp_user.lng b/interface/ispconfig/interface/sites/lib/lang/fi_ftp_user.lng new file mode 100644 index 0000000000000000000000000000000000000000..3e6da305a1ec302c7231b9edddb7b8fb9a62cf93 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/fi_ftp_user.lng @@ -0,0 +1,27 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/fi_ftp_user_list.lng b/interface/ispconfig/interface/sites/lib/lang/fi_ftp_user_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..81c60b6d71bc24571873fcb366b396c1fa8c6982 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/fi_ftp_user_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/fi_shell_user.lng b/interface/ispconfig/interface/sites/lib/lang/fi_shell_user.lng new file mode 100644 index 0000000000000000000000000000000000000000..94d8ca8dd1ad77f24a1599c67c1d413be6f56956 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/fi_shell_user.lng @@ -0,0 +1,22 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/fi_shell_user_list.lng b/interface/ispconfig/interface/sites/lib/lang/fi_shell_user_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..c09edb230acb5e4a942fdb987238c38f38a01252 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/fi_shell_user_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/fi_web_aliasdomain_list.lng b/interface/ispconfig/interface/sites/lib/lang/fi_web_aliasdomain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..8f5c5ccf12e77b7af7cc8b4d2e5e017cc8c36f72 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/fi_web_aliasdomain_list.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/fi_web_domain.lng b/interface/ispconfig/interface/sites/lib/lang/fi_web_domain.lng new file mode 100644 index 0000000000000000000000000000000000000000..9845b3cf4cfad7f1dc701199f5e7212ab8faf884 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/fi_web_domain.lng @@ -0,0 +1,60 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/fi_web_domain_list.lng b/interface/ispconfig/interface/sites/lib/lang/fi_web_domain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..8f5691c2f8315fc08e96aeb0595fe78d269311bc --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/fi_web_domain_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/fi_web_sites_stats_list.lng b/interface/ispconfig/interface/sites/lib/lang/fi_web_sites_stats_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..3d9b079bfff39a7a711e562de0dcb842159aab4e --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/fi_web_sites_stats_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/fi_web_subdomain.lng b/interface/ispconfig/interface/sites/lib/lang/fi_web_subdomain.lng new file mode 100644 index 0000000000000000000000000000000000000000..79f789e37dd2652d1aa82850b242e42d5fa9f221 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/fi_web_subdomain.lng @@ -0,0 +1,40 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/fi_web_subdomain_list.lng b/interface/ispconfig/interface/sites/lib/lang/fi_web_subdomain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..31fb17028aaad6c705eaf03022d7218d9d5bdd9e --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/fi_web_subdomain_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/fr.lng b/interface/ispconfig/interface/sites/lib/lang/fr.lng new file mode 100644 index 0000000000000000000000000000000000000000..11bf18ef0260ec014a69ed2c66123145359152b6 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/fr.lng @@ -0,0 +1,22 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/fr_cron.lng b/interface/ispconfig/interface/sites/lib/lang/fr_cron.lng new file mode 100644 index 0000000000000000000000000000000000000000..67722ca789d633ee9fb800cbb035c4daf180622a --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/fr_cron.lng @@ -0,0 +1,21 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/fr_cron_list.lng b/interface/ispconfig/interface/sites/lib/lang/fr_cron_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..72bd11985e0482c206cebe05ebb31889be2a83f8 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/fr_cron_list.lng @@ -0,0 +1,12 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/fr_database.lng b/interface/ispconfig/interface/sites/lib/lang/fr_database.lng new file mode 100644 index 0000000000000000000000000000000000000000..a8e5a19761a2c9c6a66297747ba101090e3ee8e4 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/fr_database.lng @@ -0,0 +1,25 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/fr_database_list.lng b/interface/ispconfig/interface/sites/lib/lang/fr_database_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..feb751bfb6b21e3c7f276729d186bda93d7d6a30 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/fr_database_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/fr_ftp_user.lng b/interface/ispconfig/interface/sites/lib/lang/fr_ftp_user.lng new file mode 100644 index 0000000000000000000000000000000000000000..466273d2e688989ddff0483205b0aee1a842cf67 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/fr_ftp_user.lng @@ -0,0 +1,27 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/fr_ftp_user_list.lng b/interface/ispconfig/interface/sites/lib/lang/fr_ftp_user_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..2281e48d7787d57719ca1f68f48528c638b7eda1 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/fr_ftp_user_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/fr_shell_user.lng b/interface/ispconfig/interface/sites/lib/lang/fr_shell_user.lng new file mode 100644 index 0000000000000000000000000000000000000000..d80f39a386067820af10274339bcb73b56a1f48d --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/fr_shell_user.lng @@ -0,0 +1,22 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/fr_shell_user_list.lng b/interface/ispconfig/interface/sites/lib/lang/fr_shell_user_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..ff862e1b3be327ba689d0827e3d32eb612168491 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/fr_shell_user_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/fr_web_aliasdomain_list.lng b/interface/ispconfig/interface/sites/lib/lang/fr_web_aliasdomain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..b2120128517b8d0177af7ccb1d3a3ef5890fb836 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/fr_web_aliasdomain_list.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/fr_web_domain.lng b/interface/ispconfig/interface/sites/lib/lang/fr_web_domain.lng new file mode 100644 index 0000000000000000000000000000000000000000..895ccef5f5c26f91a51874547a227ebc82c5d0a4 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/fr_web_domain.lng @@ -0,0 +1,60 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/fr_web_domain_list.lng b/interface/ispconfig/interface/sites/lib/lang/fr_web_domain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..ddf66f8d91a84acc394ceace0f34a1be43486180 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/fr_web_domain_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/fr_web_sites_stats_list.lng b/interface/ispconfig/interface/sites/lib/lang/fr_web_sites_stats_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..41018d301a758714c992068935cb3393b208c163 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/fr_web_sites_stats_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/fr_web_subdomain.lng b/interface/ispconfig/interface/sites/lib/lang/fr_web_subdomain.lng new file mode 100644 index 0000000000000000000000000000000000000000..8558868ed3b7a7b1a44bba38aeb42829fe3e729f --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/fr_web_subdomain.lng @@ -0,0 +1,40 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/fr_web_subdomain_list.lng b/interface/ispconfig/interface/sites/lib/lang/fr_web_subdomain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..9bfbd30f2ee8c619dd920925c8e478fba3ee576b --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/fr_web_subdomain_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/hu.lng b/interface/ispconfig/interface/sites/lib/lang/hu.lng new file mode 100644 index 0000000000000000000000000000000000000000..c02b30f3951028e020f54f7c26e737149d80a5db --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/hu.lng @@ -0,0 +1,22 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/hu_cron.lng b/interface/ispconfig/interface/sites/lib/lang/hu_cron.lng new file mode 100644 index 0000000000000000000000000000000000000000..fecb4ab45a3af2e0566a0bde5c15225761106d7c --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/hu_cron.lng @@ -0,0 +1,21 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/hu_cron_list.lng b/interface/ispconfig/interface/sites/lib/lang/hu_cron_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..ad56ea95610bf8bb2344467e0c2b796950c1e59a --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/hu_cron_list.lng @@ -0,0 +1,12 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/hu_database.lng b/interface/ispconfig/interface/sites/lib/lang/hu_database.lng new file mode 100644 index 0000000000000000000000000000000000000000..621f6a0dc0a8358d238062349e6c0fc40d1de4da --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/hu_database.lng @@ -0,0 +1,25 @@ +any)'; +$wb['database_remote_error_ips'] = 'At least one of the entered ip addresses is invalid.'; +$wb['database_name_error_len'] = 'Database name - {db} - too long. The max. database name length incl. prefix is 64 chars.'; +$wb['database_user_error_len'] = 'Database username - {user}- too long. The max. database username length incl. prefix is 16 chars.'; +?> diff --git a/interface/ispconfig/interface/sites/lib/lang/hu_database_list.lng b/interface/ispconfig/interface/sites/lib/lang/hu_database_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..8560704aa3b0495d6b8b1cba00dc85458f05459c --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/hu_database_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/hu_ftp_user.lng b/interface/ispconfig/interface/sites/lib/lang/hu_ftp_user.lng new file mode 100644 index 0000000000000000000000000000000000000000..a2f816918b5e72a9d7ff6113381578024edc2c51 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/hu_ftp_user.lng @@ -0,0 +1,27 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/hu_ftp_user_list.lng b/interface/ispconfig/interface/sites/lib/lang/hu_ftp_user_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..54578fd6c15b4d188076030f31e7f98a202483ec --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/hu_ftp_user_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/hu_shell_user.lng b/interface/ispconfig/interface/sites/lib/lang/hu_shell_user.lng new file mode 100644 index 0000000000000000000000000000000000000000..30d6e045307c8b4e3d21a03238b40227c69b7c1c --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/hu_shell_user.lng @@ -0,0 +1,22 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/hu_shell_user_list.lng b/interface/ispconfig/interface/sites/lib/lang/hu_shell_user_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..22a38a1ead61d052771152c32e41ff0520b6165d --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/hu_shell_user_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/hu_web_aliasdomain_list.lng b/interface/ispconfig/interface/sites/lib/lang/hu_web_aliasdomain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..a8506ee71b029906921e5aed7529a4c23708c57c --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/hu_web_aliasdomain_list.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/hu_web_domain.lng b/interface/ispconfig/interface/sites/lib/lang/hu_web_domain.lng new file mode 100644 index 0000000000000000000000000000000000000000..0f042134b7fbb305ba63dd799df99e7ecaf234d0 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/hu_web_domain.lng @@ -0,0 +1,60 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/hu_web_domain_list.lng b/interface/ispconfig/interface/sites/lib/lang/hu_web_domain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..88ec412daabfb125db4038dc964c2fdec237e843 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/hu_web_domain_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/hu_web_sites_stats_list.lng b/interface/ispconfig/interface/sites/lib/lang/hu_web_sites_stats_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..b217f80cca7a7c5c82dc96cb5fce585b510d80b6 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/hu_web_sites_stats_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/hu_web_subdomain.lng b/interface/ispconfig/interface/sites/lib/lang/hu_web_subdomain.lng new file mode 100644 index 0000000000000000000000000000000000000000..369622b5c43de36b3178280ec7ca317d8c6d6e66 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/hu_web_subdomain.lng @@ -0,0 +1,40 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/hu_web_subdomain_list.lng b/interface/ispconfig/interface/sites/lib/lang/hu_web_subdomain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..268a1b95e8583c82b6b841d88a292f3b5a3bfd53 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/hu_web_subdomain_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/it.lng b/interface/ispconfig/interface/sites/lib/lang/it.lng new file mode 100644 index 0000000000000000000000000000000000000000..2dd1d27e16b7917155b4bf462e828c7343976223 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/it.lng @@ -0,0 +1,22 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/it_cron.lng b/interface/ispconfig/interface/sites/lib/lang/it_cron.lng new file mode 100644 index 0000000000000000000000000000000000000000..fecb4ab45a3af2e0566a0bde5c15225761106d7c --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/it_cron.lng @@ -0,0 +1,21 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/it_cron_list.lng b/interface/ispconfig/interface/sites/lib/lang/it_cron_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..ad56ea95610bf8bb2344467e0c2b796950c1e59a --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/it_cron_list.lng @@ -0,0 +1,12 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/it_database.lng b/interface/ispconfig/interface/sites/lib/lang/it_database.lng new file mode 100644 index 0000000000000000000000000000000000000000..8921c117339fb1c1fc1fc51b1e3ab9f1da729a37 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/it_database.lng @@ -0,0 +1,25 @@ +any)'; +$wb['database_remote_error_ips'] = 'At least one of the entered ip addresses is invalid.'; +$wb['database_name_error_len'] = 'Database name - {db} - too long. The max. database name length incl. prefix is 64 chars.'; +$wb['database_user_error_len'] = 'Database username - {user}- too long. The max. database username length incl. prefix is 16 chars.'; +?> diff --git a/interface/ispconfig/interface/sites/lib/lang/it_database_list.lng b/interface/ispconfig/interface/sites/lib/lang/it_database_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..891b4d66a5e735ffa1eb81ea2abe0c7aa57139aa --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/it_database_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/it_ftp_user.lng b/interface/ispconfig/interface/sites/lib/lang/it_ftp_user.lng new file mode 100644 index 0000000000000000000000000000000000000000..9da271951be70ef872e99ad459abcf76e20bc06e --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/it_ftp_user.lng @@ -0,0 +1,27 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/it_ftp_user_list.lng b/interface/ispconfig/interface/sites/lib/lang/it_ftp_user_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..9469625771cb1d7677428f278c6e2569361a0475 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/it_ftp_user_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/it_shell_user.lng b/interface/ispconfig/interface/sites/lib/lang/it_shell_user.lng new file mode 100644 index 0000000000000000000000000000000000000000..0f2ea6c84627b2c5187f609cc61060a049a473ec --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/it_shell_user.lng @@ -0,0 +1,22 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/it_shell_user_list.lng b/interface/ispconfig/interface/sites/lib/lang/it_shell_user_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..e6fc063c8dd80122780b67710ac2845047d1ee3b --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/it_shell_user_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/it_web_aliasdomain_list.lng b/interface/ispconfig/interface/sites/lib/lang/it_web_aliasdomain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..e734adb167aace23e13b7764b4b1c8b4e964dd18 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/it_web_aliasdomain_list.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/it_web_domain.lng b/interface/ispconfig/interface/sites/lib/lang/it_web_domain.lng new file mode 100644 index 0000000000000000000000000000000000000000..2bb621fec058319f69241ceec1c1fa8b45eb43a0 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/it_web_domain.lng @@ -0,0 +1,60 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/it_web_domain_list.lng b/interface/ispconfig/interface/sites/lib/lang/it_web_domain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..a7491480b775eb1b483498fda059fc2c1978fffd --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/it_web_domain_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/it_web_sites_stats_list.lng b/interface/ispconfig/interface/sites/lib/lang/it_web_sites_stats_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..b217f80cca7a7c5c82dc96cb5fce585b510d80b6 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/it_web_sites_stats_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/it_web_subdomain.lng b/interface/ispconfig/interface/sites/lib/lang/it_web_subdomain.lng new file mode 100644 index 0000000000000000000000000000000000000000..53ee315c55aca4907f9cc50aa72089d9303d133c --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/it_web_subdomain.lng @@ -0,0 +1,40 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/it_web_subdomain_list.lng b/interface/ispconfig/interface/sites/lib/lang/it_web_subdomain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..5ba43b029da8ccdd3ce735821d25af3b7ef0db2f --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/it_web_subdomain_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/ja.lng b/interface/ispconfig/interface/sites/lib/lang/ja.lng new file mode 100644 index 0000000000000000000000000000000000000000..4d2723223f6af52abc2e930b9d99683af63ef68c --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ja.lng @@ -0,0 +1,22 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/ja_cron.lng b/interface/ispconfig/interface/sites/lib/lang/ja_cron.lng new file mode 100644 index 0000000000000000000000000000000000000000..fecb4ab45a3af2e0566a0bde5c15225761106d7c --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ja_cron.lng @@ -0,0 +1,21 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/ja_cron_list.lng b/interface/ispconfig/interface/sites/lib/lang/ja_cron_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..276b548cadb61d202dcb0fecea21dbf8bc4bf909 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ja_cron_list.lng @@ -0,0 +1,12 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/ja_database.lng b/interface/ispconfig/interface/sites/lib/lang/ja_database.lng new file mode 100644 index 0000000000000000000000000000000000000000..48d7ea3b148dbc621e4909af85368373d12ea434 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ja_database.lng @@ -0,0 +1,25 @@ +any)'; +$wb["database_remote_error_ips"] = 'At least one of the entered ip addresses is invalid.'; +$wb["client_txt"] = 'Client'; +$wb["active_txt"] = 'Active'; +$wb["database_name_error_empty"] = 'Database name is empty.'; +$wb["database_name_error_unique"] = 'There is already a database with this name on the server. To get a unique name, e.g. prepend your domain name to the database name.'; +$wb["database_name_error_regex"] = 'Invalid database name. The database name may contain these characters: a-z, A-Z, 0-9 and the underscore. Length: 2 - 64 characters.'; +$wb["database_user_error_empty"] = 'Database user is empty.'; +$wb["database_user_error_unique"] = 'There is already a database user with this name on the server. To get a unique name, e.g. prepend your domain name to the username.'; +$wb["database_user_error_regex"] = 'Invalid database user name. The username may contain these characters: a-z, A-Z, 0-9 and the underscore. Length: 2 - 64 characters.'; +$wb["limit_database_txt"] = 'The max. number of databases is reached.'; +$wb["database_name_change_txt"] = 'The database name can not be changed'; +$wb["database_charset_change_txt"] = 'The database charset can not be changed'; +$wb["database_name_error_len"] = 'Database name - {db} - too long. The max. database name length incl. prefix is 64 chars.'; +$wb["database_user_error_len"] = 'Database username - {user}- too long. The max. database username length incl. prefix is 16 chars.'; +?> diff --git a/interface/ispconfig/interface/sites/lib/lang/ja_database_list.lng b/interface/ispconfig/interface/sites/lib/lang/ja_database_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..50ed81abae589481d5f2e21eb6ace887d3173461 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ja_database_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/ja_ftp_user.lng b/interface/ispconfig/interface/sites/lib/lang/ja_ftp_user.lng new file mode 100644 index 0000000000000000000000000000000000000000..83740121696094d5bf21eba6228a4d7858614695 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ja_ftp_user.lng @@ -0,0 +1,27 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/ja_ftp_user_list.lng b/interface/ispconfig/interface/sites/lib/lang/ja_ftp_user_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..eee5a0c785a0acadcc2a0cb49429427ba9e393b1 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ja_ftp_user_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/ja_shell_user.lng b/interface/ispconfig/interface/sites/lib/lang/ja_shell_user.lng new file mode 100644 index 0000000000000000000000000000000000000000..e87896e0ed5a190b552d348adc30c98a013dbd5f --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ja_shell_user.lng @@ -0,0 +1,22 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/ja_shell_user_list.lng b/interface/ispconfig/interface/sites/lib/lang/ja_shell_user_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..18ce00721ab6baba6f64ea693d0500cc45dc085b --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ja_shell_user_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/ja_web_aliasdomain_list.lng b/interface/ispconfig/interface/sites/lib/lang/ja_web_aliasdomain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..7d916734f8cf038cd69ae6ef7d8e44d80487951a --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ja_web_aliasdomain_list.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/ja_web_domain.lng b/interface/ispconfig/interface/sites/lib/lang/ja_web_domain.lng new file mode 100644 index 0000000000000000000000000000000000000000..5e97a9826217ac381d84f3964d8c6374478cd197 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ja_web_domain.lng @@ -0,0 +1,60 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/ja_web_domain_list.lng b/interface/ispconfig/interface/sites/lib/lang/ja_web_domain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..e987d407d6159eb5ad1cd5e50cd02372810c40d6 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ja_web_domain_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/ja_web_sites_stats_list.lng b/interface/ispconfig/interface/sites/lib/lang/ja_web_sites_stats_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..53a9ae367339b2c5ffdee82088fc093923a24536 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ja_web_sites_stats_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/ja_web_subdomain.lng b/interface/ispconfig/interface/sites/lib/lang/ja_web_subdomain.lng new file mode 100644 index 0000000000000000000000000000000000000000..10b02ecbb1a2dc52e28dcaf549597a0014caa0f3 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ja_web_subdomain.lng @@ -0,0 +1,40 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/ja_web_subdomain_list.lng b/interface/ispconfig/interface/sites/lib/lang/ja_web_subdomain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..dc91127dc23b068e1b0c015b9e3e30d82d1db288 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ja_web_subdomain_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/nl.lng b/interface/ispconfig/interface/sites/lib/lang/nl.lng new file mode 100644 index 0000000000000000000000000000000000000000..78860abe2152a046ec802f6484f9210daaf174ce --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/nl.lng @@ -0,0 +1,22 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/nl_cron.lng b/interface/ispconfig/interface/sites/lib/lang/nl_cron.lng new file mode 100644 index 0000000000000000000000000000000000000000..f85eca22729432ac6ba579b6f194a6ab7a11a51c --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/nl_cron.lng @@ -0,0 +1,21 @@ +(Shell-commando -> sh, URL -> wget)'; +$wb['limit_cron_txt'] = 'Het max. aantal toegestane Cron taken is bereikt.'; +$wb['limit_cron_frequency_txt'] = 'De cronjob frequentie overschrijdt de toegestaande limiet.'; +$wb['run_min_error_format'] = 'Ongeldige indeling voor minuten.'; +$wb['run_hour_error_format'] = 'Ongeldige indeling voor uren.'; +$wb['run_mday_error_format'] = 'Ongeldige indeling voor dagen van maand.'; +$wb['run_month_error_format'] = 'Ongeldige indeling maand.'; +$wb['run_wday_error_format'] = 'Ongeldige indeling voor dagen van week.'; +$wb['command_error_format'] = 'Ongeldige commando indeling. In geval van een URL, alleen http/https wordt ondersteund.'; +$wb['unknown_fieldtype_error'] = 'Een onbekend veld-type wordt gebruikt.'; +?> diff --git a/interface/ispconfig/interface/sites/lib/lang/nl_cron_list.lng b/interface/ispconfig/interface/sites/lib/lang/nl_cron_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..1785ec191c47d5980c7d9c2b851323c6ba6b0bbc --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/nl_cron_list.lng @@ -0,0 +1,12 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/nl_database.lng b/interface/ispconfig/interface/sites/lib/lang/nl_database.lng new file mode 100644 index 0000000000000000000000000000000000000000..d4dfbf69e6f9c56ba289bdfe1103fae2720e2fef --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/nl_database.lng @@ -0,0 +1,25 @@ +(Komma-gescheiden, lege waarden = iedereen accepteren)'; +$wb['database_remote_error_ips'] = 'Tenminste 1 IP-adres is ongeldig.'; +$wb['database_name_error_len'] = 'Databasenaam - {db} - is te lang. De maximale lengte is 64 tekens.'; +$wb['database_user_error_len'] = 'Database gebruikersnaam - {user} - is te lang. De maximale lengte inclusief prefix is 16 tekens.'; +?> diff --git a/interface/ispconfig/interface/sites/lib/lang/nl_database_list.lng b/interface/ispconfig/interface/sites/lib/lang/nl_database_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..d6a243e59f7c70c738d6adda00184b7311616cee --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/nl_database_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/nl_ftp_user.lng b/interface/ispconfig/interface/sites/lib/lang/nl_ftp_user.lng new file mode 100644 index 0000000000000000000000000000000000000000..ebf411d4539780c1fd58c58e8aede03d8536d2ac --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/nl_ftp_user.lng @@ -0,0 +1,27 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/nl_ftp_user_list.lng b/interface/ispconfig/interface/sites/lib/lang/nl_ftp_user_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..449092fca1f8ed69858b310f2b473f509f5bbf90 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/nl_ftp_user_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/nl_shell_user.lng b/interface/ispconfig/interface/sites/lib/lang/nl_shell_user.lng new file mode 100644 index 0000000000000000000000000000000000000000..f38dca8d1072a960d9433f84337c0a910e497029 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/nl_shell_user.lng @@ -0,0 +1,22 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/nl_shell_user_list.lng b/interface/ispconfig/interface/sites/lib/lang/nl_shell_user_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..33568635f8363a8251093f633ea944c118f6c88c --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/nl_shell_user_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/nl_web_aliasdomain_list.lng b/interface/ispconfig/interface/sites/lib/lang/nl_web_aliasdomain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..a698fad62dc4965fcf77713c2add94d90758ec60 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/nl_web_aliasdomain_list.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/nl_web_domain.lng b/interface/ispconfig/interface/sites/lib/lang/nl_web_domain.lng new file mode 100644 index 0000000000000000000000000000000000000000..ba8743fa06f4f1f0de912e09119832b3fa24504a --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/nl_web_domain.lng @@ -0,0 +1,60 @@ +zie codes)'; +$wb['ssl_request_txt'] = 'SSL verzoek'; +$wb['ssl_cert_txt'] = 'SSL certificaat'; +$wb['ssl_bundle_txt'] = 'SSL bundel'; +$wb['ssl_action_txt'] = 'SSL actie'; +$wb['server_id_txt'] = 'Server'; +$wb['domain_txt'] = 'Domeinnaam'; +$wb['type_txt'] = 'Type'; +$wb['parent_domain_id_txt'] = 'Koppelen aan website'; +$wb['redirect_type_txt'] = 'Redirect type'; +$wb['redirect_path_txt'] = 'Redirect pad'; +$wb['active_txt'] = 'Actief?'; +$wb['document_root_txt'] = 'Documentroot'; +$wb['system_user_txt'] = 'Linux gebruiker'; +$wb['system_group_txt'] = 'Linux groep'; +$wb['ip_address_txt'] = 'IP-adres'; +$wb['vhost_type_txt'] = 'VHost type'; +$wb['hd_quota_txt'] = 'Schijfruimte limiet'; +$wb['traffic_quota_txt'] = 'Dataverkeer limiet'; +$wb['cgi_txt'] = 'CGI scripts'; +$wb['ssi_txt'] = 'SSI (CGI)'; +$wb['ssl_txt'] = 'SSL'; +$wb['suexec_txt'] = 'SuEXEC'; +$wb['php_txt'] = 'PHP5 module'; +$wb['client_txt'] = 'Klant'; +$wb['limit_web_domain_txt'] = 'Het max. aantal web domeinen voor uw account is bereikt.'; +$wb['limit_web_aliasdomain_txt'] = 'Het max. aantal domeinaliassen voor uw account is bereikt.'; +$wb['limit_web_subdomain_txt'] = 'Het max. aantal web subdomeinen voor uw account is bereikt.'; +$wb['apache_directives_txt'] = 'Apache richtlijnen'; +$wb['domain_error_empty'] = 'Domeinnaam is leeg.'; +$wb['domain_error_unique'] = 'Domein moet uniek zijn.'; +$wb['domain_error_regex'] = 'Domeinnaam is ongeldig.'; +$wb['hd_quota_error_empty'] = 'Schijfruimte limiet is leeg.'; +$wb['traffic_quota_error_empty'] = 'Dataverkeer limiet is leeg.'; +$wb['errordocs_txt'] = 'Eigen fout-paginas'; +$wb['error_ssl_state_empty'] = 'SSL: provincie is leeg.'; +$wb['error_ssl_locality_empty'] = 'SSL: plaats is leeg.'; +$wb['error_ssl_organisation_empty'] = 'SSL: organisatie is leeg.'; +$wb['error_ssl_organisation_unit_empty'] = 'SSL: organsatie afdeling is leeg.'; +$wb['error_ssl_country_empty'] = 'SSL: Land is leeg.'; +$wb['subdomain_txt'] = 'Automatische subdomeinen'; +$wb['client_group_id_txt'] = 'Klant'; +$wb['stats_password_txt'] = 'Website statistieken wachtwoord'; +$wb['ssl_domain_txt'] = 'SSL Domein'; +$wb['allow_override_txt'] = 'Optie: Allow Override'; +$wb['limit_web_quota_free_txt'] = 'Maximale beschikbare schijfruimte-gebruik'; +$wb['ssl_state_error_regex'] = 'Ongeldige SSL Provincie. Geldige tekens zijn: a-z, 0-9 en .,-_'; +$wb['ssl_locality_error_regex'] = 'Ongeldige SSL Plaats. Geldige tekens zijn: a-z, 0-9 en .,-_'; +$wb['ssl_organisation_error_regex'] = 'Ongeldige SSL Organisatie. Geldige tekens zijn: a-z, 0-9 en .,-_'; +$wb['ssl_organistaion_unit_error_regex'] = 'Ongeldige SSL Organisatie afdeling. Geldige tekens zijn: a-z, 0-9 en .,-_'; +$wb['ssl_country_error_regex'] = 'Ongeldige SSL Landcode. Geldige tekens zijn: A-Z'; +$wb['limit_traffic_quota_free_txt'] = 'Max. available Traffic Quota'; +$wb['redirect_error_regex'] = 'Invalid redirect path. Valid redirects are for example: /test/ or http://www.domain.tld/test/'; +$wb['php_open_basedir_txt'] = 'PHP open_basedir'; +?> diff --git a/interface/ispconfig/interface/sites/lib/lang/nl_web_domain_list.lng b/interface/ispconfig/interface/sites/lib/lang/nl_web_domain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..1158d6dd2bf89833fa1d1eaf4e1aceffb4806716 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/nl_web_domain_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/nl_web_sites_stats_list.lng b/interface/ispconfig/interface/sites/lib/lang/nl_web_sites_stats_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..67ce6f4bf1b0d7ebb0bfea76796c469423c53b26 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/nl_web_sites_stats_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/nl_web_subdomain.lng b/interface/ispconfig/interface/sites/lib/lang/nl_web_subdomain.lng new file mode 100644 index 0000000000000000000000000000000000000000..58f5be41fe92260a94060f53bc59f9f23a1d8003 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/nl_web_subdomain.lng @@ -0,0 +1,40 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/nl_web_subdomain_list.lng b/interface/ispconfig/interface/sites/lib/lang/nl_web_subdomain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..db8db09468d5870e594ccedace071ba70601afc3 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/nl_web_subdomain_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/pl.lng b/interface/ispconfig/interface/sites/lib/lang/pl.lng new file mode 100644 index 0000000000000000000000000000000000000000..bd25bfd71c64e22efd1a2159269912c54ef5c2ee --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/pl.lng @@ -0,0 +1,22 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/pl_cron.lng b/interface/ispconfig/interface/sites/lib/lang/pl_cron.lng new file mode 100644 index 0000000000000000000000000000000000000000..7771708bec9d9548cfaa7f1454a9afbcdfd68ffc --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/pl_cron.lng @@ -0,0 +1,21 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/pl_cron_list.lng b/interface/ispconfig/interface/sites/lib/lang/pl_cron_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..3c1d83636cad877348f83123ad92dd158f814f3c --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/pl_cron_list.lng @@ -0,0 +1,12 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/pl_database.lng b/interface/ispconfig/interface/sites/lib/lang/pl_database.lng new file mode 100644 index 0000000000000000000000000000000000000000..75b44c43919cff1a19cf5292184c0ab1f47d263a --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/pl_database.lng @@ -0,0 +1,25 @@ +każdego)'; +$wb['database_remote_error_ips'] = 'Jeden z podanych adresów IP ma niepoprawny format.'; +$wb['client_txt'] = 'Klient'; +$wb['active_txt'] = 'Aktywny'; +$wb['database_name_error_empty'] = 'Nazwa bazy danych jest pusta.'; +$wb['database_name_error_unique'] = 'Istnieje już baza danych o takiej nazwie na serwerze. Aby mieć unikatową nazwę, np.: nazwij bazę danych tak samo jak domenę.'; +$wb['database_name_error_regex'] = 'Nieprawidłowa nazwa bazy danych. Nazwa bazy danych może zawierać znaki takie jak: a-z, A-Z, 0-9 oraz podkreślenie. Długość: 2 - 64 znaków.'; +$wb['database_user_error_empty'] = 'Nazwa użytkownika bazy danych jest pusta.'; +$wb['database_user_error_unique'] = 'Jest już użytkownik bazy danych o takiej nazwie. Aby mieć unikatową nazwę, np.: nazwij użytkownika tak samo jak domenę.'; +$wb['database_user_error_regex'] = 'Nieprawidłowa nazwa użytkownika bazy danych. Nazwa użytkownika bazy danych może zawierać znaki takie jak: a-z, A-Z, 0-9 oraz podkreślenie. Długość: 2 - 64 znaków.'; +$wb['limit_database_txt'] = 'Maksymalna liczba baz danych została przekroczona.'; +$wb['database_name_change_txt'] = 'Nie można zmienić nazwy bazy danych'; +$wb['database_charset_change_txt'] = 'Nie można zmienić kodowania bazy danych'; +$wb['database_name_error_len'] = 'Database name - {db} - too long. The max. database name length incl. prefix is 64 chars.'; +$wb['database_user_error_len'] = 'Database username - {user}- too long. The max. database username length incl. prefix is 16 chars.'; +?> diff --git a/interface/ispconfig/interface/sites/lib/lang/pl_database_list.lng b/interface/ispconfig/interface/sites/lib/lang/pl_database_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..ca92d9883767faf1fc9b92138ab8ef03a0ebad6d --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/pl_database_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/pl_ftp_user.lng b/interface/ispconfig/interface/sites/lib/lang/pl_ftp_user.lng new file mode 100644 index 0000000000000000000000000000000000000000..0c49209b21dc92dc2540a422afe0b3ce2b82b56d --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/pl_ftp_user.lng @@ -0,0 +1,27 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/pl_ftp_user_list.lng b/interface/ispconfig/interface/sites/lib/lang/pl_ftp_user_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..fecbba355ad91ada06ff4867b8cdf1e45a5a3875 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/pl_ftp_user_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/pl_shell_user.lng b/interface/ispconfig/interface/sites/lib/lang/pl_shell_user.lng new file mode 100644 index 0000000000000000000000000000000000000000..ff60f8f1943532494b667d12dba51a690197269d --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/pl_shell_user.lng @@ -0,0 +1,22 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/pl_shell_user_list.lng b/interface/ispconfig/interface/sites/lib/lang/pl_shell_user_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..850c0eb91209eb4e2adaabbf66129d3f0312a651 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/pl_shell_user_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/pl_web_aliasdomain_list.lng b/interface/ispconfig/interface/sites/lib/lang/pl_web_aliasdomain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..6dd8022e938521ff8c7290579fa827cfd6d9e9b0 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/pl_web_aliasdomain_list.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/pl_web_domain.lng b/interface/ispconfig/interface/sites/lib/lang/pl_web_domain.lng new file mode 100644 index 0000000000000000000000000000000000000000..5b5106ce168c3754216cbd1a896b0da440eadd01 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/pl_web_domain.lng @@ -0,0 +1,60 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/pl_web_domain_list.lng b/interface/ispconfig/interface/sites/lib/lang/pl_web_domain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..62b7455ff349875cffd586aac2a615bfccc288af --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/pl_web_domain_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/pl_web_sites_stats_list.lng b/interface/ispconfig/interface/sites/lib/lang/pl_web_sites_stats_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..e7b96d715147f0440799042c5176a6ae9e0871c8 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/pl_web_sites_stats_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/pl_web_subdomain.lng b/interface/ispconfig/interface/sites/lib/lang/pl_web_subdomain.lng new file mode 100644 index 0000000000000000000000000000000000000000..18e5a936c1689584845de9ff619dbdf336910d53 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/pl_web_subdomain.lng @@ -0,0 +1,40 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/pl_web_subdomain_list.lng b/interface/ispconfig/interface/sites/lib/lang/pl_web_subdomain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..9ccb0a3c770dfe17c6d55f427577e50e87d0b215 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/pl_web_subdomain_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/pt.lng b/interface/ispconfig/interface/sites/lib/lang/pt.lng new file mode 100644 index 0000000000000000000000000000000000000000..d6bc1e110fb90e6e12174f7d505ca2da0a0035f4 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/pt.lng @@ -0,0 +1,23 @@ + + diff --git a/interface/ispconfig/interface/sites/lib/lang/pt_cron.lng b/interface/ispconfig/interface/sites/lib/lang/pt_cron.lng new file mode 100644 index 0000000000000000000000000000000000000000..373a37dcc6b2809ae6281af70aebb7695f7d1bd1 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/pt_cron.lng @@ -0,0 +1,22 @@ + + diff --git a/interface/ispconfig/interface/sites/lib/lang/pt_cron_list.lng b/interface/ispconfig/interface/sites/lib/lang/pt_cron_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..f5cd15a3f9598dd6d73a9a689694dccae8478027 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/pt_cron_list.lng @@ -0,0 +1,13 @@ + + diff --git a/interface/ispconfig/interface/sites/lib/lang/pt_database.lng b/interface/ispconfig/interface/sites/lib/lang/pt_database.lng new file mode 100644 index 0000000000000000000000000000000000000000..5ffc49eb340b655edd551e9a9a18a157241b90e1 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/pt_database.lng @@ -0,0 +1,26 @@ +quaisquer ips)'; +$wb['database_remote_error_ips'] = 'Pelo menos um dos endereços ip informados não é válido.'; +$wb['database_name_error_len'] = 'O nome da base de dados - {db} - é muito longo. 64 caracteres é o número máximo permitido incluindo prefixo.'; +$wb['database_user_error_len'] = 'O nome de utilizador da base de dados - {user}- é muito longo. 16 caracteres é o número máximo permitido incluindo prefixo.'; +?> + diff --git a/interface/ispconfig/interface/sites/lib/lang/pt_database_list.lng b/interface/ispconfig/interface/sites/lib/lang/pt_database_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..6a09c69010e3d5cc72b4cf4be0ffc35b648f942d --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/pt_database_list.lng @@ -0,0 +1,9 @@ + + diff --git a/interface/ispconfig/interface/sites/lib/lang/pt_ftp_user.lng b/interface/ispconfig/interface/sites/lib/lang/pt_ftp_user.lng new file mode 100644 index 0000000000000000000000000000000000000000..5573ba300b0fbdcc52274bbbd0087b07f07181fb --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/pt_ftp_user.lng @@ -0,0 +1,28 @@ + + diff --git a/interface/ispconfig/interface/sites/lib/lang/pt_ftp_user_list.lng b/interface/ispconfig/interface/sites/lib/lang/pt_ftp_user_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..c9f7ed2c280a9104471497f1eb6a59f2653e8b90 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/pt_ftp_user_list.lng @@ -0,0 +1,9 @@ + + diff --git a/interface/ispconfig/interface/sites/lib/lang/pt_shell_user.lng b/interface/ispconfig/interface/sites/lib/lang/pt_shell_user.lng new file mode 100644 index 0000000000000000000000000000000000000000..4e4cddb6cb6735306b873997987bce03aa5aecb1 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/pt_shell_user.lng @@ -0,0 +1,23 @@ + + diff --git a/interface/ispconfig/interface/sites/lib/lang/pt_shell_user_list.lng b/interface/ispconfig/interface/sites/lib/lang/pt_shell_user_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..f704ab6207caebf946a01817b09824119f833a5a --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/pt_shell_user_list.lng @@ -0,0 +1,9 @@ + + diff --git a/interface/ispconfig/interface/sites/lib/lang/pt_web_aliasdomain_list.lng b/interface/ispconfig/interface/sites/lib/lang/pt_web_aliasdomain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..9295fb1092e28cbd56d616cebb221864be2bbf33 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/pt_web_aliasdomain_list.lng @@ -0,0 +1,12 @@ + + diff --git a/interface/ispconfig/interface/sites/lib/lang/pt_web_domain.lng b/interface/ispconfig/interface/sites/lib/lang/pt_web_domain.lng new file mode 100644 index 0000000000000000000000000000000000000000..0cf10f81c87dbf2049bcce11645b5ce647b165ce --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/pt_web_domain.lng @@ -0,0 +1,61 @@ + + diff --git a/interface/ispconfig/interface/sites/lib/lang/pt_web_domain_list.lng b/interface/ispconfig/interface/sites/lib/lang/pt_web_domain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..fadc95c848628e37f11c36e3f9b362040abe712c --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/pt_web_domain_list.lng @@ -0,0 +1,9 @@ + + diff --git a/interface/ispconfig/interface/sites/lib/lang/pt_web_sites_stats_list.lng b/interface/ispconfig/interface/sites/lib/lang/pt_web_sites_stats_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..18bf04427b2d87976e52ce6ca7f03542127c78b1 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/pt_web_sites_stats_list.lng @@ -0,0 +1,9 @@ + + diff --git a/interface/ispconfig/interface/sites/lib/lang/pt_web_subdomain.lng b/interface/ispconfig/interface/sites/lib/lang/pt_web_subdomain.lng new file mode 100644 index 0000000000000000000000000000000000000000..a1f332d9d8a59948f2532dc906315c3ce67a02ba --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/pt_web_subdomain.lng @@ -0,0 +1,41 @@ + + diff --git a/interface/ispconfig/interface/sites/lib/lang/pt_web_subdomain_list.lng b/interface/ispconfig/interface/sites/lib/lang/pt_web_subdomain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..ce29103f9e29515cd35229e9881ac773402e1d6c --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/pt_web_subdomain_list.lng @@ -0,0 +1,9 @@ + + diff --git a/interface/ispconfig/interface/sites/lib/lang/ro.lng b/interface/ispconfig/interface/sites/lib/lang/ro.lng new file mode 100644 index 0000000000000000000000000000000000000000..44f2fbcf715ef18b9769ccd2bbb140d9001ede3b --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ro.lng @@ -0,0 +1,22 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/ro_cron.lng b/interface/ispconfig/interface/sites/lib/lang/ro_cron.lng new file mode 100644 index 0000000000000000000000000000000000000000..8cb7f08e6d54bea35b9da3d9a60f4479fe786c45 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ro_cron.lng @@ -0,0 +1,21 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/lib/lang/ro_cron_list.lng b/interface/ispconfig/interface/sites/lib/lang/ro_cron_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..b5c8d1566e10c85256ba7a5a869344bba1608ffb --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ro_cron_list.lng @@ -0,0 +1,12 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/lib/lang/ro_database.lng b/interface/ispconfig/interface/sites/lib/lang/ro_database.lng new file mode 100644 index 0000000000000000000000000000000000000000..07566e81011282d0c4aff934e8b0cc9100632002 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ro_database.lng @@ -0,0 +1,25 @@ +any)'; +$wb['database_remote_error_ips'] = 'At least one of the entered ip addresses is invalid.'; +$wb['database_name_error_len'] = 'Database name - {db} - too long. The max. database name length incl. prefix is 64 chars.'; +$wb['database_user_error_len'] = 'Database username - {user}- too long. The max. database username length incl. prefix is 16 chars.'; +?> diff --git a/interface/ispconfig/interface/sites/lib/lang/ro_database_list.lng b/interface/ispconfig/interface/sites/lib/lang/ro_database_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..9f45d098c072a3bcce0299b5f9d93ba3ec6fb822 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ro_database_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/ro_ftp_user.lng b/interface/ispconfig/interface/sites/lib/lang/ro_ftp_user.lng new file mode 100644 index 0000000000000000000000000000000000000000..6efddadd8d377c2203e97dad9d2a1e03b12a3d99 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ro_ftp_user.lng @@ -0,0 +1,27 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/ro_ftp_user_list.lng b/interface/ispconfig/interface/sites/lib/lang/ro_ftp_user_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..bb4e25df5d840eeac14957a0e1c307745c04238b --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ro_ftp_user_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/ro_shell_user.lng b/interface/ispconfig/interface/sites/lib/lang/ro_shell_user.lng new file mode 100644 index 0000000000000000000000000000000000000000..a32638e621c9db9f8e8515c9e3f8f1d2038ab9e3 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ro_shell_user.lng @@ -0,0 +1,22 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/ro_shell_user_list.lng b/interface/ispconfig/interface/sites/lib/lang/ro_shell_user_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..2916771f3fda3cd1b1e189195378f4dd31ac2a06 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ro_shell_user_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/ro_web_aliasdomain_list.lng b/interface/ispconfig/interface/sites/lib/lang/ro_web_aliasdomain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..dd612325a97f65c0f3b60e65dae830404a40abc2 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ro_web_aliasdomain_list.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/ro_web_domain.lng b/interface/ispconfig/interface/sites/lib/lang/ro_web_domain.lng new file mode 100644 index 0000000000000000000000000000000000000000..eefd66053d69ea9c5456dd772dad0702da8c1b21 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ro_web_domain.lng @@ -0,0 +1,60 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/ro_web_domain_list.lng b/interface/ispconfig/interface/sites/lib/lang/ro_web_domain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..e84427d2a0012085682dc68f8f39a7371c6dceac --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ro_web_domain_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/ro_web_sites_stats_list.lng b/interface/ispconfig/interface/sites/lib/lang/ro_web_sites_stats_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..20f018b82623f4e8de0a6a3ec2bab3e8569971ef --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ro_web_sites_stats_list.lng @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/lib/lang/ro_web_subdomain.lng b/interface/ispconfig/interface/sites/lib/lang/ro_web_subdomain.lng new file mode 100644 index 0000000000000000000000000000000000000000..fd319c5a726068c4db63e5328f4a2560768dacf6 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ro_web_subdomain.lng @@ -0,0 +1,40 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/ro_web_subdomain_list.lng b/interface/ispconfig/interface/sites/lib/lang/ro_web_subdomain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..445ec6ca9987af1bcc42efe2addd19cf1d301896 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ro_web_subdomain_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/ru.lng b/interface/ispconfig/interface/sites/lib/lang/ru.lng new file mode 100644 index 0000000000000000000000000000000000000000..93f0501dcb6a8720382cca3e60841e9298bea908 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ru.lng @@ -0,0 +1,23 @@ + + diff --git a/interface/ispconfig/interface/sites/lib/lang/ru_cron.lng b/interface/ispconfig/interface/sites/lib/lang/ru_cron.lng new file mode 100644 index 0000000000000000000000000000000000000000..daa4ed3af938119ba541ab2e0dda7c4574217081 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ru_cron.lng @@ -0,0 +1,22 @@ + + diff --git a/interface/ispconfig/interface/sites/lib/lang/ru_cron_list.lng b/interface/ispconfig/interface/sites/lib/lang/ru_cron_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..49c6cbe41dcbf37a5a3ce965bb5ea52d5f794630 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ru_cron_list.lng @@ -0,0 +1,13 @@ + + diff --git a/interface/ispconfig/interface/sites/lib/lang/ru_database.lng b/interface/ispconfig/interface/sites/lib/lang/ru_database.lng new file mode 100644 index 0000000000000000000000000000000000000000..ae0ebeaf1d908c5307deedc7605184826bd29c3f --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ru_database.lng @@ -0,0 +1,26 @@ +любого)'; +$wb['database_remote_error_ips'] = 'Минимум один введенный адрес неверен.'; +$wb['database_name_error_len'] = 'Имя БД - {db} - cлишком длинное. Максимальная длина имени БД включая префикс - 64 символа'; +$wb['database_user_error_len'] = 'Логин для БД - {user} - cлишком длинное. Максимальная длина логина - 16 символов'; +?> + diff --git a/interface/ispconfig/interface/sites/lib/lang/ru_database_list.lng b/interface/ispconfig/interface/sites/lib/lang/ru_database_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..707b9f5af5f41bcb9a6a1741e801d4ebe47a2cf2 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ru_database_list.lng @@ -0,0 +1,9 @@ + + diff --git a/interface/ispconfig/interface/sites/lib/lang/ru_ftp_user.lng b/interface/ispconfig/interface/sites/lib/lang/ru_ftp_user.lng new file mode 100644 index 0000000000000000000000000000000000000000..26a4cc1eaad25d36a38ef5b13d0e30ebdcc5ecd0 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ru_ftp_user.lng @@ -0,0 +1,28 @@ + + diff --git a/interface/ispconfig/interface/sites/lib/lang/ru_ftp_user_list.lng b/interface/ispconfig/interface/sites/lib/lang/ru_ftp_user_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..1ba6ad5273ee29576fe0b94ba6cce45aa2958797 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ru_ftp_user_list.lng @@ -0,0 +1,9 @@ + + diff --git a/interface/ispconfig/interface/sites/lib/lang/ru_shell_user.lng b/interface/ispconfig/interface/sites/lib/lang/ru_shell_user.lng new file mode 100644 index 0000000000000000000000000000000000000000..b0a7c7c6d856cbf9c873cca889d0c3d88d7400a6 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ru_shell_user.lng @@ -0,0 +1,23 @@ + + diff --git a/interface/ispconfig/interface/sites/lib/lang/ru_shell_user_list.lng b/interface/ispconfig/interface/sites/lib/lang/ru_shell_user_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..54e40c30314de42921cfa9a82de082d305fbcc1f --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ru_shell_user_list.lng @@ -0,0 +1,9 @@ + + diff --git a/interface/ispconfig/interface/sites/lib/lang/ru_web_aliasdomain_list.lng b/interface/ispconfig/interface/sites/lib/lang/ru_web_aliasdomain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..5bda44b032a22be143f8fd655e1b407481af4cf6 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ru_web_aliasdomain_list.lng @@ -0,0 +1,12 @@ + + diff --git a/interface/ispconfig/interface/sites/lib/lang/ru_web_domain.lng b/interface/ispconfig/interface/sites/lib/lang/ru_web_domain.lng new file mode 100644 index 0000000000000000000000000000000000000000..36997768fa098604dffc16323fc57390467ce783 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ru_web_domain.lng @@ -0,0 +1,61 @@ + + diff --git a/interface/ispconfig/interface/sites/lib/lang/ru_web_domain_list.lng b/interface/ispconfig/interface/sites/lib/lang/ru_web_domain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..4e3d84ce80f29ca4bf464a69773e4a1055a4bb9b --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ru_web_domain_list.lng @@ -0,0 +1,9 @@ + + diff --git a/interface/ispconfig/interface/sites/lib/lang/ru_web_sites_stats_list.lng b/interface/ispconfig/interface/sites/lib/lang/ru_web_sites_stats_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..edd1db2507d5b2311383e56c82a0525d0102aad3 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ru_web_sites_stats_list.lng @@ -0,0 +1,9 @@ + + diff --git a/interface/ispconfig/interface/sites/lib/lang/ru_web_subdomain.lng b/interface/ispconfig/interface/sites/lib/lang/ru_web_subdomain.lng new file mode 100644 index 0000000000000000000000000000000000000000..7a7212bf50f305cb4b311319d931dad380f7d9a5 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ru_web_subdomain.lng @@ -0,0 +1,41 @@ + + diff --git a/interface/ispconfig/interface/sites/lib/lang/ru_web_subdomain_list.lng b/interface/ispconfig/interface/sites/lib/lang/ru_web_subdomain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..a13d51953e057cb3e19df580adfa579a3d2b2997 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ru_web_subdomain_list.lng @@ -0,0 +1,9 @@ + + diff --git a/interface/ispconfig/interface/sites/lib/lang/se.lng b/interface/ispconfig/interface/sites/lib/lang/se.lng new file mode 100644 index 0000000000000000000000000000000000000000..d31e8079a22de3467a9561734b9cecdd7c4ae76c --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/se.lng @@ -0,0 +1,22 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/se_cron.lng b/interface/ispconfig/interface/sites/lib/lang/se_cron.lng new file mode 100644 index 0000000000000000000000000000000000000000..fecb4ab45a3af2e0566a0bde5c15225761106d7c --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/se_cron.lng @@ -0,0 +1,21 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/se_cron_list.lng b/interface/ispconfig/interface/sites/lib/lang/se_cron_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..ad56ea95610bf8bb2344467e0c2b796950c1e59a --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/se_cron_list.lng @@ -0,0 +1,12 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/se_database.lng b/interface/ispconfig/interface/sites/lib/lang/se_database.lng new file mode 100644 index 0000000000000000000000000000000000000000..21058d47e33236de009e5f76c8ed86e85b659bff --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/se_database.lng @@ -0,0 +1,25 @@ +any)'; +$wb['database_remote_error_ips'] = 'At least one of the entered ip addresses is invalid.'; +$wb['database_name_error_len'] = 'Database name - {db} - too long. The max. database name length incl. prefix is 64 chars.'; +$wb['database_user_error_len'] = 'Database username - {user}- too long. The max. database username length incl. prefix is 16 chars.'; +?> diff --git a/interface/ispconfig/interface/sites/lib/lang/se_database_list.lng b/interface/ispconfig/interface/sites/lib/lang/se_database_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..9c4df5704f0ff85d52a18a75b2bbf131ce14e87a --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/se_database_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/se_ftp_user.lng b/interface/ispconfig/interface/sites/lib/lang/se_ftp_user.lng new file mode 100644 index 0000000000000000000000000000000000000000..190f4a397d63d3a724f943d87254a360f77d1262 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/se_ftp_user.lng @@ -0,0 +1,27 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/se_ftp_user_list.lng b/interface/ispconfig/interface/sites/lib/lang/se_ftp_user_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..6ef3e37607287711ce9a3361e46086b70985e832 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/se_ftp_user_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/se_shell_user.lng b/interface/ispconfig/interface/sites/lib/lang/se_shell_user.lng new file mode 100644 index 0000000000000000000000000000000000000000..0f2ea6c84627b2c5187f609cc61060a049a473ec --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/se_shell_user.lng @@ -0,0 +1,22 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/se_shell_user_list.lng b/interface/ispconfig/interface/sites/lib/lang/se_shell_user_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..4a9d7cb9a7e0bf090e372fe5893c2f961a041451 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/se_shell_user_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/se_web_aliasdomain_list.lng b/interface/ispconfig/interface/sites/lib/lang/se_web_aliasdomain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..e734adb167aace23e13b7764b4b1c8b4e964dd18 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/se_web_aliasdomain_list.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/se_web_domain.lng b/interface/ispconfig/interface/sites/lib/lang/se_web_domain.lng new file mode 100644 index 0000000000000000000000000000000000000000..142f1e5abb2e86dacdb857e04b75596f30806d80 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/se_web_domain.lng @@ -0,0 +1,60 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/se_web_domain_list.lng b/interface/ispconfig/interface/sites/lib/lang/se_web_domain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..88ec412daabfb125db4038dc964c2fdec237e843 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/se_web_domain_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/se_web_sites_stats_list.lng b/interface/ispconfig/interface/sites/lib/lang/se_web_sites_stats_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..b217f80cca7a7c5c82dc96cb5fce585b510d80b6 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/se_web_sites_stats_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/se_web_subdomain.lng b/interface/ispconfig/interface/sites/lib/lang/se_web_subdomain.lng new file mode 100644 index 0000000000000000000000000000000000000000..a814ed30e3fab76df2150e74b44d95c2f8ebea66 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/se_web_subdomain.lng @@ -0,0 +1,40 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/se_web_subdomain_list.lng b/interface/ispconfig/interface/sites/lib/lang/se_web_subdomain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..1c16bcda288f146167a5a49221951769017f580b --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/se_web_subdomain_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/sk.lng b/interface/ispconfig/interface/sites/lib/lang/sk.lng new file mode 100644 index 0000000000000000000000000000000000000000..e56941b1595a8eff267696b25575f6adab5586cb --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/sk.lng @@ -0,0 +1,22 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/sk_cron.lng b/interface/ispconfig/interface/sites/lib/lang/sk_cron.lng new file mode 100644 index 0000000000000000000000000000000000000000..21e5a9b41173c9a90c5d3d019f95c63c796103d5 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/sk_cron.lng @@ -0,0 +1,21 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/sk_cron_list.lng b/interface/ispconfig/interface/sites/lib/lang/sk_cron_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..338da15a7672b4066bcd58958fb29826902cf926 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/sk_cron_list.lng @@ -0,0 +1,12 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/sk_database.lng b/interface/ispconfig/interface/sites/lib/lang/sk_database.lng new file mode 100644 index 0000000000000000000000000000000000000000..ca733ca007208c3f1f60e6e96be88d502e7c6695 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/sk_database.lng @@ -0,0 +1,25 @@ + vetky )'; +$wb['database_remote_error_ips'] = 'Aspo? jedna zo zadanch IP adries je neplatn.'; +$wb['client_txt'] = 'Klient'; +$wb['active_txt'] = 'Aktvne'; +$wb['database_name_error_empty'] = 'Nzov databzy je przdny.'; +$wb['database_name_error_unique'] = 'V s?asnosti u existuje databza s tmto nzvom na serveri. Ak chcete zska? jedine?n meno, napr. predradte nzov vaej domny pred nzov databzy.'; +$wb['database_name_error_regex'] = 'Neplatn nzov databzy. Nzov databzy me obsahova? tieto znaky: az, AZ, 0-9 pod?iarknutia. D?ka: 2 - 64 znakov.'; +$wb['database_user_error_empty'] = 'Databzov uvate? je przdny.'; +$wb['database_user_error_unique'] = 'V s?asnosti u existuje databzov uvate? s tmto nzvom na serveri. Ak chcete zska? jedine?n meno, napr. predradte nzov vaej domny pred uvate?skm menom.'; +$wb['database_user_error_regex'] = 'Neplatn databzov uvate?sk meno. Uvate?sk meno me obsahova? tieto znaky: az, AZ, 0-9 pod?iarknutia. D?ka: 2 - 64 znakov.'; +$wb['limit_database_txt'] = 'Max. po?et databz je dosiahnut.'; +$wb['database_name_change_txt'] = 'Nzov databzy nie je mon meni?'; +$wb['database_charset_change_txt'] = 'Databzov charset nemono meni?'; +$wb['database_name_error_len'] = 'Nzov databzy - (db) - prli dlh. Max. nzov databzy d?ka v?. prefix je 64 znakov.'; +$wb['database_user_error_len'] = 'Databzov uvate?sk meno - (user) - prli dlho. Max. Databza meno d?ka v?. prefix je 16 znakov.'; +?> diff --git a/interface/ispconfig/interface/sites/lib/lang/sk_database_list.lng b/interface/ispconfig/interface/sites/lib/lang/sk_database_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..c7604285062b81e011934018803dc2be4a866172 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/sk_database_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/sk_ftp_user.lng b/interface/ispconfig/interface/sites/lib/lang/sk_ftp_user.lng new file mode 100644 index 0000000000000000000000000000000000000000..afc027e42d202042faef621ddcbae66bc8f97302 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/sk_ftp_user.lng @@ -0,0 +1,27 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/sk_ftp_user_list.lng b/interface/ispconfig/interface/sites/lib/lang/sk_ftp_user_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..64e06b4b1f4150f73ab04424f962fcbc1147acb8 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/sk_ftp_user_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/sk_shell_user.lng b/interface/ispconfig/interface/sites/lib/lang/sk_shell_user.lng new file mode 100644 index 0000000000000000000000000000000000000000..0cdf9db842d5139618d368aec6177bdc34d07189 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/sk_shell_user.lng @@ -0,0 +1,22 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/sk_shell_user_list.lng b/interface/ispconfig/interface/sites/lib/lang/sk_shell_user_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..73c5e6ef8195284f98b7041bcee1ecf3e12419de --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/sk_shell_user_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/sk_web_aliasdomain_list.lng b/interface/ispconfig/interface/sites/lib/lang/sk_web_aliasdomain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..8ca467b3cb7dba54331a695d9f956cd0f55f5b56 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/sk_web_aliasdomain_list.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/sk_web_domain.lng b/interface/ispconfig/interface/sites/lib/lang/sk_web_domain.lng new file mode 100644 index 0000000000000000000000000000000000000000..87393706bad4649bfa8a0d8294ae0c9a84d2a2af --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/sk_web_domain.lng @@ -0,0 +1,60 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/sk_web_domain_list.lng b/interface/ispconfig/interface/sites/lib/lang/sk_web_domain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..64f197943865740dca31fafd0f5f80a26155e239 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/sk_web_domain_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/sk_web_sites_stats_list.lng b/interface/ispconfig/interface/sites/lib/lang/sk_web_sites_stats_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..d8480cbaaae5b16f83498439c0a3b84dc69e30e5 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/sk_web_sites_stats_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/sk_web_subdomain.lng b/interface/ispconfig/interface/sites/lib/lang/sk_web_subdomain.lng new file mode 100644 index 0000000000000000000000000000000000000000..74cfd761b32c7be91a3b04b2272346ea75ae65ee --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/sk_web_subdomain.lng @@ -0,0 +1,40 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/sk_web_subdomain_list.lng b/interface/ispconfig/interface/sites/lib/lang/sk_web_subdomain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..8df87d68199085d2f8435c47e8e49bfaed44c038 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/sk_web_subdomain_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/tr.lng b/interface/ispconfig/interface/sites/lib/lang/tr.lng new file mode 100644 index 0000000000000000000000000000000000000000..1c3b93e60ba9fcfa16d6e50808ed894b32e98777 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/tr.lng @@ -0,0 +1,22 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/tr_cron.lng b/interface/ispconfig/interface/sites/lib/lang/tr_cron.lng new file mode 100644 index 0000000000000000000000000000000000000000..4643bafd508d644ecaa119bfd8ac1128402fe4d1 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/tr_cron.lng @@ -0,0 +1,21 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/tr_cron_list.lng b/interface/ispconfig/interface/sites/lib/lang/tr_cron_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..f54e67cbaa23258466b4e7ce855740cd34eb6b43 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/tr_cron_list.lng @@ -0,0 +1,12 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/tr_database.lng b/interface/ispconfig/interface/sites/lib/lang/tr_database.lng new file mode 100644 index 0000000000000000000000000000000000000000..63601ca5c3fd5af416f45f76b2273895d0271980 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/tr_database.lng @@ -0,0 +1,25 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/tr_database_list.lng b/interface/ispconfig/interface/sites/lib/lang/tr_database_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..f05b2bd1ef0a085668f81b4839f426b58aa55d75 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/tr_database_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/tr_ftp_user.lng b/interface/ispconfig/interface/sites/lib/lang/tr_ftp_user.lng new file mode 100644 index 0000000000000000000000000000000000000000..88602906ee32816b54d2773c81969139a00b0a39 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/tr_ftp_user.lng @@ -0,0 +1,27 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/tr_ftp_user_list.lng b/interface/ispconfig/interface/sites/lib/lang/tr_ftp_user_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..f4c9c3f6ac8e70e8a3a7904771ed0e363f8ac173 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/tr_ftp_user_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/tr_shell_user.lng b/interface/ispconfig/interface/sites/lib/lang/tr_shell_user.lng new file mode 100644 index 0000000000000000000000000000000000000000..c6d39d3217d0a8c18e432ba8638a87f8df647454 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/tr_shell_user.lng @@ -0,0 +1,22 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/tr_shell_user_list.lng b/interface/ispconfig/interface/sites/lib/lang/tr_shell_user_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..a72b3e481fee23a560a220dc87a545ffb71935cb --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/tr_shell_user_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/tr_web_aliasdomain_list.lng b/interface/ispconfig/interface/sites/lib/lang/tr_web_aliasdomain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..8bbca609047510806e82c0045481a00a2dd9469d --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/tr_web_aliasdomain_list.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/tr_web_domain.lng b/interface/ispconfig/interface/sites/lib/lang/tr_web_domain.lng new file mode 100644 index 0000000000000000000000000000000000000000..a3f9e369c6157e8794bb8cf7dbe4f1eb4a31a1f8 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/tr_web_domain.lng @@ -0,0 +1,60 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/tr_web_domain_list.lng b/interface/ispconfig/interface/sites/lib/lang/tr_web_domain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..8dbf8fd45076e3374f8c328321071848a6de6b7c --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/tr_web_domain_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/tr_web_sites_stats_list.lng b/interface/ispconfig/interface/sites/lib/lang/tr_web_sites_stats_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..e795c51574f2bbaa4f99d3ec01e0f12cee9ca5be --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/tr_web_sites_stats_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/tr_web_subdomain.lng b/interface/ispconfig/interface/sites/lib/lang/tr_web_subdomain.lng new file mode 100644 index 0000000000000000000000000000000000000000..2285036142ea4537afd9f4d70e86f9dfa9023a02 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/tr_web_subdomain.lng @@ -0,0 +1,40 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/tr_web_subdomain_list.lng b/interface/ispconfig/interface/sites/lib/lang/tr_web_subdomain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..44b7bbeecbfeb74438bb8285e4c9e95b0a28ef31 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/tr_web_subdomain_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/module.conf.php b/interface/ispconfig/interface/sites/lib/module.conf.php new file mode 100644 index 0000000000000000000000000000000000000000..686ae16873e1eba3fb464f6b10ed43b4756c93a1 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/module.conf.php @@ -0,0 +1,113 @@ + "Website", + 'target' => 'content', + 'link' => 'sites/web_domain_list.php'); + + +$items[] = array( 'title' => "Subdomain", + 'target' => 'content', + 'link' => 'sites/web_subdomain_list.php'); + + +$items[] = array( 'title' => "Aliasdomain", + 'target' => 'content', + 'link' => 'sites/web_aliasdomain_list.php'); + +$module["nav"][] = array( 'title' => 'Websites', + 'open' => 1, + 'items' => $items); + +// clean up +unset($items); + +/* + FTP User menu +*/ + +$items[] = array( 'title' => "FTP-User", + 'target' => 'content', + 'link' => 'sites/ftp_user_list.php'); + + +$module["nav"][] = array( 'title' => 'FTP', + 'open' => 1, + 'items' => $items); + +// clean up +unset($items); + +/* + FTP User menu +*/ + +$items[] = array( 'title' => "Shell-User", + 'target' => 'content', + 'link' => 'sites/shell_user_list.php'); + + +$module["nav"][] = array( 'title' => 'Shell', + 'open' => 1, + 'items' => $items); + +// clean up +unset($items); + +/* + Databases menu +*/ + +$items[] = array( 'title' => "Database", + 'target' => 'content', + 'link' => 'sites/database_list.php'); + + +$module["nav"][] = array( 'title' => 'Database', + 'open' => 1, + 'items' => $items); + + +/* + Cron menu +*/ +$items = array(); + +$items[] = array( 'title' => "Cron Jobs", + 'target' => 'content', + 'link' => 'sites/cron_list.php'); + + +$module["nav"][] = array( 'title' => 'Cron', + 'open' => 1, + 'items' => $items); + + +//**** Statistics menu +$items = array(); + +$items[] = array( 'title' => 'Web traffic', + 'target' => 'content', + 'link' => 'sites/web_sites_stats.php'); + + +$module['nav'][] = array( 'title' => 'Statistics', + 'open' => 1, + 'items' => $items); + + + +// clean up +unset($items); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/list/cron.list.php b/interface/ispconfig/interface/sites/list/cron.list.php new file mode 100644 index 0000000000000000000000000000000000000000..e5e2ab7de36b46cfe4540bd3d89eb4571b2f2b39 --- /dev/null +++ b/interface/ispconfig/interface/sites/list/cron.list.php @@ -0,0 +1,152 @@ + "active", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array('y' => "
    Yes
    ",'n' => "
    No
    ")); + + +$liste["item"][] = array( 'field' => "server_id", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "parent_domain_id", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => "SELECT domain_id,domain FROM web_domain WHERE type = 'vhost' AND {AUTHSQL} ORDER BY domain", + 'keyfield'=> 'domain_id', + 'valuefield'=> 'domain' + ), + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "run_min", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "run_hour", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "run_mday", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "run_month", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "run_wday", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => ""); + + +$liste["item"][] = array( 'field' => "command", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + + + + + + + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/list/database.list.php b/interface/ispconfig/interface/sites/list/database.list.php new file mode 100644 index 0000000000000000000000000000000000000000..b0ff42c5994f8a50c9f0748b44431f1e10107c6e --- /dev/null +++ b/interface/ispconfig/interface/sites/list/database.list.php @@ -0,0 +1,101 @@ + "active", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array('y' => "
    Yes
    ",'n' => "
    No
    ")); + +$liste["item"][] = array( 'field' => "remote_access", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array('y' => "Yes",'n' => "No")); + +$liste["item"][] = array( 'field' => "server_id", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE {AUTHSQL} AND db_server = 1 ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "database_user", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "database_name", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/list/ftp_user.list.php b/interface/ispconfig/interface/sites/list/ftp_user.list.php new file mode 100644 index 0000000000000000000000000000000000000000..7931e7165cb19fa300e1b08317f9fdeb0a7df093 --- /dev/null +++ b/interface/ispconfig/interface/sites/list/ftp_user.list.php @@ -0,0 +1,99 @@ + "active", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array('y' => "
    Yes
    ",'n' => "
    No
    ")); + + +$liste["item"][] = array( 'field' => "server_id", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "parent_domain_id", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => "SELECT domain_id,domain FROM web_domain WHERE type = 'vhost' AND {AUTHSQL} ORDER BY domain", + 'keyfield'=> 'domain_id', + 'valuefield'=> 'domain' + ), + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "username", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/list/shell_user.list.php b/interface/ispconfig/interface/sites/list/shell_user.list.php new file mode 100644 index 0000000000000000000000000000000000000000..e754a800bc63104ab2b40094471f5f983f3904a0 --- /dev/null +++ b/interface/ispconfig/interface/sites/list/shell_user.list.php @@ -0,0 +1,99 @@ + "active", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array('y' => "
    Yes
    ",'n' => "
    No
    ")); + + +$liste["item"][] = array( 'field' => "server_id", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "parent_domain_id", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => "SELECT domain_id,domain FROM web_domain WHERE type = 'vhost' AND {AUTHSQL} ORDER BY domain", + 'keyfield'=> 'domain_id', + 'valuefield'=> 'domain' + ), + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "username", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/list/web_aliasdomain.list.php b/interface/ispconfig/interface/sites/list/web_aliasdomain.list.php new file mode 100644 index 0000000000000000000000000000000000000000..233964218f3598b880a1f8c3ae2a84d45351b99a --- /dev/null +++ b/interface/ispconfig/interface/sites/list/web_aliasdomain.list.php @@ -0,0 +1,99 @@ + "active", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array('y' => "
    Yes
    ",'n' => "
    No
    ")); + + +$liste["item"][] = array( 'field' => "server_id", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "parent_domain_id", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => "SELECT domain_id,domain FROM web_domain WHERE type = 'vhost' AND {AUTHSQL} ORDER BY domain", + 'keyfield'=> 'domain_id', + 'valuefield'=> 'domain' + ), + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "domain", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/list/web_domain.list.php b/interface/ispconfig/interface/sites/list/web_domain.list.php new file mode 100644 index 0000000000000000000000000000000000000000..05794848625eddcfcc927759977981aecf631aef --- /dev/null +++ b/interface/ispconfig/interface/sites/list/web_domain.list.php @@ -0,0 +1,94 @@ + "domain_id", + 'datatype' => "INTEGER", + 'formtype' => "TEXT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => ""); + + +$liste["item"][] = array( 'field' => "active", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array('y' => "
    Yes
    ",'n' => "
    No
    ")); + + +$liste["item"][] = array( 'field' => "server_id", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "domain", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/list/web_sites_stats.list.php b/interface/ispconfig/interface/sites/list/web_sites_stats.list.php new file mode 100644 index 0000000000000000000000000000000000000000..6ad7cc9acf28fe64440a09e67b870cd613ccc9b4 --- /dev/null +++ b/interface/ispconfig/interface/sites/list/web_sites_stats.list.php @@ -0,0 +1,60 @@ + "domain", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/list/web_subdomain.list.php b/interface/ispconfig/interface/sites/list/web_subdomain.list.php new file mode 100644 index 0000000000000000000000000000000000000000..49ae4255608a9de0bf49879362b7613d4acef778 --- /dev/null +++ b/interface/ispconfig/interface/sites/list/web_subdomain.list.php @@ -0,0 +1,99 @@ + "active", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array('y' => "
    Yes
    ",'n' => "
    No
    ")); + + +$liste["item"][] = array( 'field' => "server_id", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "parent_domain_id", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => "SELECT domain_id,domain FROM web_domain WHERE type = 'vhost' AND {AUTHSQL} ORDER BY domain", + 'keyfield'=> 'domain_id', + 'valuefield'=> 'domain' + ), + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "domain", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/shell_user_del.php b/interface/ispconfig/interface/sites/shell_user_del.php new file mode 100644 index 0000000000000000000000000000000000000000..30ded4297a5e4b57679727c97908f671471d91fb --- /dev/null +++ b/interface/ispconfig/interface/sites/shell_user_del.php @@ -0,0 +1,51 @@ +auth->check_module_permissions('sites'); + +$app->uses("tform_actions"); +$app->tform_actions->onDelete(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/shell_user_edit.php b/interface/ispconfig/interface/sites/shell_user_edit.php new file mode 100644 index 0000000000000000000000000000000000000000..c20d2b40d5860d6cb9f79191c5587ef8e9d9bad1 --- /dev/null +++ b/interface/ispconfig/interface/sites/shell_user_edit.php @@ -0,0 +1,224 @@ +auth->check_module_permissions('sites'); + +// Loading classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onShowNew() { + global $app, $conf; + + // we will check only users, not admins + if($_SESSION["s"]["user"]["typ"] == 'user') { + if(!$app->tform->checkClientLimit('limit_shell_user')) { + $app->error($app->tform->wordbook["limit_shell_user_txt"]); + } + if(!$app->tform->checkResellerLimit('limit_shell_user')) { + $app->error('Reseller: '.$app->tform->wordbook["limit_shell_user_txt"]); + } + } + + parent::onShowNew(); + } + + function onShowEnd() { + global $app, $conf, $interfaceConf; + /* + * If the names are restricted -> remove the restriction, so that the + * data can be edited + */ + + $app->uses('getconf'); + $global_config = $app->getconf->get_global_config('sites'); + //$shelluser_prefix = ($global_config['shelluser_prefix'] == '')?'':str_replace('[CLIENTNAME]', $this->getClientName(), $global_config['shelluser_prefix']); + $shelluser_prefix = replacePrefix($global_config['shelluser_prefix'], $this->dataRecord); + + if ($this->dataRecord['username'] != ""){ + /* REMOVE the restriction */ + $app->tpl->setVar("username", str_replace($shelluser_prefix , '', $this->dataRecord['username'])); + } + if($_SESSION["s"]["user"]["typ"] == 'admin' || $app->auth->has_clients($_SESSION['s']['user']['userid'])) { + $app->tpl->setVar("username_prefix", $global_config['shelluser_prefix']); + } else { + $app->tpl->setVar("username_prefix", $shelluser_prefix); + } + + if($this->id > 0) { + //* we are editing a existing record + $app->tpl->setVar("edit_disabled", 1); + $app->tpl->setVar("parent_domain_id_value", $this->dataRecord["parent_domain_id"]); + } else { + $app->tpl->setVar("edit_disabled", 0); + } + + parent::onShowEnd(); + } + + function onSubmit() { + global $app, $conf; + + // Get the record of the parent domain + $parent_domain = $app->db->queryOneRecord("select * FROM web_domain WHERE domain_id = ".intval(@$this->dataRecord["parent_domain_id"])); + + // Set a few fixed values + $this->dataRecord["server_id"] = $parent_domain["server_id"]; + + if(isset($this->dataRecord['username']) && trim($this->dataRecord['username']) == '') $app->tform->errorMessage .= $app->tform->lng('username_error_empty').'
    '; + if(isset($this->dataRecord['username']) && empty($this->dataRecord['parent_domain_id'])) $app->tform->errorMessage .= $app->tform->lng('parent_domain_id_error_empty').'
    '; + + parent::onSubmit(); + } + + function onBeforeInsert() { + global $app, $conf, $interfaceConf; + + // check if the username is not blacklisted + $blacklist = file(ISPC_LIB_PATH.'/shelluser_blacklist'); + foreach($blacklist as $line) { + if(strtolower(trim($line)) == strtolower(trim($this->dataRecord['username']))){ + $app->tform->errorMessage .= 'The username is not allowed.'; + } + } + unset($blacklist); + + /* + * If the names should be restricted -> do it! + */ + if ($app->tform->errorMessage == ''){ + + $app->uses('getconf'); + $global_config = $app->getconf->get_global_config('sites'); + // $shelluser_prefix = ($global_config['shelluser_prefix'] == '')?'':str_replace('[CLIENTNAME]', $this->getClientName(), $global_config['shelluser_prefix']); + $shelluser_prefix = replacePrefix($global_config['shelluser_prefix'], $this->dataRecord); + + /* restrict the names */ + $this->dataRecord['username'] = $shelluser_prefix . $this->dataRecord['username']; + } + parent::onBeforeInsert(); + } + + function onAfterInsert() { + global $app, $conf; + + $web = $app->db->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ".intval($this->dataRecord["parent_domain_id"])); + $server_id = $web["server_id"]; + $dir = $web["document_root"]; + $puser = $web["system_user"]; + $pgroup = $web["system_group"]; + + // The FTP user shall be owned by the same group then the website + $sys_groupid = $web['sys_groupid']; + + $sql = "UPDATE shell_user SET server_id = $server_id, dir = '$dir', puser = '$puser', pgroup = '$pgroup', sys_groupid = '$sys_groupid' WHERE shell_user_id = ".$this->id; + $app->db->query($sql); + + } + + function onBeforeUpdate() { + global $app, $conf, $interfaceConf; + + // check if the username is not blacklisted + $blacklist = file(ISPC_LIB_PATH.'/shelluser_blacklist'); + foreach($blacklist as $line) { + if(strtolower(trim($line)) == strtolower(trim($this->dataRecord['username']))){ + $app->tform->errorMessage .= 'The username is not allowed.'; + } + } + unset($blacklist); + + /* + * If the names should be restricted -> do it! + */ + if ($app->tform->errorMessage == '') { + /* + * If the names should be restricted -> do it! + */ + $app->uses('getconf'); + $global_config = $app->getconf->get_global_config('sites'); + // $shelluser_prefix = ($global_config['shelluser_prefix'] == '')?'':str_replace('[CLIENTNAME]', $this->getClientName(), $global_config['shelluser_prefix']); + $shelluser_prefix = replacePrefix($global_config['shelluser_prefix'], $this->dataRecord); + + /* restrict the names */ + $this->dataRecord['username'] = $shelluser_prefix . $this->dataRecord['username']; + } + } + + function onAfterUpdate() { + global $app, $conf; + + + } + + function getClientName() { + global $app, $conf; + + if($_SESSION["s"]["user"]["typ"] != 'admin' && !$app->auth->has_clients($_SESSION['s']['user']['userid'])) { + // Get the group-id of the user + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + } else { + // Get the group-id from the data itself + $web = $app->db->queryOneRecord("SELECT sys_groupid FROM web_domain WHERE domain_id = ".intval($this->dataRecord['parent_domain_id'])); + $client_group_id = $web['sys_groupid']; + } + /* get the name of the client */ + $tmp = $app->db->queryOneRecord("SELECT name FROM sys_group WHERE groupid = " . $client_group_id); + $clientName = $tmp['name']; + if ($clientName == "") $clientName = 'default'; + $clientName = convertClientName($clientName); + + return $clientName; + + } + +} + +$page = new page_action; +$page->onLoad(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/shell_user_list.php b/interface/ispconfig/interface/sites/shell_user_list.php new file mode 100644 index 0000000000000000000000000000000000000000..e6c7724041eb2e4f6f1670d709ced019a2722fef --- /dev/null +++ b/interface/ispconfig/interface/sites/shell_user_list.php @@ -0,0 +1,55 @@ +auth->check_module_permissions('sites'); + +$app->uses('listform_actions'); + +// Limit the results to alias domains +//$app->listform_actions->SQLExtWhere = "type = 'subdomain'"; + +$app->listform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/templates/cron_edit.htm b/interface/ispconfig/interface/sites/templates/cron_edit.htm new file mode 100644 index 0000000000000000000000000000000000000000..39f9bc6469f9888bb53968d0c499d9d6c7af09dc --- /dev/null +++ b/interface/ispconfig/interface/sites/templates/cron_edit.htm @@ -0,0 +1,68 @@ +

    +

    + +
    + +
    +
    Cron Job +
    + + + + + + + + +
    +
    + + +

    e.g. *, */3, 10-20

    +
    +
    + + +

    e.g. *, */2, 0, 10-12

    +
    +
    + + +

    e.g. *, */4, 1-5

    +
    +
    + + +

    e.g. *, 1-6

    +
    +
    + + +

    e.g. *, 0, 1-5

    +
    +
    + + +

    e.g. /var/www/clients/client1/myscript.sh or http://www.mydomain.com/path/script.php

    +
    +
    +

    {tmpl_var name='active_txt'}

    +
    + {tmpl_var name='active'} +
    +
    +
    + + + +
    + + +
    +
    + +
    diff --git a/interface/ispconfig/interface/sites/templates/cron_list.htm b/interface/ispconfig/interface/sites/templates/cron_list.htm new file mode 100644 index 0000000000000000000000000000000000000000..31551f26dadc10b44c596a7aded8f82f0f629d67 --- /dev/null +++ b/interface/ispconfig/interface/sites/templates/cron_list.htm @@ -0,0 +1,71 @@ +

    +

    + +
    + +
    +
    {tmpl_var name="toolsarea_head_txt"} +
    + +
    +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
     
    {tmpl_var name="server_id"}{tmpl_var name="run_min"}{tmpl_var name="run_hour"}{tmpl_var name="run_mday"}{tmpl_var name="run_month"}{tmpl_var name="run_wday"}{tmpl_var name="command"} + +
    +
    +
    + +
    diff --git a/interface/ispconfig/interface/sites/templates/database_edit.htm b/interface/ispconfig/interface/sites/templates/database_edit.htm new file mode 100644 index 0000000000000000000000000000000000000000..89f1afdb6707f0c64250cc8022387d81299cd492 --- /dev/null +++ b/interface/ispconfig/interface/sites/templates/database_edit.htm @@ -0,0 +1,108 @@ +

    +

    + +
    + +
    +
    + +
    + + + + + + + + +
    +
    + + +
    +
    + +
    + + +
    +
    +
    + + +
    +
    + +
    {tmpl_var name='database_name_prefix'}
    + + + + + + +
    +
    + +
    {tmpl_var name='database_user_prefix'}
    + +
    +
    + + +
    +
    +

    {tmpl_var name='password_strength_txt'}

    +
    +

     

    +
    +
    + + + + + + + + +
    +
    +

    {tmpl_var name='remote_access_txt'}

    +
    + {tmpl_var name='remote_access'} +
    +
    +
    + + +
    +
    +

    {tmpl_var name='active_txt'}

    +
    + {tmpl_var name='active'} +
    +
    +
    + + + +
    + + +
    +
    + +
    diff --git a/interface/ispconfig/interface/sites/templates/database_list.htm b/interface/ispconfig/interface/sites/templates/database_list.htm new file mode 100644 index 0000000000000000000000000000000000000000..fa954872f8da183cdc5c13d2a7202ac2d3b3d00e --- /dev/null +++ b/interface/ispconfig/interface/sites/templates/database_list.htm @@ -0,0 +1,64 @@ +

    +

    + +
    + +
    +
    {tmpl_var name="toolsarea_head_txt"} +
    + +
    +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
     
    {tmpl_var name="active"}{tmpl_var name="remote_access"}{tmpl_var name="server_id"}{tmpl_var name="database_user"}{tmpl_var name="database_name"} + +
    +
    +
    + +
    diff --git a/interface/ispconfig/interface/sites/templates/ftp_user_advanced.htm b/interface/ispconfig/interface/sites/templates/ftp_user_advanced.htm new file mode 100644 index 0000000000000000000000000000000000000000..1520630b539fd42e752aeed3d3e073f8e6d5bfc8 --- /dev/null +++ b/interface/ispconfig/interface/sites/templates/ftp_user_advanced.htm @@ -0,0 +1,50 @@ +

    +

    + +
    + +
    +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + +

     {tmpl_var name='quota_files_unity_txt'}

    +
    +
    + +

     MB

    +
    +
    + +

     MB

    +
    +
    + +

     kb/s

    +
    +
    + +

     kb/s

    +
    +
    + + + +
    + + +
    +
    + +
    diff --git a/interface/ispconfig/interface/sites/templates/ftp_user_advanced_client.htm b/interface/ispconfig/interface/sites/templates/ftp_user_advanced_client.htm new file mode 100644 index 0000000000000000000000000000000000000000..fd8d617cedc423822c51bb2570bad378e7631835 --- /dev/null +++ b/interface/ispconfig/interface/sites/templates/ftp_user_advanced_client.htm @@ -0,0 +1,22 @@ +

    +

    + +
    + +
    +
    +
    + + +
    +
    + + + +
    + + +
    +
    + +
    diff --git a/interface/ispconfig/interface/sites/templates/ftp_user_edit.htm b/interface/ispconfig/interface/sites/templates/ftp_user_edit.htm new file mode 100644 index 0000000000000000000000000000000000000000..f7588b33183d19048fe15568cb9730bde03466ef --- /dev/null +++ b/interface/ispconfig/interface/sites/templates/ftp_user_edit.htm @@ -0,0 +1,48 @@ +

    +

    + +
    + +
    +
    +
    + + +
    +
    + +
    {tmpl_var name='username_prefix'}
    + +
    +
    + + +
    +
    +

    {tmpl_var name='password_strength_txt'}

    +
    +

     

    +
    +
    + +

     MB

    +
    +
    +

    {tmpl_var name='active_txt'}

    +
    + {tmpl_var name='active'} +
    +
    +
    + + + +
    + + +
    +
    + +
    diff --git a/interface/ispconfig/interface/sites/templates/ftp_user_list.htm b/interface/ispconfig/interface/sites/templates/ftp_user_list.htm new file mode 100644 index 0000000000000000000000000000000000000000..d281feb0770858f3080fd95575e3e26fe5dfa86c --- /dev/null +++ b/interface/ispconfig/interface/sites/templates/ftp_user_list.htm @@ -0,0 +1,59 @@ +

    +

    + +
    + +
    +
    {tmpl_var name="toolsarea_head_txt"} +
    + +
    +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
     
    {tmpl_var name="active"}{tmpl_var name="server_id"}{tmpl_var name="parent_domain_id"}{tmpl_var name="username"} + +
    +
    +
    + +
    diff --git a/interface/ispconfig/interface/sites/templates/shell_user_advanced.htm b/interface/ispconfig/interface/sites/templates/shell_user_advanced.htm new file mode 100644 index 0000000000000000000000000000000000000000..eb7d8ceb11d2316ddbd4d7d6db909d8884568ab6 --- /dev/null +++ b/interface/ispconfig/interface/sites/templates/shell_user_advanced.htm @@ -0,0 +1,34 @@ +

    +

    + +
    + +
    +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + + +
    + + +
    +
    + +
    diff --git a/interface/ispconfig/interface/sites/templates/shell_user_edit.htm b/interface/ispconfig/interface/sites/templates/shell_user_edit.htm new file mode 100644 index 0000000000000000000000000000000000000000..765574350d10a881e3f288460703fa4e825ba367 --- /dev/null +++ b/interface/ispconfig/interface/sites/templates/shell_user_edit.htm @@ -0,0 +1,62 @@ +

    +

    + +
    + +
    +
    +
    + + + + + + + + +
    +
    + +
    {tmpl_var name='username_prefix'}
    + +
    +
    + + +
    +
    +

    {tmpl_var name='password_strength_txt'}

    +
    +

     

    +
    +
    + + +
    +
    + +

     MB

    +
    +
    +

    {tmpl_var name='active_txt'}

    +
    + {tmpl_var name='active'} +
    +
    +
    + + + +
    + + +
    +
    + +
    diff --git a/interface/ispconfig/interface/sites/templates/shell_user_list.htm b/interface/ispconfig/interface/sites/templates/shell_user_list.htm new file mode 100644 index 0000000000000000000000000000000000000000..a7504ac3fee3eaf9303738af5b305300e9fadbd1 --- /dev/null +++ b/interface/ispconfig/interface/sites/templates/shell_user_list.htm @@ -0,0 +1,59 @@ +

    +

    + +
    + +
    +
    {tmpl_var name="toolsarea_head_txt"} +
    + +
    +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
     
    {tmpl_var name="active"}{tmpl_var name="server_id"}{tmpl_var name="parent_domain_id"}{tmpl_var name="username"} + +
    +
    +
    + +
    diff --git a/interface/ispconfig/interface/sites/templates/web_aliasdomain_edit.htm b/interface/ispconfig/interface/sites/templates/web_aliasdomain_edit.htm new file mode 100644 index 0000000000000000000000000000000000000000..76aca15f8c8aaed3e125fe7c428262a592134bc8 --- /dev/null +++ b/interface/ispconfig/interface/sites/templates/web_aliasdomain_edit.htm @@ -0,0 +1,50 @@ +

    +

    + +
    + +
    +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    +

    {tmpl_var name='active_txt'}

    +
    + {tmpl_var name='active'} +
    +
    +
    + + + +
    + + +
    +
    + +
    diff --git a/interface/ispconfig/interface/sites/templates/web_aliasdomain_list.htm b/interface/ispconfig/interface/sites/templates/web_aliasdomain_list.htm new file mode 100644 index 0000000000000000000000000000000000000000..b43f22aeea69e39bbeeb7e6658b8dd9fd7fa34a2 --- /dev/null +++ b/interface/ispconfig/interface/sites/templates/web_aliasdomain_list.htm @@ -0,0 +1,59 @@ +

    +

    + +
    + +
    +
    {tmpl_var name="toolsarea_head_txt"} +
    + +
    +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
     
    {tmpl_var name="active"}{tmpl_var name="server_id"}{tmpl_var name="parent_domain_id"}{tmpl_var name="domain"} + +
    +
    +
    + +
    diff --git a/interface/ispconfig/interface/sites/templates/web_domain_advanced.htm b/interface/ispconfig/interface/sites/templates/web_domain_advanced.htm new file mode 100644 index 0000000000000000000000000000000000000000..79a5f6e64d3d27dec0d05b9faf799a9336f81bc7 --- /dev/null +++ b/interface/ispconfig/interface/sites/templates/web_domain_advanced.htm @@ -0,0 +1,41 @@ +

    +

    + +
    + +
    +
    + +
    + + + +
    +
    + + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + + +
    + + +
    +
    + +
    diff --git a/interface/ispconfig/interface/sites/templates/web_domain_edit.htm b/interface/ispconfig/interface/sites/templates/web_domain_edit.htm new file mode 100644 index 0000000000000000000000000000000000000000..836017efc8b33a8e1aaa459071a73d010ebe8a35 --- /dev/null +++ b/interface/ispconfig/interface/sites/templates/web_domain_edit.htm @@ -0,0 +1,120 @@ +

    +

    + +
    + +
    +
    + +
    + + + + + + + + +
    +
    + + +
    +
    + +
    + + +
    +
    +
    + + +
    +
    + + +
    +
    + +  MB +
    +
    + +  MB +
    +
    +

    {tmpl_var name='cgi_txt'}

    +
    + {tmpl_var name='cgi'} +
    +
    +
    +

    {tmpl_var name='ssi_txt'}

    +
    + {tmpl_var name='ssi'} +
    +
    +
    +

    {tmpl_var name='suexec_txt'}

    +
    + {tmpl_var name='suexec'} +
    +
    +
    +

    {tmpl_var name='errordocs_txt'}

    +
    + {tmpl_var name='errordocs'} +
    +
    +
    +

    {tmpl_var name='is_subdomainwww_txt'}

    +
    + {tmpl_var name='is_subdomainwww'} +
    +
    +
    + + +
    +
    +

    {tmpl_var name='ssl_txt'}

    +
    + {tmpl_var name='ssl'} +
    +
    +
    + + +
    +
    +

    {tmpl_var name='active_txt'}

    +
    + {tmpl_var name='active'} +
    +
    +
    + + + +
    + + +
    +
    + +
    diff --git a/interface/ispconfig/interface/sites/templates/web_domain_list.htm b/interface/ispconfig/interface/sites/templates/web_domain_list.htm new file mode 100644 index 0000000000000000000000000000000000000000..290cf2bad9387a8d811555ba91205990db8ceed9 --- /dev/null +++ b/interface/ispconfig/interface/sites/templates/web_domain_list.htm @@ -0,0 +1,59 @@ +

    +

    + +
    + +
    +
    {tmpl_var name="toolsarea_head_txt"} +
    + +
    +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
     
    {tmpl_var name="domain_id"}{tmpl_var name="active"}{tmpl_var name="server_id"}{tmpl_var name="domain"} + +
    +
    +
    + +
    diff --git a/interface/ispconfig/interface/sites/templates/web_domain_redirect.htm b/interface/ispconfig/interface/sites/templates/web_domain_redirect.htm new file mode 100644 index 0000000000000000000000000000000000000000..89e6fab80aae282bfb7a792cdddb058c57afea56 --- /dev/null +++ b/interface/ispconfig/interface/sites/templates/web_domain_redirect.htm @@ -0,0 +1,28 @@ +

    +

    + +
    + +
    +
    +
    + + +
    +
    + + +
    +
    + + + +
    + + +
    +
    + +
    diff --git a/interface/ispconfig/interface/sites/templates/web_domain_ssl.htm b/interface/ispconfig/interface/sites/templates/web_domain_ssl.htm new file mode 100644 index 0000000000000000000000000000000000000000..273855c20cf236bfb882771a432d31629e19c850 --- /dev/null +++ b/interface/ispconfig/interface/sites/templates/web_domain_ssl.htm @@ -0,0 +1,62 @@ +

    +

    + +
    + +
    +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + + +
    + + +
    +
    + +
    diff --git a/interface/ispconfig/interface/sites/templates/web_domain_stats.htm b/interface/ispconfig/interface/sites/templates/web_domain_stats.htm new file mode 100644 index 0000000000000000000000000000000000000000..0886460c3b31e22c096a4e556a581056570a7626 --- /dev/null +++ b/interface/ispconfig/interface/sites/templates/web_domain_stats.htm @@ -0,0 +1,22 @@ +

    +

    + +
    + +
    +
    +
    + + +
    +
    + + + +
    + + +
    +
    + +
    diff --git a/interface/ispconfig/interface/sites/templates/web_sites_stats_list.htm b/interface/ispconfig/interface/sites/templates/web_sites_stats_list.htm new file mode 100644 index 0000000000000000000000000000000000000000..6312b027e77eea37da53e0a4261149100a80f559 --- /dev/null +++ b/interface/ispconfig/interface/sites/templates/web_sites_stats_list.htm @@ -0,0 +1,52 @@ +

    +

    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
     
    {tmpl_var name="domain"}{tmpl_var name="this_month"} MB{tmpl_var name="last_month"} MB{tmpl_var name="this_year"} MB{tmpl_var name="last_year"} MB +
    +
    +
    +
    +
    + +
    diff --git a/interface/ispconfig/interface/sites/templates/web_subdomain_edit.htm b/interface/ispconfig/interface/sites/templates/web_subdomain_edit.htm new file mode 100644 index 0000000000000000000000000000000000000000..2206cf7bd56de5bd2263aff9851920d761a755dc --- /dev/null +++ b/interface/ispconfig/interface/sites/templates/web_subdomain_edit.htm @@ -0,0 +1,42 @@ +

    +

    + +
    + +
    +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    +

    {tmpl_var name='active_txt'}

    +
    + {tmpl_var name='active'} +
    +
    +
    + + + +
    + + +
    +
    + +
    diff --git a/interface/ispconfig/interface/sites/templates/web_subdomain_list.htm b/interface/ispconfig/interface/sites/templates/web_subdomain_list.htm new file mode 100644 index 0000000000000000000000000000000000000000..fce2a6ff24e70ed3364f76b2ca3067e15913d3a5 --- /dev/null +++ b/interface/ispconfig/interface/sites/templates/web_subdomain_list.htm @@ -0,0 +1,60 @@ +

    +

    + +
    + +
    +
    {tmpl_var name="toolsarea_head_txt"} +
    + +
    +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
     
    {tmpl_var name="active"}{tmpl_var name="server_id"}{tmpl_var name="parent_domain_id"}{tmpl_var name="domain"} + +
    +
    +
    + +
    diff --git a/interface/ispconfig/interface/sites/tools.inc.php b/interface/ispconfig/interface/sites/tools.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..65dd4591009204e6cb5c5d7dbc885945a70c685b --- /dev/null +++ b/interface/ispconfig/interface/sites/tools.inc.php @@ -0,0 +1,126 @@ + no possible output -> go out! + if ($name=="") return ""; + + // Array containing keys to search + $keywordlist=array('CLIENTNAME','CLIENTID','DOMAINID'); + + // Try to match the key within the string + foreach ($keywordlist as $keyword) { + if (substr_count($name, '['.$keyword.']') > 0) { + switch ($keyword) { + case 'CLIENTNAME': + $name=str_replace('['.$keyword.']', getClientName($dataRecord),$name); + break; + case 'CLIENTID': + $name=str_replace('['.$keyword.']', getClientID($dataRecord),$name); + break; + case 'DOMAINID': + $name=str_replace('['.$keyword.']', $dataRecord['parent_domain_id'],$name); + break; + } + } + } + return $name; +} + +function getClientName($dataRecord) { + global $app, $conf; + + if($_SESSION["s"]["user"]["typ"] != 'admin' || $app->auth->has_clients($_SESSION['s']['user']['userid'])) { + // Get the group-id of the user + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + } else { + // Get the group-id from the data itself + if(isset($dataRecord['client_group_id'])) { + $client_group_id = $dataRecord['client_group_id']; + } elseif (isset($dataRecord['parent_domain_id'])) { + $tmp = $app->db->queryOneRecord("SELECT sys_groupid FROM web_domain WHERE domain_id = " . $dataRecord['parent_domain_id']); + $client_group_id = $tmp['sys_groupid']; + } else { + $client_group_id = $dataRecord['sys_groupid']; + } + } + + /* get the name of the client */ + $tmp = $app->db->queryOneRecord("SELECT name FROM sys_group WHERE groupid = " . $client_group_id); + $clientName = $tmp['name']; + if ($clientName == "") $clientName = 'default'; + $clientName = convertClientName($clientName); + return $clientName; +} + +function getClientID($dataRecord) { + global $app, $conf; + + if($_SESSION["s"]["user"]["typ"] != 'admin' || $app->auth->has_clients($_SESSION['s']['user']['userid'])) { + // Get the group-id of the user + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + } else { + // Get the group-id from the data itself + if(isset($dataRecord['client_group_id'])) { + $client_group_id = $dataRecord['client_group_id']; + } elseif (isset($dataRecord['parent_domain_id'])) { + $tmp = $app->db->queryOneRecord("SELECT sys_groupid FROM web_domain WHERE domain_id = " . $dataRecord['parent_domain_id']); + $client_group_id = $tmp['sys_groupid']; + } else { + $client_group_id = $dataRecord['sys_groupid']; + } + } + /* get the name of the client */ + $tmp = $app->db->queryOneRecord("SELECT client_id FROM sys_group WHERE groupid = " . $client_group_id); + $clientID = $tmp['client_id']; + if ($clientID == '') $clientID = '0'; + return $clientID; +} + +function convertClientName($name){ + /** + * only allow 'a'..'z', '_', '0'..'9' + */ + $allowed = 'abcdefghijklmnopqrstuvwxyz0123456789_'; + $res = ''; + $name = strtolower(trim($name)); + for ($i=0; $i < strlen($name); $i++){ + if ($name[$i] == ' ') continue; + if (strpos($allowed, $name[$i]) !== false){ + $res .= $name[$i]; + } + else { + $res .= '_'; + } + } + return $res; +} + + +?> diff --git a/interface/ispconfig/interface/sites/web_aliasdomain_del.php b/interface/ispconfig/interface/sites/web_aliasdomain_del.php new file mode 100644 index 0000000000000000000000000000000000000000..748fb58b148972ad8f2f9c95489be481be0ed4e4 --- /dev/null +++ b/interface/ispconfig/interface/sites/web_aliasdomain_del.php @@ -0,0 +1,51 @@ +auth->check_module_permissions('sites'); + +$app->uses("tform_actions"); +$app->tform_actions->onDelete(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/web_aliasdomain_edit.php b/interface/ispconfig/interface/sites/web_aliasdomain_edit.php new file mode 100644 index 0000000000000000000000000000000000000000..151fad41a10ac8487189d59900781f9284d0e047 --- /dev/null +++ b/interface/ispconfig/interface/sites/web_aliasdomain_edit.php @@ -0,0 +1,114 @@ +auth->check_module_permissions('sites'); + +// Loading classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + var $parent_domain_record; + + function onShowNew() { + global $app, $conf; + + // we will check only users, not admins + if($_SESSION["s"]["user"]["typ"] == 'user') { + if(!$app->tform->checkClientLimit('limit_web_aliasdomain',"type = 'alias'")) { + $app->error($app->tform->wordbook["limit_web_aliasdomain_txt"]); + } + if(!$app->tform->checkResellerLimit('limit_web_aliasdomain',"type = 'alias'")) { + $app->error('Reseller: '.$app->tform->wordbook["limit_web_aliasdomain_txt"]); + } + } + + parent::onShowNew(); + } + + /* + function onShowEnd() { + global $app, $conf; + + // Get the record of the parent domain + $parent_domain = $app->db->queryOneRecord("select * FROM web_domain WHERE domain_id = ".intval($this->dataRecord["parent_domain_id"])); + + $this->dataRecord["domain"] = str_replace('.'.$parent_domain["domain"],'',$this->dataRecord["domain"]); + $app->tpl->setVar("domain",$this->dataRecord["domain"]); + + parent::onShowEnd(); + + } + */ + + function onSubmit() { + global $app, $conf; + + // Get the record of the parent domain + $parent_domain = $app->db->queryOneRecord("select * FROM web_domain WHERE domain_id = ".intval(@$this->dataRecord["parent_domain_id"])); + + // Set a few fixed values + $this->dataRecord["type"] = 'alias'; + $this->dataRecord["server_id"] = $parent_domain["server_id"]; + //$this->dataRecord["domain"] = $this->dataRecord["domain"].'.'.$parent_domain["domain"]; + + $this->parent_domain_record = $parent_domain; + + parent::onSubmit(); + } + + function onAfterInsert() { + global $app, $conf; + + $app->db->query('UPDATE web_domain SET sys_groupid = '.intval($this->parent_domain_record['sys_groupid']).' WHERE domain_id = '.$this->id); + + } + +} + +$page = new page_action; +$page->onLoad(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/web_aliasdomain_list.php b/interface/ispconfig/interface/sites/web_aliasdomain_list.php new file mode 100644 index 0000000000000000000000000000000000000000..4d16975302137b1b76022fdf4fceef136377a32f --- /dev/null +++ b/interface/ispconfig/interface/sites/web_aliasdomain_list.php @@ -0,0 +1,55 @@ +auth->check_module_permissions('sites'); + +$app->uses('listform_actions'); + +// Limit the results to alias domains +$app->listform_actions->SQLExtWhere = "type = 'alias'"; + +$app->listform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/web_domain_del.php b/interface/ispconfig/interface/sites/web_domain_del.php new file mode 100644 index 0000000000000000000000000000000000000000..185cdd33f6b48ec5fb67b6494f01448cd3f0a825 --- /dev/null +++ b/interface/ispconfig/interface/sites/web_domain_del.php @@ -0,0 +1,87 @@ +auth->check_module_permissions('sites'); + +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onBeforeDelete() { + global $app; $conf; + + if($app->tform->checkPerm($this->id,'d') == false) $app->error($app->lng('error_no_delete_permission')); + + // Delete all records that belog to this zone. + $records = $app->db->queryAllRecords("SELECT domain_id FROM web_domain WHERE parent_domain_id = '".intval($this->id)."' AND type != 'vhost'"); + foreach($records as $rec) { + $app->db->datalogDelete('web_domain','domain_id',$rec['domain_id']); + } + + // Delete all records that belog to this zone. + $records = $app->db->queryAllRecords("SELECT ftp_user_id FROM ftp_user WHERE parent_domain_id = '".intval($this->id)."'"); + foreach($records as $rec) { + $app->db->datalogDelete('ftp_user','ftp_user_id',$rec['ftp_user_id']); + } + + // Delete all records that belog to this zone. + $records = $app->db->queryAllRecords("SELECT shell_user_id FROM shell_user WHERE parent_domain_id = '".intval($this->id)."'"); + foreach($records as $rec) { + $app->db->datalogDelete('shell_user','shell_user_id',$rec['shell_user_id']); + } + + // Delete all records that belog to this zone. + $records = $app->db->queryAllRecords("SELECT id FROM cron WHERE parent_domain_id = '".intval($this->id)."'"); + foreach($records as $rec) { + $app->db->datalogDelete('cron','id',$rec['id']); + } + } +} + +$page = new page_action; +$page->onDelete(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/web_domain_edit.php b/interface/ispconfig/interface/sites/web_domain_edit.php new file mode 100644 index 0000000000000000000000000000000000000000..4e8cf0b3e9f73cac89d1ea1fb80576277f28333b --- /dev/null +++ b/interface/ispconfig/interface/sites/web_domain_edit.php @@ -0,0 +1,477 @@ +auth->check_module_permissions('sites'); + +// Loading classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onShowNew() { + global $app, $conf; + + // we will check only users, not admins + if($_SESSION["s"]["user"]["typ"] == 'user') { + if(!$app->tform->checkClientLimit('limit_web_domain',"type = 'vhost'")) { + $app->error($app->tform->wordbook["limit_web_domain_txt"]); + } + if(!$app->tform->checkResellerLimit('limit_web_domain',"type = 'vhost'")) { + $app->error('Reseller: '.$app->tform->wordbook["limit_web_domain_txt"]); + } + } + + parent::onShowNew(); + } + + function onShowEnd() { + global $app, $conf; + + //* Client: If the logged in user is not admin and has no sub clients (no rseller) + if($_SESSION["s"]["user"]["typ"] != 'admin' && !$app->auth->has_clients($_SESSION['s']['user']['userid'])) { + + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_web_domain, default_webserver FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Set the webserver to the default server of the client + $tmp = $app->db->queryOneRecord("SELECT server_name FROM server WHERE server_id = $client[default_webserver]"); + $app->tpl->setVar("server_id",""); + unset($tmp); + + // Fill the IP select field with the IP addresses that are allowed for this client + // $ip_select = ""; + // $app->tpl->setVar("ip_address",$ip_select); + $sql = "SELECT ip_address FROM server_ip WHERE server_id = ".$client['default_webserver']; + $ips = $app->db->queryAllRecords($sql); + $ip_select = ""; + //$ip_select = ""; + if(is_array($ips)) { + foreach( $ips as $ip) { + $selected = ($ip["ip_address"] == $this->dataRecord["ip_address"])?'SELECTED':''; + $ip_select .= "\r\n"; + } + } + $app->tpl->setVar("ip_address",$ip_select); + unset($tmp); + unset($ips); + + //* Reseller: If the logged in user is not admin and has sub clients (is a rseller) + } elseif ($_SESSION["s"]["user"]["typ"] != 'admin' && $app->auth->has_clients($_SESSION['s']['user']['userid'])) { + + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT client.client_id, limit_web_domain, default_webserver, client.contact_name FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Set the webserver to the default server of the client + $tmp = $app->db->queryOneRecord("SELECT server_name FROM server WHERE server_id = $client[default_webserver]"); + $app->tpl->setVar("server_id",""); + unset($tmp); + + // Fill the client select field + $sql = "SELECT groupid, name FROM sys_group, client WHERE sys_group.client_id = client.client_id AND client.parent_client_id = ".$client['client_id']." ORDER BY name"; + $records = $app->db->queryAllRecords($sql); + $tmp = $app->db->queryOneRecord("SELECT groupid FROM sys_group WHERE client_id = ".$client['client_id']); + $client_select = ''; + $tmp_data_record = $app->tform->getDataRecord($this->id); + if(is_array($records)) { + foreach( $records as $rec) { + $selected = @($rec["groupid"] == $tmp_data_record["sys_groupid"])?'SELECTED':''; + $client_select .= "\r\n"; + } + } + $app->tpl->setVar("client_group_id",$client_select); + + // Fill the IP select field with the IP addresses that are allowed for this client + //$ip_select = ""; + //$app->tpl->setVar("ip_address",$ip_select); + $sql = "SELECT ip_address FROM server_ip WHERE server_id = ".$client['default_webserver']; + $ips = $app->db->queryAllRecords($sql); + $ip_select = ""; + //$ip_select = ""; + if(is_array($ips)) { + foreach( $ips as $ip) { + $selected = ($ip["ip_address"] == $this->dataRecord["ip_address"])?'SELECTED':''; + $ip_select .= "\r\n"; + } + } + $app->tpl->setVar("ip_address",$ip_select); + unset($tmp); + unset($ips); + + //* Admin: If the logged in user is admin + } else { + + // The user is admin, so we fill in all IP addresses of the server + if($this->id > 0) { + $server_id = @$this->dataRecord["server_id"]; + } else { + // Get the first server ID + $tmp = $app->db->queryOneRecord("SELECT server_id FROM server WHERE web_server = 1 ORDER BY server_name LIMIT 0,1"); + $server_id = $tmp['server_id']; + } + + $sql = "SELECT ip_address FROM server_ip WHERE server_id = $server_id"; + $ips = $app->db->queryAllRecords($sql); + $ip_select = ""; + //$ip_select = ""; + if(is_array($ips)) { + foreach( $ips as $ip) { + $selected = ($ip["ip_address"] == $this->dataRecord["ip_address"])?'SELECTED':''; + $ip_select .= "\r\n"; + } + } + $app->tpl->setVar("ip_address",$ip_select); + unset($tmp); + unset($ips); + + // Fill the client select field + $sql = "SELECT groupid, name FROM sys_group WHERE client_id > 0 ORDER BY name"; + $clients = $app->db->queryAllRecords($sql); + $client_select = ""; + $tmp_data_record = $app->tform->getDataRecord($this->id); + if(is_array($clients)) { + foreach( $clients as $client) { + $selected = @($client["groupid"] == $tmp_data_record["sys_groupid"])?'SELECTED':''; + $client_select .= "\r\n"; + } + } + $app->tpl->setVar("client_group_id",$client_select); + + } + + $ssl_domain_select = ''; + $ssl_domains = array($this->dataRecord["domain"],'www.'.$this->dataRecord["domain"]); + if(is_array($ssl_domains)) { + foreach( $ssl_domains as $ssl_domain) { + $selected = ($ssl_domain == $this->dataRecord['ssl_domain'])?'SELECTED':''; + $ssl_domain_select .= "\r\n"; + } + } + $app->tpl->setVar("ssl_domain",$ssl_domain_select); + unset($ssl_domain_select); + unset($ssl_domains); + unset($ssl_domain); + + if($this->id > 0) { + //* we are editing a existing record + $app->tpl->setVar("edit_disabled", 1); + $app->tpl->setVar("server_id_value", $this->dataRecord["server_id"]); + } else { + $app->tpl->setVar("edit_disabled", 0); + } + + $tmp_txt = ($this->dataRecord['traffic_quota_lock'] == 'y')?'('.$app->tform->lng('traffic_quota_exceeded_txt').')':''; + $app->tpl->setVar("traffic_quota_exceeded_txt", $tmp_txt); + + parent::onShowEnd(); + } + + function onSubmit() { + global $app, $conf; + + // Set a few fixed values + $this->dataRecord["parent_domain_id"] = 0; + $this->dataRecord["type"] = 'vhost'; + $this->dataRecord["vhost_type"] = 'name'; + + if($_SESSION["s"]["user"]["typ"] != 'admin') { + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_traffic_quota, limit_web_domain, default_webserver, parent_client_id, limit_web_quota FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + //* Check the website quota + if(isset($_POST["hd_quota"]) && $client["limit_web_quota"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT sum(hd_quota) as webquota FROM web_domain WHERE domain_id != ".intval($this->id)." AND ".$app->tform->getAuthSQL('u')); + $webquota = $tmp["webquota"]; + $new_web_quota = intval($this->dataRecord["hd_quota"]); + if(($webquota + $new_web_quota > $client["limit_web_quota"]) || ($new_web_quota == -1 && $client["limit_web_quota"] != -1)) { + $max_free_quota = floor($client["limit_web_quota"] - $webquota); + if($max_free_quota < 0) $max_free_quota = 0; + $app->tform->errorMessage .= $app->tform->lng("limit_web_quota_free_txt").": ".$max_free_quota." MB
    "; + // Set the quota field to the max free space + $this->dataRecord["hd_quota"] = $max_free_quota; + } + unset($tmp); + unset($tmp_quota); + } + + //* Check the traffic quota + if(isset($_POST["traffic_quota"]) && $client["limit_traffic_quota"] > 0) { + $tmp = $app->db->queryOneRecord("SELECT sum(traffic_quota) as trafficquota FROM web_domain WHERE domain_id != ".intval($this->id)." AND ".$app->tform->getAuthSQL('u')); + $trafficquota = $tmp["trafficquota"]; + $new_traffic_quota = intval($this->dataRecord["traffic_quota"]); + if(($trafficquota + $new_traffic_quota > $client["limit_traffic_quota"]) || ($new_traffic_quota == -1 && $client["limit_traffic_quota"] != -1)) { + $max_free_quota = floor($client["limit_traffic_quota"] - $trafficquota); + if($max_free_quota < 0) $max_free_quota = 0; + $app->tform->errorMessage .= $app->tform->lng("limit_traffic_quota_free_txt").": ".$max_free_quota." MB
    "; + // Set the quota field to the max free space + $this->dataRecord["traffic_quota"] = $max_free_quota; + } + unset($tmp); + unset($tmp_quota); + } + + // When the record is updated + if($this->id > 0) { + // restore the server ID if the user is not admin and record is edited + $tmp = $app->db->queryOneRecord("SELECT server_id FROM web_domain WHERE domain_id = ".intval($this->id)); + $this->dataRecord["server_id"] = $tmp["server_id"]; + unset($tmp); + // When the record is inserted + } else { + // set the server ID to the default mailserver of the client + $this->dataRecord["server_id"] = $client["default_webserver"]; + + + // Check if the user may add another web_domain + if($client["limit_web_domain"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(domain_id) as number FROM web_domain WHERE sys_groupid = $client_group_id and type = 'vhost'"); + if($tmp["number"] >= $client["limit_web_domain"]) { + $app->error($app->tform->wordbook["limit_web_domain_txt"]); + } + } + + } + + // Clients may not set the client_group_id, so we unset them if user is not a admin and the client is not a reseller + if(!$app->auth->has_clients($_SESSION['s']['user']['userid'])) unset($this->dataRecord["client_group_id"]); + } + + + parent::onSubmit(); + } + + function onAfterInsert() { + global $app, $conf; + + // make sure that the record belongs to the clinet group and not the admin group when a dmin inserts it + // also make sure that the user can not delete domain created by a admin + if($_SESSION["s"]["user"]["typ"] == 'admin' && isset($this->dataRecord["client_group_id"])) { + $client_group_id = intval($this->dataRecord["client_group_id"]); + $app->db->query("UPDATE web_domain SET sys_groupid = $client_group_id, sys_perm_group = 'ru' WHERE domain_id = ".$this->id); + } + if($app->auth->has_clients($_SESSION['s']['user']['userid']) && isset($this->dataRecord["client_group_id"])) { + $client_group_id = intval($this->dataRecord["client_group_id"]); + $app->db->query("UPDATE web_domain SET sys_groupid = $client_group_id, sys_perm_group = 'riud' WHERE domain_id = ".$this->id); + } + + // Get configuration for the web system + $app->uses("getconf"); + $web_rec = $app->tform->getDataRecord($this->id); + $web_config = $app->getconf->get_server_config(intval($web_rec["server_id"]),'web'); + $document_root = str_replace("[website_id]",$this->id,$web_config["website_path"]); + + // get the ID of the client + if($_SESSION["s"]["user"]["typ"] != 'admin' && !$app->auth->has_clients($_SESSION['s']['user']['userid'])) { + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT client_id FROM sys_group WHERE sys_group.groupid = $client_group_id"); + $client_id = intval($client["client_id"]); + } else { + //$client_id = intval($this->dataRecord["client_group_id"]); + $client = $app->db->queryOneRecord("SELECT client_id FROM sys_group WHERE sys_group.groupid = ".intval($this->dataRecord["client_group_id"])); + $client_id = intval($client["client_id"]); + } + + // Set the values for document_root, system_user and system_group + $system_user = $app->db->quote('web'.$this->id); + $system_group = $app->db->quote('client'.$client_id); + $document_root = $app->db->quote(str_replace("[client_id]",$client_id,$document_root)); + $php_open_basedir = str_replace("[website_path]",$document_root,$web_config["php_open_basedir"]); + $php_open_basedir = $app->db->quote(str_replace("[website_domain]",$web_rec['domain'],$php_open_basedir)); + $htaccess_allow_override = $app->db->quote($web_config["htaccess_allow_override"]); + + $sql = "UPDATE web_domain SET system_user = '$system_user', system_group = '$system_group', document_root = '$document_root', allow_override = '$htaccess_allow_override', php_open_basedir = '$php_open_basedir' WHERE domain_id = ".$this->id; + $app->db->query($sql); + } + + function onBeforeUpdate () { + global $app, $conf; + + //* Check if the server has been changed + // We do this only for the admin or reseller users, as normal clients can not change the server ID anyway + if($_SESSION["s"]["user"]["typ"] == 'admin' || $app->auth->has_clients($_SESSION['s']['user']['userid'])) { + if (isset($this->dataRecord["server_id"])){ + $rec = $app->db->queryOneRecord("SELECT server_id from web_domain WHERE domain_id = ".$this->id); + if($rec['server_id'] != $this->dataRecord["server_id"]) { + //* Add a error message and switch back to old server + $app->tform->errorMessage .= $app->lng('The Server can not be changed.'); + $this->dataRecord["server_id"] = $rec['server_id']; + } + unset($rec); + } + //* If the user is neither admin nor reseller + } else { + //* We do not allow users to change a domain which has been created by the admin + $rec = $app->db->queryOneRecord("SELECT domain from web_domain WHERE domain_id = ".$this->id); + if(isset($this->dataRecord["domain"]) && $rec['domain'] != $this->dataRecord["domain"] && $app->tform->checkPerm($this->id,'u')) { + //* Add a error message and switch back to old server + $app->tform->errorMessage .= $app->lng('The Domain can not be changed. Please ask your Administrator if you want to change the domain name.'); + $this->dataRecord["domain"] = $rec['domain']; + } + unset($rec); + } + + //* Check that all fields for the SSL cert creation are filled + if(isset($this->dataRecord['ssl_action']) && $this->dataRecord['ssl_action'] == 'create') { + if($this->dataRecord['ssl_state'] == '') $app->tform->errorMessage .= $app->tform->lng('error_ssl_state_empty').'
    '; + if($this->dataRecord['ssl_locality'] == '') $app->tform->errorMessage .= $app->tform->lng('error_ssl_locality_empty').'
    '; + if($this->dataRecord['ssl_organisation'] == '') $app->tform->errorMessage .= $app->tform->lng('error_ssl_organisation_empty').'
    '; + if($this->dataRecord['ssl_organisation_unit'] == '') $app->tform->errorMessage .= $app->tform->lng('error_ssl_organisation_unit_empty').'
    '; + if($this->dataRecord['ssl_country'] == '') $app->tform->errorMessage .= $app->tform->lng('error_ssl_country_empty').'
    '; + } + + } + + function onAfterUpdate() { + global $app, $conf; + + // make sure that the record belongs to the clinet group and not the admin group when a admin inserts it + // also make sure that the user can not delete domain created by a admin + if($_SESSION["s"]["user"]["typ"] == 'admin' && isset($this->dataRecord["client_group_id"])) { + $client_group_id = intval($this->dataRecord["client_group_id"]); + $app->db->query("UPDATE web_domain SET sys_groupid = $client_group_id, sys_perm_group = 'ru' WHERE domain_id = ".$this->id); + } + if($app->auth->has_clients($_SESSION['s']['user']['userid']) && isset($this->dataRecord["client_group_id"])) { + $client_group_id = intval($this->dataRecord["client_group_id"]); + $app->db->query("UPDATE web_domain SET sys_groupid = $client_group_id, sys_perm_group = 'riud' WHERE domain_id = ".$this->id); + } + + // Get configuration for the web system + $app->uses("getconf"); + $web_rec = $app->tform->getDataRecord($this->id); + $web_config = $app->getconf->get_server_config(intval($web_rec["server_id"]),'web'); + $document_root = str_replace("[website_id]",$this->id,$web_config["website_path"]); + + // get the ID of the client + if($_SESSION["s"]["user"]["typ"] != 'admin' && !$app->auth->has_clients($_SESSION['s']['user']['userid'])) { + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT client_id FROM sys_group WHERE sys_group.groupid = $client_group_id"); + $client_id = intval($client["client_id"]); + } else { + //$client_id = intval(@$web_rec["client_group_id"]); + $client = $app->db->queryOneRecord("SELECT client_id FROM sys_group WHERE sys_group.groupid = ".intval(@$this->dataRecord["client_group_id"])); + $client_id = intval($client["client_id"]); + } + + if(($_SESSION["s"]["user"]["typ"] == 'admin' || $app->auth->has_clients($_SESSION['s']['user']['userid'])) && isset($this->dataRecord["client_group_id"]) && $this->dataRecord["client_group_id"] != $this->oldDataRecord["sys_groupid"]) { + // Set the values for document_root, system_user and system_group + $system_user = $app->db->quote('web'.$this->id); + $system_group = $app->db->quote('client'.$client_id); + $document_root = $app->db->quote(str_replace("[client_id]",$client_id,$document_root)); + + $sql = "UPDATE web_domain SET system_user = '$system_user', system_group = '$system_group', document_root = '$document_root' WHERE domain_id = ".$this->id; + //$sql = "UPDATE web_domain SET system_user = '$system_user', system_group = '$system_group' WHERE domain_id = ".$this->id; + $app->db->query($sql); + + // Update the FTP user(s) too + $records = $app->db->queryAllRecords("SELECT ftp_user_id FROM ftp_user WHERE parent_domain_id = ".$this->id); + foreach($records as $rec) { + $app->db->datalogUpdate('ftp_user', "uid = '$system_user', gid = '$system_group', dir = '$document_root'", 'ftp_user_id', $rec['ftp_user_id']); + } + unset($records); + unset($rec); + + // Update the Shell user(s) too + $records = $app->db->queryAllRecords("SELECT shell_user_id FROM shell_user WHERE parent_domain_id = ".$this->id); + foreach($records as $rec) { + $app->db->datalogUpdate('shell_user', "puser = '$system_user', pgroup = '$system_group', dir = '$document_root'", 'shell_user_id', $rec['shell_user_id']); + } + unset($records); + unset($rec); + + } + + //* If the domain name has been changed, we will have to change all subdomains + if($this->dataRecord["domain"] != '' && $this->oldDataRecord["domain"] != '' && $this->dataRecord["domain"] != $this->oldDataRecord["domain"]) { + $records = $app->db->queryAllRecords("SELECT domain_id,domain FROM web_domain WHERE type = 'subdomain' AND domain LIKE '%.".$app->db->quote($this->oldDataRecord["domain"])."'"); + foreach($records as $rec) { + $subdomain = $app->db->quote(str_replace($this->oldDataRecord["domain"],$this->dataRecord["domain"],$rec['domain'])); + $app->db->datalogUpdate('web_domain', "domain = '".$subdomain."'", 'domain_id', $rec['domain_id']); + } + unset($records); + unset($rec); + unset($subdomain); + } + + //* Set allow_override and php_open_basedir if empty + if($web_rec['allow_override'] == '') { + $sql = "UPDATE web_domain SET allow_override = '".$app->db->quote($web_config["htaccess_allow_override"])."' WHERE domain_id = ".$this->id; + $app->db->query($sql); + } + if($web_rec['php_open_basedir'] == '') { + $document_root = $app->db->quote(str_replace("[client_id]",$client_id,$document_root)); + $php_open_basedir = str_replace("[website_path]",$document_root,$web_config["php_open_basedir"]); + $php_open_basedir = $app->db->quote(str_replace("[website_domain]",$web_rec['domain'],$php_open_basedir)); + $sql = "UPDATE web_domain SET php_open_basedir = '$php_open_basedir' WHERE domain_id = ".$this->id; + $app->db->query($sql); + } + + } + + function onAfterDelete() { + global $app, $conf; + + // Delete the sub and alias domains + $child_domains = $app->db->queryAllRecords("SELECT * FROM web_domain WHERE parent_domain_id = ".$this->id); + foreach($child_domains as $d) { + // Saving record to datalog when db_history enabled + if($app->tform->formDef["db_history"] == 'yes') { + $app->tform->datalogSave('DELETE',$d["domain_id"],$d,array()); + } + + $app->db->query("DELETE FROM web_domain WHERE domain_id = ".$d["domain_id"]." LIMIT 0,1"); + } + unset($child_domains); + unset($d); + + } + +} + +$page = new page_action; +$page->onLoad(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/web_domain_list.php b/interface/ispconfig/interface/sites/web_domain_list.php new file mode 100644 index 0000000000000000000000000000000000000000..085ca05cbb0adaa872a29bbaa9d65b512600ebb2 --- /dev/null +++ b/interface/ispconfig/interface/sites/web_domain_list.php @@ -0,0 +1,59 @@ +auth->check_module_permissions('sites'); + +$app->load('listform_actions'); + + +class list_action extends listform_actions { + +} + +$list = new list_action; +$list->SQLExtWhere = "type = 'vhost'"; +$list->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/web_sites_stats.php b/interface/ispconfig/interface/sites/web_sites_stats.php new file mode 100644 index 0000000000000000000000000000000000000000..f3809807fd36c3f66cbd8e3de4c4e9398df2a736 --- /dev/null +++ b/interface/ispconfig/interface/sites/web_sites_stats.php @@ -0,0 +1,64 @@ +auth->check_module_permissions('sites'); + +$app->load('listform_actions'); + +class list_action extends listform_actions { + + function prepareDataRow($rec) + { + global $app; + + $rec = $app->listform->decode($rec); + + //* Alternating datarow colors + $this->DataRowColor = ($this->DataRowColor == '#FFFFFF') ? '#EEEEEE' : '#FFFFFF'; + $rec['bgcolor'] = $this->DataRowColor; + + //* Set the statistics colums + //** Traffic of the current month + $tmp_year = date('Y'); + $tmp_month = date('m'); + $tmp_rec = $app->db->queryOneRecord("SELECT SUM(traffic_bytes) as t FROM web_traffic WHERE hostname = '".$rec['domain']."' AND YEAR(traffic_date) = '$tmp_year' AND MONTH(traffic_date) = '$tmp_month'"); + $rec['this_month'] = number_format($tmp_rec['t']/1024/1024, 0, '.', ' '); + + //** Traffic of the current year + $tmp_rec = $app->db->queryOneRecord("SELECT sum(traffic_bytes) as t FROM web_traffic WHERE hostname = '".$rec['domain']."' AND YEAR(traffic_date) = '$tmp_year'"); + $rec['this_year'] = number_format($tmp_rec['t']/1024/1024, 0, '.', ' '); + + //** Traffic of the last month + $tmp_year = date('Y',mktime(0, 0, 0, date("m")-1, date("d"), date("Y"))); + $tmp_month = date('m',mktime(0, 0, 0, date("m")-1, date("d"), date("Y"))); + $tmp_rec = $app->db->queryOneRecord("SELECT sum(traffic_bytes) as t FROM web_traffic WHERE hostname = '".$rec['domain']."' AND YEAR(traffic_date) = '$tmp_year' AND MONTH(traffic_date) = '$tmp_month'"); + $rec['last_month'] = number_format($tmp_rec['t']/1024/1024, 0, '.', ' '); + + //** Traffic of the last year + $tmp_year = date('Y',mktime(0, 0, 0, date("m"), date("d"), date("Y")-1)); + $tmp_rec = $app->db->queryOneRecord("SELECT sum(traffic_bytes) as t FROM web_traffic WHERE hostname = '".$rec['domain']."' AND YEAR(traffic_date) = '$tmp_year'"); + $rec['last_year'] = number_format($tmp_rec['t']/1024/1024, 0, '.', ' '); + + //* The variable "id" contains always the index variable + $rec['id'] = $rec[$this->idx_key]; + return $rec; + } +} + +$list = new list_action; +$list->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/web_subdomain_del.php b/interface/ispconfig/interface/sites/web_subdomain_del.php new file mode 100644 index 0000000000000000000000000000000000000000..91b1662a52898ce18344cb0a461bb2a86c76847d --- /dev/null +++ b/interface/ispconfig/interface/sites/web_subdomain_del.php @@ -0,0 +1,51 @@ +auth->check_module_permissions('sites'); + +$app->uses("tform_actions"); +$app->tform_actions->onDelete(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/web_subdomain_edit.php b/interface/ispconfig/interface/sites/web_subdomain_edit.php new file mode 100644 index 0000000000000000000000000000000000000000..ec35a1bb8217d417d95f7df3f32d598aacea016a --- /dev/null +++ b/interface/ispconfig/interface/sites/web_subdomain_edit.php @@ -0,0 +1,114 @@ +auth->check_module_permissions('sites'); + +// Loading classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + var $parent_domain_record; + + function onShowNew() { + global $app, $conf; + + // we will check only users, not admins + if($_SESSION["s"]["user"]["typ"] == 'user') { + if(!$app->tform->checkClientLimit('limit_web_subdomain',"type = 'subdomain'")) { + $app->error($app->tform->wordbook["limit_web_subdomain_txt"]); + } + if(!$app->tform->checkResellerLimit('limit_web_subdomain',"type = 'subdomain'")) { + $app->error('Reseller: '.$app->tform->wordbook["limit_web_subdomain_txt"]); + } + } + + parent::onShowNew(); + } + + function onShowEnd() { + global $app, $conf; + + // Get the record of the parent domain + $parent_domain = $app->db->queryOneRecord("select * FROM web_domain WHERE domain_id = ".intval(@$this->dataRecord["parent_domain_id"])); + + // remove the parent domain part of the domain name before we show it in the text field. + $this->dataRecord["domain"] = str_replace('.'.$parent_domain["domain"],'',$this->dataRecord["domain"]); + $app->tpl->setVar("domain",$this->dataRecord["domain"]); + + parent::onShowEnd(); + + } + + function onSubmit() { + global $app, $conf; + + // Get the record of the parent domain + $parent_domain = $app->db->queryOneRecord("select * FROM web_domain WHERE domain_id = ".intval(@$this->dataRecord["parent_domain_id"])); + + // Set a few fixed values + $this->dataRecord["type"] = 'subdomain'; + $this->dataRecord["server_id"] = $parent_domain["server_id"]; + $this->dataRecord["domain"] = $this->dataRecord["domain"].'.'.$parent_domain["domain"]; + + $this->parent_domain_record = $parent_domain; + + parent::onSubmit(); + } + + function onAfterInsert() { + global $app, $conf; + + $app->db->query('UPDATE web_domain SET sys_groupid = '.intval($this->parent_domain_record['sys_groupid']).' WHERE domain_id = '.$this->id); + + } + + +} + +$page = new page_action; +$page->onLoad(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/web_subdomain_list.php b/interface/ispconfig/interface/sites/web_subdomain_list.php new file mode 100644 index 0000000000000000000000000000000000000000..224bba8dadde0b927ee48df215a421e4b4bc9227 --- /dev/null +++ b/interface/ispconfig/interface/sites/web_subdomain_list.php @@ -0,0 +1,55 @@ +auth->check_module_permissions('sites'); + +$app->uses('listform_actions'); + +// Limit the results to alias domains +$app->listform_actions->SQLExtWhere = "type = 'subdomain'"; + +$app->listform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/strengthmeter/lib/lang/bg_strengthmeter.lng b/interface/ispconfig/interface/strengthmeter/lib/lang/bg_strengthmeter.lng new file mode 100644 index 0000000000000000000000000000000000000000..6631f3ab0bae61df5851b6ff042e2d8a47614345 --- /dev/null +++ b/interface/ispconfig/interface/strengthmeter/lib/lang/bg_strengthmeter.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/strengthmeter/lib/lang/br_strengthmeter.lng b/interface/ispconfig/interface/strengthmeter/lib/lang/br_strengthmeter.lng new file mode 100644 index 0000000000000000000000000000000000000000..ba99f97684025ae1cd9ff7a4a9fc83823bbfc2a5 --- /dev/null +++ b/interface/ispconfig/interface/strengthmeter/lib/lang/br_strengthmeter.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/strengthmeter/lib/lang/de_strengthmeter.lng b/interface/ispconfig/interface/strengthmeter/lib/lang/de_strengthmeter.lng new file mode 100644 index 0000000000000000000000000000000000000000..52f10189e03885cde254069fd18602d0dba6b5c4 --- /dev/null +++ b/interface/ispconfig/interface/strengthmeter/lib/lang/de_strengthmeter.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/strengthmeter/lib/lang/en_strengthmeter.lng b/interface/ispconfig/interface/strengthmeter/lib/lang/en_strengthmeter.lng new file mode 100644 index 0000000000000000000000000000000000000000..2a6de41f1eb745718c3358e775e25d083c51070b --- /dev/null +++ b/interface/ispconfig/interface/strengthmeter/lib/lang/en_strengthmeter.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/strengthmeter/lib/lang/es_strengthmeter.lng b/interface/ispconfig/interface/strengthmeter/lib/lang/es_strengthmeter.lng new file mode 100644 index 0000000000000000000000000000000000000000..f0b4b7337d9b756628b032922e1ef9fcab245d84 --- /dev/null +++ b/interface/ispconfig/interface/strengthmeter/lib/lang/es_strengthmeter.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/strengthmeter/lib/lang/fi_strengthmeter.lng b/interface/ispconfig/interface/strengthmeter/lib/lang/fi_strengthmeter.lng new file mode 100644 index 0000000000000000000000000000000000000000..91456526143b0babf316a6230d71f7aeb160d8b9 --- /dev/null +++ b/interface/ispconfig/interface/strengthmeter/lib/lang/fi_strengthmeter.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/strengthmeter/lib/lang/fr_strengthmeter.lng b/interface/ispconfig/interface/strengthmeter/lib/lang/fr_strengthmeter.lng new file mode 100644 index 0000000000000000000000000000000000000000..23ac2bac6508a0d9cb07a0b1c647d0ee348fe10e --- /dev/null +++ b/interface/ispconfig/interface/strengthmeter/lib/lang/fr_strengthmeter.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/strengthmeter/lib/lang/hu_strengthmeter.lng b/interface/ispconfig/interface/strengthmeter/lib/lang/hu_strengthmeter.lng new file mode 100644 index 0000000000000000000000000000000000000000..41f7d98f4001a02c71c64e2e7f5deb5f01bcc80f --- /dev/null +++ b/interface/ispconfig/interface/strengthmeter/lib/lang/hu_strengthmeter.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/strengthmeter/lib/lang/it_strengthmeter.lng b/interface/ispconfig/interface/strengthmeter/lib/lang/it_strengthmeter.lng new file mode 100644 index 0000000000000000000000000000000000000000..3f2b615f75809e0ad79d3c54f68729f31852e522 --- /dev/null +++ b/interface/ispconfig/interface/strengthmeter/lib/lang/it_strengthmeter.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/strengthmeter/lib/lang/ja_strengthmeter.lng b/interface/ispconfig/interface/strengthmeter/lib/lang/ja_strengthmeter.lng new file mode 100644 index 0000000000000000000000000000000000000000..ddf1222f18fffb551ca71f68d75bfe1cc6cac551 --- /dev/null +++ b/interface/ispconfig/interface/strengthmeter/lib/lang/ja_strengthmeter.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/strengthmeter/lib/lang/nl_strengthmeter.lng b/interface/ispconfig/interface/strengthmeter/lib/lang/nl_strengthmeter.lng new file mode 100644 index 0000000000000000000000000000000000000000..57e86ca70cf7dd77d3eb314e27d5dd2de6e8ced6 --- /dev/null +++ b/interface/ispconfig/interface/strengthmeter/lib/lang/nl_strengthmeter.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/strengthmeter/lib/lang/pl_strengthmeter.lng b/interface/ispconfig/interface/strengthmeter/lib/lang/pl_strengthmeter.lng new file mode 100644 index 0000000000000000000000000000000000000000..df85c9712415acaa8c7d6fc19ad6700c23420566 --- /dev/null +++ b/interface/ispconfig/interface/strengthmeter/lib/lang/pl_strengthmeter.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/strengthmeter/lib/lang/ro_strengthmeter.lng b/interface/ispconfig/interface/strengthmeter/lib/lang/ro_strengthmeter.lng new file mode 100644 index 0000000000000000000000000000000000000000..27b9ab98b525b81b86af2f84c56fff5f2a778547 --- /dev/null +++ b/interface/ispconfig/interface/strengthmeter/lib/lang/ro_strengthmeter.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/strengthmeter/lib/lang/ru_strengthmeter.lng b/interface/ispconfig/interface/strengthmeter/lib/lang/ru_strengthmeter.lng new file mode 100644 index 0000000000000000000000000000000000000000..afe7d6e21596423e4b08c6538e1ad138f48a55d9 --- /dev/null +++ b/interface/ispconfig/interface/strengthmeter/lib/lang/ru_strengthmeter.lng @@ -0,0 +1,9 @@ + + diff --git a/interface/ispconfig/interface/strengthmeter/lib/lang/se_strengthmeter.lng b/interface/ispconfig/interface/strengthmeter/lib/lang/se_strengthmeter.lng new file mode 100644 index 0000000000000000000000000000000000000000..2a6de41f1eb745718c3358e775e25d083c51070b --- /dev/null +++ b/interface/ispconfig/interface/strengthmeter/lib/lang/se_strengthmeter.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/strengthmeter/lib/lang/sk_strengthmeter.lng b/interface/ispconfig/interface/strengthmeter/lib/lang/sk_strengthmeter.lng new file mode 100644 index 0000000000000000000000000000000000000000..5d5fb715891b8c14b8f0ad9b7c0b74c71038d098 --- /dev/null +++ b/interface/ispconfig/interface/strengthmeter/lib/lang/sk_strengthmeter.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/strengthmeter/lib/lang/tr_strengthmeter.lng b/interface/ispconfig/interface/strengthmeter/lib/lang/tr_strengthmeter.lng new file mode 100644 index 0000000000000000000000000000000000000000..f9e6cb2bbb88dc67fdf47fa7281b9a045a9791b8 --- /dev/null +++ b/interface/ispconfig/interface/strengthmeter/lib/lang/tr_strengthmeter.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/temp/en.lng b/interface/ispconfig/interface/temp/en.lng new file mode 100644 index 0000000000000000000000000000000000000000..5fdc07c91f2c2a9ee12cfc7672a2fe9054dc5674 --- /dev/null +++ b/interface/ispconfig/interface/temp/en.lng @@ -0,0 +1,2131 @@ +---|ISPConfig Language File|3.0.1.6|en +--|global|en|en.lng + + +--|admin|en|en.lng + +--|admin|en|en_firewall.lng + +--|admin|en|en_firewall_list.lng + +--|admin|en|en_groups.lng + +--|admin|en|en_groups_list.lng +WARNING:
    Do not edit or modify any user settings here. Use the Client- and Reseller settings in the Client module instead. Modifying or changing Users or groups here may cause data loss!'; +?> +--|admin|en|en_language_add.lng + +--|admin|en|en_language_complete.lng +This adds missing strings from the english master language files to the selected language.'; +$wb["language_select_txt"] = 'Select language'; +$wb['btn_save_txt'] = 'Merge files now'; +$wb['btn_cancel_txt'] = 'Back'; +?> +--|admin|en|en_language_edit.lng + + +--|admin|en|en_language_export.lng + +--|admin|en|en_language_import.lng + +--|admin|en|en_language_list.lng + + +--|admin|en|en_remote_user.lng + + +--|admin|en|en_remote_user_list.lng + + + +--|admin|en|en_server.lng + +--|admin|en|en_server_config.lng + +--|admin|en|en_server_config_list.lng + +--|admin|en|en_server_ip.lng + +--|admin|en|en_server_ip_list.lng + +--|admin|en|en_server_list.lng + +--|admin|en|en_software_package_list.lng + + +--|admin|en|en_software_repo.lng + +--|admin|en|en_software_repo_list.lng + +--|admin|en|en_software_update_list.lng + + +--|admin|en|en_system_config.lng + +--|admin|en|en_users.lng + + +--|admin|en|en_users_list.lng +WARNING:
    Do not edit or modify any user settings here. Use the Client- and Reseller settings in the Client module instead. Modifying or changing Users or groups here may cause data loss!'; +?> +--|client|en|en.lng + +--|client|en|en_client.lng + + +--|client|en|en_clients_list.lng + +--|client|en|en_client_template.lng + +--|client|en|en_client_template_list.lng + + +--|client|en|en_reseller.lng + 0'; +$wb["limit_web_quota_txt"] = 'Web Quota'; +?> + +--|client|en|en_resellers_list.lng + +--|designer|en|en.lng + +--|designer|en|en_form_edit.lng + +--|designer|en|en_form_list.lng + +--|designer|en|en_form_show.lng + +--|designer|en|en_module_edit.lng +Description +

    +Modulename: Name of the module directory. Only numbers, chars and underscore allowed.
    +Moduletitle: Will be shown in the (upper) main navigation.
    +Template file: Template file of the module. Currently available: module.tpl.htm and module_tree.tpl.htm. Default is module.tpl.htm.
    +NaviFrame: If module_tree.tpl.htm selected as template file, enter here the path to the script file for the left frame.
    +Default page: These page will be shown when the module is opened.
    +Tab width: Width of the Tabs in the main navigation. The field is empty by default. You can enter values absolute in pixel (e.g 20) or relative (e.g 20%).
    +Hint: All paths are relative to the directory "web". +'; + +?> +--|designer|en|en_module_list.lng + +--|designer|en|en_module_nav_edit.lng + +--|designer|en|en_module_nav_item_edit.lng + +--|designer|en|en_module_show.lng + +--|dns|en|en.lng + +--|dns|en|en_dns_a.lng + +--|dns|en|en_dns_aaaa.lng + +--|dns|en|en_dns_alias.lng + +--|dns|en|en_dns_a_list.lng + +--|dns|en|en_dns_cname.lng + +--|dns|en|en_dns_hinfo.lng + +--|dns|en|en_dns_mx.lng + +--|dns|en|en_dns_ns.lng + +--|dns|en|en_dns_ptr.lng + +--|dns|en|en_dns_rp.lng + +--|dns|en|en_dns_soa.lng +these IPs (comma separated list)'; +$wb["active_txt"] = 'Active'; +$wb["limit_dns_zone_txt"] = 'The max. number of DNS zones for your account is reached.'; +$wb["client_txt"] = 'Client'; +$wb["no_zone_perm"] = 'You do not have the permission to add a record to this DNS zone.'; +$wb["server_id_error_empty"] = 'No server selected'; +$wb["origin_error_empty"] = 'Zone empty.'; +$wb["origin_error_unique"] = 'There is already a record for this zone.'; +$wb["origin_error_regex"] = 'Zone has a invalid format.'; +$wb["ns_error_regex"] = 'NS has a invalid format.'; +$wb["mbox_error_empty"] = 'Email is empty.'; +$wb["mbox_error_regex"] = 'Email format invalid.'; +$wb["also_notify_txt"] = 'Also Notify'; +$wb["update_acl_txt"] = 'Update ACL'; +?> +--|dns|en|en_dns_soa_list.lng + +--|dns|en|en_dns_srv.lng + +--|dns|en|en_dns_template.lng + +--|dns|en|en_dns_template_list.lng + +--|dns|en|en_dns_txt.lng + +--|dns|en|en_dns_wizard.lng + +--|help|en|en.lng + + +--|help|en|en_support_message.lng + + +--|help|en|en_support_message_list.lng + +--|login|en|en.lng + 64 characters.'; + +$wb['username_txt'] = "Username"; +$wb['password_txt'] = "Password"; +$wb['login_button_txt'] = "Login"; + +?> +--|mail|en|en.lng + +--|mail|en|en_mail_alias.lng + +--|mail|en|en_mail_aliasdomain.lng + +--|mail|en|en_mail_aliasdomain_list.lng + +--|mail|en|en_mail_alias_list.lng + +--|mail|en|en_mail_blacklist.lng + +--|mail|en|en_mail_blacklist_list.lng + +--|mail|en|en_mail_content_filter.lng + +--|mail|en|en_mail_content_filter_list.lng + +--|mail|en|en_mail_domain.lng + +--|mail|en|en_mail_domain_catchall.lng + +--|mail|en|en_mail_domain_catchall_list.lng + +--|mail|en|en_mail_domain_list.lng + +--|mail|en|en_mail_forward.lng + +--|mail|en|en_mail_forward_list.lng + +--|mail|en|en_mail_get.lng + +--|mail|en|en_mail_get_list.lng + +--|mail|en|en_mail_relay_recipient.lng + +--|mail|en|en_mail_relay_recipient_list.lng + +--|mail|en|en_mail_spamfilter.lng + +--|mail|en|en_mail_spamfilter_list.lng + +--|mail|en|en_mail_transport.lng + +--|mail|en|en_mail_transport_list.lng + +--|mail|en|en_mail_user.lng + 1'; +$wb["move_junk_txt"] = 'Move Spam Emails to Junk directory'; +?> + +--|mail|en|en_mail_user_filter.lng + +--|mail|en|en_mail_user_filter_list.lng + +--|mail|en|en_mail_user_list.lng + +--|mail|en|en_mail_user_stats_list.lng + +--|mail|en|en_mail_whitelist.lng + +--|mail|en|en_mail_whitelist_list.lng + +--|mail|en|en_spamfilter_blacklist.lng + +--|mail|en|en_spamfilter_blacklist_list.lng + +--|mail|en|en_spamfilter_config.lng + +--|mail|en|en_spamfilter_config_list.lng + +--|mail|en|en_spamfilter_policy.lng + +--|mail|en|en_spamfilter_policy_list.lng + +--|mail|en|en_spamfilter_users.lng + +--|mail|en|en_spamfilter_users_list.lng + +--|mail|en|en_spamfilter_whitelist.lng + +--|mail|en|en_spamfilter_whitelist_list.lng + +--|monitor|en|en.lng + + +--|monitor|en|en_datalog_list.lng + +--|monitor|en|en_syslog_list.lng + +--|sites|en|en.lng + +--|sites|en|en_cron.lng + +--|sites|en|en_cron_list.lng + +--|sites|en|en_database.lng +any)'; +$wb["database_remote_error_ips"] = 'At least one of the entered ip addresses is invalid.'; +$wb["client_txt"] = 'Client'; +$wb["active_txt"] = 'Active'; +$wb["database_name_error_empty"] = 'Database name is empty.'; +$wb["database_name_error_unique"] = 'There is already a database with this name on the server. To get a unique name, e.g. prepend your domain name to the database name.'; +$wb["database_name_error_regex"] = 'Invalid database name. The database name may contain these characters: a-z, A-Z, 0-9 and the underscore. Length: 2 - 64 characters.'; +$wb["database_user_error_empty"] = 'Database user is empty.'; +$wb["database_user_error_unique"] = 'There is already a database user with this name on the server. To get a unique name, e.g. prepend your domain name to the username.'; +$wb["database_user_error_regex"] = 'Invalid database user name. The username may contain these characters: a-z, A-Z, 0-9 and the underscore. Length: 2 - 64 characters.'; +$wb["limit_database_txt"] = 'The max. number of databases is reached.'; +$wb["database_name_change_txt"] = 'The database name can not be changed'; +$wb["database_charset_change_txt"] = 'The database charset can not be changed'; +$wb["database_name_error_len"] = 'Database name - {db} - too long. The max. database name length incl. prefix is 64 chars.'; +$wb["database_user_error_len"] = 'Database username - {user}- too long. The max. database username length incl. prefix is 16 chars.'; +?> + +--|sites|en|en_database_list.lng + +--|sites|en|en_ftp_user.lng + + +--|sites|en|en_ftp_user_list.lng + +--|sites|en|en_shell_user.lng + + +--|sites|en|en_shell_user_list.lng + +--|sites|en|en_web_aliasdomain_list.lng + +--|sites|en|en_web_domain.lng + + +--|sites|en|en_web_domain_list.lng + +--|sites|en|en_web_sites_stats_list.lng + +--|sites|en|en_web_subdomain.lng + +--|sites|en|en_web_subdomain_list.lng + +--|strengthmeter|en|en_strengthmeter.lng + + +--|tools|en|en.lng + +--|tools|en|en_usersettings.lng + + +---|EOF diff --git a/interface/ispconfig/interface/themes/default/css/central.css b/interface/ispconfig/interface/themes/default/css/central.css new file mode 100644 index 0000000000000000000000000000000000000000..e9268d5bff28d66317795a84f7232f6c8aa590eb --- /dev/null +++ b/interface/ispconfig/interface/themes/default/css/central.css @@ -0,0 +1,32 @@ +@charset "UTF-8"; +/** + * "Yet Another Multicolumn Layout" - (X)HTML/CSS Framework + * + * (en) central stylesheet - ISPConfig 3: default theme + * (de) Zentrales Stylesheet - ISPConfig 3: default theme + * + * @copyright Copyright 2005-2008, Dirk Jesse + * @license CC-A 2.0 (http://creativecommons.org/licenses/by/2.0/), + * YAML-C (http://www.yaml.de/en/license/license-conditions.html) + * @link http://www.yaml.de + * @package yaml + * @version 3.0.6 + * @revision $Revision: 202 $ + * @lastmodified $Date: 2008-06-07 14:29:18 +0200 (Sa, 07 Jun 2008) $ + */ + +/* import core styles | Basis-Stylesheets einbinden */ +@import url(../yaml/core/base.css); + +/* import screen layout | Screen-Layout einbinden */ +@import url(navigation/nav_top.css); +@import url(navigation/nav_side.css); +@import url(screen/basemod.css); +@import url(screen/basemod_2col_left_seo.css); +@import url(screen/content.css); +@import url(screen/uni-form-generic.css); +@import url(screen/uni-form.css); +@import url(screen/content_ispc.css); + +/* import print layout | Druck-Layout einbinden */ +@import url(print/print_100.css); diff --git a/interface/ispconfig/interface/themes/default/css/navigation/nav_side.css b/interface/ispconfig/interface/themes/default/css/navigation/nav_side.css new file mode 100644 index 0000000000000000000000000000000000000000..f652917b5351491373e37a2c74688575c8d13fe9 --- /dev/null +++ b/interface/ispconfig/interface/themes/default/css/navigation/nav_side.css @@ -0,0 +1,125 @@ +@charset "UTF-8"; +/** + * "Yet Another Multicolumn Layout" - (X)HTML/CSS Framework + * + * (en) Vertical list navigation "vlist" - ISPConfig 3: default theme + * (de) Vertikale Navigationsliste "vlist" - ISPConfig 3: default theme + * + * @copyright Copyright 2005-2008, Dirk Jesse + * @license CC-A 2.0 (http://creativecommons.org/licenses/by/2.0/), + * YAML-C (http://www.yaml.de/en/license/license-conditions.html) + * @link http://www.yaml.de + * @package yaml + * @version 3.0.6 + * @revision $Revision: 202 $ + * @lastmodified $Date: 2008-06-07 14:29:18 +0200 (Sa, 07 Jun 2008) $ + */ + +@media all +{ + #submenu { + width: 100%; + overflow: hidden; + margin: 0px; + list-style-type: none; + border-bottom: 2px #ddd solid; + } + + #submenu ul { list-style-type: none; margin:0; padding: 0; } + #submenu li { float:left; width: 100%; margin:0; padding: 0; font-size:0.9em; } + + #submenu a, + #submenu strong { + display:block; + width: 90%; + padding: 2px 0px 2px 10%; + text-decoration: none; + background-color:#fff; + color: #444; + border-bottom: 1px #eee solid; + } + + /* Menu Title */ + #submenu li#title { + width: 100%; + padding: 0px; + font-weight: bold; + color: #444; + background-color: #fff; + border-top: 2px #888 solid; + font-size: 1.1em; + } + + #submenu li#title a { + background-color: #f0f8ff; + color: #444; + } + #submenu li#title a:hover { + color: #f63; + } + + #submenu li span { + display:block; + width: 90%; + padding: 3px 0px 3px 10%; + font-weight: bold; + border-bottom: 1px #ddd solid; + } + + /* Level 1 */ + #submenu li#active, + #submenu li strong { + width: 90%; + padding: 3px 0px 3px 10%; + font-weight: bold; + color: #fff; + background-color:#aab; + border-bottom: 1px #eee solid; + } + + #submenu li a { width: 90%; padding-left: 10%; background-color:#fff; color: #444; } + #submenu li a:focus, + #submenu li a:hover, + #submenu li a:active { background-color:#f63; color: #fff; } + + /* Level 2 */ + #submenu li ul li a, + #submenu li ul li#active, + #submenu li ul li strong, + #submenu li ul li span { width: 80%; padding-left: 20%; } + + #submenu li ul li a { background-color:#f8f8f8; color: #666; } + #submenu li ul li a:focus, + #submenu li ul li a:hover, + #submenu li ul li a:active { background-color:#f63; color: #fff; } + + /* Level 3 */ + #submenu li ul li ul li a, + #submenu li ul li ul li#active, + #submenu li ul li ul li strong, + #submenu li ul li ul li span { width: 70%; padding-left: 30%; } + + #submenu li ul li ul li a { background-color:#fcfcfc; color: #888; } + #submenu li ul li ul li a:focus, + #submenu li ul li ul li a:hover, + #submenu li ul li ul li a:active { background-color:#f63; color: #fff; } + + /* Level 4 */ + #submenu li ul li ul li ul li a, + #submenu li ul li ul li ul li#active, + #submenu li ul li ul li ul li strong, + #submenu li ul li ul li ul li span { width: 60%; padding-left: 40%; } + + #submenu li ul li ul li ul li a { background-color:#ffffff; color: #aaa; } + #submenu li ul li ul li ul li a:focus, + #submenu li ul li ul li ul li a:hover, + #submenu li ul li ul li ul li a:active { background-color:#f63; color: #fff; } + + /* Form-Elements in the Menu*/ + #submenu * select#server_id { + margin: 3px 10%; + padding: 1px; + width: 80%; + } + +} \ No newline at end of file diff --git a/interface/ispconfig/interface/themes/default/css/navigation/nav_top.css b/interface/ispconfig/interface/themes/default/css/navigation/nav_top.css new file mode 100644 index 0000000000000000000000000000000000000000..8d2f2c6a037999610ca34e3cf0b8f0a673a9ab39 --- /dev/null +++ b/interface/ispconfig/interface/themes/default/css/navigation/nav_top.css @@ -0,0 +1,52 @@ +@charset "UTF-8"; +/** + * "Yet Another Multicolumn Layout" - (X)HTML/CSS Framework + * + * (en) Horizontal list navigation - ISPConfig 3: default theme + * (de) Horizontale Navigationsliste - ISPConfig 3: default theme + * + * @copyright Copyright 2005-2008, Dirk Jesse + * @license CC-A 2.0 (http://creativecommons.org/licenses/by/2.0/), + * YAML-C (http://www.yaml.de/en/license/license-conditions.html) + * @link http://www.yaml.de + * @package yaml + * @version 3.0.6 + * @revision $Revision: 202 $ + * @lastmodified $Date: 2008-06-07 14:29:18 +0200 (Sa, 07 Jun 2008) $ + */ + +@media all +{ + #topNav ul { + list-style: none; + padding: 0; + margin: 0; + } + + #topNav li { + display: inline; + margin: 0 2px 0 0; + } + + #topNav a { + padding: 0 1.5em; + text-decoration: none; + color: black; + background: #d3d3d3; + } + + #topNav a:hover { + background: #fc0; + color: #540; + } + + #topNav #topNav_current { + } + + #topNav #topNav_current a { + padding-bottom: 2px; + font-weight: bold; + color: #ff6600; + background: #ffffff; + } +} \ No newline at end of file diff --git a/interface/ispconfig/interface/themes/default/css/patches/central.css b/interface/ispconfig/interface/themes/default/css/patches/central.css new file mode 100644 index 0000000000000000000000000000000000000000..3ed00400bf9b07d1f7d5367e364cc7d94f1c83d3 --- /dev/null +++ b/interface/ispconfig/interface/themes/default/css/patches/central.css @@ -0,0 +1,37 @@ +@charset "UTF-8"; +/** + * "Yet Another Multicolumn Layout" - (X)HTML/CSS Framework + * + * (en) IE-Patch stylesheet - ISPConfig 3: default theme + * (de) IE-Korrektur-Stylesheet - ISPConfig 3: default theme + * + * @copyright Copyright 2005-2008, Dirk Jesse + * @license CC-A 2.0 (http://creativecommons.org/licenses/by/2.0/), + * YAML-C (http://www.yaml.de/en/license/license-conditions.html) + * @link http://www.yaml.de + * @package yaml + * @version 3.0.6 + * @revision $Revision: 202 $ + * @lastmodified $Date: 2008-06-07 14:29:18 +0200 (Sa, 07 Jun 2008) $ + */ + +/* Layout-independent adjustments | Layout-unabhängige Anpassungen ----------------------------------- */ +@import url(../yaml/core/iehacks.css); + +/* Layout-dependent adjustments | Layout-abhängige Anpassungen --------------------------------------- */ +@media screen, projection +{ + /** + * min-width/max-width workaround for IE5.x & IE6 + * + * @workaround + * @affected IE 5.x/Win, IE6 + * @css-for IE 5.x/Win, IE6 + * @valid no + */ + + * html #page_margins { + /* Fallback if JavaScript is disabled */ + width: 80%; + } +} diff --git a/interface/ispconfig/interface/themes/default/css/print/print_100.css b/interface/ispconfig/interface/themes/default/css/print/print_100.css new file mode 100644 index 0000000000000000000000000000000000000000..94315a8af53e562c4fad8bbc0c9719b1929778f1 --- /dev/null +++ b/interface/ispconfig/interface/themes/default/css/print/print_100.css @@ -0,0 +1,31 @@ +@charset "UTF-8"; +/** + * "Yet Another Multicolumn Layout" - (X)HTML/CSS Framework + * + * (en) print stylesheet - ISPConfig 3: default theme + * (de) Druck-Stylesheet - ISPConfig 3: default theme + * + * @copyright Copyright 2005-2008, Dirk Jesse + * @license CC-A 2.0 (http://creativecommons.org/licenses/by/2.0/), + * YAML-C (http://www.yaml.de/en/license/license-conditions.html) + * @link http://www.yaml.de + * @package yaml + * @version 3.0.6 + * @revision $Revision: 202 $ + * @lastmodified $Date: 2008-06-07 14:29:18 +0200 (Sa, 07 Jun 2008) $ + */ + +/* import print base styles | Basisformatierung für Drucklayout einbinden */ +@import url(../../yaml/core/print_base.css); + +/* #col1 - x +** #col2 - 0 +** #col3 - 0 +*/ +@media print +{ + #col1, #col1_content { float:none; width: 100%; margin: 0; padding: 0; border: 0; } + + #col2 { display:none; } + #col3 { display:none; } +} diff --git a/interface/ispconfig/interface/themes/default/css/screen/basemod.css b/interface/ispconfig/interface/themes/default/css/screen/basemod.css new file mode 100644 index 0000000000000000000000000000000000000000..60f83712babfb144c75bc033729909ee6f5fc717 --- /dev/null +++ b/interface/ispconfig/interface/themes/default/css/screen/basemod.css @@ -0,0 +1,118 @@ +@charset "UTF-8"; +/** + * "Yet Another Multicolumn Layout" - (X)HTML/CSS Framework + * + * (en) Screen layout for YAML - ISPConfig 3: default theme + * (de) Bildschirmlayout fr YAML - ISPConfig 3: default theme + * + * @copyright Copyright 2005-2008, Dirk Jesse + * @license CC-A 2.0 (http://creativecommons.org/licenses/by/2.0/), + * YAML-C (http://www.yaml.de/en/license/license-conditions.html) + * @link http://www.yaml.de + * @package yaml + * @version 3.0.6 + * @revision $Revision: 202 $ + * @lastmodified $Date: 2008-06-07 14:29:18 +0200 (Sa, 07 Jun 2008) $ + */ + +@media screen, projection +{ + /*------------------------------------------------------------------------------------------------------*/ + + /** + * (en) Formatting YAML's basic layout elements + * (de) Gestaltung des YAML Basis-Layouts + */ + + /* (en) Marginal areas & page background */ + /* (de) Randbereiche & Seitenhintergrund */ + body { background: #EEEEEE url("../../images/screen_bg.png") repeat-x top left fixed; padding: 10px 0; } + + /* (en) Centering layout in old IE-versions */ + /* (de) Zentrierung des Layouts in alten IE-versionen */ + body { text-align: center; } + #page_margins { text-align:left; margin: 0 auto; } + + /* (en) Layout: width, background, borders */ + /* (de) Layout: Breite, Hintergrund, Rahmen */ + /*#page_margins { min-width: 980px; max-width: 80%; background: #fff;}*/ + /* #page_margins { min-width: 980px; max-width: 80%; background: #fff; display: inline-block;}*/ + #page_margins { min-width: 980px; max-width: 80%; background: #fff; display: table;} + #page{ padding: 10px; } + + /* (en) Designing main layout elements */ + /* (de) Gestaltung der Hauptelemente des Layouts */ + #header { + color: #faf0e6; + padding: 15px 2em 1em 20px; + background: #9a9a9a url(../../images/header_bg.png) repeat-x top left; + } + + /* (en) Text Alignment for #topnav content */ + /* (de) Textausrichtung für #topnav Inhalte */ + #topnav { text-align: left; } + + /* (en) Absolute positioning only within #header */ + /* (de) Absolute Positionierung erfolgt nur innerhalb von #header */ + #header #topnav { + position: absolute; + top: 0px; + left: 0px; + } + + /* (en) Text Alignment for #topnav content */ + /* (de) Textausrichtung für #topnav Inhalte */ + #topsubnav { text-align: right; } + + /* (en) Absolute positioning only within #header */ + /* (de) Absolute Positionierung erfolgt nur innerhalb von #header */ + #header #topsubnav { + position:absolute; + top: 10px; + right: 10px; + } + + /* (en) adjustment of main navigation */ + /* (de) Anpassung der Hauptnavigation */ + #nav ul { margin-left: 200px; } + #nav_main { background: #9a9a9a repeat-x top left; } + + #main { background: #fff;padding:10px 0; } + + #footer { + color:#666; + background: #f9f9f9; + padding: 10px 20px; + border-top: 5px #efefef solid; + font-size: 0.8em; + text-align: center; + } + + /*------------------------------------------------------------------------------------------------------*/ + + /** + * (en) Formatting content container + * (de) Formatierung der Inhalts-Container + * + * |-------------------------------| + * | #header | + * |-------------------------------| + * | #col1 | #col3 | #col2 | + * | 25% | flexible | 25% | + * |-------------------------------| + * | #footer | + * |-------------------------------| + */ + + + #col1 { width: 25%; } + #col1_content { padding: 10px 10px 10px 20px; } + + #col2 { width: 25%; } + #col2_content { padding: 10px 20px 10px 10px; } + + #col3 { margin: 0 25%; } + #col3_content { padding: 10px; } + + /*------------------------------------------------------------------------------------------------------*/ +} diff --git a/interface/ispconfig/interface/themes/default/css/screen/basemod_2col_left_seo.css b/interface/ispconfig/interface/themes/default/css/screen/basemod_2col_left_seo.css new file mode 100644 index 0000000000000000000000000000000000000000..525204b23963105c1b970e1ed03a3938d45e75ae --- /dev/null +++ b/interface/ispconfig/interface/themes/default/css/screen/basemod_2col_left_seo.css @@ -0,0 +1,48 @@ +@charset "UTF-8"; +/** + * "Yet Another Multicolumn Layout" - (X)HTML/CSS Framework + * + * (en) Variation of screen layout (basemod.css) - ISPConfig 3: default theme + * (de) Variation des Screenlayouts (basemod.css) - ISPConfig 3: default theme + * + * @copyright Copyright 2005-2008, Dirk Jesse + * @license CC-A 2.0 (http://creativecommons.org/licenses/by/2.0/), + * YAML-C (http://www.yaml.de/en/license/license-conditions.html) + * @link http://www.yaml.de + * @package yaml + * @version 3.0.6 + * @revision $Revision: 202 $ + * @lastmodified $Date: 2008-06-07 14:29:18 +0200 (Sa, 07 Jun 2008) $ + */ + +@media screen, projection +{ + /** + * (en) Repositioning content container + * (de) Neupositionierung der Content Container + * + * |-------------------------------| + * | #header | + * |-------------------------------| + * | #col1 | #col3 | + * | 200px | flexible | + * |-------------------------------| + * | #footer | + * |-------------------------------| + */ + + /* #col1 becomes the fixed navigation column | #col1 wird zur Navigationsspalte mit fester Breite */ + #col1 { width: 200px; float:left} + #col1_content { padding: 0 10px 0 0; } + + /* #col2 is turned off | #col2 abschalten */ + #col2 { display:none; } + + /* #col3 becomes the main column | #col3 wird zur Hauptspalte */ + #col3 { margin-left: 200px; margin-right: 0; } + #col3_content { padding: 0px 10px 10px 20px; } + + /* Graphic-free column dividers between #col1 and #col3 | Grafikfreier Spaltentrenner zw. #col1 und #col3*/ + #col3 {border-left: 1px #ddd solid;} + #main {padding: 1em 0} +} diff --git a/interface/ispconfig/interface/themes/default/css/screen/content.css b/interface/ispconfig/interface/themes/default/css/screen/content.css new file mode 100644 index 0000000000000000000000000000000000000000..ad5a0d2b6bf3b90df7398c612b348a558a7b79ee --- /dev/null +++ b/interface/ispconfig/interface/themes/default/css/screen/content.css @@ -0,0 +1,188 @@ +@charset "UTF-8"; +/** + * "Yet Another Multicolumn Layout" - (X)HTML/CSS Framework + * + * (en) Uniform design of standard content elements - ISPConfig 3: default theme + * (de) Einheitliche Standardformatierungen fr die wichtigten Inhalts-Elemente - ISPConfig 3: default theme + * + * @copyright Copyright 2005-2008, Dirk Jesse + * @license CC-A 2.0 (http://creativecommons.org/licenses/by/2.0/), + * YAML-C (http://www.yaml.de/en/license/license-conditions.html) + * @link http://www.yaml.de + * @package yaml + * @version 3.0.6 + * @revision $Revision: 202 $ + * @lastmodified $Date: 2008-06-07 14:29:18 +0200 (Sa, 07 Jun 2008) $ + * @appdef yaml + */ + +@media all +{ + /** + * Fonts + * (en) font-family and font-size selection for headings and standard text elements + * (de) Zeichensatz und Schriftgrößen für Überschriften und übliche Text-Elemente + * + * @section content-fonts + */ + + /* (en) reset font size for all elements to standard (16 Pixel) */ + /* (de) Alle Schriftgrößen auf Standardgröße (16 Pixel) zurücksetzen */ + html * { font-size: 100.01% } + + /* (en) reset monospaced elements to font size 16px in Gecko browsers */ + /* (de) Schriftgröße von monospaced Elemente auf 16 Pixel setzen */ + textarea, pre, tt, code { + font-family: Consolas,"Lucida Console","Courier New",monospace; + font-size: 0.9em; + } + + /* (en) base layout gets standard font size 12px */ + /* (de) Basis-Layout erhält Standardschriftgröße von 12 Pixeln */ + body { + font-family: 'Trebuchet MS', sans-serif; + font-size: 75.00%; + color: #444; + } + + h1,h2,h3,h4,h5,h6 { + font-family: 'Trebuchet MS', sans-serif; + font-weight:bold; + color:#666; + margin: 0 0 0.25em 0; + } + + h1 { font-size: 200% } /* 24px */ + h2 { font-size: 200% } /* 24px */ + h3 { font-size: 150% } /* 18px */ + h4 { font-size: 133.33% } /* 16px */ + h5 { font-size: 116.67% } /* 14px */ + h6 { font-size: 116.67%; font-style:italic } /* 14px */ + + #header h1 { + font-size:2.5em; + letter-spacing:-2px; + line-height:65%; + color: silver; + } + + #header span { + color:#333333; + } + + p { line-height: 1.5em; margin: 0 0 1em 0; } + + /* ### Lists | Listen #### */ + + ul, ol, dl { line-height: 1.5em; margin: 0 0 1em 1em } + li { margin-left: 1.5em; line-height: 1.5em } + + dt { font-weight: bold } + dd { margin: 0 0 1em 2em } + + /* ### text formatting | Textauszeichnung ### */ + + cite, blockquote { font-style:italic } + blockquote { margin: 0 0 1em 1.5em } + + strong,b { font-weight: bold } + em,i { font-style:italic } + + pre, code { font-family: monospace; font-size: 1.1em; } + + acronym, abbr { + letter-spacing: .07em; + border-bottom: .1em dashed #c00; + cursor: help; + } + + /** + * Generic Content Classes + * (en) standard classes for positioning and highlighting + * (de) Standardklassen zur Positionierung und Hervorhebung + * + * @section content-generic-classes + */ + + .note {background: #dfd; padding: 1em; border-top: 1px #bdb dotted; border-bottom: 1px #bdb dotted;} + .important {background: #ffd; padding: 1em; border-top: 1px #ddb dotted; border-bottom: 1px #ddb dotted;} + .warning {background: #fdd; padding: 1em; border-top: 1px #dbb dotted; border-bottom: 1px #dbb dotted;} + + .float_left { float: left; display:inline; margin-right: 1em; margin-bottom: 0.15em; } + .float_right { float: right; display:inline; margin-left: 1em; margin-bottom: 0.15em; } + .center { text-align:center; margin: 0.5em auto } + + /** + * External Links + * + * (en) Formatting of hyperlinks + * (de) Gestaltung von Hyperlinks + * + */ + + a {color: #4D87C7; text-decoration:none;} + a:focus, + a:hover, + a:active {color:#182E7A; text-decoration:underline;} + + #topsubnav a { color: #f0f8ff; font-weight: normal; background:transparent; text-decoration:none; } + #topsubnav a:focus, + #topsubnav a:hover, + #topsubnav a:active { text-decoration:underline; background-color: transparent;} + + #footer a { color: #999; background:transparent; font-weight: bold;} + #footer a:focus, + #footer a:hover, + #footer a:active {color: #4D87C7; background-color: transparent; text-decoration:underline;} + + /** + * (en) Emphasizing external Hyperlinks via CSS + * (de) Hervorhebung externer Hyperlinks mit CSS + * + * @section content-external-links + * @app-yaml-default disabled + */ + + /* + #main a[href^="http://www.my-domain.com"], + #main a[href^="https://www.my-domain.com"] + { + padding-left: 12px; + background-image: url('your_image.gif'); + background-repeat: no-repeat; + background-position: 0 0.45em; + } + */ + + /** + * Tables | Tabellen + * (en) Generic classes for table-width and design definition + * (de) Generische Klassen für die Tabellenbreite und Gestaltungsvorschriften für Tabellen + * + * @section content-tables + */ + + table { width: auto; border-collapse:collapse; margin-bottom: 0.5em; } + table.full { width: 100%; } + table.fixed { table-layout:fixed } + + th,td { padding: 0.5em; } + thead th { background: #444 url(../../images/lists_thead_bg.png) repeat-x; color: #fff } + tbody th { background: #ccc; color: #333 } + tbody th.sub { background: #ddd; color: #333 } + + /** + * Miscellaneous | Sonstiges + * + * @section content-misc + */ + + hr { + color: #fff; + background:transparent; + margin: 0 0 0.5em 0; + padding: 0 0 0.5em 0; + border:0; + border-bottom: 1px #eee solid; + } +} diff --git a/interface/ispconfig/interface/themes/default/css/screen/content_ispc.css b/interface/ispconfig/interface/themes/default/css/screen/content_ispc.css new file mode 100644 index 0000000000000000000000000000000000000000..46da666efc57424889e5f4520a1fd10b066bf47f --- /dev/null +++ b/interface/ispconfig/interface/themes/default/css/screen/content_ispc.css @@ -0,0 +1,822 @@ +@charset "UTF-8"; +/** + * "Yet Another Multicolumn Layout" - (X)HTML/CSS Framework + * + * (en) Uniform design of ISPConfig elements - ISPConfig 3: default theme + * (de) Einheitliche Standardformatierungen f�r ISPConfig-Elemente - ISPConfig 3: default theme + * + * @copyright Copyright 2005-2008, Dirk Jesse + * @license CC-A 2.0 (http://creativecommons.org/licenses/by/2.0/), + * YAML-C (http://www.yaml.de/en/license/license-conditions.html) + * @link http://www.yaml.de + * @package yaml + * @version 3.0.6 + * @revision $Revision: 202 $ + * @lastmodified $Date: 2008-06-07 14:29:18 +0200 (Sa, 07 Jun 2008) $ + * @appdef yaml + */ + +@media all +{ + .pageForm_description { + font-size: 12px; + } + + /* Tab-Box */ + .tabbox_tabs { + border-bottom: 1px solid #d3d3d3; + } + .tabbox_tabs ul { + list-style: none; + padding: 0; + margin: 0; + } + .tabbox_tabs li { + display: inline; + margin: 0 2px 0 0; + } + .tabbox_tabs a { + padding: 0 1em; + text-decoration: none; + color: black; + background: #d3d3d3; + border: 1px solid #d3d3d3; + } + .tabbox_tabs a:hover { + background: #fc0; + color: #540; + } + .tabbox_tabs .active a { + font-weight: bold; + color: #ff6600; + background: #ffffff; + } + + .pnl_toolsarea fieldset, .pnl_listarea fieldset, .pnl_formsarea fieldset { + border-color: #6299c5 -moz-use-text-color -moz-use-text-color; + border-style: solid none none; + border-width: 1px medium medium; + margin: 20px 0; + } + .pnl_toolsarea fieldset legend , .pnl_listarea fieldset legend { + font-weight: bold; + color: #6299c5; + } + .pnl_formarea fieldset { + font-weight: bold; + } + + /* hide line and legend when inside tabbed content */ + #tabbox_content * .pnl_toolsarea fieldset, #tabbox_content * .pnl_listarea fieldset, #tabbox_content * .pnl_formsarea fieldset { border: none !important; } + #tabbox_content * .pnl_toolsarea fieldset legend, #tabbox_content * .pnl_listarea fieldset legend, #tabbox_content * .pnl_formsarea fieldset legend { display: none !important; } + + .codeview { + margin:20px 0; + padding:2px; + border: 1px solid #ffcc00; + background: #fffaea; + font-family: Consolas, "Lucida Console", "Courier New", monospace; + font-size: 0.9em; + } + + /* Lists */ + table.list { + width: 100%; + border: 1px solid #d3d3d3 !important; + } + table.list thead th { font-size: 10px; } + table.list tbody { border: 1px solid #d3d3d3 !important; } + table.list tfoot td { text-align: center; background: #f8f8f8 url(../../images/lists_tfoot_bg.png) repeat-x bottom left; padding: 24px 8px 8px 8px; } + table.list .tbl_row_even { background: #fcfcfc; } + table.list .tbl_row_uneven { background: #f0f8ff; } + table.list tr:hover { background: #fffacd; } + + /* Password Strength */ + #passBar { + width: 101px; height: 10px; + background: url(../../images/meter_bg.gif) repeat-x bottom left; + margin: 2px 0; + float: left; + } + #passText { + padding: 0; + float: left; + } + + /* Systemmonitor */ + .systemmonitor-state { + margin: 10px 0; + font-family: Consolas, "Lucida Console", "Courier New", monospace; + font-size: 0.9em; + } + .systemmonitor-state.state-no_state { + border-top: 4px solid #95A19F; + background-color: #f8f8ff; + } + .systemmonitor-state.state-unknown { + border-top: 4px solid #30302e; + background-color: #cecfc5; + } + .systemmonitor-state.state-ok { + border-top: 4px solid #23fb00; + background-color: #adffa2; + } + .systemmonitor-state.state-info { + border-top: 4px solid #fdff00; + background-color: #fdffa2; + } + .systemmonitor-state.state-warning { + border-top: 4px solid #ffa800; + background-color: #ffda93; + } + .systemmonitor-state.state-critical { + border-top: 4px solid #ff0000; + background-color: #ffb9b9; + } + .systemmonitor-state.state-error { + border-top: 4px solid #ff0000; + background-color: #ff7f7f; + } + + .systemmonitor-device { + background-repeat: no-repeat; + background-position: 12px 4px; + min-height: 80px; + } + .systemmonitor-device.device-system { background-image: url("../../icons/x64/network.png"); } + .systemmonitor-device.device-server { background-image: url("../../icons/x64/server.png"); } + + .systemmonitor-content.icons32 { + padding:2px 10px 2px 80px; + background-repeat: no-repeat; + background-position: 12px 4px; + } + .systemmonitor-content.icons32.ico-no_state { /*background-image:url("../../icons/x32/state_no.png"); */ } + .systemmonitor-content.icons32.ico-unknown { background-image:url("../../icons/x32/state_unknown.png"); } + .systemmonitor-content.icons32.ico-ok { background-image:url("../../icons/x32/state_ok.png"); } + .systemmonitor-content.icons32.ico-info { background-image:url("../../icons/x32/state_info.png"); } + .systemmonitor-content.icons32.ico-warning { background-image:url("../../icons/x32/state_warning.png"); } + .systemmonitor-content.icons32.ico-critical { background-image:url("../../icons/x32/state_critical.png"); } + .systemmonitor-content.icons32.ico-error { background-image:url("../../icons/x32/state_error.png"); } + + .systemmonitor-content table { + border: none; + margin-top: 10px; + } + + .systemmonitor-content * .online { + border: 1px solid #ffffff; + background-color: #E3FFB8; + color: #000000; + padding:0px 5px; + } + .systemmonitor-content * .offline { + border: 1px solid #ffffff; + background-color: #d12f19; + color:#ffffff; + padding:0px 5px; + } + + /* Image-Replacement */ + .swap { background-repeat:no-repeat; } + .swap span { display:none; height:16px; } + #ir-HeaderLogo { background-image:url("../../images/header_logo.png"); height:32px; } + #ir-Yes { background-image:url("../../icons/x16/tick_circle.png"); height:16px; } + #ir-No { background-image:url("../../icons/x16/cross_circle.png"); height:16px; } + + /* BUTTONS */ + .buttons a, .buttons button{ + display:block; + float:left; + margin:0 7px 0 0; + background-color:#f5f5f5; + border:1px solid #777777; + border-top: 1px solid #c8c8c8; + border-left:1px solid #c8c8c8; + + font-family:"Lucida Grande", Tahoma, Arial, Verdana, sans-serif; + font-size:90%; + line-height:130%; + text-decoration:none; + font-weight:bold; + color:#565656; + cursor:pointer; + padding:5px 10px 6px 7px; /* Links */ + } + .buttons button{ + width:auto; + overflow:visible; + padding:4px 10px 3px 7px; /* IE6 */ + } + .buttons button[type]{ + padding:5px 10px 5px 7px; /* Firefox */ + line-height:17px; /* Safari */ + } + *:first-child+html button[type]{ + padding:4px 10px 3px 7px; /* IE7 */ + } + .buttons button img, .buttons a img{ + margin:0 3px -3px 0 !important; + padding:0; + border:none; + width:16px; + height:16px; + } + + /* BUTTONS STANDARD */ + button:hover, .buttons a:hover{ + background-color:#dff4ff; + border:1px solid #c2e1ef; + color:#336699; + } + .buttons a:active{ + background-color:#6299c5; + border:1px solid #6299c5; + color:#fff; + } + + /* BUTTONS POSITIVE */ + button.positive, .buttons a.positive{ + color:#529214; + } + .buttons a.positive:hover, button.positive:hover{ + background-color:#E6EFC2; + border:1px solid #C6D880; + color:#529214; + } + .buttons a.positive:active{ + background-color:#529214; + border:1px solid #529214; + color:#fff; + } + + /* BUTTONS NEGATIVE */ + .buttons a.negative, button.negative{ + color:#d12f19; + } + .buttons a.negative:hover, button.negative:hover{ + background-color:#fbe3e4; + border:1px solid #fbc2c4; + color:#d12f19; + } + .buttons a.negative:active{ + background-color:#d12f19; + border:1px solid #d12f19; + color:#fff; + } + + /* Button with icon and text */ + .iconstxt { + background-repeat: no-repeat; + background-position: 4px 4px; + } + .iconstxt span { padding-left: 20px; } + .iconstxt.icoPositive { background-image: url("../../icons/x16/tick_circle_frame.png"); } + .iconstxt.icoNegative { background-image: url("../../icons/x16/cross_circle_frame.png"); } + .iconstxt.icoAdd { background-image: url(../../icons/x16/plus_circle_frame.png); } + .iconstxt.icoKey { background-image: url("../../icons/x16/key.png"); } + .iconstxt.icoDelete { background-image: url("../../icons/x16/minus_circle_frame.png"); } + + /* Button with icon and without text */ + .icons16 span { display: none; } + a.icons16 { height: 18px; width: 18px; padding: 0; background-repeat: no-repeat; background-position: 1px 1px;} + button.icons16 { height: 20px; width: 20px; padding: 0; background-repeat: no-repeat; background-position: 1px 1px;} + + .icons16.icoDelete { background-image: url("../../icons/x16/minus_circle_frame.png"); } + .icons16.icoFilter { background-image: url(../../icons/x16/funnel.png); } + .icons16.icoEdit { background-image: url("../../icons/x16/wrench.png"); } + .icons16.icoDbAdmin { background-image: url("../../icons/x16/database.png"); } + .icons16.icoLoginAs { background-image: url("../../icons/x16/user_go.png"); } + .icons16.icoWebmailer { background-image: url("../../icons/x16/mails_arrow.png"); } + + + + .blockLabel.email_at { + width: 20px !important; + margin: 1.6em 0.3em 0 0 !important + } + .textDisplay { display: block; } + + /* Form Length Classes */ + .textInput.formLengthBool { width: 25px !important; } + .selectInput.formLengthBool { width: 60px !important; } + .textInput.formLengthLimit { width: 50px !important; } + .selectInput.formLengthLimit { width: 85px !important; } + .formLengthDate { width: 75px !important; } + .formLengthIPv4 { width: 125px !important; } + .formLengthIPv6 { width: 100% !important; } + .formLengthEmailUser { width: 30% !important; } + .formLengthEmailDomain { width: 30% !important; } + .formLengthHalf { width: 15% !important; } + .formLengthDouble { width: 50% !important; } + + /* Individual Form Lengths */ + .textInput#username, .textInput#password, .textInput#passwort, .textInput#source_password { width: 100px; } + .selectInput#language { width: 75px; } + .selectInput#client_group_id, .selectInput#default_group { width: 125px; } + input#refresh, input#retry, input#expire, input#minimum, input#ttl { width: 50px !important; } + + /* --- */ + + a[href $='#logout'] { padding-right: 18px; background: transparent url("../../icons/x16/logout.png") no-repeat right top !important; } + + /* Select Menu with Images */ + select.withicons option { + background-repeat:no-repeat; + background-position: 1px; + padding-left:24px; + } + select.withicons#country option[value="AD"] { background-image:url(../../icons/flags/ad.png); } + select.withicons#country option[value="AE"] { background-image:url(../../icons/flags/ae.png); } + select.withicons#country option[value="AF"] { background-image:url(../../icons/flags/af.png); } + select.withicons#country option[value="AG"] { background-image:url(../../icons/flags/ag.png); } + select.withicons#country option[value="AI"] { background-image:url(../../icons/flags/ai.png); } + select.withicons#country option[value="AL"] { background-image:url(../../icons/flags/al.png); } + select.withicons#country option[value="AM"] { background-image:url(../../icons/flags/am.png); } + select.withicons#country option[value="AN"] { background-image:url(../../icons/flags/an.png); } + select.withicons#country option[value="AO"] { background-image:url(../../icons/flags/ao.png); } + select.withicons#country option[value="AQ"] { background-image:url(../../icons/flags/aq.png); } + select.withicons#country option[value="AR"] { background-image:url(../../icons/flags/ar.png); } + select.withicons#country option[value="AS"] { background-image:url(../../icons/flags/as.png); } + select.withicons#country option[value="AT"] { background-image:url(../../icons/flags/at.png); } + select.withicons#country option[value="AU"] { background-image:url(../../icons/flags/au.png); } + select.withicons#country option[value="AW"] { background-image:url(../../icons/flags/aw.png); } + select.withicons#country option[value="AX"] { background-image:url(../../icons/flags/ax.png); } + select.withicons#country option[value="AZ"] { background-image:url(../../icons/flags/az.png); } + select.withicons#country option[value="BA"] { background-image:url(../../icons/flags/ba.png); } + select.withicons#country option[value="BB"] { background-image:url(../../icons/flags/bb.png); } + select.withicons#country option[value="BD"] { background-image:url(../../icons/flags/bd.png); } + select.withicons#country option[value="BE"] { background-image:url(../../icons/flags/be.png); } + select.withicons#country option[value="BF"] { background-image:url(../../icons/flags/bf.png); } + select.withicons#country option[value="BG"] { background-image:url(../../icons/flags/bg.png); } + select.withicons#country option[value="BH"] { background-image:url(../../icons/flags/bh.png); } + select.withicons#country option[value="BI"] { background-image:url(../../icons/flags/bi.png); } + select.withicons#country option[value="BJ"] { background-image:url(../../icons/flags/bj.png); } + select.withicons#country option[value="BM"] { background-image:url(../../icons/flags/bm.png); } + select.withicons#country option[value="BN"] { background-image:url(../../icons/flags/bn.png); } + select.withicons#country option[value="BO"] { background-image:url(../../icons/flags/bo.png); } + select.withicons#country option[value="BR"] { background-image:url(../../icons/flags/br.png); } + select.withicons#country option[value="BS"] { background-image:url(../../icons/flags/bs.png); } + select.withicons#country option[value="BT"] { background-image:url(../../icons/flags/bt.png); } + select.withicons#country option[value="BV"] { background-image:url(../../icons/flags/bv.png); } + select.withicons#country option[value="BW"] { background-image:url(../../icons/flags/bw.png); } + select.withicons#country option[value="BY"] { background-image:url(../../icons/flags/by.png); } + select.withicons#country option[value="BZ"] { background-image:url(../../icons/flags/bz.png); } + select.withicons#country option[value="CA"] { background-image:url(../../icons/flags/ca.png); } + select.withicons#country option[value="CC"] { background-image:url(../../icons/flags/cc.png); } + select.withicons#country option[value="CD"] { background-image:url(../../icons/flags/cd.png); } + select.withicons#country option[value="CF"] { background-image:url(../../icons/flags/cf.png); } + select.withicons#country option[value="CG"] { background-image:url(../../icons/flags/cg.png); } + select.withicons#country option[value="CH"] { background-image:url(../../icons/flags/ch.png); } + select.withicons#country option[value="CI"] { background-image:url(../../icons/flags/ci.png); } + select.withicons#country option[value="CK"] { background-image:url(../../icons/flags/ck.png); } + select.withicons#country option[value="CL"] { background-image:url(../../icons/flags/cl.png); } + select.withicons#country option[value="CM"] { background-image:url(../../icons/flags/cm.png); } + select.withicons#country option[value="CN"] { background-image:url(../../icons/flags/cn.png); } + select.withicons#country option[value="CO"] { background-image:url(../../icons/flags/co.png); } + select.withicons#country option[value="CR"] { background-image:url(../../icons/flags/cr.png); } + select.withicons#country option[value="CS"] { background-image:url(../../icons/flags/cs.png); } + select.withicons#country option[value="CU"] { background-image:url(../../icons/flags/cu.png); } + select.withicons#country option[value="CV"] { background-image:url(../../icons/flags/cv.png); } + select.withicons#country option[value="CX"] { background-image:url(../../icons/flags/cx.png); } + select.withicons#country option[value="CY"] { background-image:url(../../icons/flags/cy.png); } + select.withicons#country option[value="CZ"] { background-image:url(../../icons/flags/cz.png); } + select.withicons#country option[value="DE"] { background-image:url(../../icons/flags/de.png); } + select.withicons#country option[value="DJ"] { background-image:url(../../icons/flags/dj.png); } + select.withicons#country option[value="DK"] { background-image:url(../../icons/flags/dk.png); } + select.withicons#country option[value="DM"] { background-image:url(../../icons/flags/dm.png); } + select.withicons#country option[value="DO"] { background-image:url(../../icons/flags/do.png); } + select.withicons#country option[value="DZ"] { background-image:url(../../icons/flags/dz.png); } + select.withicons#country option[value="EC"] { background-image:url(../../icons/flags/ec.png); } + select.withicons#country option[value="EE"] { background-image:url(../../icons/flags/ee.png); } + select.withicons#country option[value="EG"] { background-image:url(../../icons/flags/eg.png); } + select.withicons#country option[value="EH"] { background-image:url(../../icons/flags/eh.png); } + select.withicons#country option[value="ER"] { background-image:url(../../icons/flags/er.png); } + select.withicons#country option[value="ES"] { background-image:url(../../icons/flags/es.png); } + select.withicons#country option[value="ET"] { background-image:url(../../icons/flags/et.png); } + select.withicons#country option[value="FI"] { background-image:url(../../icons/flags/fi.png); } + select.withicons#country option[value="FJ"] { background-image:url(../../icons/flags/fj.png); } + select.withicons#country option[value="FK"] { background-image:url(../../icons/flags/fk.png); } + select.withicons#country option[value="FM"] { background-image:url(../../icons/flags/fm.png); } + select.withicons#country option[value="FO"] { background-image:url(../../icons/flags/fo.png); } + select.withicons#country option[value="FR"] { background-image:url(../../icons/flags/fr.png); } + select.withicons#country option[value="GA"] { background-image:url(../../icons/flags/ga.png); } + select.withicons#country option[value="GB"] { background-image:url(../../icons/flags/gb.png); } + select.withicons#country option[value="GD"] { background-image:url(../../icons/flags/gd.png); } + select.withicons#country option[value="GE"] { background-image:url(../../icons/flags/ge.png); } + select.withicons#country option[value="GF"] { background-image:url(../../icons/flags/gf.png); } + select.withicons#country option[value="GH"] { background-image:url(../../icons/flags/gh.png); } + select.withicons#country option[value="GI"] { background-image:url(../../icons/flags/gi.png); } + select.withicons#country option[value="GL"] { background-image:url(../../icons/flags/gl.png); } + select.withicons#country option[value="GM"] { background-image:url(../../icons/flags/gm.png); } + select.withicons#country option[value="GN"] { background-image:url(../../icons/flags/gn.png); } + select.withicons#country option[value="GP"] { background-image:url(../../icons/flags/gp.png); } + select.withicons#country option[value="GQ"] { background-image:url(../../icons/flags/gq.png); } + select.withicons#country option[value="GR"] { background-image:url(../../icons/flags/gr.png); } + select.withicons#country option[value="GS"] { background-image:url(../../icons/flags/gs.png); } + select.withicons#country option[value="GT"] { background-image:url(../../icons/flags/gt.png); } + select.withicons#country option[value="GU"] { background-image:url(../../icons/flags/gu.png); } + select.withicons#country option[value="GW"] { background-image:url(../../icons/flags/gw.png); } + select.withicons#country option[value="GY"] { background-image:url(../../icons/flags/gy.png); } + select.withicons#country option[value="HK"] { background-image:url(../../icons/flags/hk.png); } + select.withicons#country option[value="HM"] { background-image:url(../../icons/flags/hm.png); } + select.withicons#country option[value="HN"] { background-image:url(../../icons/flags/hn.png); } + select.withicons#country option[value="HR"] { background-image:url(../../icons/flags/hr.png); } + select.withicons#country option[value="HT"] { background-image:url(../../icons/flags/ht.png); } + select.withicons#country option[value="HU"] { background-image:url(../../icons/flags/hu.png); } + select.withicons#country option[value="ID"] { background-image:url(../../icons/flags/id.png); } + select.withicons#country option[value="IE"] { background-image:url(../../icons/flags/ie.png); } + select.withicons#country option[value="IL"] { background-image:url(../../icons/flags/il.png); } + select.withicons#country option[value="IN"] { background-image:url(../../icons/flags/in.png); } + select.withicons#country option[value="IO"] { background-image:url(../../icons/flags/io.png); } + select.withicons#country option[value="IQ"] { background-image:url(../../icons/flags/iq.png); } + select.withicons#country option[value="IR"] { background-image:url(../../icons/flags/ir.png); } + select.withicons#country option[value="IS"] { background-image:url(../../icons/flags/is.png); } + select.withicons#country option[value="IT"] { background-image:url(../../icons/flags/it.png); } + select.withicons#country option[value="JM"] { background-image:url(../../icons/flags/jm.png); } + select.withicons#country option[value="JO"] { background-image:url(../../icons/flags/jo.png); } + select.withicons#country option[value="JP"] { background-image:url(../../icons/flags/jp.png); } + select.withicons#country option[value="KE"] { background-image:url(../../icons/flags/ke.png); } + select.withicons#country option[value="KG"] { background-image:url(../../icons/flags/kg.png); } + select.withicons#country option[value="KH"] { background-image:url(../../icons/flags/kh.png); } + select.withicons#country option[value="KI"] { background-image:url(../../icons/flags/ki.png); } + select.withicons#country option[value="KM"] { background-image:url(../../icons/flags/km.png); } + select.withicons#country option[value="KN"] { background-image:url(../../icons/flags/kn.png); } + select.withicons#country option[value="KP"] { background-image:url(../../icons/flags/kp.png); } + select.withicons#country option[value="KR"] { background-image:url(../../icons/flags/kr.png); } + select.withicons#country option[value="KW"] { background-image:url(../../icons/flags/kw.png); } + select.withicons#country option[value="KY"] { background-image:url(../../icons/flags/ky.png); } + select.withicons#country option[value="KZ"] { background-image:url(../../icons/flags/kz.png); } + select.withicons#country option[value="LA"] { background-image:url(../../icons/flags/la.png); } + select.withicons#country option[value="LB"] { background-image:url(../../icons/flags/lb.png); } + select.withicons#country option[value="LC"] { background-image:url(../../icons/flags/lc.png); } + select.withicons#country option[value="LI"] { background-image:url(../../icons/flags/li.png); } + select.withicons#country option[value="LK"] { background-image:url(../../icons/flags/lk.png); } + select.withicons#country option[value="LR"] { background-image:url(../../icons/flags/lr.png); } + select.withicons#country option[value="LS"] { background-image:url(../../icons/flags/ls.png); } + select.withicons#country option[value="LT"] { background-image:url(../../icons/flags/lt.png); } + select.withicons#country option[value="LU"] { background-image:url(../../icons/flags/lu.png); } + select.withicons#country option[value="LV"] { background-image:url(../../icons/flags/lv.png); } + select.withicons#country option[value="LY"] { background-image:url(../../icons/flags/ly.png); } + select.withicons#country option[value="MA"] { background-image:url(../../icons/flags/ma.png); } + select.withicons#country option[value="MC"] { background-image:url(../../icons/flags/mc.png); } + select.withicons#country option[value="MD"] { background-image:url(../../icons/flags/md.png); } + select.withicons#country option[value="ME"] { background-image:url(../../icons/flags/me.png); } + select.withicons#country option[value="MG"] { background-image:url(../../icons/flags/mg.png); } + select.withicons#country option[value="MH"] { background-image:url(../../icons/flags/mh.png); } + select.withicons#country option[value="MK"] { background-image:url(../../icons/flags/mk.png); } + select.withicons#country option[value="ML"] { background-image:url(../../icons/flags/ml.png); } + select.withicons#country option[value="MM"] { background-image:url(../../icons/flags/mm.png); } + select.withicons#country option[value="MN"] { background-image:url(../../icons/flags/mn.png); } + select.withicons#country option[value="MO"] { background-image:url(../../icons/flags/mo.png); } + select.withicons#country option[value="MP"] { background-image:url(../../icons/flags/mp.png); } + select.withicons#country option[value="MQ"] { background-image:url(../../icons/flags/mq.png); } + select.withicons#country option[value="MR"] { background-image:url(../../icons/flags/mr.png); } + select.withicons#country option[value="MS"] { background-image:url(../../icons/flags/ms.png); } + select.withicons#country option[value="MT"] { background-image:url(../../icons/flags/mt.png); } + select.withicons#country option[value="MU"] { background-image:url(../../icons/flags/mu.png); } + select.withicons#country option[value="MV"] { background-image:url(../../icons/flags/mv.png); } + select.withicons#country option[value="MW"] { background-image:url(../../icons/flags/mw.png); } + select.withicons#country option[value="MX"] { background-image:url(../../icons/flags/mx.png); } + select.withicons#country option[value="MY"] { background-image:url(../../icons/flags/my.png); } + select.withicons#country option[value="MZ"] { background-image:url(../../icons/flags/mz.png); } + select.withicons#country option[value="NA"] { background-image:url(../../icons/flags/na.png); } + select.withicons#country option[value="NC"] { background-image:url(../../icons/flags/nc.png); } + select.withicons#country option[value="NE"] { background-image:url(../../icons/flags/ne.png); } + select.withicons#country option[value="NF"] { background-image:url(../../icons/flags/nf.png); } + select.withicons#country option[value="NG"] { background-image:url(../../icons/flags/ng.png); } + select.withicons#country option[value="NI"] { background-image:url(../../icons/flags/ni.png); } + select.withicons#country option[value="NL"] { background-image:url(../../icons/flags/nl.png); } + select.withicons#country option[value="NO"] { background-image:url(../../icons/flags/no.png); } + select.withicons#country option[value="NP"] { background-image:url(../../icons/flags/np.png); } + select.withicons#country option[value="NR"] { background-image:url(../../icons/flags/nr.png); } + select.withicons#country option[value="NU"] { background-image:url(../../icons/flags/nu.png); } + select.withicons#country option[value="NZ"] { background-image:url(../../icons/flags/nz.png); } + select.withicons#country option[value="OM"] { background-image:url(../../icons/flags/om.png); } + select.withicons#country option[value="PA"] { background-image:url(../../icons/flags/pa.png); } + select.withicons#country option[value="PE"] { background-image:url(../../icons/flags/pe.png); } + select.withicons#country option[value="PF"] { background-image:url(../../icons/flags/pf.png); } + select.withicons#country option[value="PG"] { background-image:url(../../icons/flags/pg.png); } + select.withicons#country option[value="PH"] { background-image:url(../../icons/flags/ph.png); } + select.withicons#country option[value="PK"] { background-image:url(../../icons/flags/pk.png); } + select.withicons#country option[value="PL"] { background-image:url(../../icons/flags/pl.png); } + select.withicons#country option[value="PM"] { background-image:url(../../icons/flags/pm.png); } + select.withicons#country option[value="PN"] { background-image:url(../../icons/flags/pn.png); } + select.withicons#country option[value="PR"] { background-image:url(../../icons/flags/pr.png); } + select.withicons#country option[value="PS"] { background-image:url(../../icons/flags/ps.png); } + select.withicons#country option[value="PT"] { background-image:url(../../icons/flags/pt.png); } + select.withicons#country option[value="PW"] { background-image:url(../../icons/flags/pw.png); } + select.withicons#country option[value="PY"] { background-image:url(../../icons/flags/py.png); } + select.withicons#country option[value="QA"] { background-image:url(../../icons/flags/qa.png); } + select.withicons#country option[value="RE"] { background-image:url(../../icons/flags/re.png); } + select.withicons#country option[value="RO"] { background-image:url(../../icons/flags/ro.png); } + select.withicons#country option[value="RS"] { background-image:url(../../icons/flags/rs.png); } + select.withicons#country option[value="RU"] { background-image:url(../../icons/flags/ru.png); } + select.withicons#country option[value="RW"] { background-image:url(../../icons/flags/rw.png); } + select.withicons#country option[value="SA"] { background-image:url(../../icons/flags/sa.png); } + select.withicons#country option[value="SB"] { background-image:url(../../icons/flags/sb.png); } + select.withicons#country option[value="SC"] { background-image:url(../../icons/flags/sc.png); } + select.withicons#country option[value="SD"] { background-image:url(../../icons/flags/sd.png); } + select.withicons#country option[value="SE"] { background-image:url(../../icons/flags/se.png); } + select.withicons#country option[value="SG"] { background-image:url(../../icons/flags/sg.png); } + select.withicons#country option[value="SH"] { background-image:url(../../icons/flags/sh.png); } + select.withicons#country option[value="SI"] { background-image:url(../../icons/flags/si.png); } + select.withicons#country option[value="SJ"] { background-image:url(../../icons/flags/sj.png); } + select.withicons#country option[value="SK"] { background-image:url(../../icons/flags/sk.png); } + select.withicons#country option[value="SL"] { background-image:url(../../icons/flags/sl.png); } + select.withicons#country option[value="SM"] { background-image:url(../../icons/flags/sm.png); } + select.withicons#country option[value="SN"] { background-image:url(../../icons/flags/sn.png); } + select.withicons#country option[value="SO"] { background-image:url(../../icons/flags/so.png); } + select.withicons#country option[value="SR"] { background-image:url(../../icons/flags/sr.png); } + select.withicons#country option[value="ST"] { background-image:url(../../icons/flags/st.png); } + select.withicons#country option[value="SV"] { background-image:url(../../icons/flags/sv.png); } + select.withicons#country option[value="SY"] { background-image:url(../../icons/flags/sy.png); } + select.withicons#country option[value="SZ"] { background-image:url(../../icons/flags/sz.png); } + select.withicons#country option[value="TC"] { background-image:url(../../icons/flags/tc.png); } + select.withicons#country option[value="TD"] { background-image:url(../../icons/flags/td.png); } + select.withicons#country option[value="TF"] { background-image:url(../../icons/flags/tf.png); } + select.withicons#country option[value="TG"] { background-image:url(../../icons/flags/tg.png); } + select.withicons#country option[value="TH"] { background-image:url(../../icons/flags/th.png); } + select.withicons#country option[value="TJ"] { background-image:url(../../icons/flags/tj.png); } + select.withicons#country option[value="TK"] { background-image:url(../../icons/flags/tk.png); } + select.withicons#country option[value="TL"] { background-image:url(../../icons/flags/tl.png); } + select.withicons#country option[value="TM"] { background-image:url(../../icons/flags/tm.png); } + select.withicons#country option[value="TN"] { background-image:url(../../icons/flags/tn.png); } + select.withicons#country option[value="TO"] { background-image:url(../../icons/flags/to.png); } + select.withicons#country option[value="TR"] { background-image:url(../../icons/flags/tr.png); } + select.withicons#country option[value="TT"] { background-image:url(../../icons/flags/tt.png); } + select.withicons#country option[value="TV"] { background-image:url(../../icons/flags/tv.png); } + select.withicons#country option[value="TW"] { background-image:url(../../icons/flags/tw.png); } + select.withicons#country option[value="TZ"] { background-image:url(../../icons/flags/tz.png); } + select.withicons#country option[value="UA"] { background-image:url(../../icons/flags/ua.png); } + select.withicons#country option[value="UG"] { background-image:url(../../icons/flags/ug.png); } + select.withicons#country option[value="UM"] { background-image:url(../../icons/flags/um.png); } + select.withicons#country option[value="US"] { background-image:url(../../icons/flags/us.png); } + select.withicons#country option[value="UY"] { background-image:url(../../icons/flags/uy.png); } + select.withicons#country option[value="UZ"] { background-image:url(../../icons/flags/uz.png); } + select.withicons#country option[value="VA"] { background-image:url(../../icons/flags/va.png); } + select.withicons#country option[value="VC"] { background-image:url(../../icons/flags/vc.png); } + select.withicons#country option[value="VE"] { background-image:url(../../icons/flags/ve.png); } + select.withicons#country option[value="VG"] { background-image:url(../../icons/flags/vg.png); } + select.withicons#country option[value="VI"] { background-image:url(../../icons/flags/vi.png); } + select.withicons#country option[value="VN"] { background-image:url(../../icons/flags/vn.png); } + select.withicons#country option[value="VU"] { background-image:url(../../icons/flags/vu.png); } + select.withicons#country option[value="WF"] { background-image:url(../../icons/flags/wf.png); } + select.withicons#country option[value="WS"] { background-image:url(../../icons/flags/ws.png); } + select.withicons#country option[value="YE"] { background-image:url(../../icons/flags/ye.png); } + select.withicons#country option[value="YT"] { background-image:url(../../icons/flags/yt.png); } + select.withicons#country option[value="ZA"] { background-image:url(../../icons/flags/za.png); } + select.withicons#country option[value="ZM"] { background-image:url(../../icons/flags/zm.png); } + select.withicons#country option[value="ZW"] { background-image:url(../../icons/flags/zw.png); } + + select.withicons#language option[value="ad"] { background-image:url(../../icons/flags/ad.png); } + select.withicons#language option[value="ae"] { background-image:url(../../icons/flags/ae.png); } + select.withicons#language option[value="af"] { background-image:url(../../icons/flags/af.png); } + select.withicons#language option[value="ag"] { background-image:url(../../icons/flags/ag.png); } + select.withicons#language option[value="ai"] { background-image:url(../../icons/flags/ai.png); } + select.withicons#language option[value="al"] { background-image:url(../../icons/flags/al.png); } + select.withicons#language option[value="am"] { background-image:url(../../icons/flags/am.png); } + select.withicons#language option[value="an"] { background-image:url(../../icons/flags/an.png); } + select.withicons#language option[value="ao"] { background-image:url(../../icons/flags/ao.png); } + select.withicons#language option[value="aq"] { background-image:url(../../icons/flags/aq.png); } + select.withicons#language option[value="ar"] { background-image:url(../../icons/flags/ar.png); } + select.withicons#language option[value="as"] { background-image:url(../../icons/flags/as.png); } + select.withicons#language option[value="at"] { background-image:url(../../icons/flags/at.png); } + select.withicons#language option[value="au"] { background-image:url(../../icons/flags/au.png); } + select.withicons#language option[value="aw"] { background-image:url(../../icons/flags/aw.png); } + select.withicons#language option[value="ax"] { background-image:url(../../icons/flags/ax.png); } + select.withicons#language option[value="az"] { background-image:url(../../icons/flags/az.png); } + select.withicons#language option[value="ba"] { background-image:url(../../icons/flags/ba.png); } + select.withicons#language option[value="bb"] { background-image:url(../../icons/flags/bb.png); } + select.withicons#language option[value="bd"] { background-image:url(../../icons/flags/bd.png); } + select.withicons#language option[value="be"] { background-image:url(../../icons/flags/be.png); } + select.withicons#language option[value="bf"] { background-image:url(../../icons/flags/bf.png); } + select.withicons#language option[value="bg"] { background-image:url(../../icons/flags/bg.png); } + select.withicons#language option[value="bh"] { background-image:url(../../icons/flags/bh.png); } + select.withicons#language option[value="bi"] { background-image:url(../../icons/flags/bi.png); } + select.withicons#language option[value="bj"] { background-image:url(../../icons/flags/bj.png); } + select.withicons#language option[value="bm"] { background-image:url(../../icons/flags/bm.png); } + select.withicons#language option[value="bn"] { background-image:url(../../icons/flags/bn.png); } + select.withicons#language option[value="bo"] { background-image:url(../../icons/flags/bo.png); } + select.withicons#language option[value="br"] { background-image:url(../../icons/flags/br.png); } + select.withicons#language option[value="bs"] { background-image:url(../../icons/flags/bs.png); } + select.withicons#language option[value="bt"] { background-image:url(../../icons/flags/bt.png); } + select.withicons#language option[value="bv"] { background-image:url(../../icons/flags/bv.png); } + select.withicons#language option[value="bw"] { background-image:url(../../icons/flags/bw.png); } + select.withicons#language option[value="by"] { background-image:url(../../icons/flags/by.png); } + select.withicons#language option[value="bz"] { background-image:url(../../icons/flags/bz.png); } + select.withicons#language option[value="ca"] { background-image:url(../../icons/flags/ca.png); } + select.withicons#language option[value="cc"] { background-image:url(../../icons/flags/cc.png); } + select.withicons#language option[value="cd"] { background-image:url(../../icons/flags/cd.png); } + select.withicons#language option[value="cf"] { background-image:url(../../icons/flags/cf.png); } + select.withicons#language option[value="cg"] { background-image:url(../../icons/flags/cg.png); } + select.withicons#language option[value="ch"] { background-image:url(../../icons/flags/ch.png); } + select.withicons#language option[value="ci"] { background-image:url(../../icons/flags/ci.png); } + select.withicons#language option[value="ck"] { background-image:url(../../icons/flags/ck.png); } + select.withicons#language option[value="cl"] { background-image:url(../../icons/flags/cl.png); } + select.withicons#language option[value="cm"] { background-image:url(../../icons/flags/cm.png); } + select.withicons#language option[value="cn"] { background-image:url(../../icons/flags/cn.png); } + select.withicons#language option[value="co"] { background-image:url(../../icons/flags/co.png); } + select.withicons#language option[value="cr"] { background-image:url(../../icons/flags/cr.png); } + select.withicons#language option[value="cs"] { background-image:url(../../icons/flags/cs.png); } + select.withicons#language option[value="cu"] { background-image:url(../../icons/flags/cu.png); } + select.withicons#language option[value="cv"] { background-image:url(../../icons/flags/cv.png); } + select.withicons#language option[value="cx"] { background-image:url(../../icons/flags/cx.png); } + select.withicons#language option[value="cy"] { background-image:url(../../icons/flags/cy.png); } + select.withicons#language option[value="cz"] { background-image:url(../../icons/flags/cz.png); } + select.withicons#language option[value="de"] { background-image:url(../../icons/flags/de.png); } + select.withicons#language option[value="dj"] { background-image:url(../../icons/flags/dj.png); } + select.withicons#language option[value="dk"] { background-image:url(../../icons/flags/dk.png); } + select.withicons#language option[value="dm"] { background-image:url(../../icons/flags/dm.png); } + select.withicons#language option[value="do"] { background-image:url(../../icons/flags/do.png); } + select.withicons#language option[value="dz"] { background-image:url(../../icons/flags/dz.png); } + select.withicons#language option[value="ec"] { background-image:url(../../icons/flags/ec.png); } + select.withicons#language option[value="ee"] { background-image:url(../../icons/flags/ee.png); } + select.withicons#language option[value="eg"] { background-image:url(../../icons/flags/eg.png); } + select.withicons#language option[value="eh"] { background-image:url(../../icons/flags/eh.png); } + select.withicons#language option[value="en"] { background-image:url(../../icons/flags/gb.png); } + select.withicons#language option[value="er"] { background-image:url(../../icons/flags/er.png); } + select.withicons#language option[value="es"] { background-image:url(../../icons/flags/es.png); } + select.withicons#language option[value="et"] { background-image:url(../../icons/flags/et.png); } + select.withicons#language option[value="fi"] { background-image:url(../../icons/flags/fi.png); } + select.withicons#language option[value="fj"] { background-image:url(../../icons/flags/fj.png); } + select.withicons#language option[value="fk"] { background-image:url(../../icons/flags/fk.png); } + select.withicons#language option[value="fm"] { background-image:url(../../icons/flags/fm.png); } + select.withicons#language option[value="fo"] { background-image:url(../../icons/flags/fo.png); } + select.withicons#language option[value="fr"] { background-image:url(../../icons/flags/fr.png); } + select.withicons#language option[value="ga"] { background-image:url(../../icons/flags/ga.png); } + select.withicons#language option[value="gb"] { background-image:url(../../icons/flags/gb.png); } + select.withicons#language option[value="gd"] { background-image:url(../../icons/flags/gd.png); } + select.withicons#language option[value="ge"] { background-image:url(../../icons/flags/ge.png); } + select.withicons#language option[value="gf"] { background-image:url(../../icons/flags/gf.png); } + select.withicons#language option[value="gh"] { background-image:url(../../icons/flags/gh.png); } + select.withicons#language option[value="gi"] { background-image:url(../../icons/flags/gi.png); } + select.withicons#language option[value="gl"] { background-image:url(../../icons/flags/gl.png); } + select.withicons#language option[value="gm"] { background-image:url(../../icons/flags/gm.png); } + select.withicons#language option[value="gn"] { background-image:url(../../icons/flags/gn.png); } + select.withicons#language option[value="gp"] { background-image:url(../../icons/flags/gp.png); } + select.withicons#language option[value="gq"] { background-image:url(../../icons/flags/gq.png); } + select.withicons#language option[value="gr"] { background-image:url(../../icons/flags/gr.png); } + select.withicons#language option[value="gs"] { background-image:url(../../icons/flags/gs.png); } + select.withicons#language option[value="gt"] { background-image:url(../../icons/flags/gt.png); } + select.withicons#language option[value="gu"] { background-image:url(../../icons/flags/gu.png); } + select.withicons#language option[value="gw"] { background-image:url(../../icons/flags/gw.png); } + select.withicons#language option[value="gy"] { background-image:url(../../icons/flags/gy.png); } + select.withicons#language option[value="hk"] { background-image:url(../../icons/flags/hk.png); } + select.withicons#language option[value="hm"] { background-image:url(../../icons/flags/hm.png); } + select.withicons#language option[value="hn"] { background-image:url(../../icons/flags/hn.png); } + select.withicons#language option[value="hr"] { background-image:url(../../icons/flags/hr.png); } + select.withicons#language option[value="ht"] { background-image:url(../../icons/flags/ht.png); } + select.withicons#language option[value="hu"] { background-image:url(../../icons/flags/hu.png); } + select.withicons#language option[value="id"] { background-image:url(../../icons/flags/id.png); } + select.withicons#language option[value="ie"] { background-image:url(../../icons/flags/ie.png); } + select.withicons#language option[value="il"] { background-image:url(../../icons/flags/il.png); } + select.withicons#language option[value="in"] { background-image:url(../../icons/flags/in.png); } + select.withicons#language option[value="io"] { background-image:url(../../icons/flags/io.png); } + select.withicons#language option[value="iq"] { background-image:url(../../icons/flags/iq.png); } + select.withicons#language option[value="ir"] { background-image:url(../../icons/flags/ir.png); } + select.withicons#language option[value="is"] { background-image:url(../../icons/flags/is.png); } + select.withicons#language option[value="it"] { background-image:url(../../icons/flags/it.png); } + select.withicons#language option[value="jm"] { background-image:url(../../icons/flags/jm.png); } + select.withicons#language option[value="jo"] { background-image:url(../../icons/flags/jo.png); } + select.withicons#language option[value="jp"] { background-image:url(../../icons/flags/jp.png); } + select.withicons#language option[value="ke"] { background-image:url(../../icons/flags/ke.png); } + select.withicons#language option[value="kg"] { background-image:url(../../icons/flags/kg.png); } + select.withicons#language option[value="kh"] { background-image:url(../../icons/flags/kh.png); } + select.withicons#language option[value="ki"] { background-image:url(../../icons/flags/ki.png); } + select.withicons#language option[value="km"] { background-image:url(../../icons/flags/km.png); } + select.withicons#language option[value="kn"] { background-image:url(../../icons/flags/kn.png); } + select.withicons#language option[value="kp"] { background-image:url(../../icons/flags/kp.png); } + select.withicons#language option[value="kr"] { background-image:url(../../icons/flags/kr.png); } + select.withicons#language option[value="kw"] { background-image:url(../../icons/flags/kw.png); } + select.withicons#language option[value="ky"] { background-image:url(../../icons/flags/ky.png); } + select.withicons#language option[value="kz"] { background-image:url(../../icons/flags/kz.png); } + select.withicons#language option[value="la"] { background-image:url(../../icons/flags/la.png); } + select.withicons#language option[value="lb"] { background-image:url(../../icons/flags/lb.png); } + select.withicons#language option[value="lc"] { background-image:url(../../icons/flags/lc.png); } + select.withicons#language option[value="li"] { background-image:url(../../icons/flags/li.png); } + select.withicons#language option[value="lk"] { background-image:url(../../icons/flags/lk.png); } + select.withicons#language option[value="lr"] { background-image:url(../../icons/flags/lr.png); } + select.withicons#language option[value="ls"] { background-image:url(../../icons/flags/ls.png); } + select.withicons#language option[value="lt"] { background-image:url(../../icons/flags/lt.png); } + select.withicons#language option[value="lu"] { background-image:url(../../icons/flags/lu.png); } + select.withicons#language option[value="lv"] { background-image:url(../../icons/flags/lv.png); } + select.withicons#language option[value="ly"] { background-image:url(../../icons/flags/ly.png); } + select.withicons#language option[value="ma"] { background-image:url(../../icons/flags/ma.png); } + select.withicons#language option[value="mc"] { background-image:url(../../icons/flags/mc.png); } + select.withicons#language option[value="md"] { background-image:url(../../icons/flags/md.png); } + select.withicons#language option[value="me"] { background-image:url(../../icons/flags/me.png); } + select.withicons#language option[value="mg"] { background-image:url(../../icons/flags/mg.png); } + select.withicons#language option[value="mh"] { background-image:url(../../icons/flags/mh.png); } + select.withicons#language option[value="mk"] { background-image:url(../../icons/flags/mk.png); } + select.withicons#language option[value="ml"] { background-image:url(../../icons/flags/ml.png); } + select.withicons#language option[value="mm"] { background-image:url(../../icons/flags/mm.png); } + select.withicons#language option[value="mn"] { background-image:url(../../icons/flags/mn.png); } + select.withicons#language option[value="mo"] { background-image:url(../../icons/flags/mo.png); } + select.withicons#language option[value="mp"] { background-image:url(../../icons/flags/mp.png); } + select.withicons#language option[value="mq"] { background-image:url(../../icons/flags/mq.png); } + select.withicons#language option[value="mr"] { background-image:url(../../icons/flags/mr.png); } + select.withicons#language option[value="ms"] { background-image:url(../../icons/flags/ms.png); } + select.withicons#language option[value="mt"] { background-image:url(../../icons/flags/mt.png); } + select.withicons#language option[value="mu"] { background-image:url(../../icons/flags/mu.png); } + select.withicons#language option[value="mv"] { background-image:url(../../icons/flags/mv.png); } + select.withicons#language option[value="mw"] { background-image:url(../../icons/flags/mw.png); } + select.withicons#language option[value="mx"] { background-image:url(../../icons/flags/mx.png); } + select.withicons#language option[value="my"] { background-image:url(../../icons/flags/my.png); } + select.withicons#language option[value="mz"] { background-image:url(../../icons/flags/mz.png); } + select.withicons#language option[value="na"] { background-image:url(../../icons/flags/na.png); } + select.withicons#language option[value="nc"] { background-image:url(../../icons/flags/nc.png); } + select.withicons#language option[value="ne"] { background-image:url(../../icons/flags/ne.png); } + select.withicons#language option[value="nf"] { background-image:url(../../icons/flags/nf.png); } + select.withicons#language option[value="ng"] { background-image:url(../../icons/flags/ng.png); } + select.withicons#language option[value="ni"] { background-image:url(../../icons/flags/ni.png); } + select.withicons#language option[value="nl"] { background-image:url(../../icons/flags/nl.png); } + select.withicons#language option[value="no"] { background-image:url(../../icons/flags/no.png); } + select.withicons#language option[value="np"] { background-image:url(../../icons/flags/np.png); } + select.withicons#language option[value="nr"] { background-image:url(../../icons/flags/nr.png); } + select.withicons#language option[value="nu"] { background-image:url(../../icons/flags/nu.png); } + select.withicons#language option[value="nz"] { background-image:url(../../icons/flags/nz.png); } + select.withicons#language option[value="om"] { background-image:url(../../icons/flags/om.png); } + select.withicons#language option[value="pa"] { background-image:url(../../icons/flags/pa.png); } + select.withicons#language option[value="pe"] { background-image:url(../../icons/flags/pe.png); } + select.withicons#language option[value="pf"] { background-image:url(../../icons/flags/pf.png); } + select.withicons#language option[value="pg"] { background-image:url(../../icons/flags/pg.png); } + select.withicons#language option[value="ph"] { background-image:url(../../icons/flags/ph.png); } + select.withicons#language option[value="pk"] { background-image:url(../../icons/flags/pk.png); } + select.withicons#language option[value="pl"] { background-image:url(../../icons/flags/pl.png); } + select.withicons#language option[value="pm"] { background-image:url(../../icons/flags/pm.png); } + select.withicons#language option[value="pn"] { background-image:url(../../icons/flags/pn.png); } + select.withicons#language option[value="pr"] { background-image:url(../../icons/flags/pr.png); } + select.withicons#language option[value="ps"] { background-image:url(../../icons/flags/ps.png); } + select.withicons#language option[value="pt"] { background-image:url(../../icons/flags/pt.png); } + select.withicons#language option[value="pw"] { background-image:url(../../icons/flags/pw.png); } + select.withicons#language option[value="py"] { background-image:url(../../icons/flags/py.png); } + select.withicons#language option[value="qa"] { background-image:url(../../icons/flags/qa.png); } + select.withicons#language option[value="re"] { background-image:url(../../icons/flags/re.png); } + select.withicons#language option[value="ro"] { background-image:url(../../icons/flags/ro.png); } + select.withicons#language option[value="rs"] { background-image:url(../../icons/flags/rs.png); } + select.withicons#language option[value="ru"] { background-image:url(../../icons/flags/ru.png); } + select.withicons#language option[value="rw"] { background-image:url(../../icons/flags/rw.png); } + select.withicons#language option[value="sa"] { background-image:url(../../icons/flags/sa.png); } + select.withicons#language option[value="sb"] { background-image:url(../../icons/flags/sb.png); } + select.withicons#language option[value="sc"] { background-image:url(../../icons/flags/sc.png); } + select.withicons#language option[value="sd"] { background-image:url(../../icons/flags/sd.png); } + select.withicons#language option[value="se"] { background-image:url(../../icons/flags/se.png); } + select.withicons#language option[value="sg"] { background-image:url(../../icons/flags/sg.png); } + select.withicons#language option[value="sh"] { background-image:url(../../icons/flags/sh.png); } + select.withicons#language option[value="si"] { background-image:url(../../icons/flags/si.png); } + select.withicons#language option[value="sj"] { background-image:url(../../icons/flags/sj.png); } + select.withicons#language option[value="sk"] { background-image:url(../../icons/flags/sk.png); } + select.withicons#language option[value="sl"] { background-image:url(../../icons/flags/sl.png); } + select.withicons#language option[value="sm"] { background-image:url(../../icons/flags/sm.png); } + select.withicons#language option[value="sn"] { background-image:url(../../icons/flags/sn.png); } + select.withicons#language option[value="so"] { background-image:url(../../icons/flags/so.png); } + select.withicons#language option[value="sr"] { background-image:url(../../icons/flags/sr.png); } + select.withicons#language option[value="st"] { background-image:url(../../icons/flags/st.png); } + select.withicons#language option[value="sv"] { background-image:url(../../icons/flags/sv.png); } + select.withicons#language option[value="sy"] { background-image:url(../../icons/flags/sy.png); } + select.withicons#language option[value="sz"] { background-image:url(../../icons/flags/sz.png); } + select.withicons#language option[value="tc"] { background-image:url(../../icons/flags/tc.png); } + select.withicons#language option[value="td"] { background-image:url(../../icons/flags/td.png); } + select.withicons#language option[value="tf"] { background-image:url(../../icons/flags/tf.png); } + select.withicons#language option[value="tg"] { background-image:url(../../icons/flags/tg.png); } + select.withicons#language option[value="th"] { background-image:url(../../icons/flags/th.png); } + select.withicons#language option[value="tj"] { background-image:url(../../icons/flags/tj.png); } + select.withicons#language option[value="tk"] { background-image:url(../../icons/flags/tk.png); } + select.withicons#language option[value="tl"] { background-image:url(../../icons/flags/tl.png); } + select.withicons#language option[value="tm"] { background-image:url(../../icons/flags/tm.png); } + select.withicons#language option[value="tn"] { background-image:url(../../icons/flags/tn.png); } + select.withicons#language option[value="to"] { background-image:url(../../icons/flags/to.png); } + select.withicons#language option[value="tr"] { background-image:url(../../icons/flags/tr.png); } + select.withicons#language option[value="tt"] { background-image:url(../../icons/flags/tt.png); } + select.withicons#language option[value="tv"] { background-image:url(../../icons/flags/tv.png); } + select.withicons#language option[value="tw"] { background-image:url(../../icons/flags/tw.png); } + select.withicons#language option[value="tz"] { background-image:url(../../icons/flags/tz.png); } + select.withicons#language option[value="ua"] { background-image:url(../../icons/flags/ua.png); } + select.withicons#language option[value="ug"] { background-image:url(../../icons/flags/ug.png); } + select.withicons#language option[value="um"] { background-image:url(../../icons/flags/um.png); } + select.withicons#language option[value="us"] { background-image:url(../../icons/flags/us.png); } + select.withicons#language option[value="uy"] { background-image:url(../../icons/flags/uy.png); } + select.withicons#language option[value="uz"] { background-image:url(../../icons/flags/uz.png); } + select.withicons#language option[value="va"] { background-image:url(../../icons/flags/va.png); } + select.withicons#language option[value="vc"] { background-image:url(../../icons/flags/vc.png); } + select.withicons#language option[value="ve"] { background-image:url(../../icons/flags/ve.png); } + select.withicons#language option[value="vg"] { background-image:url(../../icons/flags/vg.png); } + select.withicons#language option[value="vi"] { background-image:url(../../icons/flags/vi.png); } + select.withicons#language option[value="vn"] { background-image:url(../../icons/flags/vn.png); } + select.withicons#language option[value="vu"] { background-image:url(../../icons/flags/vu.png); } + select.withicons#language option[value="wf"] { background-image:url(../../icons/flags/wf.png); } + select.withicons#language option[value="ws"] { background-image:url(../../icons/flags/ws.png); } + select.withicons#language option[value="ye"] { background-image:url(../../icons/flags/ye.png); } + select.withicons#language option[value="yt"] { background-image:url(../../icons/flags/yt.png); } + select.withicons#language option[value="za"] { background-image:url(../../icons/flags/za.png); } + select.withicons#language option[value="zm"] { background-image:url(../../icons/flags/zm.png); } + select.withicons#language option[value="zw"] { background-image:url(../../icons/flags/zw.png); } + + .panel_login { + max-width: 80%; + min-width: 680px; + } + +} + diff --git a/interface/ispconfig/interface/themes/default/css/screen/uni-form-generic.css b/interface/ispconfig/interface/themes/default/css/screen/uni-form-generic.css new file mode 100644 index 0000000000000000000000000000000000000000..f9e0f390ccb6e8d36b5e4d57776a29a2868282a0 --- /dev/null +++ b/interface/ispconfig/interface/themes/default/css/screen/uni-form-generic.css @@ -0,0 +1,136 @@ +/* Uni-Form by Dragan Babic [Superawesome Industries] - http: //sprawsm.com/uni-form/ */ +/* Some rights reserved - http: //creativecommons.org/licenses/by-sa/2.5/ */ +/* Do not edit this file directly, make your changes to uni-form.css in the same folder */ + +/* ------------------------------------------------------------------------------ */ + +.uniForm{ margin: 0; padding: 0; position: relative; z-index: 1; } /* reset stuff */ + + /* Some generals and more resets */ + .uniForm fieldset{ border: none; margin: 0; padding: 0; } + .uniForm fieldset legend{ margin: 0; padding: 0; } + + /* This is the main unit that contains our form elements */ + .uniForm .ctrlHolder, + .uniForm .buttonHolder{ margin: 0; padding: 0; clear: both; } + + /* Clear all floats */ + .uniForm:after, + .uniForm .buttonHolder:after, + .uniForm .ctrlHolder:after, + .uniForm .ctrlHolder .multiField:after, + .uniForm .inlineLabel:after{ content: "."; display: block; height: 0; line-height: 0; font-size: 0; clear: both; min-height: 0; visibility: hidden; } + + /* A class to be used on a label that contains a checkbox or a radio button */ + .uniForm .inlineLabel, + .uniForm .inlineLabels .inlineLabel, + .uniForm .blockLabels .inlineLabel{ width: auto; float: none; margin: 0; display: block; } + /* IE shows borders & padding on checkboxes and radio buttons if they are declared on an input element, remove them */ + /* Legacy/Inheritance fix */ + .uniForm .inlineLabel input, + .uniForm .inlineLabels .inlineLabel input, + .uniForm .blockLabels .inlineLabel input{ border: none; padding: 0; margin: 0; } + +/* ------------------------------------------------------------------------------ */ + + /* Styles for form controls where labels are above the input elements */ + /* Set the class of the parent (preferably to a fieldset) to .blockLabels */ + + .uniForm label, + .uniForm .label, + .uniForm .blockLabels label, + .uniForm .blockLabels .label{ display: block; float: none; padding: 0; line-height: 100%; width: auto; } + + /* Float the input elements */ + .uniForm .textInput, + .uniForm .blockLabels .textInput, + .uniForm .blockLabels .fileUpload, + .uniForm .selectInput, + .uniForm .blockLabels .selectInput, + .uniForm .blockLabels select, + .uniForm textarea, + .uniForm .blockLabels textarea{ float: left; } + + /* Postition the hints */ + .uniForm .formHint, + .uniForm .blockLabels .formHint{ float: right; margin: 0; clear: none; } + + /* Position the elements inside combo boxes (multiple selects/checkboxes/radio buttons per unit) */ + .uniForm .multiField, + .uniForm .blockLabels .multiField{ width: auto; float: left; } + .uniForm .multiField .inlineLabel, + .uniForm .blockLabels .multiField .inlineLabel{ display: block; margin: 0 0 .5em 0; } + .uniForm .multiField .blockLabel, + .uniForm .blockLabels .multiField .blockLabel{ float: left; width: auto; margin: 0; } + .uniForm .multiField .blockLabel .textInput, + .uniForm .multiField .blockLabel .selectInput, + .uniForm .multiField .blockLabel select, + .uniForm .blockLabels .multiField .blockLabel .textInput, + .uniForm .blockLabels .multiField .blockLabel .selectInput, + .uniForm .blockLabels .multiField .blockLabel select{ width: 100%; margin: 0; } + +/* ------------------------------------------------------------------------------ */ + + /* Styles for form controls where labels are in line with the input elements */ + /* Set the class of the parent (preferably to a fieldset) to .inlineLabels */ + .uniForm .inlineLabels label, + .uniForm .inlineLabels .label{ float: left; margin: 0; padding: 0; line-height: 100%; position: relative; } + + /* Float the input elements */ + .uniForm .inlineLabels .textInput, + .uniForm .inlineLabels .fileUpload, + .uniForm .inlineLabels .selectInput, + .uniForm .inlineLabels select, + .uniForm .inlineLabels textarea{ float: left; } + + /* Postition the hints */ + .uniForm .inlineLabels .formHint{ clear: both; float: none; } + .uniForm .inlineLabels .multiField{ float: left; } + .uniForm .inlineLabels .multiField .inlineLabel{} + .uniForm .inlineLabels .multiField .blockLabel{} + .uniForm .inlineLabels .multiField .blockLabel .textInput, + .uniForm .inlineLabels .multiField .blockLabel .selectInput, + .uniForm .inlineLabels .multiField .blockLabel select{ display: block; width: 100%; float: none; } + .uniForm .inlineLabels .multiField select{ float: left; } + +/* ------------------------------------------------------------------------------ */ + + /* Required fields asterisk styling for .blockLabels */ + .uniForm label em, + .uniForm .label em, + .uniForm .blockLabels label em, + .uniForm .blockLabels .label em{ position: absolute; left: -7px; } + + /* Required fields asterisk styling for .inlineLabels */ + .uniForm .inlineLabels label em, + .uniForm .inlineLabels .label em{ display: block; position: absolute; left: auto; right: 0; font-style: normal; font-weight: bold; } + .uniForm .inlineLabel em{ position: absolute; left: 7px; } + +/* ------------------------------------------------------------------------------ */ + + /* Messages */ + .uniForm #errorMsg, + .uniForm .error{ + } + .uniForm #errorMsg dt, + .uniForm #errorMsg h3{ + } + .uniForm #errorMsg dd{ + } + .uniForm #errorMsg ol{ + } + .uniForm #errorMsg ol li{ + } + .uniForm .errorField{ + } + + .uniForm #OKMsg{ + } + +/* ------------------------------------------------------------------------------ */ + + /* Columns */ + + .uniForm .col{ float: left; } + .uniForm .col.first{} + .uniForm .col.last{} \ No newline at end of file diff --git a/interface/ispconfig/interface/themes/default/css/screen/uni-form.css b/interface/ispconfig/interface/themes/default/css/screen/uni-form.css new file mode 100644 index 0000000000000000000000000000000000000000..008885af58e4628773459ac87c8e0e45997eb91f --- /dev/null +++ b/interface/ispconfig/interface/themes/default/css/screen/uni-form.css @@ -0,0 +1,130 @@ +/* Keep in mind that wherever you see 'Required property' it means that the property must exist */ + +/* ------------------------------------------------------------------------------ */ + + /* Generals */ + .uniForm fieldset{} + .uniForm fieldset legend{ color: #333; font-weight: bold; font-size: 100%; margin: 0; padding: 1.5em 1.5em 1.5em 0; } + + /* This is the main unit that contains our form elements */ + .uniForm .ctrlHolder{ padding: 3px; border-bottom: 1px dotted #dfdfdf; } + + .uniForm .buttonHolder{ + text-align: right; + background: #CEDEEF url("../../images/buttonHolder_bg.gif") no-repeat right; + margin: 1em 0; + padding: 8px; + } + .uniForm .resetButton{ float: left; } + .uniForm .primaryAction{ font-weight: bold; } + + /* This class gets added to div.ctrlHolder to highlight the row */ + .uniForm .focused{ background: #fffcdf; } + + /* .inlineLabel is used for inputs within labels - checkboxes and radio buttons */ + .uniForm .inlineLabel input, + .uniForm .inlineLabels .inlineLabel input, + .uniForm .blockLabels .inlineLabel input{ float: left; margin: 0 .4em 0 0; } + .uniForm .inlineLabel span{ float: left; width: 90%; } + +/* ------------------------------------------------------------------------------ */ + + /* .blockLabels (default style, will be applied even if you don't class the parent element) */ + .uniForm .blockLabels .ctrlHolder{} + + .uniForm label, + .uniForm .blockLabels label, + .uniForm .blockLabels .label{ margin: 0 0 .5em 0; } + + .uniForm .textInput, + .uniForm .blockLabels .textInput, + .uniForm .blockLabels .fileUpload{ width: 43%; /* <- Required property */ } + + .uniForm .selectInput, + .uniForm select, + .uniForm .blockLabels .selectInput, + .uniForm .blockLabels select{ width: 43.5%; /* <- Required property */ } + .uniForm textarea, + .uniForm .blockLabels textarea{ width: 43%; /* <- Required property */ height: 12em; } + + .uniForm .formHint, + .uniForm .blockLabels .formHint{ width: 55%; /* <- Required property */ font-size: .9em; color: #777; position: relative; top: -.5em; } + + .uniForm .multiField, + .uniForm .blockLabels .multiField{ width: 43%; } + .uniForm .multiField .inlineLabel, + .uniForm .blockLabels .multiField .inlineLabel{ display: block; margin: 0 0 .5em 0; } + .uniForm .multiField .blockLabel, + .uniForm .blockLabels .multiField .blockLabel{ width: 30%; margin: 0 10px 0 0; } + .uniForm .multiField .blockLabel .textInput, + .uniForm .multiField .blockLabel .selectInput, + .uniForm .multiField .blockLabel select, + .uniForm .blockLabels .multiField .blockLabel .textInput, + .uniForm .blockLabels .multiField .blockLabel .selectInput, + .uniForm .blockLabels .multiField .blockLabel select{ width: 100%; margin: .3em 0 0 0; } + +/* ------------------------------------------------------------------------------ */ + + /* .inlineLabels */ + .uniForm .inlineLabels .ctrlHolder{} + + .uniForm .inlineLabels label, + .uniForm .inlineLabels .label{ width: 20%; /* <- Required property */ margin: .3em 2% 0 0; /* <- Required property */ } + + .uniForm .inlineLabels .textInput, + .uniForm .inlineLabels .fileUpload{ width: 35%; /* <- Required property */ } + + .uniForm .inlineLabels .selectInput, + .uniForm .inlineLabels select{ width: 35%; /* <- Required property */ } + + .uniForm .inlineLabels textarea{ width: 35%; /* <- Required property */ height: 12em; } + + .uniForm .inlineLabels .formHint{ margin-top: 0; margin-left: 22%; font-size: .9em; color: #777; position: static; } + + .uniForm .inlineLabels .multiField{ width: 60%; /* <- Required property */ margin: 0 0 .3em 0; } + .uniForm .inlineLabels .multiField .inlineLabel{ display: block; margin: 0 0 .5em 0; } + .uniForm .inlineLabels .multiField .blockLabel{ float: left; width: 26%; margin: 0 3% 0 0; } + .uniForm .inlineLabels .multiField .blockLabel .textInput, + .uniForm .inlineLabels .multiField .blockLabel .selectInput, + .uniForm .inlineLabels .multiField .blockLabel select{ width: 100%; margin: .3em 0 0 0; } + +/* Focus pseudoclasses */ +.uniForm .ctrlHolder .textInput:focus{ outline: none; /* Get rid of the 'glow' effect in WebKit, optional */ } +.uniForm .ctrlHolder textarea:focus{ outline: none; /* Get rid of the 'glow' effect in WebKit, optional */ } +.uniForm div.focused .formHint{ color: #333; } + +/* Columns (they are floated left by default) */ +.uniForm .col{ width: 37.9%; /* <- Required property */ margin: 0 2% 20px 0; } +/* Use .first and .last classes to control the layout/spacing of your columns */ +.uniForm .col.first{ width: 39%; /* <- Required property */ float: left; clear: none; } +.uniForm .col.last{ width: 39%; /* <- Required property */ float: right; clear: none; margin-right: 0; } + +/* Messages */ +.uniForm #errorMsg{ background: #ffdfdf; border: 1px solid #df7d7d; border-width: 1px 0; margin: 1.5em 0 1.5em 0; padding: 7px; } +.uniForm .error{ background: #ffdfdf; border: 1px solid #df7d7d; border-width: 1px 0; } + + .uniForm #errorMsg dt, .uniForm #errorMsg h3{ margin: 0 0 .5em 0; font-size: 100%; line-height: 100%; font-weight: bold; } + .uniForm #errorMsg dd{ margin: 0; padding: 0; } + .uniForm #errorMsg ol{ margin: 0; padding: 0; } + .uniForm #errorMsg ol li{ margin: 0; padding: 2px; list-style-position: inside; border-bottom: 1px dotted #df7d7d; position: relative; } + .uniForm .errorField{ color: #af4c4c; margin: 0 0 6px 0; padding: 4px; background: #ffbfbf; } + +.uniForm #OKMsg{ background: #C8FFBF; border: 1px solid #A2EF95; border-width: 1px 0; margin: 1.5em 0 1.5em 0; padding: 7px; } + .uniForm #OKMsg p{ margin: 0; } + +/* +IT IS STRONGLY ADVISED TO MAKE YOUR CHANGES AFTER THIS COMMENT BY REPEATING (COPYING) THE SELECTOR FROM ABOVE, +AND MODIFYING IT WITH YOUR OWN PROPERTIES/VALUES. THIS IS RECOMMENDED BECAUSE IF YOU HAPPEN TO RUN INTO TROUBLE, +YOU CAN VERY EASILY REVERT TO A GENERIC STYLE OF UNI-FORM. BEST OF LUCK... +*/ + +/* ------------------------------------------------------------------------------ */ + +/* This is the main unit that contains our form elements */ + +.uniForm .textInput, .uniForm .selectInput, .uniForm textarea { + background:#FFFFFF none repeat scroll 0 0; + border: 1px solid #DFDFDF; + padding: 1px; +} + diff --git a/interface/ispconfig/interface/themes/default/header_logo.png b/interface/ispconfig/interface/themes/default/header_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..38ba1ebeb45ebb798f808b1d2a06da2b8bad0d97 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/header_logo.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/ad.png b/interface/ispconfig/interface/themes/default/icons/flags/ad.png new file mode 100644 index 0000000000000000000000000000000000000000..625ca84f9ec596848d4b967b5556fda897ca7183 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/ad.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/ae.png b/interface/ispconfig/interface/themes/default/icons/flags/ae.png new file mode 100644 index 0000000000000000000000000000000000000000..ef3a1ecfccdfe9cf7e9fc086a2c6c010f7977ed8 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/ae.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/af.png b/interface/ispconfig/interface/themes/default/icons/flags/af.png new file mode 100644 index 0000000000000000000000000000000000000000..a4742e299f517aee16c248e40eccad39ac34c9e9 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/af.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/ag.png b/interface/ispconfig/interface/themes/default/icons/flags/ag.png new file mode 100644 index 0000000000000000000000000000000000000000..556d5504dc28d89be22ec1883f12e8d8c07d5f41 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/ag.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/ai.png b/interface/ispconfig/interface/themes/default/icons/flags/ai.png new file mode 100644 index 0000000000000000000000000000000000000000..74ed29d92616c86757d3c0ec04378301c8f591b4 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/ai.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/al.png b/interface/ispconfig/interface/themes/default/icons/flags/al.png new file mode 100644 index 0000000000000000000000000000000000000000..92354cb6e257be2cade71cb825027ce8d9efc06d Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/al.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/am.png b/interface/ispconfig/interface/themes/default/icons/flags/am.png new file mode 100644 index 0000000000000000000000000000000000000000..344a2a86c43d52f490455d0fe582da93e07175b2 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/am.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/an.png b/interface/ispconfig/interface/themes/default/icons/flags/an.png new file mode 100644 index 0000000000000000000000000000000000000000..633e4b89fded98256a8d142dfb60a8058f7e6b67 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/an.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/ao.png b/interface/ispconfig/interface/themes/default/icons/flags/ao.png new file mode 100644 index 0000000000000000000000000000000000000000..bcbd1d6d40d8665ed9b1001c490ce48befabb258 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/ao.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/aq.png b/interface/ispconfig/interface/themes/default/icons/flags/aq.png new file mode 100644 index 0000000000000000000000000000000000000000..9c6602f263126bf6ebd695436cfeb9aa20b8cda4 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/aq.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/ar.png b/interface/ispconfig/interface/themes/default/icons/flags/ar.png new file mode 100644 index 0000000000000000000000000000000000000000..e5ef8f1fcddb9fa0b89c353430e9640c122445cc Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/ar.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/as.png b/interface/ispconfig/interface/themes/default/icons/flags/as.png new file mode 100644 index 0000000000000000000000000000000000000000..32f30e4ce4eedd22d4f09c4f3a46c52dd064f113 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/as.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/at.png b/interface/ispconfig/interface/themes/default/icons/flags/at.png new file mode 100644 index 0000000000000000000000000000000000000000..0f15f34f2883c4b4360fc871d7105309f1533282 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/at.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/au.png b/interface/ispconfig/interface/themes/default/icons/flags/au.png new file mode 100644 index 0000000000000000000000000000000000000000..a01389a745d51e16b01a9dc0a707572564a17625 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/au.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/aw.png b/interface/ispconfig/interface/themes/default/icons/flags/aw.png new file mode 100644 index 0000000000000000000000000000000000000000..a3579c2d621069c8128d7cf16440d5e45a3ab3cd Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/aw.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/ax.png b/interface/ispconfig/interface/themes/default/icons/flags/ax.png new file mode 100644 index 0000000000000000000000000000000000000000..1eea80a7b739bea4a249dd10a3457010525f60da Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/ax.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/az.png b/interface/ispconfig/interface/themes/default/icons/flags/az.png new file mode 100644 index 0000000000000000000000000000000000000000..4ee9fe5ced2610a60ff99e6cc4fbe80d7d53c624 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/az.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/ba.png b/interface/ispconfig/interface/themes/default/icons/flags/ba.png new file mode 100644 index 0000000000000000000000000000000000000000..c77499249c9c54700885c84465bc9039a433a2c9 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/ba.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/bb.png b/interface/ispconfig/interface/themes/default/icons/flags/bb.png new file mode 100644 index 0000000000000000000000000000000000000000..0df19c71d20d7fdc06e1cba01028983439b2bdae Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/bb.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/bd.png b/interface/ispconfig/interface/themes/default/icons/flags/bd.png new file mode 100644 index 0000000000000000000000000000000000000000..076a8bf87c0cedcce47099c6b74b59f2c9d1dbce Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/bd.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/be.png b/interface/ispconfig/interface/themes/default/icons/flags/be.png new file mode 100644 index 0000000000000000000000000000000000000000..d86ebc800a673e6cf357c33d00edef93e2df0787 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/be.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/bf.png b/interface/ispconfig/interface/themes/default/icons/flags/bf.png new file mode 100644 index 0000000000000000000000000000000000000000..ab5ce8fe1237a18d6809a5570024eb108cb14a3e Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/bf.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/bg.png b/interface/ispconfig/interface/themes/default/icons/flags/bg.png new file mode 100644 index 0000000000000000000000000000000000000000..0469f0607dc76eb60327c29e04d9585f3ef25dc7 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/bg.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/bh.png b/interface/ispconfig/interface/themes/default/icons/flags/bh.png new file mode 100644 index 0000000000000000000000000000000000000000..ea8ce68761bbd8ee06f80c487c24d4493abfb52d Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/bh.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/bi.png b/interface/ispconfig/interface/themes/default/icons/flags/bi.png new file mode 100644 index 0000000000000000000000000000000000000000..5cc2e30cfc47452d5bef949628e955a522d59e50 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/bi.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/bj.png b/interface/ispconfig/interface/themes/default/icons/flags/bj.png new file mode 100644 index 0000000000000000000000000000000000000000..1cc8b458a4ca83a29117c1ab9e6cd1e60a717db2 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/bj.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/bm.png b/interface/ispconfig/interface/themes/default/icons/flags/bm.png new file mode 100644 index 0000000000000000000000000000000000000000..c0c7aead8dfdeb942752d40cead84182c94f3c94 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/bm.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/bn.png b/interface/ispconfig/interface/themes/default/icons/flags/bn.png new file mode 100644 index 0000000000000000000000000000000000000000..8fb09849e9b5712e9cdd8a2c25035da201535cf5 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/bn.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/bo.png b/interface/ispconfig/interface/themes/default/icons/flags/bo.png new file mode 100644 index 0000000000000000000000000000000000000000..ce7ba522aa7e948d581478432643c230eed1a658 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/bo.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/br.png b/interface/ispconfig/interface/themes/default/icons/flags/br.png new file mode 100644 index 0000000000000000000000000000000000000000..9b1a5538b264a295021f4f717d4299bb8ed98d98 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/br.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/bs.png b/interface/ispconfig/interface/themes/default/icons/flags/bs.png new file mode 100644 index 0000000000000000000000000000000000000000..639fa6cfa9c4792d03fb09fa197faf7ae549bfdf Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/bs.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/bt.png b/interface/ispconfig/interface/themes/default/icons/flags/bt.png new file mode 100644 index 0000000000000000000000000000000000000000..1d512dfff42db1ea3e7c59fa7dd69319e789ee12 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/bt.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/bv.png b/interface/ispconfig/interface/themes/default/icons/flags/bv.png new file mode 100644 index 0000000000000000000000000000000000000000..160b6b5b79db15e623fa55e5774e5d160b933180 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/bv.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/bw.png b/interface/ispconfig/interface/themes/default/icons/flags/bw.png new file mode 100644 index 0000000000000000000000000000000000000000..fcb103941523e24b03726fbbd88ef213dd476577 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/bw.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/by.png b/interface/ispconfig/interface/themes/default/icons/flags/by.png new file mode 100644 index 0000000000000000000000000000000000000000..504774ec10efa9fdbedf75295ac88848f23a3908 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/by.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/bz.png b/interface/ispconfig/interface/themes/default/icons/flags/bz.png new file mode 100644 index 0000000000000000000000000000000000000000..be63ee1c623af897a81d80c8e60506d2c9bc0a43 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/bz.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/ca.png b/interface/ispconfig/interface/themes/default/icons/flags/ca.png new file mode 100644 index 0000000000000000000000000000000000000000..1f204193ae58c87efdd88d46700ccb48c2e1d0d8 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/ca.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/catalonia.png b/interface/ispconfig/interface/themes/default/icons/flags/catalonia.png new file mode 100644 index 0000000000000000000000000000000000000000..5041e308e3a0f57f5ef9651b574d49d30e5dc635 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/catalonia.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/cc.png b/interface/ispconfig/interface/themes/default/icons/flags/cc.png new file mode 100644 index 0000000000000000000000000000000000000000..aed3d3b4e4467c33717ab3e2f61596e06113f9bb Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/cc.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/cd.png b/interface/ispconfig/interface/themes/default/icons/flags/cd.png new file mode 100644 index 0000000000000000000000000000000000000000..5e489424884d2ec9e429f70d69af00edf242a077 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/cd.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/cf.png b/interface/ispconfig/interface/themes/default/icons/flags/cf.png new file mode 100644 index 0000000000000000000000000000000000000000..da687bdce928e32e4a2bcbed2f3d2d97f42d340c Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/cf.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/cg.png b/interface/ispconfig/interface/themes/default/icons/flags/cg.png new file mode 100644 index 0000000000000000000000000000000000000000..a859792ef32a02b41503b5ab5f216191af397e02 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/cg.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/ch.png b/interface/ispconfig/interface/themes/default/icons/flags/ch.png new file mode 100644 index 0000000000000000000000000000000000000000..242ec01aaf5ad351cb978a4eb650ad801a438b09 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/ch.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/ci.png b/interface/ispconfig/interface/themes/default/icons/flags/ci.png new file mode 100644 index 0000000000000000000000000000000000000000..3f2c62eb4d7dc192036af889b593b782dbe8abac Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/ci.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/ck.png b/interface/ispconfig/interface/themes/default/icons/flags/ck.png new file mode 100644 index 0000000000000000000000000000000000000000..746d3d6f758858c749523ac27c05c85930d10667 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/ck.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/cl.png b/interface/ispconfig/interface/themes/default/icons/flags/cl.png new file mode 100644 index 0000000000000000000000000000000000000000..29c6d61bd4f16075228cdc6e526aafc3443029d7 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/cl.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/cm.png b/interface/ispconfig/interface/themes/default/icons/flags/cm.png new file mode 100644 index 0000000000000000000000000000000000000000..f65c5bd5a79e2885060515be55f03a3ea4a15d95 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/cm.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/cn.png b/interface/ispconfig/interface/themes/default/icons/flags/cn.png new file mode 100644 index 0000000000000000000000000000000000000000..89144146219e6fbec7eaa89e1bf4b073d299569e Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/cn.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/co.png b/interface/ispconfig/interface/themes/default/icons/flags/co.png new file mode 100644 index 0000000000000000000000000000000000000000..a118ff4a146fbd40ce865ea3c93b9d20ab3f14a0 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/co.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/cr.png b/interface/ispconfig/interface/themes/default/icons/flags/cr.png new file mode 100644 index 0000000000000000000000000000000000000000..c7a3731794031667843f05ad3897a85c7c434877 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/cr.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/cs.png b/interface/ispconfig/interface/themes/default/icons/flags/cs.png new file mode 100644 index 0000000000000000000000000000000000000000..8254790ca72f98d9e79d94bdfcb8839b1fd434ad Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/cs.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/cu.png b/interface/ispconfig/interface/themes/default/icons/flags/cu.png new file mode 100644 index 0000000000000000000000000000000000000000..083f1d611c94a535e02954711486da244ec3c5d0 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/cu.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/cv.png b/interface/ispconfig/interface/themes/default/icons/flags/cv.png new file mode 100644 index 0000000000000000000000000000000000000000..a63f7eaf63c028615b2ded5878b5e14a7dbe962f Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/cv.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/cx.png b/interface/ispconfig/interface/themes/default/icons/flags/cx.png new file mode 100644 index 0000000000000000000000000000000000000000..48e31adbf4cc0074f40e95f87c1f103b91fe270e Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/cx.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/cy.png b/interface/ispconfig/interface/themes/default/icons/flags/cy.png new file mode 100644 index 0000000000000000000000000000000000000000..5b1ad6c07886e6963db439afff55d7056e3c5cd4 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/cy.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/cz.png b/interface/ispconfig/interface/themes/default/icons/flags/cz.png new file mode 100644 index 0000000000000000000000000000000000000000..c8403dd21fd15f46d501a766a7a97733462f3b22 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/cz.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/de.png b/interface/ispconfig/interface/themes/default/icons/flags/de.png new file mode 100644 index 0000000000000000000000000000000000000000..ac4a977362738ca7daa20784717f10f9617136b4 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/de.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/dj.png b/interface/ispconfig/interface/themes/default/icons/flags/dj.png new file mode 100644 index 0000000000000000000000000000000000000000..582af364f8a9cb680628beae33cc9a2dbe0559f4 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/dj.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/dk.png b/interface/ispconfig/interface/themes/default/icons/flags/dk.png new file mode 100644 index 0000000000000000000000000000000000000000..e2993d3c59ae78855f777c158a6aae6c1fb5c843 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/dk.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/dm.png b/interface/ispconfig/interface/themes/default/icons/flags/dm.png new file mode 100644 index 0000000000000000000000000000000000000000..5fbffcba3cb0f20016c9717614127b89db4c9664 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/dm.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/do.png b/interface/ispconfig/interface/themes/default/icons/flags/do.png new file mode 100644 index 0000000000000000000000000000000000000000..5a04932d87963bcb063497b1179cee12f407e18a Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/do.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/dz.png b/interface/ispconfig/interface/themes/default/icons/flags/dz.png new file mode 100644 index 0000000000000000000000000000000000000000..335c2391d39090d6b40a409870a74326665589c2 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/dz.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/ec.png b/interface/ispconfig/interface/themes/default/icons/flags/ec.png new file mode 100644 index 0000000000000000000000000000000000000000..0caa0b1e785295d003869330fc4e073dce07e7f6 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/ec.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/ee.png b/interface/ispconfig/interface/themes/default/icons/flags/ee.png new file mode 100644 index 0000000000000000000000000000000000000000..0c82efb7dde983e6ab0f6bebb3b2eb326ce3874a Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/ee.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/eg.png b/interface/ispconfig/interface/themes/default/icons/flags/eg.png new file mode 100644 index 0000000000000000000000000000000000000000..8a3f7a10b5757b006948ea4436fb242d02dc9a4e Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/eg.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/eh.png b/interface/ispconfig/interface/themes/default/icons/flags/eh.png new file mode 100644 index 0000000000000000000000000000000000000000..90a1195b47a6f12c70d06cb0bd0e4ea88d7bfb03 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/eh.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/england.png b/interface/ispconfig/interface/themes/default/icons/flags/england.png new file mode 100644 index 0000000000000000000000000000000000000000..3a7311d5617df952329b1e293fdfddc64e95ca72 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/england.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/er.png b/interface/ispconfig/interface/themes/default/icons/flags/er.png new file mode 100644 index 0000000000000000000000000000000000000000..13065ae99ccace42df97be8b594049f9f40dcc4f Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/er.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/es.png b/interface/ispconfig/interface/themes/default/icons/flags/es.png new file mode 100644 index 0000000000000000000000000000000000000000..c2de2d7111e3cb59cf6511dd2ab045e824bdb43e Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/es.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/et.png b/interface/ispconfig/interface/themes/default/icons/flags/et.png new file mode 100644 index 0000000000000000000000000000000000000000..2e893fa056c3d27448b6b9b6579486439ac6e490 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/et.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/europeanunion.png b/interface/ispconfig/interface/themes/default/icons/flags/europeanunion.png new file mode 100644 index 0000000000000000000000000000000000000000..d6d87115808a2a43c079fb8e1b33134ffb523c79 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/europeanunion.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/fam.png b/interface/ispconfig/interface/themes/default/icons/flags/fam.png new file mode 100644 index 0000000000000000000000000000000000000000..cf50c759eb28b5962720aa1ce0617a29003e477d Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/fam.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/fi.png b/interface/ispconfig/interface/themes/default/icons/flags/fi.png new file mode 100644 index 0000000000000000000000000000000000000000..14ec091b802cf24ebd9f8825f81cd2f6e360b46d Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/fi.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/fj.png b/interface/ispconfig/interface/themes/default/icons/flags/fj.png new file mode 100644 index 0000000000000000000000000000000000000000..cee998892eb316c3293ef2d52afec9218bdbbc03 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/fj.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/fk.png b/interface/ispconfig/interface/themes/default/icons/flags/fk.png new file mode 100644 index 0000000000000000000000000000000000000000..ceaeb27decb3f138ab5b385491c092557b79da92 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/fk.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/fm.png b/interface/ispconfig/interface/themes/default/icons/flags/fm.png new file mode 100644 index 0000000000000000000000000000000000000000..066bb247389893b9ac33893fe346732ef394d8d6 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/fm.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/fo.png b/interface/ispconfig/interface/themes/default/icons/flags/fo.png new file mode 100644 index 0000000000000000000000000000000000000000..cbceb809eb9b96d5d8ae231a53c4f4a98f0fcba9 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/fo.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/fr.png b/interface/ispconfig/interface/themes/default/icons/flags/fr.png new file mode 100644 index 0000000000000000000000000000000000000000..8332c4ec23c853944c29b02d7b32a88033f48a71 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/fr.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/ga.png b/interface/ispconfig/interface/themes/default/icons/flags/ga.png new file mode 100644 index 0000000000000000000000000000000000000000..0e0d434363abd6766f9e8a8c8c9ad7275d23702a Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/ga.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/gb.png b/interface/ispconfig/interface/themes/default/icons/flags/gb.png new file mode 100644 index 0000000000000000000000000000000000000000..ff701e19f6d2c0658fb23b1d94124cba4ce60851 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/gb.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/gd.png b/interface/ispconfig/interface/themes/default/icons/flags/gd.png new file mode 100644 index 0000000000000000000000000000000000000000..9ab57f5489bb9ebb6450cb27f4efe0cfb466144e Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/gd.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/ge.png b/interface/ispconfig/interface/themes/default/icons/flags/ge.png new file mode 100644 index 0000000000000000000000000000000000000000..728d97078df1d07241ae605dff2f2cac463be72e Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/ge.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/gf.png b/interface/ispconfig/interface/themes/default/icons/flags/gf.png new file mode 100644 index 0000000000000000000000000000000000000000..8332c4ec23c853944c29b02d7b32a88033f48a71 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/gf.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/gh.png b/interface/ispconfig/interface/themes/default/icons/flags/gh.png new file mode 100644 index 0000000000000000000000000000000000000000..4e2f8965914ddd3bd6be97674d2e40a9a3f7d26f Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/gh.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/gi.png b/interface/ispconfig/interface/themes/default/icons/flags/gi.png new file mode 100644 index 0000000000000000000000000000000000000000..e76797f62fedcbfca8c83c51951680d6a6e9081f Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/gi.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/gl.png b/interface/ispconfig/interface/themes/default/icons/flags/gl.png new file mode 100644 index 0000000000000000000000000000000000000000..ef12a73bf9628ff5a67b81bd980d9c5d2b2c0f05 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/gl.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/gm.png b/interface/ispconfig/interface/themes/default/icons/flags/gm.png new file mode 100644 index 0000000000000000000000000000000000000000..0720b667aff506d7892c5c301af04e6bbf932751 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/gm.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/gn.png b/interface/ispconfig/interface/themes/default/icons/flags/gn.png new file mode 100644 index 0000000000000000000000000000000000000000..ea660b01faefde01ad2527a6abcf7d1a5c1b0526 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/gn.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/gp.png b/interface/ispconfig/interface/themes/default/icons/flags/gp.png new file mode 100644 index 0000000000000000000000000000000000000000..dbb086d0012637103c0bebca861c10116ed3d527 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/gp.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/gq.png b/interface/ispconfig/interface/themes/default/icons/flags/gq.png new file mode 100644 index 0000000000000000000000000000000000000000..ebe20a28de06f3e6e520cea360cfc57586a5bec3 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/gq.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/gr.png b/interface/ispconfig/interface/themes/default/icons/flags/gr.png new file mode 100644 index 0000000000000000000000000000000000000000..8651ade7cbe030e85efc811a844d8f366c97a50c Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/gr.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/gs.png b/interface/ispconfig/interface/themes/default/icons/flags/gs.png new file mode 100644 index 0000000000000000000000000000000000000000..7ef0bf598d9aa7c12264551d5db06f44307911d1 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/gs.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/gt.png b/interface/ispconfig/interface/themes/default/icons/flags/gt.png new file mode 100644 index 0000000000000000000000000000000000000000..c43a70d36424b66f1627216ad988cd23a4be9285 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/gt.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/gu.png b/interface/ispconfig/interface/themes/default/icons/flags/gu.png new file mode 100644 index 0000000000000000000000000000000000000000..92f37c05330243ce2eae41bcd9a368c66d656875 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/gu.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/gw.png b/interface/ispconfig/interface/themes/default/icons/flags/gw.png new file mode 100644 index 0000000000000000000000000000000000000000..b37bcf06bf20520555542c58534333e92022d929 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/gw.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/gy.png b/interface/ispconfig/interface/themes/default/icons/flags/gy.png new file mode 100644 index 0000000000000000000000000000000000000000..22cbe2f5914953f1cdea98b7b0979b327ced9582 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/gy.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/hk.png b/interface/ispconfig/interface/themes/default/icons/flags/hk.png new file mode 100644 index 0000000000000000000000000000000000000000..d5c380ca9d84d30674f05b95c2f645b500626c07 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/hk.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/hm.png b/interface/ispconfig/interface/themes/default/icons/flags/hm.png new file mode 100644 index 0000000000000000000000000000000000000000..a01389a745d51e16b01a9dc0a707572564a17625 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/hm.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/hn.png b/interface/ispconfig/interface/themes/default/icons/flags/hn.png new file mode 100644 index 0000000000000000000000000000000000000000..96f838859fd2aed975f5f4134050fdbc0486ce1e Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/hn.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/hr.png b/interface/ispconfig/interface/themes/default/icons/flags/hr.png new file mode 100644 index 0000000000000000000000000000000000000000..696b515460ddb670acb7e9de4438aaf21fc5fb77 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/hr.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/ht.png b/interface/ispconfig/interface/themes/default/icons/flags/ht.png new file mode 100644 index 0000000000000000000000000000000000000000..416052af772d719132c152e26649635a97a63a94 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/ht.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/hu.png b/interface/ispconfig/interface/themes/default/icons/flags/hu.png new file mode 100644 index 0000000000000000000000000000000000000000..7baafe44ddcaec29ad9f187f759a7fa3a1a5df00 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/hu.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/id.png b/interface/ispconfig/interface/themes/default/icons/flags/id.png new file mode 100644 index 0000000000000000000000000000000000000000..c6bc0fafac79403c97c64ba0228d35f250d05b57 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/id.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/ie.png b/interface/ispconfig/interface/themes/default/icons/flags/ie.png new file mode 100644 index 0000000000000000000000000000000000000000..26baa31e182ddd14106e67de1ac092a7da8e4899 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/ie.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/il.png b/interface/ispconfig/interface/themes/default/icons/flags/il.png new file mode 100644 index 0000000000000000000000000000000000000000..2ca772d0b79b255872cde2fb29060bbbbad950f2 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/il.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/in.png b/interface/ispconfig/interface/themes/default/icons/flags/in.png new file mode 100644 index 0000000000000000000000000000000000000000..e4d7e81a98d705da8d7054e77e7d311805659678 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/in.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/io.png b/interface/ispconfig/interface/themes/default/icons/flags/io.png new file mode 100644 index 0000000000000000000000000000000000000000..3e74b6a316477b90cce8b5f2111f911b1c640950 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/io.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/iq.png b/interface/ispconfig/interface/themes/default/icons/flags/iq.png new file mode 100644 index 0000000000000000000000000000000000000000..878a351403a9a33fd9ae3af1ffd54739545f364d Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/iq.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/ir.png b/interface/ispconfig/interface/themes/default/icons/flags/ir.png new file mode 100644 index 0000000000000000000000000000000000000000..c5fd136aee534ecb59914e336cad18d18ead2a4a Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/ir.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/is.png b/interface/ispconfig/interface/themes/default/icons/flags/is.png new file mode 100644 index 0000000000000000000000000000000000000000..b8f6d0f06675a9570c2c6e696ee51282097c3876 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/is.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/it.png b/interface/ispconfig/interface/themes/default/icons/flags/it.png new file mode 100644 index 0000000000000000000000000000000000000000..89692f74f051cd43503744c3dab65c8ba773b7e2 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/it.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/jm.png b/interface/ispconfig/interface/themes/default/icons/flags/jm.png new file mode 100644 index 0000000000000000000000000000000000000000..7be119e03d203695325568174b72522124bb2f12 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/jm.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/jo.png b/interface/ispconfig/interface/themes/default/icons/flags/jo.png new file mode 100644 index 0000000000000000000000000000000000000000..11bd4972b6d5f134045d4e8ce134601ea9b5654f Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/jo.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/jp.png b/interface/ispconfig/interface/themes/default/icons/flags/jp.png new file mode 100644 index 0000000000000000000000000000000000000000..325fbad3ffd3075a4a84d8d898ad26ef7d3e0d56 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/jp.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/ke.png b/interface/ispconfig/interface/themes/default/icons/flags/ke.png new file mode 100644 index 0000000000000000000000000000000000000000..51879adf17c0c29167225a81645cf1123dda84a0 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/ke.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/kg.png b/interface/ispconfig/interface/themes/default/icons/flags/kg.png new file mode 100644 index 0000000000000000000000000000000000000000..0a818f67ea37e1bf1398b3e2f92a52e331abf4e7 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/kg.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/kh.png b/interface/ispconfig/interface/themes/default/icons/flags/kh.png new file mode 100644 index 0000000000000000000000000000000000000000..30f6bb1b9b6c5bf355f67a17531fa73beafa6639 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/kh.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/ki.png b/interface/ispconfig/interface/themes/default/icons/flags/ki.png new file mode 100644 index 0000000000000000000000000000000000000000..2dcce4b33ffe1f40d490cb1a2e03efe22ea56155 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/ki.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/km.png b/interface/ispconfig/interface/themes/default/icons/flags/km.png new file mode 100644 index 0000000000000000000000000000000000000000..812b2f56c5a2a6af805d9edd67d549952d5278ca Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/km.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/kn.png b/interface/ispconfig/interface/themes/default/icons/flags/kn.png new file mode 100644 index 0000000000000000000000000000000000000000..febd5b486f3f90056637b23caa26d838fbadd7d0 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/kn.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/kp.png b/interface/ispconfig/interface/themes/default/icons/flags/kp.png new file mode 100644 index 0000000000000000000000000000000000000000..d3d509aa874809a323ea99f3b37ece8a02201f77 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/kp.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/kr.png b/interface/ispconfig/interface/themes/default/icons/flags/kr.png new file mode 100644 index 0000000000000000000000000000000000000000..9c0a78eb942da568f9cdac7190c17e23cceda7ed Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/kr.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/kw.png b/interface/ispconfig/interface/themes/default/icons/flags/kw.png new file mode 100644 index 0000000000000000000000000000000000000000..96546da328ab142ab0c7370511cbdbeb9a20efaf Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/kw.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/ky.png b/interface/ispconfig/interface/themes/default/icons/flags/ky.png new file mode 100644 index 0000000000000000000000000000000000000000..15c5f8e4775b2b68e0360c1f4ff1f37e61611276 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/ky.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/kz.png b/interface/ispconfig/interface/themes/default/icons/flags/kz.png new file mode 100644 index 0000000000000000000000000000000000000000..45a8c887424cff6eb0471f5a1535139b965e241e Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/kz.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/la.png b/interface/ispconfig/interface/themes/default/icons/flags/la.png new file mode 100644 index 0000000000000000000000000000000000000000..e28acd018a21b62d2cc4b76eec7bbe1f714dfc6c Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/la.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/lb.png b/interface/ispconfig/interface/themes/default/icons/flags/lb.png new file mode 100644 index 0000000000000000000000000000000000000000..d0d452bf868e0cd6417f518f1dbe695f191ef392 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/lb.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/lc.png b/interface/ispconfig/interface/themes/default/icons/flags/lc.png new file mode 100644 index 0000000000000000000000000000000000000000..a47d065541b0d998da832e1981b479097a9b36aa Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/lc.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/li.png b/interface/ispconfig/interface/themes/default/icons/flags/li.png new file mode 100644 index 0000000000000000000000000000000000000000..6469909c013eb9b752ca001694620a229f5792c7 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/li.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/lk.png b/interface/ispconfig/interface/themes/default/icons/flags/lk.png new file mode 100644 index 0000000000000000000000000000000000000000..088aad6db9515dc659152b18ffdf60c269768777 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/lk.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/lr.png b/interface/ispconfig/interface/themes/default/icons/flags/lr.png new file mode 100644 index 0000000000000000000000000000000000000000..89a5bc7e70711575c1ee3b83cc2be7f0e1fb29c5 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/lr.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/ls.png b/interface/ispconfig/interface/themes/default/icons/flags/ls.png new file mode 100644 index 0000000000000000000000000000000000000000..33fdef101f74e38e2422bb85dc8a31bbf1da326b Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/ls.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/lt.png b/interface/ispconfig/interface/themes/default/icons/flags/lt.png new file mode 100644 index 0000000000000000000000000000000000000000..c8ef0da0919b1e77ca91232de0cdf0d99dc8d68f Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/lt.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/lu.png b/interface/ispconfig/interface/themes/default/icons/flags/lu.png new file mode 100644 index 0000000000000000000000000000000000000000..4cabba98ae70837922beadc41453b5f848f03854 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/lu.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/lv.png b/interface/ispconfig/interface/themes/default/icons/flags/lv.png new file mode 100644 index 0000000000000000000000000000000000000000..49b69981085ff54568907cd51a56a1e5d8b01ada Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/lv.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/ly.png b/interface/ispconfig/interface/themes/default/icons/flags/ly.png new file mode 100644 index 0000000000000000000000000000000000000000..b163a9f8a0660fc223c2648b22ed6a074fe28b21 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/ly.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/ma.png b/interface/ispconfig/interface/themes/default/icons/flags/ma.png new file mode 100644 index 0000000000000000000000000000000000000000..f386770280b92a96a02b13032e056c3adfebfa18 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/ma.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/mc.png b/interface/ispconfig/interface/themes/default/icons/flags/mc.png new file mode 100644 index 0000000000000000000000000000000000000000..1aa830f121ab8ee0107d03251a03fee7cbcf790b Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/mc.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/md.png b/interface/ispconfig/interface/themes/default/icons/flags/md.png new file mode 100644 index 0000000000000000000000000000000000000000..4e92c189044b7ec02a5b7a3a9460e1d01b354801 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/md.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/me.png b/interface/ispconfig/interface/themes/default/icons/flags/me.png new file mode 100644 index 0000000000000000000000000000000000000000..ac7253558ab939481a85cc06dcc4d73503afb9f0 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/me.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/mg.png b/interface/ispconfig/interface/themes/default/icons/flags/mg.png new file mode 100644 index 0000000000000000000000000000000000000000..d2715b3d0e11b3a92c4f33cfad6b4f3488d0310d Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/mg.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/mh.png b/interface/ispconfig/interface/themes/default/icons/flags/mh.png new file mode 100644 index 0000000000000000000000000000000000000000..fb523a8c39d40401b9abcfb144a73cbb2d76b286 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/mh.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/mk.png b/interface/ispconfig/interface/themes/default/icons/flags/mk.png new file mode 100644 index 0000000000000000000000000000000000000000..db173aaff21955d9aed640beb344986335a1d164 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/mk.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/ml.png b/interface/ispconfig/interface/themes/default/icons/flags/ml.png new file mode 100644 index 0000000000000000000000000000000000000000..2cec8ba440b76ab6ebef1bba4bcb924f6ba40eaf Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/ml.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/mm.png b/interface/ispconfig/interface/themes/default/icons/flags/mm.png new file mode 100644 index 0000000000000000000000000000000000000000..f464f67ffb4c7108d217a9f526acb17786641284 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/mm.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/mn.png b/interface/ispconfig/interface/themes/default/icons/flags/mn.png new file mode 100644 index 0000000000000000000000000000000000000000..9396355db45a8ee040c790782209868acaad4b85 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/mn.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/mo.png b/interface/ispconfig/interface/themes/default/icons/flags/mo.png new file mode 100644 index 0000000000000000000000000000000000000000..deb801dda2457f619d53bc176cc889d362cfa032 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/mo.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/mp.png b/interface/ispconfig/interface/themes/default/icons/flags/mp.png new file mode 100644 index 0000000000000000000000000000000000000000..298d588b14b9b19e04c26ab36266ace317b81d59 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/mp.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/mq.png b/interface/ispconfig/interface/themes/default/icons/flags/mq.png new file mode 100644 index 0000000000000000000000000000000000000000..010143b3867f21e7791b8254e806b325c13b2895 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/mq.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/mr.png b/interface/ispconfig/interface/themes/default/icons/flags/mr.png new file mode 100644 index 0000000000000000000000000000000000000000..319546b100864f32c26f29b54b87fe1aee73af21 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/mr.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/ms.png b/interface/ispconfig/interface/themes/default/icons/flags/ms.png new file mode 100644 index 0000000000000000000000000000000000000000..d4cbb433d8f9fe49f06585dc46ee15593e3e621c Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/ms.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/mt.png b/interface/ispconfig/interface/themes/default/icons/flags/mt.png new file mode 100644 index 0000000000000000000000000000000000000000..00af94871de66cd0fbf0ca8e46dc436d66e2f713 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/mt.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/mu.png b/interface/ispconfig/interface/themes/default/icons/flags/mu.png new file mode 100644 index 0000000000000000000000000000000000000000..b7fdce1bdd7d174a894a4a075743695301d32450 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/mu.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/mv.png b/interface/ispconfig/interface/themes/default/icons/flags/mv.png new file mode 100644 index 0000000000000000000000000000000000000000..5073d9ec47c3b98e18bd3cd8499433d463ab8e67 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/mv.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/mw.png b/interface/ispconfig/interface/themes/default/icons/flags/mw.png new file mode 100644 index 0000000000000000000000000000000000000000..13886e9f8bf65186eb96071d4399fbe077ec92a3 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/mw.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/mx.png b/interface/ispconfig/interface/themes/default/icons/flags/mx.png new file mode 100644 index 0000000000000000000000000000000000000000..5bc58ab3e3552b74d990d28a0f500e9eb6209dfe Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/mx.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/my.png b/interface/ispconfig/interface/themes/default/icons/flags/my.png new file mode 100644 index 0000000000000000000000000000000000000000..9034cbab2c02704b65fba6ecc4a7a1c1d053b6c5 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/my.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/mz.png b/interface/ispconfig/interface/themes/default/icons/flags/mz.png new file mode 100644 index 0000000000000000000000000000000000000000..76405e063d43f2f3b5b9cae4f76d9f1c73cea25b Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/mz.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/na.png b/interface/ispconfig/interface/themes/default/icons/flags/na.png new file mode 100644 index 0000000000000000000000000000000000000000..63358c67df905515b49cf50cd766834dea8c18ce Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/na.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/nc.png b/interface/ispconfig/interface/themes/default/icons/flags/nc.png new file mode 100644 index 0000000000000000000000000000000000000000..2cad28378232e91848d9a2c8bd9d72a9e6a635f8 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/nc.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/ne.png b/interface/ispconfig/interface/themes/default/icons/flags/ne.png new file mode 100644 index 0000000000000000000000000000000000000000..d85f424f38da0678471ef4b3dc697675118bc7e0 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/ne.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/nf.png b/interface/ispconfig/interface/themes/default/icons/flags/nf.png new file mode 100644 index 0000000000000000000000000000000000000000..f9bcdda12ca7b07b3d16bd88c759db2c82c88884 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/nf.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/ng.png b/interface/ispconfig/interface/themes/default/icons/flags/ng.png new file mode 100644 index 0000000000000000000000000000000000000000..3eea2e020756c41abf81f765659a864c174f89db Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/ng.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/ni.png b/interface/ispconfig/interface/themes/default/icons/flags/ni.png new file mode 100644 index 0000000000000000000000000000000000000000..3969aaaaee470644115aa805cc344d032d2faa29 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/ni.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/nl.png b/interface/ispconfig/interface/themes/default/icons/flags/nl.png new file mode 100644 index 0000000000000000000000000000000000000000..fe44791e32b790949b0317ab3c258864b9024ebe Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/nl.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/no.png b/interface/ispconfig/interface/themes/default/icons/flags/no.png new file mode 100644 index 0000000000000000000000000000000000000000..160b6b5b79db15e623fa55e5774e5d160b933180 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/no.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/np.png b/interface/ispconfig/interface/themes/default/icons/flags/np.png new file mode 100644 index 0000000000000000000000000000000000000000..aeb058b7ea8b5d88519dadc69cfe7cdba77a587f Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/np.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/nr.png b/interface/ispconfig/interface/themes/default/icons/flags/nr.png new file mode 100644 index 0000000000000000000000000000000000000000..705fc337ccd50d4d49709597d5bd4b946c0d8a32 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/nr.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/nu.png b/interface/ispconfig/interface/themes/default/icons/flags/nu.png new file mode 100644 index 0000000000000000000000000000000000000000..c3ce4aedda9bea0553b43c8d3d849eba6b3d2cd1 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/nu.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/nz.png b/interface/ispconfig/interface/themes/default/icons/flags/nz.png new file mode 100644 index 0000000000000000000000000000000000000000..10d6306d17429012904035e4097bf93a8d205971 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/nz.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/om.png b/interface/ispconfig/interface/themes/default/icons/flags/om.png new file mode 100644 index 0000000000000000000000000000000000000000..2ffba7e8c43f160bb0d9634fb9e6cb4093741340 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/om.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/pa.png b/interface/ispconfig/interface/themes/default/icons/flags/pa.png new file mode 100644 index 0000000000000000000000000000000000000000..9b2ee9a780955566cc7dc2f59ce175f32d3731a0 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/pa.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/pe.png b/interface/ispconfig/interface/themes/default/icons/flags/pe.png new file mode 100644 index 0000000000000000000000000000000000000000..62a04977fb2b29b96d01ffef3b88b6bf2ff05862 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/pe.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/pf.png b/interface/ispconfig/interface/themes/default/icons/flags/pf.png new file mode 100644 index 0000000000000000000000000000000000000000..771a0f652254b4e891fc73910aab38967864da54 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/pf.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/pg.png b/interface/ispconfig/interface/themes/default/icons/flags/pg.png new file mode 100644 index 0000000000000000000000000000000000000000..10d6233496c10e52ead975c5a504459fad68ffb8 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/pg.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/ph.png b/interface/ispconfig/interface/themes/default/icons/flags/ph.png new file mode 100644 index 0000000000000000000000000000000000000000..b89e15935d9daf25173f89a36d8111824fda5db5 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/ph.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/pk.png b/interface/ispconfig/interface/themes/default/icons/flags/pk.png new file mode 100644 index 0000000000000000000000000000000000000000..e9df70ca4d63a979e6bcea2399263c081ce5eaeb Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/pk.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/pl.png b/interface/ispconfig/interface/themes/default/icons/flags/pl.png new file mode 100644 index 0000000000000000000000000000000000000000..d413d010b5b097c4e0a4604eba86dad79567ed16 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/pl.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/pm.png b/interface/ispconfig/interface/themes/default/icons/flags/pm.png new file mode 100644 index 0000000000000000000000000000000000000000..ba91d2c7a0de26e554979f6351d42a1a4e22de3b Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/pm.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/pn.png b/interface/ispconfig/interface/themes/default/icons/flags/pn.png new file mode 100644 index 0000000000000000000000000000000000000000..aa9344f575bc92f4c1a5043e6e7d0a8b239daa64 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/pn.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/pr.png b/interface/ispconfig/interface/themes/default/icons/flags/pr.png new file mode 100644 index 0000000000000000000000000000000000000000..82d9130da452fc294baa03a349ec2e71259a80af Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/pr.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/ps.png b/interface/ispconfig/interface/themes/default/icons/flags/ps.png new file mode 100644 index 0000000000000000000000000000000000000000..f5f547762ed3a7f556b1cb8b12fb80ed17fe1c4e Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/ps.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/pt.png b/interface/ispconfig/interface/themes/default/icons/flags/pt.png new file mode 100644 index 0000000000000000000000000000000000000000..ece79801506ecf8c42397349b4fa2cfe8176b999 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/pt.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/pw.png b/interface/ispconfig/interface/themes/default/icons/flags/pw.png new file mode 100644 index 0000000000000000000000000000000000000000..6178b254a5dd2d91eeaa2a2adf124b6dba0af27f Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/pw.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/py.png b/interface/ispconfig/interface/themes/default/icons/flags/py.png new file mode 100644 index 0000000000000000000000000000000000000000..cb8723c06408828ce68a932ff472daabecc64139 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/py.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/qa.png b/interface/ispconfig/interface/themes/default/icons/flags/qa.png new file mode 100644 index 0000000000000000000000000000000000000000..ed4c621fa7181fb14c46325a76a16422653aafc7 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/qa.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/re.png b/interface/ispconfig/interface/themes/default/icons/flags/re.png new file mode 100644 index 0000000000000000000000000000000000000000..8332c4ec23c853944c29b02d7b32a88033f48a71 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/re.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/ro.png b/interface/ispconfig/interface/themes/default/icons/flags/ro.png new file mode 100644 index 0000000000000000000000000000000000000000..57e74a6510dd6a4b29668db181cb94727d1eb4b7 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/ro.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/rs.png b/interface/ispconfig/interface/themes/default/icons/flags/rs.png new file mode 100644 index 0000000000000000000000000000000000000000..9439a5b605d82713decf23aba9c63c8d719cc200 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/rs.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/ru.png b/interface/ispconfig/interface/themes/default/icons/flags/ru.png new file mode 100644 index 0000000000000000000000000000000000000000..47da4214fd9edb383687c1d4f84fe8b42a51ceb2 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/ru.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/rw.png b/interface/ispconfig/interface/themes/default/icons/flags/rw.png new file mode 100644 index 0000000000000000000000000000000000000000..535649178a885355c836b5c838d096ec3ce8d365 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/rw.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/sa.png b/interface/ispconfig/interface/themes/default/icons/flags/sa.png new file mode 100644 index 0000000000000000000000000000000000000000..b4641c7e8b0dd79aafaa73babdb525d3d2dc6a8e Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/sa.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/sb.png b/interface/ispconfig/interface/themes/default/icons/flags/sb.png new file mode 100644 index 0000000000000000000000000000000000000000..a9937ccf091a3faecacbd5101c6630ea0d0b16d8 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/sb.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/sc.png b/interface/ispconfig/interface/themes/default/icons/flags/sc.png new file mode 100644 index 0000000000000000000000000000000000000000..39ee37184e09c39dd05425db127288def220abb7 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/sc.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/scotland.png b/interface/ispconfig/interface/themes/default/icons/flags/scotland.png new file mode 100644 index 0000000000000000000000000000000000000000..a0e57b4122acbf0beea91277639f92c010afe103 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/scotland.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/sd.png b/interface/ispconfig/interface/themes/default/icons/flags/sd.png new file mode 100644 index 0000000000000000000000000000000000000000..eaab69eb78776f8593b41c8fdc3fd65a86119a0a Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/sd.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/se.png b/interface/ispconfig/interface/themes/default/icons/flags/se.png new file mode 100644 index 0000000000000000000000000000000000000000..1994653dac1fc1c6ee3c9fcb35c8af97f16eefc7 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/se.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/sg.png b/interface/ispconfig/interface/themes/default/icons/flags/sg.png new file mode 100644 index 0000000000000000000000000000000000000000..dd34d6121073fffcb2fcb5b9402b3e6361cded35 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/sg.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/sh.png b/interface/ispconfig/interface/themes/default/icons/flags/sh.png new file mode 100644 index 0000000000000000000000000000000000000000..4b1d2a29107be96413eb86e64a75ac7a3ba5793d Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/sh.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/si.png b/interface/ispconfig/interface/themes/default/icons/flags/si.png new file mode 100644 index 0000000000000000000000000000000000000000..bb1476ff5fe8e0d3af4fc6bd11e513d95fd9cccd Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/si.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/sj.png b/interface/ispconfig/interface/themes/default/icons/flags/sj.png new file mode 100644 index 0000000000000000000000000000000000000000..160b6b5b79db15e623fa55e5774e5d160b933180 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/sj.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/sk.png b/interface/ispconfig/interface/themes/default/icons/flags/sk.png new file mode 100644 index 0000000000000000000000000000000000000000..7ccbc8274ad8f76f28960b83f2bba2a619029d87 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/sk.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/sl.png b/interface/ispconfig/interface/themes/default/icons/flags/sl.png new file mode 100644 index 0000000000000000000000000000000000000000..12d812d29fa6ea097743074e4a341ccfc691946a Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/sl.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/sm.png b/interface/ispconfig/interface/themes/default/icons/flags/sm.png new file mode 100644 index 0000000000000000000000000000000000000000..3df2fdcf8c0b0cc9b581f704c466db1f15c0d422 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/sm.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/sn.png b/interface/ispconfig/interface/themes/default/icons/flags/sn.png new file mode 100644 index 0000000000000000000000000000000000000000..eabb71db4e8275a5bfb7b1b8f3a8374d50da95db Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/sn.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/so.png b/interface/ispconfig/interface/themes/default/icons/flags/so.png new file mode 100644 index 0000000000000000000000000000000000000000..4a1ea4b29b3f541f047dead7c202fd3b566575a9 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/so.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/sr.png b/interface/ispconfig/interface/themes/default/icons/flags/sr.png new file mode 100644 index 0000000000000000000000000000000000000000..5eff9271d28cf8bf1cb85378600c4fa4997faa33 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/sr.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/st.png b/interface/ispconfig/interface/themes/default/icons/flags/st.png new file mode 100644 index 0000000000000000000000000000000000000000..2978557b19d7d4283aa9a00ca78dcdd2580edc7a Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/st.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/sv.png b/interface/ispconfig/interface/themes/default/icons/flags/sv.png new file mode 100644 index 0000000000000000000000000000000000000000..24987990b733244b23f8e03059f4924804662c75 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/sv.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/sy.png b/interface/ispconfig/interface/themes/default/icons/flags/sy.png new file mode 100644 index 0000000000000000000000000000000000000000..f5ce30dcb79b443ebc1615fe4889cc26e2d762b1 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/sy.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/sz.png b/interface/ispconfig/interface/themes/default/icons/flags/sz.png new file mode 100644 index 0000000000000000000000000000000000000000..914ee861d419bc6c1e8a7ac432e96deea7504d3a Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/sz.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/tc.png b/interface/ispconfig/interface/themes/default/icons/flags/tc.png new file mode 100644 index 0000000000000000000000000000000000000000..8fc1156bec3389e54d3c5bb8339901773a881e68 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/tc.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/td.png b/interface/ispconfig/interface/themes/default/icons/flags/td.png new file mode 100644 index 0000000000000000000000000000000000000000..667f21fd9d552df546386174e506a6b5b606a258 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/td.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/tf.png b/interface/ispconfig/interface/themes/default/icons/flags/tf.png new file mode 100644 index 0000000000000000000000000000000000000000..80529a4361941e01d1def5d581bf2847cf99fef6 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/tf.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/tg.png b/interface/ispconfig/interface/themes/default/icons/flags/tg.png new file mode 100644 index 0000000000000000000000000000000000000000..3aa00ad4dface0a9c23744ab451cec0443f187bf Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/tg.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/th.png b/interface/ispconfig/interface/themes/default/icons/flags/th.png new file mode 100644 index 0000000000000000000000000000000000000000..dd8ba91719ba641502bc7ffda16c25dc71b2066c Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/th.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/tj.png b/interface/ispconfig/interface/themes/default/icons/flags/tj.png new file mode 100644 index 0000000000000000000000000000000000000000..617bf6455f69849b7f66f43ff36093bbcb07fc3d Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/tj.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/tk.png b/interface/ispconfig/interface/themes/default/icons/flags/tk.png new file mode 100644 index 0000000000000000000000000000000000000000..67b8c8cb5191080a1cf33125cfd05efe0b9a76e0 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/tk.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/tl.png b/interface/ispconfig/interface/themes/default/icons/flags/tl.png new file mode 100644 index 0000000000000000000000000000000000000000..77da181e9c57a490c90a99ec08a8718ea8fc0835 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/tl.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/tm.png b/interface/ispconfig/interface/themes/default/icons/flags/tm.png new file mode 100644 index 0000000000000000000000000000000000000000..828020ecd0f6fc73348373c9e7a235fdced09de7 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/tm.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/tn.png b/interface/ispconfig/interface/themes/default/icons/flags/tn.png new file mode 100644 index 0000000000000000000000000000000000000000..183cdd3dc98c6957bde83f375a431e543a3ce9e4 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/tn.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/to.png b/interface/ispconfig/interface/themes/default/icons/flags/to.png new file mode 100644 index 0000000000000000000000000000000000000000..f89b8ba755f5609dc761384fe0656f73c854031e Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/to.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/tr.png b/interface/ispconfig/interface/themes/default/icons/flags/tr.png new file mode 100644 index 0000000000000000000000000000000000000000..be32f77e9910c0896c1ee8e7ed4f0edf815a517e Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/tr.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/tt.png b/interface/ispconfig/interface/themes/default/icons/flags/tt.png new file mode 100644 index 0000000000000000000000000000000000000000..2a11c1e20ac7f5a4761049adf5e326654b94069b Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/tt.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/tv.png b/interface/ispconfig/interface/themes/default/icons/flags/tv.png new file mode 100644 index 0000000000000000000000000000000000000000..28274c5fb40e5d3bacd7c05d9a1b8017eeaffa6c Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/tv.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/tw.png b/interface/ispconfig/interface/themes/default/icons/flags/tw.png new file mode 100644 index 0000000000000000000000000000000000000000..f31c654c99c023dbed9a7070103c4542326c4464 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/tw.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/tz.png b/interface/ispconfig/interface/themes/default/icons/flags/tz.png new file mode 100644 index 0000000000000000000000000000000000000000..c00ff7961424da8dabee61bfb53158c537e935e1 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/tz.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/ua.png b/interface/ispconfig/interface/themes/default/icons/flags/ua.png new file mode 100644 index 0000000000000000000000000000000000000000..09563a21941f2a94c937d43aceda1aa546246302 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/ua.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/ug.png b/interface/ispconfig/interface/themes/default/icons/flags/ug.png new file mode 100644 index 0000000000000000000000000000000000000000..33f4affadee432c0d4f499fd7e04736a29c48b06 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/ug.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/um.png b/interface/ispconfig/interface/themes/default/icons/flags/um.png new file mode 100644 index 0000000000000000000000000000000000000000..c1dd9654b0705371876d3e3d06f950be02de2a73 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/um.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/us.png b/interface/ispconfig/interface/themes/default/icons/flags/us.png new file mode 100644 index 0000000000000000000000000000000000000000..10f451fe85c41c6c9a06d543a57114ae2f87ecc1 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/us.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/uy.png b/interface/ispconfig/interface/themes/default/icons/flags/uy.png new file mode 100644 index 0000000000000000000000000000000000000000..31d948a067fe02d067a8c2e69f28cca446bc7c57 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/uy.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/uz.png b/interface/ispconfig/interface/themes/default/icons/flags/uz.png new file mode 100644 index 0000000000000000000000000000000000000000..fef5dc1709d69d32f6535fa9694069a56097adc9 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/uz.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/va.png b/interface/ispconfig/interface/themes/default/icons/flags/va.png new file mode 100644 index 0000000000000000000000000000000000000000..b31eaf225d6fd770e0557c2baf8747c91ce88983 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/va.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/vc.png b/interface/ispconfig/interface/themes/default/icons/flags/vc.png new file mode 100644 index 0000000000000000000000000000000000000000..8fa17b0612bd318a649571fbc4f68e4512c65c5b Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/vc.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/ve.png b/interface/ispconfig/interface/themes/default/icons/flags/ve.png new file mode 100644 index 0000000000000000000000000000000000000000..00c90f9aff09fb1b6d697c6a5680df01f37cad60 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/ve.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/vg.png b/interface/ispconfig/interface/themes/default/icons/flags/vg.png new file mode 100644 index 0000000000000000000000000000000000000000..415690798657a5921fd007b8ae85a5e5d414e7fa Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/vg.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/vi.png b/interface/ispconfig/interface/themes/default/icons/flags/vi.png new file mode 100644 index 0000000000000000000000000000000000000000..ed26915a3238534bf8f1249b75dd9ddde10db65a Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/vi.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/vn.png b/interface/ispconfig/interface/themes/default/icons/flags/vn.png new file mode 100644 index 0000000000000000000000000000000000000000..ec7cd48a3468a511e27c49a69194b0ef5564e615 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/vn.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/vu.png b/interface/ispconfig/interface/themes/default/icons/flags/vu.png new file mode 100644 index 0000000000000000000000000000000000000000..b3397bc63d718b344e604266259134e653925c9d Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/vu.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/wales.png b/interface/ispconfig/interface/themes/default/icons/flags/wales.png new file mode 100644 index 0000000000000000000000000000000000000000..e0d7cee1107205e017c840042272f12476ee0aa0 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/wales.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/wf.png b/interface/ispconfig/interface/themes/default/icons/flags/wf.png new file mode 100644 index 0000000000000000000000000000000000000000..9f9558734f0482439b2292a01f768639a287ac25 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/wf.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/ws.png b/interface/ispconfig/interface/themes/default/icons/flags/ws.png new file mode 100644 index 0000000000000000000000000000000000000000..c16950802ea95b40a4e024be6cce870b1991f40e Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/ws.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/ye.png b/interface/ispconfig/interface/themes/default/icons/flags/ye.png new file mode 100644 index 0000000000000000000000000000000000000000..468dfad03867903f825e82de35934f3191e5f638 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/ye.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/yt.png b/interface/ispconfig/interface/themes/default/icons/flags/yt.png new file mode 100644 index 0000000000000000000000000000000000000000..c298f378beee6b170a6909fd4f73ffbeb5997cff Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/yt.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/za.png b/interface/ispconfig/interface/themes/default/icons/flags/za.png new file mode 100644 index 0000000000000000000000000000000000000000..57c58e2119f402072640ca758657798b621f3fb1 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/za.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/zm.png b/interface/ispconfig/interface/themes/default/icons/flags/zm.png new file mode 100644 index 0000000000000000000000000000000000000000..c25b07beef894408ae11c3be294d6e0eeb28c0bb Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/zm.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/flags/zw.png b/interface/ispconfig/interface/themes/default/icons/flags/zw.png new file mode 100644 index 0000000000000000000000000000000000000000..53c97259b9b3e31c2f612e78344d035281682fa7 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/flags/zw.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x12/accept.png b/interface/ispconfig/interface/themes/default/icons/x12/accept.png new file mode 100644 index 0000000000000000000000000000000000000000..8ffc7273bb351f087cd08688dd32eb501f992406 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x12/accept.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x12/accept_blue.png b/interface/ispconfig/interface/themes/default/icons/x12/accept_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..655cda483dbd856c158f525bfd0fac82244010f7 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x12/accept_blue.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x12/accept_green.png b/interface/ispconfig/interface/themes/default/icons/x12/accept_green.png new file mode 100644 index 0000000000000000000000000000000000000000..27066192a8eeed27b2930bf169b929e7bfe66504 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x12/accept_green.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x12/arrow_2_left_round.png b/interface/ispconfig/interface/themes/default/icons/x12/arrow_2_left_round.png new file mode 100644 index 0000000000000000000000000000000000000000..7d53f1962b8b50054563d2acd46a92f419fe1cb3 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x12/arrow_2_left_round.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x12/arrow_2_right_round.png b/interface/ispconfig/interface/themes/default/icons/x12/arrow_2_right_round.png new file mode 100644 index 0000000000000000000000000000000000000000..d261b87a854886dad43b40b2a4f0075339e62a14 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x12/arrow_2_right_round.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x12/arrow_left_blue_round.png b/interface/ispconfig/interface/themes/default/icons/x12/arrow_left_blue_round.png new file mode 100644 index 0000000000000000000000000000000000000000..ef1375586b0f8ddeecdcf0fa6b2670cd054bfa1f Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x12/arrow_left_blue_round.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x12/arrow_right_blue_round.png b/interface/ispconfig/interface/themes/default/icons/x12/arrow_right_blue_round.png new file mode 100644 index 0000000000000000000000000000000000000000..bd0e72a9763aaf439364db3e161e4eb907273e30 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x12/arrow_right_blue_round.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x12/article.png b/interface/ispconfig/interface/themes/default/icons/x12/article.png new file mode 100644 index 0000000000000000000000000000000000000000..fe05910d4b445e9753f351574bcafff15745e292 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x12/article.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x12/article_text.png b/interface/ispconfig/interface/themes/default/icons/x12/article_text.png new file mode 100644 index 0000000000000000000000000000000000000000..fd89c6416a01a7954ff37a9f6301866dd74f8c29 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x12/article_text.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x12/bar_graph.png b/interface/ispconfig/interface/themes/default/icons/x12/bar_graph.png new file mode 100644 index 0000000000000000000000000000000000000000..165da50394bab82b20b5db273e0d6ea19baf7072 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x12/bar_graph.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x12/burst.png b/interface/ispconfig/interface/themes/default/icons/x12/burst.png new file mode 100644 index 0000000000000000000000000000000000000000..6fd39cf569bbf839417a7129e8f691cbf16d86ea Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x12/burst.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x12/calendar.png b/interface/ispconfig/interface/themes/default/icons/x12/calendar.png new file mode 100644 index 0000000000000000000000000000000000000000..767e5096c999a32661cb58e0b4b0854aa780582b Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x12/calendar.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x12/calendar2.png b/interface/ispconfig/interface/themes/default/icons/x12/calendar2.png new file mode 100644 index 0000000000000000000000000000000000000000..0904c11370e2c1ac816231749222ccfdcf0d1c35 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x12/calendar2.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x12/cancel.png b/interface/ispconfig/interface/themes/default/icons/x12/cancel.png new file mode 100644 index 0000000000000000000000000000000000000000..6f4436d6f05644a6f174fd6fa0c8ece9552f098c Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x12/cancel.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x12/cancel_round.png b/interface/ispconfig/interface/themes/default/icons/x12/cancel_round.png new file mode 100644 index 0000000000000000000000000000000000000000..ad6e6cdcfedcac7474820734bc9c8c79c17d67d9 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x12/cancel_round.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x12/clock.png b/interface/ispconfig/interface/themes/default/icons/x12/clock.png new file mode 100644 index 0000000000000000000000000000000000000000..1a40f985e8010ebe7f2b652b78681dcfd58b57ea Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x12/clock.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x12/code.png b/interface/ispconfig/interface/themes/default/icons/x12/code.png new file mode 100644 index 0000000000000000000000000000000000000000..cd19753cba708b5adc84fb72a63bb0d973f2cc3b Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x12/code.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x12/comment_blue.png b/interface/ispconfig/interface/themes/default/icons/x12/comment_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..dabcd82c11629855264bdadef064a836f563d845 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x12/comment_blue.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x12/dollar.png b/interface/ispconfig/interface/themes/default/icons/x12/dollar.png new file mode 100644 index 0000000000000000000000000000000000000000..017b2662b4ebb062360d2b7af01054cb7a040d92 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x12/dollar.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x12/double_comment.png b/interface/ispconfig/interface/themes/default/icons/x12/double_comment.png new file mode 100644 index 0000000000000000000000000000000000000000..ef8900e6731863e8193ca02323741622fdbc4e75 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x12/double_comment.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x12/download.png b/interface/ispconfig/interface/themes/default/icons/x12/download.png new file mode 100644 index 0000000000000000000000000000000000000000..41f8c15b8664ee650a64e6d7040dc7bd8c166492 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x12/download.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x12/envelope.png b/interface/ispconfig/interface/themes/default/icons/x12/envelope.png new file mode 100644 index 0000000000000000000000000000000000000000..3c3f9a52de5072f4435e64371f20dc89a5c27e44 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x12/envelope.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x12/flag_black.png b/interface/ispconfig/interface/themes/default/icons/x12/flag_black.png new file mode 100644 index 0000000000000000000000000000000000000000..35e2c05f9ef5d5cf42f603769eea1086801c1952 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x12/flag_black.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x12/flag_blue.png b/interface/ispconfig/interface/themes/default/icons/x12/flag_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..ae4484cde9f03e8ea6c3ea1513c2c47bda61700a Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x12/flag_blue.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x12/flag_green.png b/interface/ispconfig/interface/themes/default/icons/x12/flag_green.png new file mode 100644 index 0000000000000000000000000000000000000000..e1e4e1956fa3215e0f72f58c6dfb282bb06add4a Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x12/flag_green.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x12/flag_orange.png b/interface/ispconfig/interface/themes/default/icons/x12/flag_orange.png new file mode 100644 index 0000000000000000000000000000000000000000..b771e850daf74416e67c2aad8af0e0c45eeb6e58 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x12/flag_orange.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x12/flag_red.png b/interface/ispconfig/interface/themes/default/icons/x12/flag_red.png new file mode 100644 index 0000000000000000000000000000000000000000..2c1c7c1f3cf39600d27116c4b5e1772fa232fcba Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x12/flag_red.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x12/flag_yellow.png b/interface/ispconfig/interface/themes/default/icons/x12/flag_yellow.png new file mode 100644 index 0000000000000000000000000000000000000000..ee8a9a770e314f11090cc20cc2fd1fc71db4e2b9 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x12/flag_yellow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x12/folder.png b/interface/ispconfig/interface/themes/default/icons/x12/folder.png new file mode 100644 index 0000000000000000000000000000000000000000..f198233736c23c2f4ab423e1231daf07ce2a2e8f Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x12/folder.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x12/info.png b/interface/ispconfig/interface/themes/default/icons/x12/info.png new file mode 100644 index 0000000000000000000000000000000000000000..9f198a97ddb7c5ab34061ffa9bdcb8820c97d3fa Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x12/info.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x12/link.png b/interface/ispconfig/interface/themes/default/icons/x12/link.png new file mode 100644 index 0000000000000000000000000000000000000000..873905db8cba4933c15c79a673a747596d7dd029 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x12/link.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x12/lock.png b/interface/ispconfig/interface/themes/default/icons/x12/lock.png new file mode 100644 index 0000000000000000000000000000000000000000..b923a8f930e41e60c6973b91423ca86a51a0d71d Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x12/lock.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x12/magnify.png b/interface/ispconfig/interface/themes/default/icons/x12/magnify.png new file mode 100644 index 0000000000000000000000000000000000000000..3a067af8c269485c280125bbdefe9847ee87d808 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x12/magnify.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x12/minus.png b/interface/ispconfig/interface/themes/default/icons/x12/minus.png new file mode 100644 index 0000000000000000000000000000000000000000..c033b4c0aa3a35fa88366137c1b5112079b44dfc Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x12/minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x12/minus_round.png b/interface/ispconfig/interface/themes/default/icons/x12/minus_round.png new file mode 100644 index 0000000000000000000000000000000000000000..fd5d7beaa77228b2366b8d73a472a99255983cf7 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x12/minus_round.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x12/money.png b/interface/ispconfig/interface/themes/default/icons/x12/money.png new file mode 100644 index 0000000000000000000000000000000000000000..949a6107abc8af32fca12de6d869bec3bf1b68ee Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x12/money.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x12/new.png b/interface/ispconfig/interface/themes/default/icons/x12/new.png new file mode 100644 index 0000000000000000000000000000000000000000..91605949c2b4825c2f57946b2c27e5ad006a048b Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x12/new.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x12/pencil.png b/interface/ispconfig/interface/themes/default/icons/x12/pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..c878aec61a1709c1d054d81409a02cb014aa38b3 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x12/pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x12/pictures.png b/interface/ispconfig/interface/themes/default/icons/x12/pictures.png new file mode 100644 index 0000000000000000000000000000000000000000..d72fcc456aef479d87574d807cae9df65cac43e4 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x12/pictures.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x12/plus.png b/interface/ispconfig/interface/themes/default/icons/x12/plus.png new file mode 100644 index 0000000000000000000000000000000000000000..2094e8489b965a3b0fc1d9b7eaf42463bbc3da91 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x12/plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x12/printer.png b/interface/ispconfig/interface/themes/default/icons/x12/printer.png new file mode 100644 index 0000000000000000000000000000000000000000..0f4816a4317a9c5eb5d48631ba8513ce3fd25d28 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x12/printer.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x12/question_blue.png b/interface/ispconfig/interface/themes/default/icons/x12/question_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..2e928844ca8f591ae210abcae8f72588321fc9cf Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x12/question_blue.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x12/refresh.png b/interface/ispconfig/interface/themes/default/icons/x12/refresh.png new file mode 100644 index 0000000000000000000000000000000000000000..6826be92f1ece964e31f31e0f158ea3e59d8219a Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x12/refresh.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x12/rss.png b/interface/ispconfig/interface/themes/default/icons/x12/rss.png new file mode 100644 index 0000000000000000000000000000000000000000..1ced8aa11dcec072a9ebb81407c294f338d0b21a Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x12/rss.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x12/rss_round.png b/interface/ispconfig/interface/themes/default/icons/x12/rss_round.png new file mode 100644 index 0000000000000000000000000000000000000000..1c98061cbf922c05575bab904cfffdf59533be52 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x12/rss_round.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x12/security_green.png b/interface/ispconfig/interface/themes/default/icons/x12/security_green.png new file mode 100644 index 0000000000000000000000000000000000000000..aa89c0ec613b8eb701cc983cef01c49e30cd0a06 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x12/security_green.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x12/security_orange.png b/interface/ispconfig/interface/themes/default/icons/x12/security_orange.png new file mode 100644 index 0000000000000000000000000000000000000000..464f902318e15de61b6c55a47d80282e0bfa9677 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x12/security_orange.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x12/security_red.png b/interface/ispconfig/interface/themes/default/icons/x12/security_red.png new file mode 100644 index 0000000000000000000000000000000000000000..a000d28dada1d06a33e39bfed3a71d1792788394 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x12/security_red.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x12/star.png b/interface/ispconfig/interface/themes/default/icons/x12/star.png new file mode 100644 index 0000000000000000000000000000000000000000..eadb02a592079bdb02e2677a4003da6b41e3db74 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x12/star.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x12/star_blue.png b/interface/ispconfig/interface/themes/default/icons/x12/star_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..b22182a571d2a028003380243f0a84ce1b187f48 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x12/star_blue.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x12/stop.png b/interface/ispconfig/interface/themes/default/icons/x12/stop.png new file mode 100644 index 0000000000000000000000000000000000000000..9e4bcca265419d7e664ded3e3fb671975b31dafa Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x12/stop.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x12/stop_round.png b/interface/ispconfig/interface/themes/default/icons/x12/stop_round.png new file mode 100644 index 0000000000000000000000000000000000000000..0dd78cbb82c7e26e096f80313b735a33b9a14120 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x12/stop_round.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x12/upload.png b/interface/ispconfig/interface/themes/default/icons/x12/upload.png new file mode 100644 index 0000000000000000000000000000000000000000..5cdd1b59c3cf1443bcfb3187d5f41509841b216f Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x12/upload.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x12/world.png b/interface/ispconfig/interface/themes/default/icons/x12/world.png new file mode 100644 index 0000000000000000000000000000000000000000..e0453e219515f94519820709462ff00b96210ca0 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x12/world.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x12/world2.png b/interface/ispconfig/interface/themes/default/icons/x12/world2.png new file mode 100644 index 0000000000000000000000000000000000000000..5b520a6fa4909c992467d790b445012d2f413cd9 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x12/world2.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16-list/accept.png b/interface/ispconfig/interface/themes/default/icons/x16-list/accept.png new file mode 100644 index 0000000000000000000000000000000000000000..ee8b1d442c027546dfc0ae30bffb07af88a9d881 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16-list/accept.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16-list/accept_blue.png b/interface/ispconfig/interface/themes/default/icons/x16-list/accept_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..04cfb4477567eb63e7dd3510b7578b64e34206d1 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16-list/accept_blue.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16-list/accept_green.png b/interface/ispconfig/interface/themes/default/icons/x16-list/accept_green.png new file mode 100644 index 0000000000000000000000000000000000000000..d201296df6ba6ae88d1af630c1c0dfd6a5cf4336 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16-list/accept_green.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16-list/arrow_2_left_round.png b/interface/ispconfig/interface/themes/default/icons/x16-list/arrow_2_left_round.png new file mode 100644 index 0000000000000000000000000000000000000000..498bd59302d6e761e04693cd1b2dbc06649cdfca Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16-list/arrow_2_left_round.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16-list/arrow_2_right_round.png b/interface/ispconfig/interface/themes/default/icons/x16-list/arrow_2_right_round.png new file mode 100644 index 0000000000000000000000000000000000000000..ef7015a20c6e904d5052515f5910c008c632ef5f Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16-list/arrow_2_right_round.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16-list/arrow_left_blue_round.png b/interface/ispconfig/interface/themes/default/icons/x16-list/arrow_left_blue_round.png new file mode 100644 index 0000000000000000000000000000000000000000..34ec1ac15e2a4b44046281608816096c73f38bd2 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16-list/arrow_left_blue_round.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16-list/arrow_right_blue_round.png b/interface/ispconfig/interface/themes/default/icons/x16-list/arrow_right_blue_round.png new file mode 100644 index 0000000000000000000000000000000000000000..d0654414860b74084f780df8842195022fd96f3f Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16-list/arrow_right_blue_round.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16-list/article.png b/interface/ispconfig/interface/themes/default/icons/x16-list/article.png new file mode 100644 index 0000000000000000000000000000000000000000..c06b834e859493e3ccbd701f9aacd6e55174c5b6 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16-list/article.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16-list/article_text.png b/interface/ispconfig/interface/themes/default/icons/x16-list/article_text.png new file mode 100644 index 0000000000000000000000000000000000000000..767389ace9b3d2bd24ecd69fd5a28472e62aaa8a Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16-list/article_text.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16-list/bar_graph.png b/interface/ispconfig/interface/themes/default/icons/x16-list/bar_graph.png new file mode 100644 index 0000000000000000000000000000000000000000..b0ebbd5729989f6ca040d15dcdfd935bbe8e61cc Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16-list/bar_graph.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16-list/burst.png b/interface/ispconfig/interface/themes/default/icons/x16-list/burst.png new file mode 100644 index 0000000000000000000000000000000000000000..6011059f09228d2baf2b3b84f6730224fe304aba Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16-list/burst.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16-list/calendar.png b/interface/ispconfig/interface/themes/default/icons/x16-list/calendar.png new file mode 100644 index 0000000000000000000000000000000000000000..a6da5bc5fc55001cbb5233762677b26d391e32c4 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16-list/calendar.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16-list/calendar2.png b/interface/ispconfig/interface/themes/default/icons/x16-list/calendar2.png new file mode 100644 index 0000000000000000000000000000000000000000..49f206d3df1d6fc0fc8613f1455fa0e085615d0d Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16-list/calendar2.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16-list/cancel.png b/interface/ispconfig/interface/themes/default/icons/x16-list/cancel.png new file mode 100644 index 0000000000000000000000000000000000000000..c7ddc558ecd9352c2660d8f74e67a5dd4a27b8c0 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16-list/cancel.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16-list/cancel_round.png b/interface/ispconfig/interface/themes/default/icons/x16-list/cancel_round.png new file mode 100644 index 0000000000000000000000000000000000000000..f1682573c1579b6a08e36e9f5ad1082b7250734d Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16-list/cancel_round.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16-list/clock.png b/interface/ispconfig/interface/themes/default/icons/x16-list/clock.png new file mode 100644 index 0000000000000000000000000000000000000000..670a06d96bb5a46359d83e04c6ba894814b1f517 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16-list/clock.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16-list/code.png b/interface/ispconfig/interface/themes/default/icons/x16-list/code.png new file mode 100644 index 0000000000000000000000000000000000000000..f2fe70d6f1b40e0ea3a4fac781bc50aebc9ff1cb Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16-list/code.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16-list/comment_blue.png b/interface/ispconfig/interface/themes/default/icons/x16-list/comment_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..3741f39eb9a2f9da5fcdb3186faae02326dc2699 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16-list/comment_blue.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16-list/dollar.png b/interface/ispconfig/interface/themes/default/icons/x16-list/dollar.png new file mode 100644 index 0000000000000000000000000000000000000000..21d69807d8ae4a85c0d8d3f35840c23cf691b774 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16-list/dollar.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16-list/double_comment.png b/interface/ispconfig/interface/themes/default/icons/x16-list/double_comment.png new file mode 100644 index 0000000000000000000000000000000000000000..6c9d44d526b96aad49176f18c84d43174f93eb17 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16-list/double_comment.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16-list/download.png b/interface/ispconfig/interface/themes/default/icons/x16-list/download.png new file mode 100644 index 0000000000000000000000000000000000000000..db80f343afb0dce4f8b053e89f0327ba780441e0 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16-list/download.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16-list/envelope.png b/interface/ispconfig/interface/themes/default/icons/x16-list/envelope.png new file mode 100644 index 0000000000000000000000000000000000000000..e3117de7c4466fadcc22e35b95a45fee89ad383a Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16-list/envelope.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16-list/flag_black.png b/interface/ispconfig/interface/themes/default/icons/x16-list/flag_black.png new file mode 100644 index 0000000000000000000000000000000000000000..da546876f0375e78def1e16609532792035907a8 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16-list/flag_black.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16-list/flag_blue.png b/interface/ispconfig/interface/themes/default/icons/x16-list/flag_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..88a5e28c10134501fd2a3966f41912967be129d0 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16-list/flag_blue.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16-list/flag_green.png b/interface/ispconfig/interface/themes/default/icons/x16-list/flag_green.png new file mode 100644 index 0000000000000000000000000000000000000000..bc2117659a341020d0dd4318526e02f2667d4f5b Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16-list/flag_green.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16-list/flag_orange.png b/interface/ispconfig/interface/themes/default/icons/x16-list/flag_orange.png new file mode 100644 index 0000000000000000000000000000000000000000..384c4c93641d3ac822ddf4026ba2b9e979ba3b98 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16-list/flag_orange.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16-list/flag_red.png b/interface/ispconfig/interface/themes/default/icons/x16-list/flag_red.png new file mode 100644 index 0000000000000000000000000000000000000000..7c7cbceb3ba74a42a3ee4ee55dd8b03d6e51b7df Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16-list/flag_red.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16-list/flag_yellow.png b/interface/ispconfig/interface/themes/default/icons/x16-list/flag_yellow.png new file mode 100644 index 0000000000000000000000000000000000000000..8450ca3e7874d57e6c7c949c68c66f977282a020 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16-list/flag_yellow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16-list/folder.png b/interface/ispconfig/interface/themes/default/icons/x16-list/folder.png new file mode 100644 index 0000000000000000000000000000000000000000..3648f25cb6432f2efc3602bf75685ff1d0aa5bcf Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16-list/folder.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16-list/info.png b/interface/ispconfig/interface/themes/default/icons/x16-list/info.png new file mode 100644 index 0000000000000000000000000000000000000000..b46a2db0b36a8750e62bce6ba80736ff914c82f9 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16-list/info.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16-list/link.png b/interface/ispconfig/interface/themes/default/icons/x16-list/link.png new file mode 100644 index 0000000000000000000000000000000000000000..cc6bce91a3a4c5c098bbb8b13709b2e590b527ed Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16-list/link.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16-list/lock.png b/interface/ispconfig/interface/themes/default/icons/x16-list/lock.png new file mode 100644 index 0000000000000000000000000000000000000000..142cff28ef51ae00c4218c9a345eb7311e49b253 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16-list/lock.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16-list/magnify.png b/interface/ispconfig/interface/themes/default/icons/x16-list/magnify.png new file mode 100644 index 0000000000000000000000000000000000000000..898f89e1816838d5cbc777a1b7fb3fe3f7a22e9e Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16-list/magnify.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16-list/minus.png b/interface/ispconfig/interface/themes/default/icons/x16-list/minus.png new file mode 100644 index 0000000000000000000000000000000000000000..65942d74e47b95ce0df82cbc8eb302e748599624 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16-list/minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16-list/minus_round.png b/interface/ispconfig/interface/themes/default/icons/x16-list/minus_round.png new file mode 100644 index 0000000000000000000000000000000000000000..a8bdfc90ed0ccf5be190633c796aa818974e911c Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16-list/minus_round.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16-list/money.png b/interface/ispconfig/interface/themes/default/icons/x16-list/money.png new file mode 100644 index 0000000000000000000000000000000000000000..65f3b9e3ed43efec8f554d107f8af985bbed20d9 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16-list/money.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16-list/new.png b/interface/ispconfig/interface/themes/default/icons/x16-list/new.png new file mode 100644 index 0000000000000000000000000000000000000000..ff06720e07c67701a485fdbaa33b8076ad63f0b0 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16-list/new.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16-list/pencil.png b/interface/ispconfig/interface/themes/default/icons/x16-list/pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..228f0eeda8e57a80b9f5c1a0f30fad3d60f169f0 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16-list/pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16-list/pictures.png b/interface/ispconfig/interface/themes/default/icons/x16-list/pictures.png new file mode 100644 index 0000000000000000000000000000000000000000..647a8993e5cb186c91149c3511362f4bc8d2d187 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16-list/pictures.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16-list/plus.png b/interface/ispconfig/interface/themes/default/icons/x16-list/plus.png new file mode 100644 index 0000000000000000000000000000000000000000..95bcbb22360c19727d8203be42af5ddd46a4e8a4 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16-list/plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16-list/printer.png b/interface/ispconfig/interface/themes/default/icons/x16-list/printer.png new file mode 100644 index 0000000000000000000000000000000000000000..a9d4ad10625da78f84ef97526c0b4514f7585497 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16-list/printer.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16-list/question_blue.png b/interface/ispconfig/interface/themes/default/icons/x16-list/question_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..b5548f130908723bfb43c46cba4d32ec6b726ffa Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16-list/question_blue.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16-list/refresh.png b/interface/ispconfig/interface/themes/default/icons/x16-list/refresh.png new file mode 100644 index 0000000000000000000000000000000000000000..390307e101d7c57218d2dc50a17da156db1a74fd Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16-list/refresh.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16-list/rss.png b/interface/ispconfig/interface/themes/default/icons/x16-list/rss.png new file mode 100644 index 0000000000000000000000000000000000000000..4b18863148d27f2b4062761d3bebfb6b8b72b32b Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16-list/rss.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16-list/rss_round.png b/interface/ispconfig/interface/themes/default/icons/x16-list/rss_round.png new file mode 100644 index 0000000000000000000000000000000000000000..9fde673171ec609377fd7d428e05305e9a2a7446 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16-list/rss_round.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16-list/security_green.png b/interface/ispconfig/interface/themes/default/icons/x16-list/security_green.png new file mode 100644 index 0000000000000000000000000000000000000000..da88982a7ec51b76a63c619b53d178797e319104 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16-list/security_green.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16-list/security_orange.png b/interface/ispconfig/interface/themes/default/icons/x16-list/security_orange.png new file mode 100644 index 0000000000000000000000000000000000000000..2b49f6d69d2c23c902480265e7c1a77f5b59f13a Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16-list/security_orange.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16-list/security_red.png b/interface/ispconfig/interface/themes/default/icons/x16-list/security_red.png new file mode 100644 index 0000000000000000000000000000000000000000..47af1a1254ed5330cda3e853c9c4d7e821c71b2a Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16-list/security_red.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16-list/star.png b/interface/ispconfig/interface/themes/default/icons/x16-list/star.png new file mode 100644 index 0000000000000000000000000000000000000000..0fac8f818f4c84a544131de272e099cba3e7c7a0 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16-list/star.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16-list/star_blue.png b/interface/ispconfig/interface/themes/default/icons/x16-list/star_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..89313006e5e321309d00fefdc07c036ae4cfc37b Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16-list/star_blue.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16-list/stop.png b/interface/ispconfig/interface/themes/default/icons/x16-list/stop.png new file mode 100644 index 0000000000000000000000000000000000000000..4fcba9096c81f60b94f527f1ca2b55a5782e55d0 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16-list/stop.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16-list/stop_round.png b/interface/ispconfig/interface/themes/default/icons/x16-list/stop_round.png new file mode 100644 index 0000000000000000000000000000000000000000..d7d974a26181ba7ce465db2f431574d0412fb5a2 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16-list/stop_round.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16-list/upload.png b/interface/ispconfig/interface/themes/default/icons/x16-list/upload.png new file mode 100644 index 0000000000000000000000000000000000000000..d97a31d7787249156b5f8cf4dd0d954a56f311ae Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16-list/upload.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16-list/world.png b/interface/ispconfig/interface/themes/default/icons/x16-list/world.png new file mode 100644 index 0000000000000000000000000000000000000000..ad693127e1333778ffbb48cc2459087f923c19aa Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16-list/world.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16-list/world2.png b/interface/ispconfig/interface/themes/default/icons/x16-list/world2.png new file mode 100644 index 0000000000000000000000000000000000000000..a2e0505540afa6fe6eb687fb10d8d824f49b9aea Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16-list/world2.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/address_book.png b/interface/ispconfig/interface/themes/default/icons/x16/address_book.png new file mode 100644 index 0000000000000000000000000000000000000000..42d319894599dac08eca5fa9dd6026e424d65413 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/address_book.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/address_book__arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/address_book__arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..b8f88c0a288a426b14cb370db4417c14f84e49bb Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/address_book__arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/address_book__exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/address_book__exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..4147c47e078767802a1f565b127153b1149c9ffc Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/address_book__exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/address_book__minus.png b/interface/ispconfig/interface/themes/default/icons/x16/address_book__minus.png new file mode 100644 index 0000000000000000000000000000000000000000..0d788ad31169adf671f0ada6730a50389cc069fa Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/address_book__minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/address_book__pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/address_book__pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..45e8d1eaf1d0e57320029dccadb6cf32bdb0809f Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/address_book__pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/address_book__plus.png b/interface/ispconfig/interface/themes/default/icons/x16/address_book__plus.png new file mode 100644 index 0000000000000000000000000000000000000000..0287b93c1dacbdfc76056b2a4502743781df5493 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/address_book__plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/address_book_blue.png b/interface/ispconfig/interface/themes/default/icons/x16/address_book_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..e446b1b05830238ff93e2bd645ab436b651250a9 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/address_book_blue.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..56220a8b8a997a5436283a82aaddefdc16653648 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/arrow_000_small.png b/interface/ispconfig/interface/themes/default/icons/x16/arrow_000_small.png new file mode 100644 index 0000000000000000000000000000000000000000..c0f455af3e99f0b7fa714efb7efeff5233dc859b Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/arrow_000_small.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/arrow_045.png b/interface/ispconfig/interface/themes/default/icons/x16/arrow_045.png new file mode 100644 index 0000000000000000000000000000000000000000..8ebda3e6665027c9cdda94c84edaa4c74c29be7f Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/arrow_045.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/arrow_045_small.png b/interface/ispconfig/interface/themes/default/icons/x16/arrow_045_small.png new file mode 100644 index 0000000000000000000000000000000000000000..0f1bb5ad2f7a46f523163483f5ba21f77165c51d Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/arrow_045_small.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/arrow_090.png b/interface/ispconfig/interface/themes/default/icons/x16/arrow_090.png new file mode 100644 index 0000000000000000000000000000000000000000..601602eac4f5bbd9a772f0191fff86b1233b8eb0 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/arrow_090.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/arrow_090_small.png b/interface/ispconfig/interface/themes/default/icons/x16/arrow_090_small.png new file mode 100644 index 0000000000000000000000000000000000000000..4d77317804f13e67cbd2dce2370d82a8b91ddb0f Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/arrow_090_small.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/arrow_135.png b/interface/ispconfig/interface/themes/default/icons/x16/arrow_135.png new file mode 100644 index 0000000000000000000000000000000000000000..7a3b9638d4a7ccde5abe3d39b22ee14ce80694d4 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/arrow_135.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/arrow_135_small.png b/interface/ispconfig/interface/themes/default/icons/x16/arrow_135_small.png new file mode 100644 index 0000000000000000000000000000000000000000..bf077a9ac05c1cf6210cde6e37b82e25cb5d3844 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/arrow_135_small.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/arrow_180.png b/interface/ispconfig/interface/themes/default/icons/x16/arrow_180.png new file mode 100644 index 0000000000000000000000000000000000000000..5c411c346807f58e044fe6281e860e7f4c4b4510 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/arrow_180.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/arrow_180_small.png b/interface/ispconfig/interface/themes/default/icons/x16/arrow_180_small.png new file mode 100644 index 0000000000000000000000000000000000000000..ad9984967225d1e7bf3b1dd1ff362945755d9d08 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/arrow_180_small.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/arrow_225.png b/interface/ispconfig/interface/themes/default/icons/x16/arrow_225.png new file mode 100644 index 0000000000000000000000000000000000000000..ae5f4e2fb8cb72b74c9f9f146991e8ef0e345b63 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/arrow_225.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/arrow_225_small.png b/interface/ispconfig/interface/themes/default/icons/x16/arrow_225_small.png new file mode 100644 index 0000000000000000000000000000000000000000..f9156ebfa77d3c4d5e6bce43c3d116148a560553 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/arrow_225_small.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/arrow_270.png b/interface/ispconfig/interface/themes/default/icons/x16/arrow_270.png new file mode 100644 index 0000000000000000000000000000000000000000..16c2c20ed734df6d90fdd1e9eb084c719c098118 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/arrow_270.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/arrow_270_small.png b/interface/ispconfig/interface/themes/default/icons/x16/arrow_270_small.png new file mode 100644 index 0000000000000000000000000000000000000000..1382f7233cfc993020637251caea9f2efbde3868 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/arrow_270_small.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/arrow_315.png b/interface/ispconfig/interface/themes/default/icons/x16/arrow_315.png new file mode 100644 index 0000000000000000000000000000000000000000..7ca64a102f9811e78a2cc08cfe9d7f43bf4dd05c Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/arrow_315.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/arrow_315_small.png b/interface/ispconfig/interface/themes/default/icons/x16/arrow_315_small.png new file mode 100644 index 0000000000000000000000000000000000000000..5a5bd394d9c53e9ad810e00a982bb976b0b32d6f Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/arrow_315_small.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/arrow_circle.png b/interface/ispconfig/interface/themes/default/icons/x16/arrow_circle.png new file mode 100644 index 0000000000000000000000000000000000000000..728c405dccee0af0fe7b8df233c18f4c02fd3823 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/arrow_circle.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/arrow_circle_135.png b/interface/ispconfig/interface/themes/default/icons/x16/arrow_circle_135.png new file mode 100644 index 0000000000000000000000000000000000000000..b171a82e2f326f2d57b02c26927de9385ec6e517 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/arrow_circle_135.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/arrow_circle_225.png b/interface/ispconfig/interface/themes/default/icons/x16/arrow_circle_225.png new file mode 100644 index 0000000000000000000000000000000000000000..80a27991c054d37a5a3fbe533a8c88abeda8883d Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/arrow_circle_225.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/arrow_circle_315.png b/interface/ispconfig/interface/themes/default/icons/x16/arrow_circle_315.png new file mode 100644 index 0000000000000000000000000000000000000000..58d588012d709d671f30b78061c92c504844eb35 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/arrow_circle_315.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/arrow_circle_double.png b/interface/ispconfig/interface/themes/default/icons/x16/arrow_circle_double.png new file mode 100644 index 0000000000000000000000000000000000000000..5f841381e3b14f12bc316c1dd1c16fb8ecc5ba8e Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/arrow_circle_double.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/arrow_circle_double_135.png b/interface/ispconfig/interface/themes/default/icons/x16/arrow_circle_double_135.png new file mode 100644 index 0000000000000000000000000000000000000000..53bc8e0600532e9635340a3bf7c76128afccae59 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/arrow_circle_double_135.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/arrow_skip.png b/interface/ispconfig/interface/themes/default/icons/x16/arrow_skip.png new file mode 100644 index 0000000000000000000000000000000000000000..a24b58ac6ad4ddc10e16c5f89d8d1818e252743d Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/arrow_skip.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/arrow_skip_090.png b/interface/ispconfig/interface/themes/default/icons/x16/arrow_skip_090.png new file mode 100644 index 0000000000000000000000000000000000000000..fdc873008f1e29957c7d421115b100dfe5d7f20e Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/arrow_skip_090.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/arrow_skip_180.png b/interface/ispconfig/interface/themes/default/icons/x16/arrow_skip_180.png new file mode 100644 index 0000000000000000000000000000000000000000..3dd0aab5b7f98bc38281d25987b2ea6474a0ead7 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/arrow_skip_180.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/arrow_skip_270.png b/interface/ispconfig/interface/themes/default/icons/x16/arrow_skip_270.png new file mode 100644 index 0000000000000000000000000000000000000000..dce0f75396075e6a69cfe3900cf92c32945d9f64 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/arrow_skip_270.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/arrow_stop.png b/interface/ispconfig/interface/themes/default/icons/x16/arrow_stop.png new file mode 100644 index 0000000000000000000000000000000000000000..0ae7151551db7611c2d464f2c1d6bc9be03ef942 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/arrow_stop.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/arrow_stop_090.png b/interface/ispconfig/interface/themes/default/icons/x16/arrow_stop_090.png new file mode 100644 index 0000000000000000000000000000000000000000..f0b3b6441e4fd030fa8d1b0f58539dd4a0cd5ff8 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/arrow_stop_090.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/arrow_stop_180.png b/interface/ispconfig/interface/themes/default/icons/x16/arrow_stop_180.png new file mode 100644 index 0000000000000000000000000000000000000000..57848780d708fb5577dd7e2196571a3ef0cb7263 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/arrow_stop_180.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/arrow_stop_270.png b/interface/ispconfig/interface/themes/default/icons/x16/arrow_stop_270.png new file mode 100644 index 0000000000000000000000000000000000000000..34982db5181dadad636b112959be120f2301b3d8 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/arrow_stop_270.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/auction_hammer.png b/interface/ispconfig/interface/themes/default/icons/x16/auction_hammer.png new file mode 100644 index 0000000000000000000000000000000000000000..382cb608d04abfc56c80ee33497696183201b571 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/auction_hammer.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/auction_hammer__arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/auction_hammer__arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..f7d05229fabd8549b5b703ac8f0aa10046e91e35 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/auction_hammer__arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/auction_hammer__exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/auction_hammer__exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..9241f35fc402f6d562d4f7e87c75f3b4fe6505d8 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/auction_hammer__exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/auction_hammer__minus.png b/interface/ispconfig/interface/themes/default/icons/x16/auction_hammer__minus.png new file mode 100644 index 0000000000000000000000000000000000000000..682087bb013909442228fde8154494e706c04df8 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/auction_hammer__minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/auction_hammer__pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/auction_hammer__pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..d91e34d5229b970aa8a5ce20e9fc23a29b3ca351 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/auction_hammer__pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/auction_hammer__plus.png b/interface/ispconfig/interface/themes/default/icons/x16/auction_hammer__plus.png new file mode 100644 index 0000000000000000000000000000000000000000..836db16ff009df05b41602a2695f94fb6233d0d3 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/auction_hammer__plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/auction_hammer_gavel.png b/interface/ispconfig/interface/themes/default/icons/x16/auction_hammer_gavel.png new file mode 100644 index 0000000000000000000000000000000000000000..53e3ab060a47829012827ef84656125c470b2e52 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/auction_hammer_gavel.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/balloon.png b/interface/ispconfig/interface/themes/default/icons/x16/balloon.png new file mode 100644 index 0000000000000000000000000000000000000000..a1f23f5d0f7c43d3519cd4b4afc6ea1b2dcc0b91 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/balloon.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/balloon__arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/balloon__arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..372522701778d6f5d1846f781cd25f4a18c788dd Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/balloon__arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/balloon__exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/balloon__exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..1e44e7cb12fa0fe44c244821bdb2410b2413842c Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/balloon__exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/balloon__minus.png b/interface/ispconfig/interface/themes/default/icons/x16/balloon__minus.png new file mode 100644 index 0000000000000000000000000000000000000000..2794ede1ce41948752d01c058570a855f9341631 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/balloon__minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/balloon__pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/balloon__pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..8f1eea1f8697c4d4a3c789dbd0e216c470f3f924 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/balloon__pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/balloon__plus.png b/interface/ispconfig/interface/themes/default/icons/x16/balloon__plus.png new file mode 100644 index 0000000000000000000000000000000000000000..61b5438ddc395605b48ed8923802dd6ca4974ebe Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/balloon__plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/balloon_left.png b/interface/ispconfig/interface/themes/default/icons/x16/balloon_left.png new file mode 100644 index 0000000000000000000000000000000000000000..1bfe0de052775475755a60a8809594743f42e791 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/balloon_left.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/balloon_small.png b/interface/ispconfig/interface/themes/default/icons/x16/balloon_small.png new file mode 100644 index 0000000000000000000000000000000000000000..0db4cb8a84896d6c943831596363fdeff375d5a0 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/balloon_small.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/balloon_small_left.png b/interface/ispconfig/interface/themes/default/icons/x16/balloon_small_left.png new file mode 100644 index 0000000000000000000000000000000000000000..d362b9a2adb34e8c71fbf1f67bd8cf9367cd3c19 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/balloon_small_left.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/balloons.png b/interface/ispconfig/interface/themes/default/icons/x16/balloons.png new file mode 100644 index 0000000000000000000000000000000000000000..671d72d6e58337c27a0836d01ae60de495bc448e Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/balloons.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/balloons_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/balloons_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..a948e121ef89a5fc018eface9e40f25405d5016d Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/balloons_arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/balloons_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/balloons_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..78f9200b82b8b91491607ab6a27533f534c32015 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/balloons_exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/balloons_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/balloons_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..1ae44f28db98f5944791ec6c596b7542d8663666 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/balloons_minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/balloons_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/balloons_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..8856391c85ffb478edc782b9056f7eb1f0a1cce5 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/balloons_pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/balloons_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/balloons_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..6deae30b70524f47ee96b72154ab73f62d79fe35 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/balloons_plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/bandaid.png b/interface/ispconfig/interface/themes/default/icons/x16/bandaid.png new file mode 100644 index 0000000000000000000000000000000000000000..dafa64832ca340eb14f1b45c86ec5f931b45b4ea Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/bandaid.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/bandaid_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/bandaid_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..130dc4b0225df2b57354fde20c0f3c1fe6709e35 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/bandaid_arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/bandaid_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/bandaid_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..ac62a2b72566af85decda673734a54ca4b74452f Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/bandaid_exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/bandaid_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/bandaid_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..c08fc6e3134ee5fd8f424b13eae099f706e50e71 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/bandaid_minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/bandaid_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/bandaid_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..0aedc8787b755d3e5d6ff0d6e047f92a2e9e0239 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/bandaid_pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/bandaid_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/bandaid_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..2b59d871479fff8c8fc68ac6c8ea092778805fad Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/bandaid_plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/bandaid_small.png b/interface/ispconfig/interface/themes/default/icons/x16/bandaid_small.png new file mode 100644 index 0000000000000000000000000000000000000000..5db1eeda1ce63895d6d7237fee4c285e00a0b7e7 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/bandaid_small.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/bank.png b/interface/ispconfig/interface/themes/default/icons/x16/bank.png new file mode 100644 index 0000000000000000000000000000000000000000..d54c9de6a90d5397a683d45f673005d920a364e2 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/bank.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/bank_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/bank_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..1893396f90b6d825c68578d3d64e61d0dbef49aa Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/bank_arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/bank_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/bank_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..bbd1c5b8144a942928c47f359d0f0d6acab50f1c Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/bank_exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/bank_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/bank_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..22bc36ca29bae6164b54013d16641abd436ebe58 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/bank_minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/bank_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/bank_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..31f34931ade96509c980f6fd52ed195bf987e4e3 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/bank_pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/bank_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/bank_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..e727a1d2237e52a8aff61110a74a90d3d29f5ff5 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/bank_plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/bell.png b/interface/ispconfig/interface/themes/default/icons/x16/bell.png new file mode 100644 index 0000000000000000000000000000000000000000..b7c9440e3983b25a0722464f6997f55530e83d58 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/bell.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/bell__arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/bell__arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..3d47267f0942fcaca0cf8e512fd3db126e18274c Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/bell__arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/bell__exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/bell__exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..6dee0be1f45fe26a6dcd5cf5fa5df5be620de23f Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/bell__exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/bell__minus.png b/interface/ispconfig/interface/themes/default/icons/x16/bell__minus.png new file mode 100644 index 0000000000000000000000000000000000000000..83fb4f133ac6f9dd6c957705c78ab3d6d8bd3504 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/bell__minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/bell__pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/bell__pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..d93d5a27730dcd051f91626f6aaf4a6ee2590aff Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/bell__pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/bell__plus.png b/interface/ispconfig/interface/themes/default/icons/x16/bell__plus.png new file mode 100644 index 0000000000000000000000000000000000000000..3ecc8607503ac048261c205d90cf0ddd8c544f9f Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/bell__plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/bell_disable.png b/interface/ispconfig/interface/themes/default/icons/x16/bell_disable.png new file mode 100644 index 0000000000000000000000000000000000000000..ede39d19f8e1f52d0ce02cca9b70097f194b32cc Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/bell_disable.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/bin.png b/interface/ispconfig/interface/themes/default/icons/x16/bin.png new file mode 100644 index 0000000000000000000000000000000000000000..4464bf24e589abf3486e18f13be3b6cfd3d9a14c Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/bin.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/bin__arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/bin__arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..05a25e3df9cdc7d4e7896ab6779c28f664426b98 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/bin__arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/bin__exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/bin__exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..c83564146d6267e894d0a246705e3456c80e66b6 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/bin__exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/bin__minus.png b/interface/ispconfig/interface/themes/default/icons/x16/bin__minus.png new file mode 100644 index 0000000000000000000000000000000000000000..d9d58d6fdb4e9cf25169283a4ba2c76b7b9d9688 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/bin__minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/bin__pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/bin__pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..98b1c11e3acf31f9163a6792c256346c51b1d523 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/bin__pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/bin__plus.png b/interface/ispconfig/interface/themes/default/icons/x16/bin__plus.png new file mode 100644 index 0000000000000000000000000000000000000000..f822f7aeffd2489ed4904e1ad95effb6bf0d24f2 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/bin__plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/bin_full.png b/interface/ispconfig/interface/themes/default/icons/x16/bin_full.png new file mode 100644 index 0000000000000000000000000000000000000000..f1c9aabad510fa07b618f799eceae0d03f1e0726 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/bin_full.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/binocular.png b/interface/ispconfig/interface/themes/default/icons/x16/binocular.png new file mode 100644 index 0000000000000000000000000000000000000000..21da6d674524315ecb92b339a5afabb43d11f15d Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/binocular.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/binocular_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/binocular_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..64936339e3a1693133f463552e6d1f7887954bd8 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/binocular_arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/binocular_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/binocular_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..c039aede4fc235e7a4c109765ef8e490f89979b0 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/binocular_exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/binocular_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/binocular_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..f28a648c4132f51616ef31fc9f0baa6115a21f9f Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/binocular_minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/binocular_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/binocular_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..65ad17c0659166df81106f7b28f1216f07b589f6 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/binocular_pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/binocular_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/binocular_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..ef7a810b05fb80d5b98328ff949c3520f24839c8 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/binocular_plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/blog.png b/interface/ispconfig/interface/themes/default/icons/x16/blog.png new file mode 100644 index 0000000000000000000000000000000000000000..89b94eacff3eab2bb405b1cba91da01f7b09909c Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/blog.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/blog__arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/blog__arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..6d06fb737ff1b8b6191425f5d05dbaee3ee6b2f3 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/blog__arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/blog__exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/blog__exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..e0d89f601c26153fce11d684399e5386288236dd Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/blog__exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/blog__minus.png b/interface/ispconfig/interface/themes/default/icons/x16/blog__minus.png new file mode 100644 index 0000000000000000000000000000000000000000..fd5bd7b61b5a461fc797ae1aa13b444c99187fff Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/blog__minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/blog__pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/blog__pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..24ccdb697129a988b7a18543c59c808c5e42fe7f Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/blog__pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/blog__plus.png b/interface/ispconfig/interface/themes/default/icons/x16/blog__plus.png new file mode 100644 index 0000000000000000000000000000000000000000..28fa213c51c38881fa5c208a3e94a896c740cd94 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/blog__plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/blog_blue.png b/interface/ispconfig/interface/themes/default/icons/x16/blog_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..d0d28433fd135cd454fdcfac62dc93c5dd67a3fb Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/blog_blue.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/blogs.png b/interface/ispconfig/interface/themes/default/icons/x16/blogs.png new file mode 100644 index 0000000000000000000000000000000000000000..ce125b03cc05c53da78aff680efd2128a088b74c Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/blogs.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/blogs_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/blogs_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..24f1d2fcb42cc5fe1c8910b636ecdede50b6820b Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/blogs_arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/blogs_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/blogs_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..a56a0732750f702f3f0ea64cde7a7be036641f69 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/blogs_exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/blogs_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/blogs_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..ab2cdda205ca4f2d91fa983a13166709eea8fbd6 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/blogs_minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/blogs_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/blogs_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..f22563ae711ce69d1aa3522035984d0ffc80b0d9 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/blogs_pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/blogs_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/blogs_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..d8495a2ba152fcfb101432553f252d8b5fcc3222 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/blogs_plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/blogs_stack.png b/interface/ispconfig/interface/themes/default/icons/x16/blogs_stack.png new file mode 100644 index 0000000000000000000000000000000000000000..0654617df19c2b6b154d0604c2a82e0c6ba924c0 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/blogs_stack.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/book.png b/interface/ispconfig/interface/themes/default/icons/x16/book.png new file mode 100644 index 0000000000000000000000000000000000000000..1e637f14334c61108958f6e5d8a914485cceccaa Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/book.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/book__arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/book__arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..e82380c835a4d17175f3e93c9b89302ea424f9bc Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/book__arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/book__exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/book__exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..39fb2ad2da4658af6ba968ec68b12c85424f5043 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/book__exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/book__minus.png b/interface/ispconfig/interface/themes/default/icons/x16/book__minus.png new file mode 100644 index 0000000000000000000000000000000000000000..41d37c03e8327d69b11c3ce9da98d7e83e498687 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/book__minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/book__pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/book__pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..616565273c8ea639e7f430786d181b06a570d552 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/book__pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/book__plus.png b/interface/ispconfig/interface/themes/default/icons/x16/book__plus.png new file mode 100644 index 0000000000000000000000000000000000000000..07b494654a84c318d73486e9c931916f47d229c6 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/book__plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/book_brown.png b/interface/ispconfig/interface/themes/default/icons/x16/book_brown.png new file mode 100644 index 0000000000000000000000000000000000000000..a403042c874bc0f620f19417e0b9cec8c973b909 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/book_brown.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/book_small.png b/interface/ispconfig/interface/themes/default/icons/x16/book_small.png new file mode 100644 index 0000000000000000000000000000000000000000..438b6359b9c273350fef7245961857bd0faaba22 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/book_small.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/book_small_brown.png b/interface/ispconfig/interface/themes/default/icons/x16/book_small_brown.png new file mode 100644 index 0000000000000000000000000000000000000000..d53f3c1470eaba8aff80dea733a31c9ff79569dd Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/book_small_brown.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/bookmark.png b/interface/ispconfig/interface/themes/default/icons/x16/bookmark.png new file mode 100644 index 0000000000000000000000000000000000000000..621a067478a0fd49db2361995280c8df0eac2336 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/bookmark.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/bookmark__arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/bookmark__arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..422961ec76ff4e5e4a07a7cc61c21254a11da4e7 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/bookmark__arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/bookmark__exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/bookmark__exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..73c4661015156cd678e7de85f896712d45e09e03 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/bookmark__exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/bookmark__minus.png b/interface/ispconfig/interface/themes/default/icons/x16/bookmark__minus.png new file mode 100644 index 0000000000000000000000000000000000000000..e2d99ae749b7ff6601b249695f41a43372d9af23 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/bookmark__minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/bookmark__pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/bookmark__pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..184547f8b3fb2ec92b5d8b9d5e09d190f22d51e2 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/bookmark__pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/bookmark__plus.png b/interface/ispconfig/interface/themes/default/icons/x16/bookmark__plus.png new file mode 100644 index 0000000000000000000000000000000000000000..b897a36ecdc539640627e42bb27797047eca98aa Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/bookmark__plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/bookmark__small.png b/interface/ispconfig/interface/themes/default/icons/x16/bookmark__small.png new file mode 100644 index 0000000000000000000000000000000000000000..20716743a1bac92a176d6717d20b3af025988c49 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/bookmark__small.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/bookmark_book.png b/interface/ispconfig/interface/themes/default/icons/x16/bookmark_book.png new file mode 100644 index 0000000000000000000000000000000000000000..51e91a76a976b888e422b9bfcae7ed36bdea2dc7 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/bookmark_book.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/bookmark_book_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/bookmark_book_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..64af0f4c58551890c496e36c650b1211dad852a7 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/bookmark_book_arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/bookmark_book_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/bookmark_book_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..de35041d8426c9e1460258fa0b9e977c130fecf3 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/bookmark_book_exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/bookmark_book_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/bookmark_book_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..ce4f7c0acb6909a43a630f65cf94cbad22008ee5 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/bookmark_book_minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/bookmark_book_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/bookmark_book_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..c49f600ad7f787280ac6e0df3d004627392b1d97 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/bookmark_book_pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/bookmark_book_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/bookmark_book_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..be9c183134aaf73b4c1840358b79486de2e316b6 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/bookmark_book_plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/bookmark_document.png b/interface/ispconfig/interface/themes/default/icons/x16/bookmark_document.png new file mode 100644 index 0000000000000000000000000000000000000000..2587f938b5465c6e48ae4ae2a932383c08a3e24c Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/bookmark_document.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/bookmark_document_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/bookmark_document_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..f11fd0d888638f27bb04ecdf4fcdb64550536989 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/bookmark_document_arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/bookmark_document_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/bookmark_document_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..3de5313f34da9ba955d3024bcd79010a1e128e46 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/bookmark_document_exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/bookmark_document_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/bookmark_document_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..26e61f2b7444b5cc7726f0fe878d6e083e8ca866 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/bookmark_document_minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/bookmark_document_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/bookmark_document_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..f0f5da90eef83e7fed7deeb55c525e13b50626f2 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/bookmark_document_pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/bookmark_document_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/bookmark_document_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..b4d509c3c215fe604f54e6327fcd07b250ebee0a Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/bookmark_document_plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/bookmark_folder.png b/interface/ispconfig/interface/themes/default/icons/x16/bookmark_folder.png new file mode 100644 index 0000000000000000000000000000000000000000..d9fa74496a628ab7d199cefc8d662faad00bfe8b Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/bookmark_folder.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/bookmark_folder_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/bookmark_folder_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..29013dfdf55786346d487d962f9d8db38b4a0ab2 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/bookmark_folder_arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/bookmark_folder_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/bookmark_folder_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..273ea99351759c3b31a78e62c18154131bb020c3 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/bookmark_folder_exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/bookmark_folder_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/bookmark_folder_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..2c50a30f86f49ce75318af1c6a70ea151acf5dc2 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/bookmark_folder_minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/bookmark_folder_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/bookmark_folder_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..c9e2c5965dea580f879125fa56abc5890aa4ead1 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/bookmark_folder_pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/bookmark_folder_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/bookmark_folder_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..fd23ab2be87c4d70369c7401c9e8b58114d04b63 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/bookmark_folder_plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/books.png b/interface/ispconfig/interface/themes/default/icons/x16/books.png new file mode 100644 index 0000000000000000000000000000000000000000..ca500795d2412c917b384bc83606189408c061b0 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/books.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/books__arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/books__arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..778e3165c7d699cbd89a4add3a71ece6afbf0c40 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/books__arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/books__exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/books__exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..92b542784936c076580f4c79bd638adfa09c64dc Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/books__exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/books__minus.png b/interface/ispconfig/interface/themes/default/icons/x16/books__minus.png new file mode 100644 index 0000000000000000000000000000000000000000..0ad928b97efdb4fc32e6366dd737c716d8544253 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/books__minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/books__pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/books__pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..7b787a72d3fd16d36a4997d174dba509aaa66207 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/books__pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/books__plus.png b/interface/ispconfig/interface/themes/default/icons/x16/books__plus.png new file mode 100644 index 0000000000000000000000000000000000000000..13033dc968f90a0194588ecbad3e0b5054d54d5c Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/books__plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/books_brown.png b/interface/ispconfig/interface/themes/default/icons/x16/books_brown.png new file mode 100644 index 0000000000000000000000000000000000000000..c74cec614ba051d4ac374a56a8a12d32b278a5d7 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/books_brown.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/books_stack.png b/interface/ispconfig/interface/themes/default/icons/x16/books_stack.png new file mode 100644 index 0000000000000000000000000000000000000000..057ee1e8858f3b74505a56ca87d9fdd43745dfca Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/books_stack.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/box.png b/interface/ispconfig/interface/themes/default/icons/x16/box.png new file mode 100644 index 0000000000000000000000000000000000000000..78578c0e5c61a58a6406cfd7afdd2803f3503f7b Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/box.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/box__arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/box__arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..4b8d1636c567cdefdf933a288b901d64ae7371ce Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/box__arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/box__exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/box__exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..e5cb379d6c50038db82128165a9757fcadbc8495 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/box__exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/box__minus.png b/interface/ispconfig/interface/themes/default/icons/x16/box__minus.png new file mode 100644 index 0000000000000000000000000000000000000000..16c299f189791b269a9ca4d7804539e43551a73b Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/box__minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/box__pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/box__pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..eba0e524bf6e4a1d854bbf8163660146749f5118 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/box__pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/box__plus.png b/interface/ispconfig/interface/themes/default/icons/x16/box__plus.png new file mode 100644 index 0000000000000000000000000000000000000000..9cea3b84d270db03efe69f7bd95325b793d14925 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/box__plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/box_label.png b/interface/ispconfig/interface/themes/default/icons/x16/box_label.png new file mode 100644 index 0000000000000000000000000000000000000000..dbd8dfb47255ef97ff4353f352717062a1dfdca9 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/box_label.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/briefcase.png b/interface/ispconfig/interface/themes/default/icons/x16/briefcase.png new file mode 100644 index 0000000000000000000000000000000000000000..fe0a2d4bafba9b8f0ef8c6fdd0b035f4b72c8df1 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/briefcase.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/briefcase_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/briefcase_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..612ceadc9cca9f83bc1787f4bef48019f3407365 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/briefcase_arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/briefcase_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/briefcase_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..6466d09a2600455583051b84b3b003efc467c9ea Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/briefcase_exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/briefcase_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/briefcase_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..1915103c703805fedea04faf212343927c57cdff Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/briefcase_minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/briefcase_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/briefcase_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..63fdbd76528a7bf322aaec3e79f1dc0787948814 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/briefcase_pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/briefcase_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/briefcase_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..609d59a75be48d373d593d237478aece543de575 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/briefcase_plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/broom.png b/interface/ispconfig/interface/themes/default/icons/x16/broom.png new file mode 100644 index 0000000000000000000000000000000000000000..d9f914aad343d7be50c80dc5e45ff427ed60796f Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/broom.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/broom_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/broom_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..87f964d6d1f92f2ca94be229b45fc88f644d498f Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/broom_arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/broom_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/broom_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..0eb58635d5709cde599a925e8721c1c365cc5559 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/broom_exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/broom_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/broom_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..acce4b1dcc8368e720e0998d1547d8ca04835d22 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/broom_minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/broom_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/broom_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..0c2cf23c5b1b1c435f1ccbbae5a3b3cdf7317001 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/broom_pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/broom_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/broom_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..b5e2af04a278f78a5b5833d46b34a5fbdd688fec Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/broom_plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/calculator.png b/interface/ispconfig/interface/themes/default/icons/x16/calculator.png new file mode 100644 index 0000000000000000000000000000000000000000..d63ac41fbd539cac58063583b58befd2d157a524 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/calculator.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/calculator_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/calculator_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..3b5b7465a9a5a7d663a3d70bef211fdf850993bc Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/calculator_arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/calculator_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/calculator_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..593a61b88283aa40cabc5d0cfec76c3a72a81ce0 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/calculator_exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/calculator_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/calculator_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..c9b8c6b71eb402015828a9e7152dd48ad081d713 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/calculator_minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/calculator_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/calculator_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..8e0afd45e5356ac0bae6bc4d6e3f60f65c67935b Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/calculator_pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/calculator_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/calculator_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..6947b740b75b168a77698ba513f7cb581993ddf0 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/calculator_plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/calendar.png b/interface/ispconfig/interface/themes/default/icons/x16/calendar.png new file mode 100644 index 0000000000000000000000000000000000000000..5eaf86914530d89c1822099e0eb13ed98332ab02 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/calendar.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/calendar__arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/calendar__arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..e2491b2a884f9ace9b03003923eea0b40d1c5722 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/calendar__arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/calendar__exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/calendar__exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..56b11e23ca30534aefc3d916ef39b2118c5c0434 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/calendar__exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/calendar__minus.png b/interface/ispconfig/interface/themes/default/icons/x16/calendar__minus.png new file mode 100644 index 0000000000000000000000000000000000000000..80841152f84ddc69d40388d2be72cfe4c7073edd Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/calendar__minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/calendar__pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/calendar__pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..86dc221f5b62b02b01d29e44f4dc858b9c16b43f Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/calendar__pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/calendar__plus.png b/interface/ispconfig/interface/themes/default/icons/x16/calendar__plus.png new file mode 100644 index 0000000000000000000000000000000000000000..a859502d11721c28f949da72df4145d18f880ad0 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/calendar__plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/calendar_day.png b/interface/ispconfig/interface/themes/default/icons/x16/calendar_day.png new file mode 100644 index 0000000000000000000000000000000000000000..8a3452a40b68b32dcc0114071e496d524b7f2a61 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/calendar_day.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/calendar_month.png b/interface/ispconfig/interface/themes/default/icons/x16/calendar_month.png new file mode 100644 index 0000000000000000000000000000000000000000..6827bba645bcdbae5c0fc7838c286def23cbc497 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/calendar_month.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/camera.png b/interface/ispconfig/interface/themes/default/icons/x16/camera.png new file mode 100644 index 0000000000000000000000000000000000000000..9f468d569fefc29eabdccdbc9d89bc60e571d3df Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/camera.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/camera__arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/camera__arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..31292ca9a613d43d689eb3f9fa44790a499bf505 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/camera__arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/camera__exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/camera__exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..595a346c358bff91a3fdbebf232c88fe276d064d Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/camera__exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/camera__minus.png b/interface/ispconfig/interface/themes/default/icons/x16/camera__minus.png new file mode 100644 index 0000000000000000000000000000000000000000..c204c0eedcfcd80afd8974e131ee605676a06281 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/camera__minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/camera__pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/camera__pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..197edc8aac8eff43f44cf057e1171dc0bc527068 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/camera__pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/camera__plus.png b/interface/ispconfig/interface/themes/default/icons/x16/camera__plus.png new file mode 100644 index 0000000000000000000000000000000000000000..07b81df9e14c15f016f87cdf1bbb164c5fb82ced Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/camera__plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/camera_black.png b/interface/ispconfig/interface/themes/default/icons/x16/camera_black.png new file mode 100644 index 0000000000000000000000000000000000000000..f27f820efe2a3abb2f1614da23a93aa80892a37f Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/camera_black.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/camera_small.png b/interface/ispconfig/interface/themes/default/icons/x16/camera_small.png new file mode 100644 index 0000000000000000000000000000000000000000..615eecf41bc10f53b1036206473b03c82f5e145c Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/camera_small.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/camera_small_black.png b/interface/ispconfig/interface/themes/default/icons/x16/camera_small_black.png new file mode 100644 index 0000000000000000000000000000000000000000..2fee054ccbec318c336a094f03ac2b80b2a3ea77 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/camera_small_black.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/card.png b/interface/ispconfig/interface/themes/default/icons/x16/card.png new file mode 100644 index 0000000000000000000000000000000000000000..be7001f216c8165ebc3e0e240daf9256b0fa3927 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/card.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/card__arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/card__arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..acaea0fddda5c027c997f7cb65a3ba66a5c8da2a Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/card__arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/card__exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/card__exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..551092044b92b61d1f740250c584f883b4ba52b7 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/card__exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/card__minus.png b/interface/ispconfig/interface/themes/default/icons/x16/card__minus.png new file mode 100644 index 0000000000000000000000000000000000000000..9eaa682c7459de2feb3f82fa7336477f869c5ba2 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/card__minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/card__pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/card__pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..d7a00a83d8312bcade2d0e014622ef5dc576b656 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/card__pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/card__plus.png b/interface/ispconfig/interface/themes/default/icons/x16/card__plus.png new file mode 100644 index 0000000000000000000000000000000000000000..2f1278042cba6c6150a992233e9de4860aea1239 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/card__plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/card_address.png b/interface/ispconfig/interface/themes/default/icons/x16/card_address.png new file mode 100644 index 0000000000000000000000000000000000000000..440878184d4d78d50df8719b435a207f32a9297f Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/card_address.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/card_small.png b/interface/ispconfig/interface/themes/default/icons/x16/card_small.png new file mode 100644 index 0000000000000000000000000000000000000000..fcc08a10f9ea6a078b582c3f8d119136d9ba4388 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/card_small.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/cards.png b/interface/ispconfig/interface/themes/default/icons/x16/cards.png new file mode 100644 index 0000000000000000000000000000000000000000..2d91605b5408626ba42666715dcf72b8a4f10384 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/cards.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/cards__arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/cards__arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..a79b509b8e3c4bf483bd0b92b468e3c0fdc03af5 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/cards__arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/cards__exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/cards__exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..5f2fad7822d3afdf9d33dd7742276356ca658c7d Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/cards__exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/cards__minus.png b/interface/ispconfig/interface/themes/default/icons/x16/cards__minus.png new file mode 100644 index 0000000000000000000000000000000000000000..20480e552b9ad48c6629c183b7b4bc461df237f6 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/cards__minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/cards__pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/cards__pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..c7820974f6419acccb0402362faaf124c6f3439c Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/cards__pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/cards__plus.png b/interface/ispconfig/interface/themes/default/icons/x16/cards__plus.png new file mode 100644 index 0000000000000000000000000000000000000000..7d54afdeef77b045c6d00a0bcd07b73be33254d2 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/cards__plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/cards_address.png b/interface/ispconfig/interface/themes/default/icons/x16/cards_address.png new file mode 100644 index 0000000000000000000000000000000000000000..4a99fb472c865ed6aacfe890c0e60ef449a5adca Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/cards_address.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/cards_stack.png b/interface/ispconfig/interface/themes/default/icons/x16/cards_stack.png new file mode 100644 index 0000000000000000000000000000000000000000..83f17cca9b22067ba8f56d4a830c23f68b9ab035 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/cards_stack.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/cassette.png b/interface/ispconfig/interface/themes/default/icons/x16/cassette.png new file mode 100644 index 0000000000000000000000000000000000000000..91ea01594fac0b80f0411c7d76ed2855a9a50cc7 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/cassette.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/cassette_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/cassette_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..13d8b20af4d3829a0b47a7c89a72e406a27a2fc6 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/cassette_arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/cassette_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/cassette_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..52df7a107d64c993ba28ba2a9fe924fee4cad793 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/cassette_exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/cassette_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/cassette_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..c75833300aeef1331c7887762f4bc1c6d5909e76 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/cassette_minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/cassette_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/cassette_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..427138c9304d2f19d3f25ebbdfb913bfb07b0d0d Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/cassette_pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/cassette_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/cassette_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..1fb3cf8c5a0f2cc52622b0c4fb85a9f8f8bcca0f Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/cassette_plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/cassette_small.png b/interface/ispconfig/interface/themes/default/icons/x16/cassette_small.png new file mode 100644 index 0000000000000000000000000000000000000000..7f6fe7a904b3e0b503ee846af0b34a7dcca5315f Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/cassette_small.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/chain.png b/interface/ispconfig/interface/themes/default/icons/x16/chain.png new file mode 100644 index 0000000000000000000000000000000000000000..edc9e72cb8b9f27dc2a15192236fd6c6d1a07c87 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/chain.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/chain_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/chain_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..cbbc9afdedaf78a6d4216ddd82f100d1faf82c70 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/chain_arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/chain_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/chain_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..a3bb6764c50d72b779077cf2489a3b29f1cfe308 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/chain_exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/chain_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/chain_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..1710504cc0a7147e471941b23afa37cfd48f236a Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/chain_minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/chain_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/chain_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..928e14ae7f5d214cc8a6037a11c4ba4c7a468bc9 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/chain_pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/chain_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/chain_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..77ece1334d2ca1a8058a70bd287902eb94a699af Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/chain_plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/chain_small.png b/interface/ispconfig/interface/themes/default/icons/x16/chain_small.png new file mode 100644 index 0000000000000000000000000000000000000000..72c1d12399c81ab9783364243b6ffe13959907eb Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/chain_small.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/chain_unchain.png b/interface/ispconfig/interface/themes/default/icons/x16/chain_unchain.png new file mode 100644 index 0000000000000000000000000000000000000000..65e11e55e3f8d9bbb020b629689d1e487ce3aa50 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/chain_unchain.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/clipboard.png b/interface/ispconfig/interface/themes/default/icons/x16/clipboard.png new file mode 100644 index 0000000000000000000000000000000000000000..2ae81726678625a57becc69fee9d7e0eeeefba6b Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/clipboard.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/clipboard__arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/clipboard__arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..081153c6aba3c14b4a140d79b9a11a7a098e9b7d Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/clipboard__arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/clipboard__exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/clipboard__exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..155d7c21f287ec5b9b289ef0b97d435143806ebe Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/clipboard__exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/clipboard__minus.png b/interface/ispconfig/interface/themes/default/icons/x16/clipboard__minus.png new file mode 100644 index 0000000000000000000000000000000000000000..a4fa230672b127d4b0ce10ba7e5732d4106f2da2 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/clipboard__minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/clipboard__pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/clipboard__pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..dc4b5ff7308e2efc7b2ec7c99c4b3bdace5e9f55 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/clipboard__pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/clipboard__plus.png b/interface/ispconfig/interface/themes/default/icons/x16/clipboard__plus.png new file mode 100644 index 0000000000000000000000000000000000000000..d12b7db72daa1c6e3ef80472c459852a424c2bad Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/clipboard__plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/clipboard_empty.png b/interface/ispconfig/interface/themes/default/icons/x16/clipboard_empty.png new file mode 100644 index 0000000000000000000000000000000000000000..bf5feaae90c191722eb6e67a3d4d9b35d8ce05db Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/clipboard_empty.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/clipboard_text.png b/interface/ispconfig/interface/themes/default/icons/x16/clipboard_text.png new file mode 100644 index 0000000000000000000000000000000000000000..98d440b3ef49fc89f7e186424d696cdf03b6bdf0 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/clipboard_text.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/clock.png b/interface/ispconfig/interface/themes/default/icons/x16/clock.png new file mode 100644 index 0000000000000000000000000000000000000000..edcf756c25ca5b232d532f2678c5d7a2a5d120e5 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/clock.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/clock__arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/clock__arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..f1d1deacb012128d1407330391e11969ab7783fa Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/clock__arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/clock__exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/clock__exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..0ca6082a08e34cc497196ff7f21ed13fdda176b8 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/clock__exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/clock__minus.png b/interface/ispconfig/interface/themes/default/icons/x16/clock__minus.png new file mode 100644 index 0000000000000000000000000000000000000000..8d8d593a73cea0d85c75b4585e67cebca3a384b6 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/clock__minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/clock__pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/clock__pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..b40415ba91d6a07992dba4aa3ff068e2c0c7d79a Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/clock__pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/clock__plus.png b/interface/ispconfig/interface/themes/default/icons/x16/clock__plus.png new file mode 100644 index 0000000000000000000000000000000000000000..c72e97cfd906274f70c74023b63516cdf999ff7f Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/clock__plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/clock_fill.png b/interface/ispconfig/interface/themes/default/icons/x16/clock_fill.png new file mode 100644 index 0000000000000000000000000000000000000000..fd76be8b296a5ad4e8555562e34b936ad90d353e Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/clock_fill.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/clock_frame.png b/interface/ispconfig/interface/themes/default/icons/x16/clock_frame.png new file mode 100644 index 0000000000000000000000000000000000000000..7d6c709ffb1d6d4aae2030d465c4aace20d66f66 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/clock_frame.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/clock_small.png b/interface/ispconfig/interface/themes/default/icons/x16/clock_small.png new file mode 100644 index 0000000000000000000000000000000000000000..2d40c7b9dc2545bf20569683c4d541ca1398c4c1 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/clock_small.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/color.png b/interface/ispconfig/interface/themes/default/icons/x16/color.png new file mode 100644 index 0000000000000000000000000000000000000000..febc33126b574db29801406bacb2c2e2c92d4abd Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/color.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/color_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/color_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..d4aa1115efd24b4285249e06cd81b4deecf8186f Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/color_arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/color_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/color_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..fa1c8a24ff8d143bba0fa552f8a187dfbf5843b3 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/color_exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/color_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/color_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..40cedce31d90f683d2a8b258a5c83abe14756979 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/color_minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/color_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/color_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..f24f27246181251d6208468bfda6a0fff1a9c4ec Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/color_pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/color_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/color_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..aa60dbbc6d12fdfcec02f05a2bdc7f66d6975401 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/color_plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/color_small.png b/interface/ispconfig/interface/themes/default/icons/x16/color_small.png new file mode 100644 index 0000000000000000000000000000000000000000..0538fd9c020776f871d9e42772f4354bccdf74d3 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/color_small.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/contrast.png b/interface/ispconfig/interface/themes/default/icons/x16/contrast.png new file mode 100644 index 0000000000000000000000000000000000000000..072733e65b9817a6693c81434ffd0df956638569 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/contrast.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/contrast__arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/contrast__arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..796e516b294c7384c3773c4dffeaa3f9666b9362 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/contrast__arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/contrast__exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/contrast__exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..fae1e52f84a2275e55af00c0a50e63bb83691d6f Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/contrast__exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/contrast__minus.png b/interface/ispconfig/interface/themes/default/icons/x16/contrast__minus.png new file mode 100644 index 0000000000000000000000000000000000000000..06af6b909ef942ce12bc3a8bcefabc6312555c22 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/contrast__minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/contrast__pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/contrast__pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..7763472b36efa1bff2b158ea28319f32e42672a1 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/contrast__pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/contrast__plus.png b/interface/ispconfig/interface/themes/default/icons/x16/contrast__plus.png new file mode 100644 index 0000000000000000000000000000000000000000..be9b36e3f273533e9b1b79d20f3bae26858a7ec3 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/contrast__plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/contrast_low.png b/interface/ispconfig/interface/themes/default/icons/x16/contrast_low.png new file mode 100644 index 0000000000000000000000000000000000000000..b3bb7c1f6c523bda163a2450c7a26ab76f4a9d18 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/contrast_low.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/contrast_small.png b/interface/ispconfig/interface/themes/default/icons/x16/contrast_small.png new file mode 100644 index 0000000000000000000000000000000000000000..221b6fdb1577abaa55e423b7653f6d44ebff3fba Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/contrast_small.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/contrast_small_low.png b/interface/ispconfig/interface/themes/default/icons/x16/contrast_small_low.png new file mode 100644 index 0000000000000000000000000000000000000000..c791b0e8db132d9cd3408008e8f877f800f53a16 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/contrast_small_low.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/cross.png b/interface/ispconfig/interface/themes/default/icons/x16/cross.png new file mode 100644 index 0000000000000000000000000000000000000000..62c181d4b03e00c588482ae24f7c57479282cd59 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/cross.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/cross_circle.png b/interface/ispconfig/interface/themes/default/icons/x16/cross_circle.png new file mode 100644 index 0000000000000000000000000000000000000000..d4507c0712c2f902a8f6ef0b12d42b45cd0aac7c Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/cross_circle.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/cross_circle_frame.png b/interface/ispconfig/interface/themes/default/icons/x16/cross_circle_frame.png new file mode 100644 index 0000000000000000000000000000000000000000..af3b5caff23e1b157280442e373778cacd1a8844 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/cross_circle_frame.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/cross_shield.png b/interface/ispconfig/interface/themes/default/icons/x16/cross_shield.png new file mode 100644 index 0000000000000000000000000000000000000000..25ea793a144793ab74c677f52423a342cb20474b Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/cross_shield.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/cross_small.png b/interface/ispconfig/interface/themes/default/icons/x16/cross_small.png new file mode 100644 index 0000000000000000000000000000000000000000..53c3a71b25917651d5294126cbaa30f33d18d971 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/cross_small.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/cross_small_circle.png b/interface/ispconfig/interface/themes/default/icons/x16/cross_small_circle.png new file mode 100644 index 0000000000000000000000000000000000000000..a51bb766d27e0e65b804924b3358cefc27d67a54 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/cross_small_circle.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/crown.png b/interface/ispconfig/interface/themes/default/icons/x16/crown.png new file mode 100644 index 0000000000000000000000000000000000000000..07e9ee56f96b104b482b64f0af6476caf1b70b67 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/crown.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/crown__arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/crown__arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..318a2e04cf2d8a2d64ca77b28dc7b10c678d69a8 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/crown__arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/crown__exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/crown__exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..d347bdf843b34535ead89161c6c4b89fd133d4cc Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/crown__exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/crown__minus.png b/interface/ispconfig/interface/themes/default/icons/x16/crown__minus.png new file mode 100644 index 0000000000000000000000000000000000000000..01f384cd88b08109aeb8e53295ba3da533c2110c Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/crown__minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/crown__pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/crown__pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..db4c8c022fe4bad8b88f3741f93e6ab6ab1dd08a Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/crown__pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/crown__plus.png b/interface/ispconfig/interface/themes/default/icons/x16/crown__plus.png new file mode 100644 index 0000000000000000000000000000000000000000..9d467cc0d14e20928b2c300ea8ec954f03f378e4 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/crown__plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/crown_bronze.png b/interface/ispconfig/interface/themes/default/icons/x16/crown_bronze.png new file mode 100644 index 0000000000000000000000000000000000000000..7632eb42e29e6b74dc31a736fa05f176b9fe54b4 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/crown_bronze.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/crown_silver.png b/interface/ispconfig/interface/themes/default/icons/x16/crown_silver.png new file mode 100644 index 0000000000000000000000000000000000000000..2f5764824cf73112a30d5aeecd9a1eb22912a926 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/crown_silver.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/database.png b/interface/ispconfig/interface/themes/default/icons/x16/database.png new file mode 100644 index 0000000000000000000000000000000000000000..2026373974074fdfbaf8e80f064bc5a57064c7b5 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/database.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/database_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/database_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..402e0f3b1828f0067c2c81cda3ebb715e442f1a5 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/database_arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/database_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/database_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..771a917beca0581792c4f242b0ba058429b8c1d2 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/database_exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/database_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/database_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..d71933485ac06efaa0acce336f72791c780fa4f0 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/database_minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/database_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/database_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..28c56b35dbf146b578f671b9b68421f818d869f0 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/database_pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/database_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/database_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..77bc6ab51fbb2154d0a76c7b0b70e548fc8a6ef5 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/database_plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/database_small.png b/interface/ispconfig/interface/themes/default/icons/x16/database_small.png new file mode 100644 index 0000000000000000000000000000000000000000..cb4c5a9638b33ade1193d5a33224edcadc27b692 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/database_small.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/databases.png b/interface/ispconfig/interface/themes/default/icons/x16/databases.png new file mode 100644 index 0000000000000000000000000000000000000000..37bc6229415e16b31bbd1d464919dbb48957b4f6 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/databases.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/databases_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/databases_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..f4f5070d2594ae48225fc9b5e78679b9bf79d234 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/databases_arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/databases_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/databases_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..ffc5a42474165b0abd1dd631f59571a87eb667fd Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/databases_exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/databases_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/databases_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..ba5eb80af80a194c46da8b7a349289703c8b2eec Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/databases_minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/databases_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/databases_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..dafa7f5e3a735604c223f8929be6f79fdd7dc449 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/databases_pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/databases_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/databases_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..d389d1b050b06aec44fdb76b2db86215ba5c7b67 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/databases_plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/disc.png b/interface/ispconfig/interface/themes/default/icons/x16/disc.png new file mode 100644 index 0000000000000000000000000000000000000000..3f78191cfa65e927bab4abf365ba9d80cfb5c965 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/disc.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/disc_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/disc_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..2dc7abad8aa05f15d50bbdf3966ddb7286105682 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/disc_arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/disc_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/disc_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..3b269126708c26f837f47f7d1771da097f6a840d Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/disc_exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/disc_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/disc_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..87c8851d87a7d98972627327b0f7364cae866080 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/disc_minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/disc_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/disc_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..9430adfcf18be26260ae9d06a3576816990001e6 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/disc_pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/disc_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/disc_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..938df68a68297744f0670fe09f92558f46bcc49a Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/disc_plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/disc_small.png b/interface/ispconfig/interface/themes/default/icons/x16/disc_small.png new file mode 100644 index 0000000000000000000000000000000000000000..eef6e5e513026d7ae549c99a24e86442699e5477 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/disc_small.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/discs.png b/interface/ispconfig/interface/themes/default/icons/x16/discs.png new file mode 100644 index 0000000000000000000000000000000000000000..dda4049262ecc7e88b5b4ee101ab5eb3bdbb396c Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/discs.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/discs_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/discs_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..e6c1be1ca6129bc12e52f6fff3b973c0d8096fed Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/discs_arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/discs_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/discs_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..c22a30bd2ce3164d3a1073f1b8d084bdf5f23ef0 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/discs_exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/discs_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/discs_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..70af40e2b92969f87e07e17d1b48b86cee61b461 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/discs_minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/discs_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/discs_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..ae591ae6dea3396f71ed8a4ddc990bf5f05bda2b Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/discs_pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/discs_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/discs_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..df145aa41fe41334a430a6cbaa1d8f6ea847f047 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/discs_plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/disk.png b/interface/ispconfig/interface/themes/default/icons/x16/disk.png new file mode 100644 index 0000000000000000000000000000000000000000..a039b9930eb7fc878809df3b58ec65a1ba04f439 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/disk.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/disk__arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/disk__arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..2133d90f55aa451a751587732f705579f0620f6d Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/disk__arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/disk__exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/disk__exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..c6e842f009ced5abb7c647ff1047f37c5109ff4f Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/disk__exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/disk__minus.png b/interface/ispconfig/interface/themes/default/icons/x16/disk__minus.png new file mode 100644 index 0000000000000000000000000000000000000000..244ee5f13925acdba38f0d94528df1f1ffe2db50 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/disk__minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/disk__pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/disk__pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..6c0dc769e1ea36a466076b63e821ba2284b4cb95 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/disk__pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/disk__plus.png b/interface/ispconfig/interface/themes/default/icons/x16/disk__plus.png new file mode 100644 index 0000000000000000000000000000000000000000..b188fb180b00d719fa2d0e9125150826bf14eb9d Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/disk__plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/disk_black.png b/interface/ispconfig/interface/themes/default/icons/x16/disk_black.png new file mode 100644 index 0000000000000000000000000000000000000000..712e55edf7e2018b91ee006518cb975f4004905e Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/disk_black.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/disk_small.png b/interface/ispconfig/interface/themes/default/icons/x16/disk_small.png new file mode 100644 index 0000000000000000000000000000000000000000..911f8c70f2df51c49db8346985254f28d5bd12e9 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/disk_small.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/disk_small_black.png b/interface/ispconfig/interface/themes/default/icons/x16/disk_small_black.png new file mode 100644 index 0000000000000000000000000000000000000000..4d65b73769216e11723558ef1113adb7a0f8d22d Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/disk_small_black.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/disks.png b/interface/ispconfig/interface/themes/default/icons/x16/disks.png new file mode 100644 index 0000000000000000000000000000000000000000..fc33338810a782f18ba35885df601edca3ee1a8f Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/disks.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/disks__arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/disks__arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..29baaa33ae6ad3849034394dea5cd12bfba26927 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/disks__arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/disks__exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/disks__exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..2bd35e2ffd2a7562fd7e1e0c1b5dc97252e8ff05 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/disks__exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/disks__minus.png b/interface/ispconfig/interface/themes/default/icons/x16/disks__minus.png new file mode 100644 index 0000000000000000000000000000000000000000..664d72d7d93c7f265d5e48253e5dc6317905d3ca Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/disks__minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/disks__pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/disks__pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..3d18e9f3103fa71dcc5a08b3b8c78c7b79460501 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/disks__pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/disks__plus.png b/interface/ispconfig/interface/themes/default/icons/x16/disks__plus.png new file mode 100644 index 0000000000000000000000000000000000000000..2f8fe8de1052207b3a3c4ab9d687b620b13154a6 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/disks__plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/disks_black.png b/interface/ispconfig/interface/themes/default/icons/x16/disks_black.png new file mode 100644 index 0000000000000000000000000000000000000000..31a1b00bb65b7710bfbc7587f6211560cea74c79 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/disks_black.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/document.png b/interface/ispconfig/interface/themes/default/icons/x16/document.png new file mode 100644 index 0000000000000000000000000000000000000000..456644305d1b981229ae18f84368b8ccca005603 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/document.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/document__arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/document__arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..ddb756c49a2d518c04a1637c54b3ac6ef2f8f663 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/document__arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/document__exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/document__exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..9830bba0fe40164fad73818a23aa8f2937eb5129 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/document__exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/document__minus.png b/interface/ispconfig/interface/themes/default/icons/x16/document__minus.png new file mode 100644 index 0000000000000000000000000000000000000000..2afd09f97a7ebd71a806e1c346ace1edddd88feb Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/document__minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/document__pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/document__pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..746f4cd39758c3e9763100998dc44d728993e474 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/document__pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/document__plus.png b/interface/ispconfig/interface/themes/default/icons/x16/document__plus.png new file mode 100644 index 0000000000000000000000000000000000000000..9dc52b734e11255d529a599fd8d932dfb0f22775 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/document__plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/document_horizontal.png b/interface/ispconfig/interface/themes/default/icons/x16/document_horizontal.png new file mode 100644 index 0000000000000000000000000000000000000000..8568a9e686cbfa5a6f7512cbba56bfbc8d6df2f9 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/document_horizontal.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/document_horizontal_text.png b/interface/ispconfig/interface/themes/default/icons/x16/document_horizontal_text.png new file mode 100644 index 0000000000000000000000000000000000000000..1d77d0c434e464a64b831581e4bc53a89676f6d5 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/document_horizontal_text.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/document_music.png b/interface/ispconfig/interface/themes/default/icons/x16/document_music.png new file mode 100644 index 0000000000000000000000000000000000000000..d5d5cb9b6cbaff6b33b0ee501f813f4acba54705 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/document_music.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/document_music_playlist.png b/interface/ispconfig/interface/themes/default/icons/x16/document_music_playlist.png new file mode 100644 index 0000000000000000000000000000000000000000..1781072e9dca7d25c4ceb2ff9e601b3a412d46f1 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/document_music_playlist.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/document_shred.png b/interface/ispconfig/interface/themes/default/icons/x16/document_shred.png new file mode 100644 index 0000000000000000000000000000000000000000..d59f80ebfd477e2eb40a94ac39780e9515c485e2 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/document_shred.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/document_small.png b/interface/ispconfig/interface/themes/default/icons/x16/document_small.png new file mode 100644 index 0000000000000000000000000000000000000000..6427ecce32443bec34150b114db4b236f0016c7a Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/document_small.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/document_text.png b/interface/ispconfig/interface/themes/default/icons/x16/document_text.png new file mode 100644 index 0000000000000000000000000000000000000000..60ffdbdf071900051bd53ba98ba05426586858f8 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/document_text.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/document_text_image.png b/interface/ispconfig/interface/themes/default/icons/x16/document_text_image.png new file mode 100644 index 0000000000000000000000000000000000000000..1cd9e9849c4af85bbda703572b4878798d9e6bac Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/document_text_image.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/document_zipper.png b/interface/ispconfig/interface/themes/default/icons/x16/document_zipper.png new file mode 100644 index 0000000000000000000000000000000000000000..64c85052347be53ecef2cda5da30df177b76998b Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/document_zipper.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/documents.png b/interface/ispconfig/interface/themes/default/icons/x16/documents.png new file mode 100644 index 0000000000000000000000000000000000000000..f6cc0418f2635d72ef3a8077395733f7380fc7dd Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/documents.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/documents_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/documents_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..afbb1292f7a2ca9289714eceb82784a6737f51ab Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/documents_arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/documents_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/documents_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..390e091860c9317624e46496fbfa5acea041c65f Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/documents_exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/documents_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/documents_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..84a27e22e2c87ea65e971ae13e2f6692fdcd261b Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/documents_minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/documents_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/documents_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..e598c3b6aa4c285ab00107f42cbf22f3f27b0b1f Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/documents_pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/documents_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/documents_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..8bcebc0248edfc7fee448392548243c90e119420 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/documents_plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/documents_stack.png b/interface/ispconfig/interface/themes/default/icons/x16/documents_stack.png new file mode 100644 index 0000000000000000000000000000000000000000..54eac65389d35627ddf757766f4d8e6188ea8fd3 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/documents_stack.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/documents_text.png b/interface/ispconfig/interface/themes/default/icons/x16/documents_text.png new file mode 100644 index 0000000000000000000000000000000000000000..6a4df31d3cc33d6c477a9a721c137585a8545c30 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/documents_text.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/door.png b/interface/ispconfig/interface/themes/default/icons/x16/door.png new file mode 100644 index 0000000000000000000000000000000000000000..aaaa93ad6ad4b2bb7f153f58695d92206dfff98f Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/door.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/door_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/door_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..da96063bc4fdf6c5182bdd614dc689fe938c9c0d Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/door_arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/door_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/door_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..22fd5f139fe32dc20b263e742a71739ee349b1cd Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/door_exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/door_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/door_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..96d0ba869e10ad7951f0ea49db808fb5ced5993c Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/door_minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/door_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/door_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..dd520baf66f05b09f1e2620d94e5ac072354b3e7 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/door_pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/door_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/door_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..f852976a9a0e43b9bb46d34e5d5084f9e7ebb7a3 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/door_plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/drawer.png b/interface/ispconfig/interface/themes/default/icons/x16/drawer.png new file mode 100644 index 0000000000000000000000000000000000000000..0b76e56ad0d440c663ce1befde14af916936bff2 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/drawer.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/drawer_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/drawer_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..4d4d494c8f6d549fdd4a0e63d38e29c39b022443 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/drawer_arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/drawer_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/drawer_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..58f0b34ad52bd1a9311e8fd1c3e824a64f99ced9 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/drawer_exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/drawer_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/drawer_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..1a6779f19686964210e59599bca117a06d10dee2 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/drawer_minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/drawer_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/drawer_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..fc99eb0a9cdfa00552f26cb812a45babb93a7995 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/drawer_pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/drawer_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/drawer_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..a73df52e7d00cd690828d3b16d87477a03eb1491 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/drawer_plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/drill.png b/interface/ispconfig/interface/themes/default/icons/x16/drill.png new file mode 100644 index 0000000000000000000000000000000000000000..a9e1d4afcf5a3aa10bcd4f5f057768d69015a5e6 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/drill.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/drill_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/drill_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..80157f4369138f1ed6e56b88cf6e01d2725885ba Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/drill_arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/drill_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/drill_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..7fab98920d93d629d5b7bf130252f57374c5dec8 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/drill_exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/drill_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/drill_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..eb43f2be67476090d9e390fe7f1c2a389a1d7463 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/drill_minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/drill_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/drill_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..7f2a47c679cfd780acbf6462c16e6802291e2dd8 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/drill_pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/drill_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/drill_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..9568b80676b8d2f0e44ebf6255b7e8b8c8aded8d Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/drill_plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/envelope.png b/interface/ispconfig/interface/themes/default/icons/x16/envelope.png new file mode 100644 index 0000000000000000000000000000000000000000..be0567184a911992cca5ba94d00eb437678a831b Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/envelope.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/envelope_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/envelope_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..444df43e5a5de5764fce5266dca9a783e726d5a8 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/envelope_arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/envelope_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/envelope_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..49b1a4506c10bbdc8e26120addaab3af79a3c554 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/envelope_exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/envelope_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/envelope_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..ad363a2c87b6df52ca7217fa36222eba8698f893 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/envelope_minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/envelope_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/envelope_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..66898f485b51cf2e6f60947a8608e0ba0d24b165 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/envelope_pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/envelope_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/envelope_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..2116ff56ad674ef7a7d2f22c967e050d427906d7 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/envelope_plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/equalizer.png b/interface/ispconfig/interface/themes/default/icons/x16/equalizer.png new file mode 100644 index 0000000000000000000000000000000000000000..531632f16c86b2748f813afdb10cbbc6ec3ae050 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/equalizer.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/equalizer_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/equalizer_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..fc1fce9c3844c7a5ad0f624f9f5762e5376b3c1e Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/equalizer_arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/equalizer_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/equalizer_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..10d73390ad1a5be5e967773fd6ea4ef7d4f1d7e4 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/equalizer_exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/equalizer_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/equalizer_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..21de100f437ca9606e1500239262f1807b393dca Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/equalizer_minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/equalizer_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/equalizer_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..87c3aea3370b9d8a13fb27e302fbfa6b0075f003 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/equalizer_pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/equalizer_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/equalizer_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..5873dc6089406640b99f7f7eeee5f86b51f02fce Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/equalizer_plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/eraser.png b/interface/ispconfig/interface/themes/default/icons/x16/eraser.png new file mode 100644 index 0000000000000000000000000000000000000000..30473692a322b339bc2d97f7d3760e0f38cfa0ba Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/eraser.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/eraser_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/eraser_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..d944ab136389cab14a4b902457e8d7779bad2094 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/eraser_arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/eraser_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/eraser_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..dc0adecc108a24404ff3290f5f5cf8e9b6cf2319 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/eraser_exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/eraser_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/eraser_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..d0a621e08432c730dc34d2e77ea67028e991e8ed Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/eraser_minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/eraser_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/eraser_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..57b9053f24f603a9d40d163be9f9eba3e5ba382e Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/eraser_pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/eraser_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/eraser_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..fadaea76ad3c3296bd7630ebb978923f674abc47 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/eraser_plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..056f680ad288a1f126e2c0d4beef406cda8ffe8a Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/exclamation_frame.png b/interface/ispconfig/interface/themes/default/icons/x16/exclamation_frame.png new file mode 100644 index 0000000000000000000000000000000000000000..9c071a22496c0f3c7bab34ce23aec1da704c9040 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/exclamation_frame.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/exclamation_shield.png b/interface/ispconfig/interface/themes/default/icons/x16/exclamation_shield.png new file mode 100644 index 0000000000000000000000000000000000000000..b0595f1933e301c4e52e3daeb5fce4cdaf9099f9 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/exclamation_shield.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/exclamation_small.png b/interface/ispconfig/interface/themes/default/icons/x16/exclamation_small.png new file mode 100644 index 0000000000000000000000000000000000000000..1914f46cbb588d0b1411aa62172f5c51fcf8247b Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/exclamation_small.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/feed.png b/interface/ispconfig/interface/themes/default/icons/x16/feed.png new file mode 100644 index 0000000000000000000000000000000000000000..e757fd1d7d231262b2321f3f2dbab9344424d467 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/feed.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/feed__arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/feed__arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..5274d775870ac673cb479bc91905d6561964d5f8 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/feed__arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/feed__exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/feed__exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..54fbce83a8d8d6a6ef54897e4b9fb341f89b0541 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/feed__exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/feed__minus.png b/interface/ispconfig/interface/themes/default/icons/x16/feed__minus.png new file mode 100644 index 0000000000000000000000000000000000000000..01accb5d188a8ade5736ab204ead4fdf39d4bf10 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/feed__minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/feed__pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/feed__pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..aa9ed7c27fa5b2053373852e7993e686cb8fe3c6 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/feed__pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/feed__plus.png b/interface/ispconfig/interface/themes/default/icons/x16/feed__plus.png new file mode 100644 index 0000000000000000000000000000000000000000..551480d02419271c9ca6aead0d5732e296d0ff8c Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/feed__plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/feed_balloon.png b/interface/ispconfig/interface/themes/default/icons/x16/feed_balloon.png new file mode 100644 index 0000000000000000000000000000000000000000..4eb8f014ba9e3878d66c8718b23dec88c6bf9888 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/feed_balloon.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/feed_small.png b/interface/ispconfig/interface/themes/default/icons/x16/feed_small.png new file mode 100644 index 0000000000000000000000000000000000000000..e6948bd4d339570c7d8b96bcc4f7d20f226cf03d Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/feed_small.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/film.png b/interface/ispconfig/interface/themes/default/icons/x16/film.png new file mode 100644 index 0000000000000000000000000000000000000000..4efcaa7df6d1f13aefea3f26258dcdc510f570e7 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/film.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/film_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/film_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..da770a5d867fa606c4f3e781b6febce3f1ff4cae Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/film_arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/film_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/film_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..5bdc600630ff7b3ccde9a5bf8b908f2bbfb17571 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/film_exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/film_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/film_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..46bd3dff871c0373fadf2516634b9271e996b6a0 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/film_minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/film_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/film_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..3f391490df721ef79236f02aea83f12d67316c55 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/film_pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/film_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/film_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..17abcf8214bb09fba039f70cdf76ca34566df86a Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/film_plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/film_small.png b/interface/ispconfig/interface/themes/default/icons/x16/film_small.png new file mode 100644 index 0000000000000000000000000000000000000000..5ae92ae21468bf18adcf446bf97a7d1e3c577360 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/film_small.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/films.png b/interface/ispconfig/interface/themes/default/icons/x16/films.png new file mode 100644 index 0000000000000000000000000000000000000000..c004ac923a29fbf11c59a946b2d19b42807d32b7 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/films.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/films_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/films_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..00ef91b2376097bca7f81ee67489be8a2f3625c5 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/films_arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/films_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/films_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..1a0a5b66f388b4b29d996908e1f4dc70c24df0b6 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/films_exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/films_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/films_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..c2112cb34e7b724ece9b242840afe2c8c0a0d0e7 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/films_minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/films_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/films_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..1bd451a8b4729a79770b5949e14c277c7bb4ad67 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/films_pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/films_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/films_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..b14d6b553dcfdb3f25fdb63de462d7316cdee618 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/films_plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/flag.png b/interface/ispconfig/interface/themes/default/icons/x16/flag.png new file mode 100644 index 0000000000000000000000000000000000000000..7a56f68691763b44537d11e6b17d51765a650ae6 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/flag.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/flag_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/flag_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..26f8217f6b92f072165d9df6bddd5503ce1af101 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/flag_arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/flag_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/flag_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..37517f6cbf2bda551e4d2a4d5be5b8af4d6ba4f6 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/flag_exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/flag_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/flag_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..351fbc67f985654b78e91658ca41bd6ebcffdc7b Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/flag_minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/flag_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/flag_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..57936a9bf9a3cb03b40e743b6bf00deab74ba114 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/flag_pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/flag_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/flag_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..ad63870e19da4bc91d048c5b26b65d48825325fd Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/flag_plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/folder.png b/interface/ispconfig/interface/themes/default/icons/x16/folder.png new file mode 100644 index 0000000000000000000000000000000000000000..a1fd28befc1c466d0c4b0a4f80b2b3601dc96b1c Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/folder.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/folder__arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/folder__arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..b700c10479aaec7febde7a806dcdbf808c4a76d0 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/folder__arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/folder__exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/folder__exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..4f28e2e721599b95683792b0f112bbea0f444cbf Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/folder__exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/folder__minus.png b/interface/ispconfig/interface/themes/default/icons/x16/folder__minus.png new file mode 100644 index 0000000000000000000000000000000000000000..73273b0b800d2ce4d392c32d10f5cf7710f512e0 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/folder__minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/folder__pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/folder__pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..7725b6302f38d778403e2c669904e43b534a2df9 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/folder__pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/folder__plus.png b/interface/ispconfig/interface/themes/default/icons/x16/folder__plus.png new file mode 100644 index 0000000000000000000000000000000000000000..221176212ad7e7da026a1c1b692cf81e4864f573 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/folder__plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/folder_open.png b/interface/ispconfig/interface/themes/default/icons/x16/folder_open.png new file mode 100644 index 0000000000000000000000000000000000000000..a74df842467fa6b16123484501ee0b3b4d5948ea Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/folder_open.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/folder_open_document.png b/interface/ispconfig/interface/themes/default/icons/x16/folder_open_document.png new file mode 100644 index 0000000000000000000000000000000000000000..99396001e4c01d97c8ee408a392fa96adec2e9ad Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/folder_open_document.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/folder_open_document_music.png b/interface/ispconfig/interface/themes/default/icons/x16/folder_open_document_music.png new file mode 100644 index 0000000000000000000000000000000000000000..7e75c247f1c41f1bce9a52152b3ba8b369faa970 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/folder_open_document_music.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/folder_open_document_music_playlist.png b/interface/ispconfig/interface/themes/default/icons/x16/folder_open_document_music_playlist.png new file mode 100644 index 0000000000000000000000000000000000000000..bddb6de2f7b326787d394624fad2e8e1ec55c7a1 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/folder_open_document_music_playlist.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/folder_open_document_text.png b/interface/ispconfig/interface/themes/default/icons/x16/folder_open_document_text.png new file mode 100644 index 0000000000000000000000000000000000000000..50810b11ca981b79aaaf3a430625f2d7f7ffe5a7 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/folder_open_document_text.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/folder_open_film.png b/interface/ispconfig/interface/themes/default/icons/x16/folder_open_film.png new file mode 100644 index 0000000000000000000000000000000000000000..75b398da3e897227c6cadede7fad351c2b61fe2e Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/folder_open_film.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/folder_open_image.png b/interface/ispconfig/interface/themes/default/icons/x16/folder_open_image.png new file mode 100644 index 0000000000000000000000000000000000000000..a63d6295a4730d585c52872c90f3bb5237d76dbd Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/folder_open_image.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/folder_shred.png b/interface/ispconfig/interface/themes/default/icons/x16/folder_shred.png new file mode 100644 index 0000000000000000000000000000000000000000..ab09f6eb201c3b1a6ed788c5c8c37b6f44ebc1c3 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/folder_shred.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/folder_small.png b/interface/ispconfig/interface/themes/default/icons/x16/folder_small.png new file mode 100644 index 0000000000000000000000000000000000000000..b60ab4a1bb89ea7a61c1700a5ccbd6ff53d04093 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/folder_small.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/folder_zipper.png b/interface/ispconfig/interface/themes/default/icons/x16/folder_zipper.png new file mode 100644 index 0000000000000000000000000000000000000000..43eb7d6d48b33287786f1a99efc4f9908549da63 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/folder_zipper.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/folders.png b/interface/ispconfig/interface/themes/default/icons/x16/folders.png new file mode 100644 index 0000000000000000000000000000000000000000..b3af87508fe36e87c8080c8a8c0b63741c99aadf Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/folders.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/folders_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/folders_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..c05ed08544f9b464865c577706c9275200db227b Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/folders_arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/folders_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/folders_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..946b46d51975cb3601aafd16e62b7ffe31a00cd9 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/folders_exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/folders_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/folders_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..9de8dbaf7d5d44307d74b2a728e7a10aef6c7c98 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/folders_minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/folders_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/folders_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..d246d63835668ef47be08de817d1981c90f1781b Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/folders_pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/folders_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/folders_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..aabf8edadee90605039f087373d8506116ef6db9 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/folders_plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/folders_stack.png b/interface/ispconfig/interface/themes/default/icons/x16/folders_stack.png new file mode 100644 index 0000000000000000000000000000000000000000..477e7da065c3d10a2b840a936fdb455435c347c6 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/folders_stack.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/funnel.png b/interface/ispconfig/interface/themes/default/icons/x16/funnel.png new file mode 100644 index 0000000000000000000000000000000000000000..3cd7a8b5059533e558bbc3470ddfe7d9ab53cf88 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/funnel.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/funnel_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/funnel_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..2213a2b205c6f68316690c69cd54ba310345ab89 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/funnel_arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/funnel_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/funnel_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..fd24ec75072bf9ea2910197f86a02af546da2b84 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/funnel_exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/funnel_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/funnel_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..40c0cafa1f8653519ab1d49c6bdd6dbaa68d88b7 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/funnel_minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/funnel_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/funnel_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..5caa578d5a27a19ad727efc2245d5f182107e973 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/funnel_pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/funnel_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/funnel_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..40a2c2e43a4c5736b1110e9ca23d1831f93d73e3 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/funnel_plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/funnel_small.png b/interface/ispconfig/interface/themes/default/icons/x16/funnel_small.png new file mode 100644 index 0000000000000000000000000000000000000000..c1f307969e6bdb4857eac0ec158f26f1840cd6e5 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/funnel_small.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/gear.png b/interface/ispconfig/interface/themes/default/icons/x16/gear.png new file mode 100644 index 0000000000000000000000000000000000000000..9db64b5837dc0abbf0ce73f90c944ad36dd2cf10 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/gear.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/gear__arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/gear__arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..368546fad7c6d4a2f29dc33c57bec1e0b1b3291b Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/gear__arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/gear__exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/gear__exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..97e8a0ecdf9d4b4b4ef051cbda39f5ce026875c1 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/gear__exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/gear__minus.png b/interface/ispconfig/interface/themes/default/icons/x16/gear__minus.png new file mode 100644 index 0000000000000000000000000000000000000000..b820b7e25de49384e68c185446ebf062cf7f28c8 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/gear__minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/gear__pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/gear__pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..f4f9d07e59bbfc944dd7c584b9ba3e95865dc13c Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/gear__pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/gear__plus.png b/interface/ispconfig/interface/themes/default/icons/x16/gear__plus.png new file mode 100644 index 0000000000000000000000000000000000000000..bc4cd9e766e8f432b3e71a45d4a1c243a6d6104f Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/gear__plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/gear_disable.png b/interface/ispconfig/interface/themes/default/icons/x16/gear_disable.png new file mode 100644 index 0000000000000000000000000000000000000000..b213087219ff7eb5e95224af6d1b83f89d002c9c Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/gear_disable.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/gear_small.png b/interface/ispconfig/interface/themes/default/icons/x16/gear_small.png new file mode 100644 index 0000000000000000000000000000000000000000..87f66c5236e915f7470884f42c28cbeb5627cf07 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/gear_small.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/hammer.png b/interface/ispconfig/interface/themes/default/icons/x16/hammer.png new file mode 100644 index 0000000000000000000000000000000000000000..d12036a6ebebe59a5776b1ac793cc62fd4d2f98e Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/hammer.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/hammer__arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/hammer__arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..21374ea5ee19a28c578526d10ee29db917d03911 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/hammer__arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/hammer__exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/hammer__exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..1810f6118eafc1aaadaf72f3dd8b7bd27d0ad92a Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/hammer__exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/hammer__minus.png b/interface/ispconfig/interface/themes/default/icons/x16/hammer__minus.png new file mode 100644 index 0000000000000000000000000000000000000000..f1a9d67dd321fc6fbfeed3c66ec5a65fb7b49c61 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/hammer__minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/hammer__pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/hammer__pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..2e1efbfc65907575853a8e3b3dd47cbecc207ae7 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/hammer__pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/hammer__plus.png b/interface/ispconfig/interface/themes/default/icons/x16/hammer__plus.png new file mode 100644 index 0000000000000000000000000000000000000000..03bcc509fe5be606b636da7d721420afb8ed849f Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/hammer__plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/hammer_left.png b/interface/ispconfig/interface/themes/default/icons/x16/hammer_left.png new file mode 100644 index 0000000000000000000000000000000000000000..e808616c4acab4c2653eb7e7fb6b94f6ef358e2d Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/hammer_left.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/hammer_screwdriver.png b/interface/ispconfig/interface/themes/default/icons/x16/hammer_screwdriver.png new file mode 100644 index 0000000000000000000000000000000000000000..485fcf20b83e7e121a8b0e96254775fb5817f92a Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/hammer_screwdriver.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/heart.png b/interface/ispconfig/interface/themes/default/icons/x16/heart.png new file mode 100644 index 0000000000000000000000000000000000000000..f98dac0304179df36f99e38f4f9724f8c412edc1 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/heart.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/heart__arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/heart__arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..162a28b6f536fe9bfbefd652fad368b631539580 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/heart__arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/heart__exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/heart__exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..d90fc15c33d5c226dfb51294a63b7841405ca3fc Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/heart__exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/heart__minus.png b/interface/ispconfig/interface/themes/default/icons/x16/heart__minus.png new file mode 100644 index 0000000000000000000000000000000000000000..4c8c315a4b7fcadb1c463617b6ca6758f9406166 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/heart__minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/heart__pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/heart__pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..175b98096e961d61e0628b2befa8d01bdc4a10ef Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/heart__pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/heart__plus.png b/interface/ispconfig/interface/themes/default/icons/x16/heart__plus.png new file mode 100644 index 0000000000000000000000000000000000000000..9bc94cdb261df7a2f73e833ca6e2bd1038242982 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/heart__plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/heart_break.png b/interface/ispconfig/interface/themes/default/icons/x16/heart_break.png new file mode 100644 index 0000000000000000000000000000000000000000..4317a94d805e12f29c6a78885d2fec396d8fbf64 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/heart_break.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/heart_empty.png b/interface/ispconfig/interface/themes/default/icons/x16/heart_empty.png new file mode 100644 index 0000000000000000000000000000000000000000..a7754d7b659bfd7228c9bbc71168c50dee9671e3 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/heart_empty.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/heart_half.png b/interface/ispconfig/interface/themes/default/icons/x16/heart_half.png new file mode 100644 index 0000000000000000000000000000000000000000..5046e3e010f768aab84aae61ef40e769f61c3481 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/heart_half.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/heart_small.png b/interface/ispconfig/interface/themes/default/icons/x16/heart_small.png new file mode 100644 index 0000000000000000000000000000000000000000..52f2739ccaf7b9cc08a8d735e2ca1450f605c039 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/heart_small.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/heart_small_empty.png b/interface/ispconfig/interface/themes/default/icons/x16/heart_small_empty.png new file mode 100644 index 0000000000000000000000000000000000000000..0e0d9a87218553f08297c4c6191fe507f5cb0a4c Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/heart_small_empty.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/heart_small_half.png b/interface/ispconfig/interface/themes/default/icons/x16/heart_small_half.png new file mode 100644 index 0000000000000000000000000000000000000000..a68c63cac098a32f5eb8805ecfdf310a1dcb22e6 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/heart_small_half.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/home.png b/interface/ispconfig/interface/themes/default/icons/x16/home.png new file mode 100644 index 0000000000000000000000000000000000000000..bbfd2813618592d0db02c89ffd127b348bf9335c Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/home.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/home_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/home_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..8fbc5b967661dbc2997e7ba4d7f1c936abd43eb9 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/home_arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/home_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/home_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..eb4e40d3d30d25f981953de0a185858e645f6dc1 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/home_exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/home_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/home_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..632e32f8898ecb6c84de1886f92da994008c9415 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/home_minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/home_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/home_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..02503c4a615dafefadf38e961d18ff04ae2640e8 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/home_pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/home_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/home_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..d8e87d60427a7cfcf99ff752fd11f4c6e9e897b7 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/home_plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/home_small.png b/interface/ispconfig/interface/themes/default/icons/x16/home_small.png new file mode 100644 index 0000000000000000000000000000000000000000..e2213d6361ca8867f51020ec5397af201c75c54b Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/home_small.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/image.png b/interface/ispconfig/interface/themes/default/icons/x16/image.png new file mode 100644 index 0000000000000000000000000000000000000000..cb1afc63c4b821017a4c66e053008e9fdc48f3d7 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/image.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/image_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/image_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..32dda528843e0e865c721be09f11b0f495f41394 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/image_arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/image_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/image_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..179d435193f4709cafafe83c35179dd10c5185a6 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/image_exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/image_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/image_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..8e8fbf583e27cb76139305ed89f891d6a14461b9 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/image_minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/image_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/image_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..4a531f93b580199189ce3635458f8e2be0b94245 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/image_pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/image_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/image_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..c2967cf773644ae9ae89a29538a19a8e01ef7752 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/image_plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/image_resize.png b/interface/ispconfig/interface/themes/default/icons/x16/image_resize.png new file mode 100644 index 0000000000000000000000000000000000000000..3c66a736706690f71ce177979690f30913a5f1e7 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/image_resize.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/image_resize_actual.png b/interface/ispconfig/interface/themes/default/icons/x16/image_resize_actual.png new file mode 100644 index 0000000000000000000000000000000000000000..5e4a6bd23737d7c0278a8b526ab22db26f23519a Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/image_resize_actual.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/image_small.png b/interface/ispconfig/interface/themes/default/icons/x16/image_small.png new file mode 100644 index 0000000000000000000000000000000000000000..7d411b90e0b170e71ace72c9d74d88c11d7c89b7 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/image_small.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/image_small_sunset.png b/interface/ispconfig/interface/themes/default/icons/x16/image_small_sunset.png new file mode 100644 index 0000000000000000000000000000000000000000..9341f40174b7fb796cc19755ca986e7b45849b96 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/image_small_sunset.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/image_sunset.png b/interface/ispconfig/interface/themes/default/icons/x16/image_sunset.png new file mode 100644 index 0000000000000000000000000000000000000000..0ed90badbac4e0e5208c533eabc3036260097fd9 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/image_sunset.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/images.png b/interface/ispconfig/interface/themes/default/icons/x16/images.png new file mode 100644 index 0000000000000000000000000000000000000000..2f920d564d92be2d0c32ed4bd3ce7efa1fc3a154 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/images.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/images_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/images_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..9194b6623e95f0697f11598599c090768e5face0 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/images_arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/images_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/images_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..5e43974f1799a22e997028d80132241dcdd41840 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/images_exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/images_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/images_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..47b39a6537c588aae70299e11ab3642fd227999d Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/images_minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/images_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/images_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..2bd5889ea1662a021627b6b9a55ef949683e1e8f Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/images_pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/images_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/images_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..599b9bf6f977bab424533b7781c8bc19fc605475 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/images_plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/images_stack.png b/interface/ispconfig/interface/themes/default/icons/x16/images_stack.png new file mode 100644 index 0000000000000000000000000000000000000000..556becb2e3ad8babc3d355c04b6b4e7b3a6ff4f6 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/images_stack.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/inbox.png b/interface/ispconfig/interface/themes/default/icons/x16/inbox.png new file mode 100644 index 0000000000000000000000000000000000000000..0cd80454b21b68eb84463a17f991b786f496d88f Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/inbox.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/inbox_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/inbox_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..af03fa1dc23196f4185a6265a3395e6d8dfbd848 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/inbox_arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/inbox_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/inbox_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..e1e2b4c613ecff53ca6d79c308f811f643d794c5 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/inbox_exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/inbox_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/inbox_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..43e8399fa136eadee25b77a8a13ba2dec316a877 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/inbox_minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/inbox_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/inbox_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..0401ec2955a9a56b4fde8c523d846305ffa38f4b Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/inbox_pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/inbox_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/inbox_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..94b9bacc8a1a1a9795f4522d56cc96dc8299987e Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/inbox_plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/information.png b/interface/ispconfig/interface/themes/default/icons/x16/information.png new file mode 100644 index 0000000000000000000000000000000000000000..d39b18dd117ed09b463494a3f6307226c560ea2c Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/information.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/information_frame.png b/interface/ispconfig/interface/themes/default/icons/x16/information_frame.png new file mode 100644 index 0000000000000000000000000000000000000000..3dfa5b731be52cd8a715c9f7619287fa3875f848 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/information_frame.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/information_shield.png b/interface/ispconfig/interface/themes/default/icons/x16/information_shield.png new file mode 100644 index 0000000000000000000000000000000000000000..4b136a830494f15d9fbca0fffc226a6f86f8037d Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/information_shield.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/information_small.png b/interface/ispconfig/interface/themes/default/icons/x16/information_small.png new file mode 100644 index 0000000000000000000000000000000000000000..be72df5ec8b7c6924047570913a7475ee645ef92 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/information_small.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/key.png b/interface/ispconfig/interface/themes/default/icons/x16/key.png new file mode 100644 index 0000000000000000000000000000000000000000..48d782bf12433636afc86d4d8696c7adb4666dfc Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/key.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/key__arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/key__arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..c41e4930e72b0ce4bc6fb9fcc946717242659a40 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/key__arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/key__exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/key__exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..b7b4290e4a024ee36c56b13a788a125b718a3f31 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/key__exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/key__minus.png b/interface/ispconfig/interface/themes/default/icons/x16/key__minus.png new file mode 100644 index 0000000000000000000000000000000000000000..67fcc277503098eb0b3aeacd91179b1851330784 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/key__minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/key__pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/key__pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..267f7ad4fa70fa78b7e97e7eff9d0d93f1f1f2cf Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/key__pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/key__plus.png b/interface/ispconfig/interface/themes/default/icons/x16/key__plus.png new file mode 100644 index 0000000000000000000000000000000000000000..a2372a7b401e8fc6af4c249e9fa74b2f812f9e4f Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/key__plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/key_disable.png b/interface/ispconfig/interface/themes/default/icons/x16/key_disable.png new file mode 100644 index 0000000000000000000000000000000000000000..2bfd5aef479014bcc30257385c955f0133c7c019 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/key_disable.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/layout.png b/interface/ispconfig/interface/themes/default/icons/x16/layout.png new file mode 100644 index 0000000000000000000000000000000000000000..d0cedfe2d0752b1bcd9c05872e6405475ead500e Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/layout.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/layout_2.png b/interface/ispconfig/interface/themes/default/icons/x16/layout_2.png new file mode 100644 index 0000000000000000000000000000000000000000..b0e3a9619d9de6bafe78f8ceaa140ee9285618dc Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/layout_2.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/layout_2_equal.png b/interface/ispconfig/interface/themes/default/icons/x16/layout_2_equal.png new file mode 100644 index 0000000000000000000000000000000000000000..f25bb2387004c809587d4d240ee9893fa1f54df7 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/layout_2_equal.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/layout_3.png b/interface/ispconfig/interface/themes/default/icons/x16/layout_3.png new file mode 100644 index 0000000000000000000000000000000000000000..0740661a15e5e5b2e0c4b18afa9f4cb9deffc341 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/layout_3.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/layout_3_mix.png b/interface/ispconfig/interface/themes/default/icons/x16/layout_3_mix.png new file mode 100644 index 0000000000000000000000000000000000000000..b984bc036379a10d5479c092bf824f126873a94f Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/layout_3_mix.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/layout_header.png b/interface/ispconfig/interface/themes/default/icons/x16/layout_header.png new file mode 100644 index 0000000000000000000000000000000000000000..f8a173cec333d362e02cfffbce3f44c30cd7369e Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/layout_header.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/layout_header_2.png b/interface/ispconfig/interface/themes/default/icons/x16/layout_header_2.png new file mode 100644 index 0000000000000000000000000000000000000000..e3ba2aa9a8897a19bbc76f61c0248654b1c67622 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/layout_header_2.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/layout_header_2_equal.png b/interface/ispconfig/interface/themes/default/icons/x16/layout_header_2_equal.png new file mode 100644 index 0000000000000000000000000000000000000000..26987b80284d4c025941130f6ee8e788c992d696 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/layout_header_2_equal.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/layout_header_3.png b/interface/ispconfig/interface/themes/default/icons/x16/layout_header_3.png new file mode 100644 index 0000000000000000000000000000000000000000..04bbe9d067d66dd33d6d779c43881a04657d8740 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/layout_header_3.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/layout_header_3_mix.png b/interface/ispconfig/interface/themes/default/icons/x16/layout_header_3_mix.png new file mode 100644 index 0000000000000000000000000000000000000000..3729263573c517e1266ea219b6b0ac48cc3d83d8 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/layout_header_3_mix.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/layout_header_footer.png b/interface/ispconfig/interface/themes/default/icons/x16/layout_header_footer.png new file mode 100644 index 0000000000000000000000000000000000000000..806a18491a1ab903272654fc3b957344d228dd9e Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/layout_header_footer.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/layout_header_footer_2.png b/interface/ispconfig/interface/themes/default/icons/x16/layout_header_footer_2.png new file mode 100644 index 0000000000000000000000000000000000000000..2648663702d2fa2cdb0815b8930ff033eeb518b2 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/layout_header_footer_2.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/layout_header_footer_2_equal.png b/interface/ispconfig/interface/themes/default/icons/x16/layout_header_footer_2_equal.png new file mode 100644 index 0000000000000000000000000000000000000000..969adf994a85aa8d25a46c8da1970074d029af2a Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/layout_header_footer_2_equal.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/layout_header_footer_3.png b/interface/ispconfig/interface/themes/default/icons/x16/layout_header_footer_3.png new file mode 100644 index 0000000000000000000000000000000000000000..f3d4cb15e877a549cce60bd13d7b9ea088d592e7 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/layout_header_footer_3.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/layout_header_footer_3_mix.png b/interface/ispconfig/interface/themes/default/icons/x16/layout_header_footer_3_mix.png new file mode 100644 index 0000000000000000000000000000000000000000..e1ff08674190115931b67864e67b8f660d56d087 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/layout_header_footer_3_mix.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/layout_join.png b/interface/ispconfig/interface/themes/default/icons/x16/layout_join.png new file mode 100644 index 0000000000000000000000000000000000000000..868cd87ac58917fb85eb8c64b763d389f42acb4f Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/layout_join.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/layout_split.png b/interface/ispconfig/interface/themes/default/icons/x16/layout_split.png new file mode 100644 index 0000000000000000000000000000000000000000..2af50ef3d9c2fef38947c9a5b3d565be77597b23 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/layout_split.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/lifebuoy.png b/interface/ispconfig/interface/themes/default/icons/x16/lifebuoy.png new file mode 100644 index 0000000000000000000000000000000000000000..f9da9d537e9731ac2796a9c4830193669b8e9674 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/lifebuoy.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/lifebuoy_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/lifebuoy_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..52b042ae18689004a1a1383bef23ed3e2c22c10d Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/lifebuoy_arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/lifebuoy_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/lifebuoy_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..34f9353271f9c794451b500eecf89024f70e2ef5 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/lifebuoy_exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/lifebuoy_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/lifebuoy_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..0586bc02882ffed330ef5073d1141d3730721616 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/lifebuoy_minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/lifebuoy_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/lifebuoy_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..f4cd98da01d7addc58c902d9db9b2a0fba1016ea Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/lifebuoy_pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/lifebuoy_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/lifebuoy_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..327434a5e654b12399ca241b73d36d24e69625ba Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/lifebuoy_plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/light_bulb.png b/interface/ispconfig/interface/themes/default/icons/x16/light_bulb.png new file mode 100644 index 0000000000000000000000000000000000000000..7e8aafdf9654fcd9867918d06779c1df4f008799 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/light_bulb.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/light_bulb__arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/light_bulb__arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..0413f5e6d8f30e99dae73186ce1b44dc7ad3c3cb Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/light_bulb__arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/light_bulb__exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/light_bulb__exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..febe9fe85e16d09585af1144385b297d6feeb2b7 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/light_bulb__exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/light_bulb__minus.png b/interface/ispconfig/interface/themes/default/icons/x16/light_bulb__minus.png new file mode 100644 index 0000000000000000000000000000000000000000..cfbdd0ae8e77dbc8d0b41292a17abdf7e8970dd5 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/light_bulb__minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/light_bulb__pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/light_bulb__pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..b484eb61315d254b61322e69b43049ac4c5d97a4 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/light_bulb__pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/light_bulb__plus.png b/interface/ispconfig/interface/themes/default/icons/x16/light_bulb__plus.png new file mode 100644 index 0000000000000000000000000000000000000000..b35850e07c397c0f6be274c1c23c83415b14a6e5 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/light_bulb__plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/light_bulb_off.png b/interface/ispconfig/interface/themes/default/icons/x16/light_bulb_off.png new file mode 100644 index 0000000000000000000000000000000000000000..cccadd498e2b5ada36b9499d9951b316f608aec1 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/light_bulb_off.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/light_bulb_small.png b/interface/ispconfig/interface/themes/default/icons/x16/light_bulb_small.png new file mode 100644 index 0000000000000000000000000000000000000000..6260f5277b36111596cb83c4933c9a555b098809 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/light_bulb_small.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/light_bulb_small_off.png b/interface/ispconfig/interface/themes/default/icons/x16/light_bulb_small_off.png new file mode 100644 index 0000000000000000000000000000000000000000..90706c581a20f68dfeb3238d407c648f56464da9 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/light_bulb_small_off.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/lightning.png b/interface/ispconfig/interface/themes/default/icons/x16/lightning.png new file mode 100644 index 0000000000000000000000000000000000000000..1c7e55c44c397f62a83eae0c4dd1add3f419efcc Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/lightning.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/lightning__arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/lightning__arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..6ef567de3648d9cbab0c7f5c46dfc900739452f2 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/lightning__arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/lightning__exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/lightning__exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..af2683158f879e5a2e3bfac46868f1cb9bef9194 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/lightning__exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/lightning__minus.png b/interface/ispconfig/interface/themes/default/icons/x16/lightning__minus.png new file mode 100644 index 0000000000000000000000000000000000000000..1ef5976d801a08b9f87379ce6a289e3d87adbfc4 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/lightning__minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/lightning__pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/lightning__pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..8385d118db72e526e7a6a4155a7e53cfa1b8a5ed Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/lightning__pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/lightning__plus.png b/interface/ispconfig/interface/themes/default/icons/x16/lightning__plus.png new file mode 100644 index 0000000000000000000000000000000000000000..0e1765a8f99efd5bd222b46929ce57d1a8d9cd83 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/lightning__plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/lightning_disable.png b/interface/ispconfig/interface/themes/default/icons/x16/lightning_disable.png new file mode 100644 index 0000000000000000000000000000000000000000..f4c8865c895d3e269262b703f58e72469e069e98 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/lightning_disable.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/lightning_small.png b/interface/ispconfig/interface/themes/default/icons/x16/lightning_small.png new file mode 100644 index 0000000000000000000000000000000000000000..b01235427ecd875154fb9408b6b29274d8a99221 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/lightning_small.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/lock.png b/interface/ispconfig/interface/themes/default/icons/x16/lock.png new file mode 100644 index 0000000000000000000000000000000000000000..b5de7c4d78ab421dae924f39bd668a3ed7e7a056 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/lock.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/lock__arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/lock__arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..e5bc39b697b37f433757a030b1e1ca80a580cb63 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/lock__arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/lock__exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/lock__exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..1cb8f93b325e1d7374b1436d8986b122a5d4d816 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/lock__exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/lock__minus.png b/interface/ispconfig/interface/themes/default/icons/x16/lock__minus.png new file mode 100644 index 0000000000000000000000000000000000000000..7e082cecc5e3fa506c55404305645d3f7e04202c Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/lock__minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/lock__pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/lock__pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..893c42572abfdbdbf92ff0861d462a124e805ec5 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/lock__pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/lock__plus.png b/interface/ispconfig/interface/themes/default/icons/x16/lock__plus.png new file mode 100644 index 0000000000000000000000000000000000000000..b514b8d16a5f30ae42af099ed39ac86c603b4762 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/lock__plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/lock_disable.png b/interface/ispconfig/interface/themes/default/icons/x16/lock_disable.png new file mode 100644 index 0000000000000000000000000000000000000000..9c9c539a93f6b3ce4e69d0549726ca06e0099bea Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/lock_disable.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/lock_small.png b/interface/ispconfig/interface/themes/default/icons/x16/lock_small.png new file mode 100644 index 0000000000000000000000000000000000000000..cd4ffe8e2433fbd36781d171ecdb3cd6737ca875 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/lock_small.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/lock_unlock.png b/interface/ispconfig/interface/themes/default/icons/x16/lock_unlock.png new file mode 100644 index 0000000000000000000000000000000000000000..5c4180e967e7e00d05a8f3ab686eedd1db43059a Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/lock_unlock.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/logout.png b/interface/ispconfig/interface/themes/default/icons/x16/logout.png new file mode 100644 index 0000000000000000000000000000000000000000..63232417a40ad04875f4a86dd31f0effa27435de Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/logout.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/magnet.png b/interface/ispconfig/interface/themes/default/icons/x16/magnet.png new file mode 100644 index 0000000000000000000000000000000000000000..35181f5bfa6db971f262034802a9bed597d4b921 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/magnet.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/magnet__arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/magnet__arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..900479f8c8a6bd7cff2c0aa89284eaf23ddba7fb Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/magnet__arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/magnet__exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/magnet__exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..b2c0cd1aab53487ae20998d29ea30ecd8e454747 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/magnet__exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/magnet__minus.png b/interface/ispconfig/interface/themes/default/icons/x16/magnet__minus.png new file mode 100644 index 0000000000000000000000000000000000000000..9c75b59b82108fdb671114b25f822f62522ec41e Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/magnet__minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/magnet__pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/magnet__pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..47c7969c1cf40441c2bfbb354e5392cc8e5c9cf9 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/magnet__pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/magnet__plus.png b/interface/ispconfig/interface/themes/default/icons/x16/magnet__plus.png new file mode 100644 index 0000000000000000000000000000000000000000..f623924d5699fac8d508fcd5f4c6f1498b529e3f Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/magnet__plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/magnet_disable.png b/interface/ispconfig/interface/themes/default/icons/x16/magnet_disable.png new file mode 100644 index 0000000000000000000000000000000000000000..d91043572f2327b50b9f6436ebdf07341462c28e Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/magnet_disable.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/magnet_small.png b/interface/ispconfig/interface/themes/default/icons/x16/magnet_small.png new file mode 100644 index 0000000000000000000000000000000000000000..9574801432c582d9ac0b8a6db995236b4a24ba9c Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/magnet_small.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/magnifier.png b/interface/ispconfig/interface/themes/default/icons/x16/magnifier.png new file mode 100644 index 0000000000000000000000000000000000000000..c6b967c97d4d4cb42d835e8937cafb224aa64e3a Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/magnifier.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/magnifier__arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/magnifier__arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..90772659bff5f28b9eedae925a2f872e4c6b91a4 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/magnifier__arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/magnifier__exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/magnifier__exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..c005a93041ef6a464ce9af6db99ccde86a469c2f Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/magnifier__exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/magnifier__minus.png b/interface/ispconfig/interface/themes/default/icons/x16/magnifier__minus.png new file mode 100644 index 0000000000000000000000000000000000000000..792e242f7452e1dc07f9cf55d4df04b76f1c1fae Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/magnifier__minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/magnifier__pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/magnifier__pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..c6eb6513507208e2a5e3e43c8bf0ee9ccf0db61d Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/magnifier__pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/magnifier__plus.png b/interface/ispconfig/interface/themes/default/icons/x16/magnifier__plus.png new file mode 100644 index 0000000000000000000000000000000000000000..3eb38a2ebaaccd7dc01482cc381682acbf30ec05 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/magnifier__plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/magnifier_left.png b/interface/ispconfig/interface/themes/default/icons/x16/magnifier_left.png new file mode 100644 index 0000000000000000000000000000000000000000..c1bfed84f8f6ece6443b4c4c5a3cb4c867fa056b Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/magnifier_left.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/magnifier_medium.png b/interface/ispconfig/interface/themes/default/icons/x16/magnifier_medium.png new file mode 100644 index 0000000000000000000000000000000000000000..fa04793d3817c2bfdb18ea4cc8913ad238661bfd Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/magnifier_medium.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/magnifier_medium_left.png b/interface/ispconfig/interface/themes/default/icons/x16/magnifier_medium_left.png new file mode 100644 index 0000000000000000000000000000000000000000..fe6559ae4841c8b078e9ce138052c84766d61d92 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/magnifier_medium_left.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/magnifier_small.png b/interface/ispconfig/interface/themes/default/icons/x16/magnifier_small.png new file mode 100644 index 0000000000000000000000000000000000000000..ed06d85c89d3c6d5a05f49aef08eceb02c80b857 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/magnifier_small.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/magnifier_zoom.png b/interface/ispconfig/interface/themes/default/icons/x16/magnifier_zoom.png new file mode 100644 index 0000000000000000000000000000000000000000..a46dcc8cec17f9cec3c9d6f51df34009779deb0d Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/magnifier_zoom.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/magnifier_zoom_actual.png b/interface/ispconfig/interface/themes/default/icons/x16/magnifier_zoom_actual.png new file mode 100644 index 0000000000000000000000000000000000000000..a445ea6a22ae0ef103cbd9540792e54089fabeef Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/magnifier_zoom_actual.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/magnifier_zoom_fit.png b/interface/ispconfig/interface/themes/default/icons/x16/magnifier_zoom_fit.png new file mode 100644 index 0000000000000000000000000000000000000000..f534e3988a473e845c73a5e6a532b95615d78798 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/magnifier_zoom_fit.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/magnifier_zoom_out.png b/interface/ispconfig/interface/themes/default/icons/x16/magnifier_zoom_out.png new file mode 100644 index 0000000000000000000000000000000000000000..49bb8f2b1c94af41786f08fca548a678c6fe4aa5 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/magnifier_zoom_out.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/mail.png b/interface/ispconfig/interface/themes/default/icons/x16/mail.png new file mode 100644 index 0000000000000000000000000000000000000000..98b9bcdaebe6e7a72c2be4726d5f0e24ee9d84b4 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/mail.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/mail__arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/mail__arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..340783a4f84ab42c54ec15d32e47a2947d54a5c9 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/mail__arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/mail__exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/mail__exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..d37c01966cd419ed4d61601dffc237fa361ee385 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/mail__exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/mail__minus.png b/interface/ispconfig/interface/themes/default/icons/x16/mail__minus.png new file mode 100644 index 0000000000000000000000000000000000000000..adab26ad22409820be0be7618ce270f42bd6b0ec Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/mail__minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/mail__pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/mail__pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..7c07eacaaf27655fcf7c30e2264f13f5fb695851 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/mail__pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/mail__plus.png b/interface/ispconfig/interface/themes/default/icons/x16/mail__plus.png new file mode 100644 index 0000000000000000000000000000000000000000..8a39ba3f868228236729cf5e5db987fc8e81c364 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/mail__plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/mail_open.png b/interface/ispconfig/interface/themes/default/icons/x16/mail_open.png new file mode 100644 index 0000000000000000000000000000000000000000..823dd41b71cb17dfbec5e0a01853866f8629ff9a Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/mail_open.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/mail_open_document.png b/interface/ispconfig/interface/themes/default/icons/x16/mail_open_document.png new file mode 100644 index 0000000000000000000000000000000000000000..d603599abd599987a459f7c7ab2f41b5e743b72f Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/mail_open_document.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/mail_open_film.png b/interface/ispconfig/interface/themes/default/icons/x16/mail_open_film.png new file mode 100644 index 0000000000000000000000000000000000000000..a68b43779a3042f174f9a0654af64699a5111b2a Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/mail_open_film.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/mail_open_image.png b/interface/ispconfig/interface/themes/default/icons/x16/mail_open_image.png new file mode 100644 index 0000000000000000000000000000000000000000..d5079e457b1c062ffc9735aa8a9e048ccacb7591 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/mail_open_image.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/mail_small.png b/interface/ispconfig/interface/themes/default/icons/x16/mail_small.png new file mode 100644 index 0000000000000000000000000000000000000000..629448fe76b2bdb70e25fc26a5a03dbeeebcd898 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/mail_small.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/mails.png b/interface/ispconfig/interface/themes/default/icons/x16/mails.png new file mode 100644 index 0000000000000000000000000000000000000000..5c56e293310336d10a48b17c55e4ba3d6f3488e8 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/mails.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/mails_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/mails_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..f23d9f8a04260238aa53cf6ec72875fe33edcf81 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/mails_arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/mails_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/mails_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..28e709d9d106eba8db4469edf87d18ed768528f8 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/mails_exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/mails_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/mails_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..9de41a6ef87b0916619ac84c7f1a071e442c3163 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/mails_minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/mails_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/mails_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..3ce4cea085bdef055ed8f9f5a9fa0d43f23182de Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/mails_pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/mails_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/mails_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..097f686dd35b51b91b0eeb79059b05494513d1a8 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/mails_plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/mails_stack.png b/interface/ispconfig/interface/themes/default/icons/x16/mails_stack.png new file mode 100644 index 0000000000000000000000000000000000000000..25300be23b4eb3490f144a67760638b3bf6b2f80 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/mails_stack.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/media_player.png b/interface/ispconfig/interface/themes/default/icons/x16/media_player.png new file mode 100644 index 0000000000000000000000000000000000000000..d69971992487c683cf8540c8a2397f39ddb161b7 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/media_player.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/media_player__arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/media_player__arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..19b728cfba42db8aba6f1eaf1666aa14957e196c Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/media_player__arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/media_player__exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/media_player__exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..7ba29404cc094f767d5b8af36a782bef576a58a5 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/media_player__exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/media_player__minus.png b/interface/ispconfig/interface/themes/default/icons/x16/media_player__minus.png new file mode 100644 index 0000000000000000000000000000000000000000..04e3adb1216bbadca5277140b5be0922cf8c8195 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/media_player__minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/media_player__pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/media_player__pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..18326cac77e9303e219e951a0866adfeadbd4b30 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/media_player__pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/media_player__plus.png b/interface/ispconfig/interface/themes/default/icons/x16/media_player__plus.png new file mode 100644 index 0000000000000000000000000000000000000000..c5ebc6f9146e9cd3f04b18b76abf601d634b6651 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/media_player__plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/media_player_black.png b/interface/ispconfig/interface/themes/default/icons/x16/media_player_black.png new file mode 100644 index 0000000000000000000000000000000000000000..cbce27864acfdc6d3f61d9f8350e441ed7bf1309 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/media_player_black.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/media_player_medium.png b/interface/ispconfig/interface/themes/default/icons/x16/media_player_medium.png new file mode 100644 index 0000000000000000000000000000000000000000..00370f51cd29ef8394e5ddecd6a57ca5301c0509 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/media_player_medium.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/media_player_medium_black.png b/interface/ispconfig/interface/themes/default/icons/x16/media_player_medium_black.png new file mode 100644 index 0000000000000000000000000000000000000000..ed4f1c77e2dcd01db873df9b815c3c4e576ea7a7 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/media_player_medium_black.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/media_player_medium_blue.png b/interface/ispconfig/interface/themes/default/icons/x16/media_player_medium_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..dc9a154c1efc33984d0b11adcd1e177e0c25a92f Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/media_player_medium_blue.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/media_player_medium_green.png b/interface/ispconfig/interface/themes/default/icons/x16/media_player_medium_green.png new file mode 100644 index 0000000000000000000000000000000000000000..58dbd2b25b39e45add7b388210851a5d4997558f Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/media_player_medium_green.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/media_player_medium_pink.png b/interface/ispconfig/interface/themes/default/icons/x16/media_player_medium_pink.png new file mode 100644 index 0000000000000000000000000000000000000000..63c25b0d80727bc74b2b9d127c109609b42ac802 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/media_player_medium_pink.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/media_player_medium_red.png b/interface/ispconfig/interface/themes/default/icons/x16/media_player_medium_red.png new file mode 100644 index 0000000000000000000000000000000000000000..02cd6c51238e070c33808eba10bf8e62dbc5ad3c Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/media_player_medium_red.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/media_player_small.png b/interface/ispconfig/interface/themes/default/icons/x16/media_player_small.png new file mode 100644 index 0000000000000000000000000000000000000000..33082c35ba5e5ae74d41013d99f137cbd50ccd2f Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/media_player_small.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/media_player_small_blue.png b/interface/ispconfig/interface/themes/default/icons/x16/media_player_small_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..6c2fb5a3b4fd726529b26ae10cac931f6e4736be Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/media_player_small_blue.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/media_player_small_green.png b/interface/ispconfig/interface/themes/default/icons/x16/media_player_small_green.png new file mode 100644 index 0000000000000000000000000000000000000000..d3b0a65b1ea2588955b33f092f8e172e19a62032 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/media_player_small_green.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/media_player_small_purple.png b/interface/ispconfig/interface/themes/default/icons/x16/media_player_small_purple.png new file mode 100644 index 0000000000000000000000000000000000000000..170631652467bcd8d2fe04f210053b5a0193a4aa Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/media_player_small_purple.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/media_player_small_red.png b/interface/ispconfig/interface/themes/default/icons/x16/media_player_small_red.png new file mode 100644 index 0000000000000000000000000000000000000000..d07b3bf9b4e51a36723ee03640858c9cf60f653c Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/media_player_small_red.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/media_players.png b/interface/ispconfig/interface/themes/default/icons/x16/media_players.png new file mode 100644 index 0000000000000000000000000000000000000000..4cd06ff3c8543de86b5478716e83538557ec5304 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/media_players.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/media_players_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/media_players_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..6513814a6f770ec84455724510aa07d6765da29a Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/media_players_arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/media_players_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/media_players_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..aae7e554d15a6d84a6eccf8a25b0d7aec81ffa6c Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/media_players_exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/media_players_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/media_players_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..ca6ea5ceb2c1458a8b6b5332cbf571e5584cfa35 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/media_players_minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/media_players_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/media_players_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..604042ea3342d3a7a68d353b9694c3406fcadeeb Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/media_players_pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/media_players_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/media_players_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..365b7f20d11d820a8656250f577707b9615977c2 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/media_players_plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/microphone.png b/interface/ispconfig/interface/themes/default/icons/x16/microphone.png new file mode 100644 index 0000000000000000000000000000000000000000..a0be1faae4c10c1ef58952ecb96506cf975aa733 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/microphone.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/microphone_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/microphone_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..e5913c893e91c479baf135a495a5fada2258107a Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/microphone_arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/microphone_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/microphone_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..8a209e74b98d20d9eb4bb21efbb03486d058363c Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/microphone_exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/microphone_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/microphone_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..8e036cd18aa519b45feef74d6b1e0fc237c102c3 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/microphone_minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/microphone_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/microphone_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..f604b5e333cf313109aaead7d152453d6c3864e6 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/microphone_pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/microphone_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/microphone_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..a88db39fc82213c938daff99ee0309dcd0a387d6 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/microphone_plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/minus.png b/interface/ispconfig/interface/themes/default/icons/x16/minus.png new file mode 100644 index 0000000000000000000000000000000000000000..b0c15d3684753083dbc7f89112cc720ab5e3a219 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/minus_circle.png b/interface/ispconfig/interface/themes/default/icons/x16/minus_circle.png new file mode 100644 index 0000000000000000000000000000000000000000..e0cd5a83535146c17bfc75905c8de8306be2fdfa Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/minus_circle.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/minus_circle_frame.png b/interface/ispconfig/interface/themes/default/icons/x16/minus_circle_frame.png new file mode 100644 index 0000000000000000000000000000000000000000..7e4c6d5ed76fcf4563566fb261ff0ea0ca8a6781 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/minus_circle_frame.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/minus_shield.png b/interface/ispconfig/interface/themes/default/icons/x16/minus_shield.png new file mode 100644 index 0000000000000000000000000000000000000000..8f533c38c193262fbb62d89a41016780d95cc692 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/minus_shield.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/minus_small.png b/interface/ispconfig/interface/themes/default/icons/x16/minus_small.png new file mode 100644 index 0000000000000000000000000000000000000000..d1430d5720cce0e6667dcb855d9f69ff41f59578 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/minus_small.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/minus_small_circle.png b/interface/ispconfig/interface/themes/default/icons/x16/minus_small_circle.png new file mode 100644 index 0000000000000000000000000000000000000000..ef612efe465ca6a2bca634860a3a28f31d3935da Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/minus_small_circle.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/music.png b/interface/ispconfig/interface/themes/default/icons/x16/music.png new file mode 100644 index 0000000000000000000000000000000000000000..12a24c2e196e2b71745612af94baf30d1e7f455c Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/music.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/music_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/music_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..849f1e05805442873248b8ae3e4d4706cc191f7f Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/music_arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/music_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/music_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..48224f029fc430d7489287e0e7bb55ed52c09331 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/music_exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/music_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/music_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..e55eb3193515a9bd6b8a9e530d2e381203e48830 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/music_minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/music_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/music_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..6694711b6bc387a789b7d662507dce935169cc0c Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/music_pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/music_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/music_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..59d353af743887ca8e7f4739701a7b83315399fb Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/music_plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/music_small.png b/interface/ispconfig/interface/themes/default/icons/x16/music_small.png new file mode 100644 index 0000000000000000000000000000000000000000..a17dc8baf4ed85e65902d65e15a4a5028cac79d4 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/music_small.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/newspaper.png b/interface/ispconfig/interface/themes/default/icons/x16/newspaper.png new file mode 100644 index 0000000000000000000000000000000000000000..a6e3bf83fe83c24076b73e249383e4347f34f4d6 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/newspaper.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/newspaper_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/newspaper_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..215a4f59f29b3039d2d5118109aaf0f400ad9456 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/newspaper_arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/newspaper_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/newspaper_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..a94cf2c98d5e252d3ddb17dd17a8f4ccd8b0cb2d Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/newspaper_exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/newspaper_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/newspaper_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..4d9f72fc51150a5d2d396ec924555b436fe248d1 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/newspaper_minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/newspaper_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/newspaper_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..3cb5f7fdf16017aa738a38db76f8deb8f2788446 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/newspaper_pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/newspaper_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/newspaper_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..c2e738dd528f6d5c753b9718d22e6f25ae80bad5 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/newspaper_plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/newspapers.png b/interface/ispconfig/interface/themes/default/icons/x16/newspapers.png new file mode 100644 index 0000000000000000000000000000000000000000..c054fefc4106f32a1d63d5ad7e59565233b4c241 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/newspapers.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/newspapers_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/newspapers_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..e6c1409bfacfb806265d03638cde66443e410f11 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/newspapers_arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/newspapers_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/newspapers_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..5503247a22cdade5678934d477e53a252a0faaa9 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/newspapers_exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/newspapers_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/newspapers_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..758ed144842ce164c943f4ad98eb45ebd65cd40c Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/newspapers_minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/newspapers_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/newspapers_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..b70ed06ea06dc7f1ab4abfbc950697a1ff2ce6f6 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/newspapers_pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/newspapers_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/newspapers_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..fd7548d5d8e19a802174e29b39e39e3bae4b9363 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/newspapers_plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/notebook.png b/interface/ispconfig/interface/themes/default/icons/x16/notebook.png new file mode 100644 index 0000000000000000000000000000000000000000..7fab320b67294feaff48ac2ad08138e5a8c0713d Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/notebook.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/notebook_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/notebook_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..a1264dd659320435bfb777c090d360feab3ca761 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/notebook_arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/notebook_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/notebook_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..6b46ab9a473ce96e81b6d193938f065fa328dfb5 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/notebook_exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/notebook_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/notebook_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..ab8597aeb5f7b62f5ca5e0c78e6e972009e58640 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/notebook_minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/notebook_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/notebook_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..d52db4a92211f3c8098ceefa20cbc83b18edb735 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/notebook_pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/notebook_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/notebook_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..58959ab084fc3a508b2d6e388bce45bc2d91ec22 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/notebook_plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/notebooks.png b/interface/ispconfig/interface/themes/default/icons/x16/notebooks.png new file mode 100644 index 0000000000000000000000000000000000000000..2bcb1617dde8ff323c2897bccfe40a34dc992428 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/notebooks.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/notebooks_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/notebooks_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..f2104eabb2ebc053f5c811733d950ada85a699dd Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/notebooks_arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/notebooks_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/notebooks_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..1fa38738cddeb7d2d0d3eb6da04c51b8fd2c10bd Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/notebooks_exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/notebooks_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/notebooks_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..0ea4bf9c89d79a6da464f6d4f1d29da3c8b47775 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/notebooks_minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/notebooks_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/notebooks_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..6a7c830262527cd3781ca4d36ffd0ca42c8bc37a Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/notebooks_pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/notebooks_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/notebooks_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..87b531e2c2a431777cd374d755ccb5fe34fb2abd Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/notebooks_plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/paint_can.png b/interface/ispconfig/interface/themes/default/icons/x16/paint_can.png new file mode 100644 index 0000000000000000000000000000000000000000..d3d590507a6396e2ae5cf4eeef2f44232c781c24 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/paint_can.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/paint_can_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/paint_can_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..effd7005d499999efacdb26f6345b2a437901a80 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/paint_can_arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/paint_can_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/paint_can_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..e5fce1004072d9f1852675dbae3fdde8b0f47b7d Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/paint_can_exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/paint_can_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/paint_can_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..d32c3a009e9ca1117dc508a89ee874b77b6d6a73 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/paint_can_minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/paint_can_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/paint_can_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..25c85fdd646f25c09a8f1c229707804bb444b2a1 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/paint_can_pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/paint_can_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/paint_can_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..6aac490979255607bef2c1a5b042a2ee6e1f7d5b Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/paint_can_plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/palette.png b/interface/ispconfig/interface/themes/default/icons/x16/palette.png new file mode 100644 index 0000000000000000000000000000000000000000..5747acba3bb22a68fd6cc55f3f982f9f3d8d713f Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/palette.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/palette_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/palette_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..05f720dcb3ebf26e0a92e256bb32cfece06d81ed Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/palette_arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/palette_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/palette_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..e778052a4724695bfa78a50eae43e307f674065e Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/palette_exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/palette_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/palette_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..e7e375334a430812ec3516eabf30c6d7fe8b3612 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/palette_minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/palette_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/palette_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..aba2912d024cf728acf450218ee5f6a7a2b53d06 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/palette_pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/palette_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/palette_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..2742de01d07069c414d3c36e1103e62313c21f0b Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/palette_plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/paper_bag.png b/interface/ispconfig/interface/themes/default/icons/x16/paper_bag.png new file mode 100644 index 0000000000000000000000000000000000000000..f1fb0215fa952f4ae47be43b0d8b8ad7ad5e0726 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/paper_bag.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/paper_bag_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/paper_bag_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..9a8be3784f95c41dafa6e40d4dfe7d2a5c70b07d Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/paper_bag_arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/paper_bag_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/paper_bag_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..cb734d0b49445931045540d0fb2520ed261150a5 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/paper_bag_exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/paper_bag_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/paper_bag_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..de3213da0eff22b2ce29ad1e3a22971fadf64c2f Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/paper_bag_minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/paper_bag_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/paper_bag_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..3a9b7b912ef8e6cfd6d9d29c023cb7c1dd8dcfc0 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/paper_bag_pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/paper_bag_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/paper_bag_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..410f207958323fc4b20d7733b0c4275d44a51e71 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/paper_bag_plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..69b9ccaee4c17d65f017a665f1aaeab8ac718e9b Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/pencil_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/pencil_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..8430ca5ba26b9d8b9637c796a9c1e9054da3f89f Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/pencil_arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/pencil_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/pencil_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..5a77c7a6b9665ed02fa060d0129bf58a87dab41f Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/pencil_exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/pencil_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/pencil_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..685264b7bbb7afdc53740c3c3b5ef2e64bb01fc7 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/pencil_minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/pencil_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/pencil_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..8cc64e5823deab1a7250f46054305ec6b1688378 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/pencil_plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/pencil_small.png b/interface/ispconfig/interface/themes/default/icons/x16/pencil_small.png new file mode 100644 index 0000000000000000000000000000000000000000..a98d05ee22c353afbc25c1e287dbeb39eaf55f59 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/pencil_small.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/photo_album.png b/interface/ispconfig/interface/themes/default/icons/x16/photo_album.png new file mode 100644 index 0000000000000000000000000000000000000000..3b6d55932f5ced7c31beeb4377beb857d4648b15 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/photo_album.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/photo_album__arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/photo_album__arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..0b58fd3fc9c2a76876eadd0a0782e21d35a5e481 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/photo_album__arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/photo_album__exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/photo_album__exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..bc0ad363cfbd3a81219fa77574f30ece1383f1de Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/photo_album__exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/photo_album__minus.png b/interface/ispconfig/interface/themes/default/icons/x16/photo_album__minus.png new file mode 100644 index 0000000000000000000000000000000000000000..5dc180a649e66cdd04264b4c4360cb9247c5b61a Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/photo_album__minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/photo_album__pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/photo_album__pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..ca18e2448d00cbda1250cf3bc677d87894e4bbdb Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/photo_album__pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/photo_album__plus.png b/interface/ispconfig/interface/themes/default/icons/x16/photo_album__plus.png new file mode 100644 index 0000000000000000000000000000000000000000..d1fb19656ce6661478b5c106af45798ce550befc Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/photo_album__plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/photo_album_blue.png b/interface/ispconfig/interface/themes/default/icons/x16/photo_album_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..4e3f9ef42db4392ea9a12e4364c12093378b1214 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/photo_album_blue.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/piano.png b/interface/ispconfig/interface/themes/default/icons/x16/piano.png new file mode 100644 index 0000000000000000000000000000000000000000..ac40c8eae6d5055d59212e59492ad3e48bdcb88b Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/piano.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/piano_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/piano_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..7ff46432f327db09e883e4788009db3b92482eb0 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/piano_arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/piano_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/piano_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..84910e48028a8e36d04517f593d06e07967de6f1 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/piano_exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/piano_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/piano_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..920b66e9e6d3928273ae3e110f25c92421c81d43 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/piano_minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/piano_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/piano_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..cc61126f1efcc8e21c1195c7b063c2e3fc1b5149 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/piano_pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/piano_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/piano_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..165ac457f092d6e7c99f59f4e9e27c3a6081358e Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/piano_plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/picture.png b/interface/ispconfig/interface/themes/default/icons/x16/picture.png new file mode 100644 index 0000000000000000000000000000000000000000..fe5ced074fb6718b5318fd4fc4383e0901e6e789 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/picture.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/picture_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/picture_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..33c9dace031bd2d3cbfeeb7128ea4129751b9be0 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/picture_arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/picture_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/picture_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..bac2d73df1b6ddf10bc3868a95145678eac11337 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/picture_exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/picture_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/picture_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..8aca0bd3f1245c7f02cbddb057f0f37ad919f841 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/picture_minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/picture_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/picture_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..728e64c0e82583f70e2fb0b6ea5095515dbb14ba Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/picture_pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/picture_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/picture_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..da43cca6a1af2ce5b6d65d95f0969b4fb19159a4 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/picture_plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/picture_small.png b/interface/ispconfig/interface/themes/default/icons/x16/picture_small.png new file mode 100644 index 0000000000000000000000000000000000000000..75a8a0b047f4d3522ceee9ddb96cc132720107ab Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/picture_small.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/picture_small_sunset.png b/interface/ispconfig/interface/themes/default/icons/x16/picture_small_sunset.png new file mode 100644 index 0000000000000000000000000000000000000000..7aa039f8b634212a4977bf08733f9ccb6b4274c5 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/picture_small_sunset.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/picture_sunset.png b/interface/ispconfig/interface/themes/default/icons/x16/picture_sunset.png new file mode 100644 index 0000000000000000000000000000000000000000..68244bcf8e494bc98ba5b694575394885ad48bf8 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/picture_sunset.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/pictures.png b/interface/ispconfig/interface/themes/default/icons/x16/pictures.png new file mode 100644 index 0000000000000000000000000000000000000000..25765340ec0c9d789623fd167e077354fb8a4bf0 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/pictures.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/pictures_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/pictures_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..1429f33bc2a3083127486c3444de99169c411c8e Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/pictures_arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/pictures_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/pictures_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..d4b685fcc6ac1609c157fcb8e6214385a1a0811c Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/pictures_exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/pictures_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/pictures_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..92783a11a6f5d3362bbb54a8a93d7889b350ec06 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/pictures_minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/pictures_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/pictures_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..1edf5320c1344f67e7eea9217fbc68c871b0a428 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/pictures_pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/pictures_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/pictures_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..4ebdb5371b168944b93639b1d4f8243548f4b619 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/pictures_plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/pill.png b/interface/ispconfig/interface/themes/default/icons/x16/pill.png new file mode 100644 index 0000000000000000000000000000000000000000..d75a26d9ebcb157de5b0411c13d97b9e1997d1a6 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/pill.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/pill_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/pill_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..be3277ef4fb10ce4b6bf7a24e09657d0fe8fc988 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/pill_arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/pill_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/pill_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..40fa6f46565a3941bff2a50efa4679ba49355a8a Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/pill_exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/pill_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/pill_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..7d8c64bd2319c36847ef7a98868b5b2e558b5cd2 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/pill_minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/pill_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/pill_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..0724ea882febce36a3960180be5637b9e5732da6 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/pill_pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/pill_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/pill_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..676c293526668f59c20782be5787b40d8731c337 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/pill_plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/pill_small.png b/interface/ispconfig/interface/themes/default/icons/x16/pill_small.png new file mode 100644 index 0000000000000000000000000000000000000000..bf2de13448697709eb913297ceaa1e1e00230b66 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/pill_small.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/pin.png b/interface/ispconfig/interface/themes/default/icons/x16/pin.png new file mode 100644 index 0000000000000000000000000000000000000000..a762d62e53026d264b3739f4d205907018dbfd21 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/pin.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/pin_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/pin_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..905ee2860aa2132259c0ba4c568645cbab97ebe6 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/pin_arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/pin_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/pin_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..81026afbd7799013e30a021d77d006fe68a0c380 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/pin_exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/pin_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/pin_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..7c137d7f2a8f280dd24cafba020016089b98f8db Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/pin_minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/pin_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/pin_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..ba76214f01ee7152bb934d4dc939e223cc012789 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/pin_pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/pin_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/pin_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..1b7457954fbefea01e518f80402328abedb39c06 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/pin_plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/pipette.png b/interface/ispconfig/interface/themes/default/icons/x16/pipette.png new file mode 100644 index 0000000000000000000000000000000000000000..d2e99fd843cf492bf30c9683286eb23f197e44e0 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/pipette.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/pipette_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/pipette_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..9b3024999e2ffb15b96d1ff3aac61e84bf238516 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/pipette_arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/pipette_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/pipette_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..85cdafcb3a592020483a5b428dbf2ec45b370886 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/pipette_exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/pipette_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/pipette_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..e122e13886a83ef6fe40ab68980978aac12a3f94 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/pipette_minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/pipette_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/pipette_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..87cbb3519e05e1fe480aa4532e0a117bb0b08aa2 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/pipette_pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/pipette_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/pipette_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..8208f3d5f15854857f816214d669f064b47d6e35 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/pipette_plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/playing_card.png b/interface/ispconfig/interface/themes/default/icons/x16/playing_card.png new file mode 100644 index 0000000000000000000000000000000000000000..65a966bdefc718dac3347557c61ac766e1c411d7 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/playing_card.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/playing_card_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/playing_card_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..d496aa9c76333a497568a892f281e075bf087399 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/playing_card_arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/playing_card_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/playing_card_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..e94a13bf46c9d9aa0c3e86dab8fd006394873f3a Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/playing_card_exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/playing_card_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/playing_card_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..3fb65468b6d47ca3d26506060273dbebb06ac2e5 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/playing_card_minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/playing_card_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/playing_card_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..e3d13404f65dec9b900e3a643cdee1e3a9a3ff58 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/playing_card_pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/playing_card_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/playing_card_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..21224af1fa4d79a28b0aaed22fa2d65d7bab4352 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/playing_card_plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/plug.png b/interface/ispconfig/interface/themes/default/icons/x16/plug.png new file mode 100644 index 0000000000000000000000000000000000000000..29b1024ee913b219968ed170159bdf0b65de1dcb Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/plug.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/plug_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/plug_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..d3764c42aa3f5b23400791515be756a28065cc61 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/plug_arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/plug_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/plug_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..5cad9009fe942aa145c58aa627632167f85e28f9 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/plug_exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/plug_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/plug_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..06c9331deb02e071059bec7f43db5ff86368b1de Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/plug_minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/plug_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/plug_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..63dc81d2a33c8fec04dc88424923df0bdf3d62e6 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/plug_pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/plug_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/plug_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..10cff55a2314c1cd3f1f59c4dd583569f60c96dc Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/plug_plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/plus.png b/interface/ispconfig/interface/themes/default/icons/x16/plus.png new file mode 100644 index 0000000000000000000000000000000000000000..fefc08e9b6dcc3afc845291fd4b16f483d1ae2d9 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/plus_circle.png b/interface/ispconfig/interface/themes/default/icons/x16/plus_circle.png new file mode 100644 index 0000000000000000000000000000000000000000..ae80e5404787e993342bbdd10b4232372589c88c Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/plus_circle.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/plus_circle_frame.png b/interface/ispconfig/interface/themes/default/icons/x16/plus_circle_frame.png new file mode 100644 index 0000000000000000000000000000000000000000..aec8f269bc3dffd141255359e60257fed2b27a86 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/plus_circle_frame.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/plus_shield.png b/interface/ispconfig/interface/themes/default/icons/x16/plus_shield.png new file mode 100644 index 0000000000000000000000000000000000000000..ec0df77cd87f024d71e950c8ddd01ab8a0c582a6 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/plus_shield.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/plus_small.png b/interface/ispconfig/interface/themes/default/icons/x16/plus_small.png new file mode 100644 index 0000000000000000000000000000000000000000..58219c319b002bc7b03ff65fa0b50f52fee1e73f Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/plus_small.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/plus_small_circle.png b/interface/ispconfig/interface/themes/default/icons/x16/plus_small_circle.png new file mode 100644 index 0000000000000000000000000000000000000000..f7c189eb3af20437829a7c4f1e212af2bfa43e93 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/plus_small_circle.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/printer.png b/interface/ispconfig/interface/themes/default/icons/x16/printer.png new file mode 100644 index 0000000000000000000000000000000000000000..a8a9098f5656702c18e523816308f70daa090341 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/printer.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/printer__arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/printer__arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..6753240b29d41b0f44dc5c6b9bcaedef4da5c382 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/printer__arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/printer__exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/printer__exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..9c1dee844d3880941aaf09128caea07c0c652585 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/printer__exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/printer__minus.png b/interface/ispconfig/interface/themes/default/icons/x16/printer__minus.png new file mode 100644 index 0000000000000000000000000000000000000000..4d1ca196dc137ead0dbc18442777e4486ccd7890 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/printer__minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/printer__pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/printer__pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..ce151474ed36ecf95dc1a4407f0adcddd672e4ad Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/printer__pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/printer__plus.png b/interface/ispconfig/interface/themes/default/icons/x16/printer__plus.png new file mode 100644 index 0000000000000000000000000000000000000000..33093aa75113a4bb729d0c3e8e99a01637f4bb14 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/printer__plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/printer_empty.png b/interface/ispconfig/interface/themes/default/icons/x16/printer_empty.png new file mode 100644 index 0000000000000000000000000000000000000000..41a4dc5dba50df3f5916f2756a42cc5de196a749 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/printer_empty.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/printer_small.png b/interface/ispconfig/interface/themes/default/icons/x16/printer_small.png new file mode 100644 index 0000000000000000000000000000000000000000..b9d54412948c981505e7ed1db9076eefd5fb348b Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/printer_small.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/puzzle.png b/interface/ispconfig/interface/themes/default/icons/x16/puzzle.png new file mode 100644 index 0000000000000000000000000000000000000000..55eee7999ba7ba74a80cb3dc9ff365de1a4f7cae Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/puzzle.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/puzzle__arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/puzzle__arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..ebb05f27a3b986dfd3bb89805e40b9b92c1d7719 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/puzzle__arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/puzzle__exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/puzzle__exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..d411a0e4961c31d0e924a4369d94b6aeb71eb676 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/puzzle__exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/puzzle__minus.png b/interface/ispconfig/interface/themes/default/icons/x16/puzzle__minus.png new file mode 100644 index 0000000000000000000000000000000000000000..eb3f9836e8681be78d2b0fa53b5061c1a0abade7 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/puzzle__minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/puzzle__pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/puzzle__pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..bb6376f84342d76014fe16288b7aebcd7f3cb43d Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/puzzle__pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/puzzle__plus.png b/interface/ispconfig/interface/themes/default/icons/x16/puzzle__plus.png new file mode 100644 index 0000000000000000000000000000000000000000..a3efba69da632a95d48795a79347c5db762ac6c3 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/puzzle__plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/puzzle_disable.png b/interface/ispconfig/interface/themes/default/icons/x16/puzzle_disable.png new file mode 100644 index 0000000000000000000000000000000000000000..15bdfdfe73370a79f88fafec0ba4efae03d4b368 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/puzzle_disable.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/question.png b/interface/ispconfig/interface/themes/default/icons/x16/question.png new file mode 100644 index 0000000000000000000000000000000000000000..370fdde8e779004f52924dfbfbe1a48900b34ce5 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/question.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/question_frame.png b/interface/ispconfig/interface/themes/default/icons/x16/question_frame.png new file mode 100644 index 0000000000000000000000000000000000000000..e74acdd978691779b226b581d5c3769340a1bb51 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/question_frame.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/question_shield.png b/interface/ispconfig/interface/themes/default/icons/x16/question_shield.png new file mode 100644 index 0000000000000000000000000000000000000000..0ec3a779aff8b1b92e3efd08e5669c0a96e99b1e Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/question_shield.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/question_small.png b/interface/ispconfig/interface/themes/default/icons/x16/question_small.png new file mode 100644 index 0000000000000000000000000000000000000000..b16478f1517b3068f2612a3e246e762a872eda85 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/question_small.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/receipt.png b/interface/ispconfig/interface/themes/default/icons/x16/receipt.png new file mode 100644 index 0000000000000000000000000000000000000000..7eb74c0fa3f18bdae12892258175df3f4f2d73fe Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/receipt.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/receipt_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/receipt_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..78a645f5770d32ec688e3f2730e8bc365d9e0b6b Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/receipt_arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/receipt_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/receipt_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..c3375592b3d7640fef14031bb6e4676ceade6295 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/receipt_exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/receipt_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/receipt_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..b5bf8fca634a67e1ed3534ba40822ad5aa3702e4 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/receipt_minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/receipt_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/receipt_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..445b27d447d48e1ee94c51df0c8cfcf13b4476e0 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/receipt_pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/receipt_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/receipt_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..0cc815e06d5d99e1a8ab7acd96f6438e59e216c5 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/receipt_plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/receipt_shred.png b/interface/ispconfig/interface/themes/default/icons/x16/receipt_shred.png new file mode 100644 index 0000000000000000000000000000000000000000..7bc0d8b7a025baea7327f51fa2cccb16c175814b Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/receipt_shred.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/receipt_text.png b/interface/ispconfig/interface/themes/default/icons/x16/receipt_text.png new file mode 100644 index 0000000000000000000000000000000000000000..b761ae03279b992a73c0a0112acd76bfff816cf3 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/receipt_text.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/receipts.png b/interface/ispconfig/interface/themes/default/icons/x16/receipts.png new file mode 100644 index 0000000000000000000000000000000000000000..1767354d92ca335917ca9096780909fd267c286e Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/receipts.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/receipts_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/receipts_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..da10cf5f55804e9be962dc13935f43608712b31b Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/receipts_arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/receipts_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/receipts_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..4c45ca6397599fc0fd2ad0d88907a5ab805c27b2 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/receipts_exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/receipts_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/receipts_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..621a264ea9ce63c46962c70219d8959400de9c47 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/receipts_minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/receipts_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/receipts_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..d6695dc62fba9b630f0b665bf5e8c52a65bc25ee Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/receipts_pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/receipts_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/receipts_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..db78fc40dafaea193f1a884660f0c624f78f6f7e Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/receipts_plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/receipts_text.png b/interface/ispconfig/interface/themes/default/icons/x16/receipts_text.png new file mode 100644 index 0000000000000000000000000000000000000000..9b51057ddec6c44f240318bc8808b26f563e84c4 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/receipts_text.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/report.png b/interface/ispconfig/interface/themes/default/icons/x16/report.png new file mode 100644 index 0000000000000000000000000000000000000000..449037c2746db3f00258ce05416944f4be40beb5 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/report.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/report_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/report_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..e18b950dcbe7129b07c84b79bd9f35be1633f895 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/report_arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/report_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/report_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..31d6e09b2458f6cbd272b119535fb60e47c19345 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/report_exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/report_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/report_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..8565b4d7a0d435ce4f8de2a34378517e2c943729 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/report_minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/report_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/report_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..46851c01339ebde840ac417a30de54cdd7fe3fa2 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/report_pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/report_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/report_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..689c34c5a9465cb0a0aea0bb07445ece5e5762ad Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/report_plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/ruler.png b/interface/ispconfig/interface/themes/default/icons/x16/ruler.png new file mode 100644 index 0000000000000000000000000000000000000000..782a506e01bd2f3fb7a6d591d118bc9aea81a84f Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/ruler.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/ruler__arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/ruler__arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..8e51bd7364695cc3e1c8d029bfd3eed41c4267f3 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/ruler__arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/ruler__exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/ruler__exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..99b322eb8fe180cddc34b82dac5c612bc1fbf569 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/ruler__exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/ruler__minus.png b/interface/ispconfig/interface/themes/default/icons/x16/ruler__minus.png new file mode 100644 index 0000000000000000000000000000000000000000..a95cae8e8e734b31d7d74fce523f584643c4b642 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/ruler__minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/ruler__pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/ruler__pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..fd4a9fa8e19138441638bd72a587206dcbc6c9de Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/ruler__pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/ruler__plus.png b/interface/ispconfig/interface/themes/default/icons/x16/ruler__plus.png new file mode 100644 index 0000000000000000000000000000000000000000..36d874a6d2053794cbcf0aae32ec0b2783d33a8a Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/ruler__plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/ruler_crop.png b/interface/ispconfig/interface/themes/default/icons/x16/ruler_crop.png new file mode 100644 index 0000000000000000000000000000000000000000..d0c8302a129969819335a9a65e786c93a6691067 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/ruler_crop.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/safe.png b/interface/ispconfig/interface/themes/default/icons/x16/safe.png new file mode 100644 index 0000000000000000000000000000000000000000..afd0a82a06f1aa09fda572d6808594be0203f871 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/safe.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/safe_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/safe_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..353df4f62330f0a19a93658a59e72fb0633494e7 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/safe_arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/safe_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/safe_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..cc5d1c4a5b833bd9f5b8149a16825e03c8e06240 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/safe_exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/safe_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/safe_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..54eaf6d73e3625806a39b5f82a63c9c42c417b86 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/safe_minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/safe_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/safe_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..70fadedf57818ad0d6ac17696d7f5a69ae264585 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/safe_pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/safe_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/safe_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..6721431c6eb37fba73a9b029a2b5c7e31a72a8ec Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/safe_plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/screwdriver.png b/interface/ispconfig/interface/themes/default/icons/x16/screwdriver.png new file mode 100644 index 0000000000000000000000000000000000000000..5627d45a9a7887fca864460dde221cee9bdbbcfb Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/screwdriver.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/screwdriver_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/screwdriver_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..8ddbb8ceb104811f09de016fabe5e4bc6a55e7e1 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/screwdriver_arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/screwdriver_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/screwdriver_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..2a7f757be65fde2a1f95bf7d806bc1be4cb8d73e Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/screwdriver_exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/screwdriver_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/screwdriver_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..f07ffbc376f8fcda414d6cefc8b9fe85e9fd6257 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/screwdriver_minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/screwdriver_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/screwdriver_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..2d6eebf8db1eb2b1b17dda352f078e168d9eba75 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/screwdriver_pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/screwdriver_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/screwdriver_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..0809c126c568d3f2db07954ee2809bca9b32a003 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/screwdriver_plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/script.png b/interface/ispconfig/interface/themes/default/icons/x16/script.png new file mode 100644 index 0000000000000000000000000000000000000000..928655f45799e73397e5169b74ecad253c0293f6 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/script.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/script__arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/script__arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..3a853bfa32c0d99eb753456d2f01a63cdb0bb8e1 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/script__arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/script__exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/script__exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..110d97a7130885bf3e7255578de34c4e4a42391d Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/script__exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/script__minus.png b/interface/ispconfig/interface/themes/default/icons/x16/script__minus.png new file mode 100644 index 0000000000000000000000000000000000000000..59b0da8cf3f687256366efc15cab32c9bc138c73 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/script__minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/script__pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/script__pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..44b9f924868c819512756c4c5726910b477ec8bd Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/script__pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/script__plus.png b/interface/ispconfig/interface/themes/default/icons/x16/script__plus.png new file mode 100644 index 0000000000000000000000000000000000000000..82ad885f972f2f5d726f11b953626dded00ef803 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/script__plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/script_code.png b/interface/ispconfig/interface/themes/default/icons/x16/script_code.png new file mode 100644 index 0000000000000000000000000000000000000000..9be3cb523207f9bce0d55216310ab6d2b3e42c6f Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/script_code.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/scripts.png b/interface/ispconfig/interface/themes/default/icons/x16/scripts.png new file mode 100644 index 0000000000000000000000000000000000000000..8b67528e8040076381d7f2f69acf61c73d582209 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/scripts.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/scripts__arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/scripts__arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..199991600235b4dafba8919799f0abff39e33e2a Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/scripts__arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/scripts__exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/scripts__exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..2ed125250fb204f4582c92123053d9ddb7371284 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/scripts__exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/scripts__minus.png b/interface/ispconfig/interface/themes/default/icons/x16/scripts__minus.png new file mode 100644 index 0000000000000000000000000000000000000000..78e907d9192c584e243960520d05e8e83e79178a Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/scripts__minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/scripts__pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/scripts__pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..6f0579621eeb5ba99947cb8a9b71b8b3b94d5aa1 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/scripts__pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/scripts__plus.png b/interface/ispconfig/interface/themes/default/icons/x16/scripts__plus.png new file mode 100644 index 0000000000000000000000000000000000000000..f90395bbba49f01fce6e357def54581962b7af09 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/scripts__plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/scripts_code.png b/interface/ispconfig/interface/themes/default/icons/x16/scripts_code.png new file mode 100644 index 0000000000000000000000000000000000000000..329c60a79f01bdb8eb8b3ddaa7fb974ab94d1702 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/scripts_code.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/shield.png b/interface/ispconfig/interface/themes/default/icons/x16/shield.png new file mode 100644 index 0000000000000000000000000000000000000000..77e4983869ff03794d1cd657a43adeebae8db999 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/shield.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/shield__arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/shield__arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..192cbe82483c0de80d50ed7b2611380fe9c06128 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/shield__arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/shield__exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/shield__exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..06adbebf56857b641e06975d94a49d93af922b12 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/shield__exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/shield__minus.png b/interface/ispconfig/interface/themes/default/icons/x16/shield__minus.png new file mode 100644 index 0000000000000000000000000000000000000000..d1051146c2c9aa884b144fba4af4f3ec4ed076d7 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/shield__minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/shield__pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/shield__pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..7a2919d28fd27e3653988c2dc141c5d7031856ab Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/shield__pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/shield__plus.png b/interface/ispconfig/interface/themes/default/icons/x16/shield__plus.png new file mode 100644 index 0000000000000000000000000000000000000000..c544f27d945fc47b4cc56f175a5c391a6b362475 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/shield__plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/shield_disable.png b/interface/ispconfig/interface/themes/default/icons/x16/shield_disable.png new file mode 100644 index 0000000000000000000000000000000000000000..e8c305e38ef8dfd7c966a99c8de836ca13a075e0 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/shield_disable.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/slash.png b/interface/ispconfig/interface/themes/default/icons/x16/slash.png new file mode 100644 index 0000000000000000000000000000000000000000..2bb269e16fd8257fefc5b9c8940092b4b052d2e3 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/slash.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/slash_small.png b/interface/ispconfig/interface/themes/default/icons/x16/slash_small.png new file mode 100644 index 0000000000000000000000000000000000000000..8ef5c006ca16a5ee96c667ce30de6fef8362e227 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/slash_small.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/socket.png b/interface/ispconfig/interface/themes/default/icons/x16/socket.png new file mode 100644 index 0000000000000000000000000000000000000000..18c6cc05c6fd36fb1f413706b6b80aa7863617a9 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/socket.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/socket_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/socket_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..5b04e5d7d0f6b3759b27f8fd85efbc16be89ef9f Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/socket_arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/socket_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/socket_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..56a1bf9d44bb599dca30ac9fa233d7811d3f2c0d Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/socket_exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/socket_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/socket_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..e80c6874766552d73b0275938b482db3a1195da8 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/socket_minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/socket_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/socket_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..5e972490b36ba502baf944736d876c4206459166 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/socket_pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/socket_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/socket_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..0430d6cdb4eefed4d5bc2c23b28c9f96e9dfe8ca Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/socket_plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/sort.png b/interface/ispconfig/interface/themes/default/icons/x16/sort.png new file mode 100644 index 0000000000000000000000000000000000000000..4c0858dcb661f7c7acfea1edece9ead17a1f9435 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/sort.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/sort__arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/sort__arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..47c30a26f7783c55f6c8ef1dcc5253e5650527f7 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/sort__arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/sort__exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/sort__exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..7f401e995f254be20ccb4976ebd9cd852d476d96 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/sort__exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/sort__minus.png b/interface/ispconfig/interface/themes/default/icons/x16/sort__minus.png new file mode 100644 index 0000000000000000000000000000000000000000..4c70bf02ab215e88b1bc079044cc53620b3f98df Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/sort__minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/sort__pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/sort__pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..728923ac50a420633d644c251e9bc38d93716b75 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/sort__pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/sort__plus.png b/interface/ispconfig/interface/themes/default/icons/x16/sort__plus.png new file mode 100644 index 0000000000000000000000000000000000000000..0495593bca0f8cd6c0056d6074404688acc6dc5e Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/sort__plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/sort_alphabet.png b/interface/ispconfig/interface/themes/default/icons/x16/sort_alphabet.png new file mode 100644 index 0000000000000000000000000000000000000000..28353f241eb9bd6df62817b20f8e755c19675aef Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/sort_alphabet.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/sort_alphabet_descending.png b/interface/ispconfig/interface/themes/default/icons/x16/sort_alphabet_descending.png new file mode 100644 index 0000000000000000000000000000000000000000..53cdecb583e4fe7c8007fd7d20109830e7ac6c68 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/sort_alphabet_descending.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/sort_date.png b/interface/ispconfig/interface/themes/default/icons/x16/sort_date.png new file mode 100644 index 0000000000000000000000000000000000000000..bf49408e8a66eb7cf51c2ed2145097271ed1f5f0 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/sort_date.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/sort_date_descending.png b/interface/ispconfig/interface/themes/default/icons/x16/sort_date_descending.png new file mode 100644 index 0000000000000000000000000000000000000000..c33ecc9f832a38e6c2550f1299697f621e499133 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/sort_date_descending.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/sort_number.png b/interface/ispconfig/interface/themes/default/icons/x16/sort_number.png new file mode 100644 index 0000000000000000000000000000000000000000..0a2f93f26de91b57e09cb6d00ce926416d18add0 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/sort_number.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/sort_number_descending.png b/interface/ispconfig/interface/themes/default/icons/x16/sort_number_descending.png new file mode 100644 index 0000000000000000000000000000000000000000..229c0d83132e9c5aa59492ea1c41bf5b7f80d148 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/sort_number_descending.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/sort_quantity.png b/interface/ispconfig/interface/themes/default/icons/x16/sort_quantity.png new file mode 100644 index 0000000000000000000000000000000000000000..e6c2499d0c26ec93ee3cc8bf05ad9574d0cc7338 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/sort_quantity.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/sort_quantity_descending.png b/interface/ispconfig/interface/themes/default/icons/x16/sort_quantity_descending.png new file mode 100644 index 0000000000000000000000000000000000000000..8aea9cd26b1bdf9fbee90d5b76b5c6c51abb0521 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/sort_quantity_descending.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/sort_small.png b/interface/ispconfig/interface/themes/default/icons/x16/sort_small.png new file mode 100644 index 0000000000000000000000000000000000000000..9f17a434d0d08b43931e70a559d776db2c5dedbd Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/sort_small.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/stamp.png b/interface/ispconfig/interface/themes/default/icons/x16/stamp.png new file mode 100644 index 0000000000000000000000000000000000000000..1446b903b6cba1850299082f50c20366cf285e9f Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/stamp.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/stamp_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/stamp_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..c3c37036441a372afa52f1914b7626c8a97cdf2f Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/stamp_arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/stamp_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/stamp_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..cc1eaf2fd9ee47789661bbd7e934ed3a4e00afb6 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/stamp_exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/stamp_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/stamp_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..5fd5bfb7982f6daec869d84c9d35ebae224b288d Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/stamp_minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/stamp_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/stamp_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..57c91bec159848c3e2c159733f4b2369ab79bf16 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/stamp_pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/stamp_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/stamp_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..e4f61520fe37993b920fdac64b50b4386e90ba7d Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/stamp_plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/star.png b/interface/ispconfig/interface/themes/default/icons/x16/star.png new file mode 100644 index 0000000000000000000000000000000000000000..353bbecb1acdd3a5e2157eb195b464b528ed7a18 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/star.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/star__arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/star__arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..d351090d43dfb9b4bbdc628b1f19b25aa4f1b15e Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/star__arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/star__exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/star__exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..2176631e96452bbfbb0d19e16b2f8f283f40cd74 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/star__exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/star__minus.png b/interface/ispconfig/interface/themes/default/icons/x16/star__minus.png new file mode 100644 index 0000000000000000000000000000000000000000..19c15eb847585b4f06f7fa672964759576e614ae Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/star__minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/star__pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/star__pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..ffadfa84c6a954fa5586957db70eb938424dc3c6 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/star__pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/star__plus.png b/interface/ispconfig/interface/themes/default/icons/x16/star__plus.png new file mode 100644 index 0000000000000000000000000000000000000000..187fdcce516f1805d0e99ede4fe8e71369cf2626 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/star__plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/star_empty.png b/interface/ispconfig/interface/themes/default/icons/x16/star_empty.png new file mode 100644 index 0000000000000000000000000000000000000000..965f4bacb8248523d65afbd577346cfd08f28b01 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/star_empty.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/star_half.png b/interface/ispconfig/interface/themes/default/icons/x16/star_half.png new file mode 100644 index 0000000000000000000000000000000000000000..af080992ff4237968f90dd131fc0722bfe9154b2 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/star_half.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/star_small.png b/interface/ispconfig/interface/themes/default/icons/x16/star_small.png new file mode 100644 index 0000000000000000000000000000000000000000..ec965f7627d0358e423954cb9ae3e3e577d9e140 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/star_small.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/star_small_empty.png b/interface/ispconfig/interface/themes/default/icons/x16/star_small_empty.png new file mode 100644 index 0000000000000000000000000000000000000000..935d02c0ede3b7686aab4cc142b16479f2d0e242 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/star_small_empty.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/star_small_half.png b/interface/ispconfig/interface/themes/default/icons/x16/star_small_half.png new file mode 100644 index 0000000000000000000000000000000000000000..30cb520e7f51c10e4ba1236d7c76834d97802ab5 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/star_small_half.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/sticky_note.png b/interface/ispconfig/interface/themes/default/icons/x16/sticky_note.png new file mode 100644 index 0000000000000000000000000000000000000000..a73a7585291cde501cf836c13f2786fff91d7a7e Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/sticky_note.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/sticky_note__arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/sticky_note__arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..e152858ec5ebc7d3aa198553a07ee0ebd2934903 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/sticky_note__arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/sticky_note__exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/sticky_note__exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..a88fd07bf6da954a737c758dbe2cc986dbbce717 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/sticky_note__exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/sticky_note__minus.png b/interface/ispconfig/interface/themes/default/icons/x16/sticky_note__minus.png new file mode 100644 index 0000000000000000000000000000000000000000..81021bb04e7b0dfa660216c219eaeb5c2661526c Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/sticky_note__minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/sticky_note__pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/sticky_note__pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..03123f278659ab037055bd1cb0b4bda5c342c261 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/sticky_note__pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/sticky_note__plus.png b/interface/ispconfig/interface/themes/default/icons/x16/sticky_note__plus.png new file mode 100644 index 0000000000000000000000000000000000000000..372de447f35a113d3ba01bb616068a37602c9d31 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/sticky_note__plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/sticky_note_pin.png b/interface/ispconfig/interface/themes/default/icons/x16/sticky_note_pin.png new file mode 100644 index 0000000000000000000000000000000000000000..363394bfd585733046b0be3bc22ee3a03e19e931 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/sticky_note_pin.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/sticky_note_shred.png b/interface/ispconfig/interface/themes/default/icons/x16/sticky_note_shred.png new file mode 100644 index 0000000000000000000000000000000000000000..87674f4bb7496921ed57e5cb34310e3aa29b27ec Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/sticky_note_shred.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/sticky_note_small.png b/interface/ispconfig/interface/themes/default/icons/x16/sticky_note_small.png new file mode 100644 index 0000000000000000000000000000000000000000..3253380a1329367ccbb6bc67133c8c91bb2653aa Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/sticky_note_small.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/sticky_note_small_pin.png b/interface/ispconfig/interface/themes/default/icons/x16/sticky_note_small_pin.png new file mode 100644 index 0000000000000000000000000000000000000000..578964ab4219d1ea028b5a52981cada38bc517f1 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/sticky_note_small_pin.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/sticky_note_text.png b/interface/ispconfig/interface/themes/default/icons/x16/sticky_note_text.png new file mode 100644 index 0000000000000000000000000000000000000000..c7637e281bb39be8ca7850dc333e0dac7c98ea76 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/sticky_note_text.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/sticky_notes.png b/interface/ispconfig/interface/themes/default/icons/x16/sticky_notes.png new file mode 100644 index 0000000000000000000000000000000000000000..0dfcb64d6090785b19a1b616562ca7059fe57ea1 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/sticky_notes.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/sticky_notes__arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/sticky_notes__arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..f1b8e2eae05065c5a670750c0ad7de912b7d1ac3 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/sticky_notes__arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/sticky_notes__exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/sticky_notes__exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..241636e40a8d2df1f5ef7e46dbf3d106f7baa0ea Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/sticky_notes__exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/sticky_notes__minus.png b/interface/ispconfig/interface/themes/default/icons/x16/sticky_notes__minus.png new file mode 100644 index 0000000000000000000000000000000000000000..b3d764fd1e51db8cc74e112baa5fa7406c64db30 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/sticky_notes__minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/sticky_notes__pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/sticky_notes__pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..fc3cb8b9587ab68d2dfa2fb942569b2ef50d1117 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/sticky_notes__pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/sticky_notes__plus.png b/interface/ispconfig/interface/themes/default/icons/x16/sticky_notes__plus.png new file mode 100644 index 0000000000000000000000000000000000000000..40ada63822db88db6c518b4e1f09a6c5f648cb24 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/sticky_notes__plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/sticky_notes_pin.png b/interface/ispconfig/interface/themes/default/icons/x16/sticky_notes_pin.png new file mode 100644 index 0000000000000000000000000000000000000000..7dcd8f9e71488a7bbf32397fbe1804f47c2620a2 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/sticky_notes_pin.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/sticky_notes_stack.png b/interface/ispconfig/interface/themes/default/icons/x16/sticky_notes_stack.png new file mode 100644 index 0000000000000000000000000000000000000000..8d1cb62cf9c6ca2ab040628a43207db2fceade30 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/sticky_notes_stack.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/sticky_notes_text.png b/interface/ispconfig/interface/themes/default/icons/x16/sticky_notes_text.png new file mode 100644 index 0000000000000000000000000000000000000000..9ee1fc60abfffba341c91166acef79724dfad83f Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/sticky_notes_text.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/switch.png b/interface/ispconfig/interface/themes/default/icons/x16/switch.png new file mode 100644 index 0000000000000000000000000000000000000000..179c6d40c5cdf50e5fe740affec5e756aa2c31be Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/switch.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/switch_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/switch_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..19dfc937c218bfa44b1db612da83c5a62335d545 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/switch_arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/switch_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/switch_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..ec9d0d673938f9db70d8d25dd4a9e07c8664f9a1 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/switch_exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/switch_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/switch_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..6d5a502dd9a3d833fdb416266a9e92cf62ae207a Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/switch_minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/switch_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/switch_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..25e3f1d9ac13ed4db8c6c956316721b4ee659141 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/switch_pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/switch_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/switch_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..2e0a7a4f5187d234f3b922291bf853dba6f37878 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/switch_plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/table.png b/interface/ispconfig/interface/themes/default/icons/x16/table.png new file mode 100644 index 0000000000000000000000000000000000000000..9e18958e3a5c09d9b91ff0b9608190519d9567d8 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/table.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/table__arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/table__arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..789e185a366570c561ab68c77c7c00aab0387bd7 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/table__arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/table__exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/table__exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..af96da19e96a29139f055d84b5e9590eff91c84c Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/table__exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/table__minus.png b/interface/ispconfig/interface/themes/default/icons/x16/table__minus.png new file mode 100644 index 0000000000000000000000000000000000000000..ea5490b8ebf2ad7fcd6f02704cde6919800fad0c Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/table__minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/table__pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/table__pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..0596253bb34ae08eb6653f6352e4d1943c20a999 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/table__pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/table__plus.png b/interface/ispconfig/interface/themes/default/icons/x16/table__plus.png new file mode 100644 index 0000000000000000000000000000000000000000..bce8b907080aa4def2e25e4393796a3fb38d5055 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/table__plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/table_delete.png b/interface/ispconfig/interface/themes/default/icons/x16/table_delete.png new file mode 100644 index 0000000000000000000000000000000000000000..9a7fa99d7ef70f94479ca618a9cba061f930564e Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/table_delete.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/table_delete_column.png b/interface/ispconfig/interface/themes/default/icons/x16/table_delete_column.png new file mode 100644 index 0000000000000000000000000000000000000000..87685aa657d06dd43676d3b7eb6cb42fde20e5d7 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/table_delete_column.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/table_insert.png b/interface/ispconfig/interface/themes/default/icons/x16/table_insert.png new file mode 100644 index 0000000000000000000000000000000000000000..ada8b5e2aee657a5c6da151f65e64a84a7918f1f Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/table_insert.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/table_insert_column.png b/interface/ispconfig/interface/themes/default/icons/x16/table_insert_column.png new file mode 100644 index 0000000000000000000000000000000000000000..c04c94684c573ea280d3e7fab8f57d08bfdf06f2 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/table_insert_column.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/tables.png b/interface/ispconfig/interface/themes/default/icons/x16/tables.png new file mode 100644 index 0000000000000000000000000000000000000000..b59808e335500cb41ece851d8767200d598e9988 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/tables.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/tables_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/tables_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..1c7dc076ed47240262e4ba35ca7ed953392aa665 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/tables_arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/tables_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/tables_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..f55b16ca5f32cd8e9fc25cec4c2889d65eb9fb8f Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/tables_exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/tables_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/tables_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..57cc82787838fa6ef4ca2c0c7be6ae06d6b455b6 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/tables_minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/tables_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/tables_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..b5a6db580388e1f3facd14a149181988be3db8ae Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/tables_pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/tables_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/tables_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..00fe7b69c969ed4b5668526227bbbe9e16bf81ed Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/tables_plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/tables_stacks.png b/interface/ispconfig/interface/themes/default/icons/x16/tables_stacks.png new file mode 100644 index 0000000000000000000000000000000000000000..e1e400d119f0ecbdb516314c4cd78e4541e9d689 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/tables_stacks.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/tag.png b/interface/ispconfig/interface/themes/default/icons/x16/tag.png new file mode 100644 index 0000000000000000000000000000000000000000..cabff7b05a68afc5798f35ad5d66be3fbe025e72 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/tag.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/tag__arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/tag__arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..c02a8f63a26d193f0d70f668c96b12d88d5f3fee Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/tag__arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/tag__exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/tag__exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..00c71bb91caefacde8b536e36af1b60721effb33 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/tag__exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/tag__minus.png b/interface/ispconfig/interface/themes/default/icons/x16/tag__minus.png new file mode 100644 index 0000000000000000000000000000000000000000..5be61617c9812f3d72f0e5a2d9dbb57462a28be7 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/tag__minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/tag__pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/tag__pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..e158a2d8c03ada1be370a399ec984774ad0d1b0e Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/tag__pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/tag__plus.png b/interface/ispconfig/interface/themes/default/icons/x16/tag__plus.png new file mode 100644 index 0000000000000000000000000000000000000000..70a8d5e31793c3aa84fc2a14161600867a0db5e8 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/tag__plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/tag_label.png b/interface/ispconfig/interface/themes/default/icons/x16/tag_label.png new file mode 100644 index 0000000000000000000000000000000000000000..200a5fd3410083eb463885c05e4cac87471a679e Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/tag_label.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/tag_small.png b/interface/ispconfig/interface/themes/default/icons/x16/tag_small.png new file mode 100644 index 0000000000000000000000000000000000000000..99c5027a88ca2e143dc6515a0150a1d815539493 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/tag_small.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/tags.png b/interface/ispconfig/interface/themes/default/icons/x16/tags.png new file mode 100644 index 0000000000000000000000000000000000000000..ec54e655ce8d791cbfa2de487bcb418bb06f1dd0 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/tags.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/tags__arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/tags__arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..d71c58cf2924e33d177e0f1838f838ea3dc50da4 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/tags__arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/tags__exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/tags__exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..646f17357024ddbd546ccc987e4c7e329a475828 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/tags__exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/tags__minus.png b/interface/ispconfig/interface/themes/default/icons/x16/tags__minus.png new file mode 100644 index 0000000000000000000000000000000000000000..a46edab9e34fef2bb1b15bf40be570cca0c98eaf Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/tags__minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/tags__pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/tags__pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..c0517acdfc60a149df0efa023025a0e88da4c1fe Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/tags__pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/tags__plus.png b/interface/ispconfig/interface/themes/default/icons/x16/tags__plus.png new file mode 100644 index 0000000000000000000000000000000000000000..02c222409fc4b5b1b7296ba347305a7bd54427a6 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/tags__plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/tags_label.png b/interface/ispconfig/interface/themes/default/icons/x16/tags_label.png new file mode 100644 index 0000000000000000000000000000000000000000..1ae7d9ed6bdded7be7207a1fb29c4954ff839d41 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/tags_label.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/tick.png b/interface/ispconfig/interface/themes/default/icons/x16/tick.png new file mode 100644 index 0000000000000000000000000000000000000000..ccf42c882a6e1e0a829e990d80893839dc145e35 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/tick.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/tick_circle.png b/interface/ispconfig/interface/themes/default/icons/x16/tick_circle.png new file mode 100644 index 0000000000000000000000000000000000000000..de8f000d3bdb8f820e33fbe9ee5ad2f4e78b0c7c Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/tick_circle.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/tick_circle_frame.png b/interface/ispconfig/interface/themes/default/icons/x16/tick_circle_frame.png new file mode 100644 index 0000000000000000000000000000000000000000..7fe467b751046418f22aea200e095c9f25a5228c Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/tick_circle_frame.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/tick_shield.png b/interface/ispconfig/interface/themes/default/icons/x16/tick_shield.png new file mode 100644 index 0000000000000000000000000000000000000000..8889996c9406f1c737a61d8ba647b1ef03094bc6 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/tick_shield.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/tick_small.png b/interface/ispconfig/interface/themes/default/icons/x16/tick_small.png new file mode 100644 index 0000000000000000000000000000000000000000..a110aef9330c6e9089dfb18544d1a46d65d9fa92 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/tick_small.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/tick_small_circle.png b/interface/ispconfig/interface/themes/default/icons/x16/tick_small_circle.png new file mode 100644 index 0000000000000000000000000000000000000000..b49be4d9cacde67c312412de92617d042ffef098 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/tick_small_circle.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/ticket.png b/interface/ispconfig/interface/themes/default/icons/x16/ticket.png new file mode 100644 index 0000000000000000000000000000000000000000..ab11ce288ec713f49fbd15d47bc4e01533b25963 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/ticket.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/ticket_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/ticket_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..37df09ea960c16a0dc92bb39014c404174901137 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/ticket_arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/ticket_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/ticket_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..2eec043c449c1dce367f857904084fe5bb781de2 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/ticket_exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/ticket_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/ticket_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..dd03d933642da64c677d89273bb806357f688d0a Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/ticket_minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/ticket_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/ticket_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..b35c58e9e68a2a48b2769fa7b79e3f34f229be7e Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/ticket_pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/ticket_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/ticket_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..8ae879d03272045aed1b5a6c3a0c67c8fbe102ab Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/ticket_plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/ticket_small.png b/interface/ispconfig/interface/themes/default/icons/x16/ticket_small.png new file mode 100644 index 0000000000000000000000000000000000000000..b432fe860280d60a8e62eb8245f35bd69970fc23 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/ticket_small.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/trophy.png b/interface/ispconfig/interface/themes/default/icons/x16/trophy.png new file mode 100644 index 0000000000000000000000000000000000000000..4f3bcfed3df59cc79102cbad42ae0ffff77c236d Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/trophy.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/trophy_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/trophy_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..4331f6cb56089d0144773376f93bcfdc3811272d Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/trophy_arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/trophy_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/trophy_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..b93ae77f71c8a7c7157bb382d3ff4c4bb4829150 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/trophy_exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/trophy_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/trophy_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..9c6b03dceee56d32e952223933c4b8ed1c6c7038 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/trophy_minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/trophy_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/trophy_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..8357ce272e036260b4144f3f0882f8098beba8c6 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/trophy_pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/trophy_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/trophy_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..a6de1d1c757590f6c0d93ddf09b5008d9c77560d Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/trophy_plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/tux.png b/interface/ispconfig/interface/themes/default/icons/x16/tux.png new file mode 100644 index 0000000000000000000000000000000000000000..bbefe2ec455c42b2c8e8435582cc11a8434495ca Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/tux.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/user.png b/interface/ispconfig/interface/themes/default/icons/x16/user.png new file mode 100644 index 0000000000000000000000000000000000000000..79f35ccbdad44489dbf07d1bf688c411aa3b612c Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/user.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/user_add.png b/interface/ispconfig/interface/themes/default/icons/x16/user_add.png new file mode 100644 index 0000000000000000000000000000000000000000..deae99bcff9815d8530a920e754d743700ddd5fb Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/user_add.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/user_comment.png b/interface/ispconfig/interface/themes/default/icons/x16/user_comment.png new file mode 100644 index 0000000000000000000000000000000000000000..e54ebebafb5072fabac9a0f3d8a79fcee3265f9f Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/user_comment.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/user_delete.png b/interface/ispconfig/interface/themes/default/icons/x16/user_delete.png new file mode 100644 index 0000000000000000000000000000000000000000..acbb5630e51a12a1cd30ea799d659b309e7041cd Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/user_delete.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/user_edit.png b/interface/ispconfig/interface/themes/default/icons/x16/user_edit.png new file mode 100644 index 0000000000000000000000000000000000000000..c1974cda745278a404b9e29fa91e0503a84accb1 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/user_edit.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/user_female.png b/interface/ispconfig/interface/themes/default/icons/x16/user_female.png new file mode 100644 index 0000000000000000000000000000000000000000..7c71de03b2b38cdf3aba691e3a3334b712ea4d5e Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/user_female.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/user_go.png b/interface/ispconfig/interface/themes/default/icons/x16/user_go.png new file mode 100644 index 0000000000000000000000000000000000000000..0468cf08f3760dc13e44aed69f4f15cedc93b503 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/user_go.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/user_gray.png b/interface/ispconfig/interface/themes/default/icons/x16/user_gray.png new file mode 100644 index 0000000000000000000000000000000000000000..8fd539e9cb04111e950ac9b0cce82676f12f67d4 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/user_gray.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/user_green.png b/interface/ispconfig/interface/themes/default/icons/x16/user_green.png new file mode 100644 index 0000000000000000000000000000000000000000..30383c2de517fd22945a87b0528d2821ec4d49ce Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/user_green.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/user_orange.png b/interface/ispconfig/interface/themes/default/icons/x16/user_orange.png new file mode 100644 index 0000000000000000000000000000000000000000..b818127df6d064b71838c377063c2c61517ffa01 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/user_orange.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/user_red.png b/interface/ispconfig/interface/themes/default/icons/x16/user_red.png new file mode 100644 index 0000000000000000000000000000000000000000..c6f66e8b300750826b214e38e7cf3365fa637878 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/user_red.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/user_suit.png b/interface/ispconfig/interface/themes/default/icons/x16/user_suit.png new file mode 100644 index 0000000000000000000000000000000000000000..b3454e15fb60fe8704a574b0ac35c4d0c902d738 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/user_suit.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/vcard.png b/interface/ispconfig/interface/themes/default/icons/x16/vcard.png new file mode 100644 index 0000000000000000000000000000000000000000..c02f315d20749098a50e79bd9525eed3cda7be6b Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/vcard.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/vcard_add.png b/interface/ispconfig/interface/themes/default/icons/x16/vcard_add.png new file mode 100644 index 0000000000000000000000000000000000000000..2a68453811f26444e2d04da5713c9c757dc999c0 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/vcard_add.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/vcard_delete.png b/interface/ispconfig/interface/themes/default/icons/x16/vcard_delete.png new file mode 100644 index 0000000000000000000000000000000000000000..b194b971b398c3d81cdb3daefe3fc4c5ba959eaa Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/vcard_delete.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/vcard_edit.png b/interface/ispconfig/interface/themes/default/icons/x16/vcard_edit.png new file mode 100644 index 0000000000000000000000000000000000000000..ab0f6e73d640c84bd409a84efb9239f067491c65 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/vcard_edit.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/wall.png b/interface/ispconfig/interface/themes/default/icons/x16/wall.png new file mode 100644 index 0000000000000000000000000000000000000000..ecb897188bd16bd0dc82f8145b4e3a35ce1fb519 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/wall.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/wall__arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/wall__arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..643a5450c842aee902d9ef343c869d2eb153d1bc Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/wall__arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/wall__exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/wall__exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..88b771628fdaf7c22f65b3bd8e583eb6400cdf2c Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/wall__exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/wall__minus.png b/interface/ispconfig/interface/themes/default/icons/x16/wall__minus.png new file mode 100644 index 0000000000000000000000000000000000000000..e6c77e457f8cd5392981824ef4a1e9b961afeb8f Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/wall__minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/wall__pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/wall__pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..6a888600f368a92a99ab8f868b6e2db0ab632556 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/wall__pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/wall__plus.png b/interface/ispconfig/interface/themes/default/icons/x16/wall__plus.png new file mode 100644 index 0000000000000000000000000000000000000000..527df42e7173e3c86d3f163d91aafc846f33d9ef Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/wall__plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/wall_brick.png b/interface/ispconfig/interface/themes/default/icons/x16/wall_brick.png new file mode 100644 index 0000000000000000000000000000000000000000..072306b59a8ea6851d96085dc848837f94828cfe Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/wall_brick.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/wall_disable.png b/interface/ispconfig/interface/themes/default/icons/x16/wall_disable.png new file mode 100644 index 0000000000000000000000000000000000000000..f7317d3cb0ebd32cd792095981176edc61b9a690 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/wall_disable.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/wall_small.png b/interface/ispconfig/interface/themes/default/icons/x16/wall_small.png new file mode 100644 index 0000000000000000000000000000000000000000..54930c4e5db6fc36251fe8d2c24600605291c40b Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/wall_small.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/wall_small_brick.png b/interface/ispconfig/interface/themes/default/icons/x16/wall_small_brick.png new file mode 100644 index 0000000000000000000000000000000000000000..8172b3efd2daed53caaa085bbd1401ed5a936fc2 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/wall_small_brick.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/wallet.png b/interface/ispconfig/interface/themes/default/icons/x16/wallet.png new file mode 100644 index 0000000000000000000000000000000000000000..4d285fc453c558d1e4eb77dafa72720816a1340c Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/wallet.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/wallet_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/wallet_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..6a24de7540ddc0006663d8453d16175963ca826e Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/wallet_arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/wallet_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/wallet_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..0833af8cc4fde3f22b5373308133f6aaa96bf04b Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/wallet_exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/wallet_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/wallet_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..b6b8debd95bc862625ba9f370247279c218c1faf Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/wallet_minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/wallet_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/wallet_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..ba27aa17239f35f99667729c0e712eefaa1efbab Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/wallet_pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/wallet_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/wallet_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..f25be79d081e6b6ec57d166a544bf55e64351d0d Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/wallet_plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/wand.png b/interface/ispconfig/interface/themes/default/icons/x16/wand.png new file mode 100644 index 0000000000000000000000000000000000000000..4747dcae4ca5d5d57a2b4b5352ce82e1b4402397 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/wand.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/wand_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/wand_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..118a71a56b46e33351a096764f0541b067376e03 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/wand_arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/wand_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/wand_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..2e0fef8984416d858ea32cee7c255a29cc9cbc04 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/wand_exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/wand_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/wand_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..6c14df9b9c9df232aefb3e7d0e0e2462df30e5fc Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/wand_minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/wand_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/wand_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..a10900c9269f73e3cc81c7c591a3c283f5a57e89 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/wand_pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/wand_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/wand_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..b7c1b761f13216916133534972ab957c62cbfac7 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/wand_plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/wrench.png b/interface/ispconfig/interface/themes/default/icons/x16/wrench.png new file mode 100644 index 0000000000000000000000000000000000000000..f2af4380f098c646a623c18a1d7b5ad2c3d0d3c6 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/wrench.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/wrench_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/wrench_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..bfbe02286a356ede8cb22fb6435ea10360b36e9b Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/wrench_arrow.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/wrench_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/wrench_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..c85cf6de5a60eb37b42a4364c4f3394b2f233818 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/wrench_exclamation.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/wrench_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/wrench_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..a23dc4b0bc24dd4ac618c82bcbebab7adfdf6490 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/wrench_minus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/wrench_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/wrench_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..564d981b1ca46ce9e98b5640a05704b82e489955 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/wrench_pencil.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/wrench_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/wrench_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..f9d6d9dbbae62cf80532f2da69fc3dd6cdae92a2 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/wrench_plus.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x16/wrench_screwdriver.png b/interface/ispconfig/interface/themes/default/icons/x16/wrench_screwdriver.png new file mode 100644 index 0000000000000000000000000000000000000000..a2e384b033e3bddc9cf7db40f15e16e39b461e80 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x16/wrench_screwdriver.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x32/state_critical.png b/interface/ispconfig/interface/themes/default/icons/x32/state_critical.png new file mode 100644 index 0000000000000000000000000000000000000000..501424b341f4009e1a3f4b5bb5c0dcf8a5d34229 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x32/state_critical.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x32/state_error.png b/interface/ispconfig/interface/themes/default/icons/x32/state_error.png new file mode 100644 index 0000000000000000000000000000000000000000..b9a291171e35cfac828da05a7ba72458bdb00e52 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x32/state_error.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x32/state_info.png b/interface/ispconfig/interface/themes/default/icons/x32/state_info.png new file mode 100644 index 0000000000000000000000000000000000000000..f59130d14cdb347518b4fc9c83bc258bacc2fff9 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x32/state_info.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x32/state_ok.png b/interface/ispconfig/interface/themes/default/icons/x32/state_ok.png new file mode 100644 index 0000000000000000000000000000000000000000..ab86df2f5872b0126a27b09d5e711db515d4e301 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x32/state_ok.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x32/state_unknown.png b/interface/ispconfig/interface/themes/default/icons/x32/state_unknown.png new file mode 100644 index 0000000000000000000000000000000000000000..47694461fc97bcfb8f5d0b8fa900369a7b120d3c Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x32/state_unknown.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x32/state_warning.png b/interface/ispconfig/interface/themes/default/icons/x32/state_warning.png new file mode 100644 index 0000000000000000000000000000000000000000..704cf4ba5ea90bbfcd9bd07528478840d2a475f4 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x32/state_warning.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x64/network.png b/interface/ispconfig/interface/themes/default/icons/x64/network.png new file mode 100644 index 0000000000000000000000000000000000000000..f4c20744e5962e6fcf8b5d408aeb37394fdd828f Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x64/network.png differ diff --git a/interface/ispconfig/interface/themes/default/icons/x64/server.png b/interface/ispconfig/interface/themes/default/icons/x64/server.png new file mode 100644 index 0000000000000000000000000000000000000000..6ca269358209e2703c97a65c446dcca142b386f0 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/icons/x64/server.png differ diff --git a/interface/ispconfig/interface/themes/default/images/buttonHolder_bg.gif b/interface/ispconfig/interface/themes/default/images/buttonHolder_bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..45dc0da38b2608cf1bb0c5079105e8a8bbfbe95b Binary files /dev/null and b/interface/ispconfig/interface/themes/default/images/buttonHolder_bg.gif differ diff --git a/interface/ispconfig/interface/themes/default/images/favicon.ico b/interface/ispconfig/interface/themes/default/images/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..da6257c84cce5c550eb7118581ed2a22f15af248 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/images/favicon.ico differ diff --git a/interface/ispconfig/interface/themes/default/images/header_bg.png b/interface/ispconfig/interface/themes/default/images/header_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..4f61996842f32444bf8b36d3e25fb82a3d4bed0d Binary files /dev/null and b/interface/ispconfig/interface/themes/default/images/header_bg.png differ diff --git a/interface/ispconfig/interface/themes/default/images/header_logo.png b/interface/ispconfig/interface/themes/default/images/header_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..ce00716f5dd296951d525b7a3ea9ebbdb2286025 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/images/header_logo.png differ diff --git a/interface/ispconfig/interface/themes/default/images/header_logo.png.old b/interface/ispconfig/interface/themes/default/images/header_logo.png.old new file mode 100644 index 0000000000000000000000000000000000000000..38ba1ebeb45ebb798f808b1d2a06da2b8bad0d97 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/images/header_logo.png.old differ diff --git a/interface/ispconfig/interface/themes/default/images/lists_tfoot_bg.png b/interface/ispconfig/interface/themes/default/images/lists_tfoot_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..3ddc3a5e2917be9cdedb199c9988e43a7fa7c713 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/images/lists_tfoot_bg.png differ diff --git a/interface/ispconfig/interface/themes/default/images/lists_thead_bg.png b/interface/ispconfig/interface/themes/default/images/lists_thead_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..a9bc0f6d8f5e627393e2748ae5b651947a41e9f1 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/images/lists_thead_bg.png differ diff --git a/interface/ispconfig/interface/themes/default/images/meter_bg.gif b/interface/ispconfig/interface/themes/default/images/meter_bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..6b38c6e9592c2624c5f2d763ec9892ed550108ab Binary files /dev/null and b/interface/ispconfig/interface/themes/default/images/meter_bg.gif differ diff --git a/interface/ispconfig/interface/themes/default/images/screen_bg.png b/interface/ispconfig/interface/themes/default/images/screen_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..9679f4e1251516b3d02c46f54abcd40d793f37aa Binary files /dev/null and b/interface/ispconfig/interface/themes/default/images/screen_bg.png differ diff --git a/interface/ispconfig/interface/themes/default/licences.txt b/interface/ispconfig/interface/themes/default/licences.txt new file mode 100644 index 0000000000000000000000000000000000000000..5a50cbb39e8956ba104bd52e23d326c94fff31d0 --- /dev/null +++ b/interface/ispconfig/interface/themes/default/licences.txt @@ -0,0 +1,8 @@ +Theme created by Martin Henne (red-ray.de) + +based on: + +Templates: http://www.yaml.de +Web-Forms: http://www.sprawsm.com/uni-form/ +Icons: http://www.pinvoke.com and http://www.randomjabber.com/static/sizcons +Know-How: http://particletree.com/features/rediscovering-the-button-element diff --git a/interface/ispconfig/interface/themes/default/templates/form.tpl.htm b/interface/ispconfig/interface/themes/default/templates/form.tpl.htm new file mode 100644 index 0000000000000000000000000000000000000000..429bfd9f2497cae91ebd8b996f6897c6950ee1c0 --- /dev/null +++ b/interface/ispconfig/interface/themes/default/templates/form.tpl.htm @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/themes/default/templates/listpage.tpl.htm b/interface/ispconfig/interface/themes/default/templates/listpage.tpl.htm new file mode 100644 index 0000000000000000000000000000000000000000..429bfd9f2497cae91ebd8b996f6897c6950ee1c0 --- /dev/null +++ b/interface/ispconfig/interface/themes/default/templates/listpage.tpl.htm @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/themes/default/templates/main.tpl.htm b/interface/ispconfig/interface/themes/default/templates/main.tpl.htm new file mode 100644 index 0000000000000000000000000000000000000000..475cd976f765d78d615ca0bc7c2e96ca7681809b --- /dev/null +++ b/interface/ispconfig/interface/themes/default/templates/main.tpl.htm @@ -0,0 +1,111 @@ + + + + <tmpl_var name="app_title"> <tmpl_var name="app_version"> + "/> + + + + + + + + + + + + +
    +
    + + + + + +
    + +
    +
    +
     
    +
    +
    + + +
    +
    + + +
    +
    +
    +
    +
     
    + +
    + +
    + +
    + + diff --git a/interface/ispconfig/interface/themes/default/templates/module.tpl.htm b/interface/ispconfig/interface/themes/default/templates/module.tpl.htm new file mode 100644 index 0000000000000000000000000000000000000000..36cdd09c73687ae1d87f3dde00cecaec8cd5167e --- /dev/null +++ b/interface/ispconfig/interface/themes/default/templates/module.tpl.htm @@ -0,0 +1,37 @@ + +   + + + + + +
    + + + + + + + + +
     
    + + + + + + + + +
    + +
    +
    +
    +
    +
    +
    + + +   + \ No newline at end of file diff --git a/interface/ispconfig/interface/themes/default/templates/module_tree.tpl.htm b/interface/ispconfig/interface/themes/default/templates/module_tree.tpl.htm new file mode 100644 index 0000000000000000000000000000000000000000..b0895789ab97c225f126acfdf811ee10602989af --- /dev/null +++ b/interface/ispconfig/interface/themes/default/templates/module_tree.tpl.htm @@ -0,0 +1,38 @@ + +   + + + + + + +
    + + + + + + + + +
     
    + + + + + + + + +
    + +
    +
    +
    +
    +
    +
    + + +   + \ No newline at end of file diff --git a/interface/ispconfig/interface/themes/default/templates/sidenav.tpl.htm b/interface/ispconfig/interface/themes/default/templates/sidenav.tpl.htm new file mode 100644 index 0000000000000000000000000000000000000000..4626d369e6bac78e4e914fe47feceec6714c2937 --- /dev/null +++ b/interface/ispconfig/interface/themes/default/templates/sidenav.tpl.htm @@ -0,0 +1,24 @@ + diff --git a/interface/ispconfig/interface/themes/default/templates/tabbed_form.tpl.htm b/interface/ispconfig/interface/themes/default/templates/tabbed_form.tpl.htm new file mode 100644 index 0000000000000000000000000000000000000000..0e31bc0565f834059e65d76ac35faa93057786b7 --- /dev/null +++ b/interface/ispconfig/interface/themes/default/templates/tabbed_form.tpl.htm @@ -0,0 +1,28 @@ + +

    +
    +
    +
      + + +
    • + +
    • +
      +
      +
    +
    +
    + + +

    +
    + +

    ERROR

    +
    + + +
    + + + diff --git a/interface/ispconfig/interface/themes/default/templates/topnav.tpl.htm b/interface/ispconfig/interface/themes/default/templates/topnav.tpl.htm new file mode 100644 index 0000000000000000000000000000000000000000..025b9bc900c1e54d96a8adb33c627bc4d6abd41d --- /dev/null +++ b/interface/ispconfig/interface/themes/default/templates/topnav.tpl.htm @@ -0,0 +1,9 @@ +
      + + +
    • + +
    • +
      +
      +
    diff --git a/interface/ispconfig/interface/themes/default/yaml/!important.txt b/interface/ispconfig/interface/themes/default/yaml/!important.txt new file mode 100644 index 0000000000000000000000000000000000000000..dfdf80ddac9f19d930067441466cf3fbabf511e9 --- /dev/null +++ b/interface/ispconfig/interface/themes/default/yaml/!important.txt @@ -0,0 +1,4 @@ +DON'T EDIT ANYTHING INSIDE THIS DIRECTORY! + +This theme is based on YAML V3.0.6, Build: 080609 (http://www.yaml.de/) +CSS-Styles can be changed in the /themes/default/css/ directory diff --git a/interface/ispconfig/interface/themes/default/yaml/core/base.css b/interface/ispconfig/interface/themes/default/yaml/core/base.css new file mode 100644 index 0000000000000000000000000000000000000000..632248e2f53474c38ab9d55031a62f48c2d131c0 --- /dev/null +++ b/interface/ispconfig/interface/themes/default/yaml/core/base.css @@ -0,0 +1,229 @@ +@charset "UTF-8"; +/** + * "Yet Another Multicolumn Layout" - (X)HTML/CSS Framework + * + * (en) YAML core stylesheet + * (de) YAML Basis-Stylesheet + * + * Don't make any changes in this file! + * Your changes should be placed in any css-file in your own stylesheet folder. + * + * @copyright Copyright 2005-2008, Dirk Jesse + * @license CC-A 2.0 (http://creativecommons.org/licenses/by/2.0/), + * YAML-C (http://www.yaml.de/en/license/license-conditions.html) + * @link http://www.yaml.de + * @package yaml + * @version 3.0.6 + * @revision $Revision: 202 $ + * @lastmodified $Date: 2008-06-07 14:29:18 +0200 (Sa, 07 Jun 2008) $ + */ + +@media all +{ + /*------------------------------------------------------------------------------------------------------*/ + + /** + * @section browser reset + * @see http://www.yaml.de/en/documentation/css-components/base-stylesheet.html + */ + + /* (en) Global reset of paddings and margins for all HTML elements */ + /* (de) Globales Zurücksetzen der Innen- und Außenabstände für alle HTML-Elemente */ + * { margin:0; padding: 0; } + + /* (en) Correction: margin/padding reset caused too small select boxes. */ + /* (de) Korrektur: Das Zurücksetzen der Abstände verursacht zu kleine Selectboxen. */ + option { padding-left: 0.4em; } + + /** + * (en) Global fix of the Italics bugs in IE 5.x and IE 6 + * (de) Globale Korrektur des Italics Bugs des IE 5.x und IE 6 + * + * @bugfix + * @affected IE 5.x/Win, IE6 + * @css-for IE 5.x/Win, IE6 + * @valid yes + */ + * html body * { overflow:visible; } + * html iframe, * html frame { overflow:auto; } + * html frameset { overflow:hidden; } + + /* (en) Forcing vertical scrollbars in Netscape, Firefox and Safari browsers */ + /* (de) Erzwingen vertikaler Scrollbalken in Netscape, Firefox und Safari Browsern */ + html { height: 100%; margin-bottom: 1px; } + body { + /* (en) Fix for rounding errors when scaling font sizes in older versions of Opera browser */ + /* (de) Beseitigung von Rundungsfehler beim Skalieren von Schriftgrößen in älteren Opera Versionen */ + font-size: 100.01%; + + /* (en) Standard values for colors and text alignment */ + /* (de) Vorgabe der Standardfarben und Textausrichtung */ + color: #000; + background: #fff; + text-align: left; + } + + /* (en) Clear borders for
    and elements */ + /* (de) Rahmen für
    und Elemente löschen */ + fieldset, img { border: 0 solid; } + + /* (en) new standard values for lists, blockquote and cite */ + /* (de) Neue Standardwerte für Listen & Zitate */ + ul, ol, dl { margin: 0 0 1em 1em } + li { margin-left: 1.5em; line-height: 1.5em; } + + dt { font-weight: bold; } + dd { margin: 0 0 1em 2em; } + + blockquote { margin: 0 0 1em 1.5em; } + + /*------------------------------------------------------------------------------------------------------*/ + + /** + * @section base layout | Basis Layout + * @see http://www.yaml.de/en/documentation/css-components/base-stylesheet.html + * + * |-------------------------------| + * | #header | + * |-------------------------------| + * | #col1 | #col3 | #col2 | + * | 200 px | flexible | 200px | + * |-------------------------------| + * | #footer | + * |-------------------------------| + */ + + #header { position:relative; } + + /* (en) Text Alignment for #topnav content */ + /* (de) Textausrichtung für #topnav Inhalte */ + #topnav { text-align: right; } + + /* (en) Absolute positioning only within #header */ + /* (de) Absolute Positionierung erfolgt nur innerhalb von #header */ + #header #topnav { + position:absolute; + top: 10px; + right: 10px; + } + + /* (en) Backup for correct positioning */ + /* (de) Absicherung korrekte Positionierung */ + #header, #nav, #main, #footer { clear:both; } + + /* (en/de) Standard: 200 Pixel */ + #col1 { float: left; width: 200px } + /* (en/de) Standard: 200 Pixel */ + #col2 { float:right; width: 200px } + /* (en) Standard: center column with flexible width */ + /* (de) Standard: Flexible mittlere Spalte */ + #col3 { width:auto; margin: 0 200px } + + /* (en) Preparation for absolute positioning within content columns */ + /* (de) Vorbereitung für absolute Positionierungen innerhalb der Inhaltsspalten */ + #col1_content, #col2_content, #col3_content { position:relative; } + + /*------------------------------------------------------------------------------------------------------*/ + + /** + * @section generic classes for layout switching | Generische Klassen zur Layoutumschaltung + * @see http://www.yaml.de/en/documentation/css-components/base-stylesheet.html + * + * .hidecol1 -> 2-column-layout (using #col2 and #col3) + * .hidecol2 -> 2-column-layout (using #col1 and #col3) + * .hideboth -> single-column-layout (using #col3) + */ + + .hideboth #col3 { margin-left: 0; margin-right: 0; } + .hidecol1 #col3 { margin-left: 0; margin-right: 200px; } + .hidecol2 #col3 { margin-left: 200px; margin-right: 0; } + + .hideboth #col1, .hideboth #col2, .hidecol1 #col1, .hidecol2 #col2 { display:none; } + + /*------------------------------------------------------------------------------------------------------*/ + + /** + * @section clearing methods + * @see http://yaml.de/en/documentation/basics/general.html + */ + + /* (en) clearfix method for clearing floats */ + /* (de) Clearfix-Methode zum Clearen der Float-Umgebungen */ + .clearfix:after { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; + } + + /* (en) essential for Safari browser !! */ + /* (de) Diese Angabe benötigt der Safari-Browser zwingend !! */ + .clearfix { display: block; } + + /* (en) overflow method for clearing floats */ + /* (de) Overflow-Methode zum Clearen der Float-Umgebungen */ + .floatbox { overflow:hidden; } + + /* (en) IE-Clearing: Only used in Internet Explorer, switched on in iehacks.css */ + /* (de) IE-Clearing: Benötigt nur der Internet Explorer und über iehacks.css zugeschaltet */ + #ie_clearing { display: none; } + + /*------------------------------------------------------------------------------------------------------*/ + + /** + * @section subtemplates + * @see http://www.yaml.de/en/documentation/practice/subtemplates.html + */ + + .subcolumns { width: 100%; overflow:hidden; } + + /* (en) alternative class for optional support of old Mozilla/Netscape browers */ + /* (de) Alternative Klasse zur optionalen Unterstützung alter Mozilla/Netscape-Brower */ + .subcolumns_oldgecko { width: 100%; float:left; } + + .c50l, .c25l, .c33l, .c38l, .c66l, .c75l, .c62l {float: left; } + .c50r, .c25r, .c33r, .c38r, .c66r, .c75r, .c62r {float: right; margin-left: -5px; } + + .c25l, .c25r { width: 25%; } + .c33l, .c33r { width: 33.333%; } + .c50l, .c50r { width: 50%; } + .c66l, .c66r { width: 66.666%; } + .c75l, .c75r { width: 75%; } + .c38l, .c38r { width: 38.2%; } + .c62l, .c62r { width: 61.8%; } + + .subc { padding: 0 0.5em; } + .subcl { padding: 0 1em 0 0; } + .subcr { padding: 0 0 0 1em; } + + /*------------------------------------------------------------------------------------------------------*/ + + /** + * @section hidden elements | Versteckte Elemente + * @see http://www.yaml.de/en/documentation/basics/skip-links.html + * + * (en) skip links and hidden content + * (de) Skip-Links und versteckte Inhalte + */ + + /* (en) classes for invisible elements in the base layout */ + /* (de) Klassen für unsichtbare Elemente im Basislayout */ + .skip, .hideme, .print { + position: absolute; + top: -1000em; + left: -1000em; + height: 1px; + width: 1px; + } + + /* (en) make skip links visible when using tab navigation */ + /* (de) Skip-Links für Tab-Navigation sichtbar schalten */ + .skip:focus, .skip:active { + position: static; + top: 0; + left: 0; + height: auto; + width: auto; + } +} diff --git a/interface/ispconfig/interface/themes/default/yaml/core/iehacks.css b/interface/ispconfig/interface/themes/default/yaml/core/iehacks.css new file mode 100644 index 0000000000000000000000000000000000000000..85445964d700e738a08c32288119cd403c470ba1 --- /dev/null +++ b/interface/ispconfig/interface/themes/default/yaml/core/iehacks.css @@ -0,0 +1,310 @@ +@charset "UTF-8"; +/** + * "Yet Another Multicolumn Layout" - (X)HTML/CSS Framework + * + * (en) YAML core stylesheet - structure-independent bugfixes of IE/Win CSS-bugs + * (de) YAML Basis-Stylesheet - Strukturunabhängige Bugfixes von CSS-Bugs des IE/Win + * + * Don't make any changes in this file! + * Your changes should be added to a separate patch-file. + * + * @copyright Copyright 2005-2008, Dirk Jesse + * @license CC-A 2.0 (http://creativecommons.org/licenses/by/2.0/), + * YAML-C (http://www.yaml.de/en/license/license-conditions.html) + * @link http://www.yaml.de + * @package yaml + * @version 3.0.6 + * @revision $Revision: 202 $ + * @lastmodified $Date: 2008-06-07 14:29:18 +0200 (Sa, 07 Jun 2008) $ + * @appdef yaml + */ + +@media all +{ + /** + * (en) Debugging: When you see a green background, IE is getting this stylesheet + * (de) Fehlersuche: Hintergrund leuchtet grün, wenn das Stylesheet korrekt geladen wurde + * + * @debug + * @app-yaml-default disabled + */ + + /* body { background: #0f0; background-image: none; } */ + + /*------------------------------------------------------------------------------------------------------*/ + + /** + * (en) Forcing vertical scrollbars is not needed in IE (only for Firefox/Netscape/Safari) + * (de) Erzwingen vertikaler Scrollbalken im IE nicht benötigt (nur im Firefox/Netscape/Safari) + * + * @workaround + * @affected IE 5.x/Win, IE6, IE7 + * @css-for IE 5.x/Win, IE6, IE7 + * @valid yes + */ + + html { height: auto; margin-bottom:0; } + + /*------------------------------------------------------------------------------------------------------*/ + + /** + * (en) Fixes IE5.x and IE6 overflow behavior of textarea and input elements elements + * (de) Korrigiert das fehlerhafte overflow-Verhalten von textarea und input-Elementen + * + * @workaround + * @affected IE 5.x/Win, IE6 + * @css-for IE 5.x/Win, IE6 + * @valid no + */ + + * html textarea { overflow:scroll; overflow-x: hidden; } + * html input { overflow: hidden; } + + /*------------------------------------------------------------------------------------------------------*/ + + /** + * (en) Stability fixes with 'position:relative' + * (de) Stabilitätsverbesserungen durch 'position:relative' + * + * @bugfix + * @affected IE 5.x/Win, IE6, IE7 + * @css-for IE 5.x/Win, IE6, IE7 + * @valid yes + */ + + body { position:relative; } /* Essential in IE7 for correct layout scaling ... */ + * html body { position:static; } /* ... but not for IE5.x and IE6 */ + #main { position: relative; } /* helpful for several problems in older IE versions*/ + + /*------------------------------------------------------------------------------------------------------*/ + + /** + * (en) Clearfix Method for containing floats in IE + * (de) Clearfix-Anpassung für diverse IE-Versionen + * + * @workaround + * @see http://www.456bereastreet.com/archive/200603/new_clearing_method_needed_for_ie7/#comment28 + * @affected IE 5.x/Win, IE6, IE7 + * @css-for IE 5.x/Win, IE6, IE7 + * @valid yes + */ + + + .clearfix { display: inline-block; } /* ... especial for IE7 */ + .clearfix { display: block; } /* ... für IE5,IE6,IE7 */ + * html .clearfix { height: 1%; } /* ... für IE5 + IE6/Win | hasLayout aktivieren */ + + /*------------------------------------------------------------------------------------------------------*/ + + /** + * (en) Adjustment of .floatbox class for IE + * (de) Anpassung der .floatbox-Klasse für IE + * + * @workaround + * @affected IE 5.x/Win, IE6 + * @css-for IE 5.x/Win, IE6 + * @valid yes + */ + + * html .floatbox { width:100%; } + + /*------------------------------------------------------------------------------------------------------*/ + + /** + * (en) Special class for oversized content element + * (de) Spezielle Klasse für übergroße Inhaltselemente + * + * @workaround + * @affected IE 5.x/Win, IE6 + * @css-for IE 5.x/Win, IE6 + * @valid yes + */ + + .slidebox { + position:relative; + margin-right: -1000px; + height: 1%; + } + + /*------------------------------------------------------------------------------------------------------*/ + + /** + * (en): Bugfix for partially displayed column separators + * (de): Bugfix für unvollständige Darstellung der Spalteninhalte / Spaltentrenner + * + * @bugfix + * @affected IE 5.x/Win, IE6 + * @css-for IE 5.x/Win, IE6 + * @valid yes + */ + + * html #col1, + * html #col2, + * html #col3 { position:relative; } + + /*------------------------------------------------------------------------------------------------------*/ + + /** + * (en) Preventing several css bugs by forcing "hasLayout" + * (de) Vermeidung verschiedenster Bugs durch Erzwingen von "hasLayout" + * + * @workaround + * @affected IE 5.x/Win, IE6, IE7 + * @css-for IE 5.x/Win, IE6, IE7 + * @valid no + */ + + body { height: 1%; } + #page_margins, #page, #header, #nav, #main, #footer { zoom:1; } /* IE6 & IE7 */ + #page_margins, #page { height: 1%; } /* IE 5.x */ + * html #header, * html #nav, * html #main, * html #footer { width: 100%; } /* IE 5.x & IE6 */ + * html #header, * html #nav, * html #main, * html #footer { wid\th: auto; } /* IE 6 */ + + /*------------------------------------------------------------------------------------------------------*/ + + /** + * Disappearing List-Background Bug + * @see http://www.positioniseverything.net/explorer/ie-listbug.html + * + * @bugfix + * @affected IE 5.x/Win, IE6 + * @css-for IE 5.x/Win, IE6 + * @valid yes + */ + * html ul, * html ol, * html dl { position: relative; } + + /*------------------------------------------------------------------------------------------------------*/ + + /** + * List-Numbering Bug + * + * @bugfix + * @affected IE 5.x/Win, IE6, IE7 + * @css-for IE 5.x/Win, IE6, IE7 + * @valid yes + */ + body ol li { display:list-item; } + + /*------------------------------------------------------------------------------------------------------*/ + + /** + * (en) Workaround for 'collapsing margin at #col3' when using CSS-property clear + * Left margin of #col3 collapses when using clear:both in 1-3-2 (or 2-3-1) layout and right column is the + * longest and left column is the shortest one. For IE6 and IE7 a special workaround was developed + * in YAML. + * + * (de) Workaround für 'kollabierenden Margin an #col3' bei Verwendung der CSS-Eigenschaft clear + * Der linke Margin von #col3 kollabiert bei der Verwendung von clear:both im 1-3-2 (oder 2-3-1) Layout + * wenn gleichzeitig die rechte Spalte die kürzeste und die rechte die Längste ist. Im IE6 und IE7 lässt + * sich der Bug durch eine speziell für YAML entwickelten Workaround umgehen. + * + * @workaround + * @affected IE 5.x/Win, IE6, IE7 + * @css-for IE 5.x/Win, IE6, IE7 + * @valid no + */ + + #ie_clearing { + /* (en) Only a small help for debugging */ + /* (de) Nur eine kleine Hilfe zur Fehlersuche */ + position:static; + + /* (en) Make container visible in IE */ + /* (de) Container sichtbar machen im IE */ + display:block; + + /* (en) No fix possible in IE5.x, normal clearing used instead */ + /* (de) Kein Fix im IE5.x möglich, daher normales Clearing */ + \clear:both; + + /* (en) forcing clearing-like behavior with a simple oversized container in IE6 & IE7*/ + /* (de) IE-Clearing mit 100%-DIV für IE6 bzw. übergroßem Container im IE7 */ + width: 100%; + font-size:0px; + margin: -2px 0 -1em 1px; + } + + * html #ie_clearing { margin: -2px 0 -1em 0; } + #col3_content {margin-bottom:-2px; } + + /* (en) avoid horizontal scrollbars in IE7 in borderless layouts because of negative margins */ + /* (de) Vermeidung horizontaler Scrollbalken bei randabfallenden Layouts im IE7 */ + html { margin-right: 1px; } + * html { margin-right: 0 } + + + /* (en) Bugfix: Essential for IE7 */ + /* (de) Bugfix: Notwendig im IE7 */ + #col3 { position:relative; z-index: -1; } + + /*------------------------------------------------------------------------------------------------------*/ + + /** + * IE/Win Guillotine Bug + * @see http://www.positioniseverything.net/explorer/guillotine.html + * + * @workaround + * @affected IE 5.x/Win, IE6 + * @css-for IE 5.x/Win, IE6 + * @valid yes + */ + + * html body a, * html body a:hover { background-color: transparent; } + +} + +@media screen, projection +{ + /** + * (en) IE-Adjustments for content columns and subtemplates + * (de) IE-Anpassung für Spaltencontainer und Subtemplates + * + * Doubled Float-Margin Bug + * @see http://positioniseverything.net/explorer/doubled-margin.html + * + * @bugfix + * @affected IE 5.x/Win, IE6 + * @css-for IE 5.x/Win, IE6, IE7 + * @valid yes + */ + + #col1, #col2 { display:inline; } + + .c50l, .c25l, .c33l, .c38l, .c66l, .c75l, .c62l, + .c50r, .c25r, .c33r, .c38r, .c66r, .c75r, .c62r { display:inline; } + + /*------------------------------------------------------------------------------------------------------*/ + + /** + * Internet Explorer and the Expanding Box Problem + * @see http://www.positioniseverything.net/explorer/expandingboxbug.html + * + * @workaround + * @affected IE 5.x/Win, IE6 + * @css-for IE 5.x/Win, IE6 + * @valid yes + */ + + * html #col1_content, + * html #col2_content, + * html #col3_content { word-wrap: break-word; } + + * html .subcolumns .subc, + * html .subcolumns .subcl, + * html .subcolumns .subcr { word-wrap: break-word; overflow:hidden; } +} + +@media print +{ + /** + * (en) Avoid unneeded page breaks of #col3 content in print layout. + * (de) Vermeiden von unnötigen Seitenumbrüchen beim Ausdruck der Spalte #col3. + * + * @bugfix + * @affected IE7 + * @css-for IE 5.x/Win, IE6, IE7 + * @valid yes + */ + + #col3 { height: 1%; } +} diff --git a/interface/ispconfig/interface/themes/default/yaml/core/print_base.css b/interface/ispconfig/interface/themes/default/yaml/core/print_base.css new file mode 100644 index 0000000000000000000000000000000000000000..54c6a396901999e74dd8efa9c440c5b9a735def7 --- /dev/null +++ b/interface/ispconfig/interface/themes/default/yaml/core/print_base.css @@ -0,0 +1,120 @@ +@charset "UTF-8"; +/** + * "Yet Another Multicolumn Layout" - (X)HTML/CSS Framework + * + * (en) YAML core stylesheet - print layout + * (de) YAML Core-Stylesheet - Druck Layout + * + * Don't make any changes in this file! + * Your changes should be added to 'print_xyz_draft.css' drafts from 'yaml/print/' folder. + * + * @copyright Copyright 2005-2008, Dirk Jesse + * @license CC-A 2.0 (http://creativecommons.org/licenses/by/2.0/), + * YAML-C (http://www.yaml.de/en/license/license-conditions.html) + * @link http://www.yaml.de + * @package yaml + * @version 3.0.6 + * @revision $Revision: 202 $ + * @lastmodified $Date: 2008-06-07 14:29:18 +0200 (Sa, 07 Jun 2008) $ + */ + +@media print +{ + /*------------------------------------------------------------------------------------------------------*/ + + /** + * @section layout preparation + * @see http://www.yaml.de/en/documentation/css-components/layout-for-print-media.html + */ + + /* (en) Preparing base layout for print */ + /* (de) Basislayout für Druck aufbereiten */ + body, #page_margins, #page, #main { margin:0; padding: 0; border: 0; } + #page_margins, #page { width: 100% !important; min-width:0; max-width: none; } + #header { height: auto; } + + /* (en) Hide unneeded container of the screenlayout in print layout */ + /* (de) Für den Druck nicht benötigte Container des Layouts abschalten */ + #topnav, #nav, #search, #footer { display: none; } + + /* (en) Linearising subtemplates */ + /* (de) Linearisierung der Subtemplates */ + .c25l, .c33l, .c38l, .c50l, .c62l, .c66l, .c75l, + .c25r, .c33r, .c38r, .c50r, .c62r, .c66r, .c75r { + width: 100%; margin:0; float:none; overflow:visible; display:table; + } + .subc, .subcl, .subcr { margin: 0; padding: 0; } + + /* (en) make .print class visible */ + /* (de) .print-Klasse sichtbar schalten */ + .print { position: static; top: 0; left: 0; height: auto; width: auto; } + + /*------------------------------------------------------------------------------------------------------*/ + + /** + * @section content preparation + * @see http://www.yaml.de/en/documentation/css-components/layout-for-print-media.html + */ + + /* (en) Change font to serif */ + /* (de) Zeichensatz auf Serifen umstellen */ + body * { font-family: "Times New Roman", Times, serif; } + code, pre { font-family:"Courier New", Courier, mono; } + body { font-size: 12pt; } + + /* (en) Avoid page breaks right after headings */ + /* (de) Vermeidung von Seitenumbrüchen direkt nach einer Überschrift */ + h1,h2,h3,h4,h5,h6 { page-break-after:avoid; } + + /* (en) Format acronyms and abbreviations for print*/ + /* (de) Auszeichnung von Abkürzungen */ + abbr[title]:after, + acronym[title]:after { content: '(' attr(title) ')'; } + + /* (en) Disable background graphics of links */ + /* (de) Abschalten evlt. vorhandener Hintergrundgrafiken zur Linkkennzeichnung */ + #page a[href^="http:"], + #page a[href^="https:"] { padding-left: 0; background-image: none; } + + /* (en) Enable URL output in print layout */ + /* (de) Sichtbare Auszeichnung der URLs von Links */ + a[href]:after { + content:" "; + color:#444; + background:inherit; + font-style:italic; + } + + /* (en) Preparation for optional column labels */ + /* (de) Vorbereitung für optionale Spaltenauszeichnung */ + #col1_content:before, #col2_content:before, #col3_content:before { + content: ""; + color:#888; + background:inherit; + display:block; + font-weight:bold; + font-size:1.5em; + } + + /*------------------------------------------------------------------------------------------------------*/ + + /** + * @section browser fixes for print layouts + * @see http://www.yaml.de/en/documentation/css-components/layout-for-print-media.html + */ + + /** + * (en) overflow:hidden Bug in print layouts + * (de) overflow:hidden Bug in Drucklayouts + * + * @bugfix + * @since 3.0 + * @affected FF2.0, IE7 + * @css-for all browsers + * @valid yes + */ + + .floatbox, + .subcolumns, + .subcolums_oldgecko { overflow:visible; display: table; } +} diff --git a/interface/ispconfig/interface/themes/default/yaml/core/slim_base.css b/interface/ispconfig/interface/themes/default/yaml/core/slim_base.css new file mode 100644 index 0000000000000000000000000000000000000000..ef205e1d788305fc64068caa55a8b5b9fb0cce91 --- /dev/null +++ b/interface/ispconfig/interface/themes/default/yaml/core/slim_base.css @@ -0,0 +1,50 @@ +@charset "UTF-8"; +/* "Yet Another Multicolumn Layout" v3.0.6 (c) by Dirk Jesse (http://www.yaml.de) +* $Revision: 202 $ $Date: 2008-06-07 14:29:18 +0200 (Sa, 07 Jun 2008) $ */ +@media all { +*{margin:0;padding:0} +option{padding-left:.4em} +* html body *{overflow:visible} +* html iframe,* html frame{overflow:auto} +* html frameset{overflow:hidden} +html{height:100%;margin-bottom:1px} +body{font-size:100.01%;color:#000;background:#fff;text-align:left} +fieldset,img{border:0 solid} +ul,ol,dl{margin:0 0 1em 1em} +li{margin-left:1.5em;line-height:1.5em} +dt{font-weight:700} +dd{margin:0 0 1em 2em} +blockquote{margin:0 0 1em 1.5em} +#header{position:relative} +#topnav{text-align:right} +#header #topnav{position:absolute;top:10px;right:10px} +#header,#nav,#main,#footer{clear:both} +#col1{float:left;width:200px} +#col2{float:right;width:200px} +#col3{width:auto;margin:0 200px} +#col1_content,#col2_content,#col3_content{position:relative} +.hideboth #col3{margin-left:0;margin-right:0} +.hidecol1 #col3{margin-left:0;margin-right:200px} +.hidecol2 #col3{margin-left:200px;margin-right:0} +.hideboth #col1,.hideboth #col2,.hidecol1 #col1,.hidecol2 #col2{display:none} +.clearfix:after{content:".";display:block;height:0;clear:both;visibility:hidden} +.clearfix{display:block} +.floatbox{overflow:hidden} +#ie_clearing{display:none} +.subcolumns{width:100%;overflow:hidden} +.subcolumns_oldgecko{width:100%;float:left} +.c50l,.c25l,.c33l,.c38l,.c66l,.c75l,.c62l{float:left} +.c50r,.c25r,.c33r,.c38r,.c66r,.c75r,.c62r{float:right;margin-left:-5px} +.c25l,.c25r{width:25%} +.c33l,.c33r{width:33.333%} +.c50l,.c50r{width:50%} +.c66l,.c66r{width:66.666%} +.c75l,.c75r{width:75%} +.c38l,.c38r{width:38.2%} +.c62l,.c62r{width:61.8%} +.subc{padding:0 .5em} +.subcl{padding:0 1em 0 0} +.subcr{padding:0 0 0 1em} +.skip,.hideme,.print{position:absolute;top:-1000em;left:-1000em;height:1px;width:1px} +.skip:focus,.skip:active{position:static;top:0;left:0;height:auto;width:auto} +} \ No newline at end of file diff --git a/interface/ispconfig/interface/themes/default/yaml/core/slim_iehacks.css b/interface/ispconfig/interface/themes/default/yaml/core/slim_iehacks.css new file mode 100644 index 0000000000000000000000000000000000000000..0b46deb4e77716da2c9e1281457807c5f56a8c93 --- /dev/null +++ b/interface/ispconfig/interface/themes/default/yaml/core/slim_iehacks.css @@ -0,0 +1,36 @@ +@charset UTF-8; +/* "Yet Another Multicolumn Layout" v3.0.6 (c) by Dirk Jesse (http://www.yaml.de) +* $Revision: 202 $ $Date: 2008-06-07 14:29:18 +0200 (Sa, 07 Jun 2008) $ */ +@media all { +html{height:auto;margin-bottom:0;margin-right:1px} +* html textarea{overflow:scroll;overflow-x:hidden} +* html input{overflow:hidden} +body{position:relative;height:1%} +* html body{position:static} +#main{position:relative} +.clearfix{display:inline-block} +.clearfix{display:block} +* html .clearfix{height:1%} +* html .floatbox{width:100%} +.slidebox{position:relative;margin-right:-1000px;height:1%} +* html #col1,* html #col2,* html #col3{position:relative} +#page_margins,#page,#header,#nav,#main,#footer{zoom:1} +#page_margins,#page{height:1%} +* html #header,* html #nav,* html #main,* html #footer{width:100%;wid\th:auto} +* html ul,* html ol,* html dl{position:relative} +body ol li{display:list-item} +#ie_clearing{position:static;display:block;\clear:both;width:100%;font-size:0;margin:-2px 0 -1em 1px} +* html #ie_clearing{margin:-2px 0 -1em} +#col3_content{margin-bottom:-2px} +* html{margin-right:0} +#col3{position:relative;z-index:-1} +* html body a,* html body a:hover{background-color:transparent} +} +@media screen,projection { +#col1,#col2,.c50l,.c25l,.c33l,.c38l,.c66l,.c75l,.c62l,.c50r,.c25r,.c33r,.c38r,.c66r,.c75r,.c62r{display:inline} +* html #col1_content,* html #col2_content,* html #col3_content{word-wrap:break-word} +* html .subcolumns .subc,* html .subcolumns .subcl,* html .subcolumns .subcr{word-wrap:break-word;overflow:hidden} +} +@media print { +#col3{height:1%} +} \ No newline at end of file diff --git a/interface/ispconfig/interface/themes/default/yaml/core/slim_print_base.css b/interface/ispconfig/interface/themes/default/yaml/core/slim_print_base.css new file mode 100644 index 0000000000000000000000000000000000000000..42a5d5b069f090af2d8c5d9a7f347e1a8042889b --- /dev/null +++ b/interface/ispconfig/interface/themes/default/yaml/core/slim_print_base.css @@ -0,0 +1,21 @@ +@charset "UTF-8"; +/* "Yet Another Multicolumn Layout" v3.0.6 (c) by Dirk Jesse (http://www.yaml.de) +* $Revision: 202 $ $Date: 2008-06-07 14:29:18 +0200 (Sa, 07 Jun 2008) $ */ +@media print { +body,#page_margins,#page,#main{border:0;margin:0;padding:0} +#page_margins,#page{width:100%!important;min-width:0;max-width:none} +#header{height:auto} +#topnav,#nav,#search,#footer{display:none} +.c25l,.c33l,.c38l,.c50l,.c62l,.c66l,.c75l,.c25r,.c33r,.c38r,.c50r,.c62r,.c66r,.c75r{width:100%;float:none;overflow:visible;display:table;margin:0} +.subc,.subcl,.subcr{margin:0;padding:0} +.print{position:static;top:0;left:0;height:auto;width:auto} +body *{font-family:"Times New Roman", Times, serif} +code,pre{font-family:"Courier New", Courier, mono} +body{font-size:12pt} +h1,h2,h3,h4,h5,h6{page-break-after:avoid} +abbr[title]:after,acronym[title]:after{content:'(' attr(title) ')'} +#page a[href^="http:"],#page a[href^="https:"]{padding-left:0;background-image:none} +a[href]:after{content:" ";color:#444;background:inherit;font-style:italic} +#col1_content:before,#col2_content:before,#col3_content:before{content:"";color:#888;background:inherit;display:block;font-weight:700;font-size:1.5em} +.floatbox,.subcolumns,.subcolums_oldgecko{overflow:visible;display:table} +} \ No newline at end of file diff --git a/interface/ispconfig/interface/themes/default/yaml/debug/debug.css b/interface/ispconfig/interface/themes/default/yaml/debug/debug.css new file mode 100644 index 0000000000000000000000000000000000000000..0c4269b13315dd57e484f4ea6ed44a4f25177bd7 --- /dev/null +++ b/interface/ispconfig/interface/themes/default/yaml/debug/debug.css @@ -0,0 +1,157 @@ +@charset "UTF-8"; +/** + * "Yet Another Multicolumn Layout" - (X)HTML/CSS Framework + * + * (en) YAML debugging stylesheet + * (de) YAML Stylesheet zur Fehlersuche + * + * Don't make any changes in this file! + * Your changes should be placed in any css-file in your own stylesheet folder. + * + * @copyright Copyright 2005-2008, Dirk Jesse + * @license CC-A 2.0 (http://creativecommons.org/licenses/by/2.0/), + * YAML-C (http://www.yaml.de/en/license/license-conditions.html) + * @link http://www.yaml.de + * @package yaml + * @version 3.0.6 + * @revision $Revision: 43 $ + * @lastmodified $Date: 2007-06-11 16:09:28 +0200 (Mo, 11 Jun 2007) $ + */ + +@media all +{ + /*------------------------------------------------------------------------------------------------------*/ + + /** + * @section layout preparation for debugging + * @see http://www.yaml.de/en/documentation/practice/drafting-and-debugging.html + */ + + /* Adding debugging background */ + body { background: transparent url(images/grid_pattern.png) top left no-repeat !important; } + + /* CSS-Warning, if core stylesheet 'iehacks.css' is missing in the layout */ + *:first-child+html #ie_clearing { display:block; } + * html #ie_clearing { display:block; } + + #ie_clearing { + width: 500px; + font-size: 25px; + position:absolute; + top: -2px; + left:0px; + background: url("images/warning_iehacks.gif") top left no-repeat; + } + + /** + * @section pixel grid + */ + + .bg_grid { + background-image:url(images/grid_pattern.png) !important; + background-repeat:no-repeat; + background-position:top left !important; + } + + /** + * @section transparency + */ + + .transOFF { -moz-opacity: 1.0; opacity: 1.0; filter: alpha(Opacity=100);} + .trans50, + .transON { -moz-opacity: 0.5; opacity: 0.5; filter: alpha(Opacity=50);} + .trans25 { -moz-opacity: 0.25; opacity: 0.25; filter: alpha(Opacity=25);} + .trans75 { -moz-opacity: 0.75; opacity: 0.75; filter: alpha(Opacity=75);} + + /** + * @section colors + */ + + .bg_red { background-color: #f00 !important;} + .bg_blue { background-color: #00f !important;} + .bg_green { background-color: #0f0 !important;} + + /** + * @visualize semantic structure + * + * Many thanks to Tomas Caspers for some ideas + */ + + div[id] { padding: 0 !important; margin: 2px; border: 1px #000 solid !important; } + div[id]:before { + display:block; + color: #fff; + background: #800; + padding: 2px; + font: bold .8em "Lucida console", monospace; + content: "[div #"attr(id)"]"; + } + + div[class="floatbox"] { background: #f4f4f4; } + div[class="floatbox"]:before { + display:block; + color: #fff; + background: #66a; + padding: 2px; + font: bold .8em "Lucida console", monospace; + content: "[div ."attr(class)"]"; + } + + div[class="subcolumns"] { background: #f8f8f8; } + div[class="subcolumns"]:before { + display:block; + color: #fff; + background: #444; + padding: 2px; + font: bold .8em "Lucida console", monospace; + content: "[div ."attr(class)"]"; + } + + div[class="subcolumns"] > div:before { + display:block; + color: #fff; + background: #080; + padding: 2px; + font: bold .8em "Lucida console", monospace; + content: "[div ."attr(class)"]"; + } + + div[class="subc"], div[class="subcl"], div[class="subcr"] { background: #eee; } + div[class="subc"]:before, div[class="subcl"]:before, div[class="subcr"]:before { + display:block; + color: #fff; + background: #6a6; + padding: 2px; + font: bold .8em "Lucida console", monospace; + content: "[div ."attr(class)"]"; + } + + h1:before { content: "[h1] "; } + h2:before { content: "[h2] "; } + h3:before { content: "[h3] "; } + h4:before { content: "[h4] "; } + h5:before { content: "[h5] "; } + h6:before { content: "[h6] "; } + + a:hover:before { content: " ( href='" attr(href) "' ) "; } + a:hover:after { content: " [ title='"attr(title)"' ] "; } + + img:after { content:" ( alt='" attr(alt)"' ) "; } + + address, blockquote, dl, fieldset, form, h1, h2, h3, h4, ol, p, pre, ul { + border: 1px dotted #888; + margin: 2px; + padding: 2px; + display: block; + } + + /** + * @visualize inline elements + * + * Many thanks to Tomas Caspers for some ideas + */ + + abbr, acronym { background: #d9eaff; } + q, cite, dfn, kbd { background: #ffe3f6; } + /* :lang(de), :lang(en), :lang(fr), :lang(es) { background: #d9efaa !important; } */ +} diff --git a/interface/ispconfig/interface/themes/default/yaml/debug/images/grid_pattern.png b/interface/ispconfig/interface/themes/default/yaml/debug/images/grid_pattern.png new file mode 100644 index 0000000000000000000000000000000000000000..55e65e477c61a692d8d9c9cafd4cd986097897db Binary files /dev/null and b/interface/ispconfig/interface/themes/default/yaml/debug/images/grid_pattern.png differ diff --git a/interface/ispconfig/interface/themes/default/yaml/debug/images/warning_iehacks.gif b/interface/ispconfig/interface/themes/default/yaml/debug/images/warning_iehacks.gif new file mode 100644 index 0000000000000000000000000000000000000000..b7cc86d71acd3e87dff0489e0d0423f12f5a5c8f Binary files /dev/null and b/interface/ispconfig/interface/themes/default/yaml/debug/images/warning_iehacks.gif differ diff --git a/interface/ispconfig/interface/themes/default/yaml/debug/images/yaml_debug.gif b/interface/ispconfig/interface/themes/default/yaml/debug/images/yaml_debug.gif new file mode 100644 index 0000000000000000000000000000000000000000..80a4ea30c82acbcb024ccd89835d12f27a787ab3 Binary files /dev/null and b/interface/ispconfig/interface/themes/default/yaml/debug/images/yaml_debug.gif differ diff --git a/interface/ispconfig/interface/themes/default/yaml/navigation/nav_vlist.css b/interface/ispconfig/interface/themes/default/yaml/navigation/nav_vlist.css new file mode 100644 index 0000000000000000000000000000000000000000..af2f7e890c4d787ff76b39b6343f894f561c4a3e --- /dev/null +++ b/interface/ispconfig/interface/themes/default/yaml/navigation/nav_vlist.css @@ -0,0 +1,109 @@ +@charset "UTF-8"; +/** + * "Yet Another Multicolumn Layout" - (X)HTML/CSS Framework + * + * (en) Vertical list navigation "vlist" + * (de) Vertikale Navigationsliste "vlist" + * + * @copyright Copyright 2005-2008, Dirk Jesse + * @license CC-A 2.0 (http://creativecommons.org/licenses/by/2.0/), + * YAML-C (http://www.yaml.de/en/license/license-conditions.html) + * @link http://www.yaml.de + * @package yaml + * @version 3.0.6 + * @revision $Revision: 202 $ + * @lastmodified $Date: 2008-06-07 14:29:18 +0200 (Sa, 07 Jun 2008) $ + */ + +@media all +{ + #submenu { + width: 100%; + overflow: hidden; + margin: 2.4em 0 1.5em 0; + list-style-type: none; + border-top: 2px #ddd solid; + border-bottom: 2px #ddd solid; + } + + #submenu ul { list-style-type: none; margin:0; padding: 0; } + #submenu li { float:left; width: 100%; margin:0; padding: 0; } + + #submenu a, + #submenu strong { + display:block; + width: 90%; + padding: 3px 0px 3px 10%; + text-decoration: none; + background-color:#fff; + color: #444; + border-bottom: 1px #eee solid; + } + + /* Menu Title */ + #submenu li#title { + width: 90%; + padding: 3px 0px 3px 10%; + font-weight: bold; + color: #444; + background-color: #fff; + border-bottom: 4px #888 solid; + } + + #submenu li span { + display:block; + width: 90%; + padding: 3px 0px 3px 10%; + font-weight: bold; + border-bottom: 1px #ddd solid; + } + + /* Level 1 */ + #submenu li#active, + #submenu li strong { + width: 90%; + padding: 3px 0px 3px 10%; + font-weight: bold; + color: #fff; + background-color:#aab; + border-bottom: 1px #eee solid; + } + + #submenu li a { width: 90%; padding-left: 10%; background-color:#fff; color: #444; } + #submenu li a:focus, + #submenu li a:hover, + #submenu li a:active { background-color:#f63; color: #fff; } + + /* Level 2 */ + #submenu li ul li a, + #submenu li ul li#active, + #submenu li ul li strong, + #submenu li ul li span { width: 80%; padding-left: 20%; } + + #submenu li ul li a { background-color:#f8f8f8; color: #666; } + #submenu li ul li a:focus, + #submenu li ul li a:hover, + #submenu li ul li a:active { background-color:#f63; color: #fff; } + + /* Level 3 */ + #submenu li ul li ul li a, + #submenu li ul li ul li#active, + #submenu li ul li ul li strong, + #submenu li ul li ul li span { width: 70%; padding-left: 30%; } + + #submenu li ul li ul li a { background-color:#fcfcfc; color: #888; } + #submenu li ul li ul li a:focus, + #submenu li ul li ul li a:hover, + #submenu li ul li ul li a:active { background-color:#f63; color: #fff; } + + /* Level 4 */ + #submenu li ul li ul li ul li a, + #submenu li ul li ul li ul li#active, + #submenu li ul li ul li ul li strong, + #submenu li ul li ul li ul li span { width: 60%; padding-left: 40%; } + + #submenu li ul li ul li ul li a { background-color:#ffffff; color: #aaa; } + #submenu li ul li ul li ul li a:focus, + #submenu li ul li ul li ul li a:hover, + #submenu li ul li ul li ul li a:active { background-color:#f63; color: #fff; } +} \ No newline at end of file diff --git a/interface/ispconfig/interface/themes/default/yaml/patches/patch_layout_draft.css b/interface/ispconfig/interface/themes/default/yaml/patches/patch_layout_draft.css new file mode 100644 index 0000000000000000000000000000000000000000..83e835357b1e20f18e6733ca865c6dfa1549f8ce --- /dev/null +++ b/interface/ispconfig/interface/themes/default/yaml/patches/patch_layout_draft.css @@ -0,0 +1,29 @@ +@charset "UTF-8"; +/** + * "Yet Another Multicolumn Layout" - (X)HTML/CSS Framework + * + * (en) Example of a patch stylesheet for the Internet Explorer + * (de) Beispiel für ein Anpassungs-Stylesheet für den Internet Explorer + * + * @copyright Copyright 2005-2008, Dirk Jesse + * @license CC-A 2.0 (http://creativecommons.org/licenses/by/2.0/), + * YAML-C (http://www.yaml.de/en/license/license-conditions.html) + * @link http://www.yaml.de + * @package yaml + * @version 3.0.6 + * @revision $Revision: 202 $ + * @lastmodified $Date: 2008-06-07 14:29:18 +0200 (Sa, 07 Jun 2008) $ + */ + +/* Layout independent adjustments | Layout-unabhängige Anpassungen ----------------------------------- */ +@import url(/yaml/core/iehacks.css); + +/* Box model adjustments for vlist navigation | Box-Modell-Anpassungen für vlist-Navigation */ +/* @import url(/yaml/patches/patch_nav_vlist.css); */ + +/* Layout-dependent adjustments | Layout-abhängige Anpassungen --------------------------------------- */ +@media screen, projection +{ + /* add your adjustments here | Fügen Sie Ihre Anpassungen hier ein */ + +} diff --git a/interface/ispconfig/interface/themes/default/yaml/patches/patch_nav_vlist.css b/interface/ispconfig/interface/themes/default/yaml/patches/patch_nav_vlist.css new file mode 100644 index 0000000000000000000000000000000000000000..21041be29427a118094ee56262baf9490011fcf6 --- /dev/null +++ b/interface/ispconfig/interface/themes/default/yaml/patches/patch_nav_vlist.css @@ -0,0 +1,61 @@ +@charset "UTF-8"; +/** + * "Yet Another Multicolumn Layout" - (X)HTML/CSS Framework + * + * (en) IE adjustment stylesheet for YAML vlist navigation + * Import this file within the IE-patch-file if needed in your layout + * + * (de) IE Anpassungs-Stylesheet für YAML vlist-Navigation + * Einbindung ins Layout erfolgt über den Import innerhalb des IE-Anspassungs-Stylesheet + * + * @copyright Copyright 2005-2008, Dirk Jesse + * @license CC-A 2.0 (http://creativecommons.org/licenses/by/2.0/), + * YAML-C (http://www.yaml.de/en/license/license-conditions.html) + * @link http://www.yaml.de + * @package yaml + * @version 3.0.6 + * @revision $Revision: 202 $ + * @lastmodified $Date: 2008-06-07 14:29:18 +0200 (Sa, 07 Jun 2008) $ + */ + +@media screen, projection +{ + /** + * Box Model Bug + * (en) Adjustment of width values for list elements of the menu in IE 5.x/Win. + * Note: If IE6 is running in quirks mode, it also needs 100% values! + * + * (de) Korrektur der Breitenangaben der Listenelemente des Submenüs im IE 5.x/Win. + * Hinweis: Befindet sich der IE6 im Quirks Mode, so benötigt er ebenfalls 100%-Werte ! + * + * @bugfix + * @affected IE 5.x/Win (IE6 in Quirks-Mode) + * @css-for IE 5.x/Win, IE6 + * @valid no + */ + + /* level 1 */ + * html #submenu li a, + * html #submenu li strong, + * html #submenu li span, + * html #submenu li#title, + * html #submenu li#active { width: 100%; w\idth: 90%; } + + /* level 2 */ + * html #submenu li ul li a, + * html #submenu li ul li strong, + * html #submenu li ul li span, + * html #submenu li ul li#active { width: 100%; w\idth: 80%; } + + /* level 3 */ + * html #submenu li ul li ul li a, + * html #submenu li ul li ul li strong, + * html #submenu li ul li ul li span, + * html #submenu li ul li ul li#active { width: 100%; w\idth: 70%; } + + /* level 4 */ + * html #submenu li ul li ul li ul li a, + * html #submenu li ul li ul li ul li strong, + * html #submenu li ul li ul li ul li span, + * html #submenu li ul li ul li ul li#active { width: 100%; w\idth: 60%; } +} diff --git a/interface/ispconfig/interface/themes/default/yaml/print/print_003_draft.css b/interface/ispconfig/interface/themes/default/yaml/print/print_003_draft.css new file mode 100644 index 0000000000000000000000000000000000000000..29c6df6291347a51c419795c3bf6558bbbd4cc02 --- /dev/null +++ b/interface/ispconfig/interface/themes/default/yaml/print/print_003_draft.css @@ -0,0 +1,32 @@ +@charset "UTF-8"; +/** + * "Yet Another Multicolumn Layout" - (X)HTML/CSS Framework + * + * (en) print stylesheet + * (de) Druck-Stylesheet + * + * @copyright Copyright 2005-2008, Dirk Jesse + * @license CC-A 2.0 (http://creativecommons.org/licenses/by/2.0/), + * YAML-C (http://www.yaml.de/en/license/license-conditions.html) + * @link http://www.yaml.de + * @package yaml + * @version 3.0.6 + * @revision $Revision: 202 $ + * @lastmodified $Date: 2008-06-07 14:29:18 +0200 (Sa, 07 Jun 2008) $ + */ + +/* import print base styles | Basisformatierung für Drucklayout einbinden */ +@import url(../core/print_base.css); + +/* #col1 - 0 +** #col2 - 0 +** #col3 - x +*/ + +@media print +{ + #col1 { display:none; } + #col2 { display:none; } + + #col3, #col3_content { width: 100%; margin:0; padding: 0; border:0; } +} \ No newline at end of file diff --git a/interface/ispconfig/interface/themes/default/yaml/print/print_020_draft.css b/interface/ispconfig/interface/themes/default/yaml/print/print_020_draft.css new file mode 100644 index 0000000000000000000000000000000000000000..885b0b9915459f4c8800d209c8788455bc89d55a --- /dev/null +++ b/interface/ispconfig/interface/themes/default/yaml/print/print_020_draft.css @@ -0,0 +1,31 @@ +@charset "UTF-8"; +/** + * "Yet Another Multicolumn Layout" - (X)HTML/CSS Framework + * + * (en) print stylesheet + * (de) Druck-Stylesheet + * + * @copyright Copyright 2005-2008, Dirk Jesse + * @license CC-A 2.0 (http://creativecommons.org/licenses/by/2.0/), + * YAML-C (http://www.yaml.de/en/license/license-conditions.html) + * @link http://www.yaml.de + * @package yaml + * @version 3.0.6 + * @revision $Revision: 202 $ + * @lastmodified $Date: 2008-06-07 14:29:18 +0200 (Sa, 07 Jun 2008) $ + */ + +/* import print base styles | Basisformatierung für Drucklayout einbinden */ +@import url(../core/print_base.css); + +/* #col1 - 0 +** #col2 - x +** #col3 - 0 +*/ +@media print +{ + #col1 { display:none; } + #col3 { display:none; } + + #col2, #col2_content { float:none; width: 100%; margin: 0; padding: 0; border: 0; } +} \ No newline at end of file diff --git a/interface/ispconfig/interface/themes/default/yaml/print/print_023_draft.css b/interface/ispconfig/interface/themes/default/yaml/print/print_023_draft.css new file mode 100644 index 0000000000000000000000000000000000000000..a80bb087538e8b97b128b6611fe7d7afb628e7c1 --- /dev/null +++ b/interface/ispconfig/interface/themes/default/yaml/print/print_023_draft.css @@ -0,0 +1,40 @@ +@charset "UTF-8"; +/** + * "Yet Another Multicolumn Layout" - (X)HTML/CSS Framework + * + * (en) print stylesheet + * (de) Druck-Stylesheet + * + * @copyright Copyright 2005-2008, Dirk Jesse + * @license CC-A 2.0 (http://creativecommons.org/licenses/by/2.0/), + * YAML-C (http://www.yaml.de/en/license/license-conditions.html) + * @link http://www.yaml.de + * @package yaml + * @version 3.0.6 + * @revision $Revision: 202 $ + * @lastmodified $Date: 2008-06-07 14:29:18 +0200 (Sa, 07 Jun 2008) $ + */ + +/* import print base styles | Basisformatierung für Drucklayout einbinden */ +@import url(../core/print_base.css); + +/* #col1 - 0 +** #col2 - x +** #col3 - x +*/ + +@media print +{ + #col1 { display:none; } + + #col2, #col2_content { float:none; width: 100%; margin: 0; padding: 0; border: 0; } + #col2_content { page-break-after:always; } + + #col3, #col3_content {width: 100%; margin:0; padding: 0; border:0; } + + /* Optional Column Labels | Optionale Spaltenauszeichnung + #col2_content:before { content:" [ left | middle | right column ]"; } + #col3_content:before { content:" [ left | middle | right column ]"; } + */ +} + diff --git a/interface/ispconfig/interface/themes/default/yaml/print/print_100_draft.css b/interface/ispconfig/interface/themes/default/yaml/print/print_100_draft.css new file mode 100644 index 0000000000000000000000000000000000000000..99f29b4f127980072a9761902e48940453ebc1db --- /dev/null +++ b/interface/ispconfig/interface/themes/default/yaml/print/print_100_draft.css @@ -0,0 +1,31 @@ +@charset "UTF-8"; +/** + * "Yet Another Multicolumn Layout" - (X)HTML/CSS Framework + * + * (en) print stylesheet + * (de) Druck-Stylesheet + * + * @copyright Copyright 2005-2008, Dirk Jesse + * @license CC-A 2.0 (http://creativecommons.org/licenses/by/2.0/), + * YAML-C (http://www.yaml.de/en/license/license-conditions.html) + * @link http://www.yaml.de + * @package yaml + * @version 3.0.6 + * @revision $Revision: 202 $ + * @lastmodified $Date: 2008-06-07 14:29:18 +0200 (Sa, 07 Jun 2008) $ + */ + +/* import print base styles | Basisformatierung für Drucklayout einbinden */ +@import url(../core/print_base.css); + +/* #col1 - x +** #col2 - 0 +** #col3 - 0 +*/ +@media print +{ + #col1, #col1_content { float:none; width: 100%; margin: 0; padding: 0; border: 0; } + + #col2 { display:none; } + #col3 { display:none; } +} diff --git a/interface/ispconfig/interface/themes/default/yaml/print/print_103_draft.css b/interface/ispconfig/interface/themes/default/yaml/print/print_103_draft.css new file mode 100644 index 0000000000000000000000000000000000000000..983e61a4ad38c2f1c23a5a8aeff369a60bc53447 --- /dev/null +++ b/interface/ispconfig/interface/themes/default/yaml/print/print_103_draft.css @@ -0,0 +1,38 @@ +@charset "UTF-8"; +/** + * "Yet Another Multicolumn Layout" - (X)HTML/CSS Framework + * + * (en) print stylesheet + * (de) Druck-Stylesheet + * + * @copyright Copyright 2005-2008, Dirk Jesse + * @license CC-A 2.0 (http://creativecommons.org/licenses/by/2.0/), + * YAML-C (http://www.yaml.de/en/license/license-conditions.html) + * @link http://www.yaml.de + * @package yaml + * @version 3.0.6 + * @revision $Revision: 202 $ + * @lastmodified $Date: 2008-06-07 14:29:18 +0200 (Sa, 07 Jun 2008) $ + */ + +/* import print base styles | Basisformatierung für Drucklayout einbinden */ +@import url(../core/print_base.css); + +/* #col1 - x +** #col2 - 0 +** #col3 - x +*/ +@media print +{ + #col1, #col1_content {float:none; width: 100%; margin: 0; padding: 0; border: 0; } + #col1_content {page-break-after:always; } + + #col2 { display:none; } + + #col3, #col3_content { width: 100%; margin:0; padding: 0; border:0; } + + /* Optional Column Labels | Optionale Spaltenauszeichnung + #col1_content:before { content:" [ left | middle | right column ]"; } + #col3_content:before { content:" [ left | middle | right column ]"; } + */ +} \ No newline at end of file diff --git a/interface/ispconfig/interface/themes/default/yaml/print/print_120_draft.css b/interface/ispconfig/interface/themes/default/yaml/print/print_120_draft.css new file mode 100644 index 0000000000000000000000000000000000000000..43f0950601cdf24ad04615077c1bd993d2037542 --- /dev/null +++ b/interface/ispconfig/interface/themes/default/yaml/print/print_120_draft.css @@ -0,0 +1,39 @@ +@charset "UTF-8"; +/** + * "Yet Another Multicolumn Layout" - (X)HTML/CSS Framework + * + * (en) print stylesheet + * (de) Druck-Stylesheet + * + * @copyright Copyright 2005-2008, Dirk Jesse + * @license CC-A 2.0 (http://creativecommons.org/licenses/by/2.0/), + * YAML-C (http://www.yaml.de/en/license/license-conditions.html) + * @link http://www.yaml.de + * @package yaml + * @version 3.0.6 + * @revision $Revision: 202 $ + * @lastmodified $Date: 2008-06-07 14:29:18 +0200 (Sa, 07 Jun 2008) $ + */ + +/* import print base styles | Basisformatierung für Drucklayout einbinden */ +@import url(../core/print_base.css); + +/* #col1 - x +** #col2 - x +** #col3 - 0 +*/ +@media print +{ + #col1, #col1_content { float:none; width: 100%; margin: 0; padding: 0; border: 0; } + #col1_content { page-break-after:always; } + + #col2, #col2_content { float:none; width: 100%; margin: 0; padding: 0; border: 0; } + #col2_content { page-break-after:always; } + + #col3 { display:none; } + + /* Optional Column Labels | Optionale Spaltenauszeichnung + #col1_content:before { content:" [ left | middle | right column ]"; } + #col2_content:before { content:" [ left | middle | right column ]"; } + */ +} diff --git a/interface/ispconfig/interface/themes/default/yaml/print/print_123_draft.css b/interface/ispconfig/interface/themes/default/yaml/print/print_123_draft.css new file mode 100644 index 0000000000000000000000000000000000000000..d2586db76c39d0c167304914ff329448a66755eb --- /dev/null +++ b/interface/ispconfig/interface/themes/default/yaml/print/print_123_draft.css @@ -0,0 +1,40 @@ +@charset "UTF-8"; +/** + * "Yet Another Multicolumn Layout" - (X)HTML/CSS Framework + * + * (en) print stylesheet + * (de) Druck-Stylesheet + * + * @copyright Copyright 2005-2008, Dirk Jesse + * @license CC-A 2.0 (http://creativecommons.org/licenses/by/2.0/), + * YAML-C (http://www.yaml.de/en/license/license-conditions.html) + * @link http://www.yaml.de + * @package yaml + * @version 3.0.6 + * @revision $Revision: 202 $ + * @lastmodified $Date: 2008-06-07 14:29:18 +0200 (Sa, 07 Jun 2008) $ + */ + +/* import print base styles | Basisformatierung für Drucklayout einbinden */ +@import url(../core/print_base.css); + +/* #col1 - x +** #col2 - x +** #col3 - x +*/ +@media print +{ + #col1, #col1_content { float:none; width: 100%; margin: 0; padding: 0; border: 0; } + #col1_content { page-break-after:always; } + + #col2, #col2_content { float:none; width: 100%; margin: 0; padding: 0; border: 0; } + #col2_content { page-break-after:always; } + + #col3, #col3_content { width: 100%; margin:0; padding: 0; border:0; } + + /* Optional Column Labels | Optionale Spaltenauszeichnung + #col1_content:before { content:" [ left | middle | right column ]"; } + #col2_content:before { content:" [ left | middle | right column ]"; } + #col3_content:before { content:" [ left | middle | right column ]"; } + */ +} \ No newline at end of file diff --git a/interface/ispconfig/interface/themes/default/yaml/screen/basemod_draft.css b/interface/ispconfig/interface/themes/default/yaml/screen/basemod_draft.css new file mode 100644 index 0000000000000000000000000000000000000000..c738ee0ed813be12ebcd5552c0a6c3f1439b9b49 --- /dev/null +++ b/interface/ispconfig/interface/themes/default/yaml/screen/basemod_draft.css @@ -0,0 +1,70 @@ +@charset "UTF-8"; +/** + * "Yet Another Multicolumn Layout" - (X)HTML/CSS Framework + * + * (en) Template for designing a screen layout + * (de) Gestaltungsvorlage für die Erstellung eines Screenlayouts + * + * @copyright Copyright 2005-2008, Dirk Jesse + * @license CC-A 2.0 (http://creativecommons.org/licenses/by/2.0/), + * YAML-C (http://www.yaml.de/en/license/license-conditions.html) + * @link http://www.yaml.de + * @package yaml + * @version 3.0.6 + * @revision $Revision: 202 $ + * @lastmodified $Date: 2008-06-07 14:29:18 +0200 (Sa, 07 Jun 2008) $ + */ + +@media screen, projection +{ + /*------------------------------------------------------------------------------------------------------*/ + + /** + * Design of the Basic Layout | Gestaltung des YAML Basis-Layouts + * + * @section layout-basics + */ + + /* Page margins and background | Randbereiche & Seitenhintergrund */ + body { } + + /* Layout: Width, Background, Border | Layout: Breite, Hintergrund, Rahmen */ + #page_margins { } + #page{ } + + /* Design of the Main Layout Elements | Gestaltung der Hauptelemente des Layouts */ + #header { } + #topnav { } + + #main { } + + #footer { } + + /*------------------------------------------------------------------------------------------------------*/ + + /** + * Formatting of the Content Area | Formatierung der Inhaltsbereichs + * + * @section layout-main + */ + + #col1 { } + #col1_content { } + + #col2 { } + #col2_content { } + + #col3 { } + #col3_content { } + + + /*------------------------------------------------------------------------------------------------------*/ + + /** + * Design of Additional Layout Elements | Gestaltung weiterer Layoutelemente + * + * @section layout-misc + */ + + +} \ No newline at end of file diff --git a/interface/ispconfig/interface/themes/default/yaml/screen/content_default.css b/interface/ispconfig/interface/themes/default/yaml/screen/content_default.css new file mode 100644 index 0000000000000000000000000000000000000000..5742599df130919c9460beb658d2e8a60cc1df23 --- /dev/null +++ b/interface/ispconfig/interface/themes/default/yaml/screen/content_default.css @@ -0,0 +1,170 @@ +@charset "UTF-8"; +/** + * "Yet Another Multicolumn Layout" - (X)HTML/CSS Framework + * + * (en) Uniform design of standard content elements + * (de) Einheitliche Standardformatierungen für die wichtigten Inhalts-Elemente + * + * @copyright Copyright 2005-2008, Dirk Jesse + * @license CC-A 2.0 (http://creativecommons.org/licenses/by/2.0/), + * YAML-C (http://www.yaml.de/en/license/license-conditions.html) + * @link http://www.yaml.de + * @package yaml + * @version 3.0.6 + * @revision $Revision: 202 $ + * @lastmodified $Date: 2008-06-07 14:29:18 +0200 (Sa, 07 Jun 2008) $ + * @appdef yaml + */ + +@media all +{ + /** + * Fonts + * (en) font-family and font-size selection for headings and standard text elements + * (de) Zeichensatz und Schriftgrößen für Überschriften und übliche Text-Elemente + * + * @section content-fonts + */ + + /* (en) reset font size for all elements to standard (16 Pixel) */ + /* (de) Alle Schriftgrößen auf Standardgröße (16 Pixel) zurücksetzen */ + html * { font-size: 100.01%; } + + /* (en) reset monospaced elements to font size 16px in Gecko browsers */ + /* (de) Schriftgröße von monospaced Elemente auf 16 Pixel setzen */ + textarea, pre, tt, code { + font-family:"Courier New", Courier, monospace; + } + + /* (en) base layout gets standard font size 12px */ + /* (de) Basis-Layout erhält Standardschriftgröße von 12 Pixeln */ + body { + font-family: 'Trebuchet MS', Verdana, Helvetica, Arial, sans-serif; + font-size: 75.00%; + } + + h1,h2,h3,h4,h5,h6 { font-weight:bold; margin: 0 0 0.25em 0; } + h1 { font-size: 200% } /* 24px */ + h2 { font-size: 166.67% } /* 20px */ + h3 { font-size: 150% } /* 18px */ + h4 { font-size: 133.33% } /* 16px */ + h5 { font-size: 116.67% } /* 14px */ + h6 { font-size: 116.67%; font-style:italic; } /* 14px */ + + p { line-height: 1.5em; margin: 0 0 1em 0; } + + /* ### Lists | Listen #### */ + + ul, ol, dl { line-height: 1.5em; margin: 0 0 1em 1em; } + li { margin-left: 1.5em; line-height: 1.5em; } + + dt { font-weight: bold; } + dd { margin: 0 0 1em 2em; } + + /* ### text formatting | Textauszeichnung ### */ + + cite, blockquote { font-style:italic; } + blockquote { margin: 0 0 1em 1.5em; } + + strong,b { font-weight: bold; } + em,i { font-style:italic; } + + pre, code { font-family: monospace; font-size: 1.1em; } + + acronym, abbr { + letter-spacing: .07em; + border-bottom: .1em dashed #c00; + cursor: help; + } + + /** + * Generic Content Classes + * (en) standard classes for positioning and highlighting + * (de) Standardklassen zur Positionierung und Hervorhebung + * + * @section content-generic-classes + */ + + .note { background: #dfd; padding: 1em; border-top: 1px #bdb dotted; border-bottom: 1px #bdb dotted; } + .important { background: #ffd; padding: 1em; border-top: 1px #ddb dotted; border-bottom: 1px #ddb dotted; } + .warning { background: #fdd; padding: 1em; border-top: 1px #dbb dotted; border-bottom: 1px #dbb dotted; } + + .float_left { float: left; display:inline; margin-right: 1em; margin-bottom: 0.15em; } + .float_right { float: right; display:inline; margin-left: 1em; margin-bottom: 0.15em; } + .center { text-align:center; margin: 0.5em auto; } + + /** + * External Links + * + * (en) Formatting of hyperlinks + * (de) Gestaltung von Hyperlinks + * + */ + + a { color: #900; text-decoration:none; } + a:focus, + a:hover, + a:active { background-color: #fee; text-decoration:underline; } + + #topnav a { color: #aac; font-weight: bold; background:transparent; text-decoration:none; } + #topnav a:focus, + #topnav a:hover, + #topnav a:active{ text-decoration:underline; background-color: transparent; } + + #footer a { color: #aac; background:transparent; font-weight: bold; } + #footer a:focus, + #footer a:hover, + #footer a:active { color: #fff; background-color: transparent; text-decoration:underline; } + + /** + * (en) Emphasizing external Hyperlinks via CSS + * (de) Hervorhebung externer Hyperlinks mit CSS + * + * @section content-external-links + * @app-yaml-default disabled + */ + + /* + #main a[href^="http://www.my-domain.com"], + #main a[href^="https://www.my-domain.com"] + { + padding-left: 12px; + background-image: url('your_image.gif'); + background-repeat: no-repeat; + background-position: 0 0.45em; + } + */ + + /** + * Tables | Tabellen + * (en) Generic classes for table-width and design definition + * (de) Generische Klassen für die Tabellenbreite und Gestaltungsvorschriften für Tabellen + * + * @section content-tables + */ + + table { width: auto; border-collapse:collapse; margin-bottom: 0.5em; } + table.full { width: 100%; } + table.fixed { table-layout:fixed; } + + th,td { padding: 0.5em; } + thead th { background: #444; color: #fff; } + tbody th { background: #ccc; color: #333; } + tbody th.sub { background: #ddd; color: #333; } + + /** + * Miscellaneous | Sonstiges + * + * @section content-misc + */ + + hr { + color: #fff; + background:transparent; + margin: 0 0 0.5em 0; + padding: 0 0 0.5em 0; + border:0; + border-bottom: 1px #000 solid; + } +} + diff --git a/interface/ispconfig/interface/web/tools/form/user_settings.tform.php b/interface/ispconfig/interface/web/tools/form/user_settings.tform.php new file mode 100644 index 0000000000000000000000000000000000000000..516031a18de5c813799c46d2ced3f50794e03f8e --- /dev/null +++ b/interface/ispconfig/interface/web/tools/form/user_settings.tform.php @@ -0,0 +1,144 @@ + 0 id must match with id of current user +$form['auth_preset']['userid'] = 0; +//* 0 = default groupid of the user, > 0 id must match with groupid of current user +$form['auth_preset']['groupid'] = 0; + +//** Permissions are: r = read, i = insert, u = update, d = delete +$form['auth_preset']['perm_user'] = 'riud'; +$form['auth_preset']['perm_group'] = 'riud'; +$form['auth_preset']['perm_other'] = ''; + +//* Languages +$language_list = array(); +$handle = @opendir(ISPC_ROOT_PATH.'/lib/lang'); +while ($file = @readdir ($handle)) { + if ($file != '.' && $file != '..') { + if(@is_file(ISPC_ROOT_PATH.'/lib/lang/'.$file) and substr($file,-4,4) == '.lng') { + $tmp = substr($file, 0, 2); + $language_list[$tmp] = $tmp; + } + } +} + +$form['tabs']['users'] = array ( + 'title' => 'Settings', + 'width' => 80, + 'template' => 'templates/user_settings.htm', + 'fields' => array ( + ################################## + # Beginn Datenbankfelder + ################################## + 'passwort' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'PASSWORD', + 'encryption'=> 'CRYPT', + 'regex' => '', + 'errmsg' => '', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '15', + 'maxlength' => '100', + 'rows' => '', + 'cols' => '' + ), + 'language' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'language_is_empty'), + 1 => array ( 'type' => 'REGEX', + 'regex' => '/^[a-z]{2}$/i', + 'errmsg'=> 'language_regex_mismatch'), + ), + 'regex' => '', + 'errmsg' => '', + 'default' => '', + 'value' => $language_list, + 'separator' => '', + 'width' => '30', + 'maxlength' => '2', + 'rows' => '', + 'cols' => '' + ) + ################################## + # ENDE Datenbankfelder + ################################## + ) +); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/web/tools/index.php b/interface/ispconfig/interface/web/tools/index.php new file mode 100644 index 0000000000000000000000000000000000000000..641221baa2f9aa47bd75369574e2b63270feb4d5 --- /dev/null +++ b/interface/ispconfig/interface/web/tools/index.php @@ -0,0 +1,50 @@ +auth->check_module_permissions('tools'); + +echo '

    '.$app->lng('Hosting Panel Tools').'

    '; + +?> diff --git a/interface/ispconfig/interface/web/tools/lib/lang/bg.lng b/interface/ispconfig/interface/web/tools/lib/lang/bg.lng new file mode 100644 index 0000000000000000000000000000000000000000..3373fe1cd0fb981727268b3c7b2c56b1fe570aa0 --- /dev/null +++ b/interface/ispconfig/interface/web/tools/lib/lang/bg.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/web/tools/lib/lang/bg_usersettings.lng b/interface/ispconfig/interface/web/tools/lib/lang/bg_usersettings.lng new file mode 100644 index 0000000000000000000000000000000000000000..e4bc3af39af6824cd52243a68d52272048974a51 --- /dev/null +++ b/interface/ispconfig/interface/web/tools/lib/lang/bg_usersettings.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/web/tools/lib/lang/br.lng b/interface/ispconfig/interface/web/tools/lib/lang/br.lng new file mode 100644 index 0000000000000000000000000000000000000000..0ea96868b5004ca498cf873c83ae9035871fa99c --- /dev/null +++ b/interface/ispconfig/interface/web/tools/lib/lang/br.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/web/tools/lib/lang/br_usersettings.lng b/interface/ispconfig/interface/web/tools/lib/lang/br_usersettings.lng new file mode 100644 index 0000000000000000000000000000000000000000..ad7432df782cce7a9b47671c4cadaba570cf48fd --- /dev/null +++ b/interface/ispconfig/interface/web/tools/lib/lang/br_usersettings.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/web/tools/lib/lang/de.lng b/interface/ispconfig/interface/web/tools/lib/lang/de.lng new file mode 100644 index 0000000000000000000000000000000000000000..296bf1fad3e070f152636a4ac913f741db07a5ec --- /dev/null +++ b/interface/ispconfig/interface/web/tools/lib/lang/de.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/web/tools/lib/lang/de_usersettings.lng b/interface/ispconfig/interface/web/tools/lib/lang/de_usersettings.lng new file mode 100644 index 0000000000000000000000000000000000000000..2adc8210d4804b00707af7b27961e790cc8e52c3 --- /dev/null +++ b/interface/ispconfig/interface/web/tools/lib/lang/de_usersettings.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/web/tools/lib/lang/en.lng b/interface/ispconfig/interface/web/tools/lib/lang/en.lng new file mode 100644 index 0000000000000000000000000000000000000000..53af1714e0352ca47cc0cdb88193f37caf37ec96 --- /dev/null +++ b/interface/ispconfig/interface/web/tools/lib/lang/en.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/web/tools/lib/lang/en_usersettings.lng b/interface/ispconfig/interface/web/tools/lib/lang/en_usersettings.lng new file mode 100644 index 0000000000000000000000000000000000000000..bfe487113b715886e4e5511818ab9c4b0a55ee76 --- /dev/null +++ b/interface/ispconfig/interface/web/tools/lib/lang/en_usersettings.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/web/tools/lib/lang/es.lng b/interface/ispconfig/interface/web/tools/lib/lang/es.lng new file mode 100644 index 0000000000000000000000000000000000000000..ba82e68beec8dbb4585376cfe6d3239c83a71062 --- /dev/null +++ b/interface/ispconfig/interface/web/tools/lib/lang/es.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/web/tools/lib/lang/es_usersettings.lng b/interface/ispconfig/interface/web/tools/lib/lang/es_usersettings.lng new file mode 100644 index 0000000000000000000000000000000000000000..12f52063d5ef5dd2247614f22b03efae769d7dff --- /dev/null +++ b/interface/ispconfig/interface/web/tools/lib/lang/es_usersettings.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/web/tools/lib/lang/fi.lng b/interface/ispconfig/interface/web/tools/lib/lang/fi.lng new file mode 100644 index 0000000000000000000000000000000000000000..c629aa106602cbe9275887492f53611bf3bb8e80 --- /dev/null +++ b/interface/ispconfig/interface/web/tools/lib/lang/fi.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/web/tools/lib/lang/fi_usersettings.lng b/interface/ispconfig/interface/web/tools/lib/lang/fi_usersettings.lng new file mode 100644 index 0000000000000000000000000000000000000000..16ec5cf1ab7f22d9c9929c8d1384bab7a05a8088 --- /dev/null +++ b/interface/ispconfig/interface/web/tools/lib/lang/fi_usersettings.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/web/tools/lib/lang/fr.lng b/interface/ispconfig/interface/web/tools/lib/lang/fr.lng new file mode 100644 index 0000000000000000000000000000000000000000..5e72e4fa6f4210cc9fe210559045e13b07c188f4 --- /dev/null +++ b/interface/ispconfig/interface/web/tools/lib/lang/fr.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/web/tools/lib/lang/fr_usersettings.lng b/interface/ispconfig/interface/web/tools/lib/lang/fr_usersettings.lng new file mode 100644 index 0000000000000000000000000000000000000000..22e1d0ec5f17a19c7e46e39c091a8ecdec346a1c --- /dev/null +++ b/interface/ispconfig/interface/web/tools/lib/lang/fr_usersettings.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/web/tools/lib/lang/hu.lng b/interface/ispconfig/interface/web/tools/lib/lang/hu.lng new file mode 100644 index 0000000000000000000000000000000000000000..f66f912062688f6f0614dd56712e68229680898d --- /dev/null +++ b/interface/ispconfig/interface/web/tools/lib/lang/hu.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/web/tools/lib/lang/hu_usersettings.lng b/interface/ispconfig/interface/web/tools/lib/lang/hu_usersettings.lng new file mode 100644 index 0000000000000000000000000000000000000000..89dc62835e8dc4f87c7d0fc50a69a9e69a90b215 --- /dev/null +++ b/interface/ispconfig/interface/web/tools/lib/lang/hu_usersettings.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/web/tools/lib/lang/it.lng b/interface/ispconfig/interface/web/tools/lib/lang/it.lng new file mode 100644 index 0000000000000000000000000000000000000000..12f312c7291932722eeee73604856afb857814b6 --- /dev/null +++ b/interface/ispconfig/interface/web/tools/lib/lang/it.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/web/tools/lib/lang/it_usersettings.lng b/interface/ispconfig/interface/web/tools/lib/lang/it_usersettings.lng new file mode 100644 index 0000000000000000000000000000000000000000..95bf88af36eccd06b86b3866291af796a2c72ceb --- /dev/null +++ b/interface/ispconfig/interface/web/tools/lib/lang/it_usersettings.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/web/tools/lib/lang/ja.lng b/interface/ispconfig/interface/web/tools/lib/lang/ja.lng new file mode 100644 index 0000000000000000000000000000000000000000..e9c01668f7f14419282b20509167846fdb5b5d6d --- /dev/null +++ b/interface/ispconfig/interface/web/tools/lib/lang/ja.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/web/tools/lib/lang/ja_usersettings.lng b/interface/ispconfig/interface/web/tools/lib/lang/ja_usersettings.lng new file mode 100644 index 0000000000000000000000000000000000000000..a838f9de057e4198ab545da4f1ef6a9fdc28238e --- /dev/null +++ b/interface/ispconfig/interface/web/tools/lib/lang/ja_usersettings.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/web/tools/lib/lang/nl.lng b/interface/ispconfig/interface/web/tools/lib/lang/nl.lng new file mode 100644 index 0000000000000000000000000000000000000000..5bf2ae7a7b662a795e4e9e6ffde4d748b9f569f3 --- /dev/null +++ b/interface/ispconfig/interface/web/tools/lib/lang/nl.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/web/tools/lib/lang/nl_usersettings.lng b/interface/ispconfig/interface/web/tools/lib/lang/nl_usersettings.lng new file mode 100644 index 0000000000000000000000000000000000000000..cf0fc71602d26cc9ca05a1d673082bf498b9ab65 --- /dev/null +++ b/interface/ispconfig/interface/web/tools/lib/lang/nl_usersettings.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/web/tools/lib/lang/pl.lng b/interface/ispconfig/interface/web/tools/lib/lang/pl.lng new file mode 100644 index 0000000000000000000000000000000000000000..adc0178fefd07152b3167fed38aa3f87b95614f0 --- /dev/null +++ b/interface/ispconfig/interface/web/tools/lib/lang/pl.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/web/tools/lib/lang/pl_usersettings.lng b/interface/ispconfig/interface/web/tools/lib/lang/pl_usersettings.lng new file mode 100644 index 0000000000000000000000000000000000000000..f8d76658a79920f9571fe69ce7a6822120b9bd87 --- /dev/null +++ b/interface/ispconfig/interface/web/tools/lib/lang/pl_usersettings.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/web/tools/lib/lang/pt.lng b/interface/ispconfig/interface/web/tools/lib/lang/pt.lng new file mode 100644 index 0000000000000000000000000000000000000000..292274fa4a832813a5a8fc3428d52e20371833dc --- /dev/null +++ b/interface/ispconfig/interface/web/tools/lib/lang/pt.lng @@ -0,0 +1,7 @@ + + diff --git a/interface/ispconfig/interface/web/tools/lib/lang/pt_usersettings.lng b/interface/ispconfig/interface/web/tools/lib/lang/pt_usersettings.lng new file mode 100644 index 0000000000000000000000000000000000000000..999611e94921f452f2e4ec164044e0c7be6f2978 --- /dev/null +++ b/interface/ispconfig/interface/web/tools/lib/lang/pt_usersettings.lng @@ -0,0 +1,9 @@ + + diff --git a/interface/ispconfig/interface/web/tools/lib/lang/ro.lng b/interface/ispconfig/interface/web/tools/lib/lang/ro.lng new file mode 100644 index 0000000000000000000000000000000000000000..a4d5765fe0fe489b922cd3f798f82c9336575e1a --- /dev/null +++ b/interface/ispconfig/interface/web/tools/lib/lang/ro.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/web/tools/lib/lang/ro_usersettings.lng b/interface/ispconfig/interface/web/tools/lib/lang/ro_usersettings.lng new file mode 100644 index 0000000000000000000000000000000000000000..1e48a56ccd0db6311c62ef9ac23ac3f5b93de4c1 --- /dev/null +++ b/interface/ispconfig/interface/web/tools/lib/lang/ro_usersettings.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/web/tools/lib/lang/ru.lng b/interface/ispconfig/interface/web/tools/lib/lang/ru.lng new file mode 100644 index 0000000000000000000000000000000000000000..084bbb83f126c037ae5f82901e04be9a2c3a2ed4 --- /dev/null +++ b/interface/ispconfig/interface/web/tools/lib/lang/ru.lng @@ -0,0 +1,7 @@ + + diff --git a/interface/ispconfig/interface/web/tools/lib/lang/ru_usersettings.lng b/interface/ispconfig/interface/web/tools/lib/lang/ru_usersettings.lng new file mode 100644 index 0000000000000000000000000000000000000000..a097b7b283a473949c5ae884a7f402584f53e54d --- /dev/null +++ b/interface/ispconfig/interface/web/tools/lib/lang/ru_usersettings.lng @@ -0,0 +1,9 @@ + + diff --git a/interface/ispconfig/interface/web/tools/lib/lang/se.lng b/interface/ispconfig/interface/web/tools/lib/lang/se.lng new file mode 100644 index 0000000000000000000000000000000000000000..bea9c7867402d951263cafad2558efbe2d83abcc --- /dev/null +++ b/interface/ispconfig/interface/web/tools/lib/lang/se.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/web/tools/lib/lang/se_usersettings.lng b/interface/ispconfig/interface/web/tools/lib/lang/se_usersettings.lng new file mode 100644 index 0000000000000000000000000000000000000000..5485f52a441aa71b2eee47d5b907eb220c61a036 --- /dev/null +++ b/interface/ispconfig/interface/web/tools/lib/lang/se_usersettings.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/web/tools/lib/lang/sk.lng b/interface/ispconfig/interface/web/tools/lib/lang/sk.lng new file mode 100644 index 0000000000000000000000000000000000000000..f44162974ad4969b1cb1aa40cf2c43b47dbbe3c3 --- /dev/null +++ b/interface/ispconfig/interface/web/tools/lib/lang/sk.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/web/tools/lib/lang/sk_usersettings.lng b/interface/ispconfig/interface/web/tools/lib/lang/sk_usersettings.lng new file mode 100644 index 0000000000000000000000000000000000000000..194b2333990b78393ec933c1539a1ae8c22f6e08 --- /dev/null +++ b/interface/ispconfig/interface/web/tools/lib/lang/sk_usersettings.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/web/tools/lib/lang/tr.lng b/interface/ispconfig/interface/web/tools/lib/lang/tr.lng new file mode 100644 index 0000000000000000000000000000000000000000..32bfc8328e2cbf7179d3188903e709305ecf04d5 --- /dev/null +++ b/interface/ispconfig/interface/web/tools/lib/lang/tr.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/web/tools/lib/lang/tr_usersettings.lng b/interface/ispconfig/interface/web/tools/lib/lang/tr_usersettings.lng new file mode 100644 index 0000000000000000000000000000000000000000..d9efacca71097033549bb47e24f98ef847fbdb0e --- /dev/null +++ b/interface/ispconfig/interface/web/tools/lib/lang/tr_usersettings.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/web/tools/lib/menu.d/statistics.menu.php b/interface/ispconfig/interface/web/tools/lib/menu.d/statistics.menu.php new file mode 100644 index 0000000000000000000000000000000000000000..6fdcf1b963e2bef586c303e167a31ed03895dea3 --- /dev/null +++ b/interface/ispconfig/interface/web/tools/lib/menu.d/statistics.menu.php @@ -0,0 +1,25 @@ + 'Other page', + 'target' => 'content', + 'link' => 'http://www.google.de'); + +$items[] = array( 'title' => 'Mailqueue', + 'target' => 'content', + 'link' => 'tools/mailqueue.php'); + + +$module['nav'][] = array( 'title' => 'System Info', + 'open' => 1, + 'items' => $items); + + +*/ + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/web/tools/lib/module.conf.php b/interface/ispconfig/interface/web/tools/lib/module.conf.php new file mode 100644 index 0000000000000000000000000000000000000000..36165d39e13528e27a8a902a59ddfa721b6c5832 --- /dev/null +++ b/interface/ispconfig/interface/web/tools/lib/module.conf.php @@ -0,0 +1,38 @@ + 'Password and Language', + 'target' => 'content', + 'link' => 'tools/user_settings.php'); + + +$module['nav'][] = array( 'title' => 'User Settings', + 'open' => 1, + 'items' => $items); + + +$menu_dir = ISPC_WEB_PATH.'/tools/lib/menu.d'; + +if (is_dir($menu_dir)) { + if ($dh = opendir($menu_dir)) { + //** Go trough all files in the menu dir + while (($file = readdir($dh)) !== false) { + if($file != '.' && $file != '..' && substr($file,-9,9) == '.menu.php') { + include_once($menu_dir.'/'.$file); + } + } + } +} + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/web/tools/templates/user_settings.htm b/interface/ispconfig/interface/web/tools/templates/user_settings.htm new file mode 100644 index 0000000000000000000000000000000000000000..658b94fafff7f7254e1d267998acb8967291aa35 --- /dev/null +++ b/interface/ispconfig/interface/web/tools/templates/user_settings.htm @@ -0,0 +1,36 @@ +

    +

    + +
    + +
    +
    +
    + + +
    +
    +

    {tmpl_var name='password_strength_txt'}

    +
    +

     

    +
    +
    + + +
    +
    + + +
    + + + +
    + + +
    +
    + +
    diff --git a/interface/ispconfig/interface/web/tools/user_settings.php b/interface/ispconfig/interface/web/tools/user_settings.php new file mode 100644 index 0000000000000000000000000000000000000000..d705cea244c482f3c3d9a2039b9c73680f43048a --- /dev/null +++ b/interface/ispconfig/interface/web/tools/user_settings.php @@ -0,0 +1,97 @@ +auth->check_module_permissions('tools'); + +// Loading classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onLoad() { + global $app, $conf, $tform_def_file; + + // Loading template classes and initialize template + if(!is_object($app->tpl)) $app->uses('tpl'); + if(!is_object($app->tform)) $app->uses('tform'); + + $app->tpl->newTemplate("tabbed_form.tpl.htm"); + + // Load table definition from file + $app->tform->loadFormDef($tform_def_file); + + // Importing ID + $this->id = $_SESSION['s']['user']['userid']; + $_POST['id'] = $_SESSION['s']['user']['userid']; + + if(count($_POST) > 1) { + $this->dataRecord = $_POST; + $this->onSubmit(); + } else { + $this->onShow(); + } + } + + function onInsert() { + die('No inserts allowed.'); + } + + function onBeforeUpdate() { + global $app, $conf; + + if($_POST['passwort'] != $_POST['passwort2']) { + $app->tform->errorMessage = $app->tform->lng('password_mismatch'); + } + $_SESSION['s']['user']['language'] = $_POST['language']; + $_SESSION['s']['language'] = $_POST['language']; + } + + +} + +$page = new page_action; +$page->onLoad(); + +?> diff --git a/interface/ispconfig/nbproject/project.properties b/interface/ispconfig/nbproject/project.properties new file mode 100644 index 0000000000000000000000000000000000000000..70b7f0feee257acdad8e2039ea6ba9a31df49fa8 --- /dev/null +++ b/interface/ispconfig/nbproject/project.properties @@ -0,0 +1,8 @@ +auxiliary.org-netbeans-modules-html-editor-lib.default-html-public-id=HTML5 +include.path=${php.global.include.path} +php.version=PHP_53 +source.encoding=UTF-8 +src.dir=. +tags.asp=false +tags.short=true +web.root=. diff --git a/interface/ispconfig/nbproject/project.xml b/interface/ispconfig/nbproject/project.xml new file mode 100644 index 0000000000000000000000000000000000000000..2316b2d6c213020273df05a9d2d4232160ca8f2a --- /dev/null +++ b/interface/ispconfig/nbproject/project.xml @@ -0,0 +1,9 @@ + + + org.netbeans.modules.php.project + + + web_ispconfig + + + diff --git a/interface/ispconfig/server/conf/apache_apps.vhost.master b/interface/ispconfig/server/conf/apache_apps.vhost.master new file mode 100644 index 0000000000000000000000000000000000000000..ccfcbea04ad80c5764941149728c410173c7d8a6 --- /dev/null +++ b/interface/ispconfig/server/conf/apache_apps.vhost.master @@ -0,0 +1,42 @@ + +###################################################### +# This virtual host contains the configuration +# for the ISPConfig apps vhost +###################################################### + +{vhost_port_listen} Listen {apps_vhost_port} +NameVirtualHost *:{apps_vhost_port} + + + ServerAdmin webmaster@localhost + {apps_vhost_servername} + + + DocumentRoot {apps_vhost_dir} + SuexecUserGroup ispapps ispapps + + Options Indexes FollowSymLinks MultiViews +ExecCGI + AllowOverride AuthConfig Indexes Limit Options FileInfo + AddHandler fcgid-script .php + FCGIWrapper {apps_vhost_basedir}/php-fcgi-scripts/apps/.php-fcgi-starter .php + Order allow,deny + Allow from all + + + + + DocumentRoot {apps_vhost_dir} + AddType application/x-httpd-php .php + + Options FollowSymLinks + AllowOverride None + Order allow,deny + Allow from all + + + + ServerSignature Off + + + + diff --git a/interface/ispconfig/server/conf/apache_ispconfig.conf.master b/interface/ispconfig/server/conf/apache_ispconfig.conf.master new file mode 100644 index 0000000000000000000000000000000000000000..7a7179c7f755dd9cf7399488cacc4b61d59f5627 --- /dev/null +++ b/interface/ispconfig/server/conf/apache_ispconfig.conf.master @@ -0,0 +1,43 @@ + +################################################ +# ISPConfig Logfile configuration for vlogger +################################################ + +LogFormat "%v %h %l %u %t \"%r\" %>s %B \"%{Referer}i\" \"%{User-Agent}i\"" combined_ispconfig +CustomLog "| /usr/local/ispconfig/server/scripts/vlogger -s access.log -t \"%Y%m%d-access.log\" -d \"/etc/vlogger-dbi.conf\" /var/log/ispconfig/httpd" combined_ispconfig + + + AllowOverride None + Order Deny,Allow + Deny from all + + +# Do not allow access to the root file system of the server for security reasons + + AllowOverride None + Order Deny,Allow + Deny from all + + +# Except of the following directories that contain website scripts + + Order allow,deny + Allow from all + + + + Order allow,deny + Allow from all + + + + Order allow,deny + Allow from all + + + + +NameVirtualHost {tmpl_var name="ip_address"}:80 +NameVirtualHost {tmpl_var name="ip_address"}:443 + + diff --git a/interface/ispconfig/server/conf/autoresponder.master b/interface/ispconfig/server/conf/autoresponder.master new file mode 100644 index 0000000000000000000000000000000000000000..0126c998d49f8177d28e147c1642a6e9fe4532c4 --- /dev/null +++ b/interface/ispconfig/server/conf/autoresponder.master @@ -0,0 +1,23 @@ +`test -f {vmail_mailbox_base}/mailfilters/$HOST/$USER/.vacation.msg && exit 1 || exit 0` +if ($RETURNCODE==1) +{ + { + if (!/^List-Unsubscribe:.*/:h ) + { + if (!/^X-Spam-Flag: YES/:h ) + { + NOW=time + if ({start_date} lt $NOW && {end_date} gt $NOW) + { + RESPOND="{vmail_mailbox_base}/mailfilters/$HOST/$USER/.vacation.msg" + RESPONDDB="{vmail_mailbox_base}/mailfilters/$HOST/$USER/.vacation.lst" + + # The following must be one contiguous line + cc "| mailbot -t $RESPOND -d $RESPONDDB -c 'UTF-8' -D 1 \ + -A 'From: $RECIPIENT' -s 'Auto Response: from $RECIPIENT' \ + /usr/sbin/sendmail -t -f ''" + } + } + } + } +} \ No newline at end of file diff --git a/interface/ispconfig/server/conf/bash.bashrc.master b/interface/ispconfig/server/conf/bash.bashrc.master new file mode 100644 index 0000000000000000000000000000000000000000..edcaf7dc586023ae17faba1aa0f594690c27cf1c --- /dev/null +++ b/interface/ispconfig/server/conf/bash.bashrc.master @@ -0,0 +1,65 @@ + + +## Hack for Jailkit User to change back to the logged in user ## +if [ -n "$LOGNAME" ]; then + if [ "$LOGNAME" != $USER ]; then + export HOME=$LOGNAME + export USER=$LOGNAME + export USERNAME=$LOGNAME + cd $HOME + fi +fi + +## Change machine hostname to site domain ## +export HOSTNAME= + + + + +# If not running interactively, don't do anything +[ -z "$PS1" ] && return + + +# check the window size after each command and, if necessary, +# update the values of LINES and COLUMNS. +shopt -s checkwinsize + +# make less more friendly for non-text input files, see lesspipe(1) +[ -x /usr/bin/lesspipe ] && eval "$(lesspipe)" + + +# set a fancy prompt (non-color, unless we know we "want" color) +case "$TERM" in +xterm-color) + PS1='\[\033[01;32m\]$USER@$HOSTNAME\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ ' + ;; +*) + PS1='$USER@$HOSTNAME:\w\$ ' + ;; +esac + + +# If this is an xterm set the title to user@host:dir +case "$TERM" in +xterm*|rxvt*) + PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME}: ${PWD/$HOME/~}\007"' + ;; +*) + ;; +esac + + +# enable color support of ls and also add handy aliases +if [ "$TERM" != "dumb" ]; then + eval "`dircolors -b`" + alias ls='ls --color=auto' + #alias dir='ls --color=auto --format=vertical' + #alias vdir='ls --color=auto --format=long' +fi + +# some more ls aliases +#alias ll='ls -l' +#alias la='ls -A' +#alias l='ls -CF' + + diff --git a/interface/ispconfig/server/conf/bastille-firewall.cfg.master b/interface/ispconfig/server/conf/bastille-firewall.cfg.master new file mode 100644 index 0000000000000000000000000000000000000000..b9658c9861111d2f8a9374b9afa54459138bb977 --- /dev/null +++ b/interface/ispconfig/server/conf/bastille-firewall.cfg.master @@ -0,0 +1,320 @@ +# +# /etc/bastille-firewall.cfg +# +# Configuration file for both 2.2/ipchains and 2.4/netfilter scripts +# +# $Source: /cvsroot/bastille-linux/dev/working_tree/Bastille/bastille-firewall.cfg,v $ +# Modified by: $Author: peterw $ +# $Date: 2002/01/04 13:34:18 $ +# $Revision: 1.7 $ +# +# Copyright (C) 1999-2001 Peter Watkins +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# Thanks to David Ranch, Brad A, Don G, and others for their suggestions + +# the configuration values should be whitespace-delimited lists of +# appropriate values, e.g. +# TCP_PUBLIC_SERVICES="80 smtp ssh" +# lists Web (port 80), SMTP mail, and Secure Shell ports +# +# This script is suitable for workstations or simple NAT firewalls; +# you may want to add more "output" restrictions for serious servers + +# 0) DNS servers (Linux 2.2/ipchains only) +# You must list your DNS servers here so that +# the firewall will allow them to service your lookup requests +# +# List of DNS servers/networks to allow "domain" responses from +# This _could_ be nameservers as a list of /32 entries +#DNS_SERVERS="a.b.c.d/32 e.f.g.h/32" +# If you are running a caching nameserver, you'll need to allow from +# "0.0.0.0/0" so named can query any arbitrary nameserver +# (To enable a caching nameserver, you will also probably need to +# add "domain" to the TCP and UDP public service lists.) +#DNS_SERVERS="0.0.0.0/0" +# +# To have the DNS servers parsed from /etc/resolv.conf at runtime, +# as normal workstations will want, make this variable empty +#DNS_SERVERS="" +# +# Please make sure variable assignments are on single lines; do NOT +# use the "\" continuation character (so Bastille can change the +# values if it is run more than once) +DNS_SERVERS="{DNS_SERVERS}" + + +# 1) define your interfaces (all systems) +# Note a "+" acts as a wildcard, e.g. ppp+ would match any PPP +# interface +# +# list internal/trusted interfaces +# traffic from these interfaces will be allowed +# through the firewall, no restrictions +#TRUSTED_IFACES="lo" # MINIMAL/SAFEST +# +# list external/untrusted interfaces +#PUBLIC_IFACES="eth+ ppp+ slip+" # SAFEST +# +# list internal/partially-trusted interfaces +# e.g. if this acts as a NAT/IP Masq server and you +# don't want clients on those interfaces having +# full network access to services running on this +# server (as the TRUSTED_IFACES allows) +#INTERNAL_IFACES="" # SAFEST +# +# Please make sure variable assignments are on single lines; do NOT +# use the "\" continuation character (so Bastille can change the +# values if it is run more than once) +TRUSTED_IFACES="lo" # MINIMAL/SAFEST +PUBLIC_IFACES="eth+ ppp+ slip+ venet+" # SAFEST +INTERNAL_IFACES="" # SAFEST + + +# 2) services for which we want to log access attempts to syslog (all systems) +# Note this only audits connection attempts from public interfaces +# +# Also see item 12, LOG_FAILURES +# +#TCP_AUDIT_SERVICES="telnet ftp imap pop3 finger sunrpc exec login linuxconf ssh" +# anyone probing for BackOrifice? +#UDP_AUDIT_SERVICES="31337" +# how about ICMP? +#ICMP_AUDIT_TYPES="" +#ICMP_AUDIT_TYPES="echo-request" # ping/MS tracert +# +# To enable auditing, you must have syslog configured to log "kern" +# messages of "info" level; typically you'd do this with a line in +# syslog.conf like +# kern.info /var/log/messages +# though the Bastille port monitor will normally want these messages +# logged to a named pipe instead, and the Bastille script normally +# configures syslog for "kern.*" which catches these messages +# +# Please make sure variable assignments are on single lines; do NOT +# use the "\" continuation character (so Bastille can change the +# values if it is run more than once) +#TCP_AUDIT_SERVICES="telnet ftp imap pop3 finger sunrpc exec login linuxconf ssh" +#UDP_AUDIT_SERVICES="31337" +#ICMP_AUDIT_TYPES="" + + +# 3) services we allow connections to (all systems) +# +# FTP note: +# To allow your machine to service "passive" FTP clients, +# you will need to make allowances for the passive data +# ports; Bastille users should read README.FTP for more +# information +# +# "public" interfaces: +# TCP services that "public" hosts should be allowed to connect to +#TCP_PUBLIC_SERVICES="" # MINIMAL/SAFEST +# +# UDP services that "public" hosts should be allowed to connect to +#UDP_PUBLIC_SERVICES="" # MINIMAL/SAFEST +# +# "internal" interfaces: +# (NB: you will need to repeat the "public" services if you want +# to allow "internal" hosts to reach those services, too.) +# TCP services that internal clients can connect to +#TCP_INTERNAL_SERVICES="" # MINIMAL/SAFEST +# +# UDP services that internal clients can connect to +#UDP_INTERNAL_SERVICES="" # MINIMAL/SAFEST +# +# Please make sure variable assignments are on single lines; do NOT +# use the "\" continuation character (so Bastille can change the +# values if it is run more than once) +TCP_PUBLIC_SERVICES="{tmpl_var name="TCP_PUBLIC_SERVICES"}" # MINIMAL/SAFEST +UDP_PUBLIC_SERVICES="{tmpl_var name="UDP_PUBLIC_SERVICES"}" # MINIMAL/SAFEST +TCP_INTERNAL_SERVICES="" # MINIMAL/SAFEST +UDP_INTERNAL_SERVICES="" # MINIMAL/SAFEST + +# 4) passive/active FTP (Linux 2.2/ipchains only) +# FTP is a firewall nightmare; if you allow "normal" FTP connections, +# you must be careful to block any TCP services that are listening +# on high ports; it's safer to require your FTP clients to use +# "passive" mode. +# +# Note this will also force clients on machines +# that use this one for NAT/IP Masquerading to use passive mode +# for connections that go through this server (e.g. from the +# internal network to public Internet machines +# +# For more information about FTP, see the Bastille README.FTP doc +# +#FORCE_PASV_FTP="N" +#FORCE_PASV_FTP="Y" # SAFEST +# +FORCE_PASV_FTP="Y" # SAFEST + + +# 5) Services to explicitly block. (Linux 2.2/ipchains only) +# See FTP note above +# Note that ranges of ports are specified with colons, and you +# can specify an open range by using only one number, e.g. +# 1024: means ports >= 1024 and :6000 means ports <= 6000 +# +# TCP services on high ports that should be blocked if not forcing passive FTP +# This should include X (6000:6010) and anything else revealed by 'netstat -an' +# (this does not matter unless you're not forcing "passive" FTP) +#TCP_BLOCKED_SERVICES="6000:6020" +# +# UDP services to block: this should be UDP services on high ports. +# Your only vulnerability from public interfaces are the DNS and +# NTP servers/networks (those with 0.0.0.0 for DNS servers should +# obviously be very careful here!) +#UDP_BLOCKED_SERVICES="2049" +# +# types of ICMP packets to allow +#ICMP_ALLOWED_TYPES="destination-unreachable" # MINIMAL/SAFEST +# the following allows you to ping/traceroute outbound +#ICMP_ALLOWED_TYPES="destination-unreachable echo-reply time-exceeded" +# +# Please make sure variable assignments are on single lines; do NOT +# use the "\" continuation character (so Bastille can change the +# values if it is run more than once) +TCP_BLOCKED_SERVICES="6000:6020" +UDP_BLOCKED_SERVICES="2049" +ICMP_ALLOWED_TYPES="destination-unreachable echo-reply time-exceeded echo-request" + + +# 6) Source Address Verification (all Linux systems) +# This helps prevent "IP Spoofing" attacks +# +ENABLE_SRC_ADDR_VERIFY="Y" # SAFEST + + +# 7) IP Masquerading / NAT. (all systems) +# List your internal/masq'ed networks here +# +# Also see item 4, FORCE_PASV_FTP, as that setting affects +# clients using IP Masquerading through this machine +# +# Set this variable if you're using IP Masq / NAT for a local network +#IP_MASQ_NETWORK="" # DISABLE/SAFEST +#IP_MASQ_NETWORK="10.0.0.0/8" # example +#IP_MASQ_NETWORK="192.168.0.0/16" # example +# +# Have lots of masq hosts? uncomment the following six lines +# and list the hosts/networks in /etc/firewall-masqhosts +# the script assumes any address without a "/" netmask afterwards +# is an individual address (netmask /255.255.255.255): +#if [ -f /etc/firewall-masqhosts ]; then +# echo "Reading list of masq hosts from /etc/firewall-masqhosts" +# # Read the file, but use 'awk' to strip comments +# # Note the sed bracket phrase includes a space and tab char +# IP_MASQ_NETWORK=`cat /etc/firewall-masqhosts | awk -F\# '/\// {print $1; next} /[0-9]/ {print $1"/32"}' |sed 's:[ ]*::g'` +#fi +# +# Masq modules +# NB: The script will prepend "ip_masq_" to each module name +#IP_MASQ_MODULES="cuseeme ftp irc quake raudio vdolive" # ALL (?) +#IP_MASQ_MODULES="ftp raudio vdolive" # RECOMMENDED +# +# Please make sure variable assignments are on single lines; do NOT +# use the "\" continuation character (so Bastille can change the +# values if it is run more than once) +IP_MASQ_NETWORK="" # DISABLE/SAFEST +IP_MASQ_MODULES="ftp raudio vdolive" # RECOMMENDED + + +# 8) How to react to disallowed packets (all systems) +# whether to "REJECT" or "DROP" disallowed packets; if you're running any +# public services, you probably ought to use "REJECT"; if in serious stealth +# mode, choose "DROP" so simple probes don't know if there's anything out there +# NOTE: disallowed ICMP packets are discarded with "DROP", as +# it would not make sense to "reject" the packet if you're +# trying to disallow ping/traceroute +# NOTE: the scripts that set up the filter rules will interpret these +# keywords as needed, e.g. "DROP" becomes "DENY" for Linux 2.2/ipchains +# +REJECT_METHOD="DROP" + + +# 9) DHCP (Linux 2.2/ipchains only) +# In case your server needs to get a DHCP address from some other +# machine (e.g. cable modem) +#DHCP_IFACES="eth0" # example, to allow you to query on eth0 +#DHCP_IFACES="" # DISABLED +# +# Please make sure variable assignments are on single lines; do NOT +# use the "\" continuation character (so Bastille can change the +# values if it is run more than once) +DHCP_IFACES="" # DISABLED + + +# 10) NTP servers (Linux 2.2/ipchains only) +# more UDP fun. List IP addresses or network space of NTP servers +# +#NTP_SERVERS="" # DISABLE NTP QUERIES / SAFEST +#NTP_SERVERS="a.b.c.d/32 e.f.g.h/32" # example, to allow querying 2 servers +# +# Please make sure variable assignments are on single lines; do NOT +# use the "\" continuation character (so Bastille can change the +# values if it is run more than once) +NTP_SERVERS="" # DISABLE NTP QUERIES / SAFEST + + +# 11) more ICMP. (Linux 2.2/ipchains only) +# Control the outbound ICMP to make yourself invisible to +# traceroute probes +# +#ICMP_OUTBOUND_DISABLED_TYPES="destination-unreachable time-exceeded" +# +# Please make sure variable assignments are on single lines; do NOT +# use the "\" continuation character (so Bastille can change the +# values if it is run more than once) +ICMP_OUTBOUND_DISABLED_TYPES="destination-unreachable time-exceeded" + + +# 12) Logging (all systems) +# With this enabled, ipchains will log all blocked packets. +# ** this could generate huge logs ** +# This is primarily intended for the port mointoring system; +# also note that you probably do not want to "AUDIT" any services +# that you are not allowing, as doing so would mean duplicate +# logging +LOG_FAILURES="N" # do not log blocked packets + +# 13) Block fragmented packets (all systems) +# There's no good reason to allow these +#ALLOW_FRAGMENTS="N" # safest +ALLOW_FRAGMENTS="Y" # old behavior + +# 14) Prevent SMB broadcasts from leaking out NAT setup (all systems) +# Windows machines will poll teh net with SMB broadcasts, +# basically advertising their existence. Most folks agree +# that this traffic should be dropped +#DROP_SMB_NAT_BCAST="N" # allow them (are you sure?) +DROP_SMB_NAT_BCAST="Y" # drop those packets + +# 15) Log level (iptables/netfilter/Linux 2.4 only) +# Control what level of logging is used when the firewall logs +# information. Default is warning (4). Lowest priority is +# debug (7); highest is emergency (0). To prevent syslog +# from copying iptables error messages to the console, set +# this to 6 (7 would also work, but 6 is recommended) +# You can also stop syslogd/klogd from printing kernel +# messages to the console by issuing the command +# setterm -msg off +#IP_LOG_LEVEL=6 # level used in 2.2/ipchains +IP_LOG_LEVEL=4 # iptables/netfilter default + +# 16) Always attempt to use stateful features for inbound connections +# Always using state will allow the firewall to reject invalid +# packets sent to otherwise open TCP services, e.g. XMAS, NULL +# and SIN/FYN scans. The downside to choosing this behavior is that +# services may become unreachable if the packet filter's state +# table becomes full. +IP_ALWAYS_USE_STATE="N" # default, ensures services remain available +#IP_ALWAYS_USE_STATE="Y" # disallow invalid packets \ No newline at end of file diff --git a/interface/ispconfig/server/conf/bind_named.conf.local.master b/interface/ispconfig/server/conf/bind_named.conf.local.master new file mode 100644 index 0000000000000000000000000000000000000000..764730d096d88781daf63c2dc4cd99a6571965dc --- /dev/null +++ b/interface/ispconfig/server/conf/bind_named.conf.local.master @@ -0,0 +1,9 @@ + + + +zone "" { + type master; + file ""; +}; + + diff --git a/interface/ispconfig/server/conf/bind_pri.domain.master b/interface/ispconfig/server/conf/bind_pri.domain.master new file mode 100644 index 0000000000000000000000000000000000000000..faa42f3d7081b976c8877dd772a5717101070cf5 --- /dev/null +++ b/interface/ispconfig/server/conf/bind_pri.domain.master @@ -0,0 +1,48 @@ +$TTL {tmpl_var name='ttl'} +@ IN SOA {tmpl_var name='ns'} {tmpl_var name='mbox'} ( + {tmpl_var name='serial'} ; serial, todays date + todays serial # + {tmpl_var name='refresh'} ; refresh, seconds + {tmpl_var name='retry'} ; retry, seconds + {tmpl_var name='expire'} ; expire, seconds + {tmpl_var name='ttl'} ) ; minimum, seconds +; + + + +{tmpl_var name='name'} NS {tmpl_var name='data'} + + +{tmpl_var name='name'} A {tmpl_var name='data'} + + +{tmpl_var name='name'} AAAA {tmpl_var name='data'} + + +{tmpl_var name='name'} CNAME {tmpl_var name='data'} + + +{tmpl_var name='name'} CNAME {tmpl_var name='data'} + + +{tmpl_var name='name'} HINFO {tmpl_var name='data'} + + +{tmpl_var name='name'} MX {tmpl_var name='aux'} {tmpl_var name='data'} + + +{tmpl_var name='name'} NAPTR {tmpl_var name='data'} + + +{tmpl_var name='name'} PTR {tmpl_var name='data'} + + +{tmpl_var name='name'} RP {tmpl_var name='data'} + + +{tmpl_var name='name'} SRV 0 {tmpl_var name='data'} + + +{tmpl_var name='name'} TXT {tmpl_var name='data'} + + + diff --git a/interface/ispconfig/server/conf/debian_network_interfaces.master b/interface/ispconfig/server/conf/debian_network_interfaces.master new file mode 100644 index 0000000000000000000000000000000000000000..08c713691cbec3578bc5676c766692a48d330632 --- /dev/null +++ b/interface/ispconfig/server/conf/debian_network_interfaces.master @@ -0,0 +1,27 @@ +# This file describes the network interfaces available on your system +# and how to activate them. For more information, see interfaces(5). + +# The loopback network interface +auto lo +iface lo inet loopback + +# The primary network interface +auto eth0 +iface eth0 inet static + address + netmask + network + broadcast + gateway + + + +auto eth0: +iface eth0: inet static + address + netmask + network + broadcast + gateway + + diff --git a/interface/ispconfig/server/conf/error/br/400.html b/interface/ispconfig/server/conf/error/br/400.html new file mode 100644 index 0000000000000000000000000000000000000000..7edd410d331f8fc1e218c5b39bdcec271d8fe8ed --- /dev/null +++ b/interface/ispconfig/server/conf/error/br/400.html @@ -0,0 +1,63 @@ + + + +ERROR 400 - Requisição ruim! + + + + + +
    + +
    +

    O seguinte erro ocorreu:

    +

    Você usou uma sintaxe inválida.

    +

    Se tiver qualquer dúvida extra sobre este erro contate seu webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/br/401.html b/interface/ispconfig/server/conf/error/br/401.html new file mode 100644 index 0000000000000000000000000000000000000000..b0fc2215d498d10015a762533e06fd2bb0c44bfe --- /dev/null +++ b/interface/ispconfig/server/conf/error/br/401.html @@ -0,0 +1,61 @@ + + + + ERRO 401 - Não autorizado! + + + + + +
    + +
    +

    O seguinte erro ocorreu:

    +

    O endereço requisitado necessita de autorização para acesso.

    +

    Se tiver qualquer dúvida extra sobre este erro contate seu webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/br/403.html b/interface/ispconfig/server/conf/error/br/403.html new file mode 100644 index 0000000000000000000000000000000000000000..574830c7616c93b1196ddc57f87af6b4029f4893 --- /dev/null +++ b/interface/ispconfig/server/conf/error/br/403.html @@ -0,0 +1,61 @@ + + + + ERRO 403 - Acesso negado! + + + + + +
    + +
    +

    O seguinte erro ocorreu:

    +

    Não foi permitido o seu acesso ao endereço especificado.

    +

    Se tiver qualquer dúvida extra sobre este erro contate seu webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/br/404.html b/interface/ispconfig/server/conf/error/br/404.html new file mode 100644 index 0000000000000000000000000000000000000000..0d00ccef29b03c39d1e132545f998a1a7f270f77 --- /dev/null +++ b/interface/ispconfig/server/conf/error/br/404.html @@ -0,0 +1,61 @@ + + + + ERRO 404 - Arquivo não encontrado! + + + + + +
    + +
    +

    O seguinte erro ocorreu:

    +

    O endereço requisitado não foi encontrado neste servidor.

    +

    Se tiver qualquer dúvida extra sobre este erro cheque por atualizações neste endereço ou contate seu webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/br/405.html b/interface/ispconfig/server/conf/error/br/405.html new file mode 100644 index 0000000000000000000000000000000000000000..e05d56cf35a2da7acda22a612a014411c68084c3 --- /dev/null +++ b/interface/ispconfig/server/conf/error/br/405.html @@ -0,0 +1,61 @@ + + + + ERRO 405 - Método não permitido! + + + + + +
    + +
    +

    O seguinte erro ocorreu:

    +

    O método utilizado não é permitido.

    +

    Se tiver qualquer dúvida extra sobre este erro contate seu webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/br/500.html b/interface/ispconfig/server/conf/error/br/500.html new file mode 100644 index 0000000000000000000000000000000000000000..7a24b511374eea7868518c688a6878c55add5d52 --- /dev/null +++ b/interface/ispconfig/server/conf/error/br/500.html @@ -0,0 +1,61 @@ + + + + ERRO 500 - Erro interno do servidor! + + + + + +
    + +
    +

    O seguinte erro ocorreu:

    +

    O erro no endereço requisitado foi causado por uma Requisição interna do servidor inválida.

    +

    Se está mensagem se repetir muitas vezes contate seu webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/br/503.html b/interface/ispconfig/server/conf/error/br/503.html new file mode 100644 index 0000000000000000000000000000000000000000..ff7b5e88b2aa10c03aafe398f3fa27de1eef31c4 --- /dev/null +++ b/interface/ispconfig/server/conf/error/br/503.html @@ -0,0 +1,61 @@ + + + + ERRO 503 - Serviço Indisponível! + + + + + +
    + +
    +

    O seguinte erro ocorreu:

    +

    O serviço não está disponível no momento por uma sobrecarga temporária ou processo de manutenção. Por favor tente mais tarde

    +

    Se tiver qualquer dúvida extra sobre este erro contate seu webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/cz/400.html b/interface/ispconfig/server/conf/error/cz/400.html new file mode 100644 index 0000000000000000000000000000000000000000..f83ae5892616e361a6339b828b0ec7cfe0c194d2 --- /dev/null +++ b/interface/ispconfig/server/conf/error/cz/400.html @@ -0,0 +1,61 @@ + + + + ERROR 400 - Bad Request! + + + + + +
    + +
    +

    The following error occurred:

    +

    You have used invalid syntax.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/cz/401.html b/interface/ispconfig/server/conf/error/cz/401.html new file mode 100644 index 0000000000000000000000000000000000000000..49c7b4780c4e8d9b17215dc15bc06b170fd8ba18 --- /dev/null +++ b/interface/ispconfig/server/conf/error/cz/401.html @@ -0,0 +1,61 @@ + + + + ERROR 401 - Unauthorized! + + + + + +
    + +
    +

    The following error occurred:

    +

    The URL requested requires authorisation.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/cz/403.html b/interface/ispconfig/server/conf/error/cz/403.html new file mode 100644 index 0000000000000000000000000000000000000000..12934ce6db39c4fc9a5e1ebe6304d27fb01d5334 --- /dev/null +++ b/interface/ispconfig/server/conf/error/cz/403.html @@ -0,0 +1,61 @@ + + + + ERROR 403 - Forbidden! + + + + + +
    + +
    +

    The following error occurred:

    +

    You are not permitted to access the requested URL.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/cz/404.html b/interface/ispconfig/server/conf/error/cz/404.html new file mode 100644 index 0000000000000000000000000000000000000000..fb17b2ac3b9cf8de96d3712c01615a7ea13195f6 --- /dev/null +++ b/interface/ispconfig/server/conf/error/cz/404.html @@ -0,0 +1,61 @@ + + + + ERROR 404 - Not Found! + + + + + +
    + +
    +

    The following error occurred:

    +

    The requested URL was not found on this server.

    +

    Please check the URL or contact the webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/cz/405.html b/interface/ispconfig/server/conf/error/cz/405.html new file mode 100644 index 0000000000000000000000000000000000000000..e5f66a8fb9c74e775558870dc14f19cac51c1035 --- /dev/null +++ b/interface/ispconfig/server/conf/error/cz/405.html @@ -0,0 +1,61 @@ + + + + ERROR 405 - Method Not Allowed! + + + + + +
    + +
    +

    The following error occurred:

    +

    The method used is not permitted.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/cz/500.html b/interface/ispconfig/server/conf/error/cz/500.html new file mode 100644 index 0000000000000000000000000000000000000000..4413bf56ad2c437ccfcf6a4bceb2216799c7463c --- /dev/null +++ b/interface/ispconfig/server/conf/error/cz/500.html @@ -0,0 +1,61 @@ + + + + ERROR 500 - Internal Server Error! + + + + + +
    + +
    +

    The following error occurred:

    +

    The requested URL caused an internal server error.

    +

    If you get this message repeatedly please contact the webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/cz/503.html b/interface/ispconfig/server/conf/error/cz/503.html new file mode 100644 index 0000000000000000000000000000000000000000..983ce2637801b7f17ac21b75324314c39ae8c239 --- /dev/null +++ b/interface/ispconfig/server/conf/error/cz/503.html @@ -0,0 +1,61 @@ + + + + ERROR 503 - Service Unavailable! + + + + + +
    + +
    +

    The following error occurred:

    +

    The Service is not available at the moment due to a temporary overloading or maintenance of the server. Please try again later.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/de/400.html b/interface/ispconfig/server/conf/error/de/400.html new file mode 100644 index 0000000000000000000000000000000000000000..cb223c85a2f5ec12baccad26372078d3be320726 --- /dev/null +++ b/interface/ispconfig/server/conf/error/de/400.html @@ -0,0 +1,61 @@ + + + + FEHLER 400 - Ungültige Anforderung! + + + + + +
    + +
    +

    Folgender Fehler ist aufgetreten:

    +

    Sie verwenden eine ungültige Anforderung.

    +

    Bei Problemen wenden Sie sich bitte an den Webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/de/401.html b/interface/ispconfig/server/conf/error/de/401.html new file mode 100644 index 0000000000000000000000000000000000000000..f01cc1e609903aa7e10e99b30b747a03c4608d65 --- /dev/null +++ b/interface/ispconfig/server/conf/error/de/401.html @@ -0,0 +1,61 @@ + + + + FEHLER 401 - Zugriff verweigert! + + + + + +
    + +
    +

    Folgender Fehler ist aufgetreten:

    +

    Der Anmeldeversuch ist fehlgeschlagen, vermutlich, weil ein ungültiger Benutzername oder ein ungültiges Kennwort verwendet wurde.

    +

    Bei weiteren Problemen wenden Sie sich bitte an den Webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/de/403.html b/interface/ispconfig/server/conf/error/de/403.html new file mode 100644 index 0000000000000000000000000000000000000000..e01e62614c480e180669310efdadf90a8fec6120 --- /dev/null +++ b/interface/ispconfig/server/conf/error/de/403.html @@ -0,0 +1,61 @@ + + + + FEHLER 403 - Unzulässig! + + + + + +
    + +
    +

    Folgender Fehler ist aufgetreten:

    +

    Sie besitzen nicht die erforderlichen Rechte, die angegebene URL zu öffnen.

    +

    Bei weiteren Problemen wenden Sie sich bitte an den Webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/de/404.html b/interface/ispconfig/server/conf/error/de/404.html new file mode 100644 index 0000000000000000000000000000000000000000..cfc5009d6e15f567371b6359b49fc079178dc7e6 --- /dev/null +++ b/interface/ispconfig/server/conf/error/de/404.html @@ -0,0 +1,61 @@ + + + + FEHLER 404 - Nicht gefunden! + + + + + +
    + +
    +

    Folgender Fehler ist aufgetreten:

    +

    Die angegebene URL wurde auf diesem Server nicht gefunden.

    +

    Bitte überprüfen Sie die Schreibweise der URL oder wenden Sie sich an den Webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/de/405.html b/interface/ispconfig/server/conf/error/de/405.html new file mode 100644 index 0000000000000000000000000000000000000000..c59dd5b2c679a5b8c3c95df1f8524af7ba106b85 --- /dev/null +++ b/interface/ispconfig/server/conf/error/de/405.html @@ -0,0 +1,61 @@ + + + + FEHLER 405 - Methode unzulässig! + + + + + +
    + +
    +

    Folgender Fehler ist aufgetreten:

    +

    Für Zugriff auf diese Seite verwendetes HTTP-Verb ist nicht zulässig, Methode unzulässig.

    +

    Bei Problemen wenden Sie sich bitte an den Webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/de/500.html b/interface/ispconfig/server/conf/error/de/500.html new file mode 100644 index 0000000000000000000000000000000000000000..55b4f4f966086cfbc6e1d5ba858f95c06dc00fa7 --- /dev/null +++ b/interface/ispconfig/server/conf/error/de/500.html @@ -0,0 +1,61 @@ + + + + FEHLER 500 - Interner Serverfehler! + + + + + +
    + +
    +

    Folgender Fehler ist aufgetreten:

    +

    Beim Aufruf der angegebenen URL ist ein interner Serverfehler aufgetreten.

    +

    Sollten Sie diese Fehlermeldung öfter erhalten, wenden Sie sich bitte an den Webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/de/503.html b/interface/ispconfig/server/conf/error/de/503.html new file mode 100644 index 0000000000000000000000000000000000000000..ca12cd6c79007b361e1ebc32ac1080783075b781 --- /dev/null +++ b/interface/ispconfig/server/conf/error/de/503.html @@ -0,0 +1,62 @@ + + + + FEHLER 503 - Dienst nicht verfügbar! + + + + + + +
    + +
    +

    Folgender Fehler ist aufgetreten:

    +

    Der Dienst ist momentan überlastet. Bitte versuchen Sie es später noch einmal.

    +

    Sollten Sie diese Fehlermeldung öfter erhalten, wenden Sie sich bitte an den Webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/en/400.html b/interface/ispconfig/server/conf/error/en/400.html new file mode 100644 index 0000000000000000000000000000000000000000..f83ae5892616e361a6339b828b0ec7cfe0c194d2 --- /dev/null +++ b/interface/ispconfig/server/conf/error/en/400.html @@ -0,0 +1,61 @@ + + + + ERROR 400 - Bad Request! + + + + + +
    + +
    +

    The following error occurred:

    +

    You have used invalid syntax.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/en/401.html b/interface/ispconfig/server/conf/error/en/401.html new file mode 100644 index 0000000000000000000000000000000000000000..49c7b4780c4e8d9b17215dc15bc06b170fd8ba18 --- /dev/null +++ b/interface/ispconfig/server/conf/error/en/401.html @@ -0,0 +1,61 @@ + + + + ERROR 401 - Unauthorized! + + + + + +
    + +
    +

    The following error occurred:

    +

    The URL requested requires authorisation.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/en/403.html b/interface/ispconfig/server/conf/error/en/403.html new file mode 100644 index 0000000000000000000000000000000000000000..12934ce6db39c4fc9a5e1ebe6304d27fb01d5334 --- /dev/null +++ b/interface/ispconfig/server/conf/error/en/403.html @@ -0,0 +1,61 @@ + + + + ERROR 403 - Forbidden! + + + + + +
    + +
    +

    The following error occurred:

    +

    You are not permitted to access the requested URL.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/en/404.html b/interface/ispconfig/server/conf/error/en/404.html new file mode 100644 index 0000000000000000000000000000000000000000..fb17b2ac3b9cf8de96d3712c01615a7ea13195f6 --- /dev/null +++ b/interface/ispconfig/server/conf/error/en/404.html @@ -0,0 +1,61 @@ + + + + ERROR 404 - Not Found! + + + + + +
    + +
    +

    The following error occurred:

    +

    The requested URL was not found on this server.

    +

    Please check the URL or contact the webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/en/405.html b/interface/ispconfig/server/conf/error/en/405.html new file mode 100644 index 0000000000000000000000000000000000000000..e5f66a8fb9c74e775558870dc14f19cac51c1035 --- /dev/null +++ b/interface/ispconfig/server/conf/error/en/405.html @@ -0,0 +1,61 @@ + + + + ERROR 405 - Method Not Allowed! + + + + + +
    + +
    +

    The following error occurred:

    +

    The method used is not permitted.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/en/500.html b/interface/ispconfig/server/conf/error/en/500.html new file mode 100644 index 0000000000000000000000000000000000000000..4413bf56ad2c437ccfcf6a4bceb2216799c7463c --- /dev/null +++ b/interface/ispconfig/server/conf/error/en/500.html @@ -0,0 +1,61 @@ + + + + ERROR 500 - Internal Server Error! + + + + + +
    + +
    +

    The following error occurred:

    +

    The requested URL caused an internal server error.

    +

    If you get this message repeatedly please contact the webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/en/503.html b/interface/ispconfig/server/conf/error/en/503.html new file mode 100644 index 0000000000000000000000000000000000000000..983ce2637801b7f17ac21b75324314c39ae8c239 --- /dev/null +++ b/interface/ispconfig/server/conf/error/en/503.html @@ -0,0 +1,61 @@ + + + + ERROR 503 - Service Unavailable! + + + + + +
    + +
    +

    The following error occurred:

    +

    The Service is not available at the moment due to a temporary overloading or maintenance of the server. Please try again later.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/es/400.html b/interface/ispconfig/server/conf/error/es/400.html new file mode 100644 index 0000000000000000000000000000000000000000..f83ae5892616e361a6339b828b0ec7cfe0c194d2 --- /dev/null +++ b/interface/ispconfig/server/conf/error/es/400.html @@ -0,0 +1,61 @@ + + + + ERROR 400 - Bad Request! + + + + + +
    + +
    +

    The following error occurred:

    +

    You have used invalid syntax.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/es/401.html b/interface/ispconfig/server/conf/error/es/401.html new file mode 100644 index 0000000000000000000000000000000000000000..49c7b4780c4e8d9b17215dc15bc06b170fd8ba18 --- /dev/null +++ b/interface/ispconfig/server/conf/error/es/401.html @@ -0,0 +1,61 @@ + + + + ERROR 401 - Unauthorized! + + + + + +
    + +
    +

    The following error occurred:

    +

    The URL requested requires authorisation.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/es/403.html b/interface/ispconfig/server/conf/error/es/403.html new file mode 100644 index 0000000000000000000000000000000000000000..12934ce6db39c4fc9a5e1ebe6304d27fb01d5334 --- /dev/null +++ b/interface/ispconfig/server/conf/error/es/403.html @@ -0,0 +1,61 @@ + + + + ERROR 403 - Forbidden! + + + + + +
    + +
    +

    The following error occurred:

    +

    You are not permitted to access the requested URL.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/es/404.html b/interface/ispconfig/server/conf/error/es/404.html new file mode 100644 index 0000000000000000000000000000000000000000..fb17b2ac3b9cf8de96d3712c01615a7ea13195f6 --- /dev/null +++ b/interface/ispconfig/server/conf/error/es/404.html @@ -0,0 +1,61 @@ + + + + ERROR 404 - Not Found! + + + + + +
    + +
    +

    The following error occurred:

    +

    The requested URL was not found on this server.

    +

    Please check the URL or contact the webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/es/405.html b/interface/ispconfig/server/conf/error/es/405.html new file mode 100644 index 0000000000000000000000000000000000000000..e5f66a8fb9c74e775558870dc14f19cac51c1035 --- /dev/null +++ b/interface/ispconfig/server/conf/error/es/405.html @@ -0,0 +1,61 @@ + + + + ERROR 405 - Method Not Allowed! + + + + + +
    + +
    +

    The following error occurred:

    +

    The method used is not permitted.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/es/500.html b/interface/ispconfig/server/conf/error/es/500.html new file mode 100644 index 0000000000000000000000000000000000000000..4413bf56ad2c437ccfcf6a4bceb2216799c7463c --- /dev/null +++ b/interface/ispconfig/server/conf/error/es/500.html @@ -0,0 +1,61 @@ + + + + ERROR 500 - Internal Server Error! + + + + + +
    + +
    +

    The following error occurred:

    +

    The requested URL caused an internal server error.

    +

    If you get this message repeatedly please contact the webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/es/503.html b/interface/ispconfig/server/conf/error/es/503.html new file mode 100644 index 0000000000000000000000000000000000000000..983ce2637801b7f17ac21b75324314c39ae8c239 --- /dev/null +++ b/interface/ispconfig/server/conf/error/es/503.html @@ -0,0 +1,61 @@ + + + + ERROR 503 - Service Unavailable! + + + + + +
    + +
    +

    The following error occurred:

    +

    The Service is not available at the moment due to a temporary overloading or maintenance of the server. Please try again later.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/fi/400.html b/interface/ispconfig/server/conf/error/fi/400.html new file mode 100644 index 0000000000000000000000000000000000000000..aa667fa3fa1fc76f85d7caa93639762cc7e645c3 --- /dev/null +++ b/interface/ispconfig/server/conf/error/fi/400.html @@ -0,0 +1,61 @@ + + + + Virhe 400 - Virheellinen pyyntö! + + + + + +
    + +
    +

    Seuraava virhe tapahtui:

    +

    Olet käyttänyt virheellistä kirjoitusasua.

    +

    Ota yhteyttä ylläpitoon jos sinulla on kysyttävää.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/fi/401.html b/interface/ispconfig/server/conf/error/fi/401.html new file mode 100644 index 0000000000000000000000000000000000000000..6846fa4fcf21da1fa185cfb1815ff7de5ef05a6c --- /dev/null +++ b/interface/ispconfig/server/conf/error/fi/401.html @@ -0,0 +1,61 @@ + + + + Virhe 401 - Ei sallittu! + + + + + +
    + +
    +

    Seuraava virhe tapahtui:

    +

    Tämä URL-osoite tarvitsee tunnistaumisen.

    +

    Ota yhteyttä ylläpitoon jos sinulla on kysyttävää.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/fi/403.html b/interface/ispconfig/server/conf/error/fi/403.html new file mode 100644 index 0000000000000000000000000000000000000000..156785eae3ce5844d15974edaca5745a79642049 --- /dev/null +++ b/interface/ispconfig/server/conf/error/fi/403.html @@ -0,0 +1,61 @@ + + + + Virhe 403 - Kielletty! + + + + + +
    + +
    +

    Seuraava virhe tapahtui:

    +

    Sinulle ei ole sallittu pääsy pyytämääsi URL-osoitteeseen.

    +

    Ota yhteyttä ylläpitoon jos sinulla on kysyttävää.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/fi/404.html b/interface/ispconfig/server/conf/error/fi/404.html new file mode 100644 index 0000000000000000000000000000000000000000..79742a2c89026a4e25049692af08f986cdd642d6 --- /dev/null +++ b/interface/ispconfig/server/conf/error/fi/404.html @@ -0,0 +1,61 @@ + + + + Virhe 404 - Kohdetta ei löydy! + + + + + +
    + +
    +

    Seuraava virhe tapahtui:

    +

    Pyytämääsi URL-osoitetta ei löydy tältä palvelimelta.

    +

    Tarkista osoite tai ota yhteyttä ylläpitoon.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/fi/405.html b/interface/ispconfig/server/conf/error/fi/405.html new file mode 100644 index 0000000000000000000000000000000000000000..8194b2470844aeb17f2664a84dc742e79c4fffcf --- /dev/null +++ b/interface/ispconfig/server/conf/error/fi/405.html @@ -0,0 +1,61 @@ + + + + Virhe 405 - Metodi ei ole sallittu! + + + + + +
    + +
    +

    Seuraava virhe tapahtui:

    +

    Käyttämäsi metodi ei ole sallittu.

    +

    Ota yhteyttä ylläpitoon jos sinulla on kysyttävää.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/fi/500.html b/interface/ispconfig/server/conf/error/fi/500.html new file mode 100644 index 0000000000000000000000000000000000000000..21c7ab5bd0e6184c6f48e662288c3362ebd566bf --- /dev/null +++ b/interface/ispconfig/server/conf/error/fi/500.html @@ -0,0 +1,61 @@ + + + + Virhe 500 - Palvelimen sisäinen virhe! + + + + + +
    + +
    +

    Seuraava virhe tapahtui:

    +

    Pyydetty URL-osoite aiheutti palvelimen sisäisen virheen.

    +

    Jos saat tämän virheen toistuvasti, ota yhteyttä ylläpitoon.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/fi/503.html b/interface/ispconfig/server/conf/error/fi/503.html new file mode 100644 index 0000000000000000000000000000000000000000..fa1281362d5bb3db0735bde4aa95b4231c90cba5 --- /dev/null +++ b/interface/ispconfig/server/conf/error/fi/503.html @@ -0,0 +1,61 @@ + + + + Virhe 503 - Palvelu tavoittamattomissa! + + + + + +
    + +
    +

    Seuraava virhe tapahtui:

    +

    Palvelu ei ole tavoitettavissa hetkellisen ylikuormituksen tai huoltotoimenpiteiden vuoksi. Yritä myöhemmin uudelleen.

    +

    Ota yhteyttä ylläpitoon jos sinulla on kysyttävää.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/fr/400.html b/interface/ispconfig/server/conf/error/fr/400.html new file mode 100644 index 0000000000000000000000000000000000000000..f83ae5892616e361a6339b828b0ec7cfe0c194d2 --- /dev/null +++ b/interface/ispconfig/server/conf/error/fr/400.html @@ -0,0 +1,61 @@ + + + + ERROR 400 - Bad Request! + + + + + +
    + +
    +

    The following error occurred:

    +

    You have used invalid syntax.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/fr/401.html b/interface/ispconfig/server/conf/error/fr/401.html new file mode 100644 index 0000000000000000000000000000000000000000..49c7b4780c4e8d9b17215dc15bc06b170fd8ba18 --- /dev/null +++ b/interface/ispconfig/server/conf/error/fr/401.html @@ -0,0 +1,61 @@ + + + + ERROR 401 - Unauthorized! + + + + + +
    + +
    +

    The following error occurred:

    +

    The URL requested requires authorisation.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/fr/403.html b/interface/ispconfig/server/conf/error/fr/403.html new file mode 100644 index 0000000000000000000000000000000000000000..12934ce6db39c4fc9a5e1ebe6304d27fb01d5334 --- /dev/null +++ b/interface/ispconfig/server/conf/error/fr/403.html @@ -0,0 +1,61 @@ + + + + ERROR 403 - Forbidden! + + + + + +
    + +
    +

    The following error occurred:

    +

    You are not permitted to access the requested URL.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/fr/404.html b/interface/ispconfig/server/conf/error/fr/404.html new file mode 100644 index 0000000000000000000000000000000000000000..fb17b2ac3b9cf8de96d3712c01615a7ea13195f6 --- /dev/null +++ b/interface/ispconfig/server/conf/error/fr/404.html @@ -0,0 +1,61 @@ + + + + ERROR 404 - Not Found! + + + + + +
    + +
    +

    The following error occurred:

    +

    The requested URL was not found on this server.

    +

    Please check the URL or contact the webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/fr/405.html b/interface/ispconfig/server/conf/error/fr/405.html new file mode 100644 index 0000000000000000000000000000000000000000..e5f66a8fb9c74e775558870dc14f19cac51c1035 --- /dev/null +++ b/interface/ispconfig/server/conf/error/fr/405.html @@ -0,0 +1,61 @@ + + + + ERROR 405 - Method Not Allowed! + + + + + +
    + +
    +

    The following error occurred:

    +

    The method used is not permitted.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/fr/500.html b/interface/ispconfig/server/conf/error/fr/500.html new file mode 100644 index 0000000000000000000000000000000000000000..4413bf56ad2c437ccfcf6a4bceb2216799c7463c --- /dev/null +++ b/interface/ispconfig/server/conf/error/fr/500.html @@ -0,0 +1,61 @@ + + + + ERROR 500 - Internal Server Error! + + + + + +
    + +
    +

    The following error occurred:

    +

    The requested URL caused an internal server error.

    +

    If you get this message repeatedly please contact the webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/fr/503.html b/interface/ispconfig/server/conf/error/fr/503.html new file mode 100644 index 0000000000000000000000000000000000000000..983ce2637801b7f17ac21b75324314c39ae8c239 --- /dev/null +++ b/interface/ispconfig/server/conf/error/fr/503.html @@ -0,0 +1,61 @@ + + + + ERROR 503 - Service Unavailable! + + + + + +
    + +
    +

    The following error occurred:

    +

    The Service is not available at the moment due to a temporary overloading or maintenance of the server. Please try again later.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/gr/400.html b/interface/ispconfig/server/conf/error/gr/400.html new file mode 100644 index 0000000000000000000000000000000000000000..f83ae5892616e361a6339b828b0ec7cfe0c194d2 --- /dev/null +++ b/interface/ispconfig/server/conf/error/gr/400.html @@ -0,0 +1,61 @@ + + + + ERROR 400 - Bad Request! + + + + + +
    + +
    +

    The following error occurred:

    +

    You have used invalid syntax.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/gr/401.html b/interface/ispconfig/server/conf/error/gr/401.html new file mode 100644 index 0000000000000000000000000000000000000000..49c7b4780c4e8d9b17215dc15bc06b170fd8ba18 --- /dev/null +++ b/interface/ispconfig/server/conf/error/gr/401.html @@ -0,0 +1,61 @@ + + + + ERROR 401 - Unauthorized! + + + + + +
    + +
    +

    The following error occurred:

    +

    The URL requested requires authorisation.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/gr/403.html b/interface/ispconfig/server/conf/error/gr/403.html new file mode 100644 index 0000000000000000000000000000000000000000..12934ce6db39c4fc9a5e1ebe6304d27fb01d5334 --- /dev/null +++ b/interface/ispconfig/server/conf/error/gr/403.html @@ -0,0 +1,61 @@ + + + + ERROR 403 - Forbidden! + + + + + +
    + +
    +

    The following error occurred:

    +

    You are not permitted to access the requested URL.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/gr/404.html b/interface/ispconfig/server/conf/error/gr/404.html new file mode 100644 index 0000000000000000000000000000000000000000..fb17b2ac3b9cf8de96d3712c01615a7ea13195f6 --- /dev/null +++ b/interface/ispconfig/server/conf/error/gr/404.html @@ -0,0 +1,61 @@ + + + + ERROR 404 - Not Found! + + + + + +
    + +
    +

    The following error occurred:

    +

    The requested URL was not found on this server.

    +

    Please check the URL or contact the webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/gr/405.html b/interface/ispconfig/server/conf/error/gr/405.html new file mode 100644 index 0000000000000000000000000000000000000000..e5f66a8fb9c74e775558870dc14f19cac51c1035 --- /dev/null +++ b/interface/ispconfig/server/conf/error/gr/405.html @@ -0,0 +1,61 @@ + + + + ERROR 405 - Method Not Allowed! + + + + + +
    + +
    +

    The following error occurred:

    +

    The method used is not permitted.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/gr/500.html b/interface/ispconfig/server/conf/error/gr/500.html new file mode 100644 index 0000000000000000000000000000000000000000..4413bf56ad2c437ccfcf6a4bceb2216799c7463c --- /dev/null +++ b/interface/ispconfig/server/conf/error/gr/500.html @@ -0,0 +1,61 @@ + + + + ERROR 500 - Internal Server Error! + + + + + +
    + +
    +

    The following error occurred:

    +

    The requested URL caused an internal server error.

    +

    If you get this message repeatedly please contact the webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/gr/503.html b/interface/ispconfig/server/conf/error/gr/503.html new file mode 100644 index 0000000000000000000000000000000000000000..983ce2637801b7f17ac21b75324314c39ae8c239 --- /dev/null +++ b/interface/ispconfig/server/conf/error/gr/503.html @@ -0,0 +1,61 @@ + + + + ERROR 503 - Service Unavailable! + + + + + +
    + +
    +

    The following error occurred:

    +

    The Service is not available at the moment due to a temporary overloading or maintenance of the server. Please try again later.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/hu/400.html b/interface/ispconfig/server/conf/error/hu/400.html new file mode 100644 index 0000000000000000000000000000000000000000..f83ae5892616e361a6339b828b0ec7cfe0c194d2 --- /dev/null +++ b/interface/ispconfig/server/conf/error/hu/400.html @@ -0,0 +1,61 @@ + + + + ERROR 400 - Bad Request! + + + + + +
    + +
    +

    The following error occurred:

    +

    You have used invalid syntax.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/hu/401.html b/interface/ispconfig/server/conf/error/hu/401.html new file mode 100644 index 0000000000000000000000000000000000000000..49c7b4780c4e8d9b17215dc15bc06b170fd8ba18 --- /dev/null +++ b/interface/ispconfig/server/conf/error/hu/401.html @@ -0,0 +1,61 @@ + + + + ERROR 401 - Unauthorized! + + + + + +
    + +
    +

    The following error occurred:

    +

    The URL requested requires authorisation.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/hu/403.html b/interface/ispconfig/server/conf/error/hu/403.html new file mode 100644 index 0000000000000000000000000000000000000000..12934ce6db39c4fc9a5e1ebe6304d27fb01d5334 --- /dev/null +++ b/interface/ispconfig/server/conf/error/hu/403.html @@ -0,0 +1,61 @@ + + + + ERROR 403 - Forbidden! + + + + + +
    + +
    +

    The following error occurred:

    +

    You are not permitted to access the requested URL.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/hu/404.html b/interface/ispconfig/server/conf/error/hu/404.html new file mode 100644 index 0000000000000000000000000000000000000000..fb17b2ac3b9cf8de96d3712c01615a7ea13195f6 --- /dev/null +++ b/interface/ispconfig/server/conf/error/hu/404.html @@ -0,0 +1,61 @@ + + + + ERROR 404 - Not Found! + + + + + +
    + +
    +

    The following error occurred:

    +

    The requested URL was not found on this server.

    +

    Please check the URL or contact the webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/hu/405.html b/interface/ispconfig/server/conf/error/hu/405.html new file mode 100644 index 0000000000000000000000000000000000000000..e5f66a8fb9c74e775558870dc14f19cac51c1035 --- /dev/null +++ b/interface/ispconfig/server/conf/error/hu/405.html @@ -0,0 +1,61 @@ + + + + ERROR 405 - Method Not Allowed! + + + + + +
    + +
    +

    The following error occurred:

    +

    The method used is not permitted.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/hu/500.html b/interface/ispconfig/server/conf/error/hu/500.html new file mode 100644 index 0000000000000000000000000000000000000000..4413bf56ad2c437ccfcf6a4bceb2216799c7463c --- /dev/null +++ b/interface/ispconfig/server/conf/error/hu/500.html @@ -0,0 +1,61 @@ + + + + ERROR 500 - Internal Server Error! + + + + + +
    + +
    +

    The following error occurred:

    +

    The requested URL caused an internal server error.

    +

    If you get this message repeatedly please contact the webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/hu/503.html b/interface/ispconfig/server/conf/error/hu/503.html new file mode 100644 index 0000000000000000000000000000000000000000..983ce2637801b7f17ac21b75324314c39ae8c239 --- /dev/null +++ b/interface/ispconfig/server/conf/error/hu/503.html @@ -0,0 +1,61 @@ + + + + ERROR 503 - Service Unavailable! + + + + + +
    + +
    +

    The following error occurred:

    +

    The Service is not available at the moment due to a temporary overloading or maintenance of the server. Please try again later.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/it/400.html b/interface/ispconfig/server/conf/error/it/400.html new file mode 100644 index 0000000000000000000000000000000000000000..be1f24625d54e06bc37dade9121791add1f0ad9f --- /dev/null +++ b/interface/ispconfig/server/conf/error/it/400.html @@ -0,0 +1,61 @@ + + + + ERROR 400 - Sintassi non corretta! + + + + + +
    + +
    +

    Si è verificato il seguente errore:

    +

    Hai usato una sintassi non corretta.

    +

    Contatta il webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/it/401.html b/interface/ispconfig/server/conf/error/it/401.html new file mode 100644 index 0000000000000000000000000000000000000000..b7e2d7ce769f7c9199f6e4ad2581df0c0401b2ff --- /dev/null +++ b/interface/ispconfig/server/conf/error/it/401.html @@ -0,0 +1,61 @@ + + + + ERROR 401 - Autorizzazione richiesta! + + + + + +
    + +
    +

    Si è verificato il seguente errore:

    +

    Autorizzazione necessaria per accedere all'indirizzo richiesto.

    +

    Contatta il webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/it/403.html b/interface/ispconfig/server/conf/error/it/403.html new file mode 100644 index 0000000000000000000000000000000000000000..662c379ac13c753b8cb38ef43047d55101bffb72 --- /dev/null +++ b/interface/ispconfig/server/conf/error/it/403.html @@ -0,0 +1,61 @@ + + + + ERROR 403 - Accesso Negato! + + + + + +
    + +
    +

    Si è verificato il seguente errore:

    +

    Non si possiedono i permessi per accedere all'indirizzo richiesto.

    +

    Contatta il webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/it/404.html b/interface/ispconfig/server/conf/error/it/404.html new file mode 100644 index 0000000000000000000000000000000000000000..a4b5634c2203adda963b182ea5ab7701a4a595e5 --- /dev/null +++ b/interface/ispconfig/server/conf/error/it/404.html @@ -0,0 +1,61 @@ + + + + ERROR 404 - Non trovato! + + + + + +
    + +
    +

    Si è verificato il seguente errore:

    +

    L'indirizzo richiesto non è stato trovato in questo server.

    +

    Contatta il webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/it/405.html b/interface/ispconfig/server/conf/error/it/405.html new file mode 100644 index 0000000000000000000000000000000000000000..40cb8e695fe4de134417b82124931a5c854edb54 --- /dev/null +++ b/interface/ispconfig/server/conf/error/it/405.html @@ -0,0 +1,61 @@ + + + + ERROR 405 - Metodo non consentito! + + + + + +
    + +
    +

    Si è verificato il seguente errore:

    +

    Il metodo usato non è consentito.

    +

    Contatta il webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/it/500.html b/interface/ispconfig/server/conf/error/it/500.html new file mode 100644 index 0000000000000000000000000000000000000000..cbb0b33a83e148fbab6589da0007a4daa3521160 --- /dev/null +++ b/interface/ispconfig/server/conf/error/it/500.html @@ -0,0 +1,61 @@ + + + + ERROR 500 - Errore Interno del Server! + + + + + +
    + +
    +

    Si è verificato il seguente errore:

    +

    L'indirizzo richiesto ha causato un errore interno del server.

    +

    Se questo messaggio si ripete, contattare il webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/it/503.html b/interface/ispconfig/server/conf/error/it/503.html new file mode 100644 index 0000000000000000000000000000000000000000..7268ab5025136b41b7423705e735cb4f445bbfb2 --- /dev/null +++ b/interface/ispconfig/server/conf/error/it/503.html @@ -0,0 +1,61 @@ + + + + ERROR 503 - Servizio non disponibile! + + + + + +
    + +
    +

    Si è verificato il seguente errore:

    +

    Il sistema è momentaneamente non disponibile per sovraccaricato o manutenzione. Riprova più tardi.

    +

    Contatta il webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/nl/400.html b/interface/ispconfig/server/conf/error/nl/400.html new file mode 100644 index 0000000000000000000000000000000000000000..f83ae5892616e361a6339b828b0ec7cfe0c194d2 --- /dev/null +++ b/interface/ispconfig/server/conf/error/nl/400.html @@ -0,0 +1,61 @@ + + + + ERROR 400 - Bad Request! + + + + + +
    + +
    +

    The following error occurred:

    +

    You have used invalid syntax.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/nl/401.html b/interface/ispconfig/server/conf/error/nl/401.html new file mode 100644 index 0000000000000000000000000000000000000000..49c7b4780c4e8d9b17215dc15bc06b170fd8ba18 --- /dev/null +++ b/interface/ispconfig/server/conf/error/nl/401.html @@ -0,0 +1,61 @@ + + + + ERROR 401 - Unauthorized! + + + + + +
    + +
    +

    The following error occurred:

    +

    The URL requested requires authorisation.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/nl/403.html b/interface/ispconfig/server/conf/error/nl/403.html new file mode 100644 index 0000000000000000000000000000000000000000..12934ce6db39c4fc9a5e1ebe6304d27fb01d5334 --- /dev/null +++ b/interface/ispconfig/server/conf/error/nl/403.html @@ -0,0 +1,61 @@ + + + + ERROR 403 - Forbidden! + + + + + +
    + +
    +

    The following error occurred:

    +

    You are not permitted to access the requested URL.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/nl/404.html b/interface/ispconfig/server/conf/error/nl/404.html new file mode 100644 index 0000000000000000000000000000000000000000..fb17b2ac3b9cf8de96d3712c01615a7ea13195f6 --- /dev/null +++ b/interface/ispconfig/server/conf/error/nl/404.html @@ -0,0 +1,61 @@ + + + + ERROR 404 - Not Found! + + + + + +
    + +
    +

    The following error occurred:

    +

    The requested URL was not found on this server.

    +

    Please check the URL or contact the webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/nl/405.html b/interface/ispconfig/server/conf/error/nl/405.html new file mode 100644 index 0000000000000000000000000000000000000000..e5f66a8fb9c74e775558870dc14f19cac51c1035 --- /dev/null +++ b/interface/ispconfig/server/conf/error/nl/405.html @@ -0,0 +1,61 @@ + + + + ERROR 405 - Method Not Allowed! + + + + + +
    + +
    +

    The following error occurred:

    +

    The method used is not permitted.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/nl/500.html b/interface/ispconfig/server/conf/error/nl/500.html new file mode 100644 index 0000000000000000000000000000000000000000..4413bf56ad2c437ccfcf6a4bceb2216799c7463c --- /dev/null +++ b/interface/ispconfig/server/conf/error/nl/500.html @@ -0,0 +1,61 @@ + + + + ERROR 500 - Internal Server Error! + + + + + +
    + +
    +

    The following error occurred:

    +

    The requested URL caused an internal server error.

    +

    If you get this message repeatedly please contact the webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/nl/503.html b/interface/ispconfig/server/conf/error/nl/503.html new file mode 100644 index 0000000000000000000000000000000000000000..983ce2637801b7f17ac21b75324314c39ae8c239 --- /dev/null +++ b/interface/ispconfig/server/conf/error/nl/503.html @@ -0,0 +1,61 @@ + + + + ERROR 503 - Service Unavailable! + + + + + +
    + +
    +

    The following error occurred:

    +

    The Service is not available at the moment due to a temporary overloading or maintenance of the server. Please try again later.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/pl/400.html b/interface/ispconfig/server/conf/error/pl/400.html new file mode 100644 index 0000000000000000000000000000000000000000..f83ae5892616e361a6339b828b0ec7cfe0c194d2 --- /dev/null +++ b/interface/ispconfig/server/conf/error/pl/400.html @@ -0,0 +1,61 @@ + + + + ERROR 400 - Bad Request! + + + + + +
    + +
    +

    The following error occurred:

    +

    You have used invalid syntax.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/pl/401.html b/interface/ispconfig/server/conf/error/pl/401.html new file mode 100644 index 0000000000000000000000000000000000000000..49c7b4780c4e8d9b17215dc15bc06b170fd8ba18 --- /dev/null +++ b/interface/ispconfig/server/conf/error/pl/401.html @@ -0,0 +1,61 @@ + + + + ERROR 401 - Unauthorized! + + + + + +
    + +
    +

    The following error occurred:

    +

    The URL requested requires authorisation.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/pl/403.html b/interface/ispconfig/server/conf/error/pl/403.html new file mode 100644 index 0000000000000000000000000000000000000000..12934ce6db39c4fc9a5e1ebe6304d27fb01d5334 --- /dev/null +++ b/interface/ispconfig/server/conf/error/pl/403.html @@ -0,0 +1,61 @@ + + + + ERROR 403 - Forbidden! + + + + + +
    + +
    +

    The following error occurred:

    +

    You are not permitted to access the requested URL.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/pl/404.html b/interface/ispconfig/server/conf/error/pl/404.html new file mode 100644 index 0000000000000000000000000000000000000000..fb17b2ac3b9cf8de96d3712c01615a7ea13195f6 --- /dev/null +++ b/interface/ispconfig/server/conf/error/pl/404.html @@ -0,0 +1,61 @@ + + + + ERROR 404 - Not Found! + + + + + +
    + +
    +

    The following error occurred:

    +

    The requested URL was not found on this server.

    +

    Please check the URL or contact the webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/pl/405.html b/interface/ispconfig/server/conf/error/pl/405.html new file mode 100644 index 0000000000000000000000000000000000000000..e5f66a8fb9c74e775558870dc14f19cac51c1035 --- /dev/null +++ b/interface/ispconfig/server/conf/error/pl/405.html @@ -0,0 +1,61 @@ + + + + ERROR 405 - Method Not Allowed! + + + + + +
    + +
    +

    The following error occurred:

    +

    The method used is not permitted.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/pl/500.html b/interface/ispconfig/server/conf/error/pl/500.html new file mode 100644 index 0000000000000000000000000000000000000000..4413bf56ad2c437ccfcf6a4bceb2216799c7463c --- /dev/null +++ b/interface/ispconfig/server/conf/error/pl/500.html @@ -0,0 +1,61 @@ + + + + ERROR 500 - Internal Server Error! + + + + + +
    + +
    +

    The following error occurred:

    +

    The requested URL caused an internal server error.

    +

    If you get this message repeatedly please contact the webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/pl/503.html b/interface/ispconfig/server/conf/error/pl/503.html new file mode 100644 index 0000000000000000000000000000000000000000..983ce2637801b7f17ac21b75324314c39ae8c239 --- /dev/null +++ b/interface/ispconfig/server/conf/error/pl/503.html @@ -0,0 +1,61 @@ + + + + ERROR 503 - Service Unavailable! + + + + + +
    + +
    +

    The following error occurred:

    +

    The Service is not available at the moment due to a temporary overloading or maintenance of the server. Please try again later.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/se/400.html b/interface/ispconfig/server/conf/error/se/400.html new file mode 100644 index 0000000000000000000000000000000000000000..f83ae5892616e361a6339b828b0ec7cfe0c194d2 --- /dev/null +++ b/interface/ispconfig/server/conf/error/se/400.html @@ -0,0 +1,61 @@ + + + + ERROR 400 - Bad Request! + + + + + +
    + +
    +

    The following error occurred:

    +

    You have used invalid syntax.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/se/401.html b/interface/ispconfig/server/conf/error/se/401.html new file mode 100644 index 0000000000000000000000000000000000000000..49c7b4780c4e8d9b17215dc15bc06b170fd8ba18 --- /dev/null +++ b/interface/ispconfig/server/conf/error/se/401.html @@ -0,0 +1,61 @@ + + + + ERROR 401 - Unauthorized! + + + + + +
    + +
    +

    The following error occurred:

    +

    The URL requested requires authorisation.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/se/403.html b/interface/ispconfig/server/conf/error/se/403.html new file mode 100644 index 0000000000000000000000000000000000000000..12934ce6db39c4fc9a5e1ebe6304d27fb01d5334 --- /dev/null +++ b/interface/ispconfig/server/conf/error/se/403.html @@ -0,0 +1,61 @@ + + + + ERROR 403 - Forbidden! + + + + + +
    + +
    +

    The following error occurred:

    +

    You are not permitted to access the requested URL.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/se/404.html b/interface/ispconfig/server/conf/error/se/404.html new file mode 100644 index 0000000000000000000000000000000000000000..fb17b2ac3b9cf8de96d3712c01615a7ea13195f6 --- /dev/null +++ b/interface/ispconfig/server/conf/error/se/404.html @@ -0,0 +1,61 @@ + + + + ERROR 404 - Not Found! + + + + + +
    + +
    +

    The following error occurred:

    +

    The requested URL was not found on this server.

    +

    Please check the URL or contact the webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/se/405.html b/interface/ispconfig/server/conf/error/se/405.html new file mode 100644 index 0000000000000000000000000000000000000000..e5f66a8fb9c74e775558870dc14f19cac51c1035 --- /dev/null +++ b/interface/ispconfig/server/conf/error/se/405.html @@ -0,0 +1,61 @@ + + + + ERROR 405 - Method Not Allowed! + + + + + +
    + +
    +

    The following error occurred:

    +

    The method used is not permitted.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/se/500.html b/interface/ispconfig/server/conf/error/se/500.html new file mode 100644 index 0000000000000000000000000000000000000000..4413bf56ad2c437ccfcf6a4bceb2216799c7463c --- /dev/null +++ b/interface/ispconfig/server/conf/error/se/500.html @@ -0,0 +1,61 @@ + + + + ERROR 500 - Internal Server Error! + + + + + +
    + +
    +

    The following error occurred:

    +

    The requested URL caused an internal server error.

    +

    If you get this message repeatedly please contact the webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/se/503.html b/interface/ispconfig/server/conf/error/se/503.html new file mode 100644 index 0000000000000000000000000000000000000000..983ce2637801b7f17ac21b75324314c39ae8c239 --- /dev/null +++ b/interface/ispconfig/server/conf/error/se/503.html @@ -0,0 +1,61 @@ + + + + ERROR 503 - Service Unavailable! + + + + + +
    + +
    +

    The following error occurred:

    +

    The Service is not available at the moment due to a temporary overloading or maintenance of the server. Please try again later.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/si/400.html b/interface/ispconfig/server/conf/error/si/400.html new file mode 100644 index 0000000000000000000000000000000000000000..f83ae5892616e361a6339b828b0ec7cfe0c194d2 --- /dev/null +++ b/interface/ispconfig/server/conf/error/si/400.html @@ -0,0 +1,61 @@ + + + + ERROR 400 - Bad Request! + + + + + +
    + +
    +

    The following error occurred:

    +

    You have used invalid syntax.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/si/401.html b/interface/ispconfig/server/conf/error/si/401.html new file mode 100644 index 0000000000000000000000000000000000000000..49c7b4780c4e8d9b17215dc15bc06b170fd8ba18 --- /dev/null +++ b/interface/ispconfig/server/conf/error/si/401.html @@ -0,0 +1,61 @@ + + + + ERROR 401 - Unauthorized! + + + + + +
    + +
    +

    The following error occurred:

    +

    The URL requested requires authorisation.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/si/403.html b/interface/ispconfig/server/conf/error/si/403.html new file mode 100644 index 0000000000000000000000000000000000000000..12934ce6db39c4fc9a5e1ebe6304d27fb01d5334 --- /dev/null +++ b/interface/ispconfig/server/conf/error/si/403.html @@ -0,0 +1,61 @@ + + + + ERROR 403 - Forbidden! + + + + + +
    + +
    +

    The following error occurred:

    +

    You are not permitted to access the requested URL.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/si/404.html b/interface/ispconfig/server/conf/error/si/404.html new file mode 100644 index 0000000000000000000000000000000000000000..fb17b2ac3b9cf8de96d3712c01615a7ea13195f6 --- /dev/null +++ b/interface/ispconfig/server/conf/error/si/404.html @@ -0,0 +1,61 @@ + + + + ERROR 404 - Not Found! + + + + + +
    + +
    +

    The following error occurred:

    +

    The requested URL was not found on this server.

    +

    Please check the URL or contact the webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/si/405.html b/interface/ispconfig/server/conf/error/si/405.html new file mode 100644 index 0000000000000000000000000000000000000000..e5f66a8fb9c74e775558870dc14f19cac51c1035 --- /dev/null +++ b/interface/ispconfig/server/conf/error/si/405.html @@ -0,0 +1,61 @@ + + + + ERROR 405 - Method Not Allowed! + + + + + +
    + +
    +

    The following error occurred:

    +

    The method used is not permitted.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/si/500.html b/interface/ispconfig/server/conf/error/si/500.html new file mode 100644 index 0000000000000000000000000000000000000000..4413bf56ad2c437ccfcf6a4bceb2216799c7463c --- /dev/null +++ b/interface/ispconfig/server/conf/error/si/500.html @@ -0,0 +1,61 @@ + + + + ERROR 500 - Internal Server Error! + + + + + +
    + +
    +

    The following error occurred:

    +

    The requested URL caused an internal server error.

    +

    If you get this message repeatedly please contact the webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/si/503.html b/interface/ispconfig/server/conf/error/si/503.html new file mode 100644 index 0000000000000000000000000000000000000000..983ce2637801b7f17ac21b75324314c39ae8c239 --- /dev/null +++ b/interface/ispconfig/server/conf/error/si/503.html @@ -0,0 +1,61 @@ + + + + ERROR 503 - Service Unavailable! + + + + + +
    + +
    +

    The following error occurred:

    +

    The Service is not available at the moment due to a temporary overloading or maintenance of the server. Please try again later.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/sr/400.html b/interface/ispconfig/server/conf/error/sr/400.html new file mode 100644 index 0000000000000000000000000000000000000000..f83ae5892616e361a6339b828b0ec7cfe0c194d2 --- /dev/null +++ b/interface/ispconfig/server/conf/error/sr/400.html @@ -0,0 +1,61 @@ + + + + ERROR 400 - Bad Request! + + + + + +
    + +
    +

    The following error occurred:

    +

    You have used invalid syntax.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/sr/401.html b/interface/ispconfig/server/conf/error/sr/401.html new file mode 100644 index 0000000000000000000000000000000000000000..49c7b4780c4e8d9b17215dc15bc06b170fd8ba18 --- /dev/null +++ b/interface/ispconfig/server/conf/error/sr/401.html @@ -0,0 +1,61 @@ + + + + ERROR 401 - Unauthorized! + + + + + +
    + +
    +

    The following error occurred:

    +

    The URL requested requires authorisation.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/sr/403.html b/interface/ispconfig/server/conf/error/sr/403.html new file mode 100644 index 0000000000000000000000000000000000000000..12934ce6db39c4fc9a5e1ebe6304d27fb01d5334 --- /dev/null +++ b/interface/ispconfig/server/conf/error/sr/403.html @@ -0,0 +1,61 @@ + + + + ERROR 403 - Forbidden! + + + + + +
    + +
    +

    The following error occurred:

    +

    You are not permitted to access the requested URL.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/sr/404.html b/interface/ispconfig/server/conf/error/sr/404.html new file mode 100644 index 0000000000000000000000000000000000000000..fb17b2ac3b9cf8de96d3712c01615a7ea13195f6 --- /dev/null +++ b/interface/ispconfig/server/conf/error/sr/404.html @@ -0,0 +1,61 @@ + + + + ERROR 404 - Not Found! + + + + + +
    + +
    +

    The following error occurred:

    +

    The requested URL was not found on this server.

    +

    Please check the URL or contact the webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/sr/405.html b/interface/ispconfig/server/conf/error/sr/405.html new file mode 100644 index 0000000000000000000000000000000000000000..e5f66a8fb9c74e775558870dc14f19cac51c1035 --- /dev/null +++ b/interface/ispconfig/server/conf/error/sr/405.html @@ -0,0 +1,61 @@ + + + + ERROR 405 - Method Not Allowed! + + + + + +
    + +
    +

    The following error occurred:

    +

    The method used is not permitted.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/sr/500.html b/interface/ispconfig/server/conf/error/sr/500.html new file mode 100644 index 0000000000000000000000000000000000000000..4413bf56ad2c437ccfcf6a4bceb2216799c7463c --- /dev/null +++ b/interface/ispconfig/server/conf/error/sr/500.html @@ -0,0 +1,61 @@ + + + + ERROR 500 - Internal Server Error! + + + + + +
    + +
    +

    The following error occurred:

    +

    The requested URL caused an internal server error.

    +

    If you get this message repeatedly please contact the webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/sr/503.html b/interface/ispconfig/server/conf/error/sr/503.html new file mode 100644 index 0000000000000000000000000000000000000000..983ce2637801b7f17ac21b75324314c39ae8c239 --- /dev/null +++ b/interface/ispconfig/server/conf/error/sr/503.html @@ -0,0 +1,61 @@ + + + + ERROR 503 - Service Unavailable! + + + + + +
    + +
    +

    The following error occurred:

    +

    The Service is not available at the moment due to a temporary overloading or maintenance of the server. Please try again later.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/gentoo_network_interfaces.master b/interface/ispconfig/server/conf/gentoo_network_interfaces.master new file mode 100644 index 0000000000000000000000000000000000000000..cca4f08a8a3f00e1a97660a33388a3f0fde31479 --- /dev/null +++ b/interface/ispconfig/server/conf/gentoo_network_interfaces.master @@ -0,0 +1,13 @@ +# This file describes the network interfaces available on your system +# and how to activate them. For more information, see interfaces(5). + +config_eth0=( + " netmask broadcast " + + + " netmask broadcast " + + +); + +routes_eth0=( "default via " ) diff --git a/interface/ispconfig/server/conf/getmail.conf.master b/interface/ispconfig/server/conf/getmail.conf.master new file mode 100644 index 0000000000000000000000000000000000000000..2f48d76b308d764f51f3c777a23a1f14a22efb04 --- /dev/null +++ b/interface/ispconfig/server/conf/getmail.conf.master @@ -0,0 +1,16 @@ +[options] +# message_log = /var/log/getmail.log +message_log_syslog = 1 +delete = {DELETE} + +[retriever] +type = {TYPE} +server = {SERVER} +username = {USERNAME} +password = {PASSWORD} + +[destination] +type = MDA_external +path = /usr/sbin/sendmail +arguments = ("-i", "-bm", "{DESTINATION}") +unixfrom = true \ No newline at end of file diff --git a/interface/ispconfig/server/conf/index/.htaccess b/interface/ispconfig/server/conf/index/.htaccess new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/interface/ispconfig/server/conf/index/favicon.ico b/interface/ispconfig/server/conf/index/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..da6257c84cce5c550eb7118581ed2a22f15af248 Binary files /dev/null and b/interface/ispconfig/server/conf/index/favicon.ico differ diff --git a/interface/ispconfig/server/conf/index/robots.txt b/interface/ispconfig/server/conf/index/robots.txt new file mode 100644 index 0000000000000000000000000000000000000000..4354fd969db22e99f4e9f662d943bf5a5a7c1155 --- /dev/null +++ b/interface/ispconfig/server/conf/index/robots.txt @@ -0,0 +1,2 @@ +User-agent: * +Disallow: /stats/ diff --git a/interface/ispconfig/server/conf/index/standard_index.html_br b/interface/ispconfig/server/conf/index/standard_index.html_br new file mode 100644 index 0000000000000000000000000000000000000000..abce2afd36f56b48d8a32cf671c7f1c70008ef47 --- /dev/null +++ b/interface/ispconfig/server/conf/index/standard_index.html_br @@ -0,0 +1,60 @@ + + + + Bem-Vindo! + + + + + + +
    + +
    +

    Esta é a página index padrão de seu site.

    +

    Este arquivo pode ser reescrito ou subistituído sem quaisquer dificuldades. Esta página é produzida pelo arquivo index.html contido no diretório web.

    +

    Tendo quaisquer dúvidas ou problemas contate o suporte.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/index/standard_index.html_cz b/interface/ispconfig/server/conf/index/standard_index.html_cz new file mode 100644 index 0000000000000000000000000000000000000000..f9077b41ce5db2e4ea1d93601dc4f941cf4ae06a --- /dev/null +++ b/interface/ispconfig/server/conf/index/standard_index.html_cz @@ -0,0 +1,60 @@ + + + + Vitejte! + + + + + + +
    + +
    +

    Toto je standardni stranka Vaseho webu.

    +

    Muzete ji bez obav vymazat nebo nahradit jinym souborem. Toto je soubor index.html v adresari web.

    +

    Pokud mate jakekoliv dotazy prosim kontaktuje Support.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/index/standard_index.html_de b/interface/ispconfig/server/conf/index/standard_index.html_de new file mode 100644 index 0000000000000000000000000000000000000000..ad56618315773979069531dfd124cdfbc18f41c0 --- /dev/null +++ b/interface/ispconfig/server/conf/index/standard_index.html_de @@ -0,0 +1,60 @@ + + + + Herzlich Willkommen! + + + + + + +
    + +
    +

    Dies ist die Standard-Index-Seite Ihres Webs.

    +

    Sie können sie problemlos löschen oder durch eine andere Seite ersetzen. Es handelt sich hierbei um die Datei index.html im Verzeichnis web.

    +

    Bei Fragen oder Problemen wenden Sie sich bitte an den Support.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/index/standard_index.html_en b/interface/ispconfig/server/conf/index/standard_index.html_en new file mode 100644 index 0000000000000000000000000000000000000000..186ea25bd73e4818de23fcc94f2cd4360d064615 --- /dev/null +++ b/interface/ispconfig/server/conf/index/standard_index.html_en @@ -0,0 +1,60 @@ + + + + Welcome! + + + + + + +
    + +
    +

    This is the default index page of your website.

    +

    This file may be deleted or overwritten without any difficulty. This is produced by the file index.html in the web directory.

    +

    For questions or problems please contact support.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/index/standard_index.html_es b/interface/ispconfig/server/conf/index/standard_index.html_es new file mode 100644 index 0000000000000000000000000000000000000000..0071036ed11d2c6afb9e4f4663090c0287179821 --- /dev/null +++ b/interface/ispconfig/server/conf/index/standard_index.html_es @@ -0,0 +1,60 @@ + + + + Bienvenido! + + + + + + +
    + +
    +

    Esta es la página principal del sitio.

    +

    Puede cambiarla por otra simplemente reemplazando este archivo. This is produced by the file index.html in the web directory.

    +

    Si tiene dudas o problemas, porfavor contacte al support.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/index/standard_index.html_fi b/interface/ispconfig/server/conf/index/standard_index.html_fi new file mode 100644 index 0000000000000000000000000000000000000000..e34f57a276f5aaf41fb141fa38f40e5a8ba1e23f --- /dev/null +++ b/interface/ispconfig/server/conf/index/standard_index.html_fi @@ -0,0 +1,60 @@ + + + + Tervetuloa! + + + + + + +
    + +
    +

    Tämä on sivustosi oletusaloitussivu.

    +

    Tämä sivu voidaan poistaa tai vaihtaa ilman mitään vaikeuksia. Tämä sivu on index.html-tiedosto kotihakemistosi web-kansiossa.

    +

    Jos sinulla on ongelmia tai kysyttävää, ota yhteyttä asiakastukeen.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/index/standard_index.html_fr b/interface/ispconfig/server/conf/index/standard_index.html_fr new file mode 100644 index 0000000000000000000000000000000000000000..8615dba11c0ab266ca043b5730d66cd9491cb829 --- /dev/null +++ b/interface/ispconfig/server/conf/index/standard_index.html_fr @@ -0,0 +1,60 @@ + + + + Bienvenue! + + + + + + +
    + +
    +

    Ceci est la page d'index standard de votre site.

    +

    Vous pouvez facilement effacer ou remplacer ce fichier. C'est le fichier index.html dans le dossier web.

    +

    Pour tous problèmes ou questions, merci de contacter le support.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/index/standard_index.html_gr b/interface/ispconfig/server/conf/index/standard_index.html_gr new file mode 100644 index 0000000000000000000000000000000000000000..41751e1696bc7a33287955345ca281ccb18bf97a --- /dev/null +++ b/interface/ispconfig/server/conf/index/standard_index.html_gr @@ -0,0 +1,60 @@ + + + + Êáëþò Þñèáôå! + + + + + + +
    + +
    +

    ÁõôÞ åßíáé ç ðñïåðéëåãìÝíç áñ÷éêÞ óåëßäá ôïõ äéêôõáêïý óáò ôüðïõ.

    +

    Ìðïñåßôå åýêïëá íá ôç äéáãñÜøåôå Þ áíôéêáôáóôÞóåôå ìå Üëëï áñ÷åßï. Áõôü åßíáé ôï index.html áñ÷åßï óôï web öÜêåëï.

    +

    Ãéá áðïñßåò Þ ðñïâëÞìáôá ðáñáêáëþ åðéêïéíùíÞóôå ìå ôï äéá÷åéñéóôÞ.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/index/standard_index.html_hu b/interface/ispconfig/server/conf/index/standard_index.html_hu new file mode 100644 index 0000000000000000000000000000000000000000..33444ec7b7ee03dd1aaf7de098be3228ff1a12fa --- /dev/null +++ b/interface/ispconfig/server/conf/index/standard_index.html_hu @@ -0,0 +1,60 @@ + + + + Üdvözöljük! + + + + + + +
    + +
    +

    Ez az oldal az Ön weboldalának eredeti kezdõoldala.

    +

    Ezt az oldalt Ön igényei szerint módosíthatja, akár le is törölheti. Megtalálja ezt az állományt a web könyvtárban index.html néven.

    +

    Kérdéseivel, kérjük, forduljon a support.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/index/standard_index.html_it b/interface/ispconfig/server/conf/index/standard_index.html_it new file mode 100644 index 0000000000000000000000000000000000000000..141bbb9e25d0f7806fc306ed4ab9052e0981fb99 --- /dev/null +++ b/interface/ispconfig/server/conf/index/standard_index.html_it @@ -0,0 +1,60 @@ + + + + Benvenuti! + + + + + + +
    + +
    +

    Questa è la pagina predefinita.

    +

    Questo file può essere cancellato o sovrascritto senza nessun problema. Questo è prodotto dal file index.html nella cartella web.

    +

    Per domande o problemi contattate il supporto.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/index/standard_index.html_nl b/interface/ispconfig/server/conf/index/standard_index.html_nl new file mode 100644 index 0000000000000000000000000000000000000000..9a0d660dbf49ac2afe52fead7ec4f6c8ed05b8ae --- /dev/null +++ b/interface/ispconfig/server/conf/index/standard_index.html_nl @@ -0,0 +1,60 @@ + + + + Welkom! + + + + + + +
    + +
    +

    Dit is de standaard indexpagina van uw website.

    +

    U kunt deze op eenvoudige wijze verwijderen en vervangen door een ander bestand. Dit is het index.html bestand in de web directorie.

    +

    Voor vragen of problemen kunt u contact opnemen met de support.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/index/standard_index.html_pl b/interface/ispconfig/server/conf/index/standard_index.html_pl new file mode 100644 index 0000000000000000000000000000000000000000..e657b3842654e56c318613217f5bccbddd79992e --- /dev/null +++ b/interface/ispconfig/server/conf/index/standard_index.html_pl @@ -0,0 +1,60 @@ + + + + Welcome! + + + + + + +
    + +
    +

    This is the default index page of your website.

    +

    This file may be deleted or overwritten without any difficulty. This is produced by the file index.html in the web directory.

    +

    For questions or problems please contact the support.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/index/standard_index.html_se b/interface/ispconfig/server/conf/index/standard_index.html_se new file mode 100644 index 0000000000000000000000000000000000000000..6a217475a59525969b99004900ca81debe5cddd5 --- /dev/null +++ b/interface/ispconfig/server/conf/index/standard_index.html_se @@ -0,0 +1,60 @@ + + + + Välkommen! + + + + + + +
    + +
    +

    Detta är en standard index sida på din webbplats.

    +

    Du kan antingen ta bort den eller ersätta den med en annan fil. Detta är en index.html fil i web mappen.

    +

    För frågor eller problem runt detta kontakta support.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/index/standard_index.html_sr b/interface/ispconfig/server/conf/index/standard_index.html_sr new file mode 100644 index 0000000000000000000000000000000000000000..07a88b85b54c5b9b05fda1d5c81374783ecddb1a --- /dev/null +++ b/interface/ispconfig/server/conf/index/standard_index.html_sr @@ -0,0 +1,60 @@ + + + + Dobrodošli! + + + + + + +
    + +
    +

    Ovo je standardna indeksna strana vaše internet prezentacije.

    +

    Možete je lako obrisati ili zameniti sa nekom drugom datotekom. Ovo je index.html datoteka u web directory.

    +

    Kontaktirajte support u vezi pitanja i problema.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/index/user_standard_index.html_br b/interface/ispconfig/server/conf/index/user_standard_index.html_br new file mode 100644 index 0000000000000000000000000000000000000000..88cc913e97d4ecea71d4769553275bc93e4265c3 --- /dev/null +++ b/interface/ispconfig/server/conf/index/user_standard_index.html_br @@ -0,0 +1,60 @@ + + + + Bem-Vindo! + + + + + + +
    + +
    +

    Esta é a página index padrão para o usuário {USER_USERNAME}.

    +

    Este arquivo pode ser reescrito ou subistituído sem quaisquer dificuldades. Esta página é produzida pelo arquivo index.html no diretório user/{USER_USERNAME}/web.

    +

    Tendo quaisquer dúvidas ou problemas contate o suporte.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/index/user_standard_index.html_cz b/interface/ispconfig/server/conf/index/user_standard_index.html_cz new file mode 100644 index 0000000000000000000000000000000000000000..0be2ca0ad8a2bf10af2950d60a052763dcf2a775 --- /dev/null +++ b/interface/ispconfig/server/conf/index/user_standard_index.html_cz @@ -0,0 +1,60 @@ + + + + Vitejte! + + + + + + +
    + +
    +

    Toto je standardni stranka Vaseho webu {USER_USERNAME}

    +

    Muzete ji bez obav vymazat nebo nahradit jinym souborem. Toto je soubor index.html v adresari user/{USER_USERNAME}/web.

    +

    Pokud mate jakekoliv dotazy prosim kontaktuje Support.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/index/user_standard_index.html_de b/interface/ispconfig/server/conf/index/user_standard_index.html_de new file mode 100644 index 0000000000000000000000000000000000000000..6264631b4edb01ca204b8411ddc2347bee6cdad5 --- /dev/null +++ b/interface/ispconfig/server/conf/index/user_standard_index.html_de @@ -0,0 +1,60 @@ + + + + Herzlich Willkommen! + + + + + + +
    + +
    +

    Dies ist die Standard-Index-Seite von Benutzer {USER_USERNAME}.

    +

    Sie können sie problemlos löschen oder durch eine andere Seite ersetzen. Es handelt sich hierbei um die Datei index.html im Verzeichnis user/{USER_USERNAME}/web.

    +

    Bei Fragen oder Problemen wenden Sie sich bitte an den Support.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/index/user_standard_index.html_en b/interface/ispconfig/server/conf/index/user_standard_index.html_en new file mode 100644 index 0000000000000000000000000000000000000000..bb3a7aa5a34589d16655fd304d8f80f240aa9995 --- /dev/null +++ b/interface/ispconfig/server/conf/index/user_standard_index.html_en @@ -0,0 +1,60 @@ + + + + Welcome! + + + + + + +
    + +
    +

    This is the default index page for user {USER_USERNAME}.

    +

    This file may be deleted or overwritten without any difficulty. This is produced by the file index.html in the user/{USER_USERNAME}/web directory.

    +

    For questions or problems please contact the support.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/index/user_standard_index.html_es b/interface/ispconfig/server/conf/index/user_standard_index.html_es new file mode 100644 index 0000000000000000000000000000000000000000..ccd4f37ebab2222c609330362eb684296a003d03 --- /dev/null +++ b/interface/ispconfig/server/conf/index/user_standard_index.html_es @@ -0,0 +1,60 @@ + + + + Bienvenido! + + + + + + +
    + +
    +

    Esta es la página indice de la cuenta {USER_USERNAME}.

    +

    Puede cambiarla por otra simplemente reemplazando este archivo. This is produced by the file index.html in the user/{USER_USERNAME}/web directory.

    +

    Si tiene dudas o problemas, porfavor contacte al support.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/index/user_standard_index.html_fi b/interface/ispconfig/server/conf/index/user_standard_index.html_fi new file mode 100644 index 0000000000000000000000000000000000000000..14cd51576e44bf2835291759d95236e24252a826 --- /dev/null +++ b/interface/ispconfig/server/conf/index/user_standard_index.html_fi @@ -0,0 +1,60 @@ + + + + Tervetuloa! + + + + + + +
    + +
    +

    Tämä on käyttäjän {USER_USERNAME}oletusaloitussivu.

    +

    Tämä sivu voidaan poistaa tai vaihtaa ilman mitään vaikeuksia. Tämä sivu on index.html-tiedosto sivuston user/{USER_USERNAME}/web-kansiossa.

    +

    Jos sinulla on ongelmia tai kysyttävää, ota yhteyttä asiakastukeen.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/index/user_standard_index.html_fr b/interface/ispconfig/server/conf/index/user_standard_index.html_fr new file mode 100644 index 0000000000000000000000000000000000000000..8c074c099e081b3685e5684a5acfaee2e4a8f991 --- /dev/null +++ b/interface/ispconfig/server/conf/index/user_standard_index.html_fr @@ -0,0 +1,60 @@ + + + + Bienvenue! + + + + + + +
    + +
    +

    Ceci est la page d'index standard de l'utilisateur {USER_USERNAME}.

    +

    Vous pouvez facilement effacer ou remplacer ce fichier. C'est le fichier index.html dans le dossier user/{USER_USERNAME}/web.

    +

    Pour tous problèmes ou questions, merci de contacter le support.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/index/user_standard_index.html_gr b/interface/ispconfig/server/conf/index/user_standard_index.html_gr new file mode 100644 index 0000000000000000000000000000000000000000..63f16a46f5888d6faed28c4fca719c148b5a766e --- /dev/null +++ b/interface/ispconfig/server/conf/index/user_standard_index.html_gr @@ -0,0 +1,60 @@ + + + + Êáëþò Þñèáôå! + + + + + + +
    + +
    +

    ÁõôÞ åßíáé ç ðñïåðéëåãìÝíç áñ÷éêÞ óåëßäá ãéá ôï ÷ñÞóôç {USER_USERNAME}.

    +

    Ìðïñåßôå åýêïëá íá ôç äéáãñÜøåôå Þ áíôéêáôáóôÞóåôå ìå Üëëï áñ÷åßï. Áõôü åßíáé ôï index.html áñ÷åßï óôï user/{USER_USERNAME}/web öÜêåëï.

    +

    Ãéá áðïñßåò Þ ðñïâëÞìáôá ðáñáêáëþ åðéêïéíùíÞóôå ìå ôï äéá÷åéñéóôÞ.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/index/user_standard_index.html_hu b/interface/ispconfig/server/conf/index/user_standard_index.html_hu new file mode 100644 index 0000000000000000000000000000000000000000..2ca87323e801f9e1b5c7762ed001d67bc352dce8 --- /dev/null +++ b/interface/ispconfig/server/conf/index/user_standard_index.html_hu @@ -0,0 +1,60 @@ + + + + Üdvözöljük! + + + + + + +
    + +
    +

    Ez az oldal a {USER_USERNAME} felhasználó eredeti kezdõoldala.

    +

    Ezt az oldalt Ön igényei szerint módosíthatja, akár le is törölheti. Megtalálja ezt az állományt a web könyvtárban user/{USER_USERNAME}/index.html néven.

    +

    Kérdéseivel, kérjük, forduljon a support.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/index/user_standard_index.html_it b/interface/ispconfig/server/conf/index/user_standard_index.html_it new file mode 100644 index 0000000000000000000000000000000000000000..6f253f04fbec0f204e0bc19f9f16e183c0ac5c8b --- /dev/null +++ b/interface/ispconfig/server/conf/index/user_standard_index.html_it @@ -0,0 +1,60 @@ + + + + Benvenuti! + + + + + + +
    + +
    +

    Questa è la pagina di default per l'utente {USER_USERNAME}.

    +

    Questo file può essere cancellato o sovrascritto senza nessun problema. Questo è prodotto dal file index.html nella cartella user/{USER_USERNAME}/web.

    +

    Per domande o problemi contattate il supporto.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/index/user_standard_index.html_nl b/interface/ispconfig/server/conf/index/user_standard_index.html_nl new file mode 100644 index 0000000000000000000000000000000000000000..0c7e13c1df4e2f62d867b7d726a66a2405044849 --- /dev/null +++ b/interface/ispconfig/server/conf/index/user_standard_index.html_nl @@ -0,0 +1,60 @@ + + + + Welkom! + + + + + + +
    + +
    +

    Dit is de standaard indexpagina voor gebruiker {USER_USERNAME}.

    +

    U kunt deze op eenvoudige wijze verwijderen en vervangen door een ander bestand. Dit is het index.html bestand in de user/{USER_USERNAME}/web directorie.

    +

    Voor vragen of problemen kunt u contact opnemen met de support.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/index/user_standard_index.html_pl b/interface/ispconfig/server/conf/index/user_standard_index.html_pl new file mode 100644 index 0000000000000000000000000000000000000000..bb3a7aa5a34589d16655fd304d8f80f240aa9995 --- /dev/null +++ b/interface/ispconfig/server/conf/index/user_standard_index.html_pl @@ -0,0 +1,60 @@ + + + + Welcome! + + + + + + +
    + +
    +

    This is the default index page for user {USER_USERNAME}.

    +

    This file may be deleted or overwritten without any difficulty. This is produced by the file index.html in the user/{USER_USERNAME}/web directory.

    +

    For questions or problems please contact the support.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/index/user_standard_index.html_se b/interface/ispconfig/server/conf/index/user_standard_index.html_se new file mode 100644 index 0000000000000000000000000000000000000000..ed9c9ae129ab405b6330f18dc5b4cd2750bfe6f6 --- /dev/null +++ b/interface/ispconfig/server/conf/index/user_standard_index.html_se @@ -0,0 +1,60 @@ + + + + Välkommen! + + + + + + +
    + +
    +

    Detta är en standard index sida för användare {USER_USERNAME}.

    +

    Du kan antingen ta bort den eller ersätta den med en annan fil. Detta är en index.html fil i user/{USER_USERNAME}/web mappen.

    +

    För frågor eller problem runt detta kontakta support.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/index/user_standard_index.html_sr b/interface/ispconfig/server/conf/index/user_standard_index.html_sr new file mode 100644 index 0000000000000000000000000000000000000000..83ea2570ee206be50fa1a887a8ef589fa14d27cd --- /dev/null +++ b/interface/ispconfig/server/conf/index/user_standard_index.html_sr @@ -0,0 +1,60 @@ + + + + Dobrodošli! + + + + + + +
    + +
    +

    Ovo je podrazumevana indeksna strana za korisnika {USER_USERNAME}.

    +

    Možete je lako obrisati ili zameniti sa nekom drugom datotekom. Ovo je index.html datoteka u user/{USER_USERNAME}/web directory.

    +

    Kontaktirajte support u vezi pitanja i problema.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/mailfilter_move_junk.master b/interface/ispconfig/server/conf/mailfilter_move_junk.master new file mode 100644 index 0000000000000000000000000000000000000000..ef346c922c9c8bd59591785e161f916547c385f9 --- /dev/null +++ b/interface/ispconfig/server/conf/mailfilter_move_junk.master @@ -0,0 +1,19 @@ + +SPAMDIR="Junk" +SPAMDIRFULL="$DEFAULT/.Junk" + +if ( /^X-Spam-Flag: YES$/ ) +{ + exception { + + `test -e $SPAMDIRFULL` + if ( $RETURNCODE != 0 ) + { + `maildirmake -f $SPAMDIR $DEFAULT` + `chown vmail:vmail -R $SPAMDIRFULL` + `chmod 0700 $SPAMDIRFULL` + `echo INBOX.$SPAMDIR >> $DEFAULT/courierimapsubscribed` + } + to "$SPAMDIRFULL/" + } +} \ No newline at end of file diff --git a/interface/ispconfig/server/conf/motd.master b/interface/ispconfig/server/conf/motd.master new file mode 100644 index 0000000000000000000000000000000000000000..efc2ac3e8d69083d6fbe20d1bfe61cb58c7177fa --- /dev/null +++ b/interface/ispconfig/server/conf/motd.master @@ -0,0 +1,4 @@ +Welcome to + + + diff --git a/interface/ispconfig/server/conf/php-cgi-starter.master b/interface/ispconfig/server/conf/php-cgi-starter.master new file mode 100644 index 0000000000000000000000000000000000000000..3c00f9dba86d13dd721a0d72c4595f36daaaaefc --- /dev/null +++ b/interface/ispconfig/server/conf/php-cgi-starter.master @@ -0,0 +1,7 @@ +#!/bin/sh + +exec \ +-d open_basedir= \ +-d upload_tmp_dir=/tmp \ +-d session.save_path=/tmp +# -d safe_mode=${SAFE_MODE} \ No newline at end of file diff --git a/interface/ispconfig/server/conf/php-fcgi-starter.master b/interface/ispconfig/server/conf/php-fcgi-starter.master new file mode 100644 index 0000000000000000000000000000000000000000..97a162872474a4f5ffdac9e5c0e15d4f3685e1e5 --- /dev/null +++ b/interface/ispconfig/server/conf/php-fcgi-starter.master @@ -0,0 +1,16 @@ +#!/bin/sh +PHPRC="" +export PHPRC +PHP_DOCUMENT_ROOT="" +export PHP_DOCUMENT_ROOT +# The variable PHP_FCGI_CHILDREN is onyl useful for lighty or nginx as apache +# mod_fcgi will control the number of childs themself and never use the additional processes. +# PHP_FCGI_CHILDREN= +# export PHP_FCGI_CHILDREN +PHP_FCGI_MAX_REQUESTS= +export PHP_FCGI_MAX_REQUESTS +exec \ + -d open_basedir="" \ +-d upload_tmp_dir=/tmp \ +-d session.save_path=/tmp \ + $1 \ No newline at end of file diff --git a/interface/ispconfig/server/conf/sieve_filter.master b/interface/ispconfig/server/conf/sieve_filter.master new file mode 100644 index 0000000000000000000000000000000000000000..c3393cf7c98c434e812755c55c96128c54c2eb27 --- /dev/null +++ b/interface/ispconfig/server/conf/sieve_filter.master @@ -0,0 +1,30 @@ + +require ["fileinto", "regex", "vacation"]; + + +# Move spam to spam folder +if header :contains "X-Spam-Flag" "YES" { + fileinto "Junk"; + # Stop here so that we do not reply on spams + stop; +} + + + + + +################################################################# +# Autoreply +################################################################# + +# Move spam to spam folder +if header :contains "X-Spam-Flag" "YES" { + fileinto "Junk"; + # Stop here so that we do not reply on spams + stop; +} +vacation :days 1 + :subject "Out of office reply" + # :addresses ["test@test.int", "till@test.int"] + ""; + diff --git a/interface/ispconfig/server/conf/vhost.conf.master b/interface/ispconfig/server/conf/vhost.conf.master new file mode 100644 index 0000000000000000000000000000000000000000..36182b0568e9f0634389a2157a3feff936e49f7c --- /dev/null +++ b/interface/ispconfig/server/conf/vhost.conf.master @@ -0,0 +1,350 @@ + + + AllowOverride None + Order Deny,Allow + Deny from all + + +:80> + + DocumentRoot + + + DocumentRoot + + DocumentRoot + + + + ServerName + + + + ServerAdmin webmaster@ + + ErrorLog /var/log/ispconfig/httpd//error.log + + + ErrorDocument 400 /error/400.html + ErrorDocument 401 /error/401.html + ErrorDocument 403 /error/403.html + ErrorDocument 404 /error/404.html + ErrorDocument 405 /error/405.html + ErrorDocument 500 /error/500.html + ErrorDocument 503 /error/503.html + + + + Options FollowSymLinks + AllowOverride + Order allow,deny + Allow from all + + + # ssi enabled + AddType text/html .shtml + AddOutputFilter INCLUDES .shtml + Options +Includes + + + + Order allow,deny + Deny from all + Allow from none + + + + + Options FollowSymLinks + AllowOverride + Order allow,deny + Allow from all + + + # ssi enabled + AddType text/html .shtml + AddOutputFilter INCLUDES .shtml + Options +Includes + + + + Order allow,deny + Deny from all + Allow from none + + + + + + # cgi enabled + + Order allow,deny + Allow from all + + ScriptAlias /cgi-bin/ /cgi-bin/ + AddHandler cgi-script .cgi + AddHandler cgi-script .pl + + + # suexec enabled + SuexecUserGroup + + # Clear PHP settings of this website + + SetHandler None + + + # mod_php enabled + AddType application/x-httpd-php .php .php3 .php4 .php5 + php_admin_value sendmail_path "/usr/sbin/sendmail -t -i -fwebmaster@" + php_admin_value upload_tmp_dir /tmp + php_admin_value session.save_path /tmp + + php_admin_value open_basedir + + + + # suphp enabled + + suPHP_Engine on + # suPHP_UserGroup + AddHandler x-httpd-suphp .php .php3 .php4 .php5 + suPHP_AddHandler x-httpd-suphp + + + + # php as cgi enabled + ScriptAlias /php5-cgi + Action php5-cgi /php5-cgi + AddHandler php5-cgi .php .php3 .php4 .php5 + + Order allow,deny + Allow from all + + + + # php as fast-cgi enabled + + # SocketPath /tmp/fcgid_sock/ + IdleTimeout 3600 + ProcessLifeTime 7200 + # MaxProcessCount 1000 + DefaultMinClassProcessCount 3 + DefaultMaxClassProcessCount 100 + IPCConnectTimeout 8 + IPCCommTimeout 360 + BusyTimeout 300 + + + AddHandler fcgid-script .php .php3 .php4 .php5 + FCGIWrapper .php + Options +ExecCGI + AllowOverride + Order allow,deny + Allow from all + + + AddHandler fcgid-script .php .php3 .php4 .php5 + FCGIWrapper .php + Options +ExecCGI + AllowOverride + Order allow,deny + Allow from all + + + + + RewriteEngine on + + RewriteCond %{HTTP_HOST} ^ [NC] + RewriteRule ^/(.*)$ $1 + + + + # add support for apache mpm_itk + + AssignUserId + + + + + + + + + +########################################################### +# SSL Vhost +########################################################### + +:443> + + DocumentRoot + + + DocumentRoot + + DocumentRoot + + + + ServerName + + + + ServerAdmin webmaster@ + + ErrorLog /var/log/ispconfig/httpd//error.log + + + ErrorDocument 400 /error/400.html + ErrorDocument 401 /error/401.html + ErrorDocument 403 /error/403.html + ErrorDocument 404 /error/404.html + ErrorDocument 405 /error/405.html + ErrorDocument 500 /error/500.html + ErrorDocument 503 /error/503.html + + + SSLEngine on + SSLCertificateFile /ssl/.crt + SSLCertificateKeyFile /ssl/.key + + SSLCACertificateFile /ssl/.bundle + + + + Options FollowSymLinks + AllowOverride + Order allow,deny + Allow from all + + + # ssi enabled + AddType text/html .shtml + AddOutputFilter INCLUDES .shtml + Options +Includes + + + + Order allow,deny + Deny from all + Allow from none + + + + + Options FollowSymLinks + AllowOverride + Order allow,deny + Allow from all + + + # ssi enabled + AddType text/html .shtml + AddOutputFilter INCLUDES .shtml + Options +Includes + + + + Order allow,deny + Deny from all + Allow from none + + + + + + # cgi enabled + + Order allow,deny + Allow from all + + ScriptAlias /cgi-bin/ /cgi-bin/ + AddHandler cgi-script .cgi + AddHandler cgi-script .pl + + + # ssi enabled + AddType text/html .shtml + AddOutputFilter INCLUDES .shtml + + + # suexec enabled + SuexecUserGroup + + + # mod_php enabled + AddType application/x-httpd-php .php .php3 .php4 .php5 + php_admin_value sendmail_path "/usr/sbin/sendmail -t -i -fwebmaster@" + php_admin_value upload_tmp_dir /tmp + php_admin_value session.save_path /tmp + + php_admin_value open_basedir + + + + suPHP_Engine on + # suPHP_UserGroup + AddHandler x-httpd-suphp .php .php3 .php4 .php5 + suPHP_AddHandler x-httpd-suphp + + + # php as cgi enabled + ScriptAlias /php5-cgi + Action php5-cgi /php5-cgi + AddHandler php5-cgi .php .php3 .php4 .php5 + + Order allow,deny + Allow from all + + + + # php as fast-cgi enabled + + # SocketPath /tmp/fcgid_sock/ + IdleTimeout 3600 + ProcessLifeTime 7200 + # MaxProcessCount 1000 + DefaultMinClassProcessCount 3 + DefaultMaxClassProcessCount 100 + IPCConnectTimeout 8 + IPCCommTimeout 360 + BusyTimeout 300 + + + AddHandler fcgid-script .php .php3 .php4 .php5 + FCGIWrapper .php + Options +ExecCGI + AllowOverride + Order allow,deny + Allow from all + + + AddHandler fcgid-script .php .php3 .php4 .php5 + FCGIWrapper .php + Options +ExecCGI + AllowOverride + Order allow,deny + Allow from all + + + + + RewriteEngine on + + RewriteCond %{HTTP_HOST} ^ [NC] + RewriteRule ^/(.*)$ $1 + + + + # add support for apache mpm_itk + + AssignUserId + + + + + + + diff --git a/interface/ispconfig/server/cron_daily.php b/interface/ispconfig/server/cron_daily.php new file mode 100644 index 0000000000000000000000000000000000000000..24c0961bcc3588bdc1267cc3b83546ce65fc2123 --- /dev/null +++ b/interface/ispconfig/server/cron_daily.php @@ -0,0 +1,303 @@ +uses('ini_parser,file,services'); + + +####################################################################################################### +// store the mailbox statistics in the database +####################################################################################################### + +$sql = "SELECT mailuser_id,maildir FROM mail_user WHERE server_id = ".$conf["server_id"]; +$records = $app->db->queryAllRecords($sql); +foreach($records as $rec) { + if(@is_file($rec["maildir"].'/ispconfig_mailsize')) { + + // rename file + rename($rec["maildir"].'/ispconfig_mailsize',$rec["maildir"].'/ispconfig_mailsize_save'); + + // Read the file + $lines = file($rec["maildir"].'/ispconfig_mailsize_save'); + $mail_traffic = 0; + foreach($lines as $line) { + $mail_traffic += intval($line); + } + unset($lines); + + // Delete backup file + if(@is_file($rec["maildir"].'/ispconfig_mailsize_save')) unlink($rec["maildir"].'/ispconfig_mailsize_save'); + + // Save the traffic stats in the sql database + $tstamp = date("Y-m"); + + $sql = "SELECT * FROM mail_traffic WHERE month = '$tstamp' AND mailuser_id = ".$rec["mailuser_id"]; + $tr = $app->dbmaster->queryOneRecord($sql); + + $mail_traffic += $tr["traffic"]; + if($tr["traffic_id"] > 0) { + $sql = "UPDATE mail_traffic SET traffic = $mail_traffic WHERE traffic_id = ".$tr["traffic_id"]; + } else { + $sql = "INSERT INTO mail_traffic (month,mailuser_id,traffic) VALUES ('$tstamp',".$rec["mailuser_id"].",$mail_traffic)"; + } + $app->dbmaster->query($sql); + echo $sql; + + } + +} + +####################################################################################################### +// Create webalizer statistics +####################################################################################################### + +function setConfigVar( $filename, $varName, $varValue ) { + if($lines = @file($filename)) { + $out = ''; + $found = 0; + foreach($lines as $line) { + list($key, $value) = preg_split("/[\t= ]+/", $line, 2); + if($key == $varName) { + $out .= $varName." ".$varValue."\n"; + $found = 1; + } else { + $out .= $line; + } + } + if($found == 0) { + //* add \n if the last line does not end with \n or \r + if(substr($out,-1) != "\n" && substr($out,-1) != "\r") $out .= "\n"; + //* add the new line at the end of the file + if($append == 1) $out .= $varName." ".$varValue."\n"; + } + + file_put_contents($filename,$out); + } +} + + +$sql = "SELECT domain_id, domain, document_root FROM web_domain WHERE server_id = ".$conf["server_id"]; +$records = $app->db->queryAllRecords($sql); + +foreach($records as $rec) { + $yesterday = date("Ymd",time() - 86400); + $logfile = escapeshellcmd($rec["document_root"].'/log/'.$yesterday.'-access.log'); + if(!@is_file($logfile)) { + $logfile = escapeshellcmd($rec["document_root"].'/log/'.$yesterday.'-access.log.gz'); + if(!@is_file($logfile)) { + continue; + } +} + +$domain = escapeshellcmd($rec["domain"]); +$statsdir = escapeshellcmd($rec["document_root"].'/web/stats'); +$webalizer = '/usr/bin/webalizer'; +$webalizer_conf_main = '/etc/webalizer/webalizer.conf'; +$webalizer_conf = escapeshellcmd($rec["document_root"].'/log/webalizer.conf'); + +if(!@is_file($webalizer_conf)) { + exec("cp $webalizer_conf_main $webalizer_conf"); +} + +if(@is_file($webalizer_conf)) { + setConfigVar($webalizer_conf, 'Incremental', 'yes'); + setConfigVar($webalizer_conf, 'IncrementalName', $statsdir.'/webalizer.current'); + setConfigVar($webalizer_conf, 'HistoryName', $statsdir.'/webalizer.hist'); +} + + +if(!@is_dir($statsdir)) mkdir($statsdir); + exec("$webalizer -c $webalizer_conf -n $domain -s $domain -r $domain -q -T -p -o $statsdir $logfile"); +} + +####################################################################################################### +// Make the web logfiles directories world readable to enable ftp access +####################################################################################################### + +exec('chmod +r /var/log/ispconfig/httpd/*'); + +####################################################################################################### +// Manage and compress web logfiles +####################################################################################################### + +$sql = "SELECT domain_id, domain, document_root FROM web_domain WHERE server_id = ".$conf["server_id"]; +$records = $app->db->queryAllRecords($sql); +foreach($records as $rec) { + $yesterday = date("Ymd",time() - 86400); + $logfile = escapeshellcmd($rec["document_root"].'/log/'.$yesterday.'-access.log'); + if(@is_file($logfile)) { + // Compress yesterdays logfile + exec("gzip -c $logfile > $logfile.gz"); + unlink($logfile); + } + + // delete logfiles after 30 days + $month_ago = date("Ymd",time() - 86400 * 30); + $logfile = escapeshellcmd($rec["document_root"].'/log/'.$month_ago.'-access.log.gz'); + if(@is_file($logfile)) { + unlink($logfile); + } +} + +####################################################################################################### +// Cleanup website tmp directories +####################################################################################################### + +$sql = "SELECT domain_id, domain, document_root, system_user FROM web_domain WHERE server_id = ".$conf["server_id"]; +$records = $app->db->queryAllRecords($sql); +$app->uses('system'); +if(is_array($records)) { + foreach($records as $rec){ + $tmp_path = realpath(escapeshellcmd($rec["document_root"].'/tmp')); + if($tmp_path != '' && strlen($tmp_path) > 10 && is_dir($tmp_path) && $app->system->is_user($rec['system_user'])){ + exec("cd ".$tmp_path."; find -mtime +1 -name 'sess_*' | grep -v -w .no_delete | xargs rm &> /dev/null 2> /dev/null"); + } + } +} + +####################################################################################################### +// Cleanup logs in master database (only the "master-server") +####################################################################################################### + +if ($app->dbmaster == $app->db) { + /** 7 days */ + $tstamp = time() - (60*60*24*7); + + /* + * Keep 7 days in sys_log + * (we can delete the old items, because if they are OK, they don't interrest anymore + * if they are NOT ok, the server will try to process them in 1 minute and so the + * error appears again after 1 minute. So it is no problem to delete the old one! + */ + $sql = "DELETE FROM sys_log WHERE tstamp < $tstamp AND server_id != 0"; + $app->dbmaster->query($sql); + + /* + * The sys_datalog is more difficult. + * 1) We have to keet ALL entries with + * server_id=0, because they depend on ALL servers (even if they are not + * actually in the system (and will be insered in 3 days or so). + * 2) We have to keey ALL entries which are not actually precessed by the + * server never mind how old they are! + * 3) We have to keep the entry with the highest autoinc-id, because mysql calculates the + * autoinc-id as "new value = max(row) +1" and does not store this in a separate table. + * This means, if we delete to entry with the highest autoinc-value then this value is + * reused as autoinc and so there are more than one entries with the same value (over + * for example 4 Weeks). This is confusing for our system. + * ATTENTION 2) and 3) is in some case NOT the same! so we have to check both! + */ + + /* First we need all servers and the last sys_datalog-id they processed */ + $sql = "SELECT server_id, updated FROM server ORDER BY server_id"; + $records = $app->dbmaster->queryAllRecords($sql); + + /* Then we need the highest value ever */ + $sql = "SELECT max(datalog_id) FROM sys_datalog"; + $res = $app->dbmaster->queryOneRecord($sql); + $maxId = $res['max(datalog_id)']; + + /* Then delete server by server */ + foreach($records as $server) { + $tmp_server_id = intval($server['server_id']); + if($tmp_server_id > 0) { + $sql = "DELETE FROM sys_datalog " . + "WHERE tstamp < " . $tstamp . + " AND server_id = " . intval($server['server_id']) . + " AND datalog_id < " . intval($server['updated']) . + " AND datalog_id < " . intval($maxId); + } +// echo $sql . "\n"; + $app->dbmaster->query($sql); + } +} + +####################################################################################################### +// enforce traffic quota (run only on the "master-server") +####################################################################################################### + +if ($app->dbmaster == $app->db) { + + $current_month = date('Y-m'); + + //* Check website traffic quota + $sql = "SELECT sys_groupid,domain_id,domain,traffic_quota,traffic_quota_lock FROM web_domain WHERE traffic_quota > 0 and type = 'vhost'"; + $records = $app->db->queryAllRecords($sql); + if(is_array($records)) { + foreach($records as $rec) { + + $web_traffic_quota = $rec['traffic_quota']; + $domain = $rec['domain']; + + // get the client + /* + $client_group_id = $rec["sys_groupid"]; + $client = $app->db->queryOneRecord("SELECT limit_traffic_quota,parent_client_id FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + $reseller = $app->db->queryOneRecord("SELECT limit_traffic_quota FROM client WHERE client_id = ".intval($client['parent_client_id'])); + + $client_traffic_quota = intval($client['limit_traffic_quota']); + $reseller_traffic_quota = intval($reseller['limit_traffic_quota']); + */ + + //* get the traffic + $tmp = $app->db->queryOneRecord("SELECT SUM(traffic_bytes) As total_traffic_bytes FROM web_traffic WHERE traffic_date like '$current_month%' AND hostname = '$domain'"); + $web_traffic = (int)$tmp['total_traffic_bytes']/1024/1024; + + //* Website is over quota, we will disable it + /*if( ($web_traffic_quota > 0 && $web_traffic > $web_traffic_quota) || + ($client_traffic_quota > 0 && $web_traffic > $client_traffic_quota) || + ($reseller_traffic_quota > 0 && $web_traffic > $reseller_traffic_quota)) {*/ + if($web_traffic_quota > 0 && $web_traffic > $web_traffic_quota) { + $app->dbmaster->datalogUpdate('web_domain', "traffic_quota_lock = 'y',active = 'n'", 'domain_id', $rec['domain_id']); + $app->log("Traffic quota for ".$rec['domain_id']." Exceeded. Disabling website.",LOGLEVEL_DEBUG); + } else { + //* unlock the website, if traffic is lower then quota + if($rec['traffic_quota_lock'] == 'y') { + $app->dbmaster->datalogUpdate('web_domain', "traffic_quota_lock = 'n',active = 'y'", 'domain_id', $rec['domain_id']); + $app->log("Traffic quota for ".$rec['domain_id']." ok again. Enabling website.",LOGLEVEL_DEBUG); + } + } + } + } + + +} + + +die("finished.\n"); +?> \ No newline at end of file diff --git a/interface/ispconfig/server/cron_daily.sh b/interface/ispconfig/server/cron_daily.sh new file mode 100644 index 0000000000000000000000000000000000000000..da0ae3c16ee5ef38982fc609935cb98a34716c1c --- /dev/null +++ b/interface/ispconfig/server/cron_daily.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin:/usr/local/bin:/usr/X11R6/bin + +/usr/bin/php -q /usr/local/ispconfig/server/cron_daily.php \ No newline at end of file diff --git a/interface/ispconfig/server/lib/app.inc.php b/interface/ispconfig/server/lib/app.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..8cc03bf4d42ccc36430bed4318a31070d59a43b7 --- /dev/null +++ b/interface/ispconfig/server/lib/app.inc.php @@ -0,0 +1,181 @@ +load('db_'.$conf["db_type"]); + $this->db = new db; + if($this->db->linkId) $this->db->closeConn(); + $this->db->dbHost = $conf["db_host"]; + $this->db->dbName = $conf["db_database"]; + $this->db->dbUser = $conf["db_user"]; + $this->db->dbPass = $conf["db_password"]; + + /* + Initialize the connection to the master DB, + if we are in a multiserver setup + */ + + if($conf["dbmaster_host"] != '' && $conf["dbmaster_host"] != $conf["db_host"]) { + $this->dbmaster = new db; + if($this->dbmaster->linkId) $this->dbmaster->closeConn(); + $this->dbmaster->dbHost = $conf["dbmaster_host"]; + $this->dbmaster->dbName = $conf["dbmaster_database"]; + $this->dbmaster->dbUser = $conf["dbmaster_user"]; + $this->dbmaster->dbPass = $conf["dbmaster_password"]; + } else { + $this->dbmaster = $this->db; + } + + + } + + } + + function uses($classes) { + global $conf; + + $cl = explode(',',$classes); + if(is_array($cl)) { + foreach($cl as $classname) { + if(!@is_object($this->$classname)) { + if(is_file($conf['classpath'] . "/".$classname.".inc.php") && !is_link($conf['classpath'] . "/".$classname.".inc.php")) { + include_once($conf['classpath'] . "/".$classname.".inc.php"); + $this->$classname = new $classname; + } + } + } + } + } + + function load($classes) { + + global $conf; + $cl = explode(',',$classes); + if(is_array($cl)) { + foreach($cl as $classname) { + if(is_file($conf['classpath'] . "/".$classname.".inc.php") && !is_link($conf['classpath'] . "/".$classname.".inc.php")) { + include_once($conf['classpath'] . "/".$classname.".inc.php"); + } else { + die('Unable to load: '.$conf['classpath'] . "/".$classname.".inc.php"); + } + } + } + } + + /* + 0 = DEBUG + 1 = WARNING + 2 = ERROR + */ + + function log($msg, $priority = 0) { + + global $conf; + + if($priority >= $conf["log_priority"]) { + //if (is_writable($conf["log_file"])) { + if (!$fp = fopen ($conf["log_file"], "a")) { + die("Unable to open logfile."); + } + switch ($priority) { + case 0: + $priority_txt = "DEBUG"; + break; + case 1: + $priority_txt = "WARNING"; + break; + case 2: + $priority_txt = "ERROR"; + break; + } + + if (!fwrite($fp, date("d.m.Y-H:i")." - ".$priority_txt." - ". $msg."\r\n")) { + die("Unable to write to logfile."); + } + echo date("d.m.Y-H:i")." - ".$priority_txt." - ". $msg."\n"; + fclose($fp); + + // Log to database + if(isset($this->dbmaster)) { + $server_id = $conf['server_id']; + $loglevel = $priority; + $tstamp = time(); + $message = $this->dbmaster->quote($msg); + $datalog_id = (isset($this->modules->current_datalog_id) && $this->modules->current_datalog_id > 0)?$this->modules->current_datalog_id:0; + if($datalog_id > 0) { + $tmp_rec = $this->dbmaster->queryOneRecord("SELECT count(syslog_id) as number FROM sys_log WHERE datalog_id = $datalog_id AND loglevel = ".LOGLEVEL_ERROR); + //* Do not insert duplicate errors into the web log. + if($tmp_rec['number'] == 0) { + $sql = "INSERT INTO sys_log (server_id,datalog_id,loglevel,tstamp,message) VALUES ('$server_id',$datalog_id,'$loglevel','$tstamp','$message')"; + $this->dbmaster->query($sql); + } + } else { + $sql = "INSERT INTO sys_log (server_id,datalog_id,loglevel,tstamp,message) VALUES ('$server_id',0,'$loglevel','$tstamp','$message')"; + $this->dbmaster->query($sql); + } + + + } + + //} else { + // die("Unable to write to logfile."); + //} + } // if + } // func + + /* + 0 = DEBUG + 1 = WARNING + 2 = ERROR + */ + + function error($msg) { + $this->log($msg,3); + die($msg); + } + +} + +/* + Initialize application (app) object +*/ + +$app = new app; + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/lib/classes/db_mysql.inc.php b/interface/ispconfig/server/lib/classes/db_mysql.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..f7ac0f5081d2f27942710b4dfa57667012599f22 --- /dev/null +++ b/interface/ispconfig/server/lib/classes/db_mysql.inc.php @@ -0,0 +1,612 @@ +dbHost = $conf["db_host"]; + $this->dbName = $conf["db_database"]; + $this->dbUser = $conf["db_user"]; + $this->dbPass = $conf["db_password"]; + $this->dbCharset = $conf['db_charset']; + //$this->connect(); + } + + // error handler + function updateError($location) + { + global $app; + $this->errorNumber = mysql_errno($this->linkId); + $this->errorMessage = mysql_error($this->linkId); + $this->errorLocation = $location; + if($this->errorNumber && $this->show_error_messages && method_exists($app,'log')) + { + // echo('
    '.$this->errorLocation.'
    '.$this->errorMessage); + $app->log($this->errorLocation." ".$this->errorMessage,LOGLEVEL_WARN); + //flush(); + } + } + + function connect() + { + if($this->linkId == 0) + { + $this->linkId = mysql_connect($this->dbHost, $this->dbUser, $this->dbPass); + if(!$this->linkId) + { + $this->updateError('DB::connect()-> mysql_connect'); + return false; + } + $this->queryId = @mysql_query('SET NAMES '.$this->dbCharset, $this->linkId); + $this->queryId = @mysql_query("SET character_set_results = '".$this->dbCharset."', character_set_client = '".$this->dbCharset."', character_set_connection = '".$this->dbCharset."', character_set_database = '".$this->dbCharset."', character_set_server = '".$this->dbCharset."'", $this->linkId); + } + return true; + } + + function query($queryString) + { + if(!$this->connect()) + { + return false; + } + if(!mysql_select_db($this->dbName, $this->linkId)) + { + $this->updateError('DB::connect()-> mysql_select_db'); + return false; + } + $this->queryId = @mysql_query($queryString, $this->linkId); + $this->updateError('DB::query('.$queryString.') -> mysql_query'); + if(!$this->queryId) + { + return false; + } + $this->currentRow = 0; + return $this->queryId; + } + + // returns all records in an array + function queryAllRecords($queryString) + { + if(!$this->query($queryString)) + { + return false; + } + $ret = array(); + while($line = $this->nextRecord()) + { + $ret[] = $line; + } + return $ret; + } + + // returns one record in an array + function queryOneRecord($queryString) + { + if(!$this->query($queryString) || $this->numRows() == 0) + { + return false; + } + return $this->nextRecord(); + } + + // returns the next record in an array + function nextRecord() + { + $this->record = mysql_fetch_assoc($this->queryId); + $this->updateError('DB::nextRecord()-> mysql_fetch_array'); + if(!$this->record || !is_array($this->record)) + { + return false; + } + $this->currentRow++; + return $this->record; + } + + // returns number of rows returned by the last select query + function numRows() + { + return mysql_num_rows($this->queryId); + } + + // returns mySQL insert id + function insertID() + { + return mysql_insert_id($this->linkId); + } + + // Check der variablen + // deprecated, now use quote + function check($formfield) + { + return $this->quote($formfield); + } + + // Check der variablen + function quote($formfield) + { + if(!$this->connect()){ + $this->updateError('WARNING: mysql_connect: Used addslashes instead of mysql_real_escape_string'); + return addslashes($formfield); + } + + return mysql_real_escape_string($formfield, $this->linkId); + } + + // Check der variablen + function unquote($formfield) + { + return stripslashes($formfield); + } + + function toLower($record) { + if(is_array($record)) { + foreach($record as $key => $val) { + $key = strtolower($key); + $out[$key] = $val; + } + } + return $out; + } + + /* + //* These functions are deprecated and will be removed. + function insert($tablename,$form,$debug = 0) + { + if(is_array($form)){ + foreach($form as $key => $value) + { + $sql_key .= "$key, "; + $sql_value .= "'".$this->check($value)."', "; + } + $sql_key = substr($sql_key,0,strlen($sql_key) - 2); + $sql_value = substr($sql_value,0,strlen($sql_value) - 2); + + $sql = "INSERT INTO $tablename (" . $sql_key . ") VALUES (" . $sql_value .")"; + + if($debug == 1) echo "SQL-Statement: ".$sql."

    "; + $this->query($sql); + if($debug == 1) echo "mySQL Error Message: ".$this->errorMessage; + } + } + + function update($tablename,$form,$bedingung,$debug = 0) + { + + if(is_array($form)){ + foreach($form as $key => $value) + { + $insql .= "$key = '".$this->check($value)."', "; + } + $insql = substr($insql,0,strlen($insql) - 2); + $sql = "UPDATE $tablename SET " . $insql . " WHERE $bedingung"; + if($debug == 1) echo "SQL-Statement: ".$sql."

    "; + $this->query($sql); + if($debug == 1) echo "mySQL Error Message: ".$this->errorMessage; + } + } + */ + + public function diffrec($record_old, $record_new) { + $diffrec_full = array(); + $diff_num = 0; + + if(is_array($record_old) && count($record_old) > 0) { + foreach($record_old as $key => $val) { + // if(!isset($record_new[$key]) || $record_new[$key] != $val) { + if($record_new[$key] != $val) { + // Record has changed + $diffrec_full['old'][$key] = $val; + $diffrec_full['new'][$key] = $record_new[$key]; + $diff_num++; + } else { + $diffrec_full['old'][$key] = $val; + $diffrec_full['new'][$key] = $val; + } + } + } elseif(is_array($record_new)) { + foreach($record_new as $key => $val) { + if(isset($record_new[$key]) && @$record_old[$key] != $val) { + // Record has changed + $diffrec_full['new'][$key] = $val; + $diffrec_full['old'][$key] = @$record_old[$key]; + $diff_num++; + } else { + $diffrec_full['new'][$key] = $val; + $diffrec_full['old'][$key] = $val; + } + } + } + + return array('diff_num' => $diff_num, 'diff_rec' => $diffrec_full); + + } + + //** Function to fill the datalog with a full differential record. + public function datalogSave($db_table, $action, $primary_field, $primary_id, $record_old, $record_new) { + global $app,$conf; + + // Insert backticks only for incomplete table names. + if(stristr($db_table,'.')) { + $escape = ''; + } else { + $escape = '`'; + } + + $tmp = $this->diffrec($record_old, $record_new); + $diffrec_full = $tmp['diff_rec']; + $diff_num = $tmp['diff_num']; + unset($tmp); + + // Insert the server_id, if the record has a server_id + $server_id = (isset($record_old["server_id"]) && $record_old["server_id"] > 0)?$record_old["server_id"]:0; + if(isset($record_new["server_id"])) $server_id = $record_new["server_id"]; + + + if($diff_num > 0) { + //print_r($diff_num); + //print_r($diffrec_full); + $diffstr = $app->db->quote(serialize($diffrec_full)); + $username = $app->db->quote($_SESSION["s"]["user"]["username"]); + $dbidx = $primary_field.":".$primary_id; + + if($action == 'INSERT') $action = 'i'; + if($action == 'UPDATE') $action = 'u'; + if($action == 'DELETE') $action = 'd'; + $sql = "INSERT INTO sys_datalog (dbtable,dbidx,server_id,action,tstamp,user,data) VALUES ('".$db_table."','$dbidx','$server_id','$action','".time()."','$username','$diffstr')"; + $app->db->query($sql); + } + + return true; + } + + //** Inserts a record and saves the changes into the datalog + public function datalogInsert($tablename, $insert_data, $index_field) { + global $app; + + $old_rec = array(); + $this->query("INSERT INTO $tablename $insert_data"); + $index_value = $this->insertID(); + $new_rec = $this->queryOneRecord("SELECT * FROM $tablename WHERE $index_field = '$index_value'"); + $this->datalogSave($tablename, 'INSERT', $index_field, $index_value, $old_rec, $new_rec); + + return $index_value; + } + + //** Updates a record and saves the changes into the datalog + public function datalogUpdate($tablename, $update_data, $index_field, $index_value) { + global $app; + + $old_rec = $this->queryOneRecord("SELECT * FROM $tablename WHERE $index_field = '$index_value'"); + $this->query("UPDATE $tablename SET $update_data WHERE $index_field = '$index_value'"); + $new_rec = $this->queryOneRecord("SELECT * FROM $tablename WHERE $index_field = '$index_value'"); + $this->datalogSave($tablename, 'UPDATE', $index_field, $index_value, $old_rec, $new_rec); + + return true; + } + + //** Deletes a record and saves the changes into the datalog + public function datalogDelete($tablename, $index_field, $index_value) { + global $app; + + $old_rec = $this->queryOneRecord("SELECT * FROM $tablename WHERE $index_field = '$index_value'"); + $this->query("DELETE FROM $tablename WHERE $index_field = '$index_value'"); + $new_rec = array(); + $this->datalogSave($tablename, 'DELETE', $index_field, $index_value, $old_rec, $new_rec); + + return true; + } + + public function closeConn() + { + if($this->linkId) + { + mysql_close($this->linkId); + return true; + } else { return false; } + } + + public function freeResult($query) + { + if(mysql_free_result($query)) + { + return true; + } else { + return false; + } + } + + function delete() { + + } + + function Transaction($action) { + //action = begin, commit oder rollback + + } + + /* + $columns = array(action => add | alter | drop + name => Spaltenname + name_new => neuer Spaltenname, nur bei 'alter' belegt + type => 42go-Meta-Type: int16, int32, int64, double, char, varchar, text, blob + typeValue => Wert z.B. bei Varchar + defaultValue => Default Wert + notNull => true | false + autoInc => true | false + option => unique | primary | index) + + + */ + + function createTable($table_name,$columns) { + $index = ""; + $sql = "CREATE TABLE $table_name ("; + foreach($columns as $col){ + $sql .= $col["name"]." ".$this->mapType($col["type"],$col["typeValue"])." "; + + if($col["defaultValue"] != "") $sql .= "DEFAULT '".$col["defaultValue"]."' "; + if($col["notNull"] == true) { + $sql .= "NOT NULL "; + } else { + $sql .= "NULL "; + } + if($col["autoInc"] == true) $sql .= "auto_increment "; + $sql.= ","; + // key Definitionen + if($col["option"] == "primary") $index .= "PRIMARY KEY (".$col["name"]."),"; + if($col["option"] == "index") $index .= "INDEX (".$col["name"]."),"; + if($col["option"] == "unique") $index .= "UNIQUE (".$col["name"]."),"; + } + $sql .= $index; + $sql = substr($sql,0,-1); + $sql .= ")"; + + $this->query($sql); + return true; + } + + /* + $columns = array(action => add | alter | drop + name => Spaltenname + name_new => neuer Spaltenname, nur bei 'alter' belegt + type => 42go-Meta-Type: int16, int32, int64, double, char, varchar, text, blob + typeValue => Wert z.B. bei Varchar + defaultValue => Default Wert + notNull => true | false + autoInc => true | false + option => unique | primary | index) + + + */ + function alterTable($table_name,$columns) { + $index = ""; + $sql = "ALTER TABLE $table_name "; + foreach($columns as $col){ + if($col["action"] == 'add') { + $sql .= "ADD ".$col["name"]." ".$this->mapType($col["type"],$col["typeValue"])." "; + } elseif ($col["action"] == 'alter') { + $sql .= "CHANGE ".$col["name"]." ".$col["name_new"]." ".$this->mapType($col["type"],$col["typeValue"])." "; + } elseif ($col["action"] == 'drop') { + $sql .= "DROP ".$col["name"]." "; + } + if($col["action"] != 'drop') { + if($col["defaultValue"] != "") $sql .= "DEFAULT '".$col["defaultValue"]."' "; + if($col["notNull"] == true) { + $sql .= "NOT NULL "; + } else { + $sql .= "NULL "; + } + if($col["autoInc"] == true) $sql .= "auto_increment "; + $sql.= ","; + // key Definitionen + if($col["option"] == "primary") $index .= "PRIMARY KEY (".$col["name"]."),"; + if($col["option"] == "index") $index .= "INDEX (".$col["name"]."),"; + if($col["option"] == "unique") $index .= "UNIQUE (".$col["name"]."),"; + } + } + $sql .= $index; + $sql = substr($sql,0,-1); + + //die($sql); + $this->query($sql); + return true; + } + + function dropTable($table_name) { + $this->check($table_name); + $sql = "DROP TABLE '". $table_name."'"; + return $this->query($sql); + } + + // gibt Array mit Tabellennamen zurck + function getTables($database_name = '') { + + if($database_name == '') $database_name = $this->dbName; + $result = mysql_list_tables($database_name); + for ($i = 0; $i < mysql_num_rows($result); $i++) { + $tb_names[$i] = mysql_tablename($result, $i); + } + return $tb_names; + } + + // gibt Feldinformationen zur Tabelle zurck + /* + $columns = array(action => add | alter | drop + name => Spaltenname + name_new => neuer Spaltenname, nur bei 'alter' belegt + type => 42go-Meta-Type: int16, int32, int64, double, char, varchar, text, blob + typeValue => Wert z.B. bei Varchar + defaultValue => Default Wert + notNull => true | false + autoInc => true | false + option => unique | primary | index) + + + */ + + function tableInfo($table_name) { + + global $go_api,$go_info; + // Tabellenfelder einlesen + + if($rows = $go_api->db->queryAllRecords("SHOW FIELDS FROM ".$table_name)){ + foreach($rows as $row) { + $name = $row[0]; + $default = $row[4]; + $key = $row[3]; + $extra = $row[5]; + $isnull = $row[2]; + $type = $row[1]; + + + $column = array(); + + $column["name"] = $name; + //$column["type"] = $type; + $column["defaultValue"] = $default; + if(stristr($key,"PRI")) $column["option"] = "primary"; + if(stristr($isnull,"YES")) { + $column["notNull"] = false; + } else { + $column["notNull"] = true; + } + if($extra == 'auto_increment') $column["autoInc"] = true; + + + // Type in Metatype umsetzen + + if(stristr($type,"int(")) $metaType = 'int32'; + if(stristr($type,"bigint")) $metaType = 'int64'; + if(stristr($type,"char")) { + $metaType = 'char'; + $tmp_typeValue = explode('(',$type); + $column["typeValue"] = substr($tmp_typeValue[1],0,-1); + } + if(stristr($type,"varchar")) { + $metaType = 'varchar'; + $tmp_typeValue = explode('(',$type); + $column["typeValue"] = substr($tmp_typeValue[1],0,-1); + } + if(stristr($type,"text")) $metaType = 'text'; + if(stristr($type,"double")) $metaType = 'double'; + if(stristr($type,"blob")) $metaType = 'blob'; + + + $column["type"] = $metaType; + + $columns[] = $column; + } + return $columns; + } else { + return false; + } + + + //$this->createTable('tester',$columns); + + /* + $result = mysql_list_fields($go_info["server"]["db_name"],$table_name); + $fields = mysql_num_fields ($result); + $i = 0; + $table = mysql_field_table ($result, $i); + while ($i < $fields) { + $name = mysql_field_name ($result, $i); + $type = mysql_field_type ($result, $i); + $len = mysql_field_len ($result, $i); + $flags = mysql_field_flags ($result, $i); + print_r($flags); + + $columns = array(name => $name, + type => "", + defaultValue => "", + isnull => 1, + option => ""); + $returnvar[] = $columns; + + $i++; + } + */ + + + + } + + function mapType($metaType,$typeValue) { + global $go_api; + $metaType = strtolower($metaType); + switch ($metaType) { + case 'int16': + return 'smallint'; + break; + case 'int32': + return 'int'; + break; + case 'int64': + return 'bigint'; + break; + case 'double': + return 'double'; + break; + case 'char': + return 'char'; + break; + case 'varchar': + if($typeValue < 1) die("Datenbank Fehler: Fr diesen Datentyp ist eine Lngenangabe notwendig."); + return 'varchar('.$typeValue.')'; + break; + case 'text': + return 'text'; + break; + case 'blob': + return 'blob'; + break; + } + } + + } + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/lib/classes/file.inc.php b/interface/ispconfig/server/lib/classes/file.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..9fd28b8344aa021b47024526ae37b5748f966b5e --- /dev/null +++ b/interface/ispconfig/server/lib/classes/file.inc.php @@ -0,0 +1,319 @@ +log("WARNING: could not open file ".$file, 2); + return false; + } else { + if(filesize($file) > 0){ + $content = fread($fp, filesize($file)); + } else { + $content = ""; + } + fclose($fp); + return $content; + } + } + + function wf($file, $content){ + global $app; + $this->mkdirs(dirname($file)); + if(!$fp = fopen ($file, "wb")){ + $app->log("WARNING: could not open file ".$file, 2); + return false; + } else { + fwrite($fp,$content); + fclose($fp); + return true; + } + } + + function af($file, $content){ + global $app; + $this->mkdirs(dirname($file)); + if(!$fp = fopen ($file, "ab")){ + $app->log("WARNING: could not open file ".$file, 2); + return false; + } else { + fwrite($fp,$content); + fclose($fp); + return true; + } + } + + function no_comments($file, $comment = '#'){ + $content = $this->unix_nl($this->rf($file)); + $lines = explode("\n", $content); + if(!empty($lines)){ + foreach($lines as $line){ + if(strstr($line, $comment)){ + $pos = strpos($line, $comment); + if($pos != 0){ + $new_lines[] = substr($line,0,$pos); + } else { + $new_lines[] = ""; + } + } else { + $new_lines[] = $line; + } + } + } + if(is_array($new_lines)){ + $content_without_comments = implode("\n", $new_lines); + $new_lines = NULL; + return $content_without_comments; + } else { + return ""; + } + } + + function manual_entries($file, $separator = '#### MAKE MANUAL ENTRIES BELOW THIS LINE! ####'){ + if(is_file($file)){ + $content = $this->rf($file); + $parts = explode($separator, $content); + $manual = "\n".trim($parts[1]); + return $manual; + } else { + return ""; + } + } + + function remove_blank_lines($input, $file = 1){ + //Leerzeilen lschen + if($file){ + $content = $this->unix_nl($this->rf($input)); + } else { + $content = $input; + } + $lines = explode("\n", $content); + if(!empty($lines)){ + foreach($lines as $line){ + if(trim($line) != "") $new_lines[] = $line; + } + } + if(is_array($new_lines)){ + $content = implode("\n", $new_lines); + } else { + $content = ""; + } + if($file){ + $this->wf($input, $content); + } else { + return $content; + } + } + + function unix_nl($input){ + $output = str_replace("\r\n", "\n", $input); + $output = str_replace("\r", "\n", $output); + return $output; + } + + function fileowner($file){ + $owner_id = fileowner($file); + clearstatcache(); + return $owner_id; + } + + function mkdirs($strPath, $mode = '0755'){ + // Verzeichnisse rekursiv erzeugen + if(is_dir($strPath)) return true; + $pStrPath = dirname($strPath); + if(!$this->mkdirs($pStrPath, $mode)) return false; + $old_umask = umask(0); + $ret_val = mkdir($strPath, octdec($mode)); + umask($old_umask); + return $ret_val; + } + + function find_includes($file){ + ob_start(); + $httpd_root = system('httpd -V | awk -F"\"" \'$1==" -D HTTPD_ROOT="{print $2}\''); + ob_end_clean(); + clearstatcache(); + if(is_file($file) && filesize($file) > 0){ + $includes[] = $file; + $inhalt = $this->unix_nl($this->no_comments($file)); + $lines = explode("\n", $inhalt); + if(!empty($lines)){ + foreach($lines as $line){ + if(stristr($line, "include ")){ + $include_file = str_replace("\n", "", trim(shell_exec("echo \"$line\" | awk '{print \$2}'"))); + if(substr($include_file,0,1) != "/"){ + $include_file = $httpd_root."/".$include_file; + } + if(is_file($include_file)){ + if($further_includes = $this->find_includes($include_file)){ + $includes = array_merge($includes, $further_includes); + } + } else { + if(strstr($include_file, "*")){ + $more_files = explode("\n", shell_exec("ls -l $include_file | awk '{print \$9}'")); + if(!empty($more_files)){ + foreach($more_files as $more_file){ + if(is_file($more_file)){ + if($further_includes = $this->find_includes($more_file)){ + $includes = array_merge($includes, $further_includes); + } + } + } + } + } + } + } + } + } + } + if(is_array($includes)){ + $includes = array_unique($includes); + return $includes; + } else { + return false; + } + } + + function edit_dist($var, $val){ + global $$var; + $files = array("/root/ispconfig/dist.inc.php"); + foreach($files as $file){ + if(is_file($file)){ + $file_content = $this->unix_nl($this->rf($file)); + $lines = explode("\n", $file_content); + for($i=0;$iwf($file, $file_content); + } + } + } + + function getDirectoryListing($dirname, $sortorder = "a", $show_subdirs = 0, $show_subdirfiles = 0, $exts = "", $ext_save = 1){ + // This function will return an array with filenames based on the criteria you can set in the variables + // @sortorder : a for ascending (the standard) or d for descending (you can use the "r" for reverse as well, works the same) + // @show_subdirs : 0 for NO, 1 for YES - meaning it will show the names of subdirectories if there are any + // Logically subdirnames will not be checked for the required extentions + // @show_subdirfiles : 0 for NO, 1 for YES - meaning it will show files from the subdirs + // Files from subdirs will be prefixed with the subdir name and checked for the required extentions. + // @exts can be either a string or an array, if not passed to the function, then the default will be a check for common image files + // If exts is set to "all" then all extentions are allowed + // @ext_save : 1 for YES, 0 for NO - meaning it will filter out system files or not (such as .htaccess) + + $dirname = realpath($dirname); + if (!$exts || empty($exts) || $exts == "") { + $exts = array("jpg", "gif", "jpeg", "png"); + } + if ($handle = opendir($dirname)) { + $filelist = array(); + while (false !== ($file = readdir($handle))) { + + // Filter out higher directory references + if ($file != "." && $file != "..") { + // Only look at directories or files, filter out symbolic links + if ( filetype ($dirname."/".$file) != "link") { + // If it's a file, check against valid extentions and add to the list + if ( filetype ($dirname."/".$file) == "file" ) { + if ($this->checkFileExtension($file, $exts, $ext_save)) { + $filelist[] = $file; + } + } + // If it's a directory and either subdirs should be listed or files from subdirs add relevant names to the list + else if ( filetype ($dirname."/".$file) == "dir" && ($show_subdirs == 1 || $show_subdirfiles == 1)) { + if ($show_subdirs == 1) { + $filelist[] = $file; + } + if ($show_subdirfiles == 1) { + $subdirname = $file; + $subdirfilelist = $this->getDirectoryListing($dirname."/".$subdirname."/", $sortorder, $show_subdirs, $show_subdirfiles, $exts, $ext_save); + for ($i = 0 ; $i < count($subdirfilelist) ; $i++) { + $subdirfilelist[$i] = $subdirname."/".$subdirfilelist[$i]; + } + $filelist = array_merge($filelist, $subdirfilelist); + } + + } + + } + } + } + closedir($handle); + + // Sort the results + if (count($filelist) > 1) { + natcasesort($filelist); + if ($sortorder == "d" || $sortorder == "r" ) { + $filelist = array_reverse($filelist, TRUE); + } + } + return $filelist; + } + else { + return false; + } + } + + function checkFileExtension($filename, $exts, $ext_save = 1){ + $passed = FALSE; + if ($ext_save == 1) { + if (preg_match("/^\./", $filename)) { + return $passed; + } + } + if ($exts == "all") { + $passed = TRUE; + return $passed; + } + if (is_string($exts)) { + if (preg_match("/\.". $exts ."$/i", $filename)) { + $passed = TRUE; + return $passed; + } + } else if (is_array($exts)) { + foreach ($exts as $theExt) { + if (preg_match("/\.". $theExt ."$/i", $filename)) { + $passed = TRUE; + return $passed; + } + } + } + return $passed; + } + +} +?> \ No newline at end of file diff --git a/interface/ispconfig/server/lib/classes/getconf.inc.php b/interface/ispconfig/server/lib/classes/getconf.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..96e2c9be38f07bf5f290ce3b7e5ec915d82e5b27 --- /dev/null +++ b/interface/ispconfig/server/lib/classes/getconf.inc.php @@ -0,0 +1,65 @@ +config[$server_id])) { + $app->uses('ini_parser'); + $server_id = intval($server_id); + $server = $app->db->queryOneRecord("SELECT config FROM server WHERE server_id = $server_id"); + $this->config[$server_id] = $app->ini_parser->parse_ini_string(stripslashes($server["config"])); + } + + if($section == '') { + return $this->config[$server_id]; + } else { + return $this->config[$server_id][$section]; + } + } + + public function get_global_config($section = '') { + global $app; + + if(!is_array($this->config['global'])) { + $app->uses('ini_parser'); + $tmp = $app->db->queryOneRecord("SELECT config FROM sys_ini WHERE sysini_id = 1"); + $this->config['global'] = $app->ini_parser->parse_ini_string(stripslashes($tmp["config"])); + } + return ($section == '') ? $this->config['global'] : $this->config['global'][$section]; + } + +} + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/lib/classes/ini_parser.inc.php b/interface/ispconfig/server/lib/classes/ini_parser.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..0e9dc918a7df39bcef8ac757f21862105d3ad6d7 --- /dev/null +++ b/interface/ispconfig/server/lib/classes/ini_parser.inc.php @@ -0,0 +1,69 @@ +config[$section][$item] = trim($matches[2]); + } + } + } + return $this->config; + } + + + + function get_ini_string($file) { + $content = ''; + foreach($this->config as $section => $data) { + $content .= "[$section]\n"; + foreach($data as $item => $value) { + if($value != '') $content .= "$item=$value\n"; + } + } + return $content; + } + +} + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/lib/classes/mod_mail_base.inc.php b/interface/ispconfig/server/lib/classes/mod_mail_base.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..f989e2f8bc09d6749567306bd60e6d17283ade94 --- /dev/null +++ b/interface/ispconfig/server/lib/classes/mod_mail_base.inc.php @@ -0,0 +1,76 @@ + \ No newline at end of file diff --git a/interface/ispconfig/server/lib/classes/modules.inc.php b/interface/ispconfig/server/lib/classes/modules.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..f5e14201c1dcc7b92b2744ffa6287cb743d74ee0 --- /dev/null +++ b/interface/ispconfig/server/lib/classes/modules.inc.php @@ -0,0 +1,250 @@ +debug) $app->log("Loading Module: $module_name",LOGLEVEL_DEBUG); + $app->loaded_modules[$module_name] = new $module_name; + $app->loaded_modules[$module_name]->onLoad(); + } + } + } + } else { + $app->log("Modules directory missing: $modules_dir",LOGLEVEL_ERROR); + } + + } + + /* + This function is called by the modules to register for a specific + table change notification + */ + + function registerTableHook($table_name,$module_name,$function_name) { + global $app; + $this->notification_hooks[$table_name][] = array('module' => $module_name, 'function' => $function_name); + if($this->debug) $app->log("Registered TableHook '$table_name' in module '$module_name' for processing function '$function_name'",LOGLEVEL_DEBUG); + } + + /* + This function goes through all new records in the + sys_datalog table and and calls the function in the + modules that hooked on to the table change. + */ + + function processDatalog() { + global $app,$conf; + + //* If its a multiserver setup + if($app->db->dbHost != $app->dbmaster->dbHost) { + if($conf["mirror_server_id"] > 0) { + $sql = "SELECT * FROM sys_datalog WHERE datalog_id > ".$conf['last_datalog_id']." AND (server_id = ".$conf["server_id"]." OR server_id = ".$conf["mirror_server_id"]." OR server_id = 0) ORDER BY datalog_id"; + } else { + $sql = "SELECT * FROM sys_datalog WHERE datalog_id > ".$conf['last_datalog_id']." AND (server_id = ".$conf["server_id"]." OR server_id = 0) ORDER BY datalog_id"; + } + + $records = $app->dbmaster->queryAllRecords($sql); + foreach($records as $d) { + + //** encode data to utf-8 and unserialize it + if(!$data = unserialize(stripslashes($d["data"]))) { + $data = unserialize($d["data"]); + } + //** Decode data back to locale + foreach($data['old'] as $key => $val) { + $data['old'][$key] = utf8_decode($val); + } + foreach($data['new'] as $key => $val) { + $data['new'][$key] = utf8_decode($val); + } + + $replication_error = false; + + $this->current_datalog_id = $d["datalog_id"]; + + if(count($data['new']) > 0) { + if($d["action"] == 'i' || $d["action"] == 'u') { + $idx = explode(":",$d["dbidx"]); + $tmp_sql1 = ''; + $tmp_sql2 = ''; + foreach($data['new'] as $fieldname => $val) { + $tmp_sql1 .= "`$fieldname`,"; + $tmp_sql2 .= "'".$app->db->quote($val)."',"; + } + $tmp_sql1 = substr($tmp_sql1,0,-1); + $tmp_sql2 = substr($tmp_sql2,0,-1); + //$tmp_sql1 .= "$idx[0]"; + //$tmp_sql2 .= "$idx[1]"; + $sql = "REPLACE INTO $d[dbtable] ($tmp_sql1) VALUES ($tmp_sql2)"; + $app->db->errorNumber = 0; + $app->db->errorMessage = ''; + $app->db->query($sql); + if($app->db->errorNumber > 0) { + $replication_error = true; + $app->log("Replication failed. Error: (" . $d[dbtable] . ") in mysql server: (".$app->db->dbHost.") " . $app->db->errorMessage . " # SQL: " . $sql,LOGLEVEL_ERROR); + } + $app->log("Replicated from master: ".$sql,LOGLEVEL_DEBUG); + } + /* + if($d["action"] == 'u') { + $sql = "UPDATE $d[dbtable] SET "; + foreach($data['new'] as $fieldname => $val) { + $sql .= "`$fieldname` = '$val',"; + } + $sql = substr($sql,0,-1); + $idx = explode(":",$d["dbidx"]); + $sql .= " WHERE $idx[0] = $idx[1]"; + $app->db->query($sql); + if($app->db->errorNumber > 0) { + $replication_error = true; + $app->log("Replication failed. Error: (" . $d[dbtable] . ") " . $app->db->errorMessage . " # SQL: " . $sql,LOGLEVEL_ERROR); + } + $app->log("Replicated from master: ".$sql,LOGLEVEL_DEBUG); + } + */ + if($d["action"] == 'd') { + $idx = explode(":",$d["dbidx"]); + $sql = "DELETE FROM $d[dbtable] "; + $sql .= " WHERE $idx[0] = $idx[1]"; + $app->db->query($sql); + if($app->db->errorNumber > 0) { + $replication_error = true; + $app->log("Replication failed. Error: (" . $d[dbtable] . ") " . $app->db->errorMessage . " # SQL: " . $sql,LOGLEVEL_ERROR); + } + $app->log("Replicated from master: ".$sql,LOGLEVEL_DEBUG); + } + + + if($replication_error == false) { + if(is_array($data['old']) || is_array($data['new'])) { + $this->raiseTableHook($d["dbtable"],$d["action"],$data); + } else { + $app->log("Data array was empty for datalog_id ".$d["datalog_id"],LOGLEVEL_WARN); + } + //$this->raiseTableHook($d["dbtable"],$d["action"],$data); + //$app->dbmaster->query("DELETE FROM sys_datalog WHERE datalog_id = ".$d["datalog_id"]); + //$app->log("Deleting sys_datalog ID ".$d["datalog_id"],LOGLEVEL_DEBUG); + $app->dbmaster->query("UPDATE server SET updated = ".$d["datalog_id"]." WHERE server_id = ".$conf["server_id"]); + $app->log("Processed datalog_id ".$d["datalog_id"],LOGLEVEL_DEBUG); + } else { + $app->log("Error in Replication, changes were not processed.",LOGLEVEL_ERROR); + /* + * If there is any error in processing the datalog we can't continue, because + * we do not know if the newer actions require this (old) one. + */ + return; + } + } else { + $app->log("Datalog does not contain any changes for this record ".$d["datalog_id"],LOGLEVEL_DEBUG); + } + } + + //* if we have a single server setup + } else { + $sql = "SELECT * FROM sys_datalog WHERE datalog_id > ".$conf['last_datalog_id']." AND (server_id = ".$conf["server_id"]." OR server_id = 0) ORDER BY datalog_id"; + $records = $app->db->queryAllRecords($sql); + foreach($records as $d) { + + //** encode data to utf-8 to be able to unserialize it and then unserialize it + if(!$data = unserialize(stripslashes($d["data"]))) { + $data = unserialize($d["data"]); + } + //** decode data back to current locale + foreach($data['old'] as $key => $val) { + $data['old'][$key] = utf8_decode($val); + } + foreach($data['new'] as $key => $val) { + $data['new'][$key] = utf8_decode($val); + } + + $this->current_datalog_id = $d["datalog_id"]; + if(is_array($data['old']) || is_array($data['new'])) { + $this->raiseTableHook($d["dbtable"],$d["action"],$data); + } else { + $app->log("Data array was empty for datalog_id ".$d["datalog_id"],LOGLEVEL_WARN); + } + //$app->db->query("DELETE FROM sys_datalog WHERE datalog_id = ".$rec["datalog_id"]); + //$app->log("Deleting sys_datalog ID ".$rec["datalog_id"],LOGLEVEL_DEBUG); + $app->db->query("UPDATE server SET updated = ".$d["datalog_id"]." WHERE server_id = ".$conf["server_id"]); + $app->log("Processed datalog_id ".$d["datalog_id"],LOGLEVEL_DEBUG); + } + } + + + + + + } + + function raiseTableHook($table_name,$action,$data) { + global $app; + + // Get the hooks for this table + $hooks = (isset($this->notification_hooks[$table_name]))?$this->notification_hooks[$table_name]:''; + if($this->debug) $app->log("Raised TableHook for table: '$table_name'",LOGLEVEL_DEBUG); + + if(is_array($hooks)) { + foreach($hooks as $hook) { + $module_name = $hook["module"]; + $function_name = $hook["function"]; + // Claa the processing function of the module + if($this->debug) $app->log("Call function '$function_name' in module '$module_name' raised by TableHook '$table_name'.",LOGLEVEL_DEBUG); + call_user_method($function_name,$app->loaded_modules[$module_name],$table_name,$action,$data); + unset($module_name); + unset($function_name); + } + } + unset($hook); + unset($hooks); + } + +} + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/lib/classes/plugins.inc.php b/interface/ispconfig/server/lib/classes/plugins.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..f1e0417033b2876c06ddf18d3e029b503d5086d8 --- /dev/null +++ b/interface/ispconfig/server/lib/classes/plugins.inc.php @@ -0,0 +1,130 @@ + $file) { + include_once($plugins_dir.$file); + if($this->debug) $app->log("Loading Plugin: $plugin_name",LOGLEVEL_DEBUG); + $app->loaded_plugins[$plugin_name] = new $plugin_name; + $app->loaded_plugins[$plugin_name]->onLoad(); + } + } else { + $app->log("Unable to open the plugin directory: $plugins_dir",LOGLEVEL_ERROR); + } + } else { + $app->log("Plugin directory missing: $plugins_dir",LOGLEVEL_ERROR); + } + + } + + /* + This function is used by the modules to announce which events they provide + */ + + function announceEvents($module_name,$events) { + global $app; + foreach($events as $event_name) { + $this->available_events[$event_name] = $module_name; + if($this->debug) $app->log("Announced event: $event_name",LOGLEVEL_DEBUG); + } + } + + + /* + This function is called by the plugin to register for an event + */ + + function registerEvent($event_name,$plugin_name,$function_name) { + global $app; + if(!isset($this->available_events[$event_name])) { + $app->log("Unable to register the function '$function_name' in the plugin '$plugin_name' for event '$event_name'",LOGLEVEL_DEBUG); + } else { + $this->subscribed_events[$event_name][] = array('plugin' => $plugin_name, 'function' => $function_name); + if($this->debug) $app->log("Registered the function '$function_name' in the plugin '$plugin_name' for event '$event_name'.",LOGLEVEL_DEBUG); + } + } + + + function raiseEvent($event_name,$data) { + global $app; + + // Get the subscriptions for this event + $events = (isset($this->subscribed_events[$event_name]))?$this->subscribed_events[$event_name]:''; + if($this->debug) $app->log("Raised event: '$event_name'",LOGLEVEL_DEBUG); + + if(is_array($events)) { + foreach($events as $event) { + $plugin_name = $event["plugin"]; + $function_name = $event["function"]; + // Call the processing function of the plugin + $app->log("Call function '$function_name' in plugin '$plugin_name' raised by event '$event_name'.",LOGLEVEL_DEBUG); + call_user_method($function_name,$app->loaded_plugins[$plugin_name],$event_name,$data); + unset($plugin_name); + unset($function_name); + } + } + unset($event); + unset($events); + } + +} + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/lib/classes/services.inc.php b/interface/ispconfig/server/lib/classes/services.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..2441409e87573a1cc0b2627f0c37efce7c47812b --- /dev/null +++ b/interface/ispconfig/server/lib/classes/services.inc.php @@ -0,0 +1,80 @@ +registered_services[$service_name])) { + $this->delayed_restarts[$service_name] = $action; + } else { + $app->log("Unable to add a delayed restart for '$service_name'. Service '$service_name' is not registered.",LOGLEVEL_WARNING); + } + + } + + // This function restarts a service when the function is called + function restartService($service_name,$action = 'restart') { + global $app; + + if(is_array($this->registered_services[$service_name])) { + $module_name = $this->registered_services[$service_name]["module"]; + $function_name = $this->registered_services[$service_name]["function"]; + $app->log("Call function '$function_name' in module '$module_name'.",LOGLEVEL_DEBUG); + call_user_method($function_name,$app->loaded_modules[$module_name],$action); + } else { + $app->log("Unable to restart $service_name. Service $service_name is not registered.",LOGLEVEL_WARNING); + } + + } + + // This function is used to register callback functions for services that can be restarted + function registerService($service_name,$module_name, $function_name) { + global $app; + $this->registered_services[$service_name] = array('module' => $module_name, 'function' => $function_name); + if($this->debug) $app->log("Registered Service '$service_name' in module '$module_name' for processing function '$function_name'",LOGLEVEL_DEBUG); + } + + // This function is called at the end of the server script to restart services. + function processDelayedActions() { + global $app; + foreach($this->delayed_restarts as $service_name => $action) { + $this->restartService($service_name,$action); + } + } + +} +?> \ No newline at end of file diff --git a/interface/ispconfig/server/lib/classes/system.inc.php b/interface/ispconfig/server/lib/classes/system.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..407289fa67bab72b900adac953563a4404586f45 --- /dev/null +++ b/interface/ispconfig/server/lib/classes/system.inc.php @@ -0,0 +1,1232 @@ +server_id = $go_info["isp"]["server_id"]; + $this->server_conf = $go_info["isp"]["server_conf"]; + $this->server_conf["passwd_datei"] = '/etc/passwd'; + $this->server_conf["shadow_datei"] = '/etc/shadow'; + $this->server_conf["group_datei"] = '/etc/group'; + } + + /** + * Get the hostname from the server + * + * @return string + */ + public function hostname(){ + $dist = $this->server_conf["dist"]; + + ob_start(); + passthru("hostname"); + $hostname = ob_get_contents(); + ob_end_clean(); + $hostname = trim($hostname); + ob_start(); + if(!strstr($dist, "freebsd")){ + passthru("dnsdomainname"); + } else { + passthru("domainname"); + } + $domainname = ob_get_contents(); + ob_end_clean(); + $domainname = trim($domainname); + if($domainname != ""){ + if(!strstr($hostname, $domainname)) $hostname .= ".".$domainname; + } + return $hostname; + } + + /** + * Add an user to the system + * + */ + public function adduser($user_username, $uid, $gid, $username, $homedir, $shell, $passwort = '*'){ + global $app; + if($this->is_user($user_username)){ + return false; + } else { + if(trim($user_username) != '') { + $user_datei = $this->server_conf["passwd_datei"]; + $shadow_datei = $this->server_conf["shadow_datei"]; + $shell = realpath($shell); + if(trim($passwort) == "") $passwort = '*'; + $new_user = "\n$user_username:x:$uid:$gid:$username:$homedir:$shell\n"; + $app->log->msg("USER: $new_user"); + $app->file->af($user_datei, $new_user); + if($shadow_datei == "/etc/shadow"){ + $datum = time(); + $tage = floor($datum/86400); + $new_passwd = "\n$user_username:$passwort:$tage:0:99999:7:::\n"; + } else { + $new_passwd = "\n$user_username:$passwort:$uid:$gid::0:0:$username:$homedir:$shell\n"; + } + $app->file->af($shadow_datei, $new_passwd); + // TB: leere Zeilen entfernen + $app->file->remove_blank_lines($shadow_datei); + $app->file->remove_blank_lines($user_datei); + // TB: user Sortierung deaktiviert + //$this->order_users_groups(); + if($shadow_datei != "/etc/shadow"){ + $app->file->af($shadow_datei, "\n"); + // TB: leere Zeilen entfernen + $app->file->remove_blank_lines($shadow_datei); + $app->log->caselog("pwd_mkdb $shadow_datei &> /dev/null", $this->FILE, __LINE__); + } + return true; + } + } + } + + /** + * Update users when someone edit it + * + */ + function updateuser($user_username, $uid, $gid, $username, $homedir, $shell, $passwort = '*'){ + //* First delete the users + $this->deluser($user_username); + //* Add the user again + $this->adduser($user_username, $uid, $gid, $username, $homedir, $shell, $passwort); + } + + /** + * Lock the user + * + */ + function deactivateuser($user_username){ + $passwort = str_rot13($this->getpasswd($user_username)); + $user_attr = $this->get_user_attributes($user_username); + $uid = $user_attr["uid"]; + $gid = $user_attr["gid"]; + $username = $user_attr["name"]; + $homedir = $user_attr["homedir"]; + $shell = "/dev/null"; + $this->deluser($user_username); + $this->adduser($user_username, $uid, $gid, $username, $homedir, $shell, $passwort); + } + /** + * Delete a user from the system + * + */ + function deluser($user_username){ + global $app; + if($this->is_user($user_username)){ + $user_datei = $this->server_conf["passwd_datei"]; + $shadow_datei = $this->server_conf["shadow_datei"]; + $users = $app->file->rf($user_datei); + $lines = explode("\n", $users); + if(is_array($lines)){ + $num_lines = sizeof($lines); + for($i=0;$i<$num_lines;$i++){ + if(trim($lines[$i]) != ""){ + list($f1,) = explode(":", $lines[$i]); + if($f1 != $user_username) $new_lines[] = $lines[$i]; + } + } + $new_users = implode("\n", $new_lines); + $app->file->wf($user_datei, $new_users); + unset($new_lines); + unset($lines); + unset($new_users); + } + $app->file->remove_blank_lines($user_datei); + + $passwds = $app->file->rf($shadow_datei); + $lines = explode("\n", $passwds); + if(is_array($lines)){ + $num_lines = sizeof($lines); + for($i=0;$i<$num_lines;$i++){ + if(trim($lines[$i]) != ""){ + list($f1,) = explode(":", $lines[$i]); + if($f1 != $user_username) $new_lines[] = $lines[$i]; + } + } + $new_passwds = implode("\n", $new_lines); + $app->file->wf($shadow_datei, $new_passwds); + unset($new_lines); + unset($lines); + unset($new_passwds); + } + $app->file->remove_blank_lines($shadow_datei); + + $group_file = $app->file->rf($this->server_conf["group_datei"]); + $group_file_lines = explode("\n", $group_file); + foreach($group_file_lines as $group_file_line){ + if(trim($group_file_line) != ""){ + list($f1, $f2, $f3, $f4) = explode(":", $group_file_line); + $group_users = explode(",", str_replace(" ", "", $f4)); + if(in_array($user_username, $group_users)){ + $g_users = array(); + foreach($group_users as $group_user){ + if($group_user != $user_username) $g_users[] = $group_user; + } + $f4 = implode(",", $g_users); + } + $new_group_file[] = $f1.":".$f2.":".$f3.":".$f4; + } + } + $new_group_file = implode("\n", $new_group_file); + $app->file->wf($this->server_conf["group_datei"], $new_group_file); + // TB: auskommentiert + //$this->order_users_groups(); + + if($shadow_datei != "/etc/shadow"){ + $app->file->af($shadow_datei, "\n"); + $app->log->caselog("pwd_mkdb $shadow_datei &> /dev/null", $this->FILE, __LINE__); + } + return true; + } else { + return false; + } + } + + /** + * Add a usergroup to the system + * + */ + function addgroup($group, $gid, $members = ''){ + global $app; + if($this->is_group($group)){ + return false; + } else { + $group_datei = $this->server_conf["group_datei"]; + $shadow_datei = $this->server_conf["shadow_datei"]; + $new_group = "\n$group:x:$gid:$members\n"; + $app->file->af($group_datei, $new_group); + + // TB: auskommentiert + //$this->order_users_groups(); + if($shadow_datei != "/etc/shadow"){ + $app->log->caselog("pwd_mkdb $shadow_datei &> /dev/null", $this->FILE, __LINE__); + } + return true; + } + } + + /** + * Update usersgroup in way to delete and add it again + * + */ + function updategroup($group, $gid, $members = ''){ + $this->delgroup($group); + $this->addgroup($group, $gid, $members); + } + + /** + * Delete a usergroup from the system + * + */ + function delgroup($group){ + global $app; + if($this->is_group($group)){ + $group_datei = $this->server_conf["group_datei"]; + $shadow_datei = $this->server_conf["shadow_datei"]; + $groups = $app->file->rf($group_datei); + $lines = explode("\n", $groups); + if(is_array($lines)){ + $num_lines = sizeof($lines); + for($i=0;$i<$num_lines;$i++){ + if(trim($lines[$i]) != ""){ + list($f1,) = explode(":", $lines[$i]); + if($f1 != $group) $new_lines[] = $lines[$i]; + } + } + $new_groups = implode("\n", $new_lines); + $app->file->wf($group_datei, $new_groups); + unset($new_lines); + unset($lines); + unset($new_groups); + } + // TB: auskommentiert + //$this->order_users_groups(); + if($shadow_datei != "/etc/shadow"){ + $app->log->caselog("pwd_mkdb $shadow_datei &> /dev/null", $this->FILE, __LINE__); + } + return true; + } else { + return false; + } + } + /** + * Order usergroups + * + */ + function order_users_groups(){ + global $app; + $user_datei = $this->server_conf["passwd_datei"]; + $shadow_datei = $this->server_conf["shadow_datei"]; + $group_datei = $this->server_conf["group_datei"]; + + $groups = $app->file->no_comments($group_datei); + $lines = explode("\n", $groups); + if(is_array($lines)){ + foreach($lines as $line){ + if(trim($line) != ""){ + list($f1, $f2, $f3, $f4) = explode(":", $line); + $arr[$f3] = $line; + } + } + } + ksort($arr); + reset($arr); + if($shadow_datei != "/etc/shadow"){ + $app->file->wf($group_datei, $app->file->remove_blank_lines(implode("\n", $arr), 0)."\n"); + }else { + $app->file->wf($group_datei, $app->file->remove_blank_lines(implode("\n", $arr), 0)); + } + unset($arr); + + $users = $app->file->no_comments($user_datei); + $lines = explode("\n", $users); + if(is_array($lines)){ + foreach($lines as $line){ + if(trim($line) != ""){ + list($f1, $f2, $f3,) = explode(":", $line); + if($f1 != "toor"){ + $arr[$f3] = $line; + } else { + $arr[70000] = $line; + } + } + } + } + ksort($arr); + reset($arr); + $app->file->wf($user_datei, $app->file->remove_blank_lines(implode("\n", $arr), 0)); + unset($arr); + + $passwds = $app->file->no_comments($shadow_datei); + $lines = explode("\n", $passwds); + if(is_array($lines)){ + foreach($lines as $line){ + if(trim($line) != ""){ + list($f1, $f2, $f3,) = explode(":", $line); + if($f1 != "toor"){ + $uid = $this->getuid($f1); + if(!is_bool($uid)) $arr[$uid] = $line; + } else { + $arr[70000] = $line; + } + } + } + } + ksort($arr); + reset($arr); + $app->file->wf($shadow_datei, $app->file->remove_blank_lines(implode("\n", $arr), 0)); + unset($arr); + } + + /** + * Find a user / group id + * + */ + function find_uid_gid($min, $max){ + global $app; + if($min < $max && $min >= 0 && $max >= 0 && $min <= 65536 && $max <= 65536 && is_int($min) && is_int($max)){ + for($i=$min;$i<=$max;$i++){ + $uid_arr[$i] = $gid_arr[$i] = 1; + } + $user_datei = $this->server_conf["passwd_datei"]; + $group_datei = $this->server_conf["group_datei"]; + + $users = $app->file->no_comments($user_datei); + $lines = explode("\n", $users); + if(is_array($lines)){ + foreach($lines as $line){ + if(trim($line) != ""){ + list($f1, $f2, $f3, $f4, $f5, $f6, $f7) = explode(":", $line); + if($f3 >= $min && $f3 <= $max) unset($uid_arr[$f3]); + } + } + if(!empty($uid_arr)){ + foreach($uid_arr as $key => $val){ + $uids[] = $key; + } + $min_uid = min($uids); + unset($uid_arr); + } else { + return false; + } + } + + $groups = $app->file->no_comments($group_datei); + $lines = explode("\n", $groups); + if(is_array($lines)){ + foreach($lines as $line){ + if(trim($line) != ""){ + list($f1, $f2, $f3, $f4) = explode(":", $line); + if($f3 >= $min && $f3 <= $max) unset($gid_arr[$f3]); + } + } + if(!empty($gid_arr)){ + foreach($gid_arr as $key => $val){ + $gids[] = $key; + } + $min_gid = min($gids); + unset($gid_arr); + } else { + return false; + } + } + + $result = array_intersect($uids, $gids); + $new_id = (max($result)); + unset($uids); + unset($gids); + unset($result); + if($new_id <= $max){ + return $new_id; + } else { + return false; + } + } else { + return false; + } + } + + /** + * Check if the users is really a user into the system + * + */ + function is_user($user){ + global $app; + $user_datei = $this->server_conf["passwd_datei"]; + $users = $app->file->no_comments($user_datei); + $lines = explode("\n", $users); + if(is_array($lines)){ + foreach($lines as $line){ + if(trim($line) != ""){ + list($f1, $f2, $f3, $f4, $f5, $f6, $f7) = explode(":", $line); + if($f1 == $user) return true; + } + } + } + return false; + } + + /** + * Check if the group is on this system + * + */ + function is_group($group){ + global $app; + $group_datei = $this->server_conf["group_datei"]; + $groups = $app->file->no_comments($group_datei); + $lines = explode("\n", $groups); + if(is_array($lines)){ + foreach($lines as $line){ + if(trim($line) != ""){ + list($f1, $f2, $f3, $f4) = explode(":", $line); + if($f1 == $group) return true; + } + } + } + return false; + } + + /* + // Alternative implementation of the is_group function. Should be faster then the old one To be tested. + function is_group($group) { + $groupfile = '/etc/group'; + if(is_file($groupfile)) { + $handle = fopen ($groupfile, "r"); + while (!feof($handle)) { + $line = trim(fgets($handle, 4096)); + if($line != ""){ + $parts = explode(":", $line); + if($parts[0] == $group) { + fclose ($handle); + return true; + } + } + } + fclose ($handle); + } + return false; + } + */ + + function root_group(){ + global $app; + $group_datei = $this->server_conf["group_datei"]; + $groups = $app->file->no_comments($group_datei); + $lines = explode("\n", $groups); + if(is_array($lines)){ + foreach($lines as $line){ + if(trim($line) != ""){ + list($f1, $f2, $f3, $f4) = explode(":", $line); + if($f3 == 0) return $f1; + } + } + } + return false; + } + + /** + * Get the groups of an user + * + */ + function get_user_groups($username){ + global $app; + $user_groups = array(); + $group_datei = $this->server_conf["group_datei"]; + $groups = $app->file->no_comments($group_datei); + $lines = explode("\n", $groups); + if(is_array($lines)){ + foreach($lines as $line){ + if(trim($line) != ""){ + list($f1, $f2, $f3, $f4) = explode(":", $line); + if(intval($f3) < intval($this->server_conf["groupid_von"]) && trim($f1) != 'users'){ + $tmp_group_users = explode(',', str_replace(' ', '', $f4)); + if(in_array($username, $tmp_group_users) && trim($f1) != '') $user_groups[] = $f1; + unset($tmp_group_users); + } + } + } + } + if(!empty($user_groups)) return implode(',', $user_groups); + return ''; + } + + /** + * Get a user password + * + */ + function getpasswd($user){ + global $app; + if($this->is_user($user)){ + $shadow_datei = $this->server_conf["shadow_datei"]; + $passwds = $app->file->no_comments($shadow_datei); + $lines = explode("\n", $passwds); + if(is_array($lines)){ + foreach($lines as $line){ + if(trim($line) != ""){ + list($f1, $f2,) = explode(":", $line); + if($f1 == $user) return $f2; + } + } + } + } else { + return false; + } + } + + /** + * Get the user id from an user + * + */ + function getuid($user){ + global $app; + if($this->is_user($user)){ + $user_datei = $this->server_conf["passwd_datei"]; + $users = $app->file->no_comments($user_datei); + $lines = explode("\n", $users); + if(is_array($lines)){ + foreach($lines as $line){ + if(trim($line) != ""){ + list($f1, $f2, $f3,) = explode(":", $line); + if($f1 == $user) return $f3; + } + } + } + } else { + return false; + } + } + + /** + * Get all information from a user + * + */ + function get_user_attributes($user){ + global $app; + if($this->is_user($user)){ + $user_datei = $this->server_conf["passwd_datei"]; + $users = $app->file->no_comments($user_datei); + $lines = explode("\n", $users); + if(is_array($lines)){ + foreach($lines as $line){ + if(trim($line) != ""){ + list($f1, $f2, $f3, $f4, $f5, $f6, $f7) = explode(":", $line); + if($f1 == $user){ + $user_attr["username"] = $f1; + $user_attr["x"] = $f2; + $user_attr["uid"] = $f3; + $user_attr["gid"] = $f4; + $user_attr["name"] = $f5; + $user_attr["homedir"] = $f6; + $user_attr["shell"] = $f7; + return $user_attr; + } + } + } + } + } else { + return false; + } + } + + /** + * Edit the owner of a file + * + */ + function chown($file, $owner, $group = ''){ + $owner_change = @chown($file, $owner); + if($group != ""){ + $group_change = @chgrp($file, $group); + } else { + $group_change = 1; + } + if($owner_change && $group_change){ + return true; + } else { + return false; + } + } + + /** + * Add an user to a specific group + * + */ + function add_user_to_group($group, $user = 'admispconfig'){ + global $app; + $group_file = $app->file->rf($this->server_conf["group_datei"]); + $group_file_lines = explode("\n", $group_file); + foreach($group_file_lines as $group_file_line){ + list($group_name,$group_x,$group_id,$group_users) = explode(":",$group_file_line); + if($group_name == $group){ + $group_users = explode(",", str_replace(" ", "", $group_users)); + if(!in_array($user, $group_users)){ + $group_users[] = $user; + } + $group_users = implode(",", $group_users); + if(substr($group_users,0,1) == ",") $group_users = substr($group_users,1); + $group_file_line = $group_name.":".$group_x.":".$group_id.":".$group_users; + } + $new_group_file[] = $group_file_line; + } + $new_group_file = implode("\n", $new_group_file); + $app->file->wf($this->server_conf["group_datei"], $new_group_file); + $app->file->remove_blank_lines($this->server_conf["group_datei"]); + if($this->server_conf["shadow_datei"] != "/etc/shadow"){ + $app->log->caselog("pwd_mkdb ".$this->server_conf["shadow_datei"]." &> /dev/null", $this->FILE, __LINE__); + } + } + + function usermod($user, $groups){ + global $app; + if($this->is_user($user)){ + $groups = explode(",", str_replace(" ", "", $groups)); + $group_file = $app->file->rf($this->server_conf["group_datei"]); + $group_file_lines = explode("\n", $group_file); + foreach($group_file_lines as $group_file_line){ + if(trim($group_file_line) != ""){ + list($f1, $f2, $f3, $f4) = explode(":", $group_file_line); + $group_users = explode(",", str_replace(" ", "", $f4)); + if(!in_array($f1, $groups)){ + if(in_array($user, $group_users)){ + $g_users = array(); + foreach($group_users as $group_user){ + if($group_user != $user) $g_users[] = $group_user; + } + $f4 = implode(",", $g_users); + } + } else { + if(!in_array($user, $group_users)){ + if(trim($group_users[0]) == "") unset($group_users); + $group_users[] = $user; + } + $f4 = implode(",", $group_users); + } + $new_group_file[] = $f1.":".$f2.":".$f3.":".$f4; + } + } + $new_group_file = implode("\n", $new_group_file); + $app->file->wf($this->server_conf["group_datei"], $new_group_file); + $app->file->remove_blank_lines($this->server_conf["group_datei"]); + if($this->server_conf["shadow_datei"] != "/etc/shadow"){ + $app->log->caselog("pwd_mkdb ".$this->server_conf["shadow_datei"]." &> /dev/null", $this->FILE, __LINE__); + } + return true; + } else { + return false; + } + } + + /**boot autostart etc + * + */ + function rc_edit($service, $rl, $action){ + // $action = "on|off"; + global $app; + $dist_init_scripts = $app->system->server_conf["dist_init_scripts"]; + $dist_runlevel = $app->system->server_conf["dist_runlevel"]; + $dist = $app->system->server_conf["dist"]; + if(trim($dist_runlevel) == ""){ // falls es keine runlevel gibt (FreeBSD) + if($action == "on"){ + @symlink($dist_init_scripts."/".$service, $dist_init_scripts."/".$service.".sh"); + } + if($action == "off"){ + if(is_link($dist_init_scripts."/".$service.".sh")){ + unlink($dist_init_scripts."/".$service.".sh"); + } else { + exec("mv -f ".$dist_init_scripts."/".$service.".sh ".$dist_init_scripts."/".$service." &> /dev/null"); + } + } + } else { // Linux + if(substr($dist, 0,4) == 'suse'){ + if($action == "on"){ + exec("chkconfig --add $service &> /dev/null"); + } + if($action == "off"){ + exec("chkconfig --del $service &> /dev/null"); + } + } else { + $runlevels = explode(",", $rl); + foreach($runlevels as $runlevel){ + $runlevel = trim($runlevel); + if($runlevel != "" && is_dir($dist_runlevel."/rc".$runlevel.".d")){ + $handle=opendir($dist_runlevel."/rc".$runlevel.".d"); + while($file = readdir($handle)){ + if($file != "." && $file != ".."){ + $target = @readlink($dist_runlevel."/rc".$runlevel.".d/".$file); + if(strstr($file, $service) && strstr($target, $service) && substr($file,0,1) == "S") $ln_arr[$runlevel][] = $dist_runlevel."/rc".$runlevel.".d/".$file; + } + } + closedir($handle); + } + if($action == "on"){ + if(!is_array($ln_arr[$runlevel])) @symlink($dist_init_scripts."/".$service, $dist_runlevel."/rc".$runlevel.".d/S99".$service); + } + if($action == "off"){ + if(is_array($ln_arr[$runlevel])){ + foreach($ln_arr[$runlevel] as $link){ + unlink($link); + } + } + } + } + } + } + } + + /** + * Filter information from the commands + * + */ + function grep($content, $string, $params = ''){ + global $app; + // params: i, v, w + $content = $app->file->unix_nl($content); + $lines = explode("\n", $content); + foreach($lines as $line){ + if(!strstr($params, 'w')){ + if(strstr($params, 'i')){ + if(strstr($params, 'v')){ + if(!stristr($line, $string)) $find[] = $line; + } else { + if(stristr($line, $string)) $find[] = $line; + } + } else { + if(strstr($params, 'v')){ + if(!strstr($line, $string)) $find[] = $line; + } else { + if(strstr($line, $string)) $find[] = $line; + } + } + } else { + if(strstr($params, 'i')){ + if(strstr($params, 'v')){ + if(!$app->string->is_word($string, $line, 'i')) $find[] = $line; + } else { + if($app->string->is_word($string, $line, 'i')) $find[] = $line; + } + } else { + if(strstr($params, 'v')){ + if(!$app->string->is_word($string, $line)) $find[] = $line; + } else { + if($app->string->is_word($string, $line)) $find[] = $line; + } + } + } + } + if(is_array($find)){ + $ret_val = implode("\n", $find); + if(substr($ret_val,-1) != "\n") $ret_val .= "\n"; + $find = NULL; + return $ret_val; + } else { + return false; + } + } + + /** + * Strip content from fields + * + */ + function cut($content, $field, $delimiter = ':'){ + global $app; + $content = $app->file->unix_nl($content); + $lines = explode("\n", $content); + foreach($lines as $line){ + $elms = explode($delimiter, $line); + $find[] = $elms[($field-1)]; + } + if(is_array($find)){ + $ret_val = implode("\n", $find); + if(substr($ret_val,-1) != "\n") $ret_val .= "\n"; + $find = NULL; + return $ret_val; + } else { + return false; + } + } + + /** + * Get the content off a file + * + */ + function cat($file){ + global $app; + return $app->file->rf($file); + } + + /** + * Control services to restart etc + * + */ + function daemon_init($daemon, $action){ + //* $action = start|stop|restart|reload + global $app; + $dist = $this->server_conf["dist"]; + $dist_init_scripts = $this->server_conf["dist_init_scripts"]; + if(!strstr($dist, "freebsd")){ + $app->log->caselog("$dist_init_scripts/$daemon $action &> /dev/null", $this->FILE, __LINE__); + } else { + if(is_file($dist_init_scripts."/".$daemon.".sh") || is_link($dist_init_scripts."/".$daemon.".sh")){ + if($action == "start" || $action == "stop"){ + $app->log->caselog($dist_init_scripts."/".$daemon.".sh ".$action." &> /dev/null", $this->FILE, __LINE__); + } else { + $app->log->caselog($dist_init_scripts."/".$daemon.".sh stop &> /dev/null", $this->FILE, __LINE__); + sleep(3); + $app->log->caselog($dist_init_scripts."/".$daemon.".sh start &> /dev/null", $this->FILE, __LINE__); + } + } else { + if(is_file($dist_init_scripts."/".$daemon) || is_link($dist_init_scripts."/".$daemon)){ + if($action == "start" || $action == "stop"){ + $app->log->caselog($dist_init_scripts."/".$daemon." ".$action." &> /dev/null", $this->FILE, __LINE__); + } else { + $app->log->caselog($dist_init_scripts."/".$daemon." stop &> /dev/null", $this->FILE, __LINE__); + sleep(3); + $app->log->caselog($dist_init_scripts."/".$daemon." start &> /dev/null", $this->FILE, __LINE__); + } + } else { + if(is_file("/etc/rc.d/".$daemon) || is_link("/etc/rc.d/".$daemon)){ + if($action == "start" || $action == "stop"){ + $app->log->caselog("/etc/rc.d/".$daemon." ".$action." &> /dev/null", $this->FILE, __LINE__); + } else { + $app->log->caselog("/etc/rc.d/".$daemon." stop &> /dev/null", $this->FILE, __LINE__); + sleep(3); + $app->log->caselog("/etc/rc.d/".$daemon." start &> /dev/null", $this->FILE, __LINE__); + } + } + } + } + } + } + + function netmask($netmask){ + list($f1,$f2,$f3,$f4) = explode(".", trim($netmask)); + $bin = str_pad(decbin($f1),8,"0",STR_PAD_LEFT).str_pad(decbin($f2),8,"0",STR_PAD_LEFT).str_pad(decbin($f3),8,"0",STR_PAD_LEFT).str_pad(decbin($f4),8,"0",STR_PAD_LEFT); + $parts = explode("0", $bin); + $bin = str_pad($parts[0], 32, "0", STR_PAD_RIGHT); + $bin = wordwrap($bin, 8, ".", 1); + list($f1,$f2,$f3,$f4) = explode(".", trim($bin)); + return bindec($f1).".".bindec($f2).".".bindec($f3).".".bindec($f4); + } + + function binary_netmask($netmask){ + list($f1,$f2,$f3,$f4) = explode(".", trim($netmask)); + $bin = str_pad(decbin($f1),8,"0",STR_PAD_LEFT).str_pad(decbin($f2),8,"0",STR_PAD_LEFT).str_pad(decbin($f3),8,"0",STR_PAD_LEFT).str_pad(decbin($f4),8,"0",STR_PAD_LEFT); + $parts = explode("0", $bin); + return substr_count($parts[0], "1"); + } + + function network($ip, $netmask){ + $netmask = $this->netmask($netmask); + list($f1,$f2,$f3,$f4) = explode(".", $netmask); + $netmask_bin = str_pad(decbin($f1),8,"0",STR_PAD_LEFT).str_pad(decbin($f2),8,"0",STR_PAD_LEFT).str_pad(decbin($f3),8,"0",STR_PAD_LEFT).str_pad(decbin($f4),8,"0",STR_PAD_LEFT); + list($f1,$f2,$f3,$f4) = explode(".", $ip); + $ip_bin = str_pad(decbin($f1),8,"0",STR_PAD_LEFT).str_pad(decbin($f2),8,"0",STR_PAD_LEFT).str_pad(decbin($f3),8,"0",STR_PAD_LEFT).str_pad(decbin($f4),8,"0",STR_PAD_LEFT); + for($i=0;$i<32;$i++){ + $network_bin .= substr($netmask_bin,$i,1) * substr($ip_bin,$i,1); + } + $network_bin = wordwrap($network_bin, 8, ".", 1); + list($f1,$f2,$f3,$f4) = explode(".", trim($network_bin)); + return bindec($f1).".".bindec($f2).".".bindec($f3).".".bindec($f4); + } + + /** + * Make a broadcast address from an IP number in combination with netmask + * + */ + function broadcast($ip, $netmask){ + $netmask = $this->netmask($netmask); + $binary_netmask = $this->binary_netmask($netmask); + list($f1,$f2,$f3,$f4) = explode(".", $ip); + $ip_bin = str_pad(decbin($f1),8,"0",STR_PAD_LEFT).str_pad(decbin($f2),8,"0",STR_PAD_LEFT).str_pad(decbin($f3),8,"0",STR_PAD_LEFT).str_pad(decbin($f4),8,"0",STR_PAD_LEFT); + $broadcast_bin = str_pad(substr($ip_bin, 0, $binary_netmask),32,"1",STR_PAD_RIGHT); + $broadcast_bin = wordwrap($broadcast_bin, 8, ".", 1); + list($f1,$f2,$f3,$f4) = explode(".", trim($broadcast_bin)); + return bindec($f1).".".bindec($f2).".".bindec($f3).".".bindec($f4); + } + + /** + * Get the network address information + * + */ + function network_info(){ + $dist = $this->server_conf["dist"]; + ob_start(); + passthru("ifconfig"); + $output = ob_get_contents(); + ob_end_clean(); + $lines = explode("\n", $output); + foreach($lines as $line){ + $elms = explode(" ", $line); + if(trim($elms[0]) != "" && substr($elms[0],0,1) != "\t"){ + $elms[0] = trim($elms[0]); + if(strstr($dist, "freebsd")) $elms[0] = substr($elms[0],0,-1); + $interfaces[] = $elms[0]; + } + } + if(!empty($interfaces)){ + foreach($interfaces as $interface){ + ob_start(); + if(!strstr($dist, "freebsd")){ + passthru("ifconfig ".$interface." | grep -iw 'inet' | cut -f2 -d: | cut -f1 -d' '"); + } else { + passthru("ifconfig ".$interface." | grep -iw 'inet' | grep -iv 'inet6' | cut -f2 -d' '"); + } + $output = trim(ob_get_contents()); + ob_end_clean(); + if($output != ""){ + $ifconfig["INTERFACE"][$interface] = $output; + $ifconfig["IP"][$output] = $interface; + } + } + if(!empty($ifconfig)){ + return $ifconfig; + } else { + return false; + } + } else { + return false; + } + } + + /** + * Configure the network settings from the system + * + */ + function network_config(){ + $ifconfig = $this->network_info(); + if($ifconfig){ + $main_interface = $ifconfig["IP"][$this->server_conf["server_ip"]]; + if(strstr($main_interface, ":")){ + $parts = explode(":", $main_interface); + $main_interface = trim($parts[0]); + } + if($main_interface != ""){ + $ips = $this->data["isp_server_ip"]; + if(!empty($ips)){ + foreach($ips as $ip){ + if(!isset($ifconfig["IP"][$ip["server_ip"]])){ + $to_set[] = $ip["server_ip"]; + } else { + unset($ifconfig["IP"][$ip["server_ip"]]); + } + } + if(!empty($ifconfig["IP"])){ + foreach($ifconfig["IP"] as $key => $val){ + if(!strstr($val, "lo") && !strstr($val, "lp") && strstr($val, $main_interface)){ + exec("ifconfig ".$val." down &> /dev/null"); + unset($ifconfig["INTERFACE"][$val]); + } + } + } + if(!empty($to_set)){ + foreach($to_set as $to){ + $i = 0; + while($i >= 0){ + if(isset($ifconfig["INTERFACE"][$main_interface.":".$i])){ + $i++; + } else { + $new_interface = $main_interface.":".$i; + $i = -1; + } + } + exec("ifconfig ".$new_interface." ".$to." netmask ".$this->server_conf["server_netzmaske"]." up &> /dev/null"); + $ifconfig["INTERFACE"][$new_interface] = $to; + } + } + } + } + } + } + + function quota_dirs(){ + global $app; + $content = $app->file->unix_nl($app->file->no_comments("/etc/fstab")); + $lines = explode("\n", $content); + foreach($lines as $line){ + $line = trim($line); + if($line != ""){ + $elms = explode("\t", $line); + foreach($elms as $elm){ + if(trim($elm) != "") $f[] = $elm; + } + if(!empty($f) && stristr($f[3], "userquota") && stristr($f[3], "groupquota")){ + $q_dirs[] = trim($f[1]); + } + unset($f); + } + } + if(!empty($q_dirs)){ + return $q_dirs; + } else { + return false; + } + } + + /** + * Scan the trash for virusses infection + * + */ + function make_trashscan(){ + global $app; + //trashscan erstellen + // Template ffnen + $app->tpl->clear_all(); + $app->tpl->define( array(table => "trashscan.master")); + + if(!isset($this->server_conf["virusadmin"]) || trim($this->server_conf["virusadmin"]) == "") $this->server_conf["virusadmin"] = "admispconfig@localhost"; + if(substr($this->server_conf["virusadmin"],0,1) == "#"){ + $notify = "no"; + } else { + $notify = "yes"; + } + + // Variablen zuweisen + $app->tpl->assign( array(VIRUSADMIN => $this->server_conf["virusadmin"], + NOTIFICATION => $notify)); + + $app->tpl->parse(TABLE, table); + + $trashscan_text = $app->tpl->fetch(); + + $datei = "/home/admispconfig/ispconfig/tools/clamav/bin/trashscan"; + $app->file->wf($datei, $trashscan_text); + + exec("chown admispconfig:admispconfig $datei &> /dev/null"); + exec("chmod 755 $datei"); + } + + /** + * Get the current time + * + */ + function get_time(){ + $addr = "http://www.ispconfig.org/"; + $timeout = 1; + $url_parts = parse_url($addr); + $path = $url_parts["path"]; + $port = 80; + $urlHandle = @fsockopen($url_parts["host"], $port, $errno, $errstr, $timeout); + if ($urlHandle){ + socket_set_timeout($urlHandle, $timeout); + + $urlString = "GET $path HTTP/1.0\r\nHost: ".$url_parts["host"]."\r\nConnection: Keep-Alive\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)\r\n"; + if ($user) $urlString .= "Authorization: Basic ".base64_encode("$user:$pass")."\r\n"; + $urlString .= "\r\n"; + fputs($urlHandle, $urlString); + + $month["Jan"] = "01"; + $month["Feb"] = "02"; + $month["Mar"] = "03"; + $month["Apr"] = "04"; + $month["May"] = "05"; + $month["Jun"] = "06"; + $month["Jul"] = "07"; + $month["Aug"] = "08"; + $month["Sep"] = "09"; + $month["Oct"] = "10"; + $month["Nov"] = "11"; + $month["Dec"] = "12"; + $c = 0; + $l = 0; + $startzeit = time(); + while(!feof($urlHandle) && $c < 2 && $l == 0){ + $line = trim(fgets($urlHandle,128)); + $response .= $line; + $c = time() - $startzeit; + if($line == "" || substr($line, 0, 5) == "Date:") $l += 1; // nur den Header auslesen + if(substr($line, 0, 5) == "Date:"){ + $parts = explode(" ", $line); + $tag = $parts[2]; + $monat = $month[$parts[3]]; + $jahr = $parts[4]; + list($stunde, $minute, $sekunde) = explode(":", $parts[5]); + $timestamp = mktime($stunde,$minute,$sekunde,$monat,$tag,$jahr); + } + } + + @fclose($urlHandle); + + return $timestamp; + } else { + @fclose($urlHandle); + return false; + } + } + + function replaceLine($filename,$search_pattern,$new_line,$strict = 0,$append = 1) { + $lines = @file($filename); + $out = ''; + $found = 0; + if(is_array($lines)) { + foreach($lines as $line) { + if($strict == 0) { + if(stristr($line,$search_pattern)) { + $out .= $new_line."\n"; + $found = 1; + } else { + $out .= $line; + } + } else { + if(trim($line) == $search_pattern) { + $out .= $new_line."\n"; + $found = 1; + } else { + $out .= $line; + } + } + } + } + + if($found == 0) { + //* add \n if the last line does not end with \n or \r + if(substr($out,-1) != "\n" && substr($out,-1) != "\r") $out .= "\n"; + //* add the new line at the end of the file + if($append == 1) $out .= $new_line."\n"; + } + file_put_contents($filename,$out); + } + + function removeLine($filename,$search_pattern,$strict = 0) { + if($lines = @file($filename)) { + $out = ''; + foreach($lines as $line) { + if($strict == 0) { + if(!stristr($line,$search_pattern)) { + $out .= $line; + } + } else { + if(!trim($line) == $search_pattern) { + $out .= $line; + } + } + } + file_put_contents($filename,$out); + } + } + + function maildirmake($maildir_path, $user = '', $subfolder = '') { + + global $app; + + if($subfolder != '') { + $dir = escapeshellarg($maildir_path.'/.'.$subfolder); + $dir_cur = escapeshellarg($maildir_path.'/.'.$subfolder.'/cur'); + $dir_new = escapeshellarg($maildir_path.'/.'.$subfolder.'/new'); + $dir_tmp = escapeshellarg($maildir_path.'/.'.$subfolder.'/tmp'); + } else { + $dir = escapeshellarg($maildir_path); + $dir_cur = escapeshellarg($maildir_path.'/cur'); + $dir_new = escapeshellarg($maildir_path.'/new'); + $dir_tmp = escapeshellarg($maildir_path.'/tmp'); + } + + exec("mkdir -p $dir_cur $dir_new $dir_tmp"); + exec("chmod 0700 $dir $dir_cur $dir_new $dir_tmp"); + + if($user != '' && $this->is_user($user) && $user != 'root') { + $user = escapeshellarg($user); + // I assume that the name of the (vmail group) is the same as the name of the mail user in ispconfig 3 + $group = $user; + exec("chown $user:$group $dir $dir_cur $dir_new $dir_tmp"); + } + + //* Add the subfolder to the subscriptions and courierimapsubscribed files + if($subfolder != '') { + // Courier + if(!is_file($maildir_path.'/courierimapsubscribed')) { + $tmp_file = escapeshellarg($maildir_path.'/courierimapsubscribed'); + exec("touch $tmp_file && chown vmail:vmail $tmp_file"); + } + $this->replaceLine($maildir_path.'/courierimapsubscribed','INBOX.'.$subfolder,'INBOX.'.$subfolder,1,1); + + // Dovecot + if(!is_file($maildir_path.'/subscriptions')) { + $tmp_file = escapeshellarg($maildir_path.'/subscriptions'); + exec("touch $tmp_file && chown vmail:vmail $tmp_file"); + } + $this->replaceLine($maildir_path.'/subscriptions',$subfolder,$subfolder,1,1); + } + + $app->log('Created Maildir '.$maildir_path.' with subfolder: '.$subfolder,LOGLEVEL_DEBUG); + + } + +} +?> \ No newline at end of file diff --git a/interface/ispconfig/server/lib/classes/tpl.inc.php b/interface/ispconfig/server/lib/classes/tpl.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..aaa017ef6b4c590b408b2963796064178f7da0ac --- /dev/null +++ b/interface/ispconfig/server/lib/classes/tpl.inc.php @@ -0,0 +1,1501 @@ + | +// +----------------------------------------------------------------------+ +// +// $Id: class.tpl.inc.php,v 1.1 2003/07/08 12:31:10 platinum Exp $ + +// check to avoid multiple including of class +if (!defined('vlibTemplateClassLoaded')) { + define('vlibTemplateClassLoaded', 1); + + include_once ($conf['classpath'].'/tpl_error.inc.php'); + include_once ($conf['classpath'].'/tpl_ini.inc.php'); + + /** + * vlibTemplate is a class used to seperate PHP and HTML. + * For instructions on how to use vlibTemplate, see the + * vlibTemplate.html file, located in the 'docs' directory. + * + * @since 07/03/2002 + * @author Kelvin Jones + * @package vLIB + * @access public + * @see vlibTemplate.html + */ + + class tpl { + + /*-----------------------------------------------------------------------------\ + | ATTENTION | + | Do not touch the following variables. vlibTemplate will not work otherwise. | + \-----------------------------------------------------------------------------*/ + + var $OPTIONS = array( + 'MAX_INCLUDES' => 10, + 'TEMPLATE_DIR' => null, + 'GLOBAL_VARS' => null, + 'GLOBAL_CONTEXT_VARS' => null, + 'LOOP_CONTEXT_VARS' => null, + 'SET_LOOP_VAR' => null, + 'DEFAULT_ESCAPE' => null, + 'STRICT' => null, + 'CASELESS' => null, + 'UNKNOWNS' => null, + 'TIME_PARSE' => null, + 'ENABLE_PHPINCLUDE' => null, + 'INCLUDE_PATHS' => array(), + 'CACHE_DIRECTORY' => null, + 'CACHE_LIFETIME' => null, + 'CACHE_EXTENSION' => null + ); + + /** open and close tags used for escaping */ + var $ESCAPE_TAGS = array( + 'html' => array('open' => 'htmlspecialchars(' + ,'close'=> ', ENT_QUOTES)'), + 'url' => array('open' => 'urlencode(' + ,'close'=> ')'), + 'rawurl'=>array('open' => 'rawurlencode(' + ,'close'=> ')'), + 'sq' => array('open' => 'addcslashes(' + ,'close'=> ", \"'\")"), + 'dq' => array('open' => 'addcslashes(' + ,'close'=> ", '\"')"), + '1' => array('open' => 'htmlspecialchars(' + ,'close'=> ', ENT_QUOTES)'), + '0' => array('open' => '' + ,'close'=> ''), + 'none' => array('open' => '' + ,'close'=> ''), + 'hex' => array('open' => '$this->_escape_hex(', + 'close'=> ', false)'), + 'hexentity' => array('open' => '$this->_escape_hex(', + 'close'=> ', true)') + ); + + /** open and close tags used for formatting */ + var $FORMAT_TAGS = array( + 'strtoupper' => array('open' => 'strtoupper(', + 'close'=> ')'), + 'uc' => array('open' => 'strtoupper(', + 'close'=> ')'), + 'strtolower' => array('open' => 'strtolower(', + 'close'=> ')'), + 'lc' => array('open' => 'strtolower(', + 'close'=> ')'), + 'ucfirst' => array('open' => 'ucfirst(', + 'close'=> ')'), + 'lcucfirst' => array('open' => 'ucfirst(strtolower(', + 'close'=> '))'), + 'ucwords' => array('open' => 'ucwords(', + 'close'=> ')'), + 'lcucwords' => array('open' => 'ucwords(strtolower(', + 'close'=> '))') + ); + + /** operators allowed when using extended TMPL_IF syntax */ + var $allowed_if_ops = array('==','!=','<>','<','>','<=','>='); + + /** dbs allowed by vlibTemplate::setDbLoop(). */ + var $allowed_loop_dbs = array('MYSQL','POSTGRESQL','INFORMIX','INTERBASE','INGRES', + 'MSSQL','MSQL','OCI8','ORACLE','OVRIMOS','SYBASE'); + + /** root directory of vlibTemplate automagically filled in */ + var $VLIBTEMPLATE_ROOT = null; + + /** contains current directory used when doing recursive include */ + var $_currentincludedir = array(); + + /** current depth of includes */ + var $_includedepth = 0; + + /** full path to tmpl file */ + var $_tmplfilename = null; + + /** file data before it's parsed */ + var $_tmplfile = null; + + /** parsed version of file, ready for eval()ing */ + var $_tmplfilep = null; + + /** eval()ed version ready for printing or whatever */ + var $_tmploutput = null; + + /** array for variables to be kept */ + var $_vars = array(); + + /** array where loop variables are kept */ + var $_arrvars = array(); + + /** array which holds the current namespace during parse */ + var $_namespace = array(); + + /** variable is set to true once the template is parsed, to save re-parsing everything */ + var $_parsed = false; + + /** array holds all unknowns vars */ + var $_unknowns = array(); + + /** microtime when template parsing began */ + var $_firstparsetime = null; + + /** total time taken to parse template */ + var $_totalparsetime = null; + + /** name of current loop being passed in */ + var $_currloopname = null; + + /** rows with the above loop */ + var $_currloop = array(); + + /** define vars to avoid warnings */ + var $_debug = null; + var $_cache = null; + + /** array which holds the dynamic Includes */ + var $_dyninclude = array(); + /*-----------------------------------------------------------------------------\ + | public functions | + \-----------------------------------------------------------------------------*/ + + + /** + * FUNCTION: newTemplate + * + * Usually called by the class constructor. + * Stores the filename in $this->_tmplfilename. + * Raises an error if the template file is not found. + * + * @param string $tmplfile full path to template file + * @return boolean true + * @access public + */ + function newTemplate ($tmplfile) { + if (!$tfile = $this->_fileSearch($tmplfile)) vlibTemplateError::raiseError('VT_ERROR_NOFILE',KILL,$tmplfile); + + // make sure that any parsing vars are cleared for the new template + $this->_tmplfile = null; + $this->_tmplfilep = null; + $this->_tmploutput = null; + $this->_parsed = false; + $this->_unknowns = array(); + $this->_firstparsetime = null; + $this->_totalparsetime = null; + + // reset debug module + if ($this->_debug) $this->_debugReset(); + + $this->_tmplfilename = $tfile; + return true; + } + + /** + * FUNCTION: setVar + * + * Sets variables to be used by the template + * If $k is an array, then it will treat it as an associative array + * using the keys as variable names and the values as variable values. + * + * @param mixed $k key to define variable name + * @param mixed $v variable to assign to $k + * @return boolean true/false + * @access public + */ + function setVar ($k,$v=null) { + if (is_array($k)) { + foreach($k as $key => $value){ + $key = ($this->OPTIONS['CASELESS']) ? strtolower(trim($key)) : trim($key); + if (preg_match('/^[A-Za-z_]+[A-Za-z0-9_]*$/', $key) && $value !== null ) { + $this->_vars[$key] = $value; + } + } + } + else { + if (preg_match('/^[A-Za-z_]+[A-Za-z0-9_]*$/', $k) && $v !== null) { + if ($this->OPTIONS['CASELESS']) $k = strtolower($k); + $this->_vars[trim($k)] = $v; + } + else { + return false; + } + } + return true; + } + + /** + * FUNCTION: setInclude + * + * Sets dynamic includes to be used by the template + * If $k is an array, then it will treat it as an associative array + * using the keys as variable names and the values as variable values. + * + * @param mixed $k key to define variable name + * @param mixed $v variable to assign to $k + * @return boolean true/false + * @access public + */ + + function setInclude($k, $v = null) { + if(is_array($k)) { + foreach($k as $key => $val) { + $this->_dyninclude[$key] = $val; + } + } else { + $this->_dyninclude[$k] = $v; + } + + return true; + } + + /** + * FUNCTION: unsetVar + * + * Unsets a variable which has already been set + * Parse in all vars wanted for deletion in seperate parametres + * + * @param string var name to remove use: vlibTemplate::unsetVar(var[, var..]) + * @return boolean true/false returns true unless called with 0 params + * @access public + */ + function unsetVar () { + $num_args = func_num_args(); + if ($num_args < 1) return false; + + for ($i = 0; $i < $num_args; $i++) { + $var = func_get_arg($i); + if ($this->OPTIONS['CASELESS']) $var = strtolower($var); + if (!preg_match('/^[A-Za-z_]+[A-Za-z0-9_]*$/', $var)) continue; + unset($this->_vars[$var]); + } + return true; + } + + /** + * FUNCTION: getVars + * + * Gets all vars currently set in global namespace. + * + * @return array + * @access public + */ + function getVars () { + if (empty($this->_vars)) return false; + return $this->_vars; + } + + /** + * FUNCTION: getVar + * + * Gets a single var from the global namespace + * + * @return var + * @access public + */ + function getVar ($var) { + if ($this->OPTIONS['CASELESS']) $var = strtolower($var); + if (empty($var) || !isset($this->_vars[$var])) return false; + return $this->_vars[$var]; + } + + /** + * FUNCTION: setContextVars + * + * sets the GLOBAL_CONTEXT_VARS + * + * @return true + * @access public + */ + function setContextVars () { + $_phpself = @$GLOBALS['HTTP_SERVER_VARS']['PHP_SELF']; + $_pathinfo = @$GLOBALS['HTTP_SERVER_VARS']['PATH_INFO']; + $_request_uri = @$GLOBALS['HTTP_SERVER_VARS']['REQUEST_URI']; + $_qs = @$GLOBALS['HTTP_SERVER_VARS']['QUERY_STRING']; + + // the following fixes bug of $PHP_SELF on Win32 CGI and IIS. + $_self = (!empty($_pathinfo)) ? $_pathinfo : $_phpself; + $_uri = (!empty($_request_uri)) ? $_request_uri : $_self.'?'.$_qs; + + $this->setvar('__SELF__', $_self); + $this->setvar('__REQUEST_URI__', $_uri); + return true; + } + + /** + * FUNCTION: setLoop + * + * Builds the loop construct for use with . + * + * @param string $k string to define loop name + * @param array $v array to assign to $k + * @return boolean true/false + * @access public + */ + function setLoop ($k,$v) { + if (is_array($v) && preg_match('/^[A-Za-z_]+[A-Za-z0-9_]*$/', $k)) { + $k = ($this->OPTIONS['CASELESS']) ? strtolower(trim($k)) : trim($k); + $this->_arrvars[$k] = array(); + if ($this->OPTIONS['SET_LOOP_VAR'] && !empty($v)) $this->setvar($k, 1); + if (($this->_arrvars[$k] = $this->_arrayBuild($v)) == false) { + vlibTemplateError::raiseError('VT_WARNING_INVALID_ARR',WARNING,$k); + } + } + return true; + } + + /** + * FUNCTION: setDbLoop [** EXPERIMENTAL **] + * + * Function to create a loop from a Db result resource link. + * + * @param string $loopname to commit loop. If not set, will use last loopname set using newLoop() + * @param string $result link to a Db result resource + * @param string $db_type, type of db that the result resource belongs to. + * @return boolean true/false + * @access public + */ + function setDbLoop ($loopname, $result, $db_type='MYSQL') { + + /* + $db_type = strtoupper($db_type); + if (!in_array($db_type, $this->allowed_loop_dbs)) { + vlibTemplateError::raiseError('VT_WARNING_INVALID_LOOP_DB',WARNING, $db_type); + return false; + } + + $loop_arr = array(); + switch ($db_type) { + + case 'MYSQL': + if (get_resource_type($result) != 'mysql result') { + vlibTemplateError::raiseError('VT_WARNING_INVALID_RESOURCE',WARNING, $db_type); + return false; + } + while($r = mysql_fetch_assoc($result)) { + $loop_arr[] = $r; + } + break; + + case 'POSTGRESQL': + if (get_resource_type($result) != 'pgsql result') { + vlibTemplateError::raiseError('VT_WARNING_INVALID_RESOURCE',WARNING, $db_type); + return false; + } + + $nr = (function_exists('pg_num_rows')) ? pg_num_rows($result) : pg_numrows($result); + + for ($i=0; $i < $nr; $i++) { + $loop_arr[] = pg_fetch_array($result, $i, PGSQL_ASSOC); + } + break; + + case 'INFORMIX': + if (!$result) { + vlibTemplateError::raiseError('VT_WARNING_INVALID_RESOURCE',WARNING, $db_type); + return false; + } + while($r = ifx_fetch_row($result, 'NEXT')) { + $loop_arr[] = $r; + } + break; + + case 'INTERBASE': + if (get_resource_type($result) != 'interbase result') { + vlibTemplateError::raiseError('VT_WARNING_INVALID_RESOURCE',WARNING, $db_type); + return false; + } + while($r = ibase_fetch_row($result)) { + $loop_arr[] = $r; + } + break; + + case 'INGRES': + if (!$result) { + vlibTemplateError::raiseError('VT_WARNING_INVALID_RESOURCE',WARNING, $db_type); + return false; + } + while($r = ingres_fetch_array(INGRES_ASSOC, $result)) { + $loop_arr[] = $r; + } + break; + + case 'MSSQL': + if (get_resource_type($result) != 'mssql result') { + vlibTemplateError::raiseError('VT_WARNING_INVALID_RESOURCE',WARNING, $db_type); + return false; + } + while($r = mssql_fetch_array($result)) { + $loop_arr[] = $r; + } + break; + + case 'MSQL': + if (get_resource_type($result) != 'msql result') { + vlibTemplateError::raiseError('VT_WARNING_INVALID_RESOURCE',WARNING, $db_type); + return false; + } + while($r = msql_fetch_array($result, MSQL_ASSOC)) { + $loop_arr[] = $r; + } + break; + + case 'OCI8': + if (get_resource_type($result) != 'oci8 statement') { + vlibTemplateError::raiseError('VT_WARNING_INVALID_RESOURCE',WARNING, $db_type); + return false; + } + while(OCIFetchInto($result, &$r, OCI_ASSOC+OCI_RETURN_LOBS)) { + $loop_arr[] = $r; + } + break; + + case 'ORACLE': + if (get_resource_type($result) != 'oracle Cursor') { + vlibTemplateError::raiseError('VT_WARNING_INVALID_RESOURCE',WARNING, $db_type); + return false; + } + while(ora_fetch_into($result, &$r, ORA_FETCHINTO_ASSOC)) { + $loop_arr[] = $r; + } + break; + + case 'OVRIMOS': + if (!$result) { + vlibTemplateError::raiseError('VT_WARNING_INVALID_RESOURCE',WARNING, $db_type); + return false; + } + while(ovrimos_fetch_into($result, &$r, 'NEXT')) { + $loop_arr[] = $r; + } + break; + + case 'SYBASE': + if (get_resource_type($result) != 'sybase-db result') { + vlibTemplateError::raiseError('VT_WARNING_INVALID_RESOURCE',WARNING, $db_type); + return false; + } + + while($r = sybase_fetch_array($result)) { + $loop_arr[] = $r; + } + break; + } + $this->setLoop($loopname, $loop_arr); + return true; + */ + } + + /** + * FUNCTION: newLoop + * + * Sets the name for the curent loop in the 3 step loop process. + * + * @param string $name string to define loop name + * @return boolean true/false + * @access public + */ + function newLoop ($loopname) { + if (preg_match('/^[a-z_]+[a-z0-9_]*$/i', $loopname)) { + $this->_currloopname[$loopname] = $loopname; + $this->_currloop[$loopname] = array(); + return true; + } + else { + return false; + } + } + + /** + * FUNCTION: addRow + * + * Adds a row to the current loop in the 3 step loop process. + * + * @param array $row loop row to add to current loop + * @param string $loopname loop to which you want to add row, if not set will use last loop set using newLoop(). + * @return boolean true/false + * @access public + */ + function addRow ($row, $loopname=null) { + if (!$loopname) $loopname = $this->_currloopname[(count($this->_currloopname)-1)]; + + if (!isset($this->_currloop[$loopname]) || empty($this->_currloopname)) { + vlibTemplateError::raiseError('VT_WARNING_LOOP_NOT_SET',WARNING); + return false; + } + if (is_array($row)) { + $this->_currloop[$loopname][] = $row; + return true; + } + else { + return false; + } + } + + /** + * FUNCTION: addLoop + * + * Completes the 3 step loop process. This assigns the rows and resets + * the variables used. + * + * @param string $loopname to commit loop. If not set, will use last loopname set using newLoop() + * @return boolean true/false + * @access public + */ + function addLoop ($loopname=null) { + if ($loopname == null) { // add last loop used + if (!empty($this->_currloop)) { + foreach ($this->_currloop as $k => $v) { + $this->setLoop($k, $v); + unset($this->_currloop[$k]); + } + $this->_currloopname = array(); + return true; + } + else { + return false; + } + } + elseif (!isset($this->_currloop[$loopname]) || empty($this->_currloopname)) { // newLoop not yet envoked + vlibTemplateError::raiseError('VT_WARNING_LOOP_NOT_SET',WARNING); + return false; + } + else { // add a specific loop + $this->setLoop($loopname, $this->_currloop[$loopname]); + unset($this->_currloopname[$loopname], $this->_currloop[$loopname]); + } + return true; + } + + /** + * FUNCTION: unsetLoop + * + * Unsets a loop which has already been set. + * Can only unset top level loops. + * + * @param string loop to remove use: vlibTemplate::unsetLoop(loop[, loop..]) + * @return boolean true/false returns true unless called with 0 params + * @access public + */ + function unsetLoop () { + $num_args = func_num_args(); + if ($num_args < 1) return false; + + for ($i = 0; $i < $num_args; $i++) { + $var = func_get_arg($i); + if ($this->OPTIONS['CASELESS']) $var = strtolower($var); + if (!preg_match('/^[A-Za-z_]+[A-Za-z0-9_]*$/', $var)) continue; + unset($this->_arrvars[$var]); + } + return true; + } + + + /** + * FUNCTION: reset + * + * Resets the vlibTemplate object. After using vlibTemplate::reset() you must + * use vlibTemplate::newTemplate(tmpl) to reuse, not passing in the options array. + * + * @return boolean true + * @access public + */ + function reset () { + $this->clearVars(); + $this->clearLoops(); + $this->_tmplfilename = null; + $this->_tmplfile = null; + $this->_tmplfilep = null; + $this->_tmploutput = null; + $this->_parsed = false; + $this->_unknowns = array(); + $this->_firstparsetime = null; + $this->_totalparsetime = null; + $this->_currloopname = null; + $this->_currloop = array(); + return true; + } + + /** + * FUNCTION: clearVars + * + * Unsets all variables in the template + * + * @return boolean true + * @access public + */ + function clearVars () { + $this->_vars = array(); + return true; + } + + /** + * FUNCTION: clearLoops + * + * Unsets all loops in the template + * + * @return boolean true + * @access public + */ + function clearLoops () { + $this->_arrvars = array(); + $this->_currloopname = null; + $this->_currloop = array(); + return true; + } + + /** + * FUNCTION: clearAll + * + * Unsets all variables and loops set using setVar/Loop() + * + * @return boolean true + * @access public + */ + function clearAll () { + $this->clearVars(); + $this->clearLoops(); + return true; + } + + /** + * FUNCTION: unknownsExist + * + * Returns true if unknowns were found after parsing. + * Function MUST be called AFTER one of the parsing functions to have any relevance. + * + * @return boolean true/false + * @access public + */ + function unknownsExist () { + return (!empty($this->_unknowns)); + } + + /** + * FUNCTION: unknowns + * + * Alias for unknownsExist. + * + * @access public + */ + function unknowns () { + return $this->unknownsExist(); + } + + /** + * FUNCTION: getUnknowns + * + * Returns an array of all unknown vars found when parsing. + * This function is only relevant after parsing a document. + * + * @return array + * @access public + */ + function getUnknowns () { + return $this->_unknowns; + } + + /** + * FUNCTION: setUnknowns + * + * Sets how you want to handle variables that were found in the + * template but not set in vlibTemplate using vlibTemplate::setVar(). + * + * @param string $arg ignore, remove, print, leave or comment + * @return boolean + * @access public + */ + function setUnknowns ($arg) { + $arg = strtolower(trim($arg)); + if (preg_match('/^ignore|remove|print|leave|comment$/', $arg)) { + $this->OPTIONS['UNKNOWNS'] = $arg; + return true; + } + return false; + } + + /** + * FUNCTION: setPath + * + * function sets the paths to use when including files. + * Use of this function: vlibTemplate::setPath(string path [, string path, ..]); + * i.e. if $tmpl is your template object do: $tmpl->setPath('/web/htdocs/templates','/web/htdocs/www'); + * with as many paths as you like. + * if this function is called without any arguments, it will just delete any previously set paths. + * + * @param string path (mulitple) + * @return bool success + * @access public + */ + function setPath () { + $num_args = func_num_args(); + if ($num_args < 1) { + $this->OPTIONS['INCLUDE_PATHS'] = array(); + return true; + } + for ($i = 0; $i < $num_args; $i++) { + $thispath = func_get_arg($i); + array_push($this->OPTIONS['INCLUDE_PATHS'], realpath($thispath)); + } + return true; + } + + /** + * FUNCTION: getParseTime + * + * After using one of the parse functions, this will allow you + * access the time taken to parse the template. + * see OPTION 'TIME_PARSE'. + * + * @return float time taken to parse template + * @access public + */ + function getParseTime () { + if ($this->OPTIONS['TIME_PARSE'] && $this->_parsed) { + return $this->_totalparsetime; + } + return false; + } + + + /** + * FUNCTION: fastPrint + * + * Identical to pparse() except that it uses output buffering w/ gz compression thus + * printing the output directly and compressed if poss. + * Will possibly if parsing a huge template. + * + * @access public + * @return boolean true/false + */ + function fastPrint () { + $ret = $this->_parse('ob_gzhandler'); + print($this->_tmploutput); + return $ret; + } + + + /** + * FUNCTION: pparse + * + * Calls parse, and then prints out $this->_tmploutput + * + * @access public + * @return boolean true/false + */ + function pparse () { + if (!$this->_parsed) $this->_parse(); + print($this->_tmploutput); + return true; + } + + /** + * FUNCTION: pprint + * + * Alias for pparse() + * + * @access public + */ + function pprint () { + return $this->pparse(); + } + + + /** + * FUNCTION: grab + * + * Returns the parsed output, ready for printing, passing to mail() ...etc. + * Invokes $this->_parse() if template has not yet been parsed. + * + * @access public + * @return boolean true/false + */ + function grab () { + if (!$this->_parsed) $this->_parse(); + return $this->_tmploutput; + } + + /*-----------------------------------------------------------------------------\ + | private functions | + \-----------------------------------------------------------------------------*/ + + /** + * FUNCTION: vlibTemplate + * + * vlibTemplate constructor. + * if $tmplfile has been passed to it, it will send to $this->newTemplate() + * + * @param string $tmplfile full path to template file + * @param array $options see above + * @return boolean true/false + * @access private + */ + function tpl ($tmplfile=null, $options=null) { + if (is_array($tmplfile) && $options == null) { + $options = $tmplfile; + unset($tmplfile); + } + + $this->VLIBTEMPLATE_ROOT = dirname(realpath(__FILE__)); + + if (is_array(vlibIni::vlibTemplate())) { + foreach (vlibIni::vlibTemplate() as $name => $val) { + $this->OPTIONS[$name] = $val; + } + } + + if (is_array($options)) { + foreach($options as $key => $val) { + $key = strtoupper($key); + if ($key == 'PATH') { + $this->setPath($val); + } + else { + $this->_setOption($key, strtolower($val)); + } + } + } + if($tmplfile) $this->newTemplate($tmplfile); + if ($this->OPTIONS['GLOBAL_CONTEXT_VARS']) $this->setContextVars(); + return true; + } + + /** FUNCTION: _getData + * + * function returns the text from the file, or if we're using cache, the text + * from the cache file. MUST RETURN DATA. + * @param string tmplfile contains path to template file + * @param do_eval used for included files. If set then this function must do the eval()'ing. + * @access private + * @return mixed data/string or boolean + */ + function _getData ($tmplfile, $do_eval=false) { + //check the current file depth + if ($this->_includedepth > $this->OPTIONS['MAX_INCLUDES'] || $tmplfile == false) { + return; + } + else { + if ($this->_debug) array_push ($this->_debugIncludedfiles, $tmplfile); + if ($do_eval) { + array_push($this->_currentincludedir, dirname($tmplfile)); + $this->_includedepth++; + } + } + + + if($this->_cache && $this->_checkCache($tmplfile)) { // cache exists so lets use it + $data = fread($fp = fopen($this->_cachefile, 'r'), filesize($this->_cachefile)); + fclose($fp); + } + else { // no cache lets parse the file + $data = fread($fp = fopen($tmplfile, 'r'), filesize($tmplfile)); + fclose($fp); + + $regex = '/(<|<\/|{|{\/|){1}'; + $regex.= '/ie'; + //$regex.= '([\r\n|\n|\r])?/ie'; + $data = preg_replace($regex,"\$this->_parseTag(array('\\0','\\1','\\2','\\3','\\4','\\5','\\6','\\7','\\8','\\9'));",$data); + + if ($this->_cache) { // add cache if need be + $this->_createCache($data); + } + } + + // now we must parse the $data and check for any 's + if ($this->_debug) $this->doDebugWarnings(file($tmplfile), $tmplfile); + + if ($do_eval) { + $success = @eval('?>'.$data.'_includedepth--; + array_pop($this->_currentincludedir); + return $success; + } + else { + return $data; + } + + } + + /** + * FUNCTION: _fileSearch + * + * Searches for all possible instances of file { $file } + * + * @param string $file path of file we're looking for + * @access private + * @return mixed fullpath to file or boolean false + */ + function _fileSearch ($file) { + $filename = basename($file); + $filepath = dirname($file); + + // check fullpath first.. + $fullpath = $filepath.'/'.$filename; + if (is_file($fullpath)) return $fullpath; + + // ..then check for relative path for current directory.. + if (!empty($this->_currentincludedir)) { + $currdir = $this->_currentincludedir[(count($this->_currentincludedir) -1)]; + $relativepath = realpath($currdir.'/'.$filepath.'/'.$filename); + if (is_file($relativepath)) { + array_push ($this->_currentincludedir, dirname($relativepath)); + return $relativepath; + } + } + + // ..then check for relative path for all additional given paths.. + if (!empty($this->OPTIONS['INCLUDE_PATHS'])) { + foreach ($this->OPTIONS['INCLUDE_PATHS'] as $currdir) { + $relativepath = realpath($currdir.'/'.$filepath.'/'.$filename); + if (is_file($relativepath)) { + return $relativepath; + } + } + } + + // ..then check path from TEMPLATE_DIR.. + if (!empty($this->OPTIONS['TEMPLATE_DIR'])) { + $fullpath = realpath($this->OPTIONS['TEMPLATE_DIR'].'/'.$filepath.'/'.$filename); + if (is_file($fullpath)) return $fullpath; + } + + // ..then check relative path from executing php script.. + $fullpath = realpath($filepath.'/'.$filename); + if (is_file($fullpath)) return $fullpath; + + // ..then check path from template file. + if (!empty($this->VLIBTEMPLATE_ROOT)) { + $fullpath = realpath($this->VLIBTEMPLATE_ROOT.'/'.$filepath.'/'.$filename); + if (is_file($fullpath)) return $fullpath; + } + + return false; // uh oh, file not found + } + + /** + * FUNCTION: _arrayBuild + * + * Modifies the array $arr to add Template variables, __FIRST__, __LAST__ ..etc + * if $this->OPTIONS['LOOP_CONTEXT_VARS'] is true. + * Used by $this->setloop(). + * + * @param array $arr + * @return array new look array + * @access private + */ + function _arrayBuild ($arr) { + if (is_array($arr) && !empty($arr)) { + $arr = array_values($arr); // to prevent problems w/ non sequential arrays + for ($i = 0; $i < count($arr); $i++) { + if(!is_array($arr[$i])) return false; + foreach ($arr[$i] as $k => $v) { + unset($arr[$i][$k]); + if ($this->OPTIONS['CASELESS']) $k = strtolower($k); + if (preg_match('/^[0-9]+$/', $k)) $k = '_'.$k; + + if (is_array($v)) { + if (($arr[$i][$k] = $this->_arrayBuild($v)) == false) return false; + } + else { // reinsert the var + $arr[$i][$k] = $v; + } + } + if ($this->OPTIONS['LOOP_CONTEXT_VARS']) { + if ($i == 0) $arr[$i]['__FIRST__'] = true; + if (($i + 1) == count($arr)) $arr[$i]['__LAST__'] = true; + if ($i != 0 && (($i + 1) < count($arr))) $arr[$i]['__INNER__'] = true; + if (is_int(($i+1) / 2)) $arr[$i]['__EVEN__'] = true; + if (!is_int(($i+1) / 2)) $arr[$i]['__ODD__'] = true; + $arr[$i]['__ROWNUM__'] = ($i + 1); + } + } + return $arr; + } + elseif (empty($arr)) { + return true; + } + } + + /** + * FUNCTION: _parseIf + * returns a string used for parsing in tmpl_if statements. + * + * @param string $varname + * @param string $value + * @param string $op + * @param string $namespace current namespace + * @access private + * @return string used for eval'ing + */ + function _parseIf ($varname, $value=null, $op=null, $namespace=null) { + if (isset($namespace)) $namespace = substr($namespace, 0, -1); + $comp_str = ''; // used for extended if statements + + // work out what to put on the end id value="whatever" is used + if (isset($value)) { + + // add the correct operator depending on whether it's been specified or not + if (!empty($op)) { + if (in_array($op, $this->allowed_if_ops)) { + $comp_str .= $op; + } + else { + vlibTemplateError::raiseError('VT_WARNING_INVALID_IF_OP', WARNING, $op); + } + } + else { + $comp_str .= '=='; + } + + // now we add the value, if it's numeric, then we leave the quotes off + if (is_numeric($value)) { + $comp_str .= $value; + } + else { + $comp_str .= '\''.$value.'\''; + } + } + + if (count($this->_namespace) == 0 || $namespace == 'global') return '$this->_vars[\''.$varname.'\']'.$comp_str; + $retstr = '$this->_arrvars'; + $numnamespaces = count($this->_namespace); + for ($i=0; $i < $numnamespaces; $i++) { + if ($this->_namespace[$i] == $namespace || (($i + 1) == $numnamespaces && !empty($namespace))) { + $retstr .= "['".$namespace."'][\$_".$i."]"; + break 1; + } + else { + $retstr .= "['".$this->_namespace[$i]."'][\$_".$i."]"; + } + } + if ($this->OPTIONS['GLOBAL_VARS'] && empty($namespace)) { + return '(('.$retstr.'[\''.$varname.'\'] !== null) ? '.$retstr.'[\''.$varname.'\'] : $this->_vars[\''.$varname.'\'])'.$comp_str; + } + else { + return $retstr."['".$varname."']".$comp_str; + } + } + + + /** + * FUNCTION: _parseLoop + * returns a string used for parsing in tmpl_loop statements. + * + * @param string $varname + * @access private + * @return string used for eval'ing + */ + function _parseLoop ($varname) { + array_push($this->_namespace, $varname); + $tempvar = count($this->_namespace) - 1; + $retstr = "for (\$_".$tempvar."=0 ; \$_".$tempvar." < count(\$this->_arrvars"; + for ($i=0; $i < count($this->_namespace); $i++) { + $retstr .= "['".$this->_namespace[$i]."']"; + if ($this->_namespace[$i] != $varname) $retstr .= "[\$_".$i."]"; + } + return $retstr."); \$_".$tempvar."++) {"; + } + + /** + * FUNCTION: _parseVar + * + * returns a string used for parsing in tmpl_var statements. + * + * @param string $wholetag + * @param string $tag + * @param string $varname + * @param string $escape + * @param string $format + * @param string $namespace + * @access private + * @return string used for eval'ing + */ + function _parseVar ($wholetag, $tag, $varname, $escape, $format, $namespace) { + if (!empty($namespace)) $namespace = substr($namespace, 0, -1); + $wholetag = stripslashes($wholetag); + + if (count($this->_namespace) == 0 || $namespace == 'global') { + $var1 = '$this->_vars[\''.$varname.'\']'; + } + else { + $var1build = "\$this->_arrvars"; + $numnamespaces = count($this->_namespace); + for ($i=0; $i < $numnamespaces; $i++) { + if ($this->_namespace[$i] == $namespace || (($i + 1) == $numnamespaces && !empty($namespace))) { + $var1build .= "['".$namespace."'][\$_".$i."]"; + break 1; + } + else { + $var1build .= "['".$this->_namespace[$i]."'][\$_".$i."]"; + } + } + $var1 = $var1build . "['$varname']"; + if ($this->OPTIONS['GLOBAL_VARS'] && empty($namespace)) { + $var2 = '$this->_vars[\''.$varname.'\']'; + } + } + + $beforevar = ''; + $aftervar = ''; + if (!empty($escape)&& isset($this->ESCAPE_TAGS[$escape])) { + $beforevar .= $this->ESCAPE_TAGS[$escape]['open']; + $aftervar = $this->ESCAPE_TAGS[$escape]['close'] . $aftervar; + } + + if (!empty($format)&& isset($this->FORMAT_TAGS[$format])) { + $beforevar .= $this->FORMAT_TAGS[$format]['open']; + $aftervar = $this->FORMAT_TAGS[$format]['close'] . $aftervar; + } + + // build return values + $retstr = 'if ('.$var1.' !== null) { '; + $retstr .= 'print('.$beforevar.$var1.$aftervar.'); '; + $retstr .= '}'; + + if (@$var2) { + $retstr .= ' elseif ('.$var2.' !== null) { '; + $retstr .= 'print('.$beforevar.$var2.$aftervar.'); '; + $retstr .= '}'; + } + + switch (strtolower($this->OPTIONS['UNKNOWNS'])) { + case 'comment': + $comment = addcslashes('/', '', $wholetag).'//-->', '"'); + $retstr .= ' else { print("'.$comment.'"); $this->_setUnknown("'.$varname.'"); }'; + return $retstr; + break; + case 'leave': + $retstr .= ' else { print("'.addcslashes($wholetag, '"').'"); $this->_setUnknown("'.$varname.'"); }'; + return $retstr; + break; + case 'print': + $retstr .= ' else { print("'.htmlspecialchars($wholetag, ENT_QUOTES).'"); $this->_setUnknown("'.$varname.'"); }'; + return $retstr; + break; + + case 'ignore': + return $retstr; + break; + case 'remove': + default: + $retstr .= ' else { $this->_setUnknown("'.$varname.'"); }'; + return $retstr; + break; + } + } + + /** + * FUNCTION: _parseTag + * takes values from preg_replace in $this->_intparse() and determines + * the replace string. + * + * @param array $args array of all matches found by preg_replace + * @access private + * @return string replace values + */ + function _parseTag ($args) { + $wholetag = $args[0]; + $openclose = $args[1]; + $tag = strtolower($args[2]); + $newline = $args[9]; + //echo "1#$newline#2"; + + if ($tag == 'else') return ''.$newline; + if ($tag == 'tmpl_include') return $wholetag; // ignore tmpl_include tags + + if (preg_match("/^<\/|{\/| MYSQL: "utf-8" --> "utf8", "iso-8859-1" --> "latin1") + +define("DB_TYPE",$conf["db_type"]); +define("DB_HOST",$conf["db_host"]); +define("DB_DATABASE",$conf["db_database"]); +define("DB_USER",$conf["db_user"]); +define("DB_PASSWORD",$conf["db_password"]); +define("DB_CHARSET",$conf["db_charset"]); + + +//** Database settings for the master DB. This setting is only used in multiserver setups +$conf["dbmaster_type"] = 'mysql'; +$conf["dbmaster_host"] = ''; +$conf["dbmaster_database"] = 'dbispconfig'; +$conf["dbmaster_user"] = ''; +$conf["dbmaster_password"] = '1c70c5d027ce02c30afb43fd39f9015a'; + + +//** Paths +define('ISPC_ROOT_PATH', realpath(dirname(__FILE__).'/../')); // The main ROOT is the parent directory to this file, ie Interface/. NO trailing slashes. +define('ISPC_LIB_PATH', ISPC_ROOT_PATH.'/lib'); +define('ISPC_CLASS_PATH', ISPC_ROOT_PATH.'/lib/classes'); +define('ISPC_WEB_PATH', ISPC_ROOT_PATH.'/web'); +define('ISPC_THEMES_PATH', ISPC_ROOT_PATH.'/web/themes'); +define('ISPC_WEB_TEMP_PATH', ISPC_WEB_PATH.'/temp'); // Path for downloads, accessible via browser +define('ISPC_CACHE_PATH', ISPC_ROOT_PATH.'/cache'); + +//** Paths (Do not change!) +$conf["rootpath"] = substr(dirname(__FILE__),0,-4); +$conf["fs_div"] = "/"; // File system divider, "\\" on windows and "/"" on linux and unix +$conf["classpath"] = $conf["rootpath"].$conf["fs_div"]."lib".$conf["fs_div"]."classes"; +$conf["temppath"] = $conf["rootpath"].$conf["fs_div"]."temp"; + +define("FS_DIV",$conf["fs_div"]); +define("SERVER_ROOT",$conf["rootpath"]); +define("INCLUDE_ROOT",SERVER_ROOT.FS_DIV."lib"); +define("CLASSES_ROOT",INCLUDE_ROOT.FS_DIV."classes"); + + +//** Server +$conf['app_title'] = ISPC_APP_TITLE; +$conf['app_version'] = ISPC_APP_VERSION; +$conf['app_link'] = 'http://www.ispconfig.org/'; +$conf['modules_available'] = 'admin,mail,sites,monitor,client,dns,help'; +$conf["server_id"] = "1"; + + +//** Interface +define('ISPC_INTERFACE_MODULES_ENABLED', 'mail,sites,dns,tools'); + + +//** Logging +$conf["log_file"] = '/var/log/ispconfig/ispconfig.log'; +$conf["log_priority"] = 2; // 0 = Debug, 1 = Warning, 2 = Error + + +//** Allow software package installations +$conf['software_updates_enabled'] = false; + + +//** Themes +$conf["theme"] = 'default'; +$conf["html_content_encoding"] = 'utf-8'; // example: utf-8, iso-8859-1, ... +$conf["logo"] = 'themes/default/images/ispc_logo.png'; + + +//** Default Language +$conf["language"] = 'en'; +$conf["debug_language"] = false; + + +//** Misc. +$conf["interface_logout_url"] = ""; // example: http://www.domain.tld/ + + +//** Auto Load Modules +$conf["start_db"] = true; +$conf["start_session"] = true; + + +//** Constants +define("LOGLEVEL_DEBUG",0); +define("LOGLEVEL_WARN",1); +define("LOGLEVEL_ERROR",2); + +?> diff --git a/interface/ispconfig/server/lib/mysql_clientdb.conf b/interface/ispconfig/server/lib/mysql_clientdb.conf new file mode 100644 index 0000000000000000000000000000000000000000..b89c5079fdb9a5ef282d2bcfb10a4a6e67340fe8 --- /dev/null +++ b/interface/ispconfig/server/lib/mysql_clientdb.conf @@ -0,0 +1,7 @@ + \ No newline at end of file diff --git a/interface/ispconfig/server/mods-available/client_module.inc.php b/interface/ispconfig/server/mods-available/client_module.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..4d46f114e207ff7931ba51fd98876e60a765a294 --- /dev/null +++ b/interface/ispconfig/server/mods-available/client_module.inc.php @@ -0,0 +1,96 @@ +plugins->announceEvents($this->module_name,$this->actions_available); + + /* + As we want to get notified of any changes on several database tables, + we register for them. + + The following function registers the function "functionname" + to be executed when a record for the table "dbtable" is + processed in the sys_datalog. "classname" is the name of the + class that contains the function functionname. + */ + + $app->modules->registerTableHook('client',$this->module_name,'process'); + + } + + /* + This function is called when a change in one of the registered tables is detected. + The function then raises the events for the plugins. + */ + + function process($tablename,$action,$data) { + global $app; + + switch ($tablename) { + case 'client': + if($action == 'i') $app->plugins->raiseEvent('client_insert',$data); + if($action == 'u') $app->plugins->raiseEvent('client_update',$data); + if($action == 'd') $app->plugins->raiseEvent('client_delete',$data); + break; + } // end switch + } // end function + + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/mods-available/cron_module.inc.php b/interface/ispconfig/server/mods-available/cron_module.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..503d7ef7c257c781beae11784ad17d847dcb4c29 --- /dev/null +++ b/interface/ispconfig/server/mods-available/cron_module.inc.php @@ -0,0 +1,97 @@ +plugins->announceEvents($this->module_name,$this->actions_available); + + /* + As we want to get notified of any changes on several database tables, + we register for them. + + The following function registers the function "functionname" + to be executed when a record for the table "dbtable" is + processed in the sys_datalog. "classname" is the name of the + class that contains the function functionname. + */ + + $app->modules->registerTableHook('cron',$this->module_name,'process'); + + } + + /* + This function is called when a change in one of the registered tables is detected. + The function then raises the events for the plugins. + */ + + function process($tablename,$action,$data) { + global $app; + + switch ($tablename) { + case 'cron': + if($action == 'i') $app->plugins->raiseEvent('cron_insert',$data); + if($action == 'u') $app->plugins->raiseEvent('cron_update',$data); + if($action == 'd') $app->plugins->raiseEvent('cron_delete',$data); + break; + } // end switch + } // end function + + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/mods-available/database_module.inc.php b/interface/ispconfig/server/mods-available/database_module.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..2dac689ee7574ce09fece7a1bb507389153b3c9f --- /dev/null +++ b/interface/ispconfig/server/mods-available/database_module.inc.php @@ -0,0 +1,103 @@ +plugins->announceEvents($this->module_name,$this->actions_available); + + /* + As we want to get notified of any changes on several database tables, + we register for them. + + The following function registers the function "functionname" + to be executed when a record for the table "dbtable" is + processed in the sys_datalog. "classname" is the name of the + class that contains the function functionname. + */ + + $app->modules->registerTableHook('web_database','database_module','process'); + + // Register service + //$app->services->registerService('httpd','web_module','restartHttpd'); + + } + + /* + This function is called when a change in one of the registered tables is detected. + The function then raises the events for the plugins. + */ + + function process($tablename,$action,$data) { + global $app; + + switch ($tablename) { + case 'web_database': + if($action == 'i') $app->plugins->raiseEvent('database_insert',$data); + if($action == 'u') $app->plugins->raiseEvent('database_update',$data); + if($action == 'd') $app->plugins->raiseEvent('database_delete',$data); + break; + } // end switch + } // end function + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/mods-available/dns_module.inc.php b/interface/ispconfig/server/mods-available/dns_module.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..17c36bd2618de7cd153de5b3cc916f98b4c86155 --- /dev/null +++ b/interface/ispconfig/server/mods-available/dns_module.inc.php @@ -0,0 +1,128 @@ +plugins->announceEvents($this->module_name,$this->actions_available); + + /* + As we want to get notified of any changes on several database tables, + we register for them. + + The following function registers the function "functionname" + to be executed when a record for the table "dbtable" is + processed in the sys_datalog. "classname" is the name of the + class that contains the function functionname. + */ + + $app->modules->registerTableHook('dns_soa',$this->module_name,'process'); + $app->modules->registerTableHook('dns_rr',$this->module_name,'process'); + + + // Register service + $app->services->registerService('bind','dns_module','restartBind'); + + } + + /* + This function is called when a change in one of the registered tables is detected. + The function then raises the events for the plugins. + */ + + function process($tablename,$action,$data) { + global $app; + + switch ($tablename) { + case 'dns_soa': + if($action == 'i') $app->plugins->raiseEvent('dns_soa_insert',$data); + if($action == 'u') $app->plugins->raiseEvent('dns_soa_update',$data); + if($action == 'd') $app->plugins->raiseEvent('dns_soa_delete',$data); + break; + case 'dns_rr': + if($action == 'i') $app->plugins->raiseEvent('dns_rr_insert',$data); + if($action == 'u') $app->plugins->raiseEvent('dns_rr_update',$data); + if($action == 'd') $app->plugins->raiseEvent('dns_rr_delete',$data); + break; + } // end switch + } // end function + + + function restartBind($action = 'restart') { + global $app; + + $command = ''; + if(is_file('/etc/init.d/bind9')) { + $command = '/etc/init.d/bind9'; + } else { + $command = '/etc/init.d/named'; + } + + if($action == 'restart') { + exec($command.' restart'); + } else { + exec($command.' reload'); + } + + } + + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/mods-available/mail_module.inc.php b/interface/ispconfig/server/mods-available/mail_module.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..d0c33f2aee9d87e9277b0ca7a8ec6c316a7102f4 --- /dev/null +++ b/interface/ispconfig/server/mods-available/mail_module.inc.php @@ -0,0 +1,153 @@ +plugins->announceEvents($this->module_name,$this->actions_available); + + /* + As we want to get notified of any changes on several database tables, + we register for them. + + The following function registers the function "functionname" + to be executed when a record for the table "dbtable" is + processed in the sys_datalog. "classname" is the name of the + class that contains the function functionname. + */ + + $app->modules->registerTableHook('mail_access','mail_module','process'); + $app->modules->registerTableHook('mail_domain','mail_module','process'); + $app->modules->registerTableHook('mail_forwarding','mail_module','process'); + $app->modules->registerTableHook('mail_transport','mail_module','process'); + $app->modules->registerTableHook('mail_user','mail_module','process'); + $app->modules->registerTableHook('mail_get','mail_module','process'); + $app->modules->registerTableHook('mail_content_filter','mail_module','process'); + + } + + /* + This function is called when a change in one of the registered tables is detected. + The function then raises the events for the plugins. + */ + + function process($tablename,$action,$data) { + global $app; + + switch ($tablename) { + case 'mail_access': + if($action == 'i') $app->plugins->raiseEvent('mail_access_insert',$data); + if($action == 'u') $app->plugins->raiseEvent('mail_access_update',$data); + if($action == 'd') $app->plugins->raiseEvent('mail_access_delete',$data); + break; + case 'mail_domain': + if($action == 'i') $app->plugins->raiseEvent('mail_domain_insert',$data); + if($action == 'u') $app->plugins->raiseEvent('mail_domain_update',$data); + if($action == 'd') $app->plugins->raiseEvent('mail_domain_delete',$data); + break; + case 'mail_forwarding': + if($action == 'i') $app->plugins->raiseEvent('mail_forwarding_insert',$data); + if($action == 'u') $app->plugins->raiseEvent('mail_forwarding_update',$data); + if($action == 'd') $app->plugins->raiseEvent('mail_forwarding_delete',$data); + break; + case 'mail_transport': + if($action == 'i') $app->plugins->raiseEvent('mail_transport_insert',$data); + if($action == 'u') $app->plugins->raiseEvent('mail_transport_update',$data); + if($action == 'd') $app->plugins->raiseEvent('mail_transport_delete',$data); + break; + case 'mail_user': + if($action == 'i') $app->plugins->raiseEvent('mail_user_insert',$data); + if($action == 'u') $app->plugins->raiseEvent('mail_user_update',$data); + if($action == 'd') $app->plugins->raiseEvent('mail_user_delete',$data); + break; + case 'mail_get': + if($action == 'i') $app->plugins->raiseEvent('mail_get_insert',$data); + if($action == 'u') $app->plugins->raiseEvent('mail_get_update',$data); + if($action == 'd') $app->plugins->raiseEvent('mail_get_delete',$data); + break; + case 'mail_content_filter': + if($action == 'i') $app->plugins->raiseEvent('mail_content_filter_insert',$data); + if($action == 'u') $app->plugins->raiseEvent('mail_content_filter_update',$data); + if($action == 'd') $app->plugins->raiseEvent('mail_content_filter_delete',$data); + break; + } // end switch + } // end function + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/mods-available/monitor_core_module.inc.php b/interface/ispconfig/server/mods-available/monitor_core_module.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..8447baee348877e66c777a734be059caaf257dc1 --- /dev/null +++ b/interface/ispconfig/server/mods-available/monitor_core_module.inc.php @@ -0,0 +1,1465 @@ +plugins->announceEvents($this->module_name,$this->actions_available); + + /* + As we want to get notified of any changes on several database tables, + we register for them. + + The following function registers the function "functionname" + to be executed when a record for the table "dbtable" is + processed in the sys_datalog. "classname" is the name of the + class that contains the function functionname. + */ + /* none at them moment */ + //$app->modules->registerTableHook('mail_access','mail_module','process'); + + /* + Do the monitor every n minutes and write the result in the db + */ + $min = date('i'); + if (($min % $this->interval) == 0) + { + $this->doMonitor(); + } + } + + /* + This function is called when a change in one of the registered tables is detected. + The function then raises the events for the plugins. + */ + function process($tablename, $action, $data) { + // global $app; + // + // switch ($tablename) { + // case 'mail_access': + // if($action == 'i') $app->plugins->raiseEvent('mail_access_insert',$data); + // if($action == 'u') $app->plugins->raiseEvent('mail_access_update',$data); + // if($action == 'd') $app->plugins->raiseEvent('mail_access_delete',$data); + // break; + // } // end switch + } // end function + + /* + This method is called every n minutes, when the module ist loaded. + The method then does a system-monitoring + */ + // TODO: what monitoring is done should be a config-var + function doMonitor() + { + /* Calls the single Monitoring steps */ + $this->monitorServer(); + $this->monitorDiskUsage(); + $this->monitorMemUsage(); + $this->monitorCpu(); + $this->monitorServices(); + $this->monitorMailLog(); + $this->monitorMailWarnLog(); + $this->monitorMailErrLog(); + $this->monitorMessagesLog(); + $this->monitorISPCCronLog(); + $this->monitorFreshClamLog(); + $this->monitorClamAvLog(); + $this->monitorIspConfigLog(); + $this->monitorSystemUpdate(); + $this->monitorMailQueue(); + $this->monitorRaid(); + $this->monitorRkHunter(); + $this->monitorFail2ban(); + $this->monitorSysLog(); + } + + function monitorServer(){ + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'server_load'; + + /* + Fetch the data into a array + */ + $procUptime = shell_exec("cat /proc/uptime | cut -f1 -d' '"); + $data['up_days'] = floor($procUptime/86400); + $data['up_hours'] = floor(($procUptime-$data['up_days']*86400)/3600); + $data['up_minutes'] = floor(($procUptime-$data['up_days']*86400-$data['up_hours']*3600)/60); + + $data['uptime'] = shell_exec("uptime"); + + $tmp = explode(",", $data['uptime'], 4); + $tmpUser = explode(" ", trim($tmp[2])); + $data['user_online'] = intval($tmpUser[0]); + + /* Old Load Average Code + $loadTmp = explode(":" , trim($tmp[3])); + $load = explode(",", $loadTmp[1]); + $data['load_1'] = floatval(trim($load[0])); + $data['load_5'] = floatval(trim($load[1])); + $data['load_15'] = floatval(trim($load[2])); */ + + //* New Load Average code to fix "always zero" bug in non-english distros. NEEDS TESTING + $loadTmp = shell_exec("cat /proc/loadavg | cut -f1-3 -d' '"); + $load = explode(" ", $loadTmp); + $data['load_1'] = floatval(str_replace(',', '.', $load[0])); + $data['load_5'] = floatval(str_replace(',', '.', $load[1])); + $data['load_15'] = floatval(str_replace(',', '.', $load[2])); + + /** The state of the server-load. */ + $state = 'ok'; + if ($data['load_1'] > 20 ) $state = 'info'; + if ($data['load_1'] > 50 ) $state = 'warning'; + if ($data['load_1'] > 100 ) $state = 'critical'; + if ($data['load_1'] > 150 ) $state = 'error'; + + /* + Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + function monitorDiskUsage() { + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'disk_usage'; + + /** The state of the disk-usage */ + $state = 'ok'; + + /** Fetch the data of ALL devices into a array (needed for monitoring!)*/ + $dfData = shell_exec("df -hT"); + + // split into array + $df = explode("\n", $dfData); + + /* + * ignore the first line, process the rest + */ + for($i=1; $i <= sizeof($df); $i++){ + if ($df[$i] != '') + { + /* + * Make a array of the data + */ + $s = preg_split ("/[\s]+/", $df[$i]); + $data[$i]['fs'] = $s[0]; + $data[$i]['type'] = $s[1]; + $data[$i]['size'] = $s[2]; + $data[$i]['used'] = $s[3]; + $data[$i]['available'] = $s[4]; + $data[$i]['percent'] = $s[5]; + $data[$i]['mounted'] = $s[6]; + /* + * calculate the state + */ + $usePercent = floatval($data[$i]['percent']); + + //* We dont want to check the cdrom drive as a cd / dvd is always 100% full + if($data[$i]['type'] != 'iso9660' && $data[$i]['type'] != 'cramfs' && $data[$i]['type'] != 'udf') { + if ($usePercent > 75) $state = $this->_setState($state, 'info'); + if ($usePercent > 80) $state = $this->_setState($state, 'warning'); + if ($usePercent > 90) $state = $this->_setState($state, 'critical'); + if ($usePercent > 95) $state = $this->_setState($state, 'error'); + } + } + } + + + /* + Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + + function monitorMemUsage() + { + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'mem_usage'; + + /* + Fetch the data into a array + */ + $miData = shell_exec("cat /proc/meminfo"); + + $memInfo = explode("\n", $miData); + + foreach($memInfo as $line){ + $part = preg_split("/:/", $line); + $key = trim($part[0]); + $tmp = explode(" ", trim($part[1])); + $value = 0; + if ($tmp[1] == 'kB') $value = $tmp[0] * 1024; + $data[$key] = $value; + } + + /* + * actually this info has no state. + * maybe someone knows better...???... + */ + $state = 'no_state'; + + /* + Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + + function monitorCpu() + { + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'cpu_info'; + + /* + Fetch the data into a array + */ + $cpuData = shell_exec("cat /proc/cpuinfo"); + $cpuInfo = explode("\n", $cpuData); + $processor = 0; + + foreach($cpuInfo as $line){ + + $part = preg_split("/:/", $line); + $key = trim($part[0]); + $value = trim($part[1]); + if($key == 'processor') $processor = intval($value); + if($key != '') $data[$key.' '.$processor] = $value; + } + + /* the cpu has no state. It is, what it is */ + $state = 'no_state'; + + /* + Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + + function monitorServices() + { + global $app; + global $conf; + + /** the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** get the "active" Services of the server from the DB */ + $services = $app->dbmaster->queryOneRecord("SELECT * FROM server WHERE server_id = " . $server_id); + + /* The type of the Monitor-data */ + $type = 'services'; + + /** the State of the monitoring */ + /* ok, if ALL aktive services are running, + * error, if not + * There is no other state! + */ + $state = 'ok'; + + /* Monitor Webserver */ + $data['webserver'] = -1; // unknown - not needed + if ($services['web_server'] == 1) + { + if($this->_checkTcp('localhost', 80)) { + $data['webserver'] = 1; + } else { + $data['webserver'] = 0; + $state = 'error'; // because service is down + } + } + + /* Monitor FTP-Server */ + $data['ftpserver'] = -1; // unknown - not needed + if ($services['file_server'] == 1) + { + if($this->_checkFtp('localhost', 21)) { + $data['ftpserver'] = 1; + } else { + $data['ftpserver'] = 0; + $state = 'error'; // because service is down + } + } + + /* Monitor SMTP-Server */ + $data['smtpserver'] = -1; // unknown - not needed + if ($services['mail_server'] == 1) + { + if($this->_checkTcp('localhost', 25)) { + $data['smtpserver'] = 1; + } else { + $data['smtpserver'] = 0; + $state = 'error'; // because service is down + } + } + + /* Monitor POP3-Server */ + $data['pop3server'] = -1; // unknown - not needed + if ($services['mail_server'] == 1) + { + if($this->_checkTcp('localhost', 110)) { + $data['pop3server'] = 1; + } else { + $data['pop3server'] = 0; + $state = 'error'; // because service is down + } + } + + /* Monitor IMAP-Server */ + $data['imapserver'] = -1; // unknown - not needed + if ($services['mail_server'] == 1) + { + if($this->_checkTcp('localhost', 143)) { + $data['imapserver'] = 1; + } else { + $data['imapserver'] = 0; + $state = 'error'; // because service is down + } + } + + /* Monitor BIND-Server */ + $data['bindserver'] = -1; // unknown - not needed + if ($services['dns_server'] == 1) + { + if($this->_checkTcp('localhost', 53)) { + $data['bindserver'] = 1; + } else { + $data['bindserver'] = 0; + $state = 'error'; // because service is down + } + } + + /* Monitor MYSQL-Server */ + $data['mysqlserver'] = -1; // unknown - not needed + if ($services['db_server'] == 1) + { + if($this->_checkTcp('localhost', 3306)) { + $data['mysqlserver'] = 1; + } else { + $data['mysqlserver'] = 0; + $state = 'error'; // because service is down + } + } + + + /* + Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + + function monitorSystemUpdate(){ + /* + * This monitoring is expensive, so do it only once a hour + */ + $min = date('i'); + if ($min != 0) return; + + /* + * OK - here we go... + */ + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'system_update'; + + /* This monitoring is only available at debian or Ubuntu */ + if(file_exists('/etc/debian_version')){ + + /* + * first update the "update-database" + */ + shell_exec('apt-get update'); + + /* + * Then test the upgrade. + * if there is any output, then there is a needed update + */ + $aptData = shell_exec('apt-get -s -qq dist-upgrade'); + if ($aptData == '') + { + /* There is nothing to update! */ + $state = 'ok'; + } + else + { + /* There is something to update! */ + $state = 'warning'; + } + + /* + * Fetch the output + */ + $data['output'] = shell_exec('apt-get -s -q dist-upgrade'); + } + elseif (file_exists("/etc/gentoo-release")) { + + /* + * first update the portage tree + */ + + // In keeping with gentoo's rsync policy, don't update to frequently (every four hours - taken from http://www.gentoo.org/doc/en/source_mirrors.xml) + $do_update = true; + if (file_exists('/usr/portage/metadata/timestamp.chk')) + { + $datetime = file_get_contents('/usr/portage/metadata/timestamp.chk'); + $datetime = trim($datetime); + + $dstamp = strtotime($datetime); + if ($dstamp) + { + $checkat = $dstamp + 14400; // + 4hours + if (mktime() < $checkat) { + $do_update = false; + } + } + } + + if ($do_update) { + shell_exec('emerge --sync --quiet'); + } + + /* + * Then test the upgrade. + * if there is any output, then there is a needed update + */ + $emergeData = shell_exec('emerge -puDNt --color n --nospinner --quiet world'); + if ($emergeData == '') + { + /* There is nothing to update! */ + $state = 'ok'; + } + else + { + /* There is something to update! */ + $state = 'warning'; + } + + /* + * Fetch the output + */ + $data['output'] = shell_exec('emerge -pvuDNt --color n --nospinner world'); + } + else { + /* + * It is not debian/Ubuntu, so there is no data and no state + * + * no_state, NOT unknown, because "unknown" is shown as state + * inside the GUI. no_state is hidden. + * + * We have to write NO DATA inside the DB, because the GUI + * could not know, if there is any dat, or not... + */ + $state = 'no_state'; + $data['output']= ''; + } + + /* + * Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 0, 2); + } + + function monitorMailQueue(){ + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'mailq'; + + /* Get the data from the mailq */ + $data['output'] = shell_exec('mailq'); + + /* + * The last line has more informations + */ + $tmp = explode("\n", $data['output']); + $more = $tmp[sizeof($tmp) - 1]; + $this->_getIntArray($more); + $data['bytes'] = $res[0]; + $data['requests'] = $res[1]; + + /** The state of the mailq. */ + $state = 'ok'; + if ($data['requests'] > 2000 ) $state = 'info'; + if ($data['requests'] > 5000 ) $state = 'warning'; + if ($data['requests'] > 8000 ) $state = 'critical'; + if ($data['requests'] > 10000 ) $state = 'error'; + + /* + * Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + + function monitorRaid(){ + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'raid_state'; + + /* This monitoring is only available if mdadm is installed */ + $location = system('which mdadm', $retval); + if($retval === 0){ + /* + * Fetch the output + */ + $data['output'] = shell_exec('cat /proc/mdstat'); + + /* + * Then calc the state. + */ + $tmp = explode("\n", $data['output']); + $state = 'ok'; + for ($i = 0; $i < sizeof($tmp); $i++){ + /* fetch the next line */ + $line = $tmp[$i]; + + if ((strpos($line, '[U_]') !== false) || (strpos($line, '[_U]') !== false)) + { + /* One Disk is not working. + * if the next line starts with "[>" or "[=" then + * recovery (resync) is in state and the state is + * information instead of critical + */ + $nextLine = $tmp[$i+1]; + if ((strpos($nextLine, '[>') === false) && (strpos($nextLine, '[=') === false)) { + $state = $this->_setState($state, 'critical'); + } + else + { + $state = $this->_setState($state, 'info'); + } + } + if (strpos($line, '[__]') !== false) + { + /* both Disk are not working */ + $state = $this->_setState($state, 'error'); + } + if (strpos($line, '[UU]') !== false) + { + /* The disks are OK. + * if the next line starts with "[>" or "[=" then + * recovery (resync) is in state and the state is + * information instead of ok + */ + $nextLine = $tmp[$i+1]; + if ((strpos($nextLine, '[>') === false) && (strpos($nextLine, '[=') === false)) { + $state = $this->_setState($state, 'ok'); + } + else + { + $state = $this->_setState($state, 'info'); + } + } + } + + } + else { + /* + * mdadm is not installed, so there is no data and no state + * + * no_state, NOT unknown, because "unknown" is shown as state + * inside the GUI. no_state is hidden. + * + * We have to write NO DATA inside the DB, because the GUI + * could not know, if there is any dat, or not... + */ + $state = 'no_state'; + $data['output']= ''; + } + + /* + * Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + function monitorRkHunter(){ + /* + * This monitoring is expensive, so do it only once a day + */ + $min = date('i'); + $hour = date('H'); + if (!($min == 0 && $hour == 23)) return; + + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'rkhunter'; + + /* This monitoring is only available if rkhunter is installed */ + $location = system('which rkhunter', $retval); + if($retval === 0){ + /* + * Fetch the output + */ + $data['output'] = shell_exec('rkhunter --update --checkall --nocolors --skip-keypress'); + + /* + * At this moment, there is no state (maybe later) + */ + $state = 'no_state'; + } + else { + /* + * rkhunter is not installed, so there is no data and no state + * + * no_state, NOT unknown, because "unknown" is shown as state + * inside the GUI. no_state is hidden. + * + * We have to write NO DATA inside the DB, because the GUI + * could not know, if there is any dat, or not... + */ + $state = 'no_state'; + $data['output']= ''; + } + + /* + * Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 0, 2); + } + + function monitorFail2ban(){ + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'log_fail2ban'; + + /* This monitoring is only available if fail2ban is installed */ + $location = system('which fail2ban-client', $retval); // Debian, Ubuntu, Fedora + if($retval !== 0) $location = system('which fail2ban', $retval); // CentOS + if($retval === 0){ + /* Get the data of the log */ + $data = $this->_getLogData($type); + + /* + * At this moment, there is no state (maybe later) + */ + $state = 'no_state'; + } + else { + /* + * fail2ban is not installed, so there is no data and no state + * + * no_state, NOT unknown, because "unknown" is shown as state + * inside the GUI. no_state is hidden. + * + * We have to write NO DATA inside the DB, because the GUI + * could not know, if there is any dat, or not... + */ + $state = 'no_state'; + $data = ''; + } + + /* + * Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + function monitorSysLog(){ + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'sys_log'; + + /* + * is there any warning or error for this server? + */ + $state = 'ok'; + $dbData = $app->dbmaster->queryAllRecords("SELECT loglevel FROM sys_log WHERE server_id = " . $server_id . " AND loglevel > 0"); + if (is_array($dbData)) { + foreach($dbData as $item){ + if ($item['loglevel'] == 1) $state = $this->_setState($state, 'warning'); + if ($item['loglevel'] == 2) $state = $this->_setState($state, 'error'); + } + } + + /** There is no monitor-data because the data is in the sys_log table */ + $data['output']= ''; + + /* + * Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + function monitorMailLog() + { + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'log_mail'; + + /* Get the data of the log */ + $data = $this->_getLogData($type); + + /* + * actually this info has no state. + * maybe someone knows better...???... + */ + $state = 'no_state'; + + /* + Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + function monitorMailWarnLog() + { + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'log_mail_warn'; + + /* Get the data of the log */ + $data = $this->_getLogData($type); + + /* + * actually this info has no state. + * maybe someone knows better...???... + */ + $state = 'no_state'; + + /* + Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + function monitorMailErrLog() + { + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'log_mail_err'; + + /* Get the data of the log */ + $data = $this->_getLogData($type); + + /* + * actually this info has no state. + * maybe someone knows better...???... + */ + $state = 'no_state'; + + /* + Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + + function monitorMessagesLog() + { + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'log_messages'; + + /* Get the data of the log */ + $data = $this->_getLogData($type); + + /* + * actually this info has no state. + * maybe someone knows better...???... + */ + $state = 'no_state'; + + /* + Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + function monitorISPCCronLog() + { + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'log_ispc_cron'; + + /* Get the data of the log */ + $data = $this->_getLogData($type); + + /* + * actually this info has no state. + * maybe someone knows better...???... + */ + $state = 'no_state'; + + /* + Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + function monitorFreshClamLog() + { + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'log_freshclam'; + + /* Get the data of the log */ + $data = $this->_getLogData($type); + + /* Get the data from the LAST log-Entry. + * if there can be found: + * WARNING: Your ClamAV installation is OUTDATED! + * then the clamav is outdated. This is a warning! + */ + $state = 'ok'; + + $tmp = explode("\n", $data); + $lastLog = array(); + if ($tmp[sizeof($tmp)-1] == "") + { + /* the log ends with an empty line remove this */ + array_pop($tmp); + } + if (strpos($tmp[sizeof($tmp)-1], "-------------") !== false) + { + /* the log ends with "-----..." remove this */ + array_pop($tmp); + } + for ($i = sizeof($tmp) -1; $i > 0; $i--){ + if (strpos($tmp[$i], "---------") === false){ + /* no delimiter found, so add this to the last-log */ + $lastLog[] = $tmp[$i]; + } + else + { + /* delimiter found, so there is no more line left! */ + break; + } + } + + /* + * Now we have the last log in the array. + * Check if the outdated-string is found... + */ + foreach($lastLog as $line){ + if (strpos(strtolower($line), "outdated") !== false) { + $state = $this->_setState($state, 'warning'); + } + } + + /* + Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + function monitorClamAvLog() + { + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'log_clamav'; + + /* Get the data of the log */ + $data = $this->_getLogData($type); + + // Todo: the state should be calculated. + $state = 'ok'; + + /* + Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + function monitorIspConfigLog() + { + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'log_ispconfig'; + + /* Get the data of the log */ + $data = $this->_getLogData($type); + + // Todo: the state should be calculated. + $state = 'ok'; + + /* + Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + + function _getLogData($log){ + + $dist = ''; + $logfile = ''; + + if(@is_file('/etc/debian_version')) $dist = 'debian'; + if(@is_file('/etc/redhat-release')) $dist = 'redhat'; + if(@is_file('/etc/SuSE-release')) $dist = 'suse'; + if(@is_file('/etc/gentoo-release')) $dist = 'gentoo'; + + switch($log) { + case 'log_mail': + if($dist == 'debian') $logfile = '/var/log/mail.log'; + if($dist == 'redhat') $logfile = '/var/log/maillog'; + if($dist == 'suse') $logfile = '/var/log/mail.info'; + if($dist == 'gentoo') $logfile = '/var/log/maillog'; + break; + case 'log_mail_warn': + if($dist == 'debian') $logfile = '/var/log/mail.warn'; + if($dist == 'redhat') $logfile = '/var/log/maillog'; + if($dist == 'suse') $logfile = '/var/log/mail.warn'; + if($dist == 'gentoo') $logfile = '/var/log/maillog'; + break; + case 'log_mail_err': + if($dist == 'debian') $logfile = '/var/log/mail.err'; + if($dist == 'redhat') $logfile = '/var/log/maillog'; + if($dist == 'suse') $logfile = '/var/log/mail.err'; + if($dist == 'gentoo') $logfile = '/var/log/maillog'; + break; + case 'log_messages': + if($dist == 'debian') $logfile = '/var/log/messages'; + if($dist == 'redhat') $logfile = '/var/log/messages'; + if($dist == 'suse') $logfile = '/var/log/messages'; + if($dist == 'gentoo') $logfile = '/var/log/messages'; + break; + case 'log_ispc_cron': + if($dist == 'debian') $logfile = '/var/log/ispconfig/cron.log'; + if($dist == 'redhat') $logfile = '/var/log/ispconfig/cron.log'; + if($dist == 'suse') $logfile = '/var/log/ispconfig/cron.log'; + if($dist == 'gentoo') $logfile = '/var/log/cron'; + break; + case 'log_freshclam': + if($dist == 'debian') $logfile = '/var/log/clamav/freshclam.log'; + if($dist == 'redhat') $logfile = (is_file('/var/log/clamav/freshclam.log') ? '/var/log/clamav/freshclam.log' : '/var/log/freshclam.log'); + if($dist == 'suse') $logfile = ''; + if($dist == 'gentoo') $logfile = '/var/log/clamav/freshclam.log'; + break; + case 'log_clamav': + if($dist == 'debian') $logfile = '/var/log/clamav/clamav.log'; + if($dist == 'redhat') $logfile = (is_file('/var/log/clamav/clamd.log') ? '/var/log/clamav/clamd.log' : '/var/log/maillog'); + if($dist == 'suse') $logfile = ''; + if($dist == 'gentoo') $logfile = '/var/log/clamav/clamd.log'; + break; + case 'log_fail2ban': + if($dist == 'debian') $logfile = '/var/log/fail2ban.log'; + if($dist == 'redhat') $logfile = '/var/log/fail2ban.log'; + if($dist == 'suse') $logfile = '/var/log/fail2ban.log'; + if($dist == 'gentoo') $logfile = '/var/log/fail2ban.log'; + break; + case 'log_ispconfig': + if($dist == 'debian') $logfile = '/var/log/ispconfig/ispconfig.log'; + if($dist == 'redhat') $logfile = '/var/log/ispconfig/ispconfig.log'; + if($dist == 'suse') $logfile = '/var/log/ispconfig/ispconfig.log'; + if($dist == 'gentoo') $logfile = '/var/log/ispconfig/ispconfig.log'; + break; + default: + $logfile = ''; + break; + } + + // Getting the logfile content + if($logfile != '') { + $logfile = escapeshellcmd($logfile); + if(stristr($logfile, ';') or substr($logfile,0,9) != '/var/log/' or stristr($logfile, '..')) { + $log = 'Logfile path error.'; + } + else + { + $log = ''; + if(is_readable($logfile)) { + if($fd = popen("tail -n 100 $logfile", 'r')) { + while (!feof($fd)) { + $log .= fgets($fd, 4096); + $n++; + if($n > 1000) break; + } + fclose($fd); + } + } else { + $log = 'Unable to read '.$logfile; + } + } + } + + return $log; + } + + function _checkTcp ($host,$port) { + + $fp = @fsockopen ($host, $port, $errno, $errstr, 2); + + if ($fp) { + fclose($fp); + return true; + } else { + return false; + } + } + + function _checkUdp ($host,$port) { + + $fp = @fsockopen ('udp://'.$host, $port, $errno, $errstr, 2); + + if ($fp) { + fclose($fp); + return true; + } else { + return false; + } + } + + function _checkFtp ($host,$port){ + + $conn_id = @ftp_connect($host, $port); + + if($conn_id){ + @ftp_close($conn_id); + return true; + } else { + return false; + } + } + + /* + Deletes Records older than n. + */ + function _delOldRecords($type, $min, $hour=0, $days=0) { + global $app; + + $now = time(); + $old = $now - ($min * 60) - ($hour * 60 * 60) - ($days * 24 * 60 * 60); + $sql = "DELETE FROM monitor_data " . + "WHERE " . + "type =" . "'" . $app->dbmaster->quote($type) . "' " . + "AND " . + "created < " . $old; + $app->dbmaster->query($sql); + } + + /* + * Set the state to the given level (or higher, but not lesser). + * * If the actual state is critical and you call the method with ok, + * then the state is critical. + * + * * If the actual state is critical and you call the method with error, + * then the state is error. + */ + function _setState($oldState, $newState) + { + /* + * Calculate the weight of the old state + */ + switch ($oldState) { + case 'no_state': $oldInt = 0; + break; + case 'ok': $oldInt = 1; + break; + case 'unknown': $oldInt = 2; + break; + case 'info': $oldInt = 3; + break; + case 'warning': $oldInt = 4; + break; + case 'critical': $oldInt = 5; + break; + case 'error': $oldInt = 6; + break; + } + /* + * Calculate the weight of the new state + */ + switch ($newState) { + case 'no_state': $newInt = 0 ; + break; + case 'ok': $newInt = 1 ; + break; + case 'unknown': $newInt = 2 ; + break; + case 'info': $newInt = 3 ; + break; + case 'warning': $newInt = 4 ; + break; + case 'critical': $newInt = 5 ; + break; + case 'error': $newInt = 6 ; + break; + } + + /* + * Set to the higher level + */ + if ($newInt > $oldInt){ + return $newState; + } + else + { + return $oldState; + } + } + + function _getIntArray($line){ + /** The array of float found */ + $res = array(); + /* First build a array from the line */ + $data = explode(' ', $line); + /* then check if any item is a float */ + foreach ($data as $item) { + if ($item . '' == (int)$item . ''){ + $res[] = $item; + } + } + return $res; + } + + +} // end class + +?> diff --git a/interface/ispconfig/server/mods-available/server_module.inc.php b/interface/ispconfig/server/mods-available/server_module.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..894c972539cc004c8e47f5b2c4ffdc24e84c44f4 --- /dev/null +++ b/interface/ispconfig/server/mods-available/server_module.inc.php @@ -0,0 +1,137 @@ +plugins->announceEvents($this->module_name,$this->actions_available); + + /* + As we want to get notified of any changes on several database tables, + we register for them. + + The following function registers the function "functionname" + to be executed when a record for the table "dbtable" is + processed in the sys_datalog. "classname" is the name of the + class that contains the function functionname. + */ + + $app->modules->registerTableHook('server','server_module','process'); + $app->modules->registerTableHook('server_ip','server_module','process'); + $app->modules->registerTableHook('firewall','server_module','process'); + $app->modules->registerTableHook('software_update_inst','server_module','process'); + + // Register service + //$app->services->registerService('httpd','web_module','restartHttpd'); + + } + + /* + This function is called when a change in one of the registered tables is detected. + The function then raises the events for the plugins. + */ + + function process($tablename,$action,$data) { + global $app; + + switch ($tablename) { + case 'server': + if($action == 'i') $app->plugins->raiseEvent('server_insert',$data); + if($action == 'u') $app->plugins->raiseEvent('server_update',$data); + if($action == 'd') $app->plugins->raiseEvent('server_delete',$data); + break; + case 'server_ip': + if($action == 'i') $app->plugins->raiseEvent('server_ip_insert',$data); + if($action == 'u') $app->plugins->raiseEvent('server_ip_update',$data); + if($action == 'd') $app->plugins->raiseEvent('server_ip_delete',$data); + break; + case 'firewall': + if($action == 'i') $app->plugins->raiseEvent('firewall_insert',$data); + if($action == 'u') $app->plugins->raiseEvent('firewall_update',$data); + if($action == 'd') $app->plugins->raiseEvent('firewall_delete',$data); + break; + case 'software_update_inst': + if($action == 'i') $app->plugins->raiseEvent('software_update_inst_insert',$data); + if($action == 'u') $app->plugins->raiseEvent('software_update_inst_update',$data); + if($action == 'd') $app->plugins->raiseEvent('software_update_inst_delete',$data); + break; + } // end switch + } // end function + + /* + // This function is used + function restartHttpd($action = 'restart') { + global $app; + if($action == 'restart') { + exec('/etc/init.d/apache2 restart'); + } else { + exec('/etc/init.d/apache2 reload'); + } + } + */ + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/mods-available/web_module.inc.php b/interface/ispconfig/server/mods-available/web_module.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..3ddeca5ed87360927c9a9fc91e81b7d8da8ba867 --- /dev/null +++ b/interface/ispconfig/server/mods-available/web_module.inc.php @@ -0,0 +1,140 @@ +plugins->announceEvents($this->module_name,$this->actions_available); + + /* + As we want to get notified of any changes on several database tables, + we register for them. + + The following function registers the function "functionname" + to be executed when a record for the table "dbtable" is + processed in the sys_datalog. "classname" is the name of the + class that contains the function functionname. + */ + + $app->modules->registerTableHook('web_domain','web_module','process'); + $app->modules->registerTableHook('ftp_user','web_module','process'); + $app->modules->registerTableHook('shell_user','web_module','process'); + + // Register service + $app->services->registerService('httpd','web_module','restartHttpd'); + + } + + /* + This function is called when a change in one of the registered tables is detected. + The function then raises the events for the plugins. + */ + + function process($tablename,$action,$data) { + global $app; + + switch ($tablename) { + case 'web_domain': + if($action == 'i') $app->plugins->raiseEvent('web_domain_insert',$data); + if($action == 'u') $app->plugins->raiseEvent('web_domain_update',$data); + if($action == 'd') $app->plugins->raiseEvent('web_domain_delete',$data); + break; + case 'ftp_user': + if($action == 'i') $app->plugins->raiseEvent('ftp_user_insert',$data); + if($action == 'u') $app->plugins->raiseEvent('ftp_user_update',$data); + if($action == 'd') $app->plugins->raiseEvent('ftp_user_delete',$data); + break; + case 'shell_user': + if($action == 'i') $app->plugins->raiseEvent('shell_user_insert',$data); + if($action == 'u') $app->plugins->raiseEvent('shell_user_update',$data); + if($action == 'd') $app->plugins->raiseEvent('shell_user_delete',$data); + break; + } // end switch + } // end function + + + // This function is used + function restartHttpd($action = 'restart') { + global $app; + + $command = ''; + if(is_file('/etc/init.d/httpd')) { + $command = '/etc/init.d/httpd'; + } else { + $command = '/etc/init.d/apache2'; + } + + if($action == 'restart') { + exec($command.' restart'); + } else { + exec($command.' reload'); + } + + } + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/mods-core/monitor_core_module.inc.php b/interface/ispconfig/server/mods-core/monitor_core_module.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..8447baee348877e66c777a734be059caaf257dc1 --- /dev/null +++ b/interface/ispconfig/server/mods-core/monitor_core_module.inc.php @@ -0,0 +1,1465 @@ +plugins->announceEvents($this->module_name,$this->actions_available); + + /* + As we want to get notified of any changes on several database tables, + we register for them. + + The following function registers the function "functionname" + to be executed when a record for the table "dbtable" is + processed in the sys_datalog. "classname" is the name of the + class that contains the function functionname. + */ + /* none at them moment */ + //$app->modules->registerTableHook('mail_access','mail_module','process'); + + /* + Do the monitor every n minutes and write the result in the db + */ + $min = date('i'); + if (($min % $this->interval) == 0) + { + $this->doMonitor(); + } + } + + /* + This function is called when a change in one of the registered tables is detected. + The function then raises the events for the plugins. + */ + function process($tablename, $action, $data) { + // global $app; + // + // switch ($tablename) { + // case 'mail_access': + // if($action == 'i') $app->plugins->raiseEvent('mail_access_insert',$data); + // if($action == 'u') $app->plugins->raiseEvent('mail_access_update',$data); + // if($action == 'd') $app->plugins->raiseEvent('mail_access_delete',$data); + // break; + // } // end switch + } // end function + + /* + This method is called every n minutes, when the module ist loaded. + The method then does a system-monitoring + */ + // TODO: what monitoring is done should be a config-var + function doMonitor() + { + /* Calls the single Monitoring steps */ + $this->monitorServer(); + $this->monitorDiskUsage(); + $this->monitorMemUsage(); + $this->monitorCpu(); + $this->monitorServices(); + $this->monitorMailLog(); + $this->monitorMailWarnLog(); + $this->monitorMailErrLog(); + $this->monitorMessagesLog(); + $this->monitorISPCCronLog(); + $this->monitorFreshClamLog(); + $this->monitorClamAvLog(); + $this->monitorIspConfigLog(); + $this->monitorSystemUpdate(); + $this->monitorMailQueue(); + $this->monitorRaid(); + $this->monitorRkHunter(); + $this->monitorFail2ban(); + $this->monitorSysLog(); + } + + function monitorServer(){ + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'server_load'; + + /* + Fetch the data into a array + */ + $procUptime = shell_exec("cat /proc/uptime | cut -f1 -d' '"); + $data['up_days'] = floor($procUptime/86400); + $data['up_hours'] = floor(($procUptime-$data['up_days']*86400)/3600); + $data['up_minutes'] = floor(($procUptime-$data['up_days']*86400-$data['up_hours']*3600)/60); + + $data['uptime'] = shell_exec("uptime"); + + $tmp = explode(",", $data['uptime'], 4); + $tmpUser = explode(" ", trim($tmp[2])); + $data['user_online'] = intval($tmpUser[0]); + + /* Old Load Average Code + $loadTmp = explode(":" , trim($tmp[3])); + $load = explode(",", $loadTmp[1]); + $data['load_1'] = floatval(trim($load[0])); + $data['load_5'] = floatval(trim($load[1])); + $data['load_15'] = floatval(trim($load[2])); */ + + //* New Load Average code to fix "always zero" bug in non-english distros. NEEDS TESTING + $loadTmp = shell_exec("cat /proc/loadavg | cut -f1-3 -d' '"); + $load = explode(" ", $loadTmp); + $data['load_1'] = floatval(str_replace(',', '.', $load[0])); + $data['load_5'] = floatval(str_replace(',', '.', $load[1])); + $data['load_15'] = floatval(str_replace(',', '.', $load[2])); + + /** The state of the server-load. */ + $state = 'ok'; + if ($data['load_1'] > 20 ) $state = 'info'; + if ($data['load_1'] > 50 ) $state = 'warning'; + if ($data['load_1'] > 100 ) $state = 'critical'; + if ($data['load_1'] > 150 ) $state = 'error'; + + /* + Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + function monitorDiskUsage() { + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'disk_usage'; + + /** The state of the disk-usage */ + $state = 'ok'; + + /** Fetch the data of ALL devices into a array (needed for monitoring!)*/ + $dfData = shell_exec("df -hT"); + + // split into array + $df = explode("\n", $dfData); + + /* + * ignore the first line, process the rest + */ + for($i=1; $i <= sizeof($df); $i++){ + if ($df[$i] != '') + { + /* + * Make a array of the data + */ + $s = preg_split ("/[\s]+/", $df[$i]); + $data[$i]['fs'] = $s[0]; + $data[$i]['type'] = $s[1]; + $data[$i]['size'] = $s[2]; + $data[$i]['used'] = $s[3]; + $data[$i]['available'] = $s[4]; + $data[$i]['percent'] = $s[5]; + $data[$i]['mounted'] = $s[6]; + /* + * calculate the state + */ + $usePercent = floatval($data[$i]['percent']); + + //* We dont want to check the cdrom drive as a cd / dvd is always 100% full + if($data[$i]['type'] != 'iso9660' && $data[$i]['type'] != 'cramfs' && $data[$i]['type'] != 'udf') { + if ($usePercent > 75) $state = $this->_setState($state, 'info'); + if ($usePercent > 80) $state = $this->_setState($state, 'warning'); + if ($usePercent > 90) $state = $this->_setState($state, 'critical'); + if ($usePercent > 95) $state = $this->_setState($state, 'error'); + } + } + } + + + /* + Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + + function monitorMemUsage() + { + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'mem_usage'; + + /* + Fetch the data into a array + */ + $miData = shell_exec("cat /proc/meminfo"); + + $memInfo = explode("\n", $miData); + + foreach($memInfo as $line){ + $part = preg_split("/:/", $line); + $key = trim($part[0]); + $tmp = explode(" ", trim($part[1])); + $value = 0; + if ($tmp[1] == 'kB') $value = $tmp[0] * 1024; + $data[$key] = $value; + } + + /* + * actually this info has no state. + * maybe someone knows better...???... + */ + $state = 'no_state'; + + /* + Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + + function monitorCpu() + { + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'cpu_info'; + + /* + Fetch the data into a array + */ + $cpuData = shell_exec("cat /proc/cpuinfo"); + $cpuInfo = explode("\n", $cpuData); + $processor = 0; + + foreach($cpuInfo as $line){ + + $part = preg_split("/:/", $line); + $key = trim($part[0]); + $value = trim($part[1]); + if($key == 'processor') $processor = intval($value); + if($key != '') $data[$key.' '.$processor] = $value; + } + + /* the cpu has no state. It is, what it is */ + $state = 'no_state'; + + /* + Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + + function monitorServices() + { + global $app; + global $conf; + + /** the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** get the "active" Services of the server from the DB */ + $services = $app->dbmaster->queryOneRecord("SELECT * FROM server WHERE server_id = " . $server_id); + + /* The type of the Monitor-data */ + $type = 'services'; + + /** the State of the monitoring */ + /* ok, if ALL aktive services are running, + * error, if not + * There is no other state! + */ + $state = 'ok'; + + /* Monitor Webserver */ + $data['webserver'] = -1; // unknown - not needed + if ($services['web_server'] == 1) + { + if($this->_checkTcp('localhost', 80)) { + $data['webserver'] = 1; + } else { + $data['webserver'] = 0; + $state = 'error'; // because service is down + } + } + + /* Monitor FTP-Server */ + $data['ftpserver'] = -1; // unknown - not needed + if ($services['file_server'] == 1) + { + if($this->_checkFtp('localhost', 21)) { + $data['ftpserver'] = 1; + } else { + $data['ftpserver'] = 0; + $state = 'error'; // because service is down + } + } + + /* Monitor SMTP-Server */ + $data['smtpserver'] = -1; // unknown - not needed + if ($services['mail_server'] == 1) + { + if($this->_checkTcp('localhost', 25)) { + $data['smtpserver'] = 1; + } else { + $data['smtpserver'] = 0; + $state = 'error'; // because service is down + } + } + + /* Monitor POP3-Server */ + $data['pop3server'] = -1; // unknown - not needed + if ($services['mail_server'] == 1) + { + if($this->_checkTcp('localhost', 110)) { + $data['pop3server'] = 1; + } else { + $data['pop3server'] = 0; + $state = 'error'; // because service is down + } + } + + /* Monitor IMAP-Server */ + $data['imapserver'] = -1; // unknown - not needed + if ($services['mail_server'] == 1) + { + if($this->_checkTcp('localhost', 143)) { + $data['imapserver'] = 1; + } else { + $data['imapserver'] = 0; + $state = 'error'; // because service is down + } + } + + /* Monitor BIND-Server */ + $data['bindserver'] = -1; // unknown - not needed + if ($services['dns_server'] == 1) + { + if($this->_checkTcp('localhost', 53)) { + $data['bindserver'] = 1; + } else { + $data['bindserver'] = 0; + $state = 'error'; // because service is down + } + } + + /* Monitor MYSQL-Server */ + $data['mysqlserver'] = -1; // unknown - not needed + if ($services['db_server'] == 1) + { + if($this->_checkTcp('localhost', 3306)) { + $data['mysqlserver'] = 1; + } else { + $data['mysqlserver'] = 0; + $state = 'error'; // because service is down + } + } + + + /* + Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + + function monitorSystemUpdate(){ + /* + * This monitoring is expensive, so do it only once a hour + */ + $min = date('i'); + if ($min != 0) return; + + /* + * OK - here we go... + */ + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'system_update'; + + /* This monitoring is only available at debian or Ubuntu */ + if(file_exists('/etc/debian_version')){ + + /* + * first update the "update-database" + */ + shell_exec('apt-get update'); + + /* + * Then test the upgrade. + * if there is any output, then there is a needed update + */ + $aptData = shell_exec('apt-get -s -qq dist-upgrade'); + if ($aptData == '') + { + /* There is nothing to update! */ + $state = 'ok'; + } + else + { + /* There is something to update! */ + $state = 'warning'; + } + + /* + * Fetch the output + */ + $data['output'] = shell_exec('apt-get -s -q dist-upgrade'); + } + elseif (file_exists("/etc/gentoo-release")) { + + /* + * first update the portage tree + */ + + // In keeping with gentoo's rsync policy, don't update to frequently (every four hours - taken from http://www.gentoo.org/doc/en/source_mirrors.xml) + $do_update = true; + if (file_exists('/usr/portage/metadata/timestamp.chk')) + { + $datetime = file_get_contents('/usr/portage/metadata/timestamp.chk'); + $datetime = trim($datetime); + + $dstamp = strtotime($datetime); + if ($dstamp) + { + $checkat = $dstamp + 14400; // + 4hours + if (mktime() < $checkat) { + $do_update = false; + } + } + } + + if ($do_update) { + shell_exec('emerge --sync --quiet'); + } + + /* + * Then test the upgrade. + * if there is any output, then there is a needed update + */ + $emergeData = shell_exec('emerge -puDNt --color n --nospinner --quiet world'); + if ($emergeData == '') + { + /* There is nothing to update! */ + $state = 'ok'; + } + else + { + /* There is something to update! */ + $state = 'warning'; + } + + /* + * Fetch the output + */ + $data['output'] = shell_exec('emerge -pvuDNt --color n --nospinner world'); + } + else { + /* + * It is not debian/Ubuntu, so there is no data and no state + * + * no_state, NOT unknown, because "unknown" is shown as state + * inside the GUI. no_state is hidden. + * + * We have to write NO DATA inside the DB, because the GUI + * could not know, if there is any dat, or not... + */ + $state = 'no_state'; + $data['output']= ''; + } + + /* + * Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 0, 2); + } + + function monitorMailQueue(){ + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'mailq'; + + /* Get the data from the mailq */ + $data['output'] = shell_exec('mailq'); + + /* + * The last line has more informations + */ + $tmp = explode("\n", $data['output']); + $more = $tmp[sizeof($tmp) - 1]; + $this->_getIntArray($more); + $data['bytes'] = $res[0]; + $data['requests'] = $res[1]; + + /** The state of the mailq. */ + $state = 'ok'; + if ($data['requests'] > 2000 ) $state = 'info'; + if ($data['requests'] > 5000 ) $state = 'warning'; + if ($data['requests'] > 8000 ) $state = 'critical'; + if ($data['requests'] > 10000 ) $state = 'error'; + + /* + * Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + + function monitorRaid(){ + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'raid_state'; + + /* This monitoring is only available if mdadm is installed */ + $location = system('which mdadm', $retval); + if($retval === 0){ + /* + * Fetch the output + */ + $data['output'] = shell_exec('cat /proc/mdstat'); + + /* + * Then calc the state. + */ + $tmp = explode("\n", $data['output']); + $state = 'ok'; + for ($i = 0; $i < sizeof($tmp); $i++){ + /* fetch the next line */ + $line = $tmp[$i]; + + if ((strpos($line, '[U_]') !== false) || (strpos($line, '[_U]') !== false)) + { + /* One Disk is not working. + * if the next line starts with "[>" or "[=" then + * recovery (resync) is in state and the state is + * information instead of critical + */ + $nextLine = $tmp[$i+1]; + if ((strpos($nextLine, '[>') === false) && (strpos($nextLine, '[=') === false)) { + $state = $this->_setState($state, 'critical'); + } + else + { + $state = $this->_setState($state, 'info'); + } + } + if (strpos($line, '[__]') !== false) + { + /* both Disk are not working */ + $state = $this->_setState($state, 'error'); + } + if (strpos($line, '[UU]') !== false) + { + /* The disks are OK. + * if the next line starts with "[>" or "[=" then + * recovery (resync) is in state and the state is + * information instead of ok + */ + $nextLine = $tmp[$i+1]; + if ((strpos($nextLine, '[>') === false) && (strpos($nextLine, '[=') === false)) { + $state = $this->_setState($state, 'ok'); + } + else + { + $state = $this->_setState($state, 'info'); + } + } + } + + } + else { + /* + * mdadm is not installed, so there is no data and no state + * + * no_state, NOT unknown, because "unknown" is shown as state + * inside the GUI. no_state is hidden. + * + * We have to write NO DATA inside the DB, because the GUI + * could not know, if there is any dat, or not... + */ + $state = 'no_state'; + $data['output']= ''; + } + + /* + * Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + function monitorRkHunter(){ + /* + * This monitoring is expensive, so do it only once a day + */ + $min = date('i'); + $hour = date('H'); + if (!($min == 0 && $hour == 23)) return; + + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'rkhunter'; + + /* This monitoring is only available if rkhunter is installed */ + $location = system('which rkhunter', $retval); + if($retval === 0){ + /* + * Fetch the output + */ + $data['output'] = shell_exec('rkhunter --update --checkall --nocolors --skip-keypress'); + + /* + * At this moment, there is no state (maybe later) + */ + $state = 'no_state'; + } + else { + /* + * rkhunter is not installed, so there is no data and no state + * + * no_state, NOT unknown, because "unknown" is shown as state + * inside the GUI. no_state is hidden. + * + * We have to write NO DATA inside the DB, because the GUI + * could not know, if there is any dat, or not... + */ + $state = 'no_state'; + $data['output']= ''; + } + + /* + * Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 0, 2); + } + + function monitorFail2ban(){ + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'log_fail2ban'; + + /* This monitoring is only available if fail2ban is installed */ + $location = system('which fail2ban-client', $retval); // Debian, Ubuntu, Fedora + if($retval !== 0) $location = system('which fail2ban', $retval); // CentOS + if($retval === 0){ + /* Get the data of the log */ + $data = $this->_getLogData($type); + + /* + * At this moment, there is no state (maybe later) + */ + $state = 'no_state'; + } + else { + /* + * fail2ban is not installed, so there is no data and no state + * + * no_state, NOT unknown, because "unknown" is shown as state + * inside the GUI. no_state is hidden. + * + * We have to write NO DATA inside the DB, because the GUI + * could not know, if there is any dat, or not... + */ + $state = 'no_state'; + $data = ''; + } + + /* + * Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + function monitorSysLog(){ + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'sys_log'; + + /* + * is there any warning or error for this server? + */ + $state = 'ok'; + $dbData = $app->dbmaster->queryAllRecords("SELECT loglevel FROM sys_log WHERE server_id = " . $server_id . " AND loglevel > 0"); + if (is_array($dbData)) { + foreach($dbData as $item){ + if ($item['loglevel'] == 1) $state = $this->_setState($state, 'warning'); + if ($item['loglevel'] == 2) $state = $this->_setState($state, 'error'); + } + } + + /** There is no monitor-data because the data is in the sys_log table */ + $data['output']= ''; + + /* + * Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + function monitorMailLog() + { + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'log_mail'; + + /* Get the data of the log */ + $data = $this->_getLogData($type); + + /* + * actually this info has no state. + * maybe someone knows better...???... + */ + $state = 'no_state'; + + /* + Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + function monitorMailWarnLog() + { + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'log_mail_warn'; + + /* Get the data of the log */ + $data = $this->_getLogData($type); + + /* + * actually this info has no state. + * maybe someone knows better...???... + */ + $state = 'no_state'; + + /* + Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + function monitorMailErrLog() + { + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'log_mail_err'; + + /* Get the data of the log */ + $data = $this->_getLogData($type); + + /* + * actually this info has no state. + * maybe someone knows better...???... + */ + $state = 'no_state'; + + /* + Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + + function monitorMessagesLog() + { + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'log_messages'; + + /* Get the data of the log */ + $data = $this->_getLogData($type); + + /* + * actually this info has no state. + * maybe someone knows better...???... + */ + $state = 'no_state'; + + /* + Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + function monitorISPCCronLog() + { + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'log_ispc_cron'; + + /* Get the data of the log */ + $data = $this->_getLogData($type); + + /* + * actually this info has no state. + * maybe someone knows better...???... + */ + $state = 'no_state'; + + /* + Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + function monitorFreshClamLog() + { + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'log_freshclam'; + + /* Get the data of the log */ + $data = $this->_getLogData($type); + + /* Get the data from the LAST log-Entry. + * if there can be found: + * WARNING: Your ClamAV installation is OUTDATED! + * then the clamav is outdated. This is a warning! + */ + $state = 'ok'; + + $tmp = explode("\n", $data); + $lastLog = array(); + if ($tmp[sizeof($tmp)-1] == "") + { + /* the log ends with an empty line remove this */ + array_pop($tmp); + } + if (strpos($tmp[sizeof($tmp)-1], "-------------") !== false) + { + /* the log ends with "-----..." remove this */ + array_pop($tmp); + } + for ($i = sizeof($tmp) -1; $i > 0; $i--){ + if (strpos($tmp[$i], "---------") === false){ + /* no delimiter found, so add this to the last-log */ + $lastLog[] = $tmp[$i]; + } + else + { + /* delimiter found, so there is no more line left! */ + break; + } + } + + /* + * Now we have the last log in the array. + * Check if the outdated-string is found... + */ + foreach($lastLog as $line){ + if (strpos(strtolower($line), "outdated") !== false) { + $state = $this->_setState($state, 'warning'); + } + } + + /* + Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + function monitorClamAvLog() + { + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'log_clamav'; + + /* Get the data of the log */ + $data = $this->_getLogData($type); + + // Todo: the state should be calculated. + $state = 'ok'; + + /* + Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + function monitorIspConfigLog() + { + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'log_ispconfig'; + + /* Get the data of the log */ + $data = $this->_getLogData($type); + + // Todo: the state should be calculated. + $state = 'ok'; + + /* + Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + + function _getLogData($log){ + + $dist = ''; + $logfile = ''; + + if(@is_file('/etc/debian_version')) $dist = 'debian'; + if(@is_file('/etc/redhat-release')) $dist = 'redhat'; + if(@is_file('/etc/SuSE-release')) $dist = 'suse'; + if(@is_file('/etc/gentoo-release')) $dist = 'gentoo'; + + switch($log) { + case 'log_mail': + if($dist == 'debian') $logfile = '/var/log/mail.log'; + if($dist == 'redhat') $logfile = '/var/log/maillog'; + if($dist == 'suse') $logfile = '/var/log/mail.info'; + if($dist == 'gentoo') $logfile = '/var/log/maillog'; + break; + case 'log_mail_warn': + if($dist == 'debian') $logfile = '/var/log/mail.warn'; + if($dist == 'redhat') $logfile = '/var/log/maillog'; + if($dist == 'suse') $logfile = '/var/log/mail.warn'; + if($dist == 'gentoo') $logfile = '/var/log/maillog'; + break; + case 'log_mail_err': + if($dist == 'debian') $logfile = '/var/log/mail.err'; + if($dist == 'redhat') $logfile = '/var/log/maillog'; + if($dist == 'suse') $logfile = '/var/log/mail.err'; + if($dist == 'gentoo') $logfile = '/var/log/maillog'; + break; + case 'log_messages': + if($dist == 'debian') $logfile = '/var/log/messages'; + if($dist == 'redhat') $logfile = '/var/log/messages'; + if($dist == 'suse') $logfile = '/var/log/messages'; + if($dist == 'gentoo') $logfile = '/var/log/messages'; + break; + case 'log_ispc_cron': + if($dist == 'debian') $logfile = '/var/log/ispconfig/cron.log'; + if($dist == 'redhat') $logfile = '/var/log/ispconfig/cron.log'; + if($dist == 'suse') $logfile = '/var/log/ispconfig/cron.log'; + if($dist == 'gentoo') $logfile = '/var/log/cron'; + break; + case 'log_freshclam': + if($dist == 'debian') $logfile = '/var/log/clamav/freshclam.log'; + if($dist == 'redhat') $logfile = (is_file('/var/log/clamav/freshclam.log') ? '/var/log/clamav/freshclam.log' : '/var/log/freshclam.log'); + if($dist == 'suse') $logfile = ''; + if($dist == 'gentoo') $logfile = '/var/log/clamav/freshclam.log'; + break; + case 'log_clamav': + if($dist == 'debian') $logfile = '/var/log/clamav/clamav.log'; + if($dist == 'redhat') $logfile = (is_file('/var/log/clamav/clamd.log') ? '/var/log/clamav/clamd.log' : '/var/log/maillog'); + if($dist == 'suse') $logfile = ''; + if($dist == 'gentoo') $logfile = '/var/log/clamav/clamd.log'; + break; + case 'log_fail2ban': + if($dist == 'debian') $logfile = '/var/log/fail2ban.log'; + if($dist == 'redhat') $logfile = '/var/log/fail2ban.log'; + if($dist == 'suse') $logfile = '/var/log/fail2ban.log'; + if($dist == 'gentoo') $logfile = '/var/log/fail2ban.log'; + break; + case 'log_ispconfig': + if($dist == 'debian') $logfile = '/var/log/ispconfig/ispconfig.log'; + if($dist == 'redhat') $logfile = '/var/log/ispconfig/ispconfig.log'; + if($dist == 'suse') $logfile = '/var/log/ispconfig/ispconfig.log'; + if($dist == 'gentoo') $logfile = '/var/log/ispconfig/ispconfig.log'; + break; + default: + $logfile = ''; + break; + } + + // Getting the logfile content + if($logfile != '') { + $logfile = escapeshellcmd($logfile); + if(stristr($logfile, ';') or substr($logfile,0,9) != '/var/log/' or stristr($logfile, '..')) { + $log = 'Logfile path error.'; + } + else + { + $log = ''; + if(is_readable($logfile)) { + if($fd = popen("tail -n 100 $logfile", 'r')) { + while (!feof($fd)) { + $log .= fgets($fd, 4096); + $n++; + if($n > 1000) break; + } + fclose($fd); + } + } else { + $log = 'Unable to read '.$logfile; + } + } + } + + return $log; + } + + function _checkTcp ($host,$port) { + + $fp = @fsockopen ($host, $port, $errno, $errstr, 2); + + if ($fp) { + fclose($fp); + return true; + } else { + return false; + } + } + + function _checkUdp ($host,$port) { + + $fp = @fsockopen ('udp://'.$host, $port, $errno, $errstr, 2); + + if ($fp) { + fclose($fp); + return true; + } else { + return false; + } + } + + function _checkFtp ($host,$port){ + + $conn_id = @ftp_connect($host, $port); + + if($conn_id){ + @ftp_close($conn_id); + return true; + } else { + return false; + } + } + + /* + Deletes Records older than n. + */ + function _delOldRecords($type, $min, $hour=0, $days=0) { + global $app; + + $now = time(); + $old = $now - ($min * 60) - ($hour * 60 * 60) - ($days * 24 * 60 * 60); + $sql = "DELETE FROM monitor_data " . + "WHERE " . + "type =" . "'" . $app->dbmaster->quote($type) . "' " . + "AND " . + "created < " . $old; + $app->dbmaster->query($sql); + } + + /* + * Set the state to the given level (or higher, but not lesser). + * * If the actual state is critical and you call the method with ok, + * then the state is critical. + * + * * If the actual state is critical and you call the method with error, + * then the state is error. + */ + function _setState($oldState, $newState) + { + /* + * Calculate the weight of the old state + */ + switch ($oldState) { + case 'no_state': $oldInt = 0; + break; + case 'ok': $oldInt = 1; + break; + case 'unknown': $oldInt = 2; + break; + case 'info': $oldInt = 3; + break; + case 'warning': $oldInt = 4; + break; + case 'critical': $oldInt = 5; + break; + case 'error': $oldInt = 6; + break; + } + /* + * Calculate the weight of the new state + */ + switch ($newState) { + case 'no_state': $newInt = 0 ; + break; + case 'ok': $newInt = 1 ; + break; + case 'unknown': $newInt = 2 ; + break; + case 'info': $newInt = 3 ; + break; + case 'warning': $newInt = 4 ; + break; + case 'critical': $newInt = 5 ; + break; + case 'error': $newInt = 6 ; + break; + } + + /* + * Set to the higher level + */ + if ($newInt > $oldInt){ + return $newState; + } + else + { + return $oldState; + } + } + + function _getIntArray($line){ + /** The array of float found */ + $res = array(); + /* First build a array from the line */ + $data = explode(' ', $line); + /* then check if any item is a float */ + foreach ($data as $item) { + if ($item . '' == (int)$item . ''){ + $res[] = $item; + } + } + return $res; + } + + +} // end class + +?> diff --git a/interface/ispconfig/server/mods-enabled/client_module.inc.php b/interface/ispconfig/server/mods-enabled/client_module.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..4d46f114e207ff7931ba51fd98876e60a765a294 --- /dev/null +++ b/interface/ispconfig/server/mods-enabled/client_module.inc.php @@ -0,0 +1,96 @@ +plugins->announceEvents($this->module_name,$this->actions_available); + + /* + As we want to get notified of any changes on several database tables, + we register for them. + + The following function registers the function "functionname" + to be executed when a record for the table "dbtable" is + processed in the sys_datalog. "classname" is the name of the + class that contains the function functionname. + */ + + $app->modules->registerTableHook('client',$this->module_name,'process'); + + } + + /* + This function is called when a change in one of the registered tables is detected. + The function then raises the events for the plugins. + */ + + function process($tablename,$action,$data) { + global $app; + + switch ($tablename) { + case 'client': + if($action == 'i') $app->plugins->raiseEvent('client_insert',$data); + if($action == 'u') $app->plugins->raiseEvent('client_update',$data); + if($action == 'd') $app->plugins->raiseEvent('client_delete',$data); + break; + } // end switch + } // end function + + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/mods-enabled/cron_module.inc.php b/interface/ispconfig/server/mods-enabled/cron_module.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..503d7ef7c257c781beae11784ad17d847dcb4c29 --- /dev/null +++ b/interface/ispconfig/server/mods-enabled/cron_module.inc.php @@ -0,0 +1,97 @@ +plugins->announceEvents($this->module_name,$this->actions_available); + + /* + As we want to get notified of any changes on several database tables, + we register for them. + + The following function registers the function "functionname" + to be executed when a record for the table "dbtable" is + processed in the sys_datalog. "classname" is the name of the + class that contains the function functionname. + */ + + $app->modules->registerTableHook('cron',$this->module_name,'process'); + + } + + /* + This function is called when a change in one of the registered tables is detected. + The function then raises the events for the plugins. + */ + + function process($tablename,$action,$data) { + global $app; + + switch ($tablename) { + case 'cron': + if($action == 'i') $app->plugins->raiseEvent('cron_insert',$data); + if($action == 'u') $app->plugins->raiseEvent('cron_update',$data); + if($action == 'd') $app->plugins->raiseEvent('cron_delete',$data); + break; + } // end switch + } // end function + + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/mods-enabled/database_module.inc.php b/interface/ispconfig/server/mods-enabled/database_module.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..2dac689ee7574ce09fece7a1bb507389153b3c9f --- /dev/null +++ b/interface/ispconfig/server/mods-enabled/database_module.inc.php @@ -0,0 +1,103 @@ +plugins->announceEvents($this->module_name,$this->actions_available); + + /* + As we want to get notified of any changes on several database tables, + we register for them. + + The following function registers the function "functionname" + to be executed when a record for the table "dbtable" is + processed in the sys_datalog. "classname" is the name of the + class that contains the function functionname. + */ + + $app->modules->registerTableHook('web_database','database_module','process'); + + // Register service + //$app->services->registerService('httpd','web_module','restartHttpd'); + + } + + /* + This function is called when a change in one of the registered tables is detected. + The function then raises the events for the plugins. + */ + + function process($tablename,$action,$data) { + global $app; + + switch ($tablename) { + case 'web_database': + if($action == 'i') $app->plugins->raiseEvent('database_insert',$data); + if($action == 'u') $app->plugins->raiseEvent('database_update',$data); + if($action == 'd') $app->plugins->raiseEvent('database_delete',$data); + break; + } // end switch + } // end function + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/mods-enabled/dns_module.inc.php b/interface/ispconfig/server/mods-enabled/dns_module.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..17c36bd2618de7cd153de5b3cc916f98b4c86155 --- /dev/null +++ b/interface/ispconfig/server/mods-enabled/dns_module.inc.php @@ -0,0 +1,128 @@ +plugins->announceEvents($this->module_name,$this->actions_available); + + /* + As we want to get notified of any changes on several database tables, + we register for them. + + The following function registers the function "functionname" + to be executed when a record for the table "dbtable" is + processed in the sys_datalog. "classname" is the name of the + class that contains the function functionname. + */ + + $app->modules->registerTableHook('dns_soa',$this->module_name,'process'); + $app->modules->registerTableHook('dns_rr',$this->module_name,'process'); + + + // Register service + $app->services->registerService('bind','dns_module','restartBind'); + + } + + /* + This function is called when a change in one of the registered tables is detected. + The function then raises the events for the plugins. + */ + + function process($tablename,$action,$data) { + global $app; + + switch ($tablename) { + case 'dns_soa': + if($action == 'i') $app->plugins->raiseEvent('dns_soa_insert',$data); + if($action == 'u') $app->plugins->raiseEvent('dns_soa_update',$data); + if($action == 'd') $app->plugins->raiseEvent('dns_soa_delete',$data); + break; + case 'dns_rr': + if($action == 'i') $app->plugins->raiseEvent('dns_rr_insert',$data); + if($action == 'u') $app->plugins->raiseEvent('dns_rr_update',$data); + if($action == 'd') $app->plugins->raiseEvent('dns_rr_delete',$data); + break; + } // end switch + } // end function + + + function restartBind($action = 'restart') { + global $app; + + $command = ''; + if(is_file('/etc/init.d/bind9')) { + $command = '/etc/init.d/bind9'; + } else { + $command = '/etc/init.d/named'; + } + + if($action == 'restart') { + exec($command.' restart'); + } else { + exec($command.' reload'); + } + + } + + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/mods-enabled/mail_module.inc.php b/interface/ispconfig/server/mods-enabled/mail_module.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..d0c33f2aee9d87e9277b0ca7a8ec6c316a7102f4 --- /dev/null +++ b/interface/ispconfig/server/mods-enabled/mail_module.inc.php @@ -0,0 +1,153 @@ +plugins->announceEvents($this->module_name,$this->actions_available); + + /* + As we want to get notified of any changes on several database tables, + we register for them. + + The following function registers the function "functionname" + to be executed when a record for the table "dbtable" is + processed in the sys_datalog. "classname" is the name of the + class that contains the function functionname. + */ + + $app->modules->registerTableHook('mail_access','mail_module','process'); + $app->modules->registerTableHook('mail_domain','mail_module','process'); + $app->modules->registerTableHook('mail_forwarding','mail_module','process'); + $app->modules->registerTableHook('mail_transport','mail_module','process'); + $app->modules->registerTableHook('mail_user','mail_module','process'); + $app->modules->registerTableHook('mail_get','mail_module','process'); + $app->modules->registerTableHook('mail_content_filter','mail_module','process'); + + } + + /* + This function is called when a change in one of the registered tables is detected. + The function then raises the events for the plugins. + */ + + function process($tablename,$action,$data) { + global $app; + + switch ($tablename) { + case 'mail_access': + if($action == 'i') $app->plugins->raiseEvent('mail_access_insert',$data); + if($action == 'u') $app->plugins->raiseEvent('mail_access_update',$data); + if($action == 'd') $app->plugins->raiseEvent('mail_access_delete',$data); + break; + case 'mail_domain': + if($action == 'i') $app->plugins->raiseEvent('mail_domain_insert',$data); + if($action == 'u') $app->plugins->raiseEvent('mail_domain_update',$data); + if($action == 'd') $app->plugins->raiseEvent('mail_domain_delete',$data); + break; + case 'mail_forwarding': + if($action == 'i') $app->plugins->raiseEvent('mail_forwarding_insert',$data); + if($action == 'u') $app->plugins->raiseEvent('mail_forwarding_update',$data); + if($action == 'd') $app->plugins->raiseEvent('mail_forwarding_delete',$data); + break; + case 'mail_transport': + if($action == 'i') $app->plugins->raiseEvent('mail_transport_insert',$data); + if($action == 'u') $app->plugins->raiseEvent('mail_transport_update',$data); + if($action == 'd') $app->plugins->raiseEvent('mail_transport_delete',$data); + break; + case 'mail_user': + if($action == 'i') $app->plugins->raiseEvent('mail_user_insert',$data); + if($action == 'u') $app->plugins->raiseEvent('mail_user_update',$data); + if($action == 'd') $app->plugins->raiseEvent('mail_user_delete',$data); + break; + case 'mail_get': + if($action == 'i') $app->plugins->raiseEvent('mail_get_insert',$data); + if($action == 'u') $app->plugins->raiseEvent('mail_get_update',$data); + if($action == 'd') $app->plugins->raiseEvent('mail_get_delete',$data); + break; + case 'mail_content_filter': + if($action == 'i') $app->plugins->raiseEvent('mail_content_filter_insert',$data); + if($action == 'u') $app->plugins->raiseEvent('mail_content_filter_update',$data); + if($action == 'd') $app->plugins->raiseEvent('mail_content_filter_delete',$data); + break; + } // end switch + } // end function + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/mods-enabled/monitor_core_module.inc.php b/interface/ispconfig/server/mods-enabled/monitor_core_module.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..8447baee348877e66c777a734be059caaf257dc1 --- /dev/null +++ b/interface/ispconfig/server/mods-enabled/monitor_core_module.inc.php @@ -0,0 +1,1465 @@ +plugins->announceEvents($this->module_name,$this->actions_available); + + /* + As we want to get notified of any changes on several database tables, + we register for them. + + The following function registers the function "functionname" + to be executed when a record for the table "dbtable" is + processed in the sys_datalog. "classname" is the name of the + class that contains the function functionname. + */ + /* none at them moment */ + //$app->modules->registerTableHook('mail_access','mail_module','process'); + + /* + Do the monitor every n minutes and write the result in the db + */ + $min = date('i'); + if (($min % $this->interval) == 0) + { + $this->doMonitor(); + } + } + + /* + This function is called when a change in one of the registered tables is detected. + The function then raises the events for the plugins. + */ + function process($tablename, $action, $data) { + // global $app; + // + // switch ($tablename) { + // case 'mail_access': + // if($action == 'i') $app->plugins->raiseEvent('mail_access_insert',$data); + // if($action == 'u') $app->plugins->raiseEvent('mail_access_update',$data); + // if($action == 'd') $app->plugins->raiseEvent('mail_access_delete',$data); + // break; + // } // end switch + } // end function + + /* + This method is called every n minutes, when the module ist loaded. + The method then does a system-monitoring + */ + // TODO: what monitoring is done should be a config-var + function doMonitor() + { + /* Calls the single Monitoring steps */ + $this->monitorServer(); + $this->monitorDiskUsage(); + $this->monitorMemUsage(); + $this->monitorCpu(); + $this->monitorServices(); + $this->monitorMailLog(); + $this->monitorMailWarnLog(); + $this->monitorMailErrLog(); + $this->monitorMessagesLog(); + $this->monitorISPCCronLog(); + $this->monitorFreshClamLog(); + $this->monitorClamAvLog(); + $this->monitorIspConfigLog(); + $this->monitorSystemUpdate(); + $this->monitorMailQueue(); + $this->monitorRaid(); + $this->monitorRkHunter(); + $this->monitorFail2ban(); + $this->monitorSysLog(); + } + + function monitorServer(){ + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'server_load'; + + /* + Fetch the data into a array + */ + $procUptime = shell_exec("cat /proc/uptime | cut -f1 -d' '"); + $data['up_days'] = floor($procUptime/86400); + $data['up_hours'] = floor(($procUptime-$data['up_days']*86400)/3600); + $data['up_minutes'] = floor(($procUptime-$data['up_days']*86400-$data['up_hours']*3600)/60); + + $data['uptime'] = shell_exec("uptime"); + + $tmp = explode(",", $data['uptime'], 4); + $tmpUser = explode(" ", trim($tmp[2])); + $data['user_online'] = intval($tmpUser[0]); + + /* Old Load Average Code + $loadTmp = explode(":" , trim($tmp[3])); + $load = explode(",", $loadTmp[1]); + $data['load_1'] = floatval(trim($load[0])); + $data['load_5'] = floatval(trim($load[1])); + $data['load_15'] = floatval(trim($load[2])); */ + + //* New Load Average code to fix "always zero" bug in non-english distros. NEEDS TESTING + $loadTmp = shell_exec("cat /proc/loadavg | cut -f1-3 -d' '"); + $load = explode(" ", $loadTmp); + $data['load_1'] = floatval(str_replace(',', '.', $load[0])); + $data['load_5'] = floatval(str_replace(',', '.', $load[1])); + $data['load_15'] = floatval(str_replace(',', '.', $load[2])); + + /** The state of the server-load. */ + $state = 'ok'; + if ($data['load_1'] > 20 ) $state = 'info'; + if ($data['load_1'] > 50 ) $state = 'warning'; + if ($data['load_1'] > 100 ) $state = 'critical'; + if ($data['load_1'] > 150 ) $state = 'error'; + + /* + Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + function monitorDiskUsage() { + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'disk_usage'; + + /** The state of the disk-usage */ + $state = 'ok'; + + /** Fetch the data of ALL devices into a array (needed for monitoring!)*/ + $dfData = shell_exec("df -hT"); + + // split into array + $df = explode("\n", $dfData); + + /* + * ignore the first line, process the rest + */ + for($i=1; $i <= sizeof($df); $i++){ + if ($df[$i] != '') + { + /* + * Make a array of the data + */ + $s = preg_split ("/[\s]+/", $df[$i]); + $data[$i]['fs'] = $s[0]; + $data[$i]['type'] = $s[1]; + $data[$i]['size'] = $s[2]; + $data[$i]['used'] = $s[3]; + $data[$i]['available'] = $s[4]; + $data[$i]['percent'] = $s[5]; + $data[$i]['mounted'] = $s[6]; + /* + * calculate the state + */ + $usePercent = floatval($data[$i]['percent']); + + //* We dont want to check the cdrom drive as a cd / dvd is always 100% full + if($data[$i]['type'] != 'iso9660' && $data[$i]['type'] != 'cramfs' && $data[$i]['type'] != 'udf') { + if ($usePercent > 75) $state = $this->_setState($state, 'info'); + if ($usePercent > 80) $state = $this->_setState($state, 'warning'); + if ($usePercent > 90) $state = $this->_setState($state, 'critical'); + if ($usePercent > 95) $state = $this->_setState($state, 'error'); + } + } + } + + + /* + Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + + function monitorMemUsage() + { + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'mem_usage'; + + /* + Fetch the data into a array + */ + $miData = shell_exec("cat /proc/meminfo"); + + $memInfo = explode("\n", $miData); + + foreach($memInfo as $line){ + $part = preg_split("/:/", $line); + $key = trim($part[0]); + $tmp = explode(" ", trim($part[1])); + $value = 0; + if ($tmp[1] == 'kB') $value = $tmp[0] * 1024; + $data[$key] = $value; + } + + /* + * actually this info has no state. + * maybe someone knows better...???... + */ + $state = 'no_state'; + + /* + Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + + function monitorCpu() + { + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'cpu_info'; + + /* + Fetch the data into a array + */ + $cpuData = shell_exec("cat /proc/cpuinfo"); + $cpuInfo = explode("\n", $cpuData); + $processor = 0; + + foreach($cpuInfo as $line){ + + $part = preg_split("/:/", $line); + $key = trim($part[0]); + $value = trim($part[1]); + if($key == 'processor') $processor = intval($value); + if($key != '') $data[$key.' '.$processor] = $value; + } + + /* the cpu has no state. It is, what it is */ + $state = 'no_state'; + + /* + Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + + function monitorServices() + { + global $app; + global $conf; + + /** the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** get the "active" Services of the server from the DB */ + $services = $app->dbmaster->queryOneRecord("SELECT * FROM server WHERE server_id = " . $server_id); + + /* The type of the Monitor-data */ + $type = 'services'; + + /** the State of the monitoring */ + /* ok, if ALL aktive services are running, + * error, if not + * There is no other state! + */ + $state = 'ok'; + + /* Monitor Webserver */ + $data['webserver'] = -1; // unknown - not needed + if ($services['web_server'] == 1) + { + if($this->_checkTcp('localhost', 80)) { + $data['webserver'] = 1; + } else { + $data['webserver'] = 0; + $state = 'error'; // because service is down + } + } + + /* Monitor FTP-Server */ + $data['ftpserver'] = -1; // unknown - not needed + if ($services['file_server'] == 1) + { + if($this->_checkFtp('localhost', 21)) { + $data['ftpserver'] = 1; + } else { + $data['ftpserver'] = 0; + $state = 'error'; // because service is down + } + } + + /* Monitor SMTP-Server */ + $data['smtpserver'] = -1; // unknown - not needed + if ($services['mail_server'] == 1) + { + if($this->_checkTcp('localhost', 25)) { + $data['smtpserver'] = 1; + } else { + $data['smtpserver'] = 0; + $state = 'error'; // because service is down + } + } + + /* Monitor POP3-Server */ + $data['pop3server'] = -1; // unknown - not needed + if ($services['mail_server'] == 1) + { + if($this->_checkTcp('localhost', 110)) { + $data['pop3server'] = 1; + } else { + $data['pop3server'] = 0; + $state = 'error'; // because service is down + } + } + + /* Monitor IMAP-Server */ + $data['imapserver'] = -1; // unknown - not needed + if ($services['mail_server'] == 1) + { + if($this->_checkTcp('localhost', 143)) { + $data['imapserver'] = 1; + } else { + $data['imapserver'] = 0; + $state = 'error'; // because service is down + } + } + + /* Monitor BIND-Server */ + $data['bindserver'] = -1; // unknown - not needed + if ($services['dns_server'] == 1) + { + if($this->_checkTcp('localhost', 53)) { + $data['bindserver'] = 1; + } else { + $data['bindserver'] = 0; + $state = 'error'; // because service is down + } + } + + /* Monitor MYSQL-Server */ + $data['mysqlserver'] = -1; // unknown - not needed + if ($services['db_server'] == 1) + { + if($this->_checkTcp('localhost', 3306)) { + $data['mysqlserver'] = 1; + } else { + $data['mysqlserver'] = 0; + $state = 'error'; // because service is down + } + } + + + /* + Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + + function monitorSystemUpdate(){ + /* + * This monitoring is expensive, so do it only once a hour + */ + $min = date('i'); + if ($min != 0) return; + + /* + * OK - here we go... + */ + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'system_update'; + + /* This monitoring is only available at debian or Ubuntu */ + if(file_exists('/etc/debian_version')){ + + /* + * first update the "update-database" + */ + shell_exec('apt-get update'); + + /* + * Then test the upgrade. + * if there is any output, then there is a needed update + */ + $aptData = shell_exec('apt-get -s -qq dist-upgrade'); + if ($aptData == '') + { + /* There is nothing to update! */ + $state = 'ok'; + } + else + { + /* There is something to update! */ + $state = 'warning'; + } + + /* + * Fetch the output + */ + $data['output'] = shell_exec('apt-get -s -q dist-upgrade'); + } + elseif (file_exists("/etc/gentoo-release")) { + + /* + * first update the portage tree + */ + + // In keeping with gentoo's rsync policy, don't update to frequently (every four hours - taken from http://www.gentoo.org/doc/en/source_mirrors.xml) + $do_update = true; + if (file_exists('/usr/portage/metadata/timestamp.chk')) + { + $datetime = file_get_contents('/usr/portage/metadata/timestamp.chk'); + $datetime = trim($datetime); + + $dstamp = strtotime($datetime); + if ($dstamp) + { + $checkat = $dstamp + 14400; // + 4hours + if (mktime() < $checkat) { + $do_update = false; + } + } + } + + if ($do_update) { + shell_exec('emerge --sync --quiet'); + } + + /* + * Then test the upgrade. + * if there is any output, then there is a needed update + */ + $emergeData = shell_exec('emerge -puDNt --color n --nospinner --quiet world'); + if ($emergeData == '') + { + /* There is nothing to update! */ + $state = 'ok'; + } + else + { + /* There is something to update! */ + $state = 'warning'; + } + + /* + * Fetch the output + */ + $data['output'] = shell_exec('emerge -pvuDNt --color n --nospinner world'); + } + else { + /* + * It is not debian/Ubuntu, so there is no data and no state + * + * no_state, NOT unknown, because "unknown" is shown as state + * inside the GUI. no_state is hidden. + * + * We have to write NO DATA inside the DB, because the GUI + * could not know, if there is any dat, or not... + */ + $state = 'no_state'; + $data['output']= ''; + } + + /* + * Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 0, 2); + } + + function monitorMailQueue(){ + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'mailq'; + + /* Get the data from the mailq */ + $data['output'] = shell_exec('mailq'); + + /* + * The last line has more informations + */ + $tmp = explode("\n", $data['output']); + $more = $tmp[sizeof($tmp) - 1]; + $this->_getIntArray($more); + $data['bytes'] = $res[0]; + $data['requests'] = $res[1]; + + /** The state of the mailq. */ + $state = 'ok'; + if ($data['requests'] > 2000 ) $state = 'info'; + if ($data['requests'] > 5000 ) $state = 'warning'; + if ($data['requests'] > 8000 ) $state = 'critical'; + if ($data['requests'] > 10000 ) $state = 'error'; + + /* + * Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + + function monitorRaid(){ + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'raid_state'; + + /* This monitoring is only available if mdadm is installed */ + $location = system('which mdadm', $retval); + if($retval === 0){ + /* + * Fetch the output + */ + $data['output'] = shell_exec('cat /proc/mdstat'); + + /* + * Then calc the state. + */ + $tmp = explode("\n", $data['output']); + $state = 'ok'; + for ($i = 0; $i < sizeof($tmp); $i++){ + /* fetch the next line */ + $line = $tmp[$i]; + + if ((strpos($line, '[U_]') !== false) || (strpos($line, '[_U]') !== false)) + { + /* One Disk is not working. + * if the next line starts with "[>" or "[=" then + * recovery (resync) is in state and the state is + * information instead of critical + */ + $nextLine = $tmp[$i+1]; + if ((strpos($nextLine, '[>') === false) && (strpos($nextLine, '[=') === false)) { + $state = $this->_setState($state, 'critical'); + } + else + { + $state = $this->_setState($state, 'info'); + } + } + if (strpos($line, '[__]') !== false) + { + /* both Disk are not working */ + $state = $this->_setState($state, 'error'); + } + if (strpos($line, '[UU]') !== false) + { + /* The disks are OK. + * if the next line starts with "[>" or "[=" then + * recovery (resync) is in state and the state is + * information instead of ok + */ + $nextLine = $tmp[$i+1]; + if ((strpos($nextLine, '[>') === false) && (strpos($nextLine, '[=') === false)) { + $state = $this->_setState($state, 'ok'); + } + else + { + $state = $this->_setState($state, 'info'); + } + } + } + + } + else { + /* + * mdadm is not installed, so there is no data and no state + * + * no_state, NOT unknown, because "unknown" is shown as state + * inside the GUI. no_state is hidden. + * + * We have to write NO DATA inside the DB, because the GUI + * could not know, if there is any dat, or not... + */ + $state = 'no_state'; + $data['output']= ''; + } + + /* + * Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + function monitorRkHunter(){ + /* + * This monitoring is expensive, so do it only once a day + */ + $min = date('i'); + $hour = date('H'); + if (!($min == 0 && $hour == 23)) return; + + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'rkhunter'; + + /* This monitoring is only available if rkhunter is installed */ + $location = system('which rkhunter', $retval); + if($retval === 0){ + /* + * Fetch the output + */ + $data['output'] = shell_exec('rkhunter --update --checkall --nocolors --skip-keypress'); + + /* + * At this moment, there is no state (maybe later) + */ + $state = 'no_state'; + } + else { + /* + * rkhunter is not installed, so there is no data and no state + * + * no_state, NOT unknown, because "unknown" is shown as state + * inside the GUI. no_state is hidden. + * + * We have to write NO DATA inside the DB, because the GUI + * could not know, if there is any dat, or not... + */ + $state = 'no_state'; + $data['output']= ''; + } + + /* + * Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 0, 2); + } + + function monitorFail2ban(){ + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'log_fail2ban'; + + /* This monitoring is only available if fail2ban is installed */ + $location = system('which fail2ban-client', $retval); // Debian, Ubuntu, Fedora + if($retval !== 0) $location = system('which fail2ban', $retval); // CentOS + if($retval === 0){ + /* Get the data of the log */ + $data = $this->_getLogData($type); + + /* + * At this moment, there is no state (maybe later) + */ + $state = 'no_state'; + } + else { + /* + * fail2ban is not installed, so there is no data and no state + * + * no_state, NOT unknown, because "unknown" is shown as state + * inside the GUI. no_state is hidden. + * + * We have to write NO DATA inside the DB, because the GUI + * could not know, if there is any dat, or not... + */ + $state = 'no_state'; + $data = ''; + } + + /* + * Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + function monitorSysLog(){ + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'sys_log'; + + /* + * is there any warning or error for this server? + */ + $state = 'ok'; + $dbData = $app->dbmaster->queryAllRecords("SELECT loglevel FROM sys_log WHERE server_id = " . $server_id . " AND loglevel > 0"); + if (is_array($dbData)) { + foreach($dbData as $item){ + if ($item['loglevel'] == 1) $state = $this->_setState($state, 'warning'); + if ($item['loglevel'] == 2) $state = $this->_setState($state, 'error'); + } + } + + /** There is no monitor-data because the data is in the sys_log table */ + $data['output']= ''; + + /* + * Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + function monitorMailLog() + { + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'log_mail'; + + /* Get the data of the log */ + $data = $this->_getLogData($type); + + /* + * actually this info has no state. + * maybe someone knows better...???... + */ + $state = 'no_state'; + + /* + Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + function monitorMailWarnLog() + { + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'log_mail_warn'; + + /* Get the data of the log */ + $data = $this->_getLogData($type); + + /* + * actually this info has no state. + * maybe someone knows better...???... + */ + $state = 'no_state'; + + /* + Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + function monitorMailErrLog() + { + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'log_mail_err'; + + /* Get the data of the log */ + $data = $this->_getLogData($type); + + /* + * actually this info has no state. + * maybe someone knows better...???... + */ + $state = 'no_state'; + + /* + Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + + function monitorMessagesLog() + { + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'log_messages'; + + /* Get the data of the log */ + $data = $this->_getLogData($type); + + /* + * actually this info has no state. + * maybe someone knows better...???... + */ + $state = 'no_state'; + + /* + Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + function monitorISPCCronLog() + { + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'log_ispc_cron'; + + /* Get the data of the log */ + $data = $this->_getLogData($type); + + /* + * actually this info has no state. + * maybe someone knows better...???... + */ + $state = 'no_state'; + + /* + Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + function monitorFreshClamLog() + { + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'log_freshclam'; + + /* Get the data of the log */ + $data = $this->_getLogData($type); + + /* Get the data from the LAST log-Entry. + * if there can be found: + * WARNING: Your ClamAV installation is OUTDATED! + * then the clamav is outdated. This is a warning! + */ + $state = 'ok'; + + $tmp = explode("\n", $data); + $lastLog = array(); + if ($tmp[sizeof($tmp)-1] == "") + { + /* the log ends with an empty line remove this */ + array_pop($tmp); + } + if (strpos($tmp[sizeof($tmp)-1], "-------------") !== false) + { + /* the log ends with "-----..." remove this */ + array_pop($tmp); + } + for ($i = sizeof($tmp) -1; $i > 0; $i--){ + if (strpos($tmp[$i], "---------") === false){ + /* no delimiter found, so add this to the last-log */ + $lastLog[] = $tmp[$i]; + } + else + { + /* delimiter found, so there is no more line left! */ + break; + } + } + + /* + * Now we have the last log in the array. + * Check if the outdated-string is found... + */ + foreach($lastLog as $line){ + if (strpos(strtolower($line), "outdated") !== false) { + $state = $this->_setState($state, 'warning'); + } + } + + /* + Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + function monitorClamAvLog() + { + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'log_clamav'; + + /* Get the data of the log */ + $data = $this->_getLogData($type); + + // Todo: the state should be calculated. + $state = 'ok'; + + /* + Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + function monitorIspConfigLog() + { + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'log_ispconfig'; + + /* Get the data of the log */ + $data = $this->_getLogData($type); + + // Todo: the state should be calculated. + $state = 'ok'; + + /* + Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + + function _getLogData($log){ + + $dist = ''; + $logfile = ''; + + if(@is_file('/etc/debian_version')) $dist = 'debian'; + if(@is_file('/etc/redhat-release')) $dist = 'redhat'; + if(@is_file('/etc/SuSE-release')) $dist = 'suse'; + if(@is_file('/etc/gentoo-release')) $dist = 'gentoo'; + + switch($log) { + case 'log_mail': + if($dist == 'debian') $logfile = '/var/log/mail.log'; + if($dist == 'redhat') $logfile = '/var/log/maillog'; + if($dist == 'suse') $logfile = '/var/log/mail.info'; + if($dist == 'gentoo') $logfile = '/var/log/maillog'; + break; + case 'log_mail_warn': + if($dist == 'debian') $logfile = '/var/log/mail.warn'; + if($dist == 'redhat') $logfile = '/var/log/maillog'; + if($dist == 'suse') $logfile = '/var/log/mail.warn'; + if($dist == 'gentoo') $logfile = '/var/log/maillog'; + break; + case 'log_mail_err': + if($dist == 'debian') $logfile = '/var/log/mail.err'; + if($dist == 'redhat') $logfile = '/var/log/maillog'; + if($dist == 'suse') $logfile = '/var/log/mail.err'; + if($dist == 'gentoo') $logfile = '/var/log/maillog'; + break; + case 'log_messages': + if($dist == 'debian') $logfile = '/var/log/messages'; + if($dist == 'redhat') $logfile = '/var/log/messages'; + if($dist == 'suse') $logfile = '/var/log/messages'; + if($dist == 'gentoo') $logfile = '/var/log/messages'; + break; + case 'log_ispc_cron': + if($dist == 'debian') $logfile = '/var/log/ispconfig/cron.log'; + if($dist == 'redhat') $logfile = '/var/log/ispconfig/cron.log'; + if($dist == 'suse') $logfile = '/var/log/ispconfig/cron.log'; + if($dist == 'gentoo') $logfile = '/var/log/cron'; + break; + case 'log_freshclam': + if($dist == 'debian') $logfile = '/var/log/clamav/freshclam.log'; + if($dist == 'redhat') $logfile = (is_file('/var/log/clamav/freshclam.log') ? '/var/log/clamav/freshclam.log' : '/var/log/freshclam.log'); + if($dist == 'suse') $logfile = ''; + if($dist == 'gentoo') $logfile = '/var/log/clamav/freshclam.log'; + break; + case 'log_clamav': + if($dist == 'debian') $logfile = '/var/log/clamav/clamav.log'; + if($dist == 'redhat') $logfile = (is_file('/var/log/clamav/clamd.log') ? '/var/log/clamav/clamd.log' : '/var/log/maillog'); + if($dist == 'suse') $logfile = ''; + if($dist == 'gentoo') $logfile = '/var/log/clamav/clamd.log'; + break; + case 'log_fail2ban': + if($dist == 'debian') $logfile = '/var/log/fail2ban.log'; + if($dist == 'redhat') $logfile = '/var/log/fail2ban.log'; + if($dist == 'suse') $logfile = '/var/log/fail2ban.log'; + if($dist == 'gentoo') $logfile = '/var/log/fail2ban.log'; + break; + case 'log_ispconfig': + if($dist == 'debian') $logfile = '/var/log/ispconfig/ispconfig.log'; + if($dist == 'redhat') $logfile = '/var/log/ispconfig/ispconfig.log'; + if($dist == 'suse') $logfile = '/var/log/ispconfig/ispconfig.log'; + if($dist == 'gentoo') $logfile = '/var/log/ispconfig/ispconfig.log'; + break; + default: + $logfile = ''; + break; + } + + // Getting the logfile content + if($logfile != '') { + $logfile = escapeshellcmd($logfile); + if(stristr($logfile, ';') or substr($logfile,0,9) != '/var/log/' or stristr($logfile, '..')) { + $log = 'Logfile path error.'; + } + else + { + $log = ''; + if(is_readable($logfile)) { + if($fd = popen("tail -n 100 $logfile", 'r')) { + while (!feof($fd)) { + $log .= fgets($fd, 4096); + $n++; + if($n > 1000) break; + } + fclose($fd); + } + } else { + $log = 'Unable to read '.$logfile; + } + } + } + + return $log; + } + + function _checkTcp ($host,$port) { + + $fp = @fsockopen ($host, $port, $errno, $errstr, 2); + + if ($fp) { + fclose($fp); + return true; + } else { + return false; + } + } + + function _checkUdp ($host,$port) { + + $fp = @fsockopen ('udp://'.$host, $port, $errno, $errstr, 2); + + if ($fp) { + fclose($fp); + return true; + } else { + return false; + } + } + + function _checkFtp ($host,$port){ + + $conn_id = @ftp_connect($host, $port); + + if($conn_id){ + @ftp_close($conn_id); + return true; + } else { + return false; + } + } + + /* + Deletes Records older than n. + */ + function _delOldRecords($type, $min, $hour=0, $days=0) { + global $app; + + $now = time(); + $old = $now - ($min * 60) - ($hour * 60 * 60) - ($days * 24 * 60 * 60); + $sql = "DELETE FROM monitor_data " . + "WHERE " . + "type =" . "'" . $app->dbmaster->quote($type) . "' " . + "AND " . + "created < " . $old; + $app->dbmaster->query($sql); + } + + /* + * Set the state to the given level (or higher, but not lesser). + * * If the actual state is critical and you call the method with ok, + * then the state is critical. + * + * * If the actual state is critical and you call the method with error, + * then the state is error. + */ + function _setState($oldState, $newState) + { + /* + * Calculate the weight of the old state + */ + switch ($oldState) { + case 'no_state': $oldInt = 0; + break; + case 'ok': $oldInt = 1; + break; + case 'unknown': $oldInt = 2; + break; + case 'info': $oldInt = 3; + break; + case 'warning': $oldInt = 4; + break; + case 'critical': $oldInt = 5; + break; + case 'error': $oldInt = 6; + break; + } + /* + * Calculate the weight of the new state + */ + switch ($newState) { + case 'no_state': $newInt = 0 ; + break; + case 'ok': $newInt = 1 ; + break; + case 'unknown': $newInt = 2 ; + break; + case 'info': $newInt = 3 ; + break; + case 'warning': $newInt = 4 ; + break; + case 'critical': $newInt = 5 ; + break; + case 'error': $newInt = 6 ; + break; + } + + /* + * Set to the higher level + */ + if ($newInt > $oldInt){ + return $newState; + } + else + { + return $oldState; + } + } + + function _getIntArray($line){ + /** The array of float found */ + $res = array(); + /* First build a array from the line */ + $data = explode(' ', $line); + /* then check if any item is a float */ + foreach ($data as $item) { + if ($item . '' == (int)$item . ''){ + $res[] = $item; + } + } + return $res; + } + + +} // end class + +?> diff --git a/interface/ispconfig/server/mods-enabled/server_module.inc.php b/interface/ispconfig/server/mods-enabled/server_module.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..894c972539cc004c8e47f5b2c4ffdc24e84c44f4 --- /dev/null +++ b/interface/ispconfig/server/mods-enabled/server_module.inc.php @@ -0,0 +1,137 @@ +plugins->announceEvents($this->module_name,$this->actions_available); + + /* + As we want to get notified of any changes on several database tables, + we register for them. + + The following function registers the function "functionname" + to be executed when a record for the table "dbtable" is + processed in the sys_datalog. "classname" is the name of the + class that contains the function functionname. + */ + + $app->modules->registerTableHook('server','server_module','process'); + $app->modules->registerTableHook('server_ip','server_module','process'); + $app->modules->registerTableHook('firewall','server_module','process'); + $app->modules->registerTableHook('software_update_inst','server_module','process'); + + // Register service + //$app->services->registerService('httpd','web_module','restartHttpd'); + + } + + /* + This function is called when a change in one of the registered tables is detected. + The function then raises the events for the plugins. + */ + + function process($tablename,$action,$data) { + global $app; + + switch ($tablename) { + case 'server': + if($action == 'i') $app->plugins->raiseEvent('server_insert',$data); + if($action == 'u') $app->plugins->raiseEvent('server_update',$data); + if($action == 'd') $app->plugins->raiseEvent('server_delete',$data); + break; + case 'server_ip': + if($action == 'i') $app->plugins->raiseEvent('server_ip_insert',$data); + if($action == 'u') $app->plugins->raiseEvent('server_ip_update',$data); + if($action == 'd') $app->plugins->raiseEvent('server_ip_delete',$data); + break; + case 'firewall': + if($action == 'i') $app->plugins->raiseEvent('firewall_insert',$data); + if($action == 'u') $app->plugins->raiseEvent('firewall_update',$data); + if($action == 'd') $app->plugins->raiseEvent('firewall_delete',$data); + break; + case 'software_update_inst': + if($action == 'i') $app->plugins->raiseEvent('software_update_inst_insert',$data); + if($action == 'u') $app->plugins->raiseEvent('software_update_inst_update',$data); + if($action == 'd') $app->plugins->raiseEvent('software_update_inst_delete',$data); + break; + } // end switch + } // end function + + /* + // This function is used + function restartHttpd($action = 'restart') { + global $app; + if($action == 'restart') { + exec('/etc/init.d/apache2 restart'); + } else { + exec('/etc/init.d/apache2 reload'); + } + } + */ + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/mods-enabled/web_module.inc.php b/interface/ispconfig/server/mods-enabled/web_module.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..3ddeca5ed87360927c9a9fc91e81b7d8da8ba867 --- /dev/null +++ b/interface/ispconfig/server/mods-enabled/web_module.inc.php @@ -0,0 +1,140 @@ +plugins->announceEvents($this->module_name,$this->actions_available); + + /* + As we want to get notified of any changes on several database tables, + we register for them. + + The following function registers the function "functionname" + to be executed when a record for the table "dbtable" is + processed in the sys_datalog. "classname" is the name of the + class that contains the function functionname. + */ + + $app->modules->registerTableHook('web_domain','web_module','process'); + $app->modules->registerTableHook('ftp_user','web_module','process'); + $app->modules->registerTableHook('shell_user','web_module','process'); + + // Register service + $app->services->registerService('httpd','web_module','restartHttpd'); + + } + + /* + This function is called when a change in one of the registered tables is detected. + The function then raises the events for the plugins. + */ + + function process($tablename,$action,$data) { + global $app; + + switch ($tablename) { + case 'web_domain': + if($action == 'i') $app->plugins->raiseEvent('web_domain_insert',$data); + if($action == 'u') $app->plugins->raiseEvent('web_domain_update',$data); + if($action == 'd') $app->plugins->raiseEvent('web_domain_delete',$data); + break; + case 'ftp_user': + if($action == 'i') $app->plugins->raiseEvent('ftp_user_insert',$data); + if($action == 'u') $app->plugins->raiseEvent('ftp_user_update',$data); + if($action == 'd') $app->plugins->raiseEvent('ftp_user_delete',$data); + break; + case 'shell_user': + if($action == 'i') $app->plugins->raiseEvent('shell_user_insert',$data); + if($action == 'u') $app->plugins->raiseEvent('shell_user_update',$data); + if($action == 'd') $app->plugins->raiseEvent('shell_user_delete',$data); + break; + } // end switch + } // end function + + + // This function is used + function restartHttpd($action = 'restart') { + global $app; + + $command = ''; + if(is_file('/etc/init.d/httpd')) { + $command = '/etc/init.d/httpd'; + } else { + $command = '/etc/init.d/apache2'; + } + + if($action == 'restart') { + exec($command.' restart'); + } else { + exec($command.' reload'); + } + + } + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/plugins-available/apache2_plugin.inc.php b/interface/ispconfig/server/plugins-available/apache2_plugin.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..16b405ae46e11d8bfeed1685bf2692167c94d8c2 --- /dev/null +++ b/interface/ispconfig/server/plugins-available/apache2_plugin.inc.php @@ -0,0 +1,987 @@ +plugins->registerEvent('web_domain_insert',$this->plugin_name,'ssl'); + $app->plugins->registerEvent('web_domain_update',$this->plugin_name,'ssl'); + $app->plugins->registerEvent('web_domain_delete',$this->plugin_name,'ssl'); + + $app->plugins->registerEvent('web_domain_insert',$this->plugin_name,'insert'); + $app->plugins->registerEvent('web_domain_update',$this->plugin_name,'update'); + $app->plugins->registerEvent('web_domain_delete',$this->plugin_name,'delete'); + + $app->plugins->registerEvent('server_ip_insert',$this->plugin_name,'server_ip'); + $app->plugins->registerEvent('server_ip_update',$this->plugin_name,'server_ip'); + $app->plugins->registerEvent('server_ip_delete',$this->plugin_name,'server_ip'); + + } + + // Handle the creation of SSL certificates + function ssl($event_name,$data) { + global $app, $conf; + + if(!is_dir($data["new"]["document_root"]."/ssl")) exec("mkdir -p ".$data["new"]["document_root"]."/ssl"); + $ssl_dir = $data["new"]["document_root"]."/ssl"; + $domain = $data["new"]["ssl_domain"]; + $key_file = $ssl_dir.'/'.$domain.".key.org"; + $key_file2 = $ssl_dir.'/'.$domain.".key"; + $csr_file = $ssl_dir.'/'.$domain.".csr"; + $crt_file = $ssl_dir.'/'.$domain.".crt"; + + //* Create a SSL Certificate + if($data["new"]["ssl_action"] == 'create') { + $rand_file = $ssl_dir."/random_file"; + $rand_data = md5(uniqid(microtime(),1)); + for($i=0; $i<1000; $i++){ + $rand_data .= md5(uniqid(microtime(),1)); + $rand_data .= md5(uniqid(microtime(),1)); + $rand_data .= md5(uniqid(microtime(),1)); + $rand_data .= md5(uniqid(microtime(),1)); + } + file_put_contents($rand_file, $rand_data); + + $ssl_password = substr(md5(uniqid(microtime(),1)), 0, 15); + + $ssl_cnf = " RANDFILE = $rand_file + + [ req ] + default_bits = 2048 + default_keyfile = keyfile.pem + distinguished_name = req_distinguished_name + attributes = req_attributes + prompt = no + output_password = $ssl_password + + [ req_distinguished_name ] + C = ".$data['new']['ssl_country']." + ST = ".$data['new']['ssl_state']." + L = ".$data['new']['ssl_locality']." + O = ".$data['new']['ssl_organisation']." + OU = ".$data['new']['ssl_organisation_unit']." + CN = $domain + emailAddress = webmaster@".$data['new']['domain']." + + [ req_attributes ] + challengePassword = A challenge password"; + + $ssl_cnf_file = $ssl_dir."/openssl.conf"; + file_put_contents($ssl_cnf_file,$ssl_cnf); + + $rand_file = escapeshellcmd($rand_file); + $key_file = escapeshellcmd($key_file); + $key_file2 = escapeshellcmd($key_file2); + $ssl_days = 3650; + $csr_file = escapeshellcmd($csr_file); + $config_file = escapeshellcmd($ssl_cnf_file); + $crt_file = escapeshellcmd($crt_file); + + if(is_file($ssl_cnf_file)){ + exec("openssl genrsa -des3 -rand $rand_file -passout pass:$ssl_password -out $key_file 2048 && openssl req -new -passin pass:$ssl_password -passout pass:$ssl_password -key $key_file -out $csr_file -days $ssl_days -config $config_file && openssl req -x509 -passin pass:$ssl_password -passout pass:$ssl_password -key $key_file -in $csr_file -out $crt_file -days $ssl_days -config $config_file && openssl rsa -passin pass:$ssl_password -in $key_file -out $key_file2"); + $app->log("Creating SSL Cert for: $domain",LOGLEVEL_DEBUG); + } + + exec("chmod 400 $key_file2"); + @unlink($config_file); + @unlink($rand_file); + $ssl_request = $app->db->quote(file_get_contents($csr_file)); + $ssl_cert = $app->db->quote(file_get_contents($crt_file)); + /* Update the DB of the (local) Server */ + $app->db->query("UPDATE web_domain SET ssl_request = '$ssl_request', ssl_cert = '$ssl_cert' WHERE domain = '".$data["new"]["domain"]."'"); + $app->db->query("UPDATE web_domain SET ssl_action = '' WHERE domain = '".$data["new"]["domain"]."'"); + /* Update also the master-DB of the Server-Farm */ + $app->dbmaster->query("UPDATE web_domain SET ssl_request = '$ssl_request', ssl_cert = '$ssl_cert' WHERE domain = '".$data["new"]["domain"]."'"); + $app->dbmaster->query("UPDATE web_domain SET ssl_action = '' WHERE domain = '".$data["new"]["domain"]."'"); + } + + //* Save a SSL certificate to disk + if($data["new"]["ssl_action"] == 'save') { + $ssl_dir = $data["new"]["document_root"]."/ssl"; + $domain = $data["new"]["ssl_domain"]; + $csr_file = $ssl_dir.'/'.$domain.".csr"; + $crt_file = $ssl_dir.'/'.$domain.".crt"; + $bundle_file = $ssl_dir.'/'.$domain.".bundle"; + file_put_contents($csr_file,$data["new"]["ssl_request"]); + file_put_contents($crt_file,$data["new"]["ssl_cert"]); + if(trim($data["new"]["ssl_bundle"]) != '') file_put_contents($bundle_file,$data["new"]["ssl_bundle"]); + /* Update the DB of the (local) Server */ + $app->db->query("UPDATE web_domain SET ssl_action = '' WHERE domain = '".$data["new"]["domain"]."'"); + /* Update also the master-DB of the Server-Farm */ + $app->dbmaster->query("UPDATE web_domain SET ssl_action = '' WHERE domain = '".$data["new"]["domain"]."'"); + $app->log("Saving SSL Cert for: $domain",LOGLEVEL_DEBUG); + } + + //* Delete a SSL certificate + if($data["new"]["ssl_action"] == 'del') { + $ssl_dir = $data["new"]["document_root"]."/ssl"; + $domain = $data["new"]["ssl_domain"]; + $csr_file = $ssl_dir.'/'.$domain.".csr"; + $crt_file = $ssl_dir.'/'.$domain.".crt"; + $bundle_file = $ssl_dir.'/'.$domain.".bundle"; + unlink($csr_file); + unlink($crt_file); + unlink($bundle_file); + /* Update the DB of the (local) Server */ + $app->db->query("UPDATE web_domain SET ssl_request = '', ssl_cert = '' WHERE domain = '".$data["new"]["domain"]."'"); + $app->db->query("UPDATE web_domain SET ssl_action = '' WHERE domain = '".$data["new"]["domain"]."'"); + /* Update also the master-DB of the Server-Farm */ + $app->dbmaster->query("UPDATE web_domain SET ssl_request = '', ssl_cert = '' WHERE domain = '".$data["new"]["domain"]."'"); + $app->dbmaster->query("UPDATE web_domain SET ssl_action = '' WHERE domain = '".$data["new"]["domain"]."'"); + $app->log("Deleting SSL Cert for: $domain",LOGLEVEL_DEBUG); + } + + + } + + + function insert($event_name,$data) { + global $app, $conf; + + $this->action = 'insert'; + // just run the update function + $this->update($event_name,$data); + + + } + + + function update($event_name,$data) { + global $app, $conf; + + if($this->action != 'insert') $this->action = 'update'; + + if($data["new"]["type"] != "vhost" && $data["new"]["parent_domain_id"] > 0) { + + $old_parent_domain_id = intval($data["old"]["parent_domain_id"]); + $new_parent_domain_id = intval($data["new"]["parent_domain_id"]); + + // If the parent_domain_id has been chenged, we will have to update the old site as well. + if($this->action == 'update' && $data["new"]["parent_domain_id"] != $data["old"]["parent_domain_id"]) { + $tmp = $app->db->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ".$old_parent_domain_id." AND active = 'y'"); + $data["new"] = $tmp; + $data["old"] = $tmp; + $this->action = 'update'; + $this->update($event_name,$data); + } + + // This is not a vhost, so we need to update the parent record instead. + $tmp = $app->db->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ".$new_parent_domain_id." AND active = 'y'"); + $data["new"] = $tmp; + $data["old"] = $tmp; + $this->action = 'update'; + } + + // load the server configuration options + $app->uses("getconf"); + $web_config = $app->getconf->get_server_config($conf["server_id"], 'web'); + + //* Check if this is a chrooted setup + if($web_config['website_basedir'] != '' && @is_file($web_config['website_basedir'].'/etc/passwd')) { + $apache_chrooted = true; + $app->log("Info: Apache is chrooted.",LOGLEVEL_DEBUG); + } else { + $apache_chrooted = false; + } + + if($data["new"]["document_root"] == '') { + $app->log("document_root not set",LOGLEVEL_WARN); + return 0; + } + if($data["new"]["system_user"] == 'root' or $data["new"]["system_group"] == 'root') { + $app->log("Websites can not be owned by the root user or group.",LOGLEVEL_WARN); + return 0; + } + + //* If the client of the site has been changed, we have a change of the document root + if($this->action == 'update' && $data["new"]["document_root"] != $data["old"]["document_root"]) { + + //* Get the old client ID + $old_client = $app->dbmaster->queryOneRecord("SELECT client_id FROM sys_group WHERE sys_group.groupid = ".intval($data["old"]["sys_groupid"])); + $old_client_id = intval($old_client["client_id"]); + unset($old_client); + + //* Remove the old symlinks + $tmp_symlinks_array = explode(':',$web_config["website_symlinks"]); + if(is_array($tmp_symlinks_array)) { + foreach($tmp_symlinks_array as $tmp_symlink) { + $tmp_symlink = str_replace("[client_id]",$old_client_id,$tmp_symlink); + $tmp_symlink = str_replace("[website_domain]",$data["old"]["domain"],$tmp_symlink); + // Remove trailing slash + if(substr($tmp_symlink, -1, 1) == '/') $tmp_symlink = substr($tmp_symlink, 0, -1); + // create the symlinks, if not exist + if(is_link($tmp_symlink)) { + exec("rm -f ".escapeshellcmd($tmp_symlink)); + $app->log("Removed Symlink: rm -f ".$tmp_symlink,LOGLEVEL_DEBUG); + } + } + } + + //* Move the site data + $tmp_docroot = explode('/',$data["new"]["document_root"]); + unset($tmp_docroot[count($tmp_docroot)-1]); + $new_dir = implode('/',$tmp_docroot); + + $tmp_docroot = explode('/',$data["old"]["document_root"]); + unset($tmp_docroot[count($tmp_docroot)-1]); + $old_dir = implode('/',$tmp_docroot); + + exec('rm -rf '.$data["new"]["document_root"]); + if(!is_dir($new_dir)) exec('mkdir -p '.$new_dir); + exec('mv '.$data["old"]["document_root"].' '.$new_dir); + $app->log("Moving site to new document root: ".'mv '.$data["old"]["document_root"].' '.$new_dir,LOGLEVEL_DEBUG); + + //* Change the owner of the website files to the new website owner + exec('chown --recursive --from='.escapeshellcmd($data["old"]["system_user"]).':'.escapeshellcmd($data['old']['system_group']).' '.escapeshellcmd($data["new"]["system_user"]).':'.escapeshellcmd($data['new']['system_group']).' '.$new_dir); + + //* Change the home directory and group of the website user + $command = 'usermod'; + $command .= ' --home '.escapeshellcmd($data["new"]["document_root"]); + $command .= ' --gid '.escapeshellcmd($data['new']['system_group']); + $command .= ' '.escapeshellcmd($data["new"]["system_user"]); + exec($command); + + if($apache_chrooted) $this->_exec("chroot ".escapeshellcmd($web_config['website_basedir'])." ".$command); + + + } + + //print_r($data); + + // Check if the directories are there and create them if nescessary. + if(!is_dir($data["new"]["document_root"]."/web")) exec("mkdir -p ".$data["new"]["document_root"]."/web"); + if(!is_dir($data["new"]["document_root"]."/web/error") and $data["new"]["errordocs"]) exec("mkdir -p ".$data["new"]["document_root"]."/web/error"); + //if(!is_dir($data["new"]["document_root"]."/log")) exec("mkdir -p ".$data["new"]["document_root"]."/log"); + if(!is_dir($data["new"]["document_root"]."/ssl")) exec("mkdir -p ".$data["new"]["document_root"]."/ssl"); + if(!is_dir($data["new"]["document_root"]."/cgi-bin")) exec("mkdir -p ".$data["new"]["document_root"]."/cgi-bin"); + if(!is_dir($data["new"]["document_root"]."/tmp")) exec("mkdir -p ".$data["new"]["document_root"]."/tmp"); + + // Remove the symlink for the site, if site is renamed + if($this->action == 'update' && $data["old"]["domain"] != '' && $data["new"]["domain"] != $data["old"]["domain"]) { + if(is_dir('/var/log/ispconfig/httpd/'.$data["old"]["domain"])) exec('rm -rf /var/log/ispconfig/httpd/'.$data["old"]["domain"]); + if(is_link($data["old"]["document_root"]."/log")) unlink($data["old"]["document_root"]."/log"); + } + + // Create the symlink for the logfiles + if(!is_dir('/var/log/ispconfig/httpd/'.$data["new"]["domain"])) exec('mkdir -p /var/log/ispconfig/httpd/'.$data["new"]["domain"]); + if(!is_link($data["new"]["document_root"]."/log")) { + exec("ln -s /var/log/ispconfig/httpd/".$data["new"]["domain"]." ".$data["new"]["document_root"]."/log"); + $app->log("Creating Symlink: ln -s /var/log/ispconfig/httpd/".$data["new"]["domain"]." ".$data["new"]["document_root"]."/log",LOGLEVEL_DEBUG); + } + /* + // Create the symlink for the logfiles + // This does not work as vlogger can not log trogh symlinks. + if($this->action == 'update' && $data["old"]["domain"] != '' && $data["new"]["domain"] != $data["old"]["domain"]) { + if(is_dir($data["old"]["document_root"]."/log")) exec('rm -rf '.$data["old"]["document_root"]."/log"); + if(is_link('/var/log/ispconfig/httpd/'.$data["old"]["domain"])) unlink('/var/log/ispconfig/httpd/'.$data["old"]["domain"]); + } + + // Create the symlink for the logfiles + if(!is_dir($data["new"]["document_root"]."/log")) exec('mkdir -p '.$data["new"]["document_root"]."/log"); + if(!is_link('/var/log/ispconfig/httpd/'.$data["new"]["domain"])) { + exec("ln -s ".$data["new"]["document_root"]."/log /var/log/ispconfig/httpd/".$data["new"]["domain"]); + $app->log("Creating Symlink: ln -s ".$data["new"]["document_root"]."/log /var/log/ispconfig/httpd/".$data["new"]["domain"],LOGLEVEL_DEBUG); + } + */ + + // Get the client ID + $client = $app->dbmaster->queryOneRecord("SELECT client_id FROM sys_group WHERE sys_group.groupid = ".intval($data["new"]["sys_groupid"])); + $client_id = intval($client["client_id"]); + unset($client); + + // Remove old symlinks, if site is renamed + if($this->action == 'update' && $data["old"]["domain"] != '' && $data["new"]["domain"] != $data["old"]["domain"]) { + $tmp_symlinks_array = explode(':',$web_config["website_symlinks"]); + if(is_array($tmp_symlinks_array)) { + foreach($tmp_symlinks_array as $tmp_symlink) { + $tmp_symlink = str_replace("[client_id]",$client_id,$tmp_symlink); + $tmp_symlink = str_replace("[website_domain]",$data["old"]["domain"],$tmp_symlink); + // Remove trailing slash + if(substr($tmp_symlink, -1, 1) == '/') $tmp_symlink = substr($tmp_symlink, 0, -1); + // remove the symlinks, if not exist + if(is_link($tmp_symlink)) { + exec("rm -f ".escapeshellcmd($tmp_symlink)); + $app->log("Removed Symlink: rm -f ".$tmp_symlink,LOGLEVEL_DEBUG); + } + } + } + } + + // Create the symlinks for the sites + $tmp_symlinks_array = explode(':',$web_config["website_symlinks"]); + if(is_array($tmp_symlinks_array)) { + foreach($tmp_symlinks_array as $tmp_symlink) { + $tmp_symlink = str_replace("[client_id]",$client_id,$tmp_symlink); + $tmp_symlink = str_replace("[website_domain]",$data["new"]["domain"],$tmp_symlink); + // Remove trailing slash + if(substr($tmp_symlink, -1, 1) == '/') $tmp_symlink = substr($tmp_symlink, 0, -1); + //* Remove symlink if target folder has been changed. + if($data["old"]["document_root"] != '' && $data["old"]["document_root"] != $data["new"]["document_root"] && is_link($tmp_symlink)) { + unlink($tmp_symlink); + } + // create the symlinks, if not exist + if(!is_link($tmp_symlink)) { + exec("ln -s ".escapeshellcmd($data["new"]["document_root"])."/ ".escapeshellcmd($tmp_symlink)); + $app->log("Creating Symlink: ln -s ".$data["new"]["document_root"]."/ ".$tmp_symlink,LOGLEVEL_DEBUG); + } + } + } + + + if($this->action == 'insert' && $data["new"]["type"] == 'vhost') { + // Copy the error pages + if($data["new"]["errordocs"]){ + $error_page_path = escapeshellcmd($data["new"]["document_root"])."/web/error/"; + if (file_exists("/usr/local/ispconfig/server/conf-custom/error/".substr(escapeshellcmd($conf["language"]),0,2))){ + exec("cp /usr/local/ispconfig/server/conf-custom/error/".substr(escapeshellcmd($conf["language"]),0,2)."/* ".$error_page_path); + } + else { + if (file_exists("/usr/local/ispconfig/server/conf-custom/error/400.html")){ + exec("cp /usr/local/ispconfig/server/conf-custom/error/*.html ".$error_page_path); + } + else { + exec("cp /usr/local/ispconfig/server/conf/error/".substr(escapeshellcmd($conf["language"]),0,2)."/* ".$error_page_path); + } + } + exec("chmod -R a+r ".$error_page_path); + } + + // copy the standard index page + if (file_exists("/usr/local/ispconfig/server/conf-custom/index/standard_index.html_".substr(escapeshellcmd($conf["language"]),0,2))){ + exec("cp /usr/local/ispconfig/server/conf-custom/index/standard_index.html_".substr(escapeshellcmd($conf["language"]),0,2)." ".escapeshellcmd($data["new"]["document_root"])."/web/index.html"); + } + else { + if (file_exists("/usr/local/ispconfig/server/conf-custom/index/standard_index.html")){ + exec("cp /usr/local/ispconfig/server/conf-custom/index/standard_index.html ".escapeshellcmd($data["new"]["document_root"])."/web/index.html"); + } + else { + exec("cp /usr/local/ispconfig/server/conf/index/standard_index.html_".substr(escapeshellcmd($conf["language"]),0,2)." ".escapeshellcmd($data["new"]["document_root"])."/web/index.html"); + exec("cp /usr/local/ispconfig/server/conf/index/favicon.ico ".escapeshellcmd($data["new"]["document_root"])."/web/"); + exec("cp /usr/local/ispconfig/server/conf/index/robots.txt ".escapeshellcmd($data["new"]["document_root"])."/web/"); + exec("cp /usr/local/ispconfig/server/conf/index/.htaccess ".escapeshellcmd($data["new"]["document_root"])."/web/"); + } + } + exec("chmod -R a+r ".escapeshellcmd($data["new"]["document_root"])."/web/"); + + //** Copy the error documents on update when the error document checkbox has been activated and was deactivated before + } elseif ($this->action == 'update' && $data["new"]["type"] == 'vhost' && $data["old"]["errordocs"] == 0 && $data["new"]["errordocs"] == 1) { + + $error_page_path = escapeshellcmd($data["new"]["document_root"])."/web/error/"; + if (file_exists("/usr/local/ispconfig/server/conf-custom/error/".substr(escapeshellcmd($conf["language"]),0,2))){ + exec("cp /usr/local/ispconfig/server/conf-custom/error/".substr(escapeshellcmd($conf["language"]),0,2)."/* ".$error_page_path); + } + else { + if (file_exists("/usr/local/ispconfig/server/conf-custom/error/400.html")){ + exec("cp /usr/local/ispconfig/server/conf-custom/error/*.html ".$error_page_path); + } + else { + exec("cp /usr/local/ispconfig/server/conf/error/".substr(escapeshellcmd($conf["language"]),0,2)."/* ".$error_page_path); + } + } + exec("chmod -R a+r ".$error_page_path); + } // end copy error docs + + // Create group and user, if not exist + $app->uses("system"); + + $groupname = escapeshellcmd($data["new"]["system_group"]); + if($data["new"]["system_group"] != '' && !$app->system->is_group($data["new"]["system_group"])) { + exec("groupadd $groupname"); + if($apache_chrooted) $this->_exec("chroot ".escapeshellcmd($web_config['website_basedir'])." groupadd $groupname"); + $app->log("Adding the group: $groupname",LOGLEVEL_DEBUG); + } + + $username = escapeshellcmd($data["new"]["system_user"]); + if($data["new"]["system_user"] != '' && !$app->system->is_user($data["new"]["system_user"])) { + exec("useradd -d ".escapeshellcmd($data["new"]["document_root"])." -g $groupname -G sshusers $username -s /bin/false"); + if($apache_chrooted) $this->_exec("chroot ".escapeshellcmd($web_config['website_basedir'])." "."useradd -d ".escapeshellcmd($data["new"]["document_root"])." -g $groupname -G sshusers $username -s /bin/false"); + $app->log("Adding the user: $username",LOGLEVEL_DEBUG); + } + + // Set the quota for the user + if($username != '' && $app->system->is_user($username)) { + if($data["new"]["hd_quota"] > 0){ + $blocks_soft = $data["new"]["hd_quota"] * 1024; + $blocks_hard = $blocks_soft + 1024; + } else { + $blocks_soft = $blocks_hard = 0; + } + exec("setquota -u $username $blocks_soft $blocks_hard 0 0 -a &> /dev/null"); + exec("setquota -T -u $username 604800 604800 -a &> /dev/null"); + } + + if($this->action == 'insert') { + // Chown and chmod the directories below the document root + $this->_exec("chown -R $username:$groupname ".escapeshellcmd($data["new"]["document_root"])); + // The document root itself has to be owned by root in normal level and by the web owner in security level 20 + if($web_config['security_level'] == 20) { + $this->_exec("chown $username:$groupname ".escapeshellcmd($data["new"]["document_root"])); + } else { + $this->_exec("chown root:root ".escapeshellcmd($data["new"]["document_root"])); + } + } + + + + //* If the security level is set to high + if($web_config['security_level'] == 20) { + + $this->_exec("chmod 751 ".escapeshellcmd($data["new"]["document_root"]."/")); + $this->_exec("chmod 751 ".escapeshellcmd($data["new"]["document_root"])."/*"); + $this->_exec("chmod 710 ".escapeshellcmd($data["new"]["document_root"]."/web")); + + // make temp direcory writable for the apache user and the website user + $this->_exec("chmod 777 ".escapeshellcmd($data["new"]["document_root"]."/tmp")); + + $command = 'usermod'; + $command .= ' --groups sshusers'; + $command .= ' '.escapeshellcmd($data["new"]["system_user"]); + $this->_exec($command); + + //* if we have a chrooted apache enviroment + if($apache_chrooted) { + $this->_exec("chroot ".escapeshellcmd($web_config['website_basedir'])." ".$command); + + //* add the apache user to the client group in the chroot enviroment + $tmp_groupfile = $app->system->server_conf["group_datei"]; + $app->system->server_conf["group_datei"] = $web_config['website_basedir'].'/etc/group'; + $app->system->add_user_to_group($groupname, escapeshellcmd($web_config['user'])); + $app->system->server_conf["group_datei"] = $tmp_groupfile; + unset($tmp_groupfile); + } + + //* add the apache user to the client group + $app->system->add_user_to_group($groupname, escapeshellcmd($web_config['user'])); + + $this->_exec("chown $username:$groupname ".escapeshellcmd($data["new"]["document_root"])); + + /* + * Workaround for jailkit: If jailkit is enabled for the site, the + * website root has to be owned by the root user and we have to chmod it to 755 then + */ + + //* Check if there is a jailkit user for this site + $tmp = $app->db->queryOneRecord("SELECT count(shell_user_id) as number FROM shell_user WHERE parent_domain_id = ".$data["new"]["domain_id"]." AND chroot = 'jailkit'"); + if($tmp['number'] > 0) { + $this->_exec("chmod 755 ".escapeshellcmd($data["new"]["document_root"]."/")); + $this->_exec("chown root:root ".escapeshellcmd($data["new"]["document_root"]."/")); + } + unset($tmp); + + // If the security Level is set to medium + } else { + + $this->_exec("chmod 755 ".escapeshellcmd($data["new"]["document_root"]."/")); + $this->_exec("chmod 755 ".escapeshellcmd($data["new"]["document_root"]."/*")); + $this->_exec("chown root:root ".escapeshellcmd($data["new"]["document_root"]."/")); + + // make temp direcory writable for the apache user and the website user + $this->_exec("chmod 777 ".escapeshellcmd($data["new"]["document_root"]."/tmp")); + } + + // Change the owner of the error log to the owner of the website + if(!@is_file($data["new"]["document_root"]."/log/error.log")) exec('touch '.escapeshellcmd($data["new"]["document_root"])."/log/error.log"); + $this->_exec("chown $username:$groupname ".escapeshellcmd($data["new"]["document_root"])."/log/error.log"); + + + // Create the vhost config file + $app->load('tpl'); + + $tpl = new tpl(); + $tpl->newTemplate("vhost.conf.master"); + + $vhost_data = $data["new"]; + $vhost_data["web_document_root"] = $data["new"]["document_root"]."/web"; + $vhost_data["web_document_root_www"] = $web_config["website_basedir"]."/".$data["new"]["domain"]."/web"; + $vhost_data["web_basedir"] = $web_config["website_basedir"]; + $vhost_data["security_level"] = $web_config["security_level"]; + $vhost_data["allow_override"] = ($data["new"]["allow_override"] == '')?'All':$data["new"]["allow_override"]; + $vhost_data["php_open_basedir"] = ($data["new"]["php_open_basedir"] == '')?$data["new"]["document_root"]:$data["new"]["php_open_basedir"]; + $vhost_data["ssl_domain"] = $data["new"]["ssl_domain"]; + + // Check if a SSL cert exists + $ssl_dir = $data["new"]["document_root"]."/ssl"; + $domain = $data["new"]["ssl_domain"]; + $key_file = $ssl_dir.'/'.$domain.".key"; + $crt_file = $ssl_dir.'/'.$domain.".crt"; + $bundle_file = $ssl_dir.'/'.$domain.".bundle"; + + if($data["new"]["ssl"] == 'y' && @is_file($crt_file) && @is_file($key_file)) { + $vhost_data["ssl_enabled"] = 1; + $app->log("Enable SSL for: $domain",LOGLEVEL_DEBUG); + } else { + $vhost_data["ssl_enabled"] = 0; + $app->log("Disable SSL for: $domain",LOGLEVEL_DEBUG); + } + + if(@is_file($bundle_file)) $vhost_data['has_bundle_cert'] = 1; + + //$vhost_data["document_root"] = $data["new"]["document_root"]."/web"; + $tpl->setVar($vhost_data); + + // Rewrite rules + $rewrite_rules = array(); + if($data["new"]["redirect_type"] != '') { + if(substr($data["new"]["redirect_path"],-1) != '/') $data["new"]["redirect_path"] .= '/'; + /* Disabled path extension + if($data["new"]["redirect_type"] == 'no' && substr($data["new"]["redirect_path"],0,4) != 'http') { + $data["new"]["redirect_path"] = $data["new"]["document_root"]."/web".realpath($data["new"]["redirect_path"]).'/'; + } + */ + + $rewrite_rules[] = array( 'rewrite_domain' => $data["new"]["domain"], + 'rewrite_type' => ($data["new"]["redirect_type"] == 'no')?'':'['.$data["new"]["redirect_type"].']', + 'rewrite_target' => $data["new"]["redirect_path"]); + + switch($data["new"]["subdomain"]) { + case 'www': + $rewrite_rules[] = array( 'rewrite_domain' => 'www.'.$data["new"]["domain"], + 'rewrite_type' => ($data["new"]["redirect_type"] == 'no')?'':'['.$data["new"]["redirect_type"].']', + 'rewrite_target' => $data["new"]["redirect_path"]); + break; + case '*': + // TODO + //$rewrite_rules[] = array( 'rewrite_domain' => '*'.$alias["domain"], + // 'rewrite_type' => $alias["redirect_type"], + // 'rewrite_target' => $alias["redirect_path"]); + break; + } + } + + // get alias domains (co-domains and subdomains) + $aliases = $app->db->queryAllRecords("SELECT * FROM web_domain WHERE parent_domain_id = ".$data["new"]["domain_id"]." AND active = 'y'"); + $server_alias = array(); + switch($data["new"]["subdomain"]) { + case 'www': + $server_alias[] .= 'www.'.$data["new"]["domain"].' '; + break; + case '*': + $server_alias[] .= '*.'.$data["new"]["domain"].' '; + break; + } + if(is_array($aliases)) { + foreach($aliases as $alias) { + switch($alias["subdomain"]) { + case 'www': + $server_alias[] .= 'www.'.$alias["domain"].' '.$alias["domain"].' '; + break; + case '*': + $server_alias[] .= '*.'.$alias["domain"].' '.$alias["domain"].' '; + break; + default: + $server_alias[] .= $alias["domain"].' '; + break; + } + $app->log("Add server alias: $alias[domain]",LOGLEVEL_DEBUG); + // Rewriting + if($alias["redirect_type"] != '') { + if(substr($data["new"]["redirect_path"],-1) != '/') $data["new"]["redirect_path"] .= '/'; + /* Disabled path extension + if($data["new"]["redirect_type"] == 'no' && substr($data["new"]["redirect_path"],0,4) != 'http') { + $data["new"]["redirect_path"] = $data["new"]["document_root"]."/web".realpath($data["new"]["redirect_path"]).'/'; + } + */ + $rewrite_rules[] = array( 'rewrite_domain' => $alias["domain"], + 'rewrite_type' => ($alias["redirect_type"] == 'no')?'':'['.$alias["redirect_type"].']', + 'rewrite_target' => $alias["redirect_path"]); + switch($alias["subdomain"]) { + case 'www': + $rewrite_rules[] = array( 'rewrite_domain' => 'www.'.$alias["domain"], + 'rewrite_type' => ($alias["redirect_type"] == 'no')?'':'['.$alias["redirect_type"].']', + 'rewrite_target' => $alias["redirect_path"]); + break; + case '*': + // TODO + //$rewrite_rules[] = array( 'rewrite_domain' => '*'.$alias["domain"], + // 'rewrite_type' => $alias["redirect_type"], + // 'rewrite_target' => $alias["redirect_path"]); + break; + } + } + } + } + + //* If we have some alias records + if(count($server_alias) > 0) { + $server_alias_str = ''; + $n = 0; + + // begin a new ServerAlias line after 30 alias domains + foreach($server_alias as $tmp_alias) { + if($n % 30 == 0) $server_alias_str .= "\n ServerAlias "; + $server_alias_str .= $tmp_alias; + } + unset($tmp_alias); + + $tpl->setVar('alias',trim($server_alias_str)); + } else { + $tpl->setVar('alias',''); + } + + if(count($rewrite_rules) > 0) { + $tpl->setVar('rewrite_enabled',1); + } else { + $tpl->setVar('rewrite_enabled',0); + } + $tpl->setLoop('redirects',$rewrite_rules); + + /** + * install fast-cgi starter script and add script aliasd config + * first we create the script directory if not already created, then copy over the starter script + * settings are copied over from the server ini config for now + * TODO: Create form for fastcgi configs per site. + */ + + if ($data["new"]["php"] == "fast-cgi") + { + $fastcgi_config = $app->getconf->get_server_config($conf["server_id"], 'fastcgi'); + + $fastcgi_starter_path = str_replace("[system_user]",$data["new"]["system_user"],$fastcgi_config["fastcgi_starter_path"]); + $fastcgi_starter_path = str_replace("[client_id]",$client_id,$fastcgi_starter_path); + + if (!is_dir($fastcgi_starter_path)) + { + exec("mkdir -p ".escapeshellcmd($fastcgi_starter_path)); + //exec("chown ".$data["new"]["system_user"].":".$data["new"]["system_group"]." ".escapeshellcmd($fastcgi_starter_path)); + + + $app->log("Creating fastcgi starter script directory: $fastcgi_starter_path",LOGLEVEL_DEBUG); + } + + exec("chown -R ".$data["new"]["system_user"].":".$data["new"]["system_group"]." ".escapeshellcmd($fastcgi_starter_path)); + + $fcgi_tpl = new tpl(); + $fcgi_tpl->newTemplate("php-fcgi-starter.master"); + + $fcgi_tpl->setVar('php_ini_path',escapeshellcmd($fastcgi_config["fastcgi_phpini_path"])); + $fcgi_tpl->setVar('document_root',escapeshellcmd($data["new"]["document_root"])); + $fcgi_tpl->setVar('php_fcgi_children',escapeshellcmd($fastcgi_config["fastcgi_children"])); + $fcgi_tpl->setVar('php_fcgi_max_requests',escapeshellcmd($fastcgi_config["fastcgi_max_requests"])); + $fcgi_tpl->setVar('php_fcgi_bin',escapeshellcmd($fastcgi_config["fastcgi_bin"])); + $fcgi_tpl->setVar('security_level',intval($web_config["security_level"])); + + $php_open_basedir = ($data["new"]["php_open_basedir"] == '')?$data["new"]["document_root"]:$data["new"]["php_open_basedir"]; + $fcgi_tpl->setVar('open_basedir', escapeshellcmd($php_open_basedir)); + + $fcgi_starter_script = escapeshellcmd($fastcgi_starter_path.$fastcgi_config["fastcgi_starter_script"]); + file_put_contents($fcgi_starter_script,$fcgi_tpl->grab()); + unset($fcgi_tpl); + + $app->log("Creating fastcgi starter script: $fcgi_starter_script",LOGLEVEL_DEBUG); + + + exec("chmod 755 $fcgi_starter_script"); + exec("chown ".$data["new"]["system_user"].":".$data["new"]["system_group"]." $fcgi_starter_script"); + + $tpl->setVar('fastcgi_alias',$fastcgi_config["fastcgi_alias"]); + $tpl->setVar('fastcgi_starter_path',$fastcgi_starter_path); + $tpl->setVar('fastcgi_starter_script',$fastcgi_config["fastcgi_starter_script"]); + + } + + /** + * install cgi starter script and add script alias to config. + * This is needed to allow cgi with suexec (to do so, we need a bin in the document-path!) + * first we create the script directory if not already created, then copy over the starter script. + * TODO: we have to fetch the data from the server-settings. + */ + + if ($data["new"]["php"] == "cgi") + { + //$cgi_config = $app->getconf->get_server_config($conf["server_id"], 'cgi'); + + $cgi_config["cgi_starter_path"] = $web_config["website_basedir"]."/php-cgi-scripts/[system_user]/"; + $cgi_config["cgi_starter_script"] = "php-cgi-starter"; + $cgi_config["cgi_bin"] = "/usr/bin/php-cgi"; + + $cgi_starter_path = str_replace("[system_user]",$data["new"]["system_user"],$cgi_config["cgi_starter_path"]); + $cgi_starter_path = str_replace("[client_id]",$client_id,$cgi_starter_path); + + if (!is_dir($cgi_starter_path)) + { + exec("mkdir -p ".escapeshellcmd($cgi_starter_path)); + exec("chown ".$data["new"]["system_user"].":".$data["new"]["system_group"]." ".escapeshellcmd($cgi_starter_path)); + + $app->log("Creating cgi starter script directory: $cgi_starter_path",LOGLEVEL_DEBUG); + } + + $cgi_tpl = new tpl(); + $cgi_tpl->newTemplate("php-cgi-starter.master"); + + // This works, because php "rewrites" a symlink to the physical path + $php_open_basedir = ($data["new"]["php_open_basedir"] == '')?$data["new"]["document_root"]:$data["new"]["php_open_basedir"]; + $cgi_tpl->setVar('open_basedir', escapeshellcmd($php_open_basedir)); + $cgi_tpl->setVar('document_root', escapeshellcmd($data["new"]["document_root"])); + + // This will NOT work! + //$cgi_tpl->setVar('open_basedir', "/var/www/" . $data["new"]["domain"]); + $cgi_tpl->setVar('php_cgi_bin',$cgi_config["cgi_bin"]); + $cgi_tpl->setVar('security_level',$web_config["security_level"]); + + $cgi_starter_script = escapeshellcmd($cgi_starter_path.$cgi_config["cgi_starter_script"]); + file_put_contents($cgi_starter_script,$cgi_tpl->grab()); + unset($cgi_tpl); + + $app->log("Creating cgi starter script: $cgi_starter_script",LOGLEVEL_DEBUG); + + + exec("chmod 755 $cgi_starter_script"); + exec("chown ".$data["new"]["system_user"].":".$data["new"]["system_group"]." $cgi_starter_script"); + + $tpl->setVar('cgi_starter_path',$cgi_starter_path); + $tpl->setVar('cgi_starter_script',$cgi_config["cgi_starter_script"]); + + } + + $vhost_file = escapeshellcmd($web_config["vhost_conf_dir"].'/'.$data["new"]["domain"].'.vhost'); + file_put_contents($vhost_file,$tpl->grab()); + $app->log("Writing the vhost file: $vhost_file",LOGLEVEL_DEBUG); + unset($tpl); + + // Set the symlink to enable the vhost + $vhost_symlink = escapeshellcmd($web_config["vhost_conf_enabled_dir"].'/'.$data["new"]["domain"].'.vhost'); + if($data["new"]["active"] == 'y' && !is_link($vhost_symlink)) { + symlink($vhost_file,$vhost_symlink); + $app->log("Creating the symlink: $vhost_symlink => $vhost_file",LOGLEVEL_DEBUG); + } + + // Remove the symlink, if site is inactive + if($data["new"]["active"] == 'n' && is_link($vhost_symlink)) { + unlink($vhost_symlink); + $app->log("Removing symlink: $vhost_symlink => $vhost_file",LOGLEVEL_DEBUG); + } + + // remove old symlink and vhost file, if domain name of the site has changed + if($this->action == 'update' && $data["old"]["domain"] != '' && $data["new"]["domain"] != $data["old"]["domain"]) { + $vhost_symlink = escapeshellcmd($web_config["vhost_conf_enabled_dir"].'/'.$data["old"]["domain"].'.vhost'); + unlink($vhost_symlink); + $app->log("Removing symlink: $vhost_symlink => $vhost_file",LOGLEVEL_DEBUG); + $vhost_file = escapeshellcmd($web_config["vhost_conf_dir"].'/'.$data["old"]["domain"].'.vhost'); + unlink($vhost_file); + $app->log("Removing File $vhost_file",LOGLEVEL_DEBUG); + } + + //* Create .htaccess and .htpasswd file for website statistics + if(!is_file($data["new"]["document_root"].'/web/stats/.htaccess') or $data["old"]["document_root"] != $data["new"]["document_root"]) { + if(!is_dir($data["new"]["document_root"].'/web/stats')) mkdir($data["new"]["document_root"].'/web/stats'); + $ht_file = "AuthType Basic\nAuthName \"Members Only\"\nAuthUserFile ".$data["new"]["document_root"]."/.htpasswd_stats\nrequire valid-user"; + file_put_contents($data["new"]["document_root"].'/web/stats/.htaccess',$ht_file); + chmod($data["new"]["document_root"].'/web/stats/.htaccess',0755); + unset($ht_file); + } + + if(!is_file($data["new"]["document_root"].'/.htpasswd_stats') || $data["new"]["stats_password"] != $data["old"]["stats_password"]) { + if(trim($data["new"]["stats_password"]) != '') { + $htp_file = 'admin:'.trim($data["new"]["stats_password"]); + file_put_contents($data["new"]["document_root"].'/.htpasswd_stats',$htp_file); + chmod($data["new"]["document_root"].'/.htpasswd_stats',0755); + unset($htp_file); + } + } + + + if($apache_chrooted) { + $app->services->restartServiceDelayed('httpd','restart'); + } else { + // request a httpd reload when all records have been processed + $app->services->restartServiceDelayed('httpd','reload'); + } + + //* Unset action to clean it for next processed vhost. + $this->action = ''; + + } + + function delete($event_name,$data) { + global $app, $conf; + + // load the server configuration options + $app->uses("getconf"); + $web_config = $app->getconf->get_server_config($conf["server_id"], 'web'); + + //* Check if this is a chrooted setup + if($web_config['website_basedir'] != '' && @is_file($web_config['/var/www'].'/etc/passwd')) { + $apache_chrooted = true; + } else { + $apache_chrooted = false; + } + + if($data["old"]["type"] != "vhost" && $data["old"]["parent_domain_id"] > 0) { + //* This is a alias domain or subdomain, so we have to update the website instead + $parent_domain_id = intval($data["old"]["parent_domain_id"]); + $tmp = $app->db->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ".$parent_domain_id." AND active = 'y'"); + $data["new"] = $tmp; + $data["old"] = $tmp; + $this->action = 'update'; + // just run the update function + $this->update($event_name,$data); + + } else { + //* This is a website + // Deleting the vhost file, symlink and the data directory + $vhost_symlink = escapeshellcmd($web_config["vhost_conf_enabled_dir"].'/'.$data["old"]["domain"].'.vhost'); + unlink($vhost_symlink); + $app->log("Removing symlink: $vhost_symlink => $vhost_file",LOGLEVEL_DEBUG); + + $vhost_file = escapeshellcmd($web_config["vhost_conf_dir"].'/'.$data["old"]["domain"].'.vhost'); + unlink($vhost_file); + $app->log("Removing vhost file: $vhost_file",LOGLEVEL_DEBUG); + + $docroot = escapeshellcmd($data["old"]["document_root"]); + if($docroot != '' && !stristr($docroot,'..')) exec("rm -rf $docroot"); + + + //remove the php fastgi starter script if available + if ($data["old"]["php"] == "fast-cgi") + { + $fastcgi_starter_path = str_replace("[system_user]",$data["old"]["system_user"],$web_config["fastcgi_starter_path"]); + if (is_dir($fastcgi_starter_path)) + { + exec("rm -rf $fastcgi_starter_path"); + } + } + + //remove the php cgi starter script if available + if ($data["old"]["php"] == "cgi") + { + // TODO: fetch the date from the server-settings + $web_config["cgi_starter_path"] = $web_config["website_basedir"]."/php-cgi-scripts/[system_user]/"; + + $cgi_starter_path = str_replace("[system_user]",$data["old"]["system_user"],$web_config["cgi_starter_path"]); + if (is_dir($cgi_starter_path)) + { + exec("rm -rf $cgi_starter_path"); + } + } + + $app->log("Removing website: $docroot",LOGLEVEL_DEBUG); + + // Delete the symlinks for the sites + $client = $app->db->queryOneRecord("SELECT client_id FROM sys_group WHERE sys_group.groupid = ".intval($data["old"]["sys_groupid"])); + $client_id = intval($client["client_id"]); + unset($client); + $tmp_symlinks_array = explode(':',$web_config["website_symlinks"]); + if(is_array($tmp_symlinks_array)) { + foreach($tmp_symlinks_array as $tmp_symlink) { + $tmp_symlink = str_replace("[client_id]",$client_id,$tmp_symlink); + $tmp_symlink = str_replace("[website_domain]",$data["old"]["domain"],$tmp_symlink); + // Remove trailing slash + if(substr($tmp_symlink, -1, 1) == '/') $tmp_symlink = substr($tmp_symlink, 0, -1); + // create the symlinks, if not exist + if(is_link($tmp_symlink)) { + unlink($tmp_symlink); + $app->log("Removing symlink: ".$tmp_symlink,LOGLEVEL_DEBUG); + } + } + } + // end removing symlinks + + // Delete the log file directory + $vhost_logfile_dir = escapeshellcmd('/var/log/ispconfig/httpd/'.$data["old"]["domain"]); + if($data["old"]["domain"] != '' && !stristr($vhost_logfile_dir,'..')) exec("rm -rf $vhost_logfile_dir"); + $app->log("Removing website logfile directory: $vhost_logfile_dir",LOGLEVEL_DEBUG); + + //delete the web user + $command = 'userdel'; + $command .= ' '.$data["old"]["system_user"]; + exec($command); + if($apache_chrooted) $this->_exec("chroot ".escapeshellcmd($web_config['website_basedir'])." ".$command); + + } + } + + //* This function is called when a IP on the server is inserted, updated or deleted + function server_ip($event_name,$data) { + global $app, $conf; + + // load the server configuration options + $app->uses("getconf"); + $web_config = $app->getconf->get_server_config($conf["server_id"], 'web'); + + $app->load('tpl'); + + $tpl = new tpl(); + $tpl->newTemplate("apache_ispconfig.conf.master"); + $records = $app->db->queryAllRecords("SELECT * FROM server_ip WHERE server_id = ".$conf["server_id"]." AND virtualhost = 'y'"); + + if(count($records) > 0) { + $tpl->setLoop('ip_adresses',$records); + } + + $vhost_file = escapeshellcmd($web_config["vhost_conf_dir"].'/ispconfig.conf'); + file_put_contents($vhost_file,$tpl->grab()); + $app->log("Writing the conf file: ispconfig.conf",LOGLEVEL_DEBUG); + unset($tpl); + + } + + //* Wrapper for exec function for easier debugging + private function _exec($command) { + global $app; + $app->log("exec: ".$command,LOGLEVEL_DEBUG); + exec($command); + } + + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/plugins-available/apps_vhost_plugin.inc.php b/interface/ispconfig/server/plugins-available/apps_vhost_plugin.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..e864dbd99474c2d2b6456ca314bbb2d76c646ffc --- /dev/null +++ b/interface/ispconfig/server/plugins-available/apps_vhost_plugin.inc.php @@ -0,0 +1,114 @@ +plugins->registerEvent('server_insert','apps_vhost_plugin','insert'); + $app->plugins->registerEvent('server_update','apps_vhost_plugin','update'); + + + } + + function insert($event_name,$data) { + global $app, $conf; + + $this->update($event_name,$data); + + } + + // The purpose of this plugin is to rewrite the main.cf file + function update($event_name,$data) { + global $app, $conf; + + // get the config + $app->uses("getconf"); + $web_config = $app->getconf->get_server_config($conf["server_id"], 'web'); + + // Dont just copy over the virtualhost template but add some custom settings + $content = file_get_contents($conf["rootpath"]."/conf/apache_apps.vhost.master"); + + $vhost_conf_dir = $web_config['vhost_conf_dir']; + $vhost_conf_enabled_dir = $web_config['vhost_conf_enabled_dir']; + $apps_vhost_servername = ($web_config['apps_vhost_servername'] == '')?'':'ServerName '.$web_config['apps_vhost_servername']; + + $web_config['apps_vhost_port'] = (empty($web_config['apps_vhost_port']))?8081:$web_config['apps_vhost_port']; + $web_config['apps_vhost_ip'] = (empty($web_config['apps_vhost_ip']))?'_default_':$web_config['apps_vhost_ip']; + + $content = str_replace('{apps_vhost_ip}', $web_config['apps_vhost_ip'], $content); + $content = str_replace('{apps_vhost_port}', $web_config['apps_vhost_port'], $content); + $content = str_replace('{apps_vhost_dir}', $web_config['website_basedir'].'/apps', $content); + $content = str_replace('{apps_vhost_servername}', $apps_vhost_servername, $content); + $content = str_replace('{apps_vhost_basedir}', $web_config['website_basedir'], $content); + + + // comment out the listen directive if port is 80 or 443 + if($web_config['apps_vhost_ip'] == 80 or $web_config['apps_vhost_ip'] == 443) { + $content = str_replace('{vhost_port_listen}', '#', $content); + } else { + $content = str_replace('{vhost_port_listen}', '', $content); + } + + file_put_contents("$vhost_conf_dir/apps.vhost", $content); + + $app->services->restartServiceDelayed('httpd','restart'); + + + } + + +} // end class + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/plugins-available/bind_dlz_plugin.inc.php b/interface/ispconfig/server/plugins-available/bind_dlz_plugin.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..c0f67472f35ce56cbd615f5d9fce41204112676a --- /dev/null +++ b/interface/ispconfig/server/plugins-available/bind_dlz_plugin.inc.php @@ -0,0 +1,352 @@ +plugins->registerEvent('dns_soa_insert',$this->plugin_name,'soa_insert'); + $app->plugins->registerEvent('dns_soa_update',$this->plugin_name,'soa_update'); + $app->plugins->registerEvent('dns_soa_delete',$this->plugin_name,'soa_delete'); + + //* RR + $app->plugins->registerEvent('dns_rr_insert',$this->plugin_name,'rr_insert'); + $app->plugins->registerEvent('dns_rr_update',$this->plugin_name,'rr_update'); + $app->plugins->registerEvent('dns_rr_delete',$this->plugin_name,'rr_delete'); + } + + + function soa_insert($event_name,$data) + { + global $app, $conf; + + if($data["new"]["active"] != 'Y') return; + + $origin = substr($data["new"]["origin"], 0, -1); + $ispconfig_id = $data["new"]["id"]; + $serial = $app->db->queryOneRecord("SELECT * FROM dns_soa WHERE id = ".$ispconfig_id); + + $ttl = $data["new"]["ttl"]; + + $_db = clone $app->db; + $_db->dbName = 'named'; + + $_db->query("INSERT INTO records (zone, ttl, type, primary_ns, resp_contact, serial, refresh, retry, expire, minimum, ispconfig_id) VALUES ". + "('$origin', $ttl, 'SOA', '{$data["new"]["ns"]}', '{$data["new"]["mbox"]}', '{$serial["serial"]}', '{$serial["refresh"]}'," . + "'{$serial["retry"]}', '{$serial["expire"]}', '{$serial["minimum"]}', $ispconfig_id)"); + unset($_db); + } + + function soa_update($event_name,$data) + { + global $app, $conf; + + if($data["new"]["active"] != 'Y') + { + if($data["old"]["active"] != 'Y') return; + $this->soa_delete($event_name,$data); + } + else + { + if($data["old"]["active"] == 'Y') + { + $origin = substr($data["new"]["origin"], 0, -1); + $ispconfig_id = $data["new"]["id"]; + $serial = $app->db->queryOneRecord("SELECT * FROM dns_soa WHERE id = ".$ispconfig_id); + + $ttl = $data["new"]["ttl"]; + + $_db = clone $app->db; + $_db->dbName = 'named'; + + $_db->query("UPDATE records SET zone = '$origin', ttl = $ttl, primary_ns = '{$data["new"]["ns"]}', resp_contact = '{$data["new"]["mbox"]}', ". + "serial = '{$serial["serial"]}', refresh = '{$serial["refresh"]}', retry = '{$serial["retry"]}', expire = '{$serial["expire"]}', ". + "minimum = '{$serial["minimum"]}' WHERE ispconfig_id = ".$data["new"]["id"]." AND type = 'SOA'"); + unset($_db); + } + else + { + $this->soa_insert($event_name,$data); + $ispconfig_id = $data["new"]["id"]; + + if ($records = $app->db->queryAllRecords("SELECT * FROM dns_rr WHERE zone = $ispconfig_id AND active = 'Y'")) + { + foreach($records as $record) + { + foreach ($record as $key => $val) { + $data["new"][$key] = $val; + } + $this->rr_insert("dns_rr_insert", $data); + } + } + } + } + + } + + function soa_delete($event_name,$data) + { + global $app, $conf; + + $_db = clone $app->db; + $_db->dbName = 'named'; + + $_db->query("DELETE FROM records WHERE ispconfig_id = {$data["old"]["id"]}"); + unset($_db); + } + + function rr_insert($event_name,$data) + { + global $app, $conf; + if($data["new"]["active"] != 'Y') return; + + $zone = $app->db->queryOneRecord("SELECT * FROM dns_soa WHERE id = ".$data["new"]["zone"]); + $origin = substr($zone["origin"], 0, -1); + $ispconfig_id = $data["new"]["id"]; + + $type = $data["new"]["type"]; + + if (substr($data["new"]["name"], -1) == '.') { + $name = substr($data["new"]["name"], 0, -1); + } else { + $name = ($data["new"]["name"] == "") ? $name = '@' : $data["new"]["name"]; + } + + if ($name == $origin || $name == '') { + $name = '@'; + } + + switch ($type) + { + case "CNAME": + case "MX": + case "NS": + case "ALIAS": + case "PTR": + case "SRV": + if(substr($data["new"]["data"], -1) != '.'){ + $content = $data["new"]["data"] . '.'; + } else { + $content = $data["new"]["data"]; + } + break; + case "HINFO": + $content = $data["new"]["data"]; + $quote1 = strpos($content, '"'); + + if($quote1 !== FALSE) { + $quote2 = strpos(substr($content, ($quote1 + 1)), '"'); + } + + if ($quote1 !== FALSE && $quote2 !== FALSE) { + $text_between_quotes = str_replace(' ', '_', substr($content, ($quote1 + 1), (($quote2 - $quote1)))); + $content = $text_between_quotes.substr($content, ($quote2 + 2)); + } + break; + default: + $content = $data["new"]["data"]; + } + + $ttl = $data["new"]["ttl"]; + + $_db = clone $app->db; + $_db->dbName = 'named'; + + if ($type == 'MX') { + $_db->query("INSERT INTO records (zone, ttl, type, host, mx_priority, data, ispconfig_id)". + " VALUES ('$origin', $ttl, '$type', '$name', {$data["new"]["aux"]}, '$content', $ispconfig_id)"); + } else { + $_db->query("INSERT INTO records (zone, ttl, type, host, data, ispconfig_id)". + " VALUES ('$origin', $ttl, '$type', '$name', '$content', $ispconfig_id)"); + } + + unset($_db); + } + + function rr_update($event_name,$data) + { + global $app, $conf; + + if ($data["new"]["active"] != 'Y') + { + if($data["old"]["active"] != 'Y') return; + $this->rr_delete($event_name,$data); + } + else + { + if ($data["old"]["active"] == 'Y') + { + $zone = $app->db->queryOneRecord("SELECT * FROM dns_soa WHERE id = ".$data["new"]["zone"]); + $origin = substr($zone["origin"], 0, -1); + $ispconfig_id = $data["new"]["id"]; + + $type = $data["new"]["type"]; + + if (substr($data["new"]["name"], -1) == '.') { + $name = substr($data["new"]["name"], 0, -1); + } else { + $name = ($data["new"]["name"] == "") ? $name = '@' : $data["new"]["name"]; + } + + if ($name == $origin || $name == '') { + $name = '@'; + } + + switch ($type) + { + case "CNAME": + case "MX": + case "NS": + case "ALIAS": + case "PTR": + case "SRV": + if(substr($data["new"]["data"], -1) != '.'){ + $content = $data["new"]["data"] . '.'; + } else { + $content = $data["new"]["data"]; + } + break; + case "HINFO": + $content = $data["new"]["data"]; + $quote1 = strpos($content, '"'); + if($quote1 !== FALSE){ + $quote2 = strpos(substr($content, ($quote1 + 1)), '"'); + } + if($quote1 !== FALSE && $quote2 !== FALSE){ + $text_between_quotes = str_replace(' ', '_', substr($content, ($quote1 + 1), (($quote2 - $quote1)))); + $content = $text_between_quotes.substr($content, ($quote2 + 2)); + } + break; + default: + $content = $data["new"]["data"]; + } + + $ttl = $data["new"]["ttl"]; + $prio = (int)$data["new"]["aux"]; + + $_db = clone $app->db; + $_db->dbName = 'named'; + + if ($type == 'MX') { + $_db->query("UPDATE records SET zone = '$origin', ttl = $ttl, type = '$type', host = '$name', mx_priority = $prio, ". + "data = '$content' WHERE ispconfig_id = $ispconfig_id AND type != 'SOA'"); + } else { + $_db->query("UPDATE records SET zone = '$origin', ttl = $ttl, type = '$type', host = '$name', ". + "data = '$content' WHERE ispconfig_id = $ispconfig_id AND type != 'SOA'"); + } + + unset($_db); + } else { + $this->rr_insert($event_name,$data); + } + } + } + + function rr_delete($event_name,$data) { + global $app, $conf; + + $_db = clone $app->db; + $_db->dbName = 'named'; + + $_db->query("DELETE FROM named.records WHERE ispconfig_id = {$data["old"]["id"]} AND type != 'SOA'"); + unset($_db); + } +} // end class +?> \ No newline at end of file diff --git a/interface/ispconfig/server/plugins-available/bind_plugin.inc.php b/interface/ispconfig/server/plugins-available/bind_plugin.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..f7de3291239d830a71920d046338d5a75e4bc027 --- /dev/null +++ b/interface/ispconfig/server/plugins-available/bind_plugin.inc.php @@ -0,0 +1,224 @@ +plugins->registerEvent('dns_soa_insert',$this->plugin_name,'soa_insert'); + $app->plugins->registerEvent('dns_soa_update',$this->plugin_name,'soa_update'); + $app->plugins->registerEvent('dns_soa_delete',$this->plugin_name,'soa_delete'); + + //* RR + $app->plugins->registerEvent('dns_rr_insert',$this->plugin_name,'rr_insert'); + $app->plugins->registerEvent('dns_rr_update',$this->plugin_name,'rr_update'); + $app->plugins->registerEvent('dns_rr_delete',$this->plugin_name,'rr_delete'); + + } + + + function soa_insert($event_name,$data) { + global $app, $conf; + + $this->action = 'insert'; + $this->soa_update($event_name,$data); + + } + + function soa_update($event_name,$data) { + global $app, $conf; + + //* Load libraries + $app->uses("getconf,tpl"); + + //* load the server configuration options + $dns_config = $app->getconf->get_server_config($conf["server_id"], 'dns'); + + //* Write the domain file + if(!empty($data['new']['id'])) { + $tpl = new tpl(); + $tpl->newTemplate("bind_pri.domain.master"); + + $zone = $data['new']; + $tpl->setVar($zone); + + $records = $app->db->queryAllRecords("SELECT * FROM dns_rr WHERE zone = ".$zone['id']." AND active = 'Y'"); + $tpl->setLoop('zones',$records); + + + $filename = escapeshellcmd($dns_config['bind_zonefiles_dir'].'/pri.'.substr($zone['origin'],0,-1)); + $app->log("Writing BIND domain file: ".$filename,LOGLEVEL_DEBUG); + file_put_contents($filename,$tpl->grab()); + exec('chown '.escapeshellcmd($dns_config['bind_user']).':'.escapeshellcmd($dns_config['bind_group']).' '.$filename); + unset($tpl); + unset($records); + unset($records_out); + unset($zone); + } + + //* rebuild the named.conf file if the origin has changed or when the origin is inserted. + //if($this->action == 'insert' || $data['old']['origin'] != $data['new']['origin']) { + $this->write_named_conf($data,$dns_config); + //} + + //* Delete old domain file, if domain name has been changed + if($data['old']['origin'] != $data['new']['origin']) { + $filename = $dns_config['bind_zonefiles_dir'].'/pri.'.substr($data['old']['origin'],0,-1); + if(is_file($filename)) unset($filename); + } + + //* Reload bind nameserver + $app->services->restartServiceDelayed('bind','reload'); + + } + + function soa_delete($event_name,$data) { + global $app, $conf; + + //* load the server configuration options + $app->uses("getconf,tpl"); + $dns_config = $app->getconf->get_server_config($conf["server_id"], 'dns'); + + //* rebuild the named.conf file + $this->write_named_conf($data,$dns_config); + + //* Delete the domain file + $zone_file_name = $dns_config['bind_zonefiles_dir'].'/pri.'.substr($data['old']['origin'],0,-1); + if(is_file($zone_file_name)) unlink($zone_file_name); + $app->log("Deleting BIND domain file: ".$zone_file_name,LOGLEVEL_DEBUG); + + //* Reload bind nameserver + $app->services->restartServiceDelayed('bind','reload'); + + } + + function rr_insert($event_name,$data) { + global $app, $conf; + + //* Get the data of the soa and call soa_update + $tmp = $app->db->queryOneRecord("SELECT * FROM dns_soa WHERE id = ".$data['new']['zone']); + $data["new"] = $tmp; + $data["old"] = $tmp; + $this->action = 'update'; + $this->soa_update($event_name,$data); + + } + + function rr_update($event_name,$data) { + global $app, $conf; + + //* Get the data of the soa and call soa_update + $tmp = $app->db->queryOneRecord("SELECT * FROM dns_soa WHERE id = ".$data['new']['zone']); + $data["new"] = $tmp; + $data["old"] = $tmp; + $this->action = 'update'; + $this->soa_update($event_name,$data); + + } + + function rr_delete($event_name,$data) { + global $app, $conf; + + //* Get the data of the soa and call soa_update + $tmp = $app->db->queryOneRecord("SELECT * FROM dns_soa WHERE id = ".$data['old']['zone']); + $data["new"] = $tmp; + $data["old"] = $tmp; + $this->action = 'update'; + $this->soa_update($event_name,$data); + + } + + ################################################################### + + function write_named_conf($data, $dns_config) { + global $app, $conf; + + $tmps = $app->db->queryAllRecords("SELECT origin, xfer, also_notify FROM dns_soa WHERE active = 'Y'"); + $zones = array(); + + foreach($tmps as $tmp) { + + $options = ''; + if(trim($tmp['xfer']) != '') $options .= ' allow-transfer {'.str_replace(',',';',$tmp['xfer']).";};\n"; + if(trim($tmp['also_notify']) != '') $options .= ' also-notify {'.str_replace(',',';',$tmp['also_notify']).";};\n"; + + $zones[] = array( 'zone' => substr($tmp['origin'],0,-1), + 'zonefile_path' => $dns_config['bind_zonefiles_dir'].'/pri.'.substr($tmp['origin'],0,-1), + 'options' => $options + ); + } + + $tpl = new tpl(); + $tpl->newTemplate("bind_named.conf.local.master"); + $tpl->setLoop('zones',$zones); + + file_put_contents($dns_config['named_conf_local_path'],$tpl->grab()); + $app->log("Writing BIND named.conf.local file: ".$dns_config['named_conf_local_path'],LOGLEVEL_DEBUG); + + unset($tpl); + unset($zones); + unset($tmps); + + } + + + + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/plugins-available/cron_jailkit_plugin.inc.php b/interface/ispconfig/server/plugins-available/cron_jailkit_plugin.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..43adee1c52679c79ab3e9d78bf36cac46251594d --- /dev/null +++ b/interface/ispconfig/server/plugins-available/cron_jailkit_plugin.inc.php @@ -0,0 +1,328 @@ +plugins->registerEvent('cron_insert', $this->plugin_name, 'insert'); + $app->plugins->registerEvent('cron_update', $this->plugin_name, 'update'); + $app->plugins->registerEvent('cron_delete', $this->plugin_name, 'delete'); + + } + + //* This function is called, when a cron job is inserted in the database + function insert($event_name,$data) { + global $app, $conf; + + if($data["new"]["parent_domain_id"] == '') { + $app->log("Parent domain not set",LOGLEVEL_WARN); + return 0; + } + + //* get data from web + $parent_domain = $app->db->queryOneRecord("SELECT `domain_id`, `system_user`, `system_group`, `document_root`, `domain` FROM `web_domain` WHERE `domain_id` = ".intval($data["new"]["parent_domain_id"])); + if(!$parent_domain["domain_id"]) { + $app->log("Parent domain not found",LOGLEVEL_WARN); + return 0; + } elseif($parent_domain["system_user"] == 'root' or $parent_domain["system_group"] == 'root') { + $app->log("Websites (and Crons) can not be owned by the root user or group.",LOGLEVEL_WARN); + return 0; + } + + $this->parent_domain = $parent_domain; + + $app->uses('system'); + + if($app->system->is_user($parent_domain['system_user'])) { + + /** + * Setup Jailkit Chroot System If Enabled + */ + if ($data['new']['type'] == "chrooted") + { + // load the server configuration options + /* + $app->uses("getconf"); + $this->data = $data; + $this->app = $app; + $this->jailkit_config = $app->getconf->get_server_config($conf["server_id"], 'jailkit'); + $this->parent_domain = $parent_domain; + + $this->_setup_jailkit_chroot(); + + //$command .= 'usermod -U '.escapeshellcmd($parent_domain['system_user']); + //exec($command); + + $this->_add_jailkit_user(); + */ + $app->uses("getconf"); + $this->data = $data; + $this->app = $app; + $this->jailkit_config = $app->getconf->get_server_config($conf["server_id"], 'jailkit'); + + $this->_update_website_security_level(); + + $this->_setup_jailkit_chroot(); + + $this->_add_jailkit_user(); + + $command .= 'usermod -U '.escapeshellcmd($parent_domain["system_user"]); + exec($command); + + $this->_update_website_security_level(); + } + + $app->log("Jailkit Plugin (Cron) -> insert username:".$parent_domain['system_user'],LOGLEVEL_DEBUG); + + } else { + $app->log("Jailkit Plugin (Cron) -> insert username:".$parent_domain['system_user']." skipped, the user does not exist.",LOGLEVEL_WARN); + } + + } + + //* This function is called, when a cron job is updated in the database + function update($event_name,$data) { + global $app, $conf; + + if($data["new"]["parent_domain_id"] == '') { + $app->log("Parent domain not set",LOGLEVEL_WARN); + return 0; + } + //* get data from web + $parent_domain = $app->db->queryOneRecord("SELECT `domain_id`, `system_user`, `system_group`, `document_root`, `domain` FROM `web_domain` WHERE `domain_id` = ".intval($data["new"]["parent_domain_id"])); + if(!$parent_domain["domain_id"]) { + $app->log("Parent domain not found",LOGLEVEL_WARN); + return 0; + } elseif($parent_domain["system_user"] == 'root' or $parent_domain["system_group"] == 'root') { + $app->log("Websites (and Crons) can not be owned by the root user or group.",LOGLEVEL_WARN); + return 0; + } + + $app->uses('system'); + + $this->parent_domain = $parent_domain; + + if($app->system->is_user($parent_domain['system_user'])) { + + /** + * Setup Jailkit Chroot System If Enabled + */ + if ($data['new']['type'] == "chrooted") + { + $app->log("Jailkit Plugin (Cron) -> setting up jail", LOGLEVEL_DEBUG); + // load the server configuration options + /* + $app->uses("getconf"); + $this->data = $data; + $this->app = $app; + $this->jailkit_config = $app->getconf->get_server_config($conf["server_id"], 'jailkit'); + $this->parent_domain = $parent_domain; + + $this->_setup_jailkit_chroot(); + $this->_add_jailkit_user(); + */ + $app->uses("getconf"); + $this->data = $data; + $this->app = $app; + $this->jailkit_config = $app->getconf->get_server_config($conf["server_id"], 'jailkit'); + + $this->_update_website_security_level(); + + $this->_setup_jailkit_chroot(); + $this->_add_jailkit_user(); + + $this->_update_website_security_level(); + } + + $app->log("Jailkit Plugin (Cron) -> update username:".$parent_domain['system_user'],LOGLEVEL_DEBUG); + + } else { + $app->log("Jailkit Plugin (Cron) -> update username:".$parent_domain['system_user']." skipped, the user does not exist.",LOGLEVEL_WARN); + } + + } + + //* This function is called, when a cron job is deleted in the database + function delete($event_name,$data) { + global $app, $conf; + + //* nothing to do here! + + } + + function _setup_jailkit_chroot() + { + //check if the chroot environment is created yet if not create it with a list of program sections from the config + if (!is_dir($this->parent_domain['document_root'].'/etc/jailkit')) + { + $command = '/usr/local/ispconfig/server/scripts/create_jailkit_chroot.sh'; + $command .= ' '.escapeshellcmd($this->parent_domain['document_root']); + $command .= ' \''.$this->jailkit_config['jailkit_chroot_app_sections'].'\''; + exec($command); + + $this->app->log("Added jailkit chroot with command: ".$command,LOGLEVEL_DEBUG); + + //$this->_add_jailkit_programs(); // done later on + + $this->app->load('tpl'); + + $tpl = new tpl(); + $tpl->newTemplate("bash.bashrc.master"); + + $tpl->setVar('jailkit_chroot',true); + $tpl->setVar('domain',$this->parent_domain['domain']); + $tpl->setVar('home_dir',$this->_get_home_dir("")); + + $bashrc = escapeshellcmd($this->parent_domain['document_root']).'/etc/bash.bashrc'; + if(@is_file($bashrc)) exec('rm '.$bashrc); + + file_put_contents($bashrc,$tpl->grab()); + unset($tpl); + + $this->app->log("Added bashrc scrpt : ".$bashrc,LOGLEVEL_DEBUG); + + $tpl = new tpl(); + $tpl->newTemplate("motd.master"); + + $tpl->setVar('domain',$this->parent_domain['domain']); + + $motd = escapeshellcmd($this->parent_domain['document_root']).'/var/run/motd'; + if(@is_file($motd)) exec('rm '.$motd); + + file_put_contents($motd,$tpl->grab()); + + } + $this->_add_jailkit_programs(); + } + + function _add_jailkit_programs() + { + //copy over further programs and its libraries + $command = '/usr/local/ispconfig/server/scripts/create_jailkit_programs.sh'; + $command .= ' '.escapeshellcmd($this->parent_domain['document_root']); + $command .= ' \''.$this->jailkit_config['jailkit_chroot_app_programs'].'\''; + exec($command); + + $this->app->log("Added programs to jailkit chroot with command: ".$command,LOGLEVEL_DEBUG); + + $command = '/usr/local/ispconfig/server/scripts/create_jailkit_programs.sh'; + $command .= ' '.escapeshellcmd($this->parent_domain['document_root']); + $command .= ' \''.$this->jailkit_config['jailkit_chroot_cron_programs'].'\''; + exec($command); + + $this->app->log("Added cron programs to jailkit chroot with command: ".$command,LOGLEVEL_DEBUG); + } + + function _add_jailkit_user() + { + //add the user to the chroot + $jailkit_chroot_userhome = $this->_get_home_dir($this->parent_domain['system_user']); + + if(!is_dir($this->parent_domain['document_root'].'/etc')) mkdir($this->parent_domain['document_root'].'/etc'); + if(!is_file($this->parent_domain['document_root'].'/etc/passwd')) exec('touch '.$this->parent_domain['document_root'].'/etc/passwd'); + + // IMPORTANT! + // ALWAYS create the user. Even if the user was created before + // if we check if the user exists, then a update (no shell -> jailkit) will not work + // and the user has FULL ACCESS to the root of the server! + $command = '/usr/local/ispconfig/server/scripts/create_jailkit_user.sh'; + $command .= ' '.escapeshellcmd($this->parent_domain['system_user']); + $command .= ' '.escapeshellcmd($this->parent_domain['document_root']); + $command .= ' '.$jailkit_chroot_userhome; + $command .= ' '.escapeshellcmd("/bin/bash"); + exec($command); + + $this->app->log("Added jailkit user to chroot with command: ".$command,LOGLEVEL_DEBUG); + + exec("mkdir -p ".escapeshellcmd($this->parent_domain['document_root'].$jailkit_chroot_userhome)); + } + + function _get_home_dir($username) + { + return str_replace("[username]",escapeshellcmd($username),$this->jailkit_config["jailkit_chroot_home"]); + } + + //* Update the website root directory permissions depending on the security level + function _update_website_security_level() { + global $app,$conf; + + // load the server configuration options + $app->uses("getconf"); + $web_config = $app->getconf->get_server_config($conf["server_id"], 'web'); + + //* If the security level is set to high + if($web_config['security_level'] == 20) { + $this->_exec("chmod 755 ".escapeshellcmd($this->parent_domain['document_root'])); + $this->_exec("chown root:root ".escapeshellcmd($this->parent_domain['document_root'])); + } + + } + + //* Wrapper for exec function for easier debugging + private function _exec($command) { + global $app; + $app->log("exec: ".$command,LOGLEVEL_DEBUG); + exec($command); + } + + + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/plugins-available/cron_plugin.inc.php b/interface/ispconfig/server/plugins-available/cron_plugin.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..4ee83137a333b8d5e23bb8a2aa1b561b2e217f36 --- /dev/null +++ b/interface/ispconfig/server/plugins-available/cron_plugin.inc.php @@ -0,0 +1,239 @@ +plugins->registerEvent('cron_insert',$this->plugin_name,'insert'); + $app->plugins->registerEvent('cron_update',$this->plugin_name,'update'); + $app->plugins->registerEvent('cron_delete',$this->plugin_name,'delete'); + + } + + function insert($event_name,$data) { + global $app, $conf; + + $this->action = 'insert'; + // just run the update function + $this->update($event_name,$data); + + } + + + function update($event_name,$data) { + global $app, $conf; + + if($this->action != 'insert') $this->action = 'update'; + + // load the server configuration options + $app->uses("getconf"); + + if($data["new"]["parent_domain_id"] == '') { + $app->log("Parent domain not set",LOGLEVEL_WARN); + return 0; + } + + //* get data from web + $parent_domain = $app->db->queryOneRecord("SELECT `domain_id`, `system_user`, `system_group`, `document_root`, `hd_quota` FROM `web_domain` WHERE `domain_id` = ".intval($data["new"]["parent_domain_id"])); + if(!$parent_domain["domain_id"]) { + $app->log("Parent domain not found",LOGLEVEL_WARN); + return 0; + } elseif($parent_domain["system_user"] == 'root' or $parent_domain["system_group"] == 'root') { + $app->log("Websites (and Crons) can not be owned by the root user or group.",LOGLEVEL_WARN); + return 0; + } + + // Get the client ID + $client = $app->dbmaster->queryOneRecord("SELECT client_id FROM sys_group WHERE sys_group.groupid = ".intval($data["new"]["sys_groupid"])); + $client_id = intval($client["client_id"]); + unset($client); + + // Create group and user, if not exist + $app->uses("system"); + + $groupname = escapeshellcmd($parent_domain["system_group"]); + if($parent_domain["system_group"] != '' && !$app->system->is_group($parent_domain["system_group"])) { + exec("groupadd $groupname"); + $app->log("Adding the group: $groupname",LOGLEVEL_DEBUG); + } + + $username = escapeshellcmd($parent_domain["system_user"]); + if($parent_domain["system_user"] != '' && !$app->system->is_user($parent_domain["system_user"])) { + exec("useradd -d ".escapeshellcmd($parent_domain["document_root"])." -g $groupname $username -s /bin/false"); + $app->log("Adding the user: $username",LOGLEVEL_DEBUG); + } + + // Set the quota for the user + if($username != '' && $app->system->is_user($username)) { + if($parent_domain["hd_quota"] > 0){ + $blocks_soft = $parent_domain["hd_quota"] * 1024; + $blocks_hard = $blocks_soft + 1024; + } else { + $blocks_soft = $blocks_hard = 0; + } + exec("setquota -u $username $blocks_soft $blocks_hard 0 0 -a &> /dev/null"); + exec("setquota -T -u $username 604800 604800 -a &> /dev/null"); + } + + // make temp direcory writable for the apache user and the website user + exec("chmod 777 ".escapeshellcmd($parent_domain["document_root"]."/tmp")); + + /** TODO READ CRON MASTER **/ + + $this->parent_domain = $parent_domain; + $this->_write_crontab(); + + $this->action = ''; + + } + + function delete($event_name,$data) { + global $app, $conf; + + //* get data from web + $parent_domain = $app->db->queryOneRecord("SELECT `domain_id`, `system_user`, `system_group`, `document_root`, `hd_quota` FROM `web_domain` WHERE `domain_id` = ".intval($data["old"]["parent_domain_id"])); + if(!$parent_domain["domain_id"]) { + $app->log("Parent domain not found",LOGLEVEL_WARN); + return 0; + } + + // Get the client ID + $client = $app->dbmaster->queryOneRecord("SELECT client_id FROM sys_group WHERE sys_group.groupid = ".intval($data["old"]["sys_groupid"])); + $client_id = intval($client["client_id"]); + unset($client); + + $this->parent_domain = $parent_domain; + $this->_write_crontab(); + } + + function _write_crontab() { + global $app, $conf; + + //* load the server configuration options + $app->uses("getconf"); + + $cron_config = $app->getconf->get_server_config($conf["server_id"], 'cron'); + + //* try to find customer's mail address + + /** TODO: add possibility for client to choose mail notification! **/ + $cron_content = "MAILTO=''\n\n"; + $chr_cron_content = "MAILTO=''\n\n"; + $chr_cron_content .= "SHELL='/usr/sbin/jk_chrootsh'\n\n"; + + $cmd_count = 0; + $chr_cmd_count = 0; + + //* read all active cron jobs from database and write them to file + $cron_jobs = $app->db->queryAllRecords("SELECT `run_min`, `run_hour`, `run_mday`, `run_month`, `run_wday`, `command`, `type` FROM `cron` WHERE `parent_domain_id` = ".intval($this->parent_domain["domain_id"]) . " AND `active` = 'y'"); + if($cron_jobs && count($cron_jobs) > 0) { + foreach($cron_jobs as $job) { + $command = "{$job['run_min']}\t{$job['run_hour']}\t{$job['run_mday']}\t{$job['run_month']}\t{$job['run_wday']}"; + $command .= "\t{$this->parent_domain['system_user']}"; //* running as user + if($job['type'] == 'url') { + $command .= "\t{$cron_config['wget']} -q -O /dev/null " . escapeshellarg($job['command']) . " >/dev/null 2>&1"; + } else { + if($job['type'] == 'chrooted') { + if(substr($job['command'], 0, strlen($this->parent_domain['document_root'])) == $this->parent_domain['document_root']) { + //* delete the unneeded path part + $job['command'] = substr($job['command'], strlen($this->parent_domain['document_root'])); + } + } + + $command .= "\t"; + if(substr($job['command'], 0, 1) != "/") $command .= $this->parent_domain['document_root'].'/'; + $command .= $job['command']; + } + + if($job['type'] == 'chrooted') { + $chr_cron_content .= $command . "\n"; + $chr_cmd_count++; + } else { + $cron_content .= $command . "\n"; + $cmd_count++; + } + } + } + + $cron_file = escapeshellcmd($cron_config["crontab_dir"].'/ispc_'.$this->parent_domain["system_user"]); + if($cmd_count > 0) { + file_put_contents($cron_file, $cron_content); + $app->log("Wrote Cron file $cron_file with content:\n$cron_content",LOGLEVEL_DEBUG); + } else { + @unlink($cron_file); + $app->log("Deleted Cron file $cron_file",LOGLEVEL_DEBUG); + } + + $cron_file = escapeshellcmd($cron_config["crontab_dir"].'/ispc_chrooted_'.$this->parent_domain["system_user"]); + if($chr_cmd_count > 0) { + file_put_contents($cron_file, $chr_cron_content); + $app->log("Wrote Cron file $cron_file with content:\n$chr_cron_content",LOGLEVEL_DEBUG); + } else { + @unlink($cron_file); + $app->log("Deleted Cron file $cron_file",LOGLEVEL_DEBUG); + } + + return 0; + } + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/plugins-available/firewall_plugin.inc.php b/interface/ispconfig/server/plugins-available/firewall_plugin.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..c3bc470cdf6d4879cee918ad48e3b05ca89f0795 --- /dev/null +++ b/interface/ispconfig/server/plugins-available/firewall_plugin.inc.php @@ -0,0 +1,145 @@ +plugins->registerEvent('firewall_insert',$this->plugin_name,'insert'); + $app->plugins->registerEvent('firewall_update',$this->plugin_name,'update'); + $app->plugins->registerEvent('firewall_delete',$this->plugin_name,'delete'); + + + } + + + function insert($event_name,$data) { + global $app, $conf; + + $this->update($event_name,$data); + + } + + function update($event_name,$data) { + global $app, $conf; + + $tcp_ports = ''; + $udp_ports = ''; + + $ports = explode(',',$data["new"]["tcp_port"]); + if(is_array($ports)) { + foreach($ports as $p) { + if(strstr($p,':')) { + $p_parts = explode(':',$p); + $p_clean = intval($p_parts[0]).':'.intval($p_parts[1]); + } else { + $p_clean = intval($p); + } + $tcp_ports .= $p_clean . ' '; + } + } + $tcp_ports = trim($tcp_ports); + + $ports = explode(',',$data["new"]["udp_port"]); + if(is_array($ports)) { + foreach($ports as $p) { + if(strstr($p,':')) { + $p_parts = explode(':',$p); + $p_clean = intval($p_parts[0]).':'.intval($p_parts[1]); + } else { + $p_clean = intval($p); + } + $udp_ports .= $p_clean . ' '; + } + } + $udp_ports = trim($udp_ports); + + $app->load('tpl'); + $tpl = new tpl(); + $tpl->newTemplate("bastille-firewall.cfg.master"); + + $tpl->setVar("TCP_PUBLIC_SERVICES",$tcp_ports); + $tpl->setVar("UDP_PUBLIC_SERVICES",$udp_ports); + + file_put_contents('/etc/Bastille/bastille-firewall.cfg',$tpl->grab()); + $app->log('Writing firewall configuration /etc/Bastille/bastille-firewall.cfg',LOGLEVEL_DEBUG); + unset($tpl); + + if($data["new"]["active"] == 'y') { + exec('/etc/init.d/bastille-firewall restart'); + if(@is_file('/etc/debian_version')) exec('update-rc.d bastille-firewall defaults'); + $app->log('Restarting the firewall',LOGLEVEL_DEBUG); + } else { + exec('/etc/init.d/bastille-firewall stop'); + if(@is_file('/etc/debian_version')) exec('update-rc.d -f bastille-firewall remove'); + $app->log('Stopping the firewall',LOGLEVEL_DEBUG); + } + + + } + + function delete($event_name,$data) { + global $app, $conf; + + exec('/etc/init.d/bastille-firewall stop'); + if(@is_file('/etc/debian_version')) exec('update-rc.d -f bastille-firewall remove'); + $app->log('Stopping the firewall',LOGLEVEL_DEBUG); + + } + + + + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/plugins-available/ftpuser_base_plugin.inc.php b/interface/ispconfig/server/plugins-available/ftpuser_base_plugin.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..04bb51b989a0fddf5ba137ea075ade1efd46b600 --- /dev/null +++ b/interface/ispconfig/server/plugins-available/ftpuser_base_plugin.inc.php @@ -0,0 +1,112 @@ +plugins->registerEvent('ftp_user_insert',$this->plugin_name,'insert'); + $app->plugins->registerEvent('ftp_user_update',$this->plugin_name,'update'); + $app->plugins->registerEvent('ftp_user_delete',$this->plugin_name,'delete'); + + + } + + + function insert($event_name,$data) { + global $app, $conf; + + if(!is_dir($data['new']['dir'])) { + $app->log("FTP User directory '".$data['new']['dir']."' does not exist. Creating it now.",LOGLEVEL_DEBUG); + + $web = $app->db->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ".intval($data['new']['parent_domain_id'])); + + exec('mkdir -p '.escapeshellcmd($data['new']['dir'])); + exec('chown '.escapeshellcmd($web["system_user"]).':'.escapeshellcmd($web['system_group']).' '.$data['new']['dir']); + + $app->log("Added ftpuser_dir: ".$data['new']['dir'],LOGLEVEL_DEBUG); + } + + } + + function update($event_name,$data) { + global $app, $conf; + + if(!is_dir($data['new']['dir'])) { + $app->log("FTP User directory '".$data['new']['dir']."' does not exist. Creating it now.",LOGLEVEL_DEBUG); + + $web = $app->db->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ".intval($data['new']['parent_domain_id'])); + + exec('mkdir -p '.escapeshellcmd($data['new']['dir'])); + exec('chown '.escapeshellcmd($web["system_user"]).':'.escapeshellcmd($web['system_group']).' '.$data['new']['dir']); + + $app->log("Added ftpuser_dir: ".$data['new']['dir'],LOGLEVEL_DEBUG); + } + } + + function delete($event_name,$data) { + global $app, $conf; + + $app->log("Ftpuser:".$data['new']['username']." deleted.",LOGLEVEL_DEBUG); + + } + + + + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/plugins-available/getmail_plugin.inc.php b/interface/ispconfig/server/plugins-available/getmail_plugin.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..032ed437d736d2db05c7d6500404b51e2abbe57e --- /dev/null +++ b/interface/ispconfig/server/plugins-available/getmail_plugin.inc.php @@ -0,0 +1,163 @@ +plugins->registerEvent('mail_get_insert','getmail_plugin','insert'); + $app->plugins->registerEvent('mail_get_update','getmail_plugin','update'); + $app->plugins->registerEvent('mail_get_delete','getmail_plugin','delete'); + + + + } + + function insert($event_name,$data) { + global $app, $conf; + + $this->update($event_name,$data); + + } + + function update($event_name,$data) { + global $app, $conf; + + // load the server specific configuration options for getmail + $app->uses("getconf"); + $getmail_config = $app->getconf->get_server_config($conf["server_id"], 'getmail'); + $this->getmail_config_dir = $getmail_config["getmail_config_dir"]; + + // Check if the config directory exists. + if(!is_dir($this->getmail_config_dir)) { + $app->log("Getmail config directory '".$this->getmail_config_dir."' does not exist.",LOGLEVEL_ERROR); + } else { + + // Delete the config file first, if it exists + $this->delete($event_name,$data); + + // Get the new config file path + $config_file_path = escapeshellcmd($this->getmail_config_dir.'/'.$data["new"]["source_server"].'_'.$data["new"]["source_username"].'.conf'); + if(stristr($config_file_path, "..") or stristr($config_file_path, "|") or stristr($config_file_path,";") or stristr($config_file_path,'$')) { + $app->log("Possibly faked path for getmail config file: '$config_file_path'. File is not written.",LOGLEVEL_ERROR); + return false; + } + + + if($data["new"]["active"] == 'y') { + // Open master template + $tpl = file_get_contents($conf["rootpath"].'/conf/getmail.conf.master'); + + // Shall emails be deleted after retrieval + if($data["new"]["source_delete"] == 'y') { + $tpl = str_replace('{DELETE}','1',$tpl); + } else { + $tpl = str_replace('{DELETE}','0',$tpl); + } + + // Set the data retriever + if($data["new"]["type"] == 'pop3') { + $tpl = str_replace('{TYPE}','SimplePOP3Retriever',$tpl); + } elseif ($data["new"]["type"] == 'imap') { + $tpl = str_replace('{TYPE}','SimpleIMAPRetriever',$tpl); + } elseif ($data["new"]["type"] == 'pop3ssl') { + $tpl = str_replace('{TYPE}','SimplePOP3SSLRetriever',$tpl); + } elseif ($data["new"]["type"] == 'imapssl') { + $tpl = str_replace('{TYPE}','SimpleIMAPSSLRetriever',$tpl); + } + + // Set server, username, password and destination. + $tpl = str_replace('{SERVER}',$data["new"]["source_server"],$tpl); + $tpl = str_replace('{USERNAME}',$data["new"]["source_username"],$tpl); + $tpl = str_replace('{PASSWORD}',$data["new"]["source_password"],$tpl); + $tpl = str_replace('{DESTINATION}',$data["new"]["destination"],$tpl); + + // Write the config file. + file_put_contents($config_file_path,$tpl); + $app->log("Writing Getmail config file: $config_file_path",LOGLEVEL_DEBUG); + exec("chmod 400 $config_file_path"); + exec("chown getmail $config_file_path"); + unset($tpl); + unset($config_file_path); + + } else { + // If record is set to inactive, we will delete the file + if(is_file($config_file_path)) unlink($config_file_path); + } + } + } + + function delete($event_name,$data) { + global $app, $conf; + + // load the server specific configuration options for getmail + $app->uses("getconf"); + $getmail_config = $app->getconf->get_server_config($conf["server_id"], 'getmail'); + $this->getmail_config_dir = $getmail_config["getmail_config_dir"]; + + $config_file_path = escapeshellcmd($this->getmail_config_dir.'/'.$data["old"]["source_server"].'_'.$data["old"]["source_username"].'.conf'); + if(stristr($config_file_path,"..") || stristr($config_file_path,"|") || stristr($config_file_path,";") || stristr($config_file_path,'$')) { + $app->log("Possibly faked path for getmail config file: '$config_file_path'. File is not written.",LOGLEVEL_ERROR); + return false; + } + if(is_file($config_file_path)) unlink($config_file_path); + } + + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/plugins-available/mail_plugin.inc.php b/interface/ispconfig/server/plugins-available/mail_plugin.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..bbabe660e4bac48fbb598281b288cc8b43871ac7 --- /dev/null +++ b/interface/ispconfig/server/plugins-available/mail_plugin.inc.php @@ -0,0 +1,311 @@ +plugins->registerEvent('mail_user_insert',$this->plugin_name,'user_insert'); + $app->plugins->registerEvent('mail_user_update',$this->plugin_name,'user_update'); + $app->plugins->registerEvent('mail_user_delete',$this->plugin_name,'user_delete'); + + //* Mail Domains + //$app->plugins->registerEvent('mail_domain_insert',$this->plugin_name,'domain_insert'); + //$app->plugins->registerEvent('mail_domain_update',$this->plugin_name,'domain_update'); + $app->plugins->registerEvent('mail_domain_delete',$this->plugin_name,'domain_delete'); + + //* Mail transports + $app->plugins->registerEvent('mail_transport_insert',$this->plugin_name,'transport_update'); + $app->plugins->registerEvent('mail_transport_update',$this->plugin_name,'transport_update'); + $app->plugins->registerEvent('mail_transport_delete',$this->plugin_name,'transport_update'); + + } + + + function user_insert($event_name,$data) { + global $app, $conf; + + //* get the config + $app->uses("getconf,system"); + $mail_config = $app->getconf->get_server_config($conf["server_id"], 'mail'); + + // convert to lower case - it could cause problems if some directory above has upper case name +// $data['new']['maildir'] = strtolower($data['new']['maildir']); + + $maildomain_path = $data['new']['maildir']; + $tmp_basepath = $data['new']['maildir']; + $tmp_basepath_parts = explode('/',$tmp_basepath); + unset($tmp_basepath_parts[count($tmp_basepath_parts)-1]); + $base_path = implode('/',$tmp_basepath_parts); + + + + //* Create the mail domain directory, if it does not exist + if(!empty($base_path) && !is_dir($base_path)) { + exec("su -c 'mkdir -p ".escapeshellcmd($base_path)."' ".$mail_config['mailuser_name']); + $app->log('Created Directory: '.$base_path,LOGLEVEL_DEBUG); + } + + // Dovecot uses a different mail layout with a separate 'Maildir' subdirectory. + if($mail_config['pop3_imap_daemon'] == 'dovecot') { + exec("su -c 'mkdir -p ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name']); + $app->log('Created Directory: '.$maildomain_path,LOGLEVEL_DEBUG); + $maildomain_path .= '/Maildir'; + } + + //* When the mail user dir exists but it is not a valid maildir, remove it + if(!empty($maildomain_path) && is_dir($maildomain_path) && !is_dir($maildomain_path.'/new') && !is_dir($maildomain_path.'/cur')) { + exec("su -c 'rm -rf ".escapeshellcmd($data['new']['maildir'])."' vmail"); + $app->log("Removed invalid maildir and rebuild it: ".escapeshellcmd($data['new']['maildir']),LOGLEVEL_WARN); + } + + //* Create the maildir, if it doesn not exist, set permissions, set quota. + if(!empty($maildomain_path) && !is_dir($maildomain_path)) { + + //exec("su -c 'maildirmake ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name']); + $app->system->maildirmake($maildomain_path,$mail_config['mailuser_name']); + + exec('chown -R '.$mail_config['mailuser_name'].':'.$mail_config['mailuser_group'].' '.escapeshellcmd($data['new']['maildir'])); + $app->log("Set ownership on ".escapeshellcmd($data['new']['maildir']),LOGLEVEL_DEBUG); + + //* This is to fix the maildrop quota not being rebuilt after the quota is changed. + if($mail_config['pop3_imap_daemon'] != 'dovecot') { + exec("su -c 'maildirmake -q ".$data['new']['quota']."S ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name']); // Avoid maildirmake quota bug, see debian bug #214911 + $app->log('Created Maildir: '."su -c 'maildirmake -q ".$data['new']['quota']."S ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name'],LOGLEVEL_DEBUG); + } + } + + if(!is_dir($data['new']['maildir'].'/.Sent')) { + //exec("su -c 'maildirmake -f Sent ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name']); + //$app->log('Created submaildir Sent: '."su -c 'maildirmake -f Sent ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name'],LOGLEVEL_DEBUG); + $app->system->maildirmake($maildomain_path,$mail_config['mailuser_name'],'Sent'); + } + if(!is_dir($data['new']['maildir'].'/.Drafts')) { + //exec("su -c 'maildirmake -f Drafts ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name']); + //$app->log('Created submaildir Drafts: '."su -c 'maildirmake -f Drafts ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name'],LOGLEVEL_DEBUG); + $app->system->maildirmake($maildomain_path,$mail_config['mailuser_name'],'Drafts'); + } + if(!is_dir($data['new']['maildir'].'/.Trash')) { + //exec("su -c 'maildirmake -f Trash ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name']); + //$app->log('Created submaildir Trash: '."su -c 'maildirmake -f Trash ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name'],LOGLEVEL_DEBUG); + $app->system->maildirmake($maildomain_path,$mail_config['mailuser_name'],'Trash'); + } + if(!is_dir($data['new']['maildir'].'/.Junk')) { + //exec("su -c 'maildirmake -f Junk ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name']); + //$app->log('Created submaildir Junk: '."su -c 'maildirmake -f Junk ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name'],LOGLEVEL_DEBUG); + $app->system->maildirmake($maildomain_path,$mail_config['mailuser_name'],'Junk'); + } + + //* Set the maildir quota + if(is_dir($data['new']['maildir'].'/new') && $mail_config['pop3_imap_daemon'] != 'dovecot') { + exec("su -c 'maildirmake -q ".$data['new']['quota']."S ".escapeshellcmd($data['new']['maildir'])."' ".$mail_config['mailuser_name']); + $app->log('Set Maildir quota: '."su -c 'maildirmake -q ".$data['new']['quota']."S ".escapeshellcmd($data['new']['maildir'])."' ".$mail_config['mailuser_name'],LOGLEVEL_DEBUG); + } + } + + function user_update($event_name,$data) { + global $app, $conf; + + // get the config + $app->uses("getconf,system"); + $mail_config = $app->getconf->get_server_config($conf["server_id"], 'mail'); + + // convert to lower case - it could cause problems if some directory above has upper case name + // $data['new']['maildir'] = strtolower($data['new']['maildir']); + + // Create the maildir, if it does not exist + /* + if(!is_dir($data['new']['maildir'])) { + exec('mkdir -p '.escapeshellcmd($data['new']['maildir'])); + exec('chown '.$mail_config['mailuser_name'].':'.$mail_config['mailuser_group'].' '.escapeshellcmd($data['new']['maildir'])); + $app->log('Created Maildir: '.$data['new']['maildir'],LOGLEVEL_DEBUG); + } + */ + + $maildomain_path = $data['new']['maildir']; + $tmp_basepath = $data['new']['maildir']; + $tmp_basepath_parts = explode('/',$tmp_basepath); + unset($tmp_basepath_parts[count($tmp_basepath_parts)-1]); + $base_path = implode('/',$tmp_basepath_parts); + + //* Create the mail domain directory, if it does not exist + if(!empty($base_path) && !is_dir($base_path)) { + exec("su -c 'mkdir -p ".escapeshellcmd($base_path)."' ".$mail_config['mailuser_name']); + $app->log('Created Directory: '.$base_path,LOGLEVEL_DEBUG); + } + + // Dovecot uses a different mail layout with a separate 'Maildir' subdirectory. + if($mail_config['pop3_imap_daemon'] == 'dovecot') { + exec("su -c 'mkdir -p ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name']); + $app->log('Created Directory: '.$base_path,LOGLEVEL_DEBUG); + $maildomain_path .= '/Maildir'; + } + + //* When the mail user dir exists but it is not a valid maildir, remove it + if(!empty($maildomain_path) && is_dir($maildomain_path) && !is_dir($maildomain_path.'/new') && !is_dir($maildomain_path.'/cur')) { + exec("su -c 'rm -rf ".escapeshellcmd($data['new']['maildir'])."' vmail"); + $app->log("Removed invalid maildir and rebuild it: ".escapeshellcmd($data['new']['maildir']),LOGLEVEL_WARN); + } + + //* Create the maildir, if it doesn not exist, set permissions, set quota. + if(!empty($maildomain_path) && !is_dir($maildomain_path.'/new')) { + //exec("su -c 'maildirmake ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name']); + //$app->log("Created Maildir "."su -c 'maildirmake ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name'],LOGLEVEL_DEBUG); + $app->system->maildirmake($maildomain_path,$mail_config['mailuser_name']); + + exec('chown -R '.$mail_config['mailuser_name'].':'.$mail_config['mailuser_group'].' '.escapeshellcmd($data['new']['maildir'])); + $app->log("Set ownership on ".escapeshellcmd($data['new']['maildir']),LOGLEVEL_DEBUG); + //* This is to fix the maildrop quota not being rebuilt after the quota is changed. + if($mail_config['pop3_imap_daemon'] != 'dovecot') { + exec("su -c 'maildirmake -q ".$data['new']['quota']."S ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name']); // Avoid maildirmake quota bug, see debian bug #214911 + $app->log('Updated Maildir quota: '."su -c 'maildirmake -q ".$data['new']['quota']."S ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name'],LOGLEVEL_DEBUG); + } + } + + if(!is_dir($data['new']['maildir'].'/.Sent')) { + //exec("su -c 'maildirmake -f Sent ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name']); + //$app->log('Created submaildir Sent: '."su -c 'maildirmake -f Sent ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name'],LOGLEVEL_DEBUG); + $app->system->maildirmake($maildomain_path,$mail_config['mailuser_name'],'Sent'); + } + if(!is_dir($data['new']['maildir'].'/.Drafts')) { + //exec("su -c 'maildirmake -f Drafts ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name']); + //$app->log('Created submaildir Drafts: '."su -c 'maildirmake -f Drafts ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name'],LOGLEVEL_DEBUG); + $app->system->maildirmake($maildomain_path,$mail_config['mailuser_name'],'Drafts'); + } + if(!is_dir($data['new']['maildir'].'/.Trash')) { + //exec("su -c 'maildirmake -f Trash ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name']); + //$app->log('Created submaildir Trash: '."su -c 'maildirmake -f Trash ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name'],LOGLEVEL_DEBUG); + $app->system->maildirmake($maildomain_path,$mail_config['mailuser_name'],'Trash'); + } + if(!is_dir($data['new']['maildir'].'/.Junk')) { + //exec("su -c 'maildirmake -f Junk ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name']); + //$app->log('Created submaildir Junk: '."su -c 'maildirmake -f Junk ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name'],LOGLEVEL_DEBUG); + $app->system->maildirmake($maildomain_path,$mail_config['mailuser_name'],'Junk'); + } + + // Move mailbox, if domain has changed and delete old mailbox + if($data['new']['maildir'] != $data['old']['maildir'] && is_dir($data['old']['maildir'])) { + if(is_dir($data['new']['maildir'])) { + exec("rm -fr ".escapeshellcmd($data['new']['maildir'])); + //rmdir($data['new']['maildir']); + } + exec('mv -f '.escapeshellcmd($data['old']['maildir']).' '.escapeshellcmd($data['new']['maildir'])); + // exec('mv -f '.escapeshellcmd($data['old']['maildir']).'/* '.escapeshellcmd($data['new']['maildir'])); + // if(is_file($data['old']['maildir'].'.ispconfig_mailsize'))exec('mv -f '.escapeshellcmd($data['old']['maildir']).'.ispconfig_mailsize '.escapeshellcmd($data['new']['maildir'])); + // rmdir($data['old']['maildir']); + $app->log('Moved Maildir from: '.$data['old']['maildir'].' to '.$data['new']['maildir'],LOGLEVEL_DEBUG); + } + //This is to fix the maildrop quota not being rebuilt after the quota is changed. + // Courier Layout + if(is_dir($data['new']['maildir'].'/new') && $mail_config['pop3_imap_daemon'] != 'dovecot') { + exec("su -c 'maildirmake -q ".$data['new']['quota']."S ".escapeshellcmd($data['new']['maildir'])."' ".$mail_config['mailuser_name']); + $app->log('Updated Maildir quota: '."su -c 'maildirmake -q ".$data['new']['quota']."S ".escapeshellcmd($data['new']['maildir'])."' ".$mail_config['mailuser_name'],LOGLEVEL_DEBUG); + } + } + + function user_delete($event_name,$data) { + global $app, $conf; + + $old_maildir_path = escapeshellcmd($data['old']['maildir']); + if(!stristr($old_maildir_path,'..') && !stristr($old_maildir_path,'*') && strlen($old_maildir_path) >= 10) { + exec('rm -rf '.escapeshellcmd($old_maildir_path)); + $app->log('Deleted the Maildir: '.$data['old']['maildir'],LOGLEVEL_DEBUG); + } else { + $app->log('Possible security violation when deleting the maildir: '.$data['old']['maildir'],LOGLEVEL_ERROR); + } + } + + function domain_delete($event_name,$data) { + global $app, $conf; + + // get the config + $app->uses("getconf"); + $mail_config = $app->getconf->get_server_config($conf["server_id"], 'mail'); + + //* Delete maildomain path + $old_maildomain_path = escapeshellcmd($mail_config['homedir_path'].'/'.$data['old']['domain']); + if(!stristr($old_maildomain_path,'//') && !stristr($old_maildomain_path,'..') && !stristr($old_maildomain_path,'*') && !stristr($old_maildomain_path,'&') && strlen($old_maildomain_path) >= 10) { + exec('rm -rf '.escapeshellcmd($old_maildomain_path)); + $app->log('Deleted the mail domain directory: '.$old_maildomain_path,LOGLEVEL_DEBUG); + } else { + $app->log('Possible security violation when deleting the mail domain directory: '.$old_maildomain_path,LOGLEVEL_ERROR); + } + + //* Delete mailfilter path + $old_maildomain_path = escapeshellcmd($mail_config['homedir_path'].'/mailfilters/'.$data['old']['domain']); + if(!stristr($old_maildomain_path,'//') && !stristr($old_maildomain_path,'..') && !stristr($old_maildomain_path,'*') && !stristr($old_maildomain_path,'&') && strlen($old_maildomain_path) >= 10) { + exec('rm -rf '.escapeshellcmd($old_maildomain_path)); + $app->log('Deleted the mail domain mailfilter directory: '.$old_maildomain_path,LOGLEVEL_DEBUG); + } else { + $app->log('Possible security violation when deleting the mail domain mailfilter directory: '.$old_maildomain_path,LOGLEVEL_ERROR); + } + } + + function transport_update($event_name,$data) { + global $app, $conf; + + exec('/etc/init.d/postfix reload &> /dev/null'); + $app->log('Postfix config reloaded ',LOGLEVEL_DEBUG); + + } + + + + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/plugins-available/maildeliver_plugin.inc.php b/interface/ispconfig/server/plugins-available/maildeliver_plugin.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..5e325dbf05f9eea9ad82c74b26d9793295ed0e3d --- /dev/null +++ b/interface/ispconfig/server/plugins-available/maildeliver_plugin.inc.php @@ -0,0 +1,131 @@ +plugins->registerEvent('mail_user_update','maildeliver_plugin','update'); + $app->plugins->registerEvent('mail_user_delete','maildeliver_plugin','delete'); + + } + + + function update($event_name,$data) { + global $app, $conf; + + // load the server configuration options + $app->uses("getconf"); + $mail_config = $app->getconf->get_server_config($conf["server_id"], 'mail'); + if(substr($mail_config["homedir_path"],-1) == '/') { + $mail_config["homedir_path"] = substr($mail_config["homedir_path"],0,-1); + } + + if(isset($data["new"]["email"])) { + $email_parts = explode("@",$data["new"]["email"]); + } else { + $email_parts = explode("@",$data["old"]["email"]); + } + + // Write the custom mailfilter script, if mailfilter recipe has changed + if($data["old"]["custom_mailfilter"] != $data["new"]["custom_mailfilter"] + or $data["old"]["move_junk"] != $data["new"]["move_junk"] + or $data["old"]["autoresponder_text"] != $data["new"]["autoresponder_text"] + or $data["old"]["autoresponder"] != $data["new"]["autoresponder"] + or (isset($data["new"]["email"]) and $data["old"]["email"] != $data["new"]["email"]) + or $data["old"]["autoresponder_start_date"] != $data["new"]["autoresponder_start_date"] + or $data["old"]["autoresponder_end_date"] != $data["new"]["autoresponder_end_date"]) { + + $app->log("Mailfilter config has been changed",LOGLEVEL_DEBUG); + + $sieve_file = $data["new"]["maildir"].'/.sieve'; + if(is_file($sieve_file)) unlink($sieve_file) or $app->log("Unable to delete file: $sieve_file",LOGLEVEL_WARN); + + $app->load('tpl'); + + $tpl = new tpl(); + $tpl->newTemplate("sieve_filter.master"); + + // Custom filters + $tpl->setVar('custom_mailfilter',$data["new"]["custom_mailfilter"]); + + // Move junk + $tpl->setVar('move_junk',$data["new"]["move_junk"]); + + // Autoresponder + $tpl->setVar('autoresponder',$data["new"]["autoresponder"]); + $tpl->setVar('autoresponder_text',$data["new"]["autoresponder_text"]); + + file_put_contents($sieve_file,$tpl->grab()); + + unset($tpl); + + } + } + + function delete($event_name,$data) { + global $app, $conf; + + $sieve_file = $data["old"]["maildir"].'/.sieve'; + if(is_file($sieve_file)) unlink($sieve_file) or $app->log("Unable to delete file: $sieve_file",LOGLEVEL_WARN); + } + + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/plugins-available/maildrop_plugin.inc.php b/interface/ispconfig/server/plugins-available/maildrop_plugin.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..fa60380e1c6b23732d5da33f7558bcb582df72de --- /dev/null +++ b/interface/ispconfig/server/plugins-available/maildrop_plugin.inc.php @@ -0,0 +1,240 @@ +plugins->registerEvent('mail_user_update','maildrop_plugin','update'); + $app->plugins->registerEvent('mail_user_delete','maildrop_plugin','delete'); + + } + + + function update($event_name,$data) { + global $app, $conf; + + // load the server configuration options + $app->uses("getconf"); + $mail_config = $app->getconf->get_server_config($conf["server_id"], 'mail'); + if(substr($mail_config["homedir_path"],-1) == '/') { + $mail_config["homedir_path"] = substr($mail_config["homedir_path"],0,-1); + } + $this->mailfilter_config_dir = $mail_config["homedir_path"].'/mailfilters'; + + + // Check if the config directory exists. + if(!is_dir($this->mailfilter_config_dir)) { + $app->log("Mailfilter config directory '".$this->mailfilter_config_dir."' does not exist. Creating it now.",LOGLEVEL_WARN); + mkdir($this->mailfilter_config_dir); + exec("chown vmail ".$this->mailfilter_config_dir); + exec("chmod 770 ".$this->mailfilter_config_dir); + } + + if(isset($data["new"]["email"])) { + $email_parts = explode("@",$data["new"]["email"]); + } else { + $email_parts = explode("@",$data["old"]["email"]); + } + + // make sure that the config directories exist + if(!is_dir($this->mailfilter_config_dir.'/'.$email_parts[1])) { + mkdir($this->mailfilter_config_dir.'/'.$email_parts[1]); + exec("chown vmail ".$this->mailfilter_config_dir.'/'.$email_parts[1]); + exec("chmod 770 ".$this->mailfilter_config_dir.'/'.$email_parts[1]); + } + if(!is_dir($this->mailfilter_config_dir.'/'.$email_parts[1].'/'.$email_parts[0])) { + mkdir($this->mailfilter_config_dir.'/'.$email_parts[1].'/'.$email_parts[0]); + exec("chown vmail ".$this->mailfilter_config_dir.'/'.$email_parts[1].'/'.$email_parts[0]); + exec("chmod 770 ".$this->mailfilter_config_dir.'/'.$email_parts[1].'/'.$email_parts[0]); + } + + // Check if something has been changed regarding the autoresponders + if($data["old"]["autoresponder_text"] != $data["new"]["autoresponder_text"] + or $data["old"]["autoresponder"] != $data["new"]["autoresponder"] + or (isset($data["new"]["email"]) and $data["old"]["email"] != $data["new"]["email"]) + or $data["old"]["autoresponder_start_date"] != $data["new"]["autoresponder_start_date"] + or $data["old"]["autoresponder_end_date"] != $data["new"]["autoresponder_end_date"]) { + + // We delete the old autoresponder, if it exists + $email_parts = explode("@",$data["old"]["email"]); + $file = $this->mailfilter_config_dir.'/'.$email_parts[1].'/'.$email_parts[0].'/.vacation.lock'; + if(is_file($file)) unlink($file) or $app->log("Unable to delete file: $file",LOGLEVEL_WARN); + $file = $this->mailfilter_config_dir.'/'.$email_parts[1].'/'.$email_parts[0].'/.vacation.lst'; + if(is_file($file)) unlink($file) or $app->log("Unable to delete file: $file",LOGLEVEL_WARN); + $file = $this->mailfilter_config_dir.'/'.$email_parts[1].'/'.$email_parts[0].'/.vacation.lst.gdbm'; + if(is_file($file)) unlink($file) or $app->log("Unable to delete file: $file",LOGLEVEL_WARN); + $file = $this->mailfilter_config_dir.'/'.$email_parts[1].'/'.$email_parts[0].'/.vacation.lst.lock'; + if(is_file($file)) unlink($file) or $app->log("Unable to delete file: $file",LOGLEVEL_WARN); + $file = $this->mailfilter_config_dir.'/'.$email_parts[1].'/'.$email_parts[0].'/.vacation.msg'; + if(is_file($file)) unlink($file) or $app->log("Unable to delete file: $file",LOGLEVEL_WARN); + $file = $this->mailfilter_config_dir.'/'.$email_parts[1].'/'.$email_parts[0].'/.autoresponder'; + if(is_file($file)) unlink($ar_file) or $app->log("Unable to delete file: $ar_file",LOGLEVEL_WARN); + + + //Now we create the new autoresponder, if it is enabled + if($data["new"]["autoresponder"] == 'y') { + if(isset($data["new"]["email"])) { + $email_parts = explode("@",$data["new"]["email"]); + } else { + $email_parts = explode("@",$data["old"]["email"]); + } + + // Load the master template + $tpl = file_get_contents($conf["rootpath"].'/conf/autoresponder.master'); + $tpl = str_replace('{vmail_mailbox_base}',$mail_config["homedir_path"],$tpl); + + if ($data["new"]["autoresponder_start_date"] != '0000-00-00 00:00:00') { // Dates have been set + $tpl = str_replace('{start_date}',strtotime($data["new"]["autoresponder_start_date"]),$tpl); + $tpl = str_replace('{end_date}',strtotime($data["new"]["autoresponder_end_date"]),$tpl); + } else { + $tpl = str_replace('{start_date}',-7200,$tpl); + $tpl = str_replace('{end_date}',2147464800,$tpl); + } + + // Write the config file. + $config_file_path = $this->mailfilter_config_dir.'/'.$email_parts[1].'/'.$email_parts[0].'/.autoresponder'; + file_put_contents($config_file_path,$tpl); + $app->log("Writing Autoresponder mailfilter file: $config_file_path",LOGLEVEL_DEBUG); + exec("chmod 770 $config_file_path"); + exec("chown vmail $config_file_path"); + unset($tpl); + unset($config_file_path); + + // Write the autoresponder message file + $config_file_path = $this->mailfilter_config_dir.'/'.$email_parts[1].'/'.$email_parts[0].'/.vacation.msg'; + file_put_contents($config_file_path,$data["new"]["autoresponder_text"]); + exec("chmod 770 $config_file_path"); + exec("chown vmail $config_file_path"); + $app->log("Writing Autoresponder message file: $config_file_path",LOGLEVEL_DEBUG); + } + } + + // Write the custom mailfilter script, if mailfilter recipe has changed + if($data["old"]["custom_mailfilter"] != $data["new"]["custom_mailfilter"] or + $data["old"]["move_junk"] != $data["new"]["move_junk"]) { + $app->log("Mailfilter config has been changed",LOGLEVEL_DEBUG); + if(trim($data["new"]["custom_mailfilter"]) != '' or $data["new"]["move_junk"] != 'n') { + // Delete the old filter recipe + $email_parts = explode("@",$data["old"]["email"]); + $file = $this->mailfilter_config_dir.'/'.$email_parts[1].'/'.$email_parts[0].'/.mailfilter'; + if(is_file($file)) unlink($file) or $app->log("Unable to delete file: $file",LOGLEVEL_WARN); + + // write the new recipe + if(isset($data["new"]["email"])) { + $email_parts = explode("@",$data["new"]["email"]); + } else { + $email_parts = explode("@",$data["old"]["email"]); + } + $config_file_path = $this->mailfilter_config_dir.'/'.$email_parts[1].'/'.$email_parts[0].'/.mailfilter'; + + $mailfilter_content = ''; + if($data["new"]["move_junk"] == 'y') { + $mailfilter_content .= file_get_contents($conf["rootpath"].'/conf/mailfilter_move_junk.master')."\n"; + } + $mailfilter_content .= $data["new"]["custom_mailfilter"]; + + file_put_contents($config_file_path,$mailfilter_content); + $app->log("Writing new custom Mailfiter".$config_file_path,LOGLEVEL_DEBUG); + exec("chmod 770 $config_file_path"); + exec("chown vmail $config_file_path"); + unset($config_file_path); + } else { + // Delete the mailfilter recipe + $email_parts = explode("@",$data["old"]["email"]); + $file = $this->mailfilter_config_dir.'/'.$email_parts[1].'/'.$email_parts[0].'/.mailfilter'; + if(is_file($file)) unlink($file) or $app->log("Unable to delete file: $file",LOGLEVEL_WARN); + $app->log("Deleting custom Mailfiter".$file,LOGLEVEL_DEBUG); + } + //} + } + } + + function delete($event_name,$data) { + global $app, $conf; + + // load the server configuration options + $app->uses("getconf"); + $mail_config = $app->getconf->get_server_config($conf["server_id"], 'mail'); + $this->mailfilter_config_dir = $mail_config["homedir_path"].'/mailfilters'; + + $email_parts = explode("@",$data["old"]["email"]); + $dir = $this->mailfilter_config_dir.'/'.$email_parts[1].'/'.$email_parts[0]; + if(is_dir($dir)) { + $file = $this->mailfilter_config_dir.'/'.$email_parts[1].'/'.$email_parts[0].'/.vacation.lock'; + if(is_file($file)) unlink($file) or $app->log("Unable to delete file: $file",LOGLEVEL_WARN); + $file = $this->mailfilter_config_dir.'/'.$email_parts[1].'/'.$email_parts[0].'/.vacation.lst'; + if(is_file($file)) unlink($file) or $app->log("Unable to delete file: $file",LOGLEVEL_WARN); + $file = $this->mailfilter_config_dir.'/'.$email_parts[1].'/'.$email_parts[0].'/.vacation.msg'; + if(is_file($file)) unlink($file) or $app->log("Unable to delete file: $file",LOGLEVEL_WARN); + $file = $this->mailfilter_config_dir.'/'.$email_parts[1].'/'.$email_parts[0].'/.autoresponder'; + if(is_file($file)) unlink($file) or $app->log("Unable to delete file: $file",LOGLEVEL_WARN); + $file = $this->mailfilter_config_dir.'/'.$email_parts[1].'/'.$email_parts[0].'/.mailfilter'; + if(is_file($file)) unlink($file) or $app->log("Unable to delete file: $file",LOGLEVEL_WARN); + $file = $this->mailfilter_config_dir.'/'.$email_parts[1].'/'.$email_parts[0].'/.vacation.lst.gdbm'; + if(is_file($file)) unlink($file) or $app->log("Unable to delete file: $file",LOGLEVEL_WARN); + $file = $this->mailfilter_config_dir.'/'.$email_parts[1].'/'.$email_parts[0].'/.vacation.lst.lock'; + if(is_file($file)) unlink($file) or $app->log("Unable to delete file: $file",LOGLEVEL_WARN); + rmdir($dir) or $app->log("Unable to delete directory: $dir",LOGLEVEL_WARN); + } + } + + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/plugins-available/mysql_clientdb_plugin.inc.php b/interface/ispconfig/server/plugins-available/mysql_clientdb_plugin.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..6b2651d6049becaefdca58903a6565a7034d5f2b --- /dev/null +++ b/interface/ispconfig/server/plugins-available/mysql_clientdb_plugin.inc.php @@ -0,0 +1,305 @@ +plugins->registerEvent('database_insert',$this->plugin_name,'db_insert'); + $app->plugins->registerEvent('database_update',$this->plugin_name,'db_update'); + $app->plugins->registerEvent('database_delete',$this->plugin_name,'db_delete'); + + + } + + function process_host_list($action, $database_name, $database_user, $database_password, $host_list, $link, $database_rename_user = "") { + global $app; + + $action = strtoupper($action); + + // set to all hosts if none given + if(trim($host_list) == "") $host_list = "%"; + + // process arrays and comma separated strings + if(!is_array($host_list)) $host_list = split(",", $host_list); + + $success = true; + + // loop through hostlist + foreach($host_list as $db_host) { + $db_host = trim($db_host); + + // check if entry is valid ip address + $valid = true; + if($db_host == "%") { + $valid = true; + } elseif(preg_match("/^[0-9]{1,3}(\.)[0-9]{1,3}(\.)[0-9]{1,3}(\.)[0-9]{1,3}$/", $db_host)) { + $groups = explode(".", $db_host); + foreach($groups as $group){ + if($group<0 OR $group>255) + $valid=false; + } + } else { + $valid = false; + } + + if($valid == false) continue; + + if($action == "GRANT") { + if(!mysql_query("GRANT ALL ON ".mysql_real_escape_string($database_name,$link).".* TO '".mysql_real_escape_string($database_user,$link)."'@'$db_host' IDENTIFIED BY '".mysql_real_escape_string($database_password,$link)."';",$link)) $success = false; + } elseif($action == "REVOKE") { + //mysql_query("REVOKE ALL PRIVILEGES ON ".mysql_real_escape_string($database_name,$link).".* FROM '".mysql_real_escape_string($database_user,$link)."';",$link); + } elseif($action == "DROP") { + if(!mysql_query("DROP USER '".mysql_real_escape_string($database_user,$link)."'@'$db_host';",$link)) $success = false; + } elseif($action == "RENAME") { + if(!mysql_query("RENAME USER '".mysql_real_escape_string($database_user,$link)."'@'$db_host' TO '".mysql_real_escape_string($database_rename_user,$link)."'@'$db_host'",$link)) $success = false; + } elseif($action == "PASSWORD") { + if(!mysql_query("SET PASSWORD FOR '".mysql_real_escape_string($database_user,$link)."'@'$db_host' = PASSWORD('".mysql_real_escape_string($database_password,$link)."');",$link)) $success = false; + } + } + + return $success; + } + + function db_insert($event_name,$data) { + global $app, $conf; + + if($data["new"]["type"] == 'mysql') { + if(!include(ISPC_LIB_PATH.'/mysql_clientdb.conf')) { + $app->log('Unable to open'.ISPC_LIB_PATH.'/mysql_clientdb.conf',LOGLEVEL_ERROR); + return; + } + + //* Connect to the database + $link = mysql_connect($clientdb_host, $clientdb_user, $clientdb_password); + if (!$link) { + $app->log('Unable to connect to the database'.mysql_error($link),LOGLEVEL_ERROR); + return; + } + + // Charset for the new table + if($data["new"]["database_charset"] != '') { + $query_charset_table = ' DEFAULT CHARACTER SET '.$data["new"]["database_charset"]; + } else { + $query_charset_table = ''; + } + + //* Create the new database + if (mysql_query('CREATE DATABASE '.mysql_real_escape_string($data["new"]["database_name"]).$query_charset_table,$link)) { + $app->log('Created MySQL database: '.$data["new"]["database_name"],LOGLEVEL_DEBUG); + } else { + $app->log('Unable to connect to the database'.mysql_error($link),LOGLEVEL_ERROR); + } + + // Create the database user if database is active + if($data["new"]["active"] == 'y') { + + if($data["new"]["remote_access"] == 'y') { + $this->process_host_list("GRANT", $data["new"]["database_name"], $data["new"]["database_user"], $data["new"]["database_password"], $data["new"]["remote_ips"], $link); + } + + $db_host = 'localhost'; + mysql_query("GRANT ALL ON ".mysql_real_escape_string($data["new"]["database_name"],$link).".* TO '".mysql_real_escape_string($data["new"]["database_user"],$link)."'@'$db_host' IDENTIFIED BY '".mysql_real_escape_string($data["new"]["database_password"],$link)."';",$link); + + + } + + mysql_query("FLUSH PRIVILEGES;",$link); + mysql_close($link); + } + } + + function db_update($event_name,$data) { + global $app, $conf; + + if($data["new"]["type"] == 'mysql') { + if(!include(ISPC_LIB_PATH.'/mysql_clientdb.conf')) { + $app->log('Unable to open'.ISPC_LIB_PATH.'/mysql_clientdb.conf',LOGLEVEL_ERROR); + return; + } + + //* Connect to the database + $link = mysql_connect($clientdb_host, $clientdb_user, $clientdb_password); + if (!$link) { + $app->log('Unable to connect to the database'.mysql_error($link),LOGLEVEL_ERROR); + return; + } + + // Create the database user if database was disabled before + if($data["new"]["active"] == 'y' && $data["old"]["active"] == 'n') { + + if($data["new"]["remote_access"] == 'y') { + $this->process_host_list("GRANT", $data["new"]["database_name"], $data["new"]["database_user"], $data["new"]["database_password"], $data["new"]["remote_ips"], $link); + } + + $db_host = 'localhost'; + mysql_query("GRANT ALL ON ".mysql_real_escape_string($data["new"]["database_name"],$link).".* TO '".mysql_real_escape_string($data["new"]["database_user"],$link)."'@'$db_host' IDENTIFIED BY '".mysql_real_escape_string($data["new"]["database_password"],$link)."';",$link); + + // mysql_query("GRANT ALL ON ".mysql_real_escape_string($data["new"]["database_name"],$link).".* TO '".mysql_real_escape_string($data["new"]["database_user"],$link)."'@'$db_host' IDENTIFIED BY '".mysql_real_escape_string($data["new"]["database_password"],$link)."';",$link); + //echo "GRANT ALL ON ".mysql_real_escape_string($data["new"]["database_name"]).".* TO '".mysql_real_escape_string($data["new"]["database_user"])."'@'$db_host' IDENTIFIED BY '".mysql_real_escape_string($data["new"]["database_password"])."';"; + } + + // Remove database user, if inactive + if($data["new"]["active"] == 'n' && $data["old"]["active"] == 'y') { + + if($data["old"]["remote_access"] == 'y') { + $this->process_host_list("DROP", "", $data["old"]["database_user"], "", $data["old"]["remote_ips"], $link); + } + + $db_host = 'localhost'; + mysql_query("DROP USER '".mysql_real_escape_string($data["old"]["database_user"],$link)."'@'$db_host';",$link); + + + //mysql_query("REVOKE ALL PRIVILEGES ON ".mysql_real_escape_string($data["new"]["database_name"],$link).".* FROM '".mysql_real_escape_string($data["new"]["database_user"],$link)."';",$link); + } + + //* Rename User + if($data["new"]["database_user"] != $data["old"]["database_user"]) { + $db_host = 'localhost'; + mysql_query("RENAME USER '".mysql_real_escape_string($data["old"]["database_user"],$link)."'@'$db_host' TO '".mysql_real_escape_string($data["new"]["database_user"],$link)."'@'$db_host'",$link); + if($data["old"]["remote_access"] == 'y') { + $this->process_host_list("RENAME", "", $data["new"]["database_user"], "", $data["new"]["remote_ips"], $link, $data["new"]["database_user"]); + } + $app->log('Renaming mysql user: '.$data["old"]["database_user"].' to '.$data["new"]["database_user"],LOGLEVEL_DEBUG); + } + + //* Remote access option has changed. + if($data["new"]["remote_access"] != $data["old"]["remote_access"]) { + + //* revoke old priveliges + //mysql_query("REVOKE ALL PRIVILEGES ON ".mysql_real_escape_string($data["new"]["database_name"],$link).".* FROM '".mysql_real_escape_string($data["new"]["database_user"],$link)."';",$link); + + //* set new priveliges + if($data["new"]["remote_access"] == 'y') { + $this->process_host_list("GRANT", $data["new"]["database_name"], $data["new"]["database_user"], $data["new"]["database_password"], $data["new"]["remote_ips"], $link); + } else { + $this->process_host_list("DROP", "", $data["old"]["database_user"], "", $data["old"]["remote_ips"], $link); + } + $app->log('Changing mysql remote access priveliges for database: '.$data["new"]["database_name"],LOGLEVEL_DEBUG); + } elseif($data["new"]["remote_access"] == 'y' && $data["new"]["remote_ips"] != $data["old"]["remote_ips"]) { + //* Change remote access list + $this->process_host_list("DROP", "", $data["old"]["database_user"], "", $data["old"]["remote_ips"], $link); + $this->process_host_list("GRANT", $data["new"]["database_name"], $data["new"]["database_user"], $data["new"]["database_password"], $data["new"]["remote_ips"], $link); + } + + //* Change password + if($data["new"]["database_password"] != $data["old"]["database_password"]) { + $db_host = 'localhost'; + mysql_query("SET PASSWORD FOR '".mysql_real_escape_string($data["new"]["database_user"],$link)."'@'$db_host' = PASSWORD('".mysql_real_escape_string($data["new"]["database_password"],$link)."');",$link); + + if($data["new"]["remote_access"] == 'y') { + $this->process_host_list("PASSWORD", "", $data["new"]["database_user"], $data["new"]["database_password"], $data["new"]["remote_ips"], $link); + } + $app->log('Changing mysql user password for: '.$data["new"]["database_user"],LOGLEVEL_DEBUG); + } + + mysql_query("FLUSH PRIVILEGES;",$link); + mysql_close($link); + } + + } + + function db_delete($event_name,$data) { + global $app, $conf; + + if($data["old"]["type"] == 'mysql') { + if(!include(ISPC_LIB_PATH.'/mysql_clientdb.conf')) { + $app->log('Unable to open'.ISPC_LIB_PATH.'/mysql_clientdb.conf',LOGLEVEL_ERROR); + return; + } + + //* Connect to the database + $link = mysql_connect($clientdb_host, $clientdb_user, $clientdb_password); + if (!$link) { + $app->log('Unable to connect to the database'.mysql_error($link),LOGLEVEL_ERROR); + return; + } + + //* Get the db host setting for the access priveliges + if($data["old"]["remote_access"] == 'y') { + if($this->process_host_list("DROP", "", $data["old"]["database_user"], "", $data["old"]["remote_ips"], $link)) { + $app->log('Dropping mysql user: '.$data["old"]["database_user"],LOGLEVEL_DEBUG); + } else { + $app->log('Error while dropping mysql user: '.$data["old"]["database_user"].' '.mysql_error($link),LOGLEVEL_ERROR); + } + } + $db_host = 'localhost'; + if(mysql_query("DROP USER '".mysql_real_escape_string($data["old"]["database_user"],$link)."'@'$db_host';",$link)) { + $app->log('Dropping mysql user: '.$data["old"]["database_user"],LOGLEVEL_DEBUG); + } else { + $app->log('Error while dropping mysql user: '.$data["old"]["database_user"].' '.mysql_error($link),LOGLEVEL_ERROR); + } + + if(mysql_query('DROP DATABASE '.mysql_real_escape_string($data["old"]["database_name"],$link),$link)) { + $app->log('Dropping mysql database: '.$data["old"]["database_name"],LOGLEVEL_DEBUG); + } else { + $app->log('Error while dropping mysql database: '.$data["old"]["database_name"].' '.mysql_error($link),LOGLEVEL_ERROR); + } + + mysql_query("FLUSH PRIVILEGES;",$link); + mysql_close($link); + } + + + } + + + + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/plugins-available/network_settings_plugin.inc.php b/interface/ispconfig/server/plugins-available/network_settings_plugin.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..cfe33c7a20f9ae11f7d3d9cad3ebb23921225306 --- /dev/null +++ b/interface/ispconfig/server/plugins-available/network_settings_plugin.inc.php @@ -0,0 +1,289 @@ +plugins->registerEvent('server_insert','network_settings_plugin','insert'); + $app->plugins->registerEvent('server_update','network_settings_plugin','update'); + + $app->plugins->registerEvent('server_ip_insert','network_settings_plugin','insert'); + $app->plugins->registerEvent('server_ip_update','network_settings_plugin','update'); + + + + } + + function insert($event_name,$data) { + global $app, $conf; + + $this->update($event_name,$data); + + } + + // The purpose of this plugin is to rewrite the main.cf file + function update($event_name,$data) { + global $app, $conf; + + // get the config + $app->uses("getconf"); + $server_config = $app->getconf->get_server_config($conf["server_id"], 'server'); + + // Configure the debian network card settings + if($server_config['auto_network_configuration'] == 'y') { + + if (is_file('/etc/debian_version')) + { + copy('/etc/network/interfaces','/etc/network/interfaces~'); + + $app->load('tpl'); + + $network_tpl = new tpl(); + $network_tpl->newTemplate("debian_network_interfaces.master"); + + $network_tpl->setVar('ip_address',$server_config["ip_address"]); + $network_tpl->setVar('netmask',$server_config["netmask"]); + $network_tpl->setVar('gateway',$server_config["gateway"]); + $network_tpl->setVar('broadcast',$this->broadcast($server_config["ip_address"],$server_config["netmask"])); + $network_tpl->setVar('network',$this->network($server_config["ip_address"],$server_config["netmask"])); + + $records = $app->db->queryAllRecords("SELECT ip_address FROM server_ip WHERE server_id = ".intval($conf["server_id"]) . " order by ip_address"); + $ip_records = array(); + $additionl_ip_records = 0; + $n = 0; + if(is_array($records)) { + foreach($records as $rec) { + /* + * don't insert the main-ip again! + */ + if ($rec['ip_address'] != $server_config["ip_address"]) + { + $ip_records[$n] = array( + 'id' => $n, + 'ip_address' => $rec['ip_address'], + 'netmask' => $server_config["netmask"], + 'gateway' => $server_config["gateway"], + 'broadcast' => $this->broadcast($rec['ip_address'],$server_config["netmask"]), + 'network' => $this->network($rec['ip_address'],$server_config["netmask"]) + ); + $additionl_ip_records = 1; + $n++; + } + } + } + + /* + * If we have more than 1 IP we have to add the main-ip at the end + * of the network-ip-list. If we don't do so, there may be problems + * in multi-server-settings (with the acces from other server to the + * main-server) because the LAST IP in the list is the IP mysql uses + * to determine the host, the user is logging in from. + */ + if ($additionl_ip_records != 0) + { + $swap["ip_address"] = $ip_records[$n-1]["ip_address"]; + $swap["netmask"] = $ip_records[$n-1]["netmask"]; + $swap["gateway"] = $ip_records[$n-1]["gateway"]; + + $ip_records[$n-1] = array( + 'id' => $n-1, + 'ip_address' => $server_config['ip_address'], + 'netmask' => $server_config["netmask"], + 'gateway' => $server_config["gateway"], + 'broadcast' => $this->broadcast($server_config['ip_address'],$server_config["netmask"]), + 'network' => $this->network($server_config['ip_address'],$server_config["netmask"]) + ); + $network_tpl->setVar('ip_address',$swap["ip_address"]); + $network_tpl->setVar('netmask',$swap["netmask"]); + $network_tpl->setVar('gateway',$swap["gateway"]); + $network_tpl->setVar('broadcast',$this->broadcast($swap["ip_address"],$swap["netmask"])); + $network_tpl->setVar('network',$this->network($swap["ip_address"],$swap["netmask"])); + } + + $network_tpl->setVar('additionl_ip_records',$additionl_ip_records); + $network_tpl->setLoop('interfaces',$ip_records); + file_put_contents('/etc/network/interfaces',$network_tpl->grab()); + unset($network_tpl); + + $app->log("Changed Network settings",LOGLEVEL_DEBUG); + exec('/etc/init.d/networking force-reload'); + } + elseif (is_file('/etc/gentoo-release')) + { + copy('/etc/conf.d/net','/etc/conf.d/net~'); + + $app->load('tpl'); + + $network_tpl = new tpl(); + $network_tpl->newTemplate("gentoo_network_interfaces.master"); + + $network_tpl->setVar('ip_address',$server_config["ip_address"]); + $network_tpl->setVar('netmask',$server_config["netmask"]); + $network_tpl->setVar('gateway',$server_config["gateway"]); + $network_tpl->setVar('broadcast',$this->broadcast($server_config["ip_address"],$server_config["netmask"])); + + $records = $app->db->queryAllRecords("SELECT ip_address FROM server_ip WHERE server_id = ".intval($conf["server_id"]) . " order by ip_address"); + $ip_records = array(); + $additionl_ip_records = 0; + $n = 0; + if(is_array($records)) { + foreach($records as $rec) { + /* + * don't insert the main-ip again! + */ + if ($rec['ip_address'] != $server_config["ip_address"]) + { + $ip_records[$n] = array( + 'id' => $n, + 'ip_address' => $rec['ip_address'], + 'netmask' => $server_config["netmask"], + 'gateway' => $server_config["gateway"], + 'broadcast' => $this->broadcast($rec['ip_address'],$server_config["netmask"]) + ); + $additionl_ip_records = 1; + $n++; + } + } + } + + /* + * If we have more than 1 IP we have to add the main-ip at the end + * of the network-ip-list. If we don't do so, there may be problems + * in multi-server-settings (with the acces from other server to the + * main-server) because the LAST IP in the list is the IP mysql uses + * to determine the host, the user is logging in from. + */ + if ($additionl_ip_records != 0) + { + $swap["ip_address"] = $ip_records[$n-1]["ip_address"]; + $swap["netmask"] = $ip_records[$n-1]["netmask"]; + $swap["gateway"] = $ip_records[$n-1]["gateway"]; + + $ip_records[$n-1] = array( + 'id' => $n-1, + 'ip_address' => $server_config['ip_address'], + 'netmask' => $server_config["netmask"], + 'gateway' => $server_config["gateway"], + 'broadcast' => $this->broadcast($server_config['ip_address'],$server_config["netmask"]) + ); + $network_tpl->setVar('ip_address',$swap["ip_address"]); + $network_tpl->setVar('netmask',$swap["netmask"]); + $network_tpl->setVar('gateway',$swap["gateway"]); + $network_tpl->setVar('broadcast',$this->broadcast($swap["ip_address"],$swap["netmask"])); + } + + $network_tpl->setVar('additionl_ip_records',$additionl_ip_records); + $network_tpl->setLoop('interfaces',$ip_records); + file_put_contents('/etc/conf.d/net',$network_tpl->grab()); + unset($network_tpl); + + $app->log("Changed Network settings",LOGLEVEL_DEBUG); + exec('/etc/init.d/net.eth0 restart'); + } + else { + $app->log("Network configuration not available for this linux distribution.",LOGLEVEL_DEBUG); + } + + } else { + $app->log("Network configuration disabled in server settings.",LOGLEVEL_WARN); + } + + } + + function network($ip, $netmask){ + $netmask = $this->netmask($netmask); + list($f1,$f2,$f3,$f4) = explode(".", $netmask); + $netmask_bin = str_pad(decbin($f1),8,"0",STR_PAD_LEFT).str_pad(decbin($f2),8,"0",STR_PAD_LEFT).str_pad(decbin($f3),8,"0",STR_PAD_LEFT).str_pad(decbin($f4),8,"0",STR_PAD_LEFT); + list($f1,$f2,$f3,$f4) = explode(".", $ip); + $ip_bin = str_pad(decbin($f1),8,"0",STR_PAD_LEFT).str_pad(decbin($f2),8,"0",STR_PAD_LEFT).str_pad(decbin($f3),8,"0",STR_PAD_LEFT).str_pad(decbin($f4),8,"0",STR_PAD_LEFT); + for($i=0;$i<32;$i++){ + $network_bin .= substr($netmask_bin,$i,1) * substr($ip_bin,$i,1); + } + $network_bin = wordwrap($network_bin, 8, ".", 1); + list($f1,$f2,$f3,$f4) = explode(".", trim($network_bin)); + return bindec($f1).".".bindec($f2).".".bindec($f3).".".bindec($f4); + } + + function broadcast($ip, $netmask){ + $netmask = $this->netmask($netmask); + $binary_netmask = $this->binary_netmask($netmask); + list($f1,$f2,$f3,$f4) = explode(".", $ip); + $ip_bin = str_pad(decbin($f1),8,"0",STR_PAD_LEFT).str_pad(decbin($f2),8,"0",STR_PAD_LEFT).str_pad(decbin($f3),8,"0",STR_PAD_LEFT).str_pad(decbin($f4),8,"0",STR_PAD_LEFT); + $broadcast_bin = str_pad(substr($ip_bin, 0, $binary_netmask),32,"1",STR_PAD_RIGHT); + $broadcast_bin = wordwrap($broadcast_bin, 8, ".", 1); + list($f1,$f2,$f3,$f4) = explode(".", trim($broadcast_bin)); + return bindec($f1).".".bindec($f2).".".bindec($f3).".".bindec($f4); + } + + function netmask($netmask){ + list($f1,$f2,$f3,$f4) = explode(".", trim($netmask)); + $bin = str_pad(decbin($f1),8,"0",STR_PAD_LEFT).str_pad(decbin($f2),8,"0",STR_PAD_LEFT).str_pad(decbin($f3),8,"0",STR_PAD_LEFT).str_pad(decbin($f4),8,"0",STR_PAD_LEFT); + $parts = explode("0", $bin); + $bin = str_pad($parts[0], 32, "0", STR_PAD_RIGHT); + $bin = wordwrap($bin, 8, ".", 1); + list($f1,$f2,$f3,$f4) = explode(".", trim($bin)); + return bindec($f1).".".bindec($f2).".".bindec($f3).".".bindec($f4); + } + + function binary_netmask($netmask){ + list($f1,$f2,$f3,$f4) = explode(".", trim($netmask)); + $bin = str_pad(decbin($f1),8,"0",STR_PAD_LEFT).str_pad(decbin($f2),8,"0",STR_PAD_LEFT).str_pad(decbin($f3),8,"0",STR_PAD_LEFT).str_pad(decbin($f4),8,"0",STR_PAD_LEFT); + $parts = explode("0", $bin); + return substr_count($parts[0], "1"); + } + +} // end class + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/plugins-available/pma_symlink_plugin.inc.php b/interface/ispconfig/server/plugins-available/pma_symlink_plugin.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..bbc32631f83a09b870fcbe8163bc5d7204897b27 --- /dev/null +++ b/interface/ispconfig/server/plugins-available/pma_symlink_plugin.inc.php @@ -0,0 +1,121 @@ +plugins->registerEvent('web_domain_insert',$this->plugin_name,'insert'); + $app->plugins->registerEvent('web_domain_update',$this->plugin_name,'update'); + } + + function insert($event_name,$data) { + global $app, $conf; + + $this->action = 'insert'; + // just run the update function + $this->update($event_name,$data); + } + + function update($event_name,$data) { + global $app, $conf; + + if($this->action != 'insert') $this->action = 'update'; + + if($data["new"]["type"] != "vhost" && $data["new"]["parent_domain_id"] > 0) { + + $old_parent_domain_id = intval($data["old"]["parent_domain_id"]); + $new_parent_domain_id = intval($data["new"]["parent_domain_id"]); + + // If the parent_domain_id has been chenged, we will have to update the old site as well. + if($this->action == 'update' && $data["new"]["parent_domain_id"] != $data["old"]["parent_domain_id"]) { + $tmp = $app->db->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ".$old_parent_domain_id." AND active = 'y'"); + $data["new"] = $tmp; + $data["old"] = $tmp; + $this->action = 'update'; + $this->update($event_name,$data); + } + + // This is not a vhost, so we need to update the parent record instead. + $tmp = $app->db->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ".$new_parent_domain_id." AND active = 'y'"); + $data["new"] = $tmp; + $data["old"] = $tmp; + $this->action = 'update'; + } + + if($data["new"]["document_root"] == '') { + $app->log("document_root not set",LOGLEVEL_WARN); + return 0; + } + + $symlink = true; + if($data["new"]["php"] == "suphp") $symlink = false; + elseif($data["new"]["php"] == "cgi" && $data["new"]["suexec"] == "y") $symlink = false; + elseif($data["new"]["php"] == "fast-cgi" && $data["new"]["suexec"] == "y") $symlink = false; + + + if(!is_dir($data["new"]["document_root"]."/web")) exec("mkdir -p ".$data["new"]["document_root"]."/web"); + if($symlink == false) { + if(is_link($data["new"]["document_root"]."/web/phpmyadmin")) exec("rm -f ".$data["new"]["document_root"]."/web/phpmyadmin"); + } else { + if(!is_link($data["new"]["document_root"]."/web/phpmyadmin")) exec("ln -s /var/www/phpmyadmin ".$data["new"]["document_root"]."/web/phpmyadmin"); + else exec("ln -sf /var/www/phpmyadmin ".$data["new"]["document_root"]."/web/phpmyadmin"); + } + } + + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/plugins-available/postfix_filter_plugin.inc.php b/interface/ispconfig/server/plugins-available/postfix_filter_plugin.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..6b5ed53738e859baabca52451f8830f3c8efca12 --- /dev/null +++ b/interface/ispconfig/server/plugins-available/postfix_filter_plugin.inc.php @@ -0,0 +1,153 @@ +plugins->registerEvent('mail_content_filter_insert','postfix_filter_plugin','insert'); + $app->plugins->registerEvent('mail_content_filter_update','postfix_filter_plugin','update'); + $app->plugins->registerEvent('mail_content_filter_delete','postfix_filter_plugin','delete'); + + + + } + + function insert($event_name,$data) { + global $app, $conf; + + $this->update($event_name,$data); + + } + + function update($event_name,$data) { + global $app, $conf; + + $type = $data["new"]["type"]; + if($type != '') { + $sql = "SELECT * FROM mail_content_filter WHERE server_id = ".intval($conf["server_id"])." AND type = '".$app->db->quote($type)."' AND active = 'y'"; + $rules = $app->db->queryAllRecords($sql); + $content = ''; + foreach($rules as $rule) { + $content .= $rule["pattern"]."\n"; + $content .= " ".$rule["action"]." ".$rule["data"]."\n"; + } + + if($type == 'header') { + file_put_contents('/etc/postfix/header_checks',$content); + $app->log("Writing /etc/postfix/header_checks",LOGLEVEL_DEBUG); + } + + if($type == 'mime_header') { + file_put_contents('/etc/postfix/mime_header_checks',$content); + $app->log("Writing /etc/postfix/mime_header_checks",LOGLEVEL_DEBUG); + } + + if($type == 'nested_header') { + file_put_contents('/etc/postfix/nested_header_checks',$content); + $app->log("Writing /etc/postfix/nested_header_checks",LOGLEVEL_DEBUG); + } + + if($type == 'body') { + file_put_contents('/etc/postfix/body_checks',$content); + $app->log("Writing /etc/postfix/body_checks",LOGLEVEL_DEBUG); + } + } + + $type = $data["old"]["type"]; + if($type != '') { + $sql = "SELECT * FROM mail_content_filter WHERE server_id = ".intval($conf["server_id"])." AND type = '".$app->db->quote($type)."' AND active = 'y'"; + $rules = $app->db->queryAllRecords($sql); + $content = ''; + foreach($rules as $rule) { + $content .= $rule["pattern"]."\n"; + $content .= " ".$rule["action"]." ".$rule["data"]."\n"; + } + + if($type == 'header') { + file_put_contents('/etc/postfix/header_checks',$content); + $app->log("Writing /etc/postfix/header_checks",LOGLEVEL_DEBUG); + } + + if($type == 'mime_header') { + file_put_contents('/etc/postfix/mime_header_checks',$content); + $app->log("Writing /etc/postfix/mime_header_checks",LOGLEVEL_DEBUG); + } + + if($type == 'nested_header') { + file_put_contents('/etc/postfix/nested_header_checks',$content); + $app->log("Writing /etc/postfix/nested_header_checks",LOGLEVEL_DEBUG); + } + + if($type == 'body') { + file_put_contents('/etc/postfix/body_checks',$content); + $app->log("Writing /etc/postfix/body_checks",LOGLEVEL_DEBUG); + } + } + } + + function delete($event_name,$data) { + global $app, $conf; + + $this->update($event_name,$data); + } + + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/plugins-available/postfix_server_plugin.inc.php b/interface/ispconfig/server/plugins-available/postfix_server_plugin.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..f506ce32a4d16446cf3f4bdcb222429a09dd2e0f --- /dev/null +++ b/interface/ispconfig/server/plugins-available/postfix_server_plugin.inc.php @@ -0,0 +1,116 @@ +plugins->registerEvent('server_insert','postfix_server_plugin','insert'); + $app->plugins->registerEvent('server_update','postfix_server_plugin','update'); + + + + } + + function insert($event_name,$data) { + global $app, $conf; + + $this->update($event_name,$data); + + } + + // The purpose of this plugin is to rewrite the main.cf file + function update($event_name,$data) { + global $app, $conf; + + // get the config + $app->uses("getconf"); + $mail_config = $app->getconf->get_server_config($conf["server_id"], 'mail'); + + copy('/etc/postfix/main.cf','/etc/postfix/main.cf~'); + + if($mail_config["relayhost"] != '') { + exec("postconf -e 'relayhost = ".$mail_config["relayhost"]."'"); + if($mail_config["relayhost_user"] != '' && $mail_config["relayhost_password"] != '') { + exec("postconf -e 'smtp_sasl_auth_enable = yes'"); + } else { + exec("postconf -e 'smtp_sasl_auth_enable = no'"); + } + exec("postconf -e 'smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd'"); + exec("postconf -e 'smtp_sasl_security_options ='"); + + // Store the sasl passwd + $content = $mail_config["relayhost"]." ".$mail_config["relayhost_user"].":".$mail_config["relayhost_password"]; + file_put_contents('/etc/postfix/sasl_passwd',$content); + exec("chown root:root /etc/postfix/sasl_passwd"); + exec("chmod 600 /etc/postfix/sasl_passwd"); + exec("postmap /etc/postfix/sasl_passwd"); + exec("/etc/init.d/postfix restart"); + + } else { + exec("postconf -e 'relayhost ='"); + } + + exec("postconf -e 'mailbox_size_limit = ".intval($mail_config["mailbox_size_limit"]*1024*1024)."'"); + exec("postconf -e 'message_size_limit = ".intval($mail_config["message_size_limit"]*1024*1024)."'"); + + } + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/plugins-available/powerdns_plugin.inc.php b/interface/ispconfig/server/plugins-available/powerdns_plugin.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..ebe88a8291a63c111ee83b30ad90042d3b5e8f0a --- /dev/null +++ b/interface/ispconfig/server/plugins-available/powerdns_plugin.inc.php @@ -0,0 +1,345 @@ +plugins->registerEvent('dns_soa_insert',$this->plugin_name,'soa_insert'); + $app->plugins->registerEvent('dns_soa_update',$this->plugin_name,'soa_update'); + $app->plugins->registerEvent('dns_soa_delete',$this->plugin_name,'soa_delete'); + + //* RR + $app->plugins->registerEvent('dns_rr_insert',$this->plugin_name,'rr_insert'); + $app->plugins->registerEvent('dns_rr_update',$this->plugin_name,'rr_update'); + $app->plugins->registerEvent('dns_rr_delete',$this->plugin_name,'rr_delete'); + + } + + + function soa_insert($event_name,$data) { + global $app, $conf; + + if($data["new"]["active"] != 'Y') return; + + $origin = substr($data["new"]["origin"], 0, -1); + $ispconfig_id = $data["new"]["id"]; + $serial = $app->db->queryOneRecord("SELECT * FROM dns_soa WHERE id = ".$ispconfig_id); + $serial_id = $serial["serial"]; + $app->db->query("INSERT INTO powerdns.domains (name, type, notified_serial, ispconfig_id) VALUES ('$origin', 'MASTER', $serial_id, $ispconfig_id)"); + //$app->db->query("INSERT INTO powerdns.domains (name, type, ispconfig_id) VALUES ('$origin', 'NATIVE', $ispconfig_id)"); + $zone_id = mysql_insert_id(); + if(substr($data["new"]["ns"], -1) == '.'){ + $ns = substr($data["new"]["ns"], 0, -1); + } else { + $ns = $data["new"]["ns"].'.'.$origin; + } + if($ns == '') $ns = $origin; + + $hostmaster = substr($data["new"]["mbox"], 0, -1); + $content = $ns.' '.$hostmaster.' 0'; + //$content = $ns.' '.$hostmaster.' '.$serial_id.''; + $ttl = $data["new"]["ttl"]; + + $app->db->query("INSERT INTO powerdns.records (domain_id, name, type, content, ttl, prio, change_date, ispconfig_id) VALUES ($zone_id, '$origin', 'SOA', '$content', $ttl, 0, ".time().", $ispconfig_id)"); + + } + + function soa_update($event_name,$data) { + global $app, $conf; + + if($data["new"]["active"] != 'Y'){ + if($data["old"]["active"] != 'Y') return; + $this->soa_delete($event_name,$data); + } else { + if($data["old"]["active"] == 'Y'){ + $origin = substr($data["new"]["origin"], 0, -1); + $ispconfig_id = $data["new"]["id"]; + $serial = $app->db->queryOneRecord("SELECT * FROM dns_soa WHERE id = ".$ispconfig_id); + $serial_id = $serial["serial"]; + //$app->db->query("UPDATE powerdns.domains SET name = '$origin', notified_serial = $serial_id WHERE ispconfig_id = $ispconfig_id"); + //$app->db->query("UPDATE powerdns.domains SET name = '$origin' WHERE ispconfig_id = $ispconfig_id"); + + if(substr($data["new"]["ns"], -1) == '.'){ + $ns = substr($data["new"]["ns"], 0, -1); + } else { + $ns = $data["new"]["ns"].'.'.$origin; + } + if($ns == '') $ns = $origin; + + $hostmaster = substr($data["new"]["mbox"], 0, -1); + //$content = $ns.' '.$hostmaster.' 0'; + $content = $ns.' '.$hostmaster.' '.$serial_id.''; + $ttl = $data["new"]["ttl"]; + $app->db->query("UPDATE powerdns.records SET name = '$origin', content = '$content', ttl = $ttl, change_date = ".time()." WHERE ispconfig_id = ".$data["new"]["id"]." AND type = 'SOA'"); + } else { + $this->soa_insert($event_name,$data); + $ispconfig_id = $data["new"]["id"]; + if($records = $app->db->queryAllRecords("SELECT * FROM dns_rr WHERE zone = $ispconfig_id AND active = 'Y'")){ + foreach($records as $record){ + foreach($record as $key => $val){ + $data["new"][$key] = $val; + } + $this->rr_insert("dns_rr_insert", $data); + } + } + + } + } + + } + + function soa_delete($event_name,$data) { + global $app, $conf; + + $zone = $app->db->queryOneRecord("SELECT * FROM powerdns.domains WHERE ispconfig_id = ".$data["old"]["id"]); + $zone_id = $zone["id"]; + $app->db->query("DELETE FROM powerdns.records WHERE domain_id = $zone_id"); + $app->db->query("DELETE FROM powerdns.domains WHERE id = $zone_id"); + + } + + function rr_insert($event_name,$data) { + global $app, $conf; + if($data["new"]["active"] != 'Y') return; + + $zone = $app->db->queryOneRecord("SELECT * FROM dns_soa WHERE id = ".$data["new"]["zone"]); + $origin = substr($zone["origin"], 0, -1); + $powerdns_zone = $app->db->queryOneRecord("SELECT * FROM powerdns.domains WHERE ispconfig_id = ".$data["new"]["zone"]); + $zone_id = $powerdns_zone["id"]; + + $type = $data["new"]["type"]; + + if(substr($data["new"]["name"], -1) == '.'){ + $name = substr($data["new"]["name"], 0, -1); + } else { + if($data["new"]["name"] == ""){ + $name = $origin; + } else { + $name = $data["new"]["name"].'.'.$origin; + } + } + if($name == '') $name = $origin; + + switch ($type) { + case "CNAME": + case "MX": + case "NS": + case "ALIAS": + case "PTR": + case "SRV": + if(substr($data["new"]["data"], -1) == '.'){ + $content = substr($data["new"]["data"], 0, -1); + } else { + $content = $data["new"]["data"].'.'.$origin; + } + break; + case "HINFO": + $content = $data["new"]["data"]; + $quote1 = strpos($content, '"'); + if($quote1 !== FALSE){ + $quote2 = strpos(substr($content, ($quote1 + 1)), '"'); + } + if($quote1 !== FALSE && $quote2 !== FALSE){ + $text_between_quotes = str_replace(' ', '_', substr($content, ($quote1 + 1), (($quote2 - $quote1)))); + $content = $text_between_quotes.substr($content, ($quote2 + 2)); + } + break; + default: + $content = $data["new"]["data"]; + } + + $ttl = $data["new"]["ttl"]; + $prio = $data["new"]["aux"]; + $change_date = time(); + $ispconfig_id = $data["new"]["id"]; + + $app->db->query("INSERT INTO powerdns.records (domain_id, name, type, content, ttl, prio, change_date, ispconfig_id) VALUES ($zone_id, '$name', '$type', '$content', $ttl, $prio, $change_date, $ispconfig_id)"); + + } + + function rr_update($event_name,$data) { + global $app, $conf; + + if($data["new"]["active"] != 'Y'){ + if($data["old"]["active"] != 'Y') return; + $this->rr_delete($event_name,$data); + } else { + if($data["old"]["active"] == 'Y'){ + $zone = $app->db->queryOneRecord("SELECT * FROM dns_soa WHERE id = ".$data["new"]["zone"]); + $origin = substr($zone["origin"], 0, -1); + $powerdns_zone = $app->db->queryOneRecord("SELECT * FROM powerdns.domains WHERE ispconfig_id = ".$data["new"]["zone"]); + $zone_id = $powerdns_zone["id"]; + + $type = $data["new"]["type"]; + + if(substr($data["new"]["name"], -1) == '.'){ + $name = substr($data["new"]["name"], 0, -1); + } else { + if($data["new"]["name"] == ""){ + $name = $origin; + } else { + $name = $data["new"]["name"].'.'.$origin; + } + } + if($name == '') $name = $origin; + + switch ($type) { + case "CNAME": + case "MX": + case "NS": + case "ALIAS": + case "PTR": + case "SRV": + if(substr($data["new"]["data"], -1) == '.'){ + $content = substr($data["new"]["data"], 0, -1); + } else { + $content = $data["new"]["data"].'.'.$origin; + } + break; + case "HINFO": + $content = $data["new"]["data"]; + $quote1 = strpos($content, '"'); + if($quote1 !== FALSE){ + $quote2 = strpos(substr($content, ($quote1 + 1)), '"'); + } + if($quote1 !== FALSE && $quote2 !== FALSE){ + $text_between_quotes = str_replace(' ', '_', substr($content, ($quote1 + 1), (($quote2 - $quote1)))); + $content = $text_between_quotes.substr($content, ($quote2 + 2)); + } + break; + default: + $content = $data["new"]["data"]; + } + + $ttl = $data["new"]["ttl"]; + $prio = $data["new"]["aux"]; + $change_date = time(); + $ispconfig_id = $data["new"]["id"]; + //echo "UPDATE powerdns.records SET name = '$name', type = '$type', content = '$content', ttl = $ttl, prio = $prio, change_date = ".time()." WHERE id = $record_id"; + $app->db->query("UPDATE powerdns.records SET name = '$name', type = '$type', content = '$content', ttl = $ttl, prio = $prio, change_date = ".time()." WHERE ispconfig_id = $ispconfig_id AND type != 'SOA'"); + + } else { + $this->rr_insert($event_name,$data); + } + } + + } + + function rr_delete($event_name,$data) { + global $app, $conf; + + $ispconfig_id = $data["old"]["id"]; + $app->db->query("DELETE FROM powerdns.records WHERE ispconfig_id = $ispconfig_id AND type != 'SOA'"); + + } + + + + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/plugins-available/shelluser_base_plugin.inc.php b/interface/ispconfig/server/plugins-available/shelluser_base_plugin.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..ed7fdc635cea53980ecf28e829290d49fb3bb59f --- /dev/null +++ b/interface/ispconfig/server/plugins-available/shelluser_base_plugin.inc.php @@ -0,0 +1,189 @@ +plugins->registerEvent('shell_user_insert',$this->plugin_name,'insert'); + $app->plugins->registerEvent('shell_user_update',$this->plugin_name,'update'); + $app->plugins->registerEvent('shell_user_delete',$this->plugin_name,'delete'); + + + } + + + function insert($event_name,$data) { + global $app, $conf; + + $app->uses('system'); + + if($app->system->is_user($data['new']['puser'])) { + // Get the UID of the parent user + $uid = intval($app->system->getuid($data['new']['puser'])); + if($uid > $this->min_uid) { + $command = 'useradd'; + $command .= ' -d '.escapeshellcmd($data['new']['dir']); + $command .= ' -g '.escapeshellcmd($data['new']['pgroup']); + $command .= ' -o '; // non unique + if($data['new']['password'] != '') $command .= ' -p '.escapeshellcmd($data['new']['password']); + $command .= ' -s '.escapeshellcmd($data['new']['shell']); + $command .= ' -u '.escapeshellcmd($uid); + $command .= ' '.escapeshellcmd($data['new']['username']); + + exec($command); + $app->log("Executed command: ".$command,LOGLEVEL_DEBUG); + $app->log("Added shelluser: ".$data['new']['username'],LOGLEVEL_DEBUG); + + //* Create .bash_history file + exec('touch '.escapeshellcmd($data['new']['dir']).'/.bash_history'); + exec('chmod 755 '.escapeshellcmd($data['new']['dir']).'/.bash_history'); + exec('chown '.escapeshellcmd($data['new']['username']).':'.escapeshellcmd($data['new']['pgroup']).' '.escapeshellcmd($data['new']['dir']).'/.bash_history'); + + //* Disable shell user temporarily if we use jailkit + if($data['new']['chroot'] == 'jailkit') { + $command = 'usermod -s /bin/false -L '.escapeshellcmd($data['new']['username']); + exec($command); + $app->log("Disabling shelluser temporarily: ".$command,LOGLEVEL_DEBUG); + } + + } else { + $app->log("UID = $uid for shelluser:".$data['new']['username']." not allowed.",LOGLEVEL_ERROR); + } + } else { + $app->log("Skippung insert of user:".$data['new']['username'].", parent user ".$data['new']['puser']." does not exist.",LOGLEVEL_WARN); + } + } + + function update($event_name,$data) { + global $app, $conf; + + $app->uses('system'); + + if($app->system->is_user($data['new']['puser'])) { + // Get the UID of the parent user + $uid = intval($app->system->getuid($data['new']['puser'])); + if($uid > $this->min_uid) { + // Check if the user that we want to update exists, if not, we insert it + if($app->system->is_user($data['old']['username'])) { + $command = 'usermod'; + $command .= ' --home '.escapeshellcmd($data['new']['dir']); + $command .= ' --gid '.escapeshellcmd($data['new']['pgroup']); + // $command .= ' --non-unique '; + $command .= ' --password '.escapeshellcmd($data['new']['password']); + if($data['new']['chroot'] != 'jailkit') $command .= ' --shell '.escapeshellcmd($data['new']['shell']); + // $command .= ' --uid '.escapeshellcmd($uid); + $command .= ' --login '.escapeshellcmd($data['new']['username']); + $command .= ' '.escapeshellcmd($data['old']['username']); + + exec($command); + $app->log("Executed command: $command ",LOGLEVEL_DEBUG); + $app->log("Updated shelluser: ".$data['old']['username'],LOGLEVEL_DEBUG); + + + //* Create .bash_history file + if(!is_file($data['new']['dir']).'/.bash_history') { + exec('touch '.escapeshellcmd($data['new']['dir']).'/.bash_history'); + exec('chmod 755 '.escapeshellcmd($data['new']['dir']).'/.bash_history'); + exec('chown '.escapeshellcmd($data['new']['username']).':'.escapeshellcmd($data['new']['pgroup']).' '.escapeshellcmd($data['new']['dir']).'/.bash_history'); + } + + } else { + // The user does not exist, so we insert it now + $this->insert($event_name,$data); + } + } else { + $app->log("UID = $uid for shelluser:".$data['new']['username']." not allowed.",LOGLEVEL_ERROR); + } + } else { + $app->log("Skippung update for user:".$data['new']['username'].", parent user ".$data['new']['puser']." does not exist.",LOGLEVEL_WARN); + } + } + + function delete($event_name,$data) { + global $app, $conf; + + $app->uses('system'); + + if($app->system->is_user($data['old']['username'])) { + // Get the UID of the user + $userid = intval($app->system->getuid($data['old']['username'])); + if($userid > $this->min_uid) { + // We delete only non jailkit users, jailkit users will be deleted by the jailkit plugin. + if ($data['old']['chroot'] != "jailkit") { + $command = 'userdel -f'; + $command .= ' '.escapeshellcmd($data['old']['username']); + + exec($command); + $app->log("Deleted shelluser: ".$data['old']['username'],LOGLEVEL_DEBUG); + } + + } else { + $app->log("UID = $userid for shelluser:".$data['old']['username']." not allowed.",LOGLEVEL_ERROR); + } + } else { + $app->log("User:".$data['new']['username']." does not exist in in /etc/passwd, skipping delete.",LOGLEVEL_WARN); + } + + } + + + + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/plugins-available/shelluser_jailkit_plugin.inc.php b/interface/ispconfig/server/plugins-available/shelluser_jailkit_plugin.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..e5665fc11d7eaddbe68b0223ea0f1edb1127abeb --- /dev/null +++ b/interface/ispconfig/server/plugins-available/shelluser_jailkit_plugin.inc.php @@ -0,0 +1,303 @@ +plugins->registerEvent('shell_user_insert',$this->plugin_name,'insert'); + $app->plugins->registerEvent('shell_user_update',$this->plugin_name,'update'); + $app->plugins->registerEvent('shell_user_delete',$this->plugin_name,'delete'); + + + } + + //* This function is called, when a shell user is inserted in the database + function insert($event_name,$data) { + global $app, $conf; + + $app->uses('system'); + + if($app->system->is_user($data['new']['username'])) { + + /** + * Setup Jailkit Chroot System If Enabled + */ + if ($data['new']['chroot'] == "jailkit") + { + // load the server configuration options + $app->uses("getconf"); + $this->data = $data; + $this->app = $app; + $this->jailkit_config = $app->getconf->get_server_config($conf["server_id"], 'jailkit'); + + $this->_update_website_security_level(); + + $this->_setup_jailkit_chroot(); + + $this->_add_jailkit_user(); + + $command .= 'usermod -U '.escapeshellcmd($data['new']['username']); + exec($command); + + $this->_update_website_security_level(); + } + + $app->log("Jailkit Plugin -> insert username:".$data['new']['username'],LOGLEVEL_DEBUG); + + } else { + $app->log("Jailkit Plugin -> insert username:".$data['new']['username']." skipped, the user does not exist.",LOGLEVEL_WARN); + } + + } + + //* This function is called, when a shell user is updated in the database + function update($event_name,$data) { + global $app, $conf; + + $app->uses('system'); + + if($app->system->is_user($data['new']['username'])) { + + /** + * Setup Jailkit Chroot System If Enabled + */ + if ($data['new']['chroot'] == "jailkit") + { + // load the server configuration options + $app->uses("getconf"); + $this->data = $data; + $this->app = $app; + $this->jailkit_config = $app->getconf->get_server_config($conf["server_id"], 'jailkit'); + + $this->_update_website_security_level(); + + $this->_setup_jailkit_chroot(); + $this->_add_jailkit_user(); + + $this->_update_website_security_level(); + } + + $app->log("Jailkit Plugin -> update username:".$data['new']['username'],LOGLEVEL_DEBUG); + + } else { + $app->log("Jailkit Plugin -> update username:".$data['new']['username']." skipped, the user does not exist.",LOGLEVEL_WARN); + } + + } + + //* This function is called, when a shell user is deleted in the database + /** + * TODO: Remove chroot user home and from the chroot passwd file + */ + function delete($event_name,$data) { + global $app, $conf; + + $app->uses('system'); + + if ($data['old']['chroot'] == "jailkit") + { + $app->uses("getconf"); + $this->jailkit_config = $app->getconf->get_server_config($conf["server_id"], 'jailkit'); + + $jailkit_chroot_userhome = $this->_get_home_dir($data['old']['username']); + + //commented out proved to be dangerous on config errors + //exec('rm -rf '.$data['old']['dir'].$jailkit_chroot_userhome); + + if(@is_dir($data['old']['dir'].$jailkit_chroot_userhome)) { + $command = 'userdel'; + $command .= ' '.escapeshellcmd($data['old']['username']); + exec($command); + $app->log("Jailkit Plugin -> delete chroot home:".$data['old']['dir'].$jailkit_chroot_userhome,LOGLEVEL_DEBUG); + } + + } + + $app->log("Jailkit Plugin -> delete username:".$data['old']['username'],LOGLEVEL_DEBUG); + + + } + + function _setup_jailkit_chroot() + { + //check if the chroot environment is created yet if not create it with a list of program sections from the config + if (!is_dir($this->data['new']['dir'].'/etc/jailkit')) + { + $command = '/usr/local/ispconfig/server/scripts/create_jailkit_chroot.sh'; + $command .= ' '.escapeshellcmd($this->data['new']['dir']); + $command .= ' \''.$this->jailkit_config['jailkit_chroot_app_sections'].'\''; + exec($command); + + $this->app->log("Added jailkit chroot with command: ".$command,LOGLEVEL_DEBUG); + + $this->_add_jailkit_programs(); + + //add bash.bashrc script + //we need to collect the domain name to be used as the HOSTNAME in the bashrc script + $web = $this->app->db->queryOneRecord("SELECT domain FROM web_domain WHERE domain_id = ".intval($this->data['new']["parent_domain_id"])); + + $this->app->load('tpl'); + + $tpl = new tpl(); + $tpl->newTemplate("bash.bashrc.master"); + + $tpl->setVar('jailkit_chroot',true); + $tpl->setVar('domain',$web['domain']); + $tpl->setVar('home_dir',$this->_get_home_dir("")); + + $bashrc = escapeshellcmd($this->data['new']['dir']).'/etc/bash.bashrc'; + if(@is_file($bashrc)) exec('rm '.$bashrc); + + file_put_contents($bashrc,$tpl->grab()); + unset($tpl); + + $this->app->log("Added bashrc scrpt : ".$bashrc,LOGLEVEL_DEBUG); + + $tpl = new tpl(); + $tpl->newTemplate("motd.master"); + + $tpl->setVar('domain',$web['domain']); + + $motd = escapeshellcmd($this->data['new']['dir']).'/var/run/motd'; + if(@is_file($motd)) exec('rm '.$motd); + + file_put_contents($motd,$tpl->grab()); + + } + } + + function _add_jailkit_programs() + { + //copy over further programs and its libraries + $command = '/usr/local/ispconfig/server/scripts/create_jailkit_programs.sh'; + $command .= ' '.escapeshellcmd($this->data['new']['dir']); + $command .= ' \''.$this->jailkit_config['jailkit_chroot_app_programs'].'\''; + exec($command); + + $this->app->log("Added programs to jailkit chroot with command: ".$command,LOGLEVEL_DEBUG); + } + + function _get_home_dir($username) + { + return str_replace("[username]",escapeshellcmd($username),$this->jailkit_config["jailkit_chroot_home"]); + } + + function _add_jailkit_user() + { + //add the user to the chroot + $jailkit_chroot_userhome = $this->_get_home_dir($this->data['new']['username']); + $jailkit_chroot_puserhome = $this->_get_home_dir($this->data['new']['puser']); + + if(!is_dir($this->data['new']['dir'].'/etc')) mkdir($this->data['new']['dir'].'/etc'); + if(!is_file($this->data['new']['dir'].'/etc/passwd')) exec('touch '.$this->data['new']['dir'].'/etc/passwd'); + + // IMPORTANT! + // ALWAYS create the user. Even if the user was created before + // if we check if the user exists, then a update (no shell -> jailkit) will not work + // and the user has FULL ACCESS to the root of the server! + $command = '/usr/local/ispconfig/server/scripts/create_jailkit_user.sh'; + $command .= ' '.escapeshellcmd($this->data['new']['username']); + $command .= ' '.escapeshellcmd($this->data['new']['dir']); + $command .= ' '.$jailkit_chroot_userhome; + $command .= ' '.escapeshellcmd($this->data['new']['shell']); + $command .= ' '.$this->data['new']['puser']; + $command .= ' '.$jailkit_chroot_puserhome; + exec($command); + + $this->app->log("Added jailkit user to chroot with command: ".$command,LOGLEVEL_DEBUG); + + exec("mkdir -p ".escapeshellcmd($this->data['new']['dir'].$jailkit_chroot_userhome)); + exec("chown ".$this->data['new']['username'].":".$this->data['new']['pgroup']." ".escapeshellcmd($this->data['new']['dir'].$jailkit_chroot_userhome)); + + $this->app->log("Added created jailkit user home in : ".$this->data['new']['dir'].$jailkit_chroot_userhome,LOGLEVEL_DEBUG); + + exec("mkdir -p ".escapeshellcmd($this->data['new']['dir'].$jailkit_chroot_puserhome)); + exec("chown ".$this->data['new']['puser'].":".$this->data['new']['pgroup']." ".escapeshellcmd($this->data['new']['dir'].$jailkit_chroot_puserhome)); + + $this->app->log("Added created jailkit parent user home in : ".$this->data['new']['dir'].$jailkit_chroot_puserhome,LOGLEVEL_DEBUG); + } + + //* Update the website root directory permissions depending on the security level + function _update_website_security_level() { + global $app,$conf; + + // load the server configuration options + $app->uses("getconf"); + $web_config = $app->getconf->get_server_config($conf["server_id"], 'web'); + + // Get the parent website of this shell user + $web = $app->db->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ".$this->data['new']['parent_domain_id']); + + //* If the security level is set to high + if($web_config['security_level'] == 20) { + $this->_exec("chmod 755 ".escapeshellcmd($web["document_root"])); + $this->_exec("chown root:root ".escapeshellcmd($web["document_root"])); + } + + } + + //* Wrapper for exec function for easier debugging + private function _exec($command) { + global $app; + $app->log("exec: ".$command,LOGLEVEL_DEBUG); + exec($command); + } + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/plugins-available/software_update_plugin.inc.php b/interface/ispconfig/server/plugins-available/software_update_plugin.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..08656c38743836a663801dc69681416afb084e1b --- /dev/null +++ b/interface/ispconfig/server/plugins-available/software_update_plugin.inc.php @@ -0,0 +1,178 @@ +plugins->registerEvent('software_update_inst_insert',$this->plugin_name,'process'); + //$app->plugins->registerEvent('software_update_inst_update',$this->plugin_name,'process'); + //$app->plugins->registerEvent('software_update_inst_delete',$this->plugin_name,'process'); + + + } + + function set_install_status($inst_id, $status) { + global $app; + + $app->db->query("UPDATE software_update_inst SET status = '{$status}' WHERE software_update_inst_id = '{$inst_id}'"); + $app->dbmaster->query("UPDATE software_update_inst SET status = '{$status}' WHERE software_update_inst_id = '{$inst_id}'"); + } + + function process($event_name,$data) { + global $app, $conf; + + //* Get the info of the package: + $software_update_id = intval($data["new"]["software_update_id"]); + $software_update = $app->db->queryOneRecord("SELECT * FROM software_update WHERE software_update_id = '$software_update_id'"); + $software_package = $app->db->queryOneRecord("SELECT * FROM software_package WHERE package_name = '".$app->db->quote($software_update['package_name'])."'"); + + if($software_package['package_type'] == 'ispconfig' && !$conf['software_updates_enabled'] == true) { + $app->log('Software Updates not enabled on this server. To enable updates, set $conf["software_updates_enabled"] = true; in config.inc.php',LOGLEVEL_WARN); + $this->set_install_status($data["new"]["software_update_inst_id"], "failed"); + return false; + } + + $installuser = ''; + if($software_package['package_type'] == 'ispconfig') { + $installuser = ''; + } elseif ($software_package['package_type'] == 'app') { + $installuser = 'ispapps'; + } else { + $app->log('package_type not supported',LOGLEVEL_WARN); + $this->set_install_status($data["new"]["software_update_inst_id"], "failed"); + return false; + } + + $temp_dir = '/tmp/'.md5 (uniqid (rand())); + $app->log("The temp dir is $temp_dir",LOGLEVEL_DEBUG); + mkdir($temp_dir); + if($installuser != '') exec('chown '.$installuser.' '.$temp_dir); + + if(!is_dir($temp_dir)) { + $app->log("Unable to create temp directory.",LOGLEVEL_WARN); + $this->set_install_status($data["new"]["software_update_inst_id"], "failed"); + return false; + } + + $cmd = "cd $temp_dir && wget ".$software_update["update_url"]; + if($installuser == '') { + exec($cmd); + } else { + exec("su -c ".escapeshellarg($cmd)." $installuser"); + } + $app->log("Downloading the update file from: ".$software_update["update_url"],LOGLEVEL_DEBUG); + + $url_parts = parse_url($software_update["update_url"]); + $update_filename = basename($url_parts["path"]); + $app->log("The update filename is $update_filename",LOGLEVEL_DEBUG); + + if(is_file($temp_dir.'/'.$update_filename)) { + + //* Checking the md5sum + if(md5_file($temp_dir.'/'.$update_filename) != $software_update["update_md5"]) { + $app->log("The md5 sum of the downloaded file is incorrect. Update aborted.",LOGLEVEL_WARN); + exec("rm -rf $temp_dir"); + $app->log("Deleting the temp directory $temp_dir",LOGLEVEL_DEBUG); + $this->set_install_status($data["new"]["software_update_inst_id"], "failed"); + return false; + } else { + $app->log("md5sum of the downloaded file is verified.",LOGLEVEL_DEBUG); + } + + + //* unpacking the update + $cmd = "cd $temp_dir && unzip $update_filename"; + if($installuser == '') { + exec($cmd); + } else { + exec("su -c ".escapeshellarg($cmd)." $installuser"); + } + + if(is_file($temp_dir.'/setup.sh')) { + // Execute the setup script + exec('chmod +x '.$temp_dir.'/setup.sh'); + $app->log("Executing setup.sh file in directory $temp_dir",LOGLEVEL_DEBUG); + $cmd = 'cd '.$temp_dir.' && ./setup.sh > package_install.log'; + if($installuser == '') { + exec($cmd); + } else { + exec("su -c ".escapeshellarg($cmd)." $installuser"); + } + + $log_data = @file_get_contents("{$temp_dir}/package_install.log"); + if(preg_match("'.*\[OK\]\s*$'is", $log_data)) { + $app->log("Installation successful",LOGLEVEL_DEBUG); + $app->log($log_data,LOGLEVEL_DEBUG); + $this->set_install_status($data["new"]["software_update_inst_id"], "installed"); + } else { + $app->log("Installation failed:\n\n" . $log_data,LOGLEVEL_WARN); + $this->set_install_status($data["new"]["software_update_inst_id"], "failed"); + } + } else { + $app->log("setup.sh file not found",LOGLEVEL_ERROR); + $this->set_install_status($data["new"]["software_update_inst_id"], "failed"); + } + } else { + $app->log("Download of the update file failed",LOGLEVEL_WARN); + $this->set_install_status($data["new"]["software_update_inst_id"], "failed"); + } + + exec("rm -rf $temp_dir"); + $app->log("Deleting the temp directory $temp_dir",LOGLEVEL_DEBUG); + } + + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/plugins-available/webmail_symlink_plugin.inc.php b/interface/ispconfig/server/plugins-available/webmail_symlink_plugin.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..f20dbbc646b79e1149476f1715e95ac4f5477f84 --- /dev/null +++ b/interface/ispconfig/server/plugins-available/webmail_symlink_plugin.inc.php @@ -0,0 +1,121 @@ +plugins->registerEvent('web_domain_insert',$this->plugin_name,'insert'); + $app->plugins->registerEvent('web_domain_update',$this->plugin_name,'update'); + } + + function insert($event_name,$data) { + global $app, $conf; + + $this->action = 'insert'; + // just run the update function + $this->update($event_name,$data); + } + + function update($event_name,$data) { + global $app, $conf; + + if($this->action != 'insert') $this->action = 'update'; + + if($data["new"]["type"] != "vhost" && $data["new"]["parent_domain_id"] > 0) { + + $old_parent_domain_id = intval($data["old"]["parent_domain_id"]); + $new_parent_domain_id = intval($data["new"]["parent_domain_id"]); + + // If the parent_domain_id has been chenged, we will have to update the old site as well. + if($this->action == 'update' && $data["new"]["parent_domain_id"] != $data["old"]["parent_domain_id"]) { + $tmp = $app->db->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ".$old_parent_domain_id." AND active = 'y'"); + $data["new"] = $tmp; + $data["old"] = $tmp; + $this->action = 'update'; + $this->update($event_name,$data); + } + + // This is not a vhost, so we need to update the parent record instead. + $tmp = $app->db->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ".$new_parent_domain_id." AND active = 'y'"); + $data["new"] = $tmp; + $data["old"] = $tmp; + $this->action = 'update'; + } + + if($data["new"]["document_root"] == '') { + $app->log("document_root not set",LOGLEVEL_WARN); + return 0; + } + + $symlink = true; + if($data["new"]["php"] == "suphp") $symlink = false; + elseif($data["new"]["php"] == "cgi" && $data["new"]["suexec"] == "y") $symlink = false; + elseif($data["new"]["php"] == "fast-cgi" && $data["new"]["suexec"] == "y") $symlink = false; + + + if(!is_dir($data["new"]["document_root"]."/web")) exec("mkdir -p ".$data["new"]["document_root"]."/web"); + if($symlink == false) { + if(is_link($data["new"]["document_root"]."/web/webmail")) exec("rm -f ".$data["new"]["document_root"]."/web/webmail"); + } else { + if(!is_link($data["new"]["document_root"]."/web/webmail")) exec("ln -s /var/www/webmail ".$data["new"]["document_root"]."/web/webmail"); + else exec("ln -sf /var/www/webmail ".$data["new"]["document_root"]."/web/webmail"); + } + } + + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/plugins-enabled/apache2_plugin.inc.php b/interface/ispconfig/server/plugins-enabled/apache2_plugin.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..16b405ae46e11d8bfeed1685bf2692167c94d8c2 --- /dev/null +++ b/interface/ispconfig/server/plugins-enabled/apache2_plugin.inc.php @@ -0,0 +1,987 @@ +plugins->registerEvent('web_domain_insert',$this->plugin_name,'ssl'); + $app->plugins->registerEvent('web_domain_update',$this->plugin_name,'ssl'); + $app->plugins->registerEvent('web_domain_delete',$this->plugin_name,'ssl'); + + $app->plugins->registerEvent('web_domain_insert',$this->plugin_name,'insert'); + $app->plugins->registerEvent('web_domain_update',$this->plugin_name,'update'); + $app->plugins->registerEvent('web_domain_delete',$this->plugin_name,'delete'); + + $app->plugins->registerEvent('server_ip_insert',$this->plugin_name,'server_ip'); + $app->plugins->registerEvent('server_ip_update',$this->plugin_name,'server_ip'); + $app->plugins->registerEvent('server_ip_delete',$this->plugin_name,'server_ip'); + + } + + // Handle the creation of SSL certificates + function ssl($event_name,$data) { + global $app, $conf; + + if(!is_dir($data["new"]["document_root"]."/ssl")) exec("mkdir -p ".$data["new"]["document_root"]."/ssl"); + $ssl_dir = $data["new"]["document_root"]."/ssl"; + $domain = $data["new"]["ssl_domain"]; + $key_file = $ssl_dir.'/'.$domain.".key.org"; + $key_file2 = $ssl_dir.'/'.$domain.".key"; + $csr_file = $ssl_dir.'/'.$domain.".csr"; + $crt_file = $ssl_dir.'/'.$domain.".crt"; + + //* Create a SSL Certificate + if($data["new"]["ssl_action"] == 'create') { + $rand_file = $ssl_dir."/random_file"; + $rand_data = md5(uniqid(microtime(),1)); + for($i=0; $i<1000; $i++){ + $rand_data .= md5(uniqid(microtime(),1)); + $rand_data .= md5(uniqid(microtime(),1)); + $rand_data .= md5(uniqid(microtime(),1)); + $rand_data .= md5(uniqid(microtime(),1)); + } + file_put_contents($rand_file, $rand_data); + + $ssl_password = substr(md5(uniqid(microtime(),1)), 0, 15); + + $ssl_cnf = " RANDFILE = $rand_file + + [ req ] + default_bits = 2048 + default_keyfile = keyfile.pem + distinguished_name = req_distinguished_name + attributes = req_attributes + prompt = no + output_password = $ssl_password + + [ req_distinguished_name ] + C = ".$data['new']['ssl_country']." + ST = ".$data['new']['ssl_state']." + L = ".$data['new']['ssl_locality']." + O = ".$data['new']['ssl_organisation']." + OU = ".$data['new']['ssl_organisation_unit']." + CN = $domain + emailAddress = webmaster@".$data['new']['domain']." + + [ req_attributes ] + challengePassword = A challenge password"; + + $ssl_cnf_file = $ssl_dir."/openssl.conf"; + file_put_contents($ssl_cnf_file,$ssl_cnf); + + $rand_file = escapeshellcmd($rand_file); + $key_file = escapeshellcmd($key_file); + $key_file2 = escapeshellcmd($key_file2); + $ssl_days = 3650; + $csr_file = escapeshellcmd($csr_file); + $config_file = escapeshellcmd($ssl_cnf_file); + $crt_file = escapeshellcmd($crt_file); + + if(is_file($ssl_cnf_file)){ + exec("openssl genrsa -des3 -rand $rand_file -passout pass:$ssl_password -out $key_file 2048 && openssl req -new -passin pass:$ssl_password -passout pass:$ssl_password -key $key_file -out $csr_file -days $ssl_days -config $config_file && openssl req -x509 -passin pass:$ssl_password -passout pass:$ssl_password -key $key_file -in $csr_file -out $crt_file -days $ssl_days -config $config_file && openssl rsa -passin pass:$ssl_password -in $key_file -out $key_file2"); + $app->log("Creating SSL Cert for: $domain",LOGLEVEL_DEBUG); + } + + exec("chmod 400 $key_file2"); + @unlink($config_file); + @unlink($rand_file); + $ssl_request = $app->db->quote(file_get_contents($csr_file)); + $ssl_cert = $app->db->quote(file_get_contents($crt_file)); + /* Update the DB of the (local) Server */ + $app->db->query("UPDATE web_domain SET ssl_request = '$ssl_request', ssl_cert = '$ssl_cert' WHERE domain = '".$data["new"]["domain"]."'"); + $app->db->query("UPDATE web_domain SET ssl_action = '' WHERE domain = '".$data["new"]["domain"]."'"); + /* Update also the master-DB of the Server-Farm */ + $app->dbmaster->query("UPDATE web_domain SET ssl_request = '$ssl_request', ssl_cert = '$ssl_cert' WHERE domain = '".$data["new"]["domain"]."'"); + $app->dbmaster->query("UPDATE web_domain SET ssl_action = '' WHERE domain = '".$data["new"]["domain"]."'"); + } + + //* Save a SSL certificate to disk + if($data["new"]["ssl_action"] == 'save') { + $ssl_dir = $data["new"]["document_root"]."/ssl"; + $domain = $data["new"]["ssl_domain"]; + $csr_file = $ssl_dir.'/'.$domain.".csr"; + $crt_file = $ssl_dir.'/'.$domain.".crt"; + $bundle_file = $ssl_dir.'/'.$domain.".bundle"; + file_put_contents($csr_file,$data["new"]["ssl_request"]); + file_put_contents($crt_file,$data["new"]["ssl_cert"]); + if(trim($data["new"]["ssl_bundle"]) != '') file_put_contents($bundle_file,$data["new"]["ssl_bundle"]); + /* Update the DB of the (local) Server */ + $app->db->query("UPDATE web_domain SET ssl_action = '' WHERE domain = '".$data["new"]["domain"]."'"); + /* Update also the master-DB of the Server-Farm */ + $app->dbmaster->query("UPDATE web_domain SET ssl_action = '' WHERE domain = '".$data["new"]["domain"]."'"); + $app->log("Saving SSL Cert for: $domain",LOGLEVEL_DEBUG); + } + + //* Delete a SSL certificate + if($data["new"]["ssl_action"] == 'del') { + $ssl_dir = $data["new"]["document_root"]."/ssl"; + $domain = $data["new"]["ssl_domain"]; + $csr_file = $ssl_dir.'/'.$domain.".csr"; + $crt_file = $ssl_dir.'/'.$domain.".crt"; + $bundle_file = $ssl_dir.'/'.$domain.".bundle"; + unlink($csr_file); + unlink($crt_file); + unlink($bundle_file); + /* Update the DB of the (local) Server */ + $app->db->query("UPDATE web_domain SET ssl_request = '', ssl_cert = '' WHERE domain = '".$data["new"]["domain"]."'"); + $app->db->query("UPDATE web_domain SET ssl_action = '' WHERE domain = '".$data["new"]["domain"]."'"); + /* Update also the master-DB of the Server-Farm */ + $app->dbmaster->query("UPDATE web_domain SET ssl_request = '', ssl_cert = '' WHERE domain = '".$data["new"]["domain"]."'"); + $app->dbmaster->query("UPDATE web_domain SET ssl_action = '' WHERE domain = '".$data["new"]["domain"]."'"); + $app->log("Deleting SSL Cert for: $domain",LOGLEVEL_DEBUG); + } + + + } + + + function insert($event_name,$data) { + global $app, $conf; + + $this->action = 'insert'; + // just run the update function + $this->update($event_name,$data); + + + } + + + function update($event_name,$data) { + global $app, $conf; + + if($this->action != 'insert') $this->action = 'update'; + + if($data["new"]["type"] != "vhost" && $data["new"]["parent_domain_id"] > 0) { + + $old_parent_domain_id = intval($data["old"]["parent_domain_id"]); + $new_parent_domain_id = intval($data["new"]["parent_domain_id"]); + + // If the parent_domain_id has been chenged, we will have to update the old site as well. + if($this->action == 'update' && $data["new"]["parent_domain_id"] != $data["old"]["parent_domain_id"]) { + $tmp = $app->db->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ".$old_parent_domain_id." AND active = 'y'"); + $data["new"] = $tmp; + $data["old"] = $tmp; + $this->action = 'update'; + $this->update($event_name,$data); + } + + // This is not a vhost, so we need to update the parent record instead. + $tmp = $app->db->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ".$new_parent_domain_id." AND active = 'y'"); + $data["new"] = $tmp; + $data["old"] = $tmp; + $this->action = 'update'; + } + + // load the server configuration options + $app->uses("getconf"); + $web_config = $app->getconf->get_server_config($conf["server_id"], 'web'); + + //* Check if this is a chrooted setup + if($web_config['website_basedir'] != '' && @is_file($web_config['website_basedir'].'/etc/passwd')) { + $apache_chrooted = true; + $app->log("Info: Apache is chrooted.",LOGLEVEL_DEBUG); + } else { + $apache_chrooted = false; + } + + if($data["new"]["document_root"] == '') { + $app->log("document_root not set",LOGLEVEL_WARN); + return 0; + } + if($data["new"]["system_user"] == 'root' or $data["new"]["system_group"] == 'root') { + $app->log("Websites can not be owned by the root user or group.",LOGLEVEL_WARN); + return 0; + } + + //* If the client of the site has been changed, we have a change of the document root + if($this->action == 'update' && $data["new"]["document_root"] != $data["old"]["document_root"]) { + + //* Get the old client ID + $old_client = $app->dbmaster->queryOneRecord("SELECT client_id FROM sys_group WHERE sys_group.groupid = ".intval($data["old"]["sys_groupid"])); + $old_client_id = intval($old_client["client_id"]); + unset($old_client); + + //* Remove the old symlinks + $tmp_symlinks_array = explode(':',$web_config["website_symlinks"]); + if(is_array($tmp_symlinks_array)) { + foreach($tmp_symlinks_array as $tmp_symlink) { + $tmp_symlink = str_replace("[client_id]",$old_client_id,$tmp_symlink); + $tmp_symlink = str_replace("[website_domain]",$data["old"]["domain"],$tmp_symlink); + // Remove trailing slash + if(substr($tmp_symlink, -1, 1) == '/') $tmp_symlink = substr($tmp_symlink, 0, -1); + // create the symlinks, if not exist + if(is_link($tmp_symlink)) { + exec("rm -f ".escapeshellcmd($tmp_symlink)); + $app->log("Removed Symlink: rm -f ".$tmp_symlink,LOGLEVEL_DEBUG); + } + } + } + + //* Move the site data + $tmp_docroot = explode('/',$data["new"]["document_root"]); + unset($tmp_docroot[count($tmp_docroot)-1]); + $new_dir = implode('/',$tmp_docroot); + + $tmp_docroot = explode('/',$data["old"]["document_root"]); + unset($tmp_docroot[count($tmp_docroot)-1]); + $old_dir = implode('/',$tmp_docroot); + + exec('rm -rf '.$data["new"]["document_root"]); + if(!is_dir($new_dir)) exec('mkdir -p '.$new_dir); + exec('mv '.$data["old"]["document_root"].' '.$new_dir); + $app->log("Moving site to new document root: ".'mv '.$data["old"]["document_root"].' '.$new_dir,LOGLEVEL_DEBUG); + + //* Change the owner of the website files to the new website owner + exec('chown --recursive --from='.escapeshellcmd($data["old"]["system_user"]).':'.escapeshellcmd($data['old']['system_group']).' '.escapeshellcmd($data["new"]["system_user"]).':'.escapeshellcmd($data['new']['system_group']).' '.$new_dir); + + //* Change the home directory and group of the website user + $command = 'usermod'; + $command .= ' --home '.escapeshellcmd($data["new"]["document_root"]); + $command .= ' --gid '.escapeshellcmd($data['new']['system_group']); + $command .= ' '.escapeshellcmd($data["new"]["system_user"]); + exec($command); + + if($apache_chrooted) $this->_exec("chroot ".escapeshellcmd($web_config['website_basedir'])." ".$command); + + + } + + //print_r($data); + + // Check if the directories are there and create them if nescessary. + if(!is_dir($data["new"]["document_root"]."/web")) exec("mkdir -p ".$data["new"]["document_root"]."/web"); + if(!is_dir($data["new"]["document_root"]."/web/error") and $data["new"]["errordocs"]) exec("mkdir -p ".$data["new"]["document_root"]."/web/error"); + //if(!is_dir($data["new"]["document_root"]."/log")) exec("mkdir -p ".$data["new"]["document_root"]."/log"); + if(!is_dir($data["new"]["document_root"]."/ssl")) exec("mkdir -p ".$data["new"]["document_root"]."/ssl"); + if(!is_dir($data["new"]["document_root"]."/cgi-bin")) exec("mkdir -p ".$data["new"]["document_root"]."/cgi-bin"); + if(!is_dir($data["new"]["document_root"]."/tmp")) exec("mkdir -p ".$data["new"]["document_root"]."/tmp"); + + // Remove the symlink for the site, if site is renamed + if($this->action == 'update' && $data["old"]["domain"] != '' && $data["new"]["domain"] != $data["old"]["domain"]) { + if(is_dir('/var/log/ispconfig/httpd/'.$data["old"]["domain"])) exec('rm -rf /var/log/ispconfig/httpd/'.$data["old"]["domain"]); + if(is_link($data["old"]["document_root"]."/log")) unlink($data["old"]["document_root"]."/log"); + } + + // Create the symlink for the logfiles + if(!is_dir('/var/log/ispconfig/httpd/'.$data["new"]["domain"])) exec('mkdir -p /var/log/ispconfig/httpd/'.$data["new"]["domain"]); + if(!is_link($data["new"]["document_root"]."/log")) { + exec("ln -s /var/log/ispconfig/httpd/".$data["new"]["domain"]." ".$data["new"]["document_root"]."/log"); + $app->log("Creating Symlink: ln -s /var/log/ispconfig/httpd/".$data["new"]["domain"]." ".$data["new"]["document_root"]."/log",LOGLEVEL_DEBUG); + } + /* + // Create the symlink for the logfiles + // This does not work as vlogger can not log trogh symlinks. + if($this->action == 'update' && $data["old"]["domain"] != '' && $data["new"]["domain"] != $data["old"]["domain"]) { + if(is_dir($data["old"]["document_root"]."/log")) exec('rm -rf '.$data["old"]["document_root"]."/log"); + if(is_link('/var/log/ispconfig/httpd/'.$data["old"]["domain"])) unlink('/var/log/ispconfig/httpd/'.$data["old"]["domain"]); + } + + // Create the symlink for the logfiles + if(!is_dir($data["new"]["document_root"]."/log")) exec('mkdir -p '.$data["new"]["document_root"]."/log"); + if(!is_link('/var/log/ispconfig/httpd/'.$data["new"]["domain"])) { + exec("ln -s ".$data["new"]["document_root"]."/log /var/log/ispconfig/httpd/".$data["new"]["domain"]); + $app->log("Creating Symlink: ln -s ".$data["new"]["document_root"]."/log /var/log/ispconfig/httpd/".$data["new"]["domain"],LOGLEVEL_DEBUG); + } + */ + + // Get the client ID + $client = $app->dbmaster->queryOneRecord("SELECT client_id FROM sys_group WHERE sys_group.groupid = ".intval($data["new"]["sys_groupid"])); + $client_id = intval($client["client_id"]); + unset($client); + + // Remove old symlinks, if site is renamed + if($this->action == 'update' && $data["old"]["domain"] != '' && $data["new"]["domain"] != $data["old"]["domain"]) { + $tmp_symlinks_array = explode(':',$web_config["website_symlinks"]); + if(is_array($tmp_symlinks_array)) { + foreach($tmp_symlinks_array as $tmp_symlink) { + $tmp_symlink = str_replace("[client_id]",$client_id,$tmp_symlink); + $tmp_symlink = str_replace("[website_domain]",$data["old"]["domain"],$tmp_symlink); + // Remove trailing slash + if(substr($tmp_symlink, -1, 1) == '/') $tmp_symlink = substr($tmp_symlink, 0, -1); + // remove the symlinks, if not exist + if(is_link($tmp_symlink)) { + exec("rm -f ".escapeshellcmd($tmp_symlink)); + $app->log("Removed Symlink: rm -f ".$tmp_symlink,LOGLEVEL_DEBUG); + } + } + } + } + + // Create the symlinks for the sites + $tmp_symlinks_array = explode(':',$web_config["website_symlinks"]); + if(is_array($tmp_symlinks_array)) { + foreach($tmp_symlinks_array as $tmp_symlink) { + $tmp_symlink = str_replace("[client_id]",$client_id,$tmp_symlink); + $tmp_symlink = str_replace("[website_domain]",$data["new"]["domain"],$tmp_symlink); + // Remove trailing slash + if(substr($tmp_symlink, -1, 1) == '/') $tmp_symlink = substr($tmp_symlink, 0, -1); + //* Remove symlink if target folder has been changed. + if($data["old"]["document_root"] != '' && $data["old"]["document_root"] != $data["new"]["document_root"] && is_link($tmp_symlink)) { + unlink($tmp_symlink); + } + // create the symlinks, if not exist + if(!is_link($tmp_symlink)) { + exec("ln -s ".escapeshellcmd($data["new"]["document_root"])."/ ".escapeshellcmd($tmp_symlink)); + $app->log("Creating Symlink: ln -s ".$data["new"]["document_root"]."/ ".$tmp_symlink,LOGLEVEL_DEBUG); + } + } + } + + + if($this->action == 'insert' && $data["new"]["type"] == 'vhost') { + // Copy the error pages + if($data["new"]["errordocs"]){ + $error_page_path = escapeshellcmd($data["new"]["document_root"])."/web/error/"; + if (file_exists("/usr/local/ispconfig/server/conf-custom/error/".substr(escapeshellcmd($conf["language"]),0,2))){ + exec("cp /usr/local/ispconfig/server/conf-custom/error/".substr(escapeshellcmd($conf["language"]),0,2)."/* ".$error_page_path); + } + else { + if (file_exists("/usr/local/ispconfig/server/conf-custom/error/400.html")){ + exec("cp /usr/local/ispconfig/server/conf-custom/error/*.html ".$error_page_path); + } + else { + exec("cp /usr/local/ispconfig/server/conf/error/".substr(escapeshellcmd($conf["language"]),0,2)."/* ".$error_page_path); + } + } + exec("chmod -R a+r ".$error_page_path); + } + + // copy the standard index page + if (file_exists("/usr/local/ispconfig/server/conf-custom/index/standard_index.html_".substr(escapeshellcmd($conf["language"]),0,2))){ + exec("cp /usr/local/ispconfig/server/conf-custom/index/standard_index.html_".substr(escapeshellcmd($conf["language"]),0,2)." ".escapeshellcmd($data["new"]["document_root"])."/web/index.html"); + } + else { + if (file_exists("/usr/local/ispconfig/server/conf-custom/index/standard_index.html")){ + exec("cp /usr/local/ispconfig/server/conf-custom/index/standard_index.html ".escapeshellcmd($data["new"]["document_root"])."/web/index.html"); + } + else { + exec("cp /usr/local/ispconfig/server/conf/index/standard_index.html_".substr(escapeshellcmd($conf["language"]),0,2)." ".escapeshellcmd($data["new"]["document_root"])."/web/index.html"); + exec("cp /usr/local/ispconfig/server/conf/index/favicon.ico ".escapeshellcmd($data["new"]["document_root"])."/web/"); + exec("cp /usr/local/ispconfig/server/conf/index/robots.txt ".escapeshellcmd($data["new"]["document_root"])."/web/"); + exec("cp /usr/local/ispconfig/server/conf/index/.htaccess ".escapeshellcmd($data["new"]["document_root"])."/web/"); + } + } + exec("chmod -R a+r ".escapeshellcmd($data["new"]["document_root"])."/web/"); + + //** Copy the error documents on update when the error document checkbox has been activated and was deactivated before + } elseif ($this->action == 'update' && $data["new"]["type"] == 'vhost' && $data["old"]["errordocs"] == 0 && $data["new"]["errordocs"] == 1) { + + $error_page_path = escapeshellcmd($data["new"]["document_root"])."/web/error/"; + if (file_exists("/usr/local/ispconfig/server/conf-custom/error/".substr(escapeshellcmd($conf["language"]),0,2))){ + exec("cp /usr/local/ispconfig/server/conf-custom/error/".substr(escapeshellcmd($conf["language"]),0,2)."/* ".$error_page_path); + } + else { + if (file_exists("/usr/local/ispconfig/server/conf-custom/error/400.html")){ + exec("cp /usr/local/ispconfig/server/conf-custom/error/*.html ".$error_page_path); + } + else { + exec("cp /usr/local/ispconfig/server/conf/error/".substr(escapeshellcmd($conf["language"]),0,2)."/* ".$error_page_path); + } + } + exec("chmod -R a+r ".$error_page_path); + } // end copy error docs + + // Create group and user, if not exist + $app->uses("system"); + + $groupname = escapeshellcmd($data["new"]["system_group"]); + if($data["new"]["system_group"] != '' && !$app->system->is_group($data["new"]["system_group"])) { + exec("groupadd $groupname"); + if($apache_chrooted) $this->_exec("chroot ".escapeshellcmd($web_config['website_basedir'])." groupadd $groupname"); + $app->log("Adding the group: $groupname",LOGLEVEL_DEBUG); + } + + $username = escapeshellcmd($data["new"]["system_user"]); + if($data["new"]["system_user"] != '' && !$app->system->is_user($data["new"]["system_user"])) { + exec("useradd -d ".escapeshellcmd($data["new"]["document_root"])." -g $groupname -G sshusers $username -s /bin/false"); + if($apache_chrooted) $this->_exec("chroot ".escapeshellcmd($web_config['website_basedir'])." "."useradd -d ".escapeshellcmd($data["new"]["document_root"])." -g $groupname -G sshusers $username -s /bin/false"); + $app->log("Adding the user: $username",LOGLEVEL_DEBUG); + } + + // Set the quota for the user + if($username != '' && $app->system->is_user($username)) { + if($data["new"]["hd_quota"] > 0){ + $blocks_soft = $data["new"]["hd_quota"] * 1024; + $blocks_hard = $blocks_soft + 1024; + } else { + $blocks_soft = $blocks_hard = 0; + } + exec("setquota -u $username $blocks_soft $blocks_hard 0 0 -a &> /dev/null"); + exec("setquota -T -u $username 604800 604800 -a &> /dev/null"); + } + + if($this->action == 'insert') { + // Chown and chmod the directories below the document root + $this->_exec("chown -R $username:$groupname ".escapeshellcmd($data["new"]["document_root"])); + // The document root itself has to be owned by root in normal level and by the web owner in security level 20 + if($web_config['security_level'] == 20) { + $this->_exec("chown $username:$groupname ".escapeshellcmd($data["new"]["document_root"])); + } else { + $this->_exec("chown root:root ".escapeshellcmd($data["new"]["document_root"])); + } + } + + + + //* If the security level is set to high + if($web_config['security_level'] == 20) { + + $this->_exec("chmod 751 ".escapeshellcmd($data["new"]["document_root"]."/")); + $this->_exec("chmod 751 ".escapeshellcmd($data["new"]["document_root"])."/*"); + $this->_exec("chmod 710 ".escapeshellcmd($data["new"]["document_root"]."/web")); + + // make temp direcory writable for the apache user and the website user + $this->_exec("chmod 777 ".escapeshellcmd($data["new"]["document_root"]."/tmp")); + + $command = 'usermod'; + $command .= ' --groups sshusers'; + $command .= ' '.escapeshellcmd($data["new"]["system_user"]); + $this->_exec($command); + + //* if we have a chrooted apache enviroment + if($apache_chrooted) { + $this->_exec("chroot ".escapeshellcmd($web_config['website_basedir'])." ".$command); + + //* add the apache user to the client group in the chroot enviroment + $tmp_groupfile = $app->system->server_conf["group_datei"]; + $app->system->server_conf["group_datei"] = $web_config['website_basedir'].'/etc/group'; + $app->system->add_user_to_group($groupname, escapeshellcmd($web_config['user'])); + $app->system->server_conf["group_datei"] = $tmp_groupfile; + unset($tmp_groupfile); + } + + //* add the apache user to the client group + $app->system->add_user_to_group($groupname, escapeshellcmd($web_config['user'])); + + $this->_exec("chown $username:$groupname ".escapeshellcmd($data["new"]["document_root"])); + + /* + * Workaround for jailkit: If jailkit is enabled for the site, the + * website root has to be owned by the root user and we have to chmod it to 755 then + */ + + //* Check if there is a jailkit user for this site + $tmp = $app->db->queryOneRecord("SELECT count(shell_user_id) as number FROM shell_user WHERE parent_domain_id = ".$data["new"]["domain_id"]." AND chroot = 'jailkit'"); + if($tmp['number'] > 0) { + $this->_exec("chmod 755 ".escapeshellcmd($data["new"]["document_root"]."/")); + $this->_exec("chown root:root ".escapeshellcmd($data["new"]["document_root"]."/")); + } + unset($tmp); + + // If the security Level is set to medium + } else { + + $this->_exec("chmod 755 ".escapeshellcmd($data["new"]["document_root"]."/")); + $this->_exec("chmod 755 ".escapeshellcmd($data["new"]["document_root"]."/*")); + $this->_exec("chown root:root ".escapeshellcmd($data["new"]["document_root"]."/")); + + // make temp direcory writable for the apache user and the website user + $this->_exec("chmod 777 ".escapeshellcmd($data["new"]["document_root"]."/tmp")); + } + + // Change the owner of the error log to the owner of the website + if(!@is_file($data["new"]["document_root"]."/log/error.log")) exec('touch '.escapeshellcmd($data["new"]["document_root"])."/log/error.log"); + $this->_exec("chown $username:$groupname ".escapeshellcmd($data["new"]["document_root"])."/log/error.log"); + + + // Create the vhost config file + $app->load('tpl'); + + $tpl = new tpl(); + $tpl->newTemplate("vhost.conf.master"); + + $vhost_data = $data["new"]; + $vhost_data["web_document_root"] = $data["new"]["document_root"]."/web"; + $vhost_data["web_document_root_www"] = $web_config["website_basedir"]."/".$data["new"]["domain"]."/web"; + $vhost_data["web_basedir"] = $web_config["website_basedir"]; + $vhost_data["security_level"] = $web_config["security_level"]; + $vhost_data["allow_override"] = ($data["new"]["allow_override"] == '')?'All':$data["new"]["allow_override"]; + $vhost_data["php_open_basedir"] = ($data["new"]["php_open_basedir"] == '')?$data["new"]["document_root"]:$data["new"]["php_open_basedir"]; + $vhost_data["ssl_domain"] = $data["new"]["ssl_domain"]; + + // Check if a SSL cert exists + $ssl_dir = $data["new"]["document_root"]."/ssl"; + $domain = $data["new"]["ssl_domain"]; + $key_file = $ssl_dir.'/'.$domain.".key"; + $crt_file = $ssl_dir.'/'.$domain.".crt"; + $bundle_file = $ssl_dir.'/'.$domain.".bundle"; + + if($data["new"]["ssl"] == 'y' && @is_file($crt_file) && @is_file($key_file)) { + $vhost_data["ssl_enabled"] = 1; + $app->log("Enable SSL for: $domain",LOGLEVEL_DEBUG); + } else { + $vhost_data["ssl_enabled"] = 0; + $app->log("Disable SSL for: $domain",LOGLEVEL_DEBUG); + } + + if(@is_file($bundle_file)) $vhost_data['has_bundle_cert'] = 1; + + //$vhost_data["document_root"] = $data["new"]["document_root"]."/web"; + $tpl->setVar($vhost_data); + + // Rewrite rules + $rewrite_rules = array(); + if($data["new"]["redirect_type"] != '') { + if(substr($data["new"]["redirect_path"],-1) != '/') $data["new"]["redirect_path"] .= '/'; + /* Disabled path extension + if($data["new"]["redirect_type"] == 'no' && substr($data["new"]["redirect_path"],0,4) != 'http') { + $data["new"]["redirect_path"] = $data["new"]["document_root"]."/web".realpath($data["new"]["redirect_path"]).'/'; + } + */ + + $rewrite_rules[] = array( 'rewrite_domain' => $data["new"]["domain"], + 'rewrite_type' => ($data["new"]["redirect_type"] == 'no')?'':'['.$data["new"]["redirect_type"].']', + 'rewrite_target' => $data["new"]["redirect_path"]); + + switch($data["new"]["subdomain"]) { + case 'www': + $rewrite_rules[] = array( 'rewrite_domain' => 'www.'.$data["new"]["domain"], + 'rewrite_type' => ($data["new"]["redirect_type"] == 'no')?'':'['.$data["new"]["redirect_type"].']', + 'rewrite_target' => $data["new"]["redirect_path"]); + break; + case '*': + // TODO + //$rewrite_rules[] = array( 'rewrite_domain' => '*'.$alias["domain"], + // 'rewrite_type' => $alias["redirect_type"], + // 'rewrite_target' => $alias["redirect_path"]); + break; + } + } + + // get alias domains (co-domains and subdomains) + $aliases = $app->db->queryAllRecords("SELECT * FROM web_domain WHERE parent_domain_id = ".$data["new"]["domain_id"]." AND active = 'y'"); + $server_alias = array(); + switch($data["new"]["subdomain"]) { + case 'www': + $server_alias[] .= 'www.'.$data["new"]["domain"].' '; + break; + case '*': + $server_alias[] .= '*.'.$data["new"]["domain"].' '; + break; + } + if(is_array($aliases)) { + foreach($aliases as $alias) { + switch($alias["subdomain"]) { + case 'www': + $server_alias[] .= 'www.'.$alias["domain"].' '.$alias["domain"].' '; + break; + case '*': + $server_alias[] .= '*.'.$alias["domain"].' '.$alias["domain"].' '; + break; + default: + $server_alias[] .= $alias["domain"].' '; + break; + } + $app->log("Add server alias: $alias[domain]",LOGLEVEL_DEBUG); + // Rewriting + if($alias["redirect_type"] != '') { + if(substr($data["new"]["redirect_path"],-1) != '/') $data["new"]["redirect_path"] .= '/'; + /* Disabled path extension + if($data["new"]["redirect_type"] == 'no' && substr($data["new"]["redirect_path"],0,4) != 'http') { + $data["new"]["redirect_path"] = $data["new"]["document_root"]."/web".realpath($data["new"]["redirect_path"]).'/'; + } + */ + $rewrite_rules[] = array( 'rewrite_domain' => $alias["domain"], + 'rewrite_type' => ($alias["redirect_type"] == 'no')?'':'['.$alias["redirect_type"].']', + 'rewrite_target' => $alias["redirect_path"]); + switch($alias["subdomain"]) { + case 'www': + $rewrite_rules[] = array( 'rewrite_domain' => 'www.'.$alias["domain"], + 'rewrite_type' => ($alias["redirect_type"] == 'no')?'':'['.$alias["redirect_type"].']', + 'rewrite_target' => $alias["redirect_path"]); + break; + case '*': + // TODO + //$rewrite_rules[] = array( 'rewrite_domain' => '*'.$alias["domain"], + // 'rewrite_type' => $alias["redirect_type"], + // 'rewrite_target' => $alias["redirect_path"]); + break; + } + } + } + } + + //* If we have some alias records + if(count($server_alias) > 0) { + $server_alias_str = ''; + $n = 0; + + // begin a new ServerAlias line after 30 alias domains + foreach($server_alias as $tmp_alias) { + if($n % 30 == 0) $server_alias_str .= "\n ServerAlias "; + $server_alias_str .= $tmp_alias; + } + unset($tmp_alias); + + $tpl->setVar('alias',trim($server_alias_str)); + } else { + $tpl->setVar('alias',''); + } + + if(count($rewrite_rules) > 0) { + $tpl->setVar('rewrite_enabled',1); + } else { + $tpl->setVar('rewrite_enabled',0); + } + $tpl->setLoop('redirects',$rewrite_rules); + + /** + * install fast-cgi starter script and add script aliasd config + * first we create the script directory if not already created, then copy over the starter script + * settings are copied over from the server ini config for now + * TODO: Create form for fastcgi configs per site. + */ + + if ($data["new"]["php"] == "fast-cgi") + { + $fastcgi_config = $app->getconf->get_server_config($conf["server_id"], 'fastcgi'); + + $fastcgi_starter_path = str_replace("[system_user]",$data["new"]["system_user"],$fastcgi_config["fastcgi_starter_path"]); + $fastcgi_starter_path = str_replace("[client_id]",$client_id,$fastcgi_starter_path); + + if (!is_dir($fastcgi_starter_path)) + { + exec("mkdir -p ".escapeshellcmd($fastcgi_starter_path)); + //exec("chown ".$data["new"]["system_user"].":".$data["new"]["system_group"]." ".escapeshellcmd($fastcgi_starter_path)); + + + $app->log("Creating fastcgi starter script directory: $fastcgi_starter_path",LOGLEVEL_DEBUG); + } + + exec("chown -R ".$data["new"]["system_user"].":".$data["new"]["system_group"]." ".escapeshellcmd($fastcgi_starter_path)); + + $fcgi_tpl = new tpl(); + $fcgi_tpl->newTemplate("php-fcgi-starter.master"); + + $fcgi_tpl->setVar('php_ini_path',escapeshellcmd($fastcgi_config["fastcgi_phpini_path"])); + $fcgi_tpl->setVar('document_root',escapeshellcmd($data["new"]["document_root"])); + $fcgi_tpl->setVar('php_fcgi_children',escapeshellcmd($fastcgi_config["fastcgi_children"])); + $fcgi_tpl->setVar('php_fcgi_max_requests',escapeshellcmd($fastcgi_config["fastcgi_max_requests"])); + $fcgi_tpl->setVar('php_fcgi_bin',escapeshellcmd($fastcgi_config["fastcgi_bin"])); + $fcgi_tpl->setVar('security_level',intval($web_config["security_level"])); + + $php_open_basedir = ($data["new"]["php_open_basedir"] == '')?$data["new"]["document_root"]:$data["new"]["php_open_basedir"]; + $fcgi_tpl->setVar('open_basedir', escapeshellcmd($php_open_basedir)); + + $fcgi_starter_script = escapeshellcmd($fastcgi_starter_path.$fastcgi_config["fastcgi_starter_script"]); + file_put_contents($fcgi_starter_script,$fcgi_tpl->grab()); + unset($fcgi_tpl); + + $app->log("Creating fastcgi starter script: $fcgi_starter_script",LOGLEVEL_DEBUG); + + + exec("chmod 755 $fcgi_starter_script"); + exec("chown ".$data["new"]["system_user"].":".$data["new"]["system_group"]." $fcgi_starter_script"); + + $tpl->setVar('fastcgi_alias',$fastcgi_config["fastcgi_alias"]); + $tpl->setVar('fastcgi_starter_path',$fastcgi_starter_path); + $tpl->setVar('fastcgi_starter_script',$fastcgi_config["fastcgi_starter_script"]); + + } + + /** + * install cgi starter script and add script alias to config. + * This is needed to allow cgi with suexec (to do so, we need a bin in the document-path!) + * first we create the script directory if not already created, then copy over the starter script. + * TODO: we have to fetch the data from the server-settings. + */ + + if ($data["new"]["php"] == "cgi") + { + //$cgi_config = $app->getconf->get_server_config($conf["server_id"], 'cgi'); + + $cgi_config["cgi_starter_path"] = $web_config["website_basedir"]."/php-cgi-scripts/[system_user]/"; + $cgi_config["cgi_starter_script"] = "php-cgi-starter"; + $cgi_config["cgi_bin"] = "/usr/bin/php-cgi"; + + $cgi_starter_path = str_replace("[system_user]",$data["new"]["system_user"],$cgi_config["cgi_starter_path"]); + $cgi_starter_path = str_replace("[client_id]",$client_id,$cgi_starter_path); + + if (!is_dir($cgi_starter_path)) + { + exec("mkdir -p ".escapeshellcmd($cgi_starter_path)); + exec("chown ".$data["new"]["system_user"].":".$data["new"]["system_group"]." ".escapeshellcmd($cgi_starter_path)); + + $app->log("Creating cgi starter script directory: $cgi_starter_path",LOGLEVEL_DEBUG); + } + + $cgi_tpl = new tpl(); + $cgi_tpl->newTemplate("php-cgi-starter.master"); + + // This works, because php "rewrites" a symlink to the physical path + $php_open_basedir = ($data["new"]["php_open_basedir"] == '')?$data["new"]["document_root"]:$data["new"]["php_open_basedir"]; + $cgi_tpl->setVar('open_basedir', escapeshellcmd($php_open_basedir)); + $cgi_tpl->setVar('document_root', escapeshellcmd($data["new"]["document_root"])); + + // This will NOT work! + //$cgi_tpl->setVar('open_basedir', "/var/www/" . $data["new"]["domain"]); + $cgi_tpl->setVar('php_cgi_bin',$cgi_config["cgi_bin"]); + $cgi_tpl->setVar('security_level',$web_config["security_level"]); + + $cgi_starter_script = escapeshellcmd($cgi_starter_path.$cgi_config["cgi_starter_script"]); + file_put_contents($cgi_starter_script,$cgi_tpl->grab()); + unset($cgi_tpl); + + $app->log("Creating cgi starter script: $cgi_starter_script",LOGLEVEL_DEBUG); + + + exec("chmod 755 $cgi_starter_script"); + exec("chown ".$data["new"]["system_user"].":".$data["new"]["system_group"]." $cgi_starter_script"); + + $tpl->setVar('cgi_starter_path',$cgi_starter_path); + $tpl->setVar('cgi_starter_script',$cgi_config["cgi_starter_script"]); + + } + + $vhost_file = escapeshellcmd($web_config["vhost_conf_dir"].'/'.$data["new"]["domain"].'.vhost'); + file_put_contents($vhost_file,$tpl->grab()); + $app->log("Writing the vhost file: $vhost_file",LOGLEVEL_DEBUG); + unset($tpl); + + // Set the symlink to enable the vhost + $vhost_symlink = escapeshellcmd($web_config["vhost_conf_enabled_dir"].'/'.$data["new"]["domain"].'.vhost'); + if($data["new"]["active"] == 'y' && !is_link($vhost_symlink)) { + symlink($vhost_file,$vhost_symlink); + $app->log("Creating the symlink: $vhost_symlink => $vhost_file",LOGLEVEL_DEBUG); + } + + // Remove the symlink, if site is inactive + if($data["new"]["active"] == 'n' && is_link($vhost_symlink)) { + unlink($vhost_symlink); + $app->log("Removing symlink: $vhost_symlink => $vhost_file",LOGLEVEL_DEBUG); + } + + // remove old symlink and vhost file, if domain name of the site has changed + if($this->action == 'update' && $data["old"]["domain"] != '' && $data["new"]["domain"] != $data["old"]["domain"]) { + $vhost_symlink = escapeshellcmd($web_config["vhost_conf_enabled_dir"].'/'.$data["old"]["domain"].'.vhost'); + unlink($vhost_symlink); + $app->log("Removing symlink: $vhost_symlink => $vhost_file",LOGLEVEL_DEBUG); + $vhost_file = escapeshellcmd($web_config["vhost_conf_dir"].'/'.$data["old"]["domain"].'.vhost'); + unlink($vhost_file); + $app->log("Removing File $vhost_file",LOGLEVEL_DEBUG); + } + + //* Create .htaccess and .htpasswd file for website statistics + if(!is_file($data["new"]["document_root"].'/web/stats/.htaccess') or $data["old"]["document_root"] != $data["new"]["document_root"]) { + if(!is_dir($data["new"]["document_root"].'/web/stats')) mkdir($data["new"]["document_root"].'/web/stats'); + $ht_file = "AuthType Basic\nAuthName \"Members Only\"\nAuthUserFile ".$data["new"]["document_root"]."/.htpasswd_stats\nrequire valid-user"; + file_put_contents($data["new"]["document_root"].'/web/stats/.htaccess',$ht_file); + chmod($data["new"]["document_root"].'/web/stats/.htaccess',0755); + unset($ht_file); + } + + if(!is_file($data["new"]["document_root"].'/.htpasswd_stats') || $data["new"]["stats_password"] != $data["old"]["stats_password"]) { + if(trim($data["new"]["stats_password"]) != '') { + $htp_file = 'admin:'.trim($data["new"]["stats_password"]); + file_put_contents($data["new"]["document_root"].'/.htpasswd_stats',$htp_file); + chmod($data["new"]["document_root"].'/.htpasswd_stats',0755); + unset($htp_file); + } + } + + + if($apache_chrooted) { + $app->services->restartServiceDelayed('httpd','restart'); + } else { + // request a httpd reload when all records have been processed + $app->services->restartServiceDelayed('httpd','reload'); + } + + //* Unset action to clean it for next processed vhost. + $this->action = ''; + + } + + function delete($event_name,$data) { + global $app, $conf; + + // load the server configuration options + $app->uses("getconf"); + $web_config = $app->getconf->get_server_config($conf["server_id"], 'web'); + + //* Check if this is a chrooted setup + if($web_config['website_basedir'] != '' && @is_file($web_config['/var/www'].'/etc/passwd')) { + $apache_chrooted = true; + } else { + $apache_chrooted = false; + } + + if($data["old"]["type"] != "vhost" && $data["old"]["parent_domain_id"] > 0) { + //* This is a alias domain or subdomain, so we have to update the website instead + $parent_domain_id = intval($data["old"]["parent_domain_id"]); + $tmp = $app->db->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ".$parent_domain_id." AND active = 'y'"); + $data["new"] = $tmp; + $data["old"] = $tmp; + $this->action = 'update'; + // just run the update function + $this->update($event_name,$data); + + } else { + //* This is a website + // Deleting the vhost file, symlink and the data directory + $vhost_symlink = escapeshellcmd($web_config["vhost_conf_enabled_dir"].'/'.$data["old"]["domain"].'.vhost'); + unlink($vhost_symlink); + $app->log("Removing symlink: $vhost_symlink => $vhost_file",LOGLEVEL_DEBUG); + + $vhost_file = escapeshellcmd($web_config["vhost_conf_dir"].'/'.$data["old"]["domain"].'.vhost'); + unlink($vhost_file); + $app->log("Removing vhost file: $vhost_file",LOGLEVEL_DEBUG); + + $docroot = escapeshellcmd($data["old"]["document_root"]); + if($docroot != '' && !stristr($docroot,'..')) exec("rm -rf $docroot"); + + + //remove the php fastgi starter script if available + if ($data["old"]["php"] == "fast-cgi") + { + $fastcgi_starter_path = str_replace("[system_user]",$data["old"]["system_user"],$web_config["fastcgi_starter_path"]); + if (is_dir($fastcgi_starter_path)) + { + exec("rm -rf $fastcgi_starter_path"); + } + } + + //remove the php cgi starter script if available + if ($data["old"]["php"] == "cgi") + { + // TODO: fetch the date from the server-settings + $web_config["cgi_starter_path"] = $web_config["website_basedir"]."/php-cgi-scripts/[system_user]/"; + + $cgi_starter_path = str_replace("[system_user]",$data["old"]["system_user"],$web_config["cgi_starter_path"]); + if (is_dir($cgi_starter_path)) + { + exec("rm -rf $cgi_starter_path"); + } + } + + $app->log("Removing website: $docroot",LOGLEVEL_DEBUG); + + // Delete the symlinks for the sites + $client = $app->db->queryOneRecord("SELECT client_id FROM sys_group WHERE sys_group.groupid = ".intval($data["old"]["sys_groupid"])); + $client_id = intval($client["client_id"]); + unset($client); + $tmp_symlinks_array = explode(':',$web_config["website_symlinks"]); + if(is_array($tmp_symlinks_array)) { + foreach($tmp_symlinks_array as $tmp_symlink) { + $tmp_symlink = str_replace("[client_id]",$client_id,$tmp_symlink); + $tmp_symlink = str_replace("[website_domain]",$data["old"]["domain"],$tmp_symlink); + // Remove trailing slash + if(substr($tmp_symlink, -1, 1) == '/') $tmp_symlink = substr($tmp_symlink, 0, -1); + // create the symlinks, if not exist + if(is_link($tmp_symlink)) { + unlink($tmp_symlink); + $app->log("Removing symlink: ".$tmp_symlink,LOGLEVEL_DEBUG); + } + } + } + // end removing symlinks + + // Delete the log file directory + $vhost_logfile_dir = escapeshellcmd('/var/log/ispconfig/httpd/'.$data["old"]["domain"]); + if($data["old"]["domain"] != '' && !stristr($vhost_logfile_dir,'..')) exec("rm -rf $vhost_logfile_dir"); + $app->log("Removing website logfile directory: $vhost_logfile_dir",LOGLEVEL_DEBUG); + + //delete the web user + $command = 'userdel'; + $command .= ' '.$data["old"]["system_user"]; + exec($command); + if($apache_chrooted) $this->_exec("chroot ".escapeshellcmd($web_config['website_basedir'])." ".$command); + + } + } + + //* This function is called when a IP on the server is inserted, updated or deleted + function server_ip($event_name,$data) { + global $app, $conf; + + // load the server configuration options + $app->uses("getconf"); + $web_config = $app->getconf->get_server_config($conf["server_id"], 'web'); + + $app->load('tpl'); + + $tpl = new tpl(); + $tpl->newTemplate("apache_ispconfig.conf.master"); + $records = $app->db->queryAllRecords("SELECT * FROM server_ip WHERE server_id = ".$conf["server_id"]." AND virtualhost = 'y'"); + + if(count($records) > 0) { + $tpl->setLoop('ip_adresses',$records); + } + + $vhost_file = escapeshellcmd($web_config["vhost_conf_dir"].'/ispconfig.conf'); + file_put_contents($vhost_file,$tpl->grab()); + $app->log("Writing the conf file: ispconfig.conf",LOGLEVEL_DEBUG); + unset($tpl); + + } + + //* Wrapper for exec function for easier debugging + private function _exec($command) { + global $app; + $app->log("exec: ".$command,LOGLEVEL_DEBUG); + exec($command); + } + + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/plugins-enabled/apps_vhost_plugin.inc.php b/interface/ispconfig/server/plugins-enabled/apps_vhost_plugin.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..e864dbd99474c2d2b6456ca314bbb2d76c646ffc --- /dev/null +++ b/interface/ispconfig/server/plugins-enabled/apps_vhost_plugin.inc.php @@ -0,0 +1,114 @@ +plugins->registerEvent('server_insert','apps_vhost_plugin','insert'); + $app->plugins->registerEvent('server_update','apps_vhost_plugin','update'); + + + } + + function insert($event_name,$data) { + global $app, $conf; + + $this->update($event_name,$data); + + } + + // The purpose of this plugin is to rewrite the main.cf file + function update($event_name,$data) { + global $app, $conf; + + // get the config + $app->uses("getconf"); + $web_config = $app->getconf->get_server_config($conf["server_id"], 'web'); + + // Dont just copy over the virtualhost template but add some custom settings + $content = file_get_contents($conf["rootpath"]."/conf/apache_apps.vhost.master"); + + $vhost_conf_dir = $web_config['vhost_conf_dir']; + $vhost_conf_enabled_dir = $web_config['vhost_conf_enabled_dir']; + $apps_vhost_servername = ($web_config['apps_vhost_servername'] == '')?'':'ServerName '.$web_config['apps_vhost_servername']; + + $web_config['apps_vhost_port'] = (empty($web_config['apps_vhost_port']))?8081:$web_config['apps_vhost_port']; + $web_config['apps_vhost_ip'] = (empty($web_config['apps_vhost_ip']))?'_default_':$web_config['apps_vhost_ip']; + + $content = str_replace('{apps_vhost_ip}', $web_config['apps_vhost_ip'], $content); + $content = str_replace('{apps_vhost_port}', $web_config['apps_vhost_port'], $content); + $content = str_replace('{apps_vhost_dir}', $web_config['website_basedir'].'/apps', $content); + $content = str_replace('{apps_vhost_servername}', $apps_vhost_servername, $content); + $content = str_replace('{apps_vhost_basedir}', $web_config['website_basedir'], $content); + + + // comment out the listen directive if port is 80 or 443 + if($web_config['apps_vhost_ip'] == 80 or $web_config['apps_vhost_ip'] == 443) { + $content = str_replace('{vhost_port_listen}', '#', $content); + } else { + $content = str_replace('{vhost_port_listen}', '', $content); + } + + file_put_contents("$vhost_conf_dir/apps.vhost", $content); + + $app->services->restartServiceDelayed('httpd','restart'); + + + } + + +} // end class + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/plugins-enabled/cron_jailkit_plugin.inc.php b/interface/ispconfig/server/plugins-enabled/cron_jailkit_plugin.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..43adee1c52679c79ab3e9d78bf36cac46251594d --- /dev/null +++ b/interface/ispconfig/server/plugins-enabled/cron_jailkit_plugin.inc.php @@ -0,0 +1,328 @@ +plugins->registerEvent('cron_insert', $this->plugin_name, 'insert'); + $app->plugins->registerEvent('cron_update', $this->plugin_name, 'update'); + $app->plugins->registerEvent('cron_delete', $this->plugin_name, 'delete'); + + } + + //* This function is called, when a cron job is inserted in the database + function insert($event_name,$data) { + global $app, $conf; + + if($data["new"]["parent_domain_id"] == '') { + $app->log("Parent domain not set",LOGLEVEL_WARN); + return 0; + } + + //* get data from web + $parent_domain = $app->db->queryOneRecord("SELECT `domain_id`, `system_user`, `system_group`, `document_root`, `domain` FROM `web_domain` WHERE `domain_id` = ".intval($data["new"]["parent_domain_id"])); + if(!$parent_domain["domain_id"]) { + $app->log("Parent domain not found",LOGLEVEL_WARN); + return 0; + } elseif($parent_domain["system_user"] == 'root' or $parent_domain["system_group"] == 'root') { + $app->log("Websites (and Crons) can not be owned by the root user or group.",LOGLEVEL_WARN); + return 0; + } + + $this->parent_domain = $parent_domain; + + $app->uses('system'); + + if($app->system->is_user($parent_domain['system_user'])) { + + /** + * Setup Jailkit Chroot System If Enabled + */ + if ($data['new']['type'] == "chrooted") + { + // load the server configuration options + /* + $app->uses("getconf"); + $this->data = $data; + $this->app = $app; + $this->jailkit_config = $app->getconf->get_server_config($conf["server_id"], 'jailkit'); + $this->parent_domain = $parent_domain; + + $this->_setup_jailkit_chroot(); + + //$command .= 'usermod -U '.escapeshellcmd($parent_domain['system_user']); + //exec($command); + + $this->_add_jailkit_user(); + */ + $app->uses("getconf"); + $this->data = $data; + $this->app = $app; + $this->jailkit_config = $app->getconf->get_server_config($conf["server_id"], 'jailkit'); + + $this->_update_website_security_level(); + + $this->_setup_jailkit_chroot(); + + $this->_add_jailkit_user(); + + $command .= 'usermod -U '.escapeshellcmd($parent_domain["system_user"]); + exec($command); + + $this->_update_website_security_level(); + } + + $app->log("Jailkit Plugin (Cron) -> insert username:".$parent_domain['system_user'],LOGLEVEL_DEBUG); + + } else { + $app->log("Jailkit Plugin (Cron) -> insert username:".$parent_domain['system_user']." skipped, the user does not exist.",LOGLEVEL_WARN); + } + + } + + //* This function is called, when a cron job is updated in the database + function update($event_name,$data) { + global $app, $conf; + + if($data["new"]["parent_domain_id"] == '') { + $app->log("Parent domain not set",LOGLEVEL_WARN); + return 0; + } + //* get data from web + $parent_domain = $app->db->queryOneRecord("SELECT `domain_id`, `system_user`, `system_group`, `document_root`, `domain` FROM `web_domain` WHERE `domain_id` = ".intval($data["new"]["parent_domain_id"])); + if(!$parent_domain["domain_id"]) { + $app->log("Parent domain not found",LOGLEVEL_WARN); + return 0; + } elseif($parent_domain["system_user"] == 'root' or $parent_domain["system_group"] == 'root') { + $app->log("Websites (and Crons) can not be owned by the root user or group.",LOGLEVEL_WARN); + return 0; + } + + $app->uses('system'); + + $this->parent_domain = $parent_domain; + + if($app->system->is_user($parent_domain['system_user'])) { + + /** + * Setup Jailkit Chroot System If Enabled + */ + if ($data['new']['type'] == "chrooted") + { + $app->log("Jailkit Plugin (Cron) -> setting up jail", LOGLEVEL_DEBUG); + // load the server configuration options + /* + $app->uses("getconf"); + $this->data = $data; + $this->app = $app; + $this->jailkit_config = $app->getconf->get_server_config($conf["server_id"], 'jailkit'); + $this->parent_domain = $parent_domain; + + $this->_setup_jailkit_chroot(); + $this->_add_jailkit_user(); + */ + $app->uses("getconf"); + $this->data = $data; + $this->app = $app; + $this->jailkit_config = $app->getconf->get_server_config($conf["server_id"], 'jailkit'); + + $this->_update_website_security_level(); + + $this->_setup_jailkit_chroot(); + $this->_add_jailkit_user(); + + $this->_update_website_security_level(); + } + + $app->log("Jailkit Plugin (Cron) -> update username:".$parent_domain['system_user'],LOGLEVEL_DEBUG); + + } else { + $app->log("Jailkit Plugin (Cron) -> update username:".$parent_domain['system_user']." skipped, the user does not exist.",LOGLEVEL_WARN); + } + + } + + //* This function is called, when a cron job is deleted in the database + function delete($event_name,$data) { + global $app, $conf; + + //* nothing to do here! + + } + + function _setup_jailkit_chroot() + { + //check if the chroot environment is created yet if not create it with a list of program sections from the config + if (!is_dir($this->parent_domain['document_root'].'/etc/jailkit')) + { + $command = '/usr/local/ispconfig/server/scripts/create_jailkit_chroot.sh'; + $command .= ' '.escapeshellcmd($this->parent_domain['document_root']); + $command .= ' \''.$this->jailkit_config['jailkit_chroot_app_sections'].'\''; + exec($command); + + $this->app->log("Added jailkit chroot with command: ".$command,LOGLEVEL_DEBUG); + + //$this->_add_jailkit_programs(); // done later on + + $this->app->load('tpl'); + + $tpl = new tpl(); + $tpl->newTemplate("bash.bashrc.master"); + + $tpl->setVar('jailkit_chroot',true); + $tpl->setVar('domain',$this->parent_domain['domain']); + $tpl->setVar('home_dir',$this->_get_home_dir("")); + + $bashrc = escapeshellcmd($this->parent_domain['document_root']).'/etc/bash.bashrc'; + if(@is_file($bashrc)) exec('rm '.$bashrc); + + file_put_contents($bashrc,$tpl->grab()); + unset($tpl); + + $this->app->log("Added bashrc scrpt : ".$bashrc,LOGLEVEL_DEBUG); + + $tpl = new tpl(); + $tpl->newTemplate("motd.master"); + + $tpl->setVar('domain',$this->parent_domain['domain']); + + $motd = escapeshellcmd($this->parent_domain['document_root']).'/var/run/motd'; + if(@is_file($motd)) exec('rm '.$motd); + + file_put_contents($motd,$tpl->grab()); + + } + $this->_add_jailkit_programs(); + } + + function _add_jailkit_programs() + { + //copy over further programs and its libraries + $command = '/usr/local/ispconfig/server/scripts/create_jailkit_programs.sh'; + $command .= ' '.escapeshellcmd($this->parent_domain['document_root']); + $command .= ' \''.$this->jailkit_config['jailkit_chroot_app_programs'].'\''; + exec($command); + + $this->app->log("Added programs to jailkit chroot with command: ".$command,LOGLEVEL_DEBUG); + + $command = '/usr/local/ispconfig/server/scripts/create_jailkit_programs.sh'; + $command .= ' '.escapeshellcmd($this->parent_domain['document_root']); + $command .= ' \''.$this->jailkit_config['jailkit_chroot_cron_programs'].'\''; + exec($command); + + $this->app->log("Added cron programs to jailkit chroot with command: ".$command,LOGLEVEL_DEBUG); + } + + function _add_jailkit_user() + { + //add the user to the chroot + $jailkit_chroot_userhome = $this->_get_home_dir($this->parent_domain['system_user']); + + if(!is_dir($this->parent_domain['document_root'].'/etc')) mkdir($this->parent_domain['document_root'].'/etc'); + if(!is_file($this->parent_domain['document_root'].'/etc/passwd')) exec('touch '.$this->parent_domain['document_root'].'/etc/passwd'); + + // IMPORTANT! + // ALWAYS create the user. Even if the user was created before + // if we check if the user exists, then a update (no shell -> jailkit) will not work + // and the user has FULL ACCESS to the root of the server! + $command = '/usr/local/ispconfig/server/scripts/create_jailkit_user.sh'; + $command .= ' '.escapeshellcmd($this->parent_domain['system_user']); + $command .= ' '.escapeshellcmd($this->parent_domain['document_root']); + $command .= ' '.$jailkit_chroot_userhome; + $command .= ' '.escapeshellcmd("/bin/bash"); + exec($command); + + $this->app->log("Added jailkit user to chroot with command: ".$command,LOGLEVEL_DEBUG); + + exec("mkdir -p ".escapeshellcmd($this->parent_domain['document_root'].$jailkit_chroot_userhome)); + } + + function _get_home_dir($username) + { + return str_replace("[username]",escapeshellcmd($username),$this->jailkit_config["jailkit_chroot_home"]); + } + + //* Update the website root directory permissions depending on the security level + function _update_website_security_level() { + global $app,$conf; + + // load the server configuration options + $app->uses("getconf"); + $web_config = $app->getconf->get_server_config($conf["server_id"], 'web'); + + //* If the security level is set to high + if($web_config['security_level'] == 20) { + $this->_exec("chmod 755 ".escapeshellcmd($this->parent_domain['document_root'])); + $this->_exec("chown root:root ".escapeshellcmd($this->parent_domain['document_root'])); + } + + } + + //* Wrapper for exec function for easier debugging + private function _exec($command) { + global $app; + $app->log("exec: ".$command,LOGLEVEL_DEBUG); + exec($command); + } + + + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/plugins-enabled/cron_plugin.inc.php b/interface/ispconfig/server/plugins-enabled/cron_plugin.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..4ee83137a333b8d5e23bb8a2aa1b561b2e217f36 --- /dev/null +++ b/interface/ispconfig/server/plugins-enabled/cron_plugin.inc.php @@ -0,0 +1,239 @@ +plugins->registerEvent('cron_insert',$this->plugin_name,'insert'); + $app->plugins->registerEvent('cron_update',$this->plugin_name,'update'); + $app->plugins->registerEvent('cron_delete',$this->plugin_name,'delete'); + + } + + function insert($event_name,$data) { + global $app, $conf; + + $this->action = 'insert'; + // just run the update function + $this->update($event_name,$data); + + } + + + function update($event_name,$data) { + global $app, $conf; + + if($this->action != 'insert') $this->action = 'update'; + + // load the server configuration options + $app->uses("getconf"); + + if($data["new"]["parent_domain_id"] == '') { + $app->log("Parent domain not set",LOGLEVEL_WARN); + return 0; + } + + //* get data from web + $parent_domain = $app->db->queryOneRecord("SELECT `domain_id`, `system_user`, `system_group`, `document_root`, `hd_quota` FROM `web_domain` WHERE `domain_id` = ".intval($data["new"]["parent_domain_id"])); + if(!$parent_domain["domain_id"]) { + $app->log("Parent domain not found",LOGLEVEL_WARN); + return 0; + } elseif($parent_domain["system_user"] == 'root' or $parent_domain["system_group"] == 'root') { + $app->log("Websites (and Crons) can not be owned by the root user or group.",LOGLEVEL_WARN); + return 0; + } + + // Get the client ID + $client = $app->dbmaster->queryOneRecord("SELECT client_id FROM sys_group WHERE sys_group.groupid = ".intval($data["new"]["sys_groupid"])); + $client_id = intval($client["client_id"]); + unset($client); + + // Create group and user, if not exist + $app->uses("system"); + + $groupname = escapeshellcmd($parent_domain["system_group"]); + if($parent_domain["system_group"] != '' && !$app->system->is_group($parent_domain["system_group"])) { + exec("groupadd $groupname"); + $app->log("Adding the group: $groupname",LOGLEVEL_DEBUG); + } + + $username = escapeshellcmd($parent_domain["system_user"]); + if($parent_domain["system_user"] != '' && !$app->system->is_user($parent_domain["system_user"])) { + exec("useradd -d ".escapeshellcmd($parent_domain["document_root"])." -g $groupname $username -s /bin/false"); + $app->log("Adding the user: $username",LOGLEVEL_DEBUG); + } + + // Set the quota for the user + if($username != '' && $app->system->is_user($username)) { + if($parent_domain["hd_quota"] > 0){ + $blocks_soft = $parent_domain["hd_quota"] * 1024; + $blocks_hard = $blocks_soft + 1024; + } else { + $blocks_soft = $blocks_hard = 0; + } + exec("setquota -u $username $blocks_soft $blocks_hard 0 0 -a &> /dev/null"); + exec("setquota -T -u $username 604800 604800 -a &> /dev/null"); + } + + // make temp direcory writable for the apache user and the website user + exec("chmod 777 ".escapeshellcmd($parent_domain["document_root"]."/tmp")); + + /** TODO READ CRON MASTER **/ + + $this->parent_domain = $parent_domain; + $this->_write_crontab(); + + $this->action = ''; + + } + + function delete($event_name,$data) { + global $app, $conf; + + //* get data from web + $parent_domain = $app->db->queryOneRecord("SELECT `domain_id`, `system_user`, `system_group`, `document_root`, `hd_quota` FROM `web_domain` WHERE `domain_id` = ".intval($data["old"]["parent_domain_id"])); + if(!$parent_domain["domain_id"]) { + $app->log("Parent domain not found",LOGLEVEL_WARN); + return 0; + } + + // Get the client ID + $client = $app->dbmaster->queryOneRecord("SELECT client_id FROM sys_group WHERE sys_group.groupid = ".intval($data["old"]["sys_groupid"])); + $client_id = intval($client["client_id"]); + unset($client); + + $this->parent_domain = $parent_domain; + $this->_write_crontab(); + } + + function _write_crontab() { + global $app, $conf; + + //* load the server configuration options + $app->uses("getconf"); + + $cron_config = $app->getconf->get_server_config($conf["server_id"], 'cron'); + + //* try to find customer's mail address + + /** TODO: add possibility for client to choose mail notification! **/ + $cron_content = "MAILTO=''\n\n"; + $chr_cron_content = "MAILTO=''\n\n"; + $chr_cron_content .= "SHELL='/usr/sbin/jk_chrootsh'\n\n"; + + $cmd_count = 0; + $chr_cmd_count = 0; + + //* read all active cron jobs from database and write them to file + $cron_jobs = $app->db->queryAllRecords("SELECT `run_min`, `run_hour`, `run_mday`, `run_month`, `run_wday`, `command`, `type` FROM `cron` WHERE `parent_domain_id` = ".intval($this->parent_domain["domain_id"]) . " AND `active` = 'y'"); + if($cron_jobs && count($cron_jobs) > 0) { + foreach($cron_jobs as $job) { + $command = "{$job['run_min']}\t{$job['run_hour']}\t{$job['run_mday']}\t{$job['run_month']}\t{$job['run_wday']}"; + $command .= "\t{$this->parent_domain['system_user']}"; //* running as user + if($job['type'] == 'url') { + $command .= "\t{$cron_config['wget']} -q -O /dev/null " . escapeshellarg($job['command']) . " >/dev/null 2>&1"; + } else { + if($job['type'] == 'chrooted') { + if(substr($job['command'], 0, strlen($this->parent_domain['document_root'])) == $this->parent_domain['document_root']) { + //* delete the unneeded path part + $job['command'] = substr($job['command'], strlen($this->parent_domain['document_root'])); + } + } + + $command .= "\t"; + if(substr($job['command'], 0, 1) != "/") $command .= $this->parent_domain['document_root'].'/'; + $command .= $job['command']; + } + + if($job['type'] == 'chrooted') { + $chr_cron_content .= $command . "\n"; + $chr_cmd_count++; + } else { + $cron_content .= $command . "\n"; + $cmd_count++; + } + } + } + + $cron_file = escapeshellcmd($cron_config["crontab_dir"].'/ispc_'.$this->parent_domain["system_user"]); + if($cmd_count > 0) { + file_put_contents($cron_file, $cron_content); + $app->log("Wrote Cron file $cron_file with content:\n$cron_content",LOGLEVEL_DEBUG); + } else { + @unlink($cron_file); + $app->log("Deleted Cron file $cron_file",LOGLEVEL_DEBUG); + } + + $cron_file = escapeshellcmd($cron_config["crontab_dir"].'/ispc_chrooted_'.$this->parent_domain["system_user"]); + if($chr_cmd_count > 0) { + file_put_contents($cron_file, $chr_cron_content); + $app->log("Wrote Cron file $cron_file with content:\n$chr_cron_content",LOGLEVEL_DEBUG); + } else { + @unlink($cron_file); + $app->log("Deleted Cron file $cron_file",LOGLEVEL_DEBUG); + } + + return 0; + } + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/plugins-enabled/firewall_plugin.inc.php b/interface/ispconfig/server/plugins-enabled/firewall_plugin.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..c3bc470cdf6d4879cee918ad48e3b05ca89f0795 --- /dev/null +++ b/interface/ispconfig/server/plugins-enabled/firewall_plugin.inc.php @@ -0,0 +1,145 @@ +plugins->registerEvent('firewall_insert',$this->plugin_name,'insert'); + $app->plugins->registerEvent('firewall_update',$this->plugin_name,'update'); + $app->plugins->registerEvent('firewall_delete',$this->plugin_name,'delete'); + + + } + + + function insert($event_name,$data) { + global $app, $conf; + + $this->update($event_name,$data); + + } + + function update($event_name,$data) { + global $app, $conf; + + $tcp_ports = ''; + $udp_ports = ''; + + $ports = explode(',',$data["new"]["tcp_port"]); + if(is_array($ports)) { + foreach($ports as $p) { + if(strstr($p,':')) { + $p_parts = explode(':',$p); + $p_clean = intval($p_parts[0]).':'.intval($p_parts[1]); + } else { + $p_clean = intval($p); + } + $tcp_ports .= $p_clean . ' '; + } + } + $tcp_ports = trim($tcp_ports); + + $ports = explode(',',$data["new"]["udp_port"]); + if(is_array($ports)) { + foreach($ports as $p) { + if(strstr($p,':')) { + $p_parts = explode(':',$p); + $p_clean = intval($p_parts[0]).':'.intval($p_parts[1]); + } else { + $p_clean = intval($p); + } + $udp_ports .= $p_clean . ' '; + } + } + $udp_ports = trim($udp_ports); + + $app->load('tpl'); + $tpl = new tpl(); + $tpl->newTemplate("bastille-firewall.cfg.master"); + + $tpl->setVar("TCP_PUBLIC_SERVICES",$tcp_ports); + $tpl->setVar("UDP_PUBLIC_SERVICES",$udp_ports); + + file_put_contents('/etc/Bastille/bastille-firewall.cfg',$tpl->grab()); + $app->log('Writing firewall configuration /etc/Bastille/bastille-firewall.cfg',LOGLEVEL_DEBUG); + unset($tpl); + + if($data["new"]["active"] == 'y') { + exec('/etc/init.d/bastille-firewall restart'); + if(@is_file('/etc/debian_version')) exec('update-rc.d bastille-firewall defaults'); + $app->log('Restarting the firewall',LOGLEVEL_DEBUG); + } else { + exec('/etc/init.d/bastille-firewall stop'); + if(@is_file('/etc/debian_version')) exec('update-rc.d -f bastille-firewall remove'); + $app->log('Stopping the firewall',LOGLEVEL_DEBUG); + } + + + } + + function delete($event_name,$data) { + global $app, $conf; + + exec('/etc/init.d/bastille-firewall stop'); + if(@is_file('/etc/debian_version')) exec('update-rc.d -f bastille-firewall remove'); + $app->log('Stopping the firewall',LOGLEVEL_DEBUG); + + } + + + + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/plugins-enabled/ftpuser_base_plugin.inc.php b/interface/ispconfig/server/plugins-enabled/ftpuser_base_plugin.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..04bb51b989a0fddf5ba137ea075ade1efd46b600 --- /dev/null +++ b/interface/ispconfig/server/plugins-enabled/ftpuser_base_plugin.inc.php @@ -0,0 +1,112 @@ +plugins->registerEvent('ftp_user_insert',$this->plugin_name,'insert'); + $app->plugins->registerEvent('ftp_user_update',$this->plugin_name,'update'); + $app->plugins->registerEvent('ftp_user_delete',$this->plugin_name,'delete'); + + + } + + + function insert($event_name,$data) { + global $app, $conf; + + if(!is_dir($data['new']['dir'])) { + $app->log("FTP User directory '".$data['new']['dir']."' does not exist. Creating it now.",LOGLEVEL_DEBUG); + + $web = $app->db->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ".intval($data['new']['parent_domain_id'])); + + exec('mkdir -p '.escapeshellcmd($data['new']['dir'])); + exec('chown '.escapeshellcmd($web["system_user"]).':'.escapeshellcmd($web['system_group']).' '.$data['new']['dir']); + + $app->log("Added ftpuser_dir: ".$data['new']['dir'],LOGLEVEL_DEBUG); + } + + } + + function update($event_name,$data) { + global $app, $conf; + + if(!is_dir($data['new']['dir'])) { + $app->log("FTP User directory '".$data['new']['dir']."' does not exist. Creating it now.",LOGLEVEL_DEBUG); + + $web = $app->db->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ".intval($data['new']['parent_domain_id'])); + + exec('mkdir -p '.escapeshellcmd($data['new']['dir'])); + exec('chown '.escapeshellcmd($web["system_user"]).':'.escapeshellcmd($web['system_group']).' '.$data['new']['dir']); + + $app->log("Added ftpuser_dir: ".$data['new']['dir'],LOGLEVEL_DEBUG); + } + } + + function delete($event_name,$data) { + global $app, $conf; + + $app->log("Ftpuser:".$data['new']['username']." deleted.",LOGLEVEL_DEBUG); + + } + + + + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/plugins-enabled/getmail_plugin.inc.php b/interface/ispconfig/server/plugins-enabled/getmail_plugin.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..032ed437d736d2db05c7d6500404b51e2abbe57e --- /dev/null +++ b/interface/ispconfig/server/plugins-enabled/getmail_plugin.inc.php @@ -0,0 +1,163 @@ +plugins->registerEvent('mail_get_insert','getmail_plugin','insert'); + $app->plugins->registerEvent('mail_get_update','getmail_plugin','update'); + $app->plugins->registerEvent('mail_get_delete','getmail_plugin','delete'); + + + + } + + function insert($event_name,$data) { + global $app, $conf; + + $this->update($event_name,$data); + + } + + function update($event_name,$data) { + global $app, $conf; + + // load the server specific configuration options for getmail + $app->uses("getconf"); + $getmail_config = $app->getconf->get_server_config($conf["server_id"], 'getmail'); + $this->getmail_config_dir = $getmail_config["getmail_config_dir"]; + + // Check if the config directory exists. + if(!is_dir($this->getmail_config_dir)) { + $app->log("Getmail config directory '".$this->getmail_config_dir."' does not exist.",LOGLEVEL_ERROR); + } else { + + // Delete the config file first, if it exists + $this->delete($event_name,$data); + + // Get the new config file path + $config_file_path = escapeshellcmd($this->getmail_config_dir.'/'.$data["new"]["source_server"].'_'.$data["new"]["source_username"].'.conf'); + if(stristr($config_file_path, "..") or stristr($config_file_path, "|") or stristr($config_file_path,";") or stristr($config_file_path,'$')) { + $app->log("Possibly faked path for getmail config file: '$config_file_path'. File is not written.",LOGLEVEL_ERROR); + return false; + } + + + if($data["new"]["active"] == 'y') { + // Open master template + $tpl = file_get_contents($conf["rootpath"].'/conf/getmail.conf.master'); + + // Shall emails be deleted after retrieval + if($data["new"]["source_delete"] == 'y') { + $tpl = str_replace('{DELETE}','1',$tpl); + } else { + $tpl = str_replace('{DELETE}','0',$tpl); + } + + // Set the data retriever + if($data["new"]["type"] == 'pop3') { + $tpl = str_replace('{TYPE}','SimplePOP3Retriever',$tpl); + } elseif ($data["new"]["type"] == 'imap') { + $tpl = str_replace('{TYPE}','SimpleIMAPRetriever',$tpl); + } elseif ($data["new"]["type"] == 'pop3ssl') { + $tpl = str_replace('{TYPE}','SimplePOP3SSLRetriever',$tpl); + } elseif ($data["new"]["type"] == 'imapssl') { + $tpl = str_replace('{TYPE}','SimpleIMAPSSLRetriever',$tpl); + } + + // Set server, username, password and destination. + $tpl = str_replace('{SERVER}',$data["new"]["source_server"],$tpl); + $tpl = str_replace('{USERNAME}',$data["new"]["source_username"],$tpl); + $tpl = str_replace('{PASSWORD}',$data["new"]["source_password"],$tpl); + $tpl = str_replace('{DESTINATION}',$data["new"]["destination"],$tpl); + + // Write the config file. + file_put_contents($config_file_path,$tpl); + $app->log("Writing Getmail config file: $config_file_path",LOGLEVEL_DEBUG); + exec("chmod 400 $config_file_path"); + exec("chown getmail $config_file_path"); + unset($tpl); + unset($config_file_path); + + } else { + // If record is set to inactive, we will delete the file + if(is_file($config_file_path)) unlink($config_file_path); + } + } + } + + function delete($event_name,$data) { + global $app, $conf; + + // load the server specific configuration options for getmail + $app->uses("getconf"); + $getmail_config = $app->getconf->get_server_config($conf["server_id"], 'getmail'); + $this->getmail_config_dir = $getmail_config["getmail_config_dir"]; + + $config_file_path = escapeshellcmd($this->getmail_config_dir.'/'.$data["old"]["source_server"].'_'.$data["old"]["source_username"].'.conf'); + if(stristr($config_file_path,"..") || stristr($config_file_path,"|") || stristr($config_file_path,";") || stristr($config_file_path,'$')) { + $app->log("Possibly faked path for getmail config file: '$config_file_path'. File is not written.",LOGLEVEL_ERROR); + return false; + } + if(is_file($config_file_path)) unlink($config_file_path); + } + + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/plugins-enabled/mail_plugin.inc.php b/interface/ispconfig/server/plugins-enabled/mail_plugin.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..bbabe660e4bac48fbb598281b288cc8b43871ac7 --- /dev/null +++ b/interface/ispconfig/server/plugins-enabled/mail_plugin.inc.php @@ -0,0 +1,311 @@ +plugins->registerEvent('mail_user_insert',$this->plugin_name,'user_insert'); + $app->plugins->registerEvent('mail_user_update',$this->plugin_name,'user_update'); + $app->plugins->registerEvent('mail_user_delete',$this->plugin_name,'user_delete'); + + //* Mail Domains + //$app->plugins->registerEvent('mail_domain_insert',$this->plugin_name,'domain_insert'); + //$app->plugins->registerEvent('mail_domain_update',$this->plugin_name,'domain_update'); + $app->plugins->registerEvent('mail_domain_delete',$this->plugin_name,'domain_delete'); + + //* Mail transports + $app->plugins->registerEvent('mail_transport_insert',$this->plugin_name,'transport_update'); + $app->plugins->registerEvent('mail_transport_update',$this->plugin_name,'transport_update'); + $app->plugins->registerEvent('mail_transport_delete',$this->plugin_name,'transport_update'); + + } + + + function user_insert($event_name,$data) { + global $app, $conf; + + //* get the config + $app->uses("getconf,system"); + $mail_config = $app->getconf->get_server_config($conf["server_id"], 'mail'); + + // convert to lower case - it could cause problems if some directory above has upper case name +// $data['new']['maildir'] = strtolower($data['new']['maildir']); + + $maildomain_path = $data['new']['maildir']; + $tmp_basepath = $data['new']['maildir']; + $tmp_basepath_parts = explode('/',$tmp_basepath); + unset($tmp_basepath_parts[count($tmp_basepath_parts)-1]); + $base_path = implode('/',$tmp_basepath_parts); + + + + //* Create the mail domain directory, if it does not exist + if(!empty($base_path) && !is_dir($base_path)) { + exec("su -c 'mkdir -p ".escapeshellcmd($base_path)."' ".$mail_config['mailuser_name']); + $app->log('Created Directory: '.$base_path,LOGLEVEL_DEBUG); + } + + // Dovecot uses a different mail layout with a separate 'Maildir' subdirectory. + if($mail_config['pop3_imap_daemon'] == 'dovecot') { + exec("su -c 'mkdir -p ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name']); + $app->log('Created Directory: '.$maildomain_path,LOGLEVEL_DEBUG); + $maildomain_path .= '/Maildir'; + } + + //* When the mail user dir exists but it is not a valid maildir, remove it + if(!empty($maildomain_path) && is_dir($maildomain_path) && !is_dir($maildomain_path.'/new') && !is_dir($maildomain_path.'/cur')) { + exec("su -c 'rm -rf ".escapeshellcmd($data['new']['maildir'])."' vmail"); + $app->log("Removed invalid maildir and rebuild it: ".escapeshellcmd($data['new']['maildir']),LOGLEVEL_WARN); + } + + //* Create the maildir, if it doesn not exist, set permissions, set quota. + if(!empty($maildomain_path) && !is_dir($maildomain_path)) { + + //exec("su -c 'maildirmake ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name']); + $app->system->maildirmake($maildomain_path,$mail_config['mailuser_name']); + + exec('chown -R '.$mail_config['mailuser_name'].':'.$mail_config['mailuser_group'].' '.escapeshellcmd($data['new']['maildir'])); + $app->log("Set ownership on ".escapeshellcmd($data['new']['maildir']),LOGLEVEL_DEBUG); + + //* This is to fix the maildrop quota not being rebuilt after the quota is changed. + if($mail_config['pop3_imap_daemon'] != 'dovecot') { + exec("su -c 'maildirmake -q ".$data['new']['quota']."S ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name']); // Avoid maildirmake quota bug, see debian bug #214911 + $app->log('Created Maildir: '."su -c 'maildirmake -q ".$data['new']['quota']."S ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name'],LOGLEVEL_DEBUG); + } + } + + if(!is_dir($data['new']['maildir'].'/.Sent')) { + //exec("su -c 'maildirmake -f Sent ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name']); + //$app->log('Created submaildir Sent: '."su -c 'maildirmake -f Sent ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name'],LOGLEVEL_DEBUG); + $app->system->maildirmake($maildomain_path,$mail_config['mailuser_name'],'Sent'); + } + if(!is_dir($data['new']['maildir'].'/.Drafts')) { + //exec("su -c 'maildirmake -f Drafts ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name']); + //$app->log('Created submaildir Drafts: '."su -c 'maildirmake -f Drafts ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name'],LOGLEVEL_DEBUG); + $app->system->maildirmake($maildomain_path,$mail_config['mailuser_name'],'Drafts'); + } + if(!is_dir($data['new']['maildir'].'/.Trash')) { + //exec("su -c 'maildirmake -f Trash ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name']); + //$app->log('Created submaildir Trash: '."su -c 'maildirmake -f Trash ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name'],LOGLEVEL_DEBUG); + $app->system->maildirmake($maildomain_path,$mail_config['mailuser_name'],'Trash'); + } + if(!is_dir($data['new']['maildir'].'/.Junk')) { + //exec("su -c 'maildirmake -f Junk ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name']); + //$app->log('Created submaildir Junk: '."su -c 'maildirmake -f Junk ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name'],LOGLEVEL_DEBUG); + $app->system->maildirmake($maildomain_path,$mail_config['mailuser_name'],'Junk'); + } + + //* Set the maildir quota + if(is_dir($data['new']['maildir'].'/new') && $mail_config['pop3_imap_daemon'] != 'dovecot') { + exec("su -c 'maildirmake -q ".$data['new']['quota']."S ".escapeshellcmd($data['new']['maildir'])."' ".$mail_config['mailuser_name']); + $app->log('Set Maildir quota: '."su -c 'maildirmake -q ".$data['new']['quota']."S ".escapeshellcmd($data['new']['maildir'])."' ".$mail_config['mailuser_name'],LOGLEVEL_DEBUG); + } + } + + function user_update($event_name,$data) { + global $app, $conf; + + // get the config + $app->uses("getconf,system"); + $mail_config = $app->getconf->get_server_config($conf["server_id"], 'mail'); + + // convert to lower case - it could cause problems if some directory above has upper case name + // $data['new']['maildir'] = strtolower($data['new']['maildir']); + + // Create the maildir, if it does not exist + /* + if(!is_dir($data['new']['maildir'])) { + exec('mkdir -p '.escapeshellcmd($data['new']['maildir'])); + exec('chown '.$mail_config['mailuser_name'].':'.$mail_config['mailuser_group'].' '.escapeshellcmd($data['new']['maildir'])); + $app->log('Created Maildir: '.$data['new']['maildir'],LOGLEVEL_DEBUG); + } + */ + + $maildomain_path = $data['new']['maildir']; + $tmp_basepath = $data['new']['maildir']; + $tmp_basepath_parts = explode('/',$tmp_basepath); + unset($tmp_basepath_parts[count($tmp_basepath_parts)-1]); + $base_path = implode('/',$tmp_basepath_parts); + + //* Create the mail domain directory, if it does not exist + if(!empty($base_path) && !is_dir($base_path)) { + exec("su -c 'mkdir -p ".escapeshellcmd($base_path)."' ".$mail_config['mailuser_name']); + $app->log('Created Directory: '.$base_path,LOGLEVEL_DEBUG); + } + + // Dovecot uses a different mail layout with a separate 'Maildir' subdirectory. + if($mail_config['pop3_imap_daemon'] == 'dovecot') { + exec("su -c 'mkdir -p ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name']); + $app->log('Created Directory: '.$base_path,LOGLEVEL_DEBUG); + $maildomain_path .= '/Maildir'; + } + + //* When the mail user dir exists but it is not a valid maildir, remove it + if(!empty($maildomain_path) && is_dir($maildomain_path) && !is_dir($maildomain_path.'/new') && !is_dir($maildomain_path.'/cur')) { + exec("su -c 'rm -rf ".escapeshellcmd($data['new']['maildir'])."' vmail"); + $app->log("Removed invalid maildir and rebuild it: ".escapeshellcmd($data['new']['maildir']),LOGLEVEL_WARN); + } + + //* Create the maildir, if it doesn not exist, set permissions, set quota. + if(!empty($maildomain_path) && !is_dir($maildomain_path.'/new')) { + //exec("su -c 'maildirmake ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name']); + //$app->log("Created Maildir "."su -c 'maildirmake ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name'],LOGLEVEL_DEBUG); + $app->system->maildirmake($maildomain_path,$mail_config['mailuser_name']); + + exec('chown -R '.$mail_config['mailuser_name'].':'.$mail_config['mailuser_group'].' '.escapeshellcmd($data['new']['maildir'])); + $app->log("Set ownership on ".escapeshellcmd($data['new']['maildir']),LOGLEVEL_DEBUG); + //* This is to fix the maildrop quota not being rebuilt after the quota is changed. + if($mail_config['pop3_imap_daemon'] != 'dovecot') { + exec("su -c 'maildirmake -q ".$data['new']['quota']."S ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name']); // Avoid maildirmake quota bug, see debian bug #214911 + $app->log('Updated Maildir quota: '."su -c 'maildirmake -q ".$data['new']['quota']."S ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name'],LOGLEVEL_DEBUG); + } + } + + if(!is_dir($data['new']['maildir'].'/.Sent')) { + //exec("su -c 'maildirmake -f Sent ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name']); + //$app->log('Created submaildir Sent: '."su -c 'maildirmake -f Sent ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name'],LOGLEVEL_DEBUG); + $app->system->maildirmake($maildomain_path,$mail_config['mailuser_name'],'Sent'); + } + if(!is_dir($data['new']['maildir'].'/.Drafts')) { + //exec("su -c 'maildirmake -f Drafts ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name']); + //$app->log('Created submaildir Drafts: '."su -c 'maildirmake -f Drafts ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name'],LOGLEVEL_DEBUG); + $app->system->maildirmake($maildomain_path,$mail_config['mailuser_name'],'Drafts'); + } + if(!is_dir($data['new']['maildir'].'/.Trash')) { + //exec("su -c 'maildirmake -f Trash ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name']); + //$app->log('Created submaildir Trash: '."su -c 'maildirmake -f Trash ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name'],LOGLEVEL_DEBUG); + $app->system->maildirmake($maildomain_path,$mail_config['mailuser_name'],'Trash'); + } + if(!is_dir($data['new']['maildir'].'/.Junk')) { + //exec("su -c 'maildirmake -f Junk ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name']); + //$app->log('Created submaildir Junk: '."su -c 'maildirmake -f Junk ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name'],LOGLEVEL_DEBUG); + $app->system->maildirmake($maildomain_path,$mail_config['mailuser_name'],'Junk'); + } + + // Move mailbox, if domain has changed and delete old mailbox + if($data['new']['maildir'] != $data['old']['maildir'] && is_dir($data['old']['maildir'])) { + if(is_dir($data['new']['maildir'])) { + exec("rm -fr ".escapeshellcmd($data['new']['maildir'])); + //rmdir($data['new']['maildir']); + } + exec('mv -f '.escapeshellcmd($data['old']['maildir']).' '.escapeshellcmd($data['new']['maildir'])); + // exec('mv -f '.escapeshellcmd($data['old']['maildir']).'/* '.escapeshellcmd($data['new']['maildir'])); + // if(is_file($data['old']['maildir'].'.ispconfig_mailsize'))exec('mv -f '.escapeshellcmd($data['old']['maildir']).'.ispconfig_mailsize '.escapeshellcmd($data['new']['maildir'])); + // rmdir($data['old']['maildir']); + $app->log('Moved Maildir from: '.$data['old']['maildir'].' to '.$data['new']['maildir'],LOGLEVEL_DEBUG); + } + //This is to fix the maildrop quota not being rebuilt after the quota is changed. + // Courier Layout + if(is_dir($data['new']['maildir'].'/new') && $mail_config['pop3_imap_daemon'] != 'dovecot') { + exec("su -c 'maildirmake -q ".$data['new']['quota']."S ".escapeshellcmd($data['new']['maildir'])."' ".$mail_config['mailuser_name']); + $app->log('Updated Maildir quota: '."su -c 'maildirmake -q ".$data['new']['quota']."S ".escapeshellcmd($data['new']['maildir'])."' ".$mail_config['mailuser_name'],LOGLEVEL_DEBUG); + } + } + + function user_delete($event_name,$data) { + global $app, $conf; + + $old_maildir_path = escapeshellcmd($data['old']['maildir']); + if(!stristr($old_maildir_path,'..') && !stristr($old_maildir_path,'*') && strlen($old_maildir_path) >= 10) { + exec('rm -rf '.escapeshellcmd($old_maildir_path)); + $app->log('Deleted the Maildir: '.$data['old']['maildir'],LOGLEVEL_DEBUG); + } else { + $app->log('Possible security violation when deleting the maildir: '.$data['old']['maildir'],LOGLEVEL_ERROR); + } + } + + function domain_delete($event_name,$data) { + global $app, $conf; + + // get the config + $app->uses("getconf"); + $mail_config = $app->getconf->get_server_config($conf["server_id"], 'mail'); + + //* Delete maildomain path + $old_maildomain_path = escapeshellcmd($mail_config['homedir_path'].'/'.$data['old']['domain']); + if(!stristr($old_maildomain_path,'//') && !stristr($old_maildomain_path,'..') && !stristr($old_maildomain_path,'*') && !stristr($old_maildomain_path,'&') && strlen($old_maildomain_path) >= 10) { + exec('rm -rf '.escapeshellcmd($old_maildomain_path)); + $app->log('Deleted the mail domain directory: '.$old_maildomain_path,LOGLEVEL_DEBUG); + } else { + $app->log('Possible security violation when deleting the mail domain directory: '.$old_maildomain_path,LOGLEVEL_ERROR); + } + + //* Delete mailfilter path + $old_maildomain_path = escapeshellcmd($mail_config['homedir_path'].'/mailfilters/'.$data['old']['domain']); + if(!stristr($old_maildomain_path,'//') && !stristr($old_maildomain_path,'..') && !stristr($old_maildomain_path,'*') && !stristr($old_maildomain_path,'&') && strlen($old_maildomain_path) >= 10) { + exec('rm -rf '.escapeshellcmd($old_maildomain_path)); + $app->log('Deleted the mail domain mailfilter directory: '.$old_maildomain_path,LOGLEVEL_DEBUG); + } else { + $app->log('Possible security violation when deleting the mail domain mailfilter directory: '.$old_maildomain_path,LOGLEVEL_ERROR); + } + } + + function transport_update($event_name,$data) { + global $app, $conf; + + exec('/etc/init.d/postfix reload &> /dev/null'); + $app->log('Postfix config reloaded ',LOGLEVEL_DEBUG); + + } + + + + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/plugins-enabled/maildeliver_plugin.inc.php b/interface/ispconfig/server/plugins-enabled/maildeliver_plugin.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..5e325dbf05f9eea9ad82c74b26d9793295ed0e3d --- /dev/null +++ b/interface/ispconfig/server/plugins-enabled/maildeliver_plugin.inc.php @@ -0,0 +1,131 @@ +plugins->registerEvent('mail_user_update','maildeliver_plugin','update'); + $app->plugins->registerEvent('mail_user_delete','maildeliver_plugin','delete'); + + } + + + function update($event_name,$data) { + global $app, $conf; + + // load the server configuration options + $app->uses("getconf"); + $mail_config = $app->getconf->get_server_config($conf["server_id"], 'mail'); + if(substr($mail_config["homedir_path"],-1) == '/') { + $mail_config["homedir_path"] = substr($mail_config["homedir_path"],0,-1); + } + + if(isset($data["new"]["email"])) { + $email_parts = explode("@",$data["new"]["email"]); + } else { + $email_parts = explode("@",$data["old"]["email"]); + } + + // Write the custom mailfilter script, if mailfilter recipe has changed + if($data["old"]["custom_mailfilter"] != $data["new"]["custom_mailfilter"] + or $data["old"]["move_junk"] != $data["new"]["move_junk"] + or $data["old"]["autoresponder_text"] != $data["new"]["autoresponder_text"] + or $data["old"]["autoresponder"] != $data["new"]["autoresponder"] + or (isset($data["new"]["email"]) and $data["old"]["email"] != $data["new"]["email"]) + or $data["old"]["autoresponder_start_date"] != $data["new"]["autoresponder_start_date"] + or $data["old"]["autoresponder_end_date"] != $data["new"]["autoresponder_end_date"]) { + + $app->log("Mailfilter config has been changed",LOGLEVEL_DEBUG); + + $sieve_file = $data["new"]["maildir"].'/.sieve'; + if(is_file($sieve_file)) unlink($sieve_file) or $app->log("Unable to delete file: $sieve_file",LOGLEVEL_WARN); + + $app->load('tpl'); + + $tpl = new tpl(); + $tpl->newTemplate("sieve_filter.master"); + + // Custom filters + $tpl->setVar('custom_mailfilter',$data["new"]["custom_mailfilter"]); + + // Move junk + $tpl->setVar('move_junk',$data["new"]["move_junk"]); + + // Autoresponder + $tpl->setVar('autoresponder',$data["new"]["autoresponder"]); + $tpl->setVar('autoresponder_text',$data["new"]["autoresponder_text"]); + + file_put_contents($sieve_file,$tpl->grab()); + + unset($tpl); + + } + } + + function delete($event_name,$data) { + global $app, $conf; + + $sieve_file = $data["old"]["maildir"].'/.sieve'; + if(is_file($sieve_file)) unlink($sieve_file) or $app->log("Unable to delete file: $sieve_file",LOGLEVEL_WARN); + } + + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/plugins-enabled/mysql_clientdb_plugin.inc.php b/interface/ispconfig/server/plugins-enabled/mysql_clientdb_plugin.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..6b2651d6049becaefdca58903a6565a7034d5f2b --- /dev/null +++ b/interface/ispconfig/server/plugins-enabled/mysql_clientdb_plugin.inc.php @@ -0,0 +1,305 @@ +plugins->registerEvent('database_insert',$this->plugin_name,'db_insert'); + $app->plugins->registerEvent('database_update',$this->plugin_name,'db_update'); + $app->plugins->registerEvent('database_delete',$this->plugin_name,'db_delete'); + + + } + + function process_host_list($action, $database_name, $database_user, $database_password, $host_list, $link, $database_rename_user = "") { + global $app; + + $action = strtoupper($action); + + // set to all hosts if none given + if(trim($host_list) == "") $host_list = "%"; + + // process arrays and comma separated strings + if(!is_array($host_list)) $host_list = split(",", $host_list); + + $success = true; + + // loop through hostlist + foreach($host_list as $db_host) { + $db_host = trim($db_host); + + // check if entry is valid ip address + $valid = true; + if($db_host == "%") { + $valid = true; + } elseif(preg_match("/^[0-9]{1,3}(\.)[0-9]{1,3}(\.)[0-9]{1,3}(\.)[0-9]{1,3}$/", $db_host)) { + $groups = explode(".", $db_host); + foreach($groups as $group){ + if($group<0 OR $group>255) + $valid=false; + } + } else { + $valid = false; + } + + if($valid == false) continue; + + if($action == "GRANT") { + if(!mysql_query("GRANT ALL ON ".mysql_real_escape_string($database_name,$link).".* TO '".mysql_real_escape_string($database_user,$link)."'@'$db_host' IDENTIFIED BY '".mysql_real_escape_string($database_password,$link)."';",$link)) $success = false; + } elseif($action == "REVOKE") { + //mysql_query("REVOKE ALL PRIVILEGES ON ".mysql_real_escape_string($database_name,$link).".* FROM '".mysql_real_escape_string($database_user,$link)."';",$link); + } elseif($action == "DROP") { + if(!mysql_query("DROP USER '".mysql_real_escape_string($database_user,$link)."'@'$db_host';",$link)) $success = false; + } elseif($action == "RENAME") { + if(!mysql_query("RENAME USER '".mysql_real_escape_string($database_user,$link)."'@'$db_host' TO '".mysql_real_escape_string($database_rename_user,$link)."'@'$db_host'",$link)) $success = false; + } elseif($action == "PASSWORD") { + if(!mysql_query("SET PASSWORD FOR '".mysql_real_escape_string($database_user,$link)."'@'$db_host' = PASSWORD('".mysql_real_escape_string($database_password,$link)."');",$link)) $success = false; + } + } + + return $success; + } + + function db_insert($event_name,$data) { + global $app, $conf; + + if($data["new"]["type"] == 'mysql') { + if(!include(ISPC_LIB_PATH.'/mysql_clientdb.conf')) { + $app->log('Unable to open'.ISPC_LIB_PATH.'/mysql_clientdb.conf',LOGLEVEL_ERROR); + return; + } + + //* Connect to the database + $link = mysql_connect($clientdb_host, $clientdb_user, $clientdb_password); + if (!$link) { + $app->log('Unable to connect to the database'.mysql_error($link),LOGLEVEL_ERROR); + return; + } + + // Charset for the new table + if($data["new"]["database_charset"] != '') { + $query_charset_table = ' DEFAULT CHARACTER SET '.$data["new"]["database_charset"]; + } else { + $query_charset_table = ''; + } + + //* Create the new database + if (mysql_query('CREATE DATABASE '.mysql_real_escape_string($data["new"]["database_name"]).$query_charset_table,$link)) { + $app->log('Created MySQL database: '.$data["new"]["database_name"],LOGLEVEL_DEBUG); + } else { + $app->log('Unable to connect to the database'.mysql_error($link),LOGLEVEL_ERROR); + } + + // Create the database user if database is active + if($data["new"]["active"] == 'y') { + + if($data["new"]["remote_access"] == 'y') { + $this->process_host_list("GRANT", $data["new"]["database_name"], $data["new"]["database_user"], $data["new"]["database_password"], $data["new"]["remote_ips"], $link); + } + + $db_host = 'localhost'; + mysql_query("GRANT ALL ON ".mysql_real_escape_string($data["new"]["database_name"],$link).".* TO '".mysql_real_escape_string($data["new"]["database_user"],$link)."'@'$db_host' IDENTIFIED BY '".mysql_real_escape_string($data["new"]["database_password"],$link)."';",$link); + + + } + + mysql_query("FLUSH PRIVILEGES;",$link); + mysql_close($link); + } + } + + function db_update($event_name,$data) { + global $app, $conf; + + if($data["new"]["type"] == 'mysql') { + if(!include(ISPC_LIB_PATH.'/mysql_clientdb.conf')) { + $app->log('Unable to open'.ISPC_LIB_PATH.'/mysql_clientdb.conf',LOGLEVEL_ERROR); + return; + } + + //* Connect to the database + $link = mysql_connect($clientdb_host, $clientdb_user, $clientdb_password); + if (!$link) { + $app->log('Unable to connect to the database'.mysql_error($link),LOGLEVEL_ERROR); + return; + } + + // Create the database user if database was disabled before + if($data["new"]["active"] == 'y' && $data["old"]["active"] == 'n') { + + if($data["new"]["remote_access"] == 'y') { + $this->process_host_list("GRANT", $data["new"]["database_name"], $data["new"]["database_user"], $data["new"]["database_password"], $data["new"]["remote_ips"], $link); + } + + $db_host = 'localhost'; + mysql_query("GRANT ALL ON ".mysql_real_escape_string($data["new"]["database_name"],$link).".* TO '".mysql_real_escape_string($data["new"]["database_user"],$link)."'@'$db_host' IDENTIFIED BY '".mysql_real_escape_string($data["new"]["database_password"],$link)."';",$link); + + // mysql_query("GRANT ALL ON ".mysql_real_escape_string($data["new"]["database_name"],$link).".* TO '".mysql_real_escape_string($data["new"]["database_user"],$link)."'@'$db_host' IDENTIFIED BY '".mysql_real_escape_string($data["new"]["database_password"],$link)."';",$link); + //echo "GRANT ALL ON ".mysql_real_escape_string($data["new"]["database_name"]).".* TO '".mysql_real_escape_string($data["new"]["database_user"])."'@'$db_host' IDENTIFIED BY '".mysql_real_escape_string($data["new"]["database_password"])."';"; + } + + // Remove database user, if inactive + if($data["new"]["active"] == 'n' && $data["old"]["active"] == 'y') { + + if($data["old"]["remote_access"] == 'y') { + $this->process_host_list("DROP", "", $data["old"]["database_user"], "", $data["old"]["remote_ips"], $link); + } + + $db_host = 'localhost'; + mysql_query("DROP USER '".mysql_real_escape_string($data["old"]["database_user"],$link)."'@'$db_host';",$link); + + + //mysql_query("REVOKE ALL PRIVILEGES ON ".mysql_real_escape_string($data["new"]["database_name"],$link).".* FROM '".mysql_real_escape_string($data["new"]["database_user"],$link)."';",$link); + } + + //* Rename User + if($data["new"]["database_user"] != $data["old"]["database_user"]) { + $db_host = 'localhost'; + mysql_query("RENAME USER '".mysql_real_escape_string($data["old"]["database_user"],$link)."'@'$db_host' TO '".mysql_real_escape_string($data["new"]["database_user"],$link)."'@'$db_host'",$link); + if($data["old"]["remote_access"] == 'y') { + $this->process_host_list("RENAME", "", $data["new"]["database_user"], "", $data["new"]["remote_ips"], $link, $data["new"]["database_user"]); + } + $app->log('Renaming mysql user: '.$data["old"]["database_user"].' to '.$data["new"]["database_user"],LOGLEVEL_DEBUG); + } + + //* Remote access option has changed. + if($data["new"]["remote_access"] != $data["old"]["remote_access"]) { + + //* revoke old priveliges + //mysql_query("REVOKE ALL PRIVILEGES ON ".mysql_real_escape_string($data["new"]["database_name"],$link).".* FROM '".mysql_real_escape_string($data["new"]["database_user"],$link)."';",$link); + + //* set new priveliges + if($data["new"]["remote_access"] == 'y') { + $this->process_host_list("GRANT", $data["new"]["database_name"], $data["new"]["database_user"], $data["new"]["database_password"], $data["new"]["remote_ips"], $link); + } else { + $this->process_host_list("DROP", "", $data["old"]["database_user"], "", $data["old"]["remote_ips"], $link); + } + $app->log('Changing mysql remote access priveliges for database: '.$data["new"]["database_name"],LOGLEVEL_DEBUG); + } elseif($data["new"]["remote_access"] == 'y' && $data["new"]["remote_ips"] != $data["old"]["remote_ips"]) { + //* Change remote access list + $this->process_host_list("DROP", "", $data["old"]["database_user"], "", $data["old"]["remote_ips"], $link); + $this->process_host_list("GRANT", $data["new"]["database_name"], $data["new"]["database_user"], $data["new"]["database_password"], $data["new"]["remote_ips"], $link); + } + + //* Change password + if($data["new"]["database_password"] != $data["old"]["database_password"]) { + $db_host = 'localhost'; + mysql_query("SET PASSWORD FOR '".mysql_real_escape_string($data["new"]["database_user"],$link)."'@'$db_host' = PASSWORD('".mysql_real_escape_string($data["new"]["database_password"],$link)."');",$link); + + if($data["new"]["remote_access"] == 'y') { + $this->process_host_list("PASSWORD", "", $data["new"]["database_user"], $data["new"]["database_password"], $data["new"]["remote_ips"], $link); + } + $app->log('Changing mysql user password for: '.$data["new"]["database_user"],LOGLEVEL_DEBUG); + } + + mysql_query("FLUSH PRIVILEGES;",$link); + mysql_close($link); + } + + } + + function db_delete($event_name,$data) { + global $app, $conf; + + if($data["old"]["type"] == 'mysql') { + if(!include(ISPC_LIB_PATH.'/mysql_clientdb.conf')) { + $app->log('Unable to open'.ISPC_LIB_PATH.'/mysql_clientdb.conf',LOGLEVEL_ERROR); + return; + } + + //* Connect to the database + $link = mysql_connect($clientdb_host, $clientdb_user, $clientdb_password); + if (!$link) { + $app->log('Unable to connect to the database'.mysql_error($link),LOGLEVEL_ERROR); + return; + } + + //* Get the db host setting for the access priveliges + if($data["old"]["remote_access"] == 'y') { + if($this->process_host_list("DROP", "", $data["old"]["database_user"], "", $data["old"]["remote_ips"], $link)) { + $app->log('Dropping mysql user: '.$data["old"]["database_user"],LOGLEVEL_DEBUG); + } else { + $app->log('Error while dropping mysql user: '.$data["old"]["database_user"].' '.mysql_error($link),LOGLEVEL_ERROR); + } + } + $db_host = 'localhost'; + if(mysql_query("DROP USER '".mysql_real_escape_string($data["old"]["database_user"],$link)."'@'$db_host';",$link)) { + $app->log('Dropping mysql user: '.$data["old"]["database_user"],LOGLEVEL_DEBUG); + } else { + $app->log('Error while dropping mysql user: '.$data["old"]["database_user"].' '.mysql_error($link),LOGLEVEL_ERROR); + } + + if(mysql_query('DROP DATABASE '.mysql_real_escape_string($data["old"]["database_name"],$link),$link)) { + $app->log('Dropping mysql database: '.$data["old"]["database_name"],LOGLEVEL_DEBUG); + } else { + $app->log('Error while dropping mysql database: '.$data["old"]["database_name"].' '.mysql_error($link),LOGLEVEL_ERROR); + } + + mysql_query("FLUSH PRIVILEGES;",$link); + mysql_close($link); + } + + + } + + + + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/plugins-enabled/network_settings_plugin.inc.php b/interface/ispconfig/server/plugins-enabled/network_settings_plugin.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..cfe33c7a20f9ae11f7d3d9cad3ebb23921225306 --- /dev/null +++ b/interface/ispconfig/server/plugins-enabled/network_settings_plugin.inc.php @@ -0,0 +1,289 @@ +plugins->registerEvent('server_insert','network_settings_plugin','insert'); + $app->plugins->registerEvent('server_update','network_settings_plugin','update'); + + $app->plugins->registerEvent('server_ip_insert','network_settings_plugin','insert'); + $app->plugins->registerEvent('server_ip_update','network_settings_plugin','update'); + + + + } + + function insert($event_name,$data) { + global $app, $conf; + + $this->update($event_name,$data); + + } + + // The purpose of this plugin is to rewrite the main.cf file + function update($event_name,$data) { + global $app, $conf; + + // get the config + $app->uses("getconf"); + $server_config = $app->getconf->get_server_config($conf["server_id"], 'server'); + + // Configure the debian network card settings + if($server_config['auto_network_configuration'] == 'y') { + + if (is_file('/etc/debian_version')) + { + copy('/etc/network/interfaces','/etc/network/interfaces~'); + + $app->load('tpl'); + + $network_tpl = new tpl(); + $network_tpl->newTemplate("debian_network_interfaces.master"); + + $network_tpl->setVar('ip_address',$server_config["ip_address"]); + $network_tpl->setVar('netmask',$server_config["netmask"]); + $network_tpl->setVar('gateway',$server_config["gateway"]); + $network_tpl->setVar('broadcast',$this->broadcast($server_config["ip_address"],$server_config["netmask"])); + $network_tpl->setVar('network',$this->network($server_config["ip_address"],$server_config["netmask"])); + + $records = $app->db->queryAllRecords("SELECT ip_address FROM server_ip WHERE server_id = ".intval($conf["server_id"]) . " order by ip_address"); + $ip_records = array(); + $additionl_ip_records = 0; + $n = 0; + if(is_array($records)) { + foreach($records as $rec) { + /* + * don't insert the main-ip again! + */ + if ($rec['ip_address'] != $server_config["ip_address"]) + { + $ip_records[$n] = array( + 'id' => $n, + 'ip_address' => $rec['ip_address'], + 'netmask' => $server_config["netmask"], + 'gateway' => $server_config["gateway"], + 'broadcast' => $this->broadcast($rec['ip_address'],$server_config["netmask"]), + 'network' => $this->network($rec['ip_address'],$server_config["netmask"]) + ); + $additionl_ip_records = 1; + $n++; + } + } + } + + /* + * If we have more than 1 IP we have to add the main-ip at the end + * of the network-ip-list. If we don't do so, there may be problems + * in multi-server-settings (with the acces from other server to the + * main-server) because the LAST IP in the list is the IP mysql uses + * to determine the host, the user is logging in from. + */ + if ($additionl_ip_records != 0) + { + $swap["ip_address"] = $ip_records[$n-1]["ip_address"]; + $swap["netmask"] = $ip_records[$n-1]["netmask"]; + $swap["gateway"] = $ip_records[$n-1]["gateway"]; + + $ip_records[$n-1] = array( + 'id' => $n-1, + 'ip_address' => $server_config['ip_address'], + 'netmask' => $server_config["netmask"], + 'gateway' => $server_config["gateway"], + 'broadcast' => $this->broadcast($server_config['ip_address'],$server_config["netmask"]), + 'network' => $this->network($server_config['ip_address'],$server_config["netmask"]) + ); + $network_tpl->setVar('ip_address',$swap["ip_address"]); + $network_tpl->setVar('netmask',$swap["netmask"]); + $network_tpl->setVar('gateway',$swap["gateway"]); + $network_tpl->setVar('broadcast',$this->broadcast($swap["ip_address"],$swap["netmask"])); + $network_tpl->setVar('network',$this->network($swap["ip_address"],$swap["netmask"])); + } + + $network_tpl->setVar('additionl_ip_records',$additionl_ip_records); + $network_tpl->setLoop('interfaces',$ip_records); + file_put_contents('/etc/network/interfaces',$network_tpl->grab()); + unset($network_tpl); + + $app->log("Changed Network settings",LOGLEVEL_DEBUG); + exec('/etc/init.d/networking force-reload'); + } + elseif (is_file('/etc/gentoo-release')) + { + copy('/etc/conf.d/net','/etc/conf.d/net~'); + + $app->load('tpl'); + + $network_tpl = new tpl(); + $network_tpl->newTemplate("gentoo_network_interfaces.master"); + + $network_tpl->setVar('ip_address',$server_config["ip_address"]); + $network_tpl->setVar('netmask',$server_config["netmask"]); + $network_tpl->setVar('gateway',$server_config["gateway"]); + $network_tpl->setVar('broadcast',$this->broadcast($server_config["ip_address"],$server_config["netmask"])); + + $records = $app->db->queryAllRecords("SELECT ip_address FROM server_ip WHERE server_id = ".intval($conf["server_id"]) . " order by ip_address"); + $ip_records = array(); + $additionl_ip_records = 0; + $n = 0; + if(is_array($records)) { + foreach($records as $rec) { + /* + * don't insert the main-ip again! + */ + if ($rec['ip_address'] != $server_config["ip_address"]) + { + $ip_records[$n] = array( + 'id' => $n, + 'ip_address' => $rec['ip_address'], + 'netmask' => $server_config["netmask"], + 'gateway' => $server_config["gateway"], + 'broadcast' => $this->broadcast($rec['ip_address'],$server_config["netmask"]) + ); + $additionl_ip_records = 1; + $n++; + } + } + } + + /* + * If we have more than 1 IP we have to add the main-ip at the end + * of the network-ip-list. If we don't do so, there may be problems + * in multi-server-settings (with the acces from other server to the + * main-server) because the LAST IP in the list is the IP mysql uses + * to determine the host, the user is logging in from. + */ + if ($additionl_ip_records != 0) + { + $swap["ip_address"] = $ip_records[$n-1]["ip_address"]; + $swap["netmask"] = $ip_records[$n-1]["netmask"]; + $swap["gateway"] = $ip_records[$n-1]["gateway"]; + + $ip_records[$n-1] = array( + 'id' => $n-1, + 'ip_address' => $server_config['ip_address'], + 'netmask' => $server_config["netmask"], + 'gateway' => $server_config["gateway"], + 'broadcast' => $this->broadcast($server_config['ip_address'],$server_config["netmask"]) + ); + $network_tpl->setVar('ip_address',$swap["ip_address"]); + $network_tpl->setVar('netmask',$swap["netmask"]); + $network_tpl->setVar('gateway',$swap["gateway"]); + $network_tpl->setVar('broadcast',$this->broadcast($swap["ip_address"],$swap["netmask"])); + } + + $network_tpl->setVar('additionl_ip_records',$additionl_ip_records); + $network_tpl->setLoop('interfaces',$ip_records); + file_put_contents('/etc/conf.d/net',$network_tpl->grab()); + unset($network_tpl); + + $app->log("Changed Network settings",LOGLEVEL_DEBUG); + exec('/etc/init.d/net.eth0 restart'); + } + else { + $app->log("Network configuration not available for this linux distribution.",LOGLEVEL_DEBUG); + } + + } else { + $app->log("Network configuration disabled in server settings.",LOGLEVEL_WARN); + } + + } + + function network($ip, $netmask){ + $netmask = $this->netmask($netmask); + list($f1,$f2,$f3,$f4) = explode(".", $netmask); + $netmask_bin = str_pad(decbin($f1),8,"0",STR_PAD_LEFT).str_pad(decbin($f2),8,"0",STR_PAD_LEFT).str_pad(decbin($f3),8,"0",STR_PAD_LEFT).str_pad(decbin($f4),8,"0",STR_PAD_LEFT); + list($f1,$f2,$f3,$f4) = explode(".", $ip); + $ip_bin = str_pad(decbin($f1),8,"0",STR_PAD_LEFT).str_pad(decbin($f2),8,"0",STR_PAD_LEFT).str_pad(decbin($f3),8,"0",STR_PAD_LEFT).str_pad(decbin($f4),8,"0",STR_PAD_LEFT); + for($i=0;$i<32;$i++){ + $network_bin .= substr($netmask_bin,$i,1) * substr($ip_bin,$i,1); + } + $network_bin = wordwrap($network_bin, 8, ".", 1); + list($f1,$f2,$f3,$f4) = explode(".", trim($network_bin)); + return bindec($f1).".".bindec($f2).".".bindec($f3).".".bindec($f4); + } + + function broadcast($ip, $netmask){ + $netmask = $this->netmask($netmask); + $binary_netmask = $this->binary_netmask($netmask); + list($f1,$f2,$f3,$f4) = explode(".", $ip); + $ip_bin = str_pad(decbin($f1),8,"0",STR_PAD_LEFT).str_pad(decbin($f2),8,"0",STR_PAD_LEFT).str_pad(decbin($f3),8,"0",STR_PAD_LEFT).str_pad(decbin($f4),8,"0",STR_PAD_LEFT); + $broadcast_bin = str_pad(substr($ip_bin, 0, $binary_netmask),32,"1",STR_PAD_RIGHT); + $broadcast_bin = wordwrap($broadcast_bin, 8, ".", 1); + list($f1,$f2,$f3,$f4) = explode(".", trim($broadcast_bin)); + return bindec($f1).".".bindec($f2).".".bindec($f3).".".bindec($f4); + } + + function netmask($netmask){ + list($f1,$f2,$f3,$f4) = explode(".", trim($netmask)); + $bin = str_pad(decbin($f1),8,"0",STR_PAD_LEFT).str_pad(decbin($f2),8,"0",STR_PAD_LEFT).str_pad(decbin($f3),8,"0",STR_PAD_LEFT).str_pad(decbin($f4),8,"0",STR_PAD_LEFT); + $parts = explode("0", $bin); + $bin = str_pad($parts[0], 32, "0", STR_PAD_RIGHT); + $bin = wordwrap($bin, 8, ".", 1); + list($f1,$f2,$f3,$f4) = explode(".", trim($bin)); + return bindec($f1).".".bindec($f2).".".bindec($f3).".".bindec($f4); + } + + function binary_netmask($netmask){ + list($f1,$f2,$f3,$f4) = explode(".", trim($netmask)); + $bin = str_pad(decbin($f1),8,"0",STR_PAD_LEFT).str_pad(decbin($f2),8,"0",STR_PAD_LEFT).str_pad(decbin($f3),8,"0",STR_PAD_LEFT).str_pad(decbin($f4),8,"0",STR_PAD_LEFT); + $parts = explode("0", $bin); + return substr_count($parts[0], "1"); + } + +} // end class + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/plugins-enabled/postfix_filter_plugin.inc.php b/interface/ispconfig/server/plugins-enabled/postfix_filter_plugin.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..6b5ed53738e859baabca52451f8830f3c8efca12 --- /dev/null +++ b/interface/ispconfig/server/plugins-enabled/postfix_filter_plugin.inc.php @@ -0,0 +1,153 @@ +plugins->registerEvent('mail_content_filter_insert','postfix_filter_plugin','insert'); + $app->plugins->registerEvent('mail_content_filter_update','postfix_filter_plugin','update'); + $app->plugins->registerEvent('mail_content_filter_delete','postfix_filter_plugin','delete'); + + + + } + + function insert($event_name,$data) { + global $app, $conf; + + $this->update($event_name,$data); + + } + + function update($event_name,$data) { + global $app, $conf; + + $type = $data["new"]["type"]; + if($type != '') { + $sql = "SELECT * FROM mail_content_filter WHERE server_id = ".intval($conf["server_id"])." AND type = '".$app->db->quote($type)."' AND active = 'y'"; + $rules = $app->db->queryAllRecords($sql); + $content = ''; + foreach($rules as $rule) { + $content .= $rule["pattern"]."\n"; + $content .= " ".$rule["action"]." ".$rule["data"]."\n"; + } + + if($type == 'header') { + file_put_contents('/etc/postfix/header_checks',$content); + $app->log("Writing /etc/postfix/header_checks",LOGLEVEL_DEBUG); + } + + if($type == 'mime_header') { + file_put_contents('/etc/postfix/mime_header_checks',$content); + $app->log("Writing /etc/postfix/mime_header_checks",LOGLEVEL_DEBUG); + } + + if($type == 'nested_header') { + file_put_contents('/etc/postfix/nested_header_checks',$content); + $app->log("Writing /etc/postfix/nested_header_checks",LOGLEVEL_DEBUG); + } + + if($type == 'body') { + file_put_contents('/etc/postfix/body_checks',$content); + $app->log("Writing /etc/postfix/body_checks",LOGLEVEL_DEBUG); + } + } + + $type = $data["old"]["type"]; + if($type != '') { + $sql = "SELECT * FROM mail_content_filter WHERE server_id = ".intval($conf["server_id"])." AND type = '".$app->db->quote($type)."' AND active = 'y'"; + $rules = $app->db->queryAllRecords($sql); + $content = ''; + foreach($rules as $rule) { + $content .= $rule["pattern"]."\n"; + $content .= " ".$rule["action"]." ".$rule["data"]."\n"; + } + + if($type == 'header') { + file_put_contents('/etc/postfix/header_checks',$content); + $app->log("Writing /etc/postfix/header_checks",LOGLEVEL_DEBUG); + } + + if($type == 'mime_header') { + file_put_contents('/etc/postfix/mime_header_checks',$content); + $app->log("Writing /etc/postfix/mime_header_checks",LOGLEVEL_DEBUG); + } + + if($type == 'nested_header') { + file_put_contents('/etc/postfix/nested_header_checks',$content); + $app->log("Writing /etc/postfix/nested_header_checks",LOGLEVEL_DEBUG); + } + + if($type == 'body') { + file_put_contents('/etc/postfix/body_checks',$content); + $app->log("Writing /etc/postfix/body_checks",LOGLEVEL_DEBUG); + } + } + } + + function delete($event_name,$data) { + global $app, $conf; + + $this->update($event_name,$data); + } + + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/plugins-enabled/postfix_server_plugin.inc.php b/interface/ispconfig/server/plugins-enabled/postfix_server_plugin.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..f506ce32a4d16446cf3f4bdcb222429a09dd2e0f --- /dev/null +++ b/interface/ispconfig/server/plugins-enabled/postfix_server_plugin.inc.php @@ -0,0 +1,116 @@ +plugins->registerEvent('server_insert','postfix_server_plugin','insert'); + $app->plugins->registerEvent('server_update','postfix_server_plugin','update'); + + + + } + + function insert($event_name,$data) { + global $app, $conf; + + $this->update($event_name,$data); + + } + + // The purpose of this plugin is to rewrite the main.cf file + function update($event_name,$data) { + global $app, $conf; + + // get the config + $app->uses("getconf"); + $mail_config = $app->getconf->get_server_config($conf["server_id"], 'mail'); + + copy('/etc/postfix/main.cf','/etc/postfix/main.cf~'); + + if($mail_config["relayhost"] != '') { + exec("postconf -e 'relayhost = ".$mail_config["relayhost"]."'"); + if($mail_config["relayhost_user"] != '' && $mail_config["relayhost_password"] != '') { + exec("postconf -e 'smtp_sasl_auth_enable = yes'"); + } else { + exec("postconf -e 'smtp_sasl_auth_enable = no'"); + } + exec("postconf -e 'smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd'"); + exec("postconf -e 'smtp_sasl_security_options ='"); + + // Store the sasl passwd + $content = $mail_config["relayhost"]." ".$mail_config["relayhost_user"].":".$mail_config["relayhost_password"]; + file_put_contents('/etc/postfix/sasl_passwd',$content); + exec("chown root:root /etc/postfix/sasl_passwd"); + exec("chmod 600 /etc/postfix/sasl_passwd"); + exec("postmap /etc/postfix/sasl_passwd"); + exec("/etc/init.d/postfix restart"); + + } else { + exec("postconf -e 'relayhost ='"); + } + + exec("postconf -e 'mailbox_size_limit = ".intval($mail_config["mailbox_size_limit"]*1024*1024)."'"); + exec("postconf -e 'message_size_limit = ".intval($mail_config["message_size_limit"]*1024*1024)."'"); + + } + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/plugins-enabled/shelluser_base_plugin.inc.php b/interface/ispconfig/server/plugins-enabled/shelluser_base_plugin.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..ed7fdc635cea53980ecf28e829290d49fb3bb59f --- /dev/null +++ b/interface/ispconfig/server/plugins-enabled/shelluser_base_plugin.inc.php @@ -0,0 +1,189 @@ +plugins->registerEvent('shell_user_insert',$this->plugin_name,'insert'); + $app->plugins->registerEvent('shell_user_update',$this->plugin_name,'update'); + $app->plugins->registerEvent('shell_user_delete',$this->plugin_name,'delete'); + + + } + + + function insert($event_name,$data) { + global $app, $conf; + + $app->uses('system'); + + if($app->system->is_user($data['new']['puser'])) { + // Get the UID of the parent user + $uid = intval($app->system->getuid($data['new']['puser'])); + if($uid > $this->min_uid) { + $command = 'useradd'; + $command .= ' -d '.escapeshellcmd($data['new']['dir']); + $command .= ' -g '.escapeshellcmd($data['new']['pgroup']); + $command .= ' -o '; // non unique + if($data['new']['password'] != '') $command .= ' -p '.escapeshellcmd($data['new']['password']); + $command .= ' -s '.escapeshellcmd($data['new']['shell']); + $command .= ' -u '.escapeshellcmd($uid); + $command .= ' '.escapeshellcmd($data['new']['username']); + + exec($command); + $app->log("Executed command: ".$command,LOGLEVEL_DEBUG); + $app->log("Added shelluser: ".$data['new']['username'],LOGLEVEL_DEBUG); + + //* Create .bash_history file + exec('touch '.escapeshellcmd($data['new']['dir']).'/.bash_history'); + exec('chmod 755 '.escapeshellcmd($data['new']['dir']).'/.bash_history'); + exec('chown '.escapeshellcmd($data['new']['username']).':'.escapeshellcmd($data['new']['pgroup']).' '.escapeshellcmd($data['new']['dir']).'/.bash_history'); + + //* Disable shell user temporarily if we use jailkit + if($data['new']['chroot'] == 'jailkit') { + $command = 'usermod -s /bin/false -L '.escapeshellcmd($data['new']['username']); + exec($command); + $app->log("Disabling shelluser temporarily: ".$command,LOGLEVEL_DEBUG); + } + + } else { + $app->log("UID = $uid for shelluser:".$data['new']['username']." not allowed.",LOGLEVEL_ERROR); + } + } else { + $app->log("Skippung insert of user:".$data['new']['username'].", parent user ".$data['new']['puser']." does not exist.",LOGLEVEL_WARN); + } + } + + function update($event_name,$data) { + global $app, $conf; + + $app->uses('system'); + + if($app->system->is_user($data['new']['puser'])) { + // Get the UID of the parent user + $uid = intval($app->system->getuid($data['new']['puser'])); + if($uid > $this->min_uid) { + // Check if the user that we want to update exists, if not, we insert it + if($app->system->is_user($data['old']['username'])) { + $command = 'usermod'; + $command .= ' --home '.escapeshellcmd($data['new']['dir']); + $command .= ' --gid '.escapeshellcmd($data['new']['pgroup']); + // $command .= ' --non-unique '; + $command .= ' --password '.escapeshellcmd($data['new']['password']); + if($data['new']['chroot'] != 'jailkit') $command .= ' --shell '.escapeshellcmd($data['new']['shell']); + // $command .= ' --uid '.escapeshellcmd($uid); + $command .= ' --login '.escapeshellcmd($data['new']['username']); + $command .= ' '.escapeshellcmd($data['old']['username']); + + exec($command); + $app->log("Executed command: $command ",LOGLEVEL_DEBUG); + $app->log("Updated shelluser: ".$data['old']['username'],LOGLEVEL_DEBUG); + + + //* Create .bash_history file + if(!is_file($data['new']['dir']).'/.bash_history') { + exec('touch '.escapeshellcmd($data['new']['dir']).'/.bash_history'); + exec('chmod 755 '.escapeshellcmd($data['new']['dir']).'/.bash_history'); + exec('chown '.escapeshellcmd($data['new']['username']).':'.escapeshellcmd($data['new']['pgroup']).' '.escapeshellcmd($data['new']['dir']).'/.bash_history'); + } + + } else { + // The user does not exist, so we insert it now + $this->insert($event_name,$data); + } + } else { + $app->log("UID = $uid for shelluser:".$data['new']['username']." not allowed.",LOGLEVEL_ERROR); + } + } else { + $app->log("Skippung update for user:".$data['new']['username'].", parent user ".$data['new']['puser']." does not exist.",LOGLEVEL_WARN); + } + } + + function delete($event_name,$data) { + global $app, $conf; + + $app->uses('system'); + + if($app->system->is_user($data['old']['username'])) { + // Get the UID of the user + $userid = intval($app->system->getuid($data['old']['username'])); + if($userid > $this->min_uid) { + // We delete only non jailkit users, jailkit users will be deleted by the jailkit plugin. + if ($data['old']['chroot'] != "jailkit") { + $command = 'userdel -f'; + $command .= ' '.escapeshellcmd($data['old']['username']); + + exec($command); + $app->log("Deleted shelluser: ".$data['old']['username'],LOGLEVEL_DEBUG); + } + + } else { + $app->log("UID = $userid for shelluser:".$data['old']['username']." not allowed.",LOGLEVEL_ERROR); + } + } else { + $app->log("User:".$data['new']['username']." does not exist in in /etc/passwd, skipping delete.",LOGLEVEL_WARN); + } + + } + + + + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/plugins-enabled/shelluser_jailkit_plugin.inc.php b/interface/ispconfig/server/plugins-enabled/shelluser_jailkit_plugin.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..e5665fc11d7eaddbe68b0223ea0f1edb1127abeb --- /dev/null +++ b/interface/ispconfig/server/plugins-enabled/shelluser_jailkit_plugin.inc.php @@ -0,0 +1,303 @@ +plugins->registerEvent('shell_user_insert',$this->plugin_name,'insert'); + $app->plugins->registerEvent('shell_user_update',$this->plugin_name,'update'); + $app->plugins->registerEvent('shell_user_delete',$this->plugin_name,'delete'); + + + } + + //* This function is called, when a shell user is inserted in the database + function insert($event_name,$data) { + global $app, $conf; + + $app->uses('system'); + + if($app->system->is_user($data['new']['username'])) { + + /** + * Setup Jailkit Chroot System If Enabled + */ + if ($data['new']['chroot'] == "jailkit") + { + // load the server configuration options + $app->uses("getconf"); + $this->data = $data; + $this->app = $app; + $this->jailkit_config = $app->getconf->get_server_config($conf["server_id"], 'jailkit'); + + $this->_update_website_security_level(); + + $this->_setup_jailkit_chroot(); + + $this->_add_jailkit_user(); + + $command .= 'usermod -U '.escapeshellcmd($data['new']['username']); + exec($command); + + $this->_update_website_security_level(); + } + + $app->log("Jailkit Plugin -> insert username:".$data['new']['username'],LOGLEVEL_DEBUG); + + } else { + $app->log("Jailkit Plugin -> insert username:".$data['new']['username']." skipped, the user does not exist.",LOGLEVEL_WARN); + } + + } + + //* This function is called, when a shell user is updated in the database + function update($event_name,$data) { + global $app, $conf; + + $app->uses('system'); + + if($app->system->is_user($data['new']['username'])) { + + /** + * Setup Jailkit Chroot System If Enabled + */ + if ($data['new']['chroot'] == "jailkit") + { + // load the server configuration options + $app->uses("getconf"); + $this->data = $data; + $this->app = $app; + $this->jailkit_config = $app->getconf->get_server_config($conf["server_id"], 'jailkit'); + + $this->_update_website_security_level(); + + $this->_setup_jailkit_chroot(); + $this->_add_jailkit_user(); + + $this->_update_website_security_level(); + } + + $app->log("Jailkit Plugin -> update username:".$data['new']['username'],LOGLEVEL_DEBUG); + + } else { + $app->log("Jailkit Plugin -> update username:".$data['new']['username']." skipped, the user does not exist.",LOGLEVEL_WARN); + } + + } + + //* This function is called, when a shell user is deleted in the database + /** + * TODO: Remove chroot user home and from the chroot passwd file + */ + function delete($event_name,$data) { + global $app, $conf; + + $app->uses('system'); + + if ($data['old']['chroot'] == "jailkit") + { + $app->uses("getconf"); + $this->jailkit_config = $app->getconf->get_server_config($conf["server_id"], 'jailkit'); + + $jailkit_chroot_userhome = $this->_get_home_dir($data['old']['username']); + + //commented out proved to be dangerous on config errors + //exec('rm -rf '.$data['old']['dir'].$jailkit_chroot_userhome); + + if(@is_dir($data['old']['dir'].$jailkit_chroot_userhome)) { + $command = 'userdel'; + $command .= ' '.escapeshellcmd($data['old']['username']); + exec($command); + $app->log("Jailkit Plugin -> delete chroot home:".$data['old']['dir'].$jailkit_chroot_userhome,LOGLEVEL_DEBUG); + } + + } + + $app->log("Jailkit Plugin -> delete username:".$data['old']['username'],LOGLEVEL_DEBUG); + + + } + + function _setup_jailkit_chroot() + { + //check if the chroot environment is created yet if not create it with a list of program sections from the config + if (!is_dir($this->data['new']['dir'].'/etc/jailkit')) + { + $command = '/usr/local/ispconfig/server/scripts/create_jailkit_chroot.sh'; + $command .= ' '.escapeshellcmd($this->data['new']['dir']); + $command .= ' \''.$this->jailkit_config['jailkit_chroot_app_sections'].'\''; + exec($command); + + $this->app->log("Added jailkit chroot with command: ".$command,LOGLEVEL_DEBUG); + + $this->_add_jailkit_programs(); + + //add bash.bashrc script + //we need to collect the domain name to be used as the HOSTNAME in the bashrc script + $web = $this->app->db->queryOneRecord("SELECT domain FROM web_domain WHERE domain_id = ".intval($this->data['new']["parent_domain_id"])); + + $this->app->load('tpl'); + + $tpl = new tpl(); + $tpl->newTemplate("bash.bashrc.master"); + + $tpl->setVar('jailkit_chroot',true); + $tpl->setVar('domain',$web['domain']); + $tpl->setVar('home_dir',$this->_get_home_dir("")); + + $bashrc = escapeshellcmd($this->data['new']['dir']).'/etc/bash.bashrc'; + if(@is_file($bashrc)) exec('rm '.$bashrc); + + file_put_contents($bashrc,$tpl->grab()); + unset($tpl); + + $this->app->log("Added bashrc scrpt : ".$bashrc,LOGLEVEL_DEBUG); + + $tpl = new tpl(); + $tpl->newTemplate("motd.master"); + + $tpl->setVar('domain',$web['domain']); + + $motd = escapeshellcmd($this->data['new']['dir']).'/var/run/motd'; + if(@is_file($motd)) exec('rm '.$motd); + + file_put_contents($motd,$tpl->grab()); + + } + } + + function _add_jailkit_programs() + { + //copy over further programs and its libraries + $command = '/usr/local/ispconfig/server/scripts/create_jailkit_programs.sh'; + $command .= ' '.escapeshellcmd($this->data['new']['dir']); + $command .= ' \''.$this->jailkit_config['jailkit_chroot_app_programs'].'\''; + exec($command); + + $this->app->log("Added programs to jailkit chroot with command: ".$command,LOGLEVEL_DEBUG); + } + + function _get_home_dir($username) + { + return str_replace("[username]",escapeshellcmd($username),$this->jailkit_config["jailkit_chroot_home"]); + } + + function _add_jailkit_user() + { + //add the user to the chroot + $jailkit_chroot_userhome = $this->_get_home_dir($this->data['new']['username']); + $jailkit_chroot_puserhome = $this->_get_home_dir($this->data['new']['puser']); + + if(!is_dir($this->data['new']['dir'].'/etc')) mkdir($this->data['new']['dir'].'/etc'); + if(!is_file($this->data['new']['dir'].'/etc/passwd')) exec('touch '.$this->data['new']['dir'].'/etc/passwd'); + + // IMPORTANT! + // ALWAYS create the user. Even if the user was created before + // if we check if the user exists, then a update (no shell -> jailkit) will not work + // and the user has FULL ACCESS to the root of the server! + $command = '/usr/local/ispconfig/server/scripts/create_jailkit_user.sh'; + $command .= ' '.escapeshellcmd($this->data['new']['username']); + $command .= ' '.escapeshellcmd($this->data['new']['dir']); + $command .= ' '.$jailkit_chroot_userhome; + $command .= ' '.escapeshellcmd($this->data['new']['shell']); + $command .= ' '.$this->data['new']['puser']; + $command .= ' '.$jailkit_chroot_puserhome; + exec($command); + + $this->app->log("Added jailkit user to chroot with command: ".$command,LOGLEVEL_DEBUG); + + exec("mkdir -p ".escapeshellcmd($this->data['new']['dir'].$jailkit_chroot_userhome)); + exec("chown ".$this->data['new']['username'].":".$this->data['new']['pgroup']." ".escapeshellcmd($this->data['new']['dir'].$jailkit_chroot_userhome)); + + $this->app->log("Added created jailkit user home in : ".$this->data['new']['dir'].$jailkit_chroot_userhome,LOGLEVEL_DEBUG); + + exec("mkdir -p ".escapeshellcmd($this->data['new']['dir'].$jailkit_chroot_puserhome)); + exec("chown ".$this->data['new']['puser'].":".$this->data['new']['pgroup']." ".escapeshellcmd($this->data['new']['dir'].$jailkit_chroot_puserhome)); + + $this->app->log("Added created jailkit parent user home in : ".$this->data['new']['dir'].$jailkit_chroot_puserhome,LOGLEVEL_DEBUG); + } + + //* Update the website root directory permissions depending on the security level + function _update_website_security_level() { + global $app,$conf; + + // load the server configuration options + $app->uses("getconf"); + $web_config = $app->getconf->get_server_config($conf["server_id"], 'web'); + + // Get the parent website of this shell user + $web = $app->db->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ".$this->data['new']['parent_domain_id']); + + //* If the security level is set to high + if($web_config['security_level'] == 20) { + $this->_exec("chmod 755 ".escapeshellcmd($web["document_root"])); + $this->_exec("chown root:root ".escapeshellcmd($web["document_root"])); + } + + } + + //* Wrapper for exec function for easier debugging + private function _exec($command) { + global $app; + $app->log("exec: ".$command,LOGLEVEL_DEBUG); + exec($command); + } + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/plugins-enabled/software_update_plugin.inc.php b/interface/ispconfig/server/plugins-enabled/software_update_plugin.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..08656c38743836a663801dc69681416afb084e1b --- /dev/null +++ b/interface/ispconfig/server/plugins-enabled/software_update_plugin.inc.php @@ -0,0 +1,178 @@ +plugins->registerEvent('software_update_inst_insert',$this->plugin_name,'process'); + //$app->plugins->registerEvent('software_update_inst_update',$this->plugin_name,'process'); + //$app->plugins->registerEvent('software_update_inst_delete',$this->plugin_name,'process'); + + + } + + function set_install_status($inst_id, $status) { + global $app; + + $app->db->query("UPDATE software_update_inst SET status = '{$status}' WHERE software_update_inst_id = '{$inst_id}'"); + $app->dbmaster->query("UPDATE software_update_inst SET status = '{$status}' WHERE software_update_inst_id = '{$inst_id}'"); + } + + function process($event_name,$data) { + global $app, $conf; + + //* Get the info of the package: + $software_update_id = intval($data["new"]["software_update_id"]); + $software_update = $app->db->queryOneRecord("SELECT * FROM software_update WHERE software_update_id = '$software_update_id'"); + $software_package = $app->db->queryOneRecord("SELECT * FROM software_package WHERE package_name = '".$app->db->quote($software_update['package_name'])."'"); + + if($software_package['package_type'] == 'ispconfig' && !$conf['software_updates_enabled'] == true) { + $app->log('Software Updates not enabled on this server. To enable updates, set $conf["software_updates_enabled"] = true; in config.inc.php',LOGLEVEL_WARN); + $this->set_install_status($data["new"]["software_update_inst_id"], "failed"); + return false; + } + + $installuser = ''; + if($software_package['package_type'] == 'ispconfig') { + $installuser = ''; + } elseif ($software_package['package_type'] == 'app') { + $installuser = 'ispapps'; + } else { + $app->log('package_type not supported',LOGLEVEL_WARN); + $this->set_install_status($data["new"]["software_update_inst_id"], "failed"); + return false; + } + + $temp_dir = '/tmp/'.md5 (uniqid (rand())); + $app->log("The temp dir is $temp_dir",LOGLEVEL_DEBUG); + mkdir($temp_dir); + if($installuser != '') exec('chown '.$installuser.' '.$temp_dir); + + if(!is_dir($temp_dir)) { + $app->log("Unable to create temp directory.",LOGLEVEL_WARN); + $this->set_install_status($data["new"]["software_update_inst_id"], "failed"); + return false; + } + + $cmd = "cd $temp_dir && wget ".$software_update["update_url"]; + if($installuser == '') { + exec($cmd); + } else { + exec("su -c ".escapeshellarg($cmd)." $installuser"); + } + $app->log("Downloading the update file from: ".$software_update["update_url"],LOGLEVEL_DEBUG); + + $url_parts = parse_url($software_update["update_url"]); + $update_filename = basename($url_parts["path"]); + $app->log("The update filename is $update_filename",LOGLEVEL_DEBUG); + + if(is_file($temp_dir.'/'.$update_filename)) { + + //* Checking the md5sum + if(md5_file($temp_dir.'/'.$update_filename) != $software_update["update_md5"]) { + $app->log("The md5 sum of the downloaded file is incorrect. Update aborted.",LOGLEVEL_WARN); + exec("rm -rf $temp_dir"); + $app->log("Deleting the temp directory $temp_dir",LOGLEVEL_DEBUG); + $this->set_install_status($data["new"]["software_update_inst_id"], "failed"); + return false; + } else { + $app->log("md5sum of the downloaded file is verified.",LOGLEVEL_DEBUG); + } + + + //* unpacking the update + $cmd = "cd $temp_dir && unzip $update_filename"; + if($installuser == '') { + exec($cmd); + } else { + exec("su -c ".escapeshellarg($cmd)." $installuser"); + } + + if(is_file($temp_dir.'/setup.sh')) { + // Execute the setup script + exec('chmod +x '.$temp_dir.'/setup.sh'); + $app->log("Executing setup.sh file in directory $temp_dir",LOGLEVEL_DEBUG); + $cmd = 'cd '.$temp_dir.' && ./setup.sh > package_install.log'; + if($installuser == '') { + exec($cmd); + } else { + exec("su -c ".escapeshellarg($cmd)." $installuser"); + } + + $log_data = @file_get_contents("{$temp_dir}/package_install.log"); + if(preg_match("'.*\[OK\]\s*$'is", $log_data)) { + $app->log("Installation successful",LOGLEVEL_DEBUG); + $app->log($log_data,LOGLEVEL_DEBUG); + $this->set_install_status($data["new"]["software_update_inst_id"], "installed"); + } else { + $app->log("Installation failed:\n\n" . $log_data,LOGLEVEL_WARN); + $this->set_install_status($data["new"]["software_update_inst_id"], "failed"); + } + } else { + $app->log("setup.sh file not found",LOGLEVEL_ERROR); + $this->set_install_status($data["new"]["software_update_inst_id"], "failed"); + } + } else { + $app->log("Download of the update file failed",LOGLEVEL_WARN); + $this->set_install_status($data["new"]["software_update_inst_id"], "failed"); + } + + exec("rm -rf $temp_dir"); + $app->log("Deleting the temp directory $temp_dir",LOGLEVEL_DEBUG); + } + + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/scripts/create_jailkit_chroot.sh b/interface/ispconfig/server/scripts/create_jailkit_chroot.sh new file mode 100644 index 0000000000000000000000000000000000000000..7a7dcc8a68f76cd801a2a350d84cdc7004e4505e --- /dev/null +++ b/interface/ispconfig/server/scripts/create_jailkit_chroot.sh @@ -0,0 +1,43 @@ +#!/bin/bash + +# Create the jailkit chroot + +# +# Usage: ./create_jailkit_chroot username 'basicshell editors' +# + + +# Sanity check + +if [ "$1" = "" ]; then + echo " Usage: ./create_jailkit_chroot username 'basicshell editors'" + exit +fi + +CHROOT_HOMEDIR=$1 +CHROOT_APP_SECTIONS=$2 + +## Change ownership of the chroot directory to root +chown root:root $CHROOT_HOMEDIR + +## Initialize the chroot into the specified directory with the specified applications +jk_init -f -k -j $CHROOT_HOMEDIR $CHROOT_APP_SECTIONS + +## Create the temp directory +if [ ! -d "$CHROOT_HOMEDIR/tmp" ] +then + mkdir $CHROOT_HOMEDIR/tmp +fi +chmod a+rwx $CHROOT_HOMEDIR/tmp + + +# mysql needs the socket in the chrooted environment +mkdir $CHROOT_HOMEDIR/var +mkdir $CHROOT_HOMEDIR/var/run +mkdir $CHROOT_HOMEDIR/var/run/mysqld + +# ln /var/run/mysqld/mysqld.sock $CHROOT_HOMEDIR/var/run/mysqld/mysqld.sock +if [ -e "/var/run/mysqld/mysqld.sock" ] +then + ln /var/run/mysqld/mysqld.sock $CHROOT_HOMEDIR/var/run/mysqld/mysqld.sock +fi diff --git a/interface/ispconfig/server/scripts/create_jailkit_programs.sh b/interface/ispconfig/server/scripts/create_jailkit_programs.sh new file mode 100644 index 0000000000000000000000000000000000000000..887e0e27db94e08beb04a97348b3915e2f9137f5 --- /dev/null +++ b/interface/ispconfig/server/scripts/create_jailkit_programs.sh @@ -0,0 +1,20 @@ +#!/bin/bash + +# Add specified programs and their libraries to the jailkit chroot + +# +# Usage: ./create_jailkit_programs /path/to/chroot '/usr/bin/program' +# + +# Sanity check + +if [ "$1" = "" ]; then + echo " Usage: ./create_jailkit_programs /path/to/chroot '/usr/bin/program'" + exit +fi + + +CHROOT_HOMEDIR=$1 +CHROOT_APP_PROGRAMS=$2 + +jk_cp -k $CHROOT_HOMEDIR $CHROOT_APP_PROGRAMS diff --git a/interface/ispconfig/server/scripts/create_jailkit_user.sh b/interface/ispconfig/server/scripts/create_jailkit_user.sh new file mode 100644 index 0000000000000000000000000000000000000000..59416c02cbb89ab8aa3734b388a8edf4ca2cb1d6 --- /dev/null +++ b/interface/ispconfig/server/scripts/create_jailkit_user.sh @@ -0,0 +1,33 @@ +#!/bin/bash + +# Add user to the jailkit chroot + +# +# Usage: ./create_jailkit_user username /path/to/chroot/ /home/webuser /bin/bash web2 /home/web2 +# + +# Sanity check + +if [ "$1" = "" ]; then + echo " Usage: ./create_jailkit_user username /path/to/chroot/ /home/webuser /bin/bash" + exit +fi + + +CHROOT_USERNAME=$1 +CHROOT_HOMEDIR=$2 +CHROOT_USERHOMEDIR=$3 +CHROOT_SHELL=$4 +CHROOT_P_USER=$5 +CHROOT_P_USER_HOMEDIR=$6 + +### Add the chroot user ### +jk_jailuser -n -s $CHROOT_SHELL -j $CHROOT_HOMEDIR $CHROOT_USERNAME + +### Reconfigure the chroot home directory for the user ### +usermod --home=$CHROOT_HOMEDIR/.$CHROOT_USERHOMEDIR $CHROOT_USERNAME + +### We have to reconfigure the chroot home directory for the parent user ### +if [ "$CHROOT_P_USER" != "" ]; then + usermod --home=$CHROOT_HOMEDIR/.$CHROOT_P_USER_HOMEDIR $CHROOT_P_USER +fi \ No newline at end of file diff --git a/interface/ispconfig/server/scripts/ispconfig_update.php b/interface/ispconfig/server/scripts/ispconfig_update.php new file mode 100644 index 0000000000000000000000000000000000000000..6357c7d5edf64453d6516ff71ffc7ecbb74a586c --- /dev/null +++ b/interface/ispconfig/server/scripts/ispconfig_update.php @@ -0,0 +1,109 @@ +> Update \n\n"; +echo "Please choose the update method. For production systems select 'stable'. \nThe update from svn is only for development systems and may break your current setup.\n\n"; + +$method = simple_query('Select update method', array('stable','svn'), 'stable'); + +if($method == 'stable') { + $new_version = @file_get_contents('http://www.ispconfig.org/downloads/ispconfig3_version.txt') or die('Unable to retrieve version file.'); + $new_version = trim($new_version); + if($new_version != ISPC_APP_VERSION) { + passthru('/usr/local/ispconfig/server/scripts/update_from_tgz.sh'); + exit; + } else { + echo "There are no updates available for ISPConfig ".ISPC_APP_VERSION."\n"; + } +} else { + passthru('/usr/local/ispconfig/server/scripts/update_from_svn.sh'); + exit; +} + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/scripts/ispconfig_update.sh b/interface/ispconfig/server/scripts/ispconfig_update.sh new file mode 100644 index 0000000000000000000000000000000000000000..eeadcfd465dd623cab6d18d05b91e652cd0140d7 --- /dev/null +++ b/interface/ispconfig/server/scripts/ispconfig_update.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +php -q /usr/local/ispconfig/server/scripts/ispconfig_update.php \ No newline at end of file diff --git a/interface/ispconfig/server/scripts/update_from_svn.sh b/interface/ispconfig/server/scripts/update_from_svn.sh new file mode 100644 index 0000000000000000000000000000000000000000..9c55a41689fe35942b7cb1222d15bd8f64f00fa2 --- /dev/null +++ b/interface/ispconfig/server/scripts/update_from_svn.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +cd /tmp +svn export svn://svn.ispconfig.org/ispconfig3/trunk/ +cd trunk/install +php -q update.php +cd /tmp +rm -rf /tmp/trunk + +exit 0 \ No newline at end of file diff --git a/interface/ispconfig/server/scripts/update_from_tgz.sh b/interface/ispconfig/server/scripts/update_from_tgz.sh new file mode 100644 index 0000000000000000000000000000000000000000..2424f011c3a564948ff947be94db8dee7092ef4d --- /dev/null +++ b/interface/ispconfig/server/scripts/update_from_tgz.sh @@ -0,0 +1,22 @@ +#!/bin/bash + +cd /tmp + +if [ -f ISPConfig-3-stable.tar.gz ] +then +rm -f ISPConfig-3-stable.tar.gz +fi + +wget http://www.ispconfig.org/downloads/ISPConfig-3-stable.tar.gz +if [ -f ISPConfig-3-stable.tar.gz ] +then + tar xvfz ISPConfig-3-stable.tar.gz + cd ispconfig3_install/install/ + php -q update.php + rm -rf /tmp/ispconfig3_install/install + rm -f ISPConfig-3-stable.tar.gz +else + echo "Unable to download the update." +fi + +exit 0 \ No newline at end of file diff --git a/interface/ispconfig/server/scripts/vlogger b/interface/ispconfig/server/scripts/vlogger new file mode 100644 index 0000000000000000000000000000000000000000..ce0ce027bc45cca1dad2d42953efe0991ad28c27 --- /dev/null +++ b/interface/ispconfig/server/scripts/vlogger @@ -0,0 +1,574 @@ +#!/usr/bin/perl -T +# +# vlogger - smarter logging for apache +# steve j. kondik +# +# this script will take piped logs in STDIN, break off the first component +# and log the line into the proper directory under $LOGDIR. it will roll the +# logs over at midnight on-the-fly and maintain a symlink to the most recent log. +# +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Library General Public +# License as published by the Free Software Foundation; either +# version 2 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Library General Public License for more details. +# +# +# CHANGELOG: +# 0.1 initial release +# 0.2 cleanups, added -e option for errorlogs, added strict stuff +# 0.3 cleanups, bugfixes, docs, added -r size rotation option +# 0.4 added dbi usage tracking option, code cleanups from cz@digitalfreaks.org +# 1.0 small bugfixes, first production release +# 1.1 bugfix release +# 1.2 support for mod_logio +# 1.3 various contributed bugfixes +# +# +# TODO: +# configurable file compression using Compress::Zlib, maybe. +# + +package vlogger; + +$ENV{PATH} = "/bin:/usr/bin"; + +my $VERSION = "1.3"; + +=head1 NAME + +vlogger - flexible log rotation and usage tracking in perl + +=head1 SYNOPSIS + +vlogger [OPTIONS]... [LOGDIR] + +=head1 DESCRIPTION + +Vlogger is designed to make webserver log rotation simple and easy to manage. +It deals with VirtualHost logs automatically, so only one directive is required +to manage all hosts on a webserver. Vlogger takes piped output from Apache or +another webserver, splits off the first field, and writes the logs to logfiles +in subdirectories. It uses a filehandle cache to avoid resource limitations. +It will start a new logfile at the beginning of a new day, and optionally start +new files when a certain filesize is reached. It can maintain a symlink to +the most recent log for easy access. Optionally, host parsing can be disabled +for use in ErrorLog directives. + +To use vlogger, you need to add a "%v" to the first part of your LogFormat: + +LogFormat "%v %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined + +Then call it from a customlog: + +CustomLog "| /usr/local/sbin/vlogger -s access.log -u www-logs -g www-logs /var/log/apache" combined + +=head1 OPTIONS + +Options are given in short format on the command line. + +-a + Do not autoflush files. This may improve performance but may break logfile +analyzers that depend on full entries in the logs. + +-e + ErrorLog mode. In this mode, the host parsing is disabled, and the file is +written out using the template under the specified LOGDIR. + +-n + Disables rotation. This option disables rotation altogether. + +-f MAXFILES + Maximum number of filehandles to keep open. Defaults to 100. Setting this +value too high may result in the system running out of file descriptors. +Setting it too low may affect performance. + +-u UID + Change user to UID when running as root. + +-g GID + Change group to GID when running as root. + +-t TEMPLATE + Filename template using Date::Format codes. Default is "%m%d%Y-access.log", +or "%m%d%Y-error.log". When using the -r option, the default becomes +"%m%d%Y-%T-access.log" or "%m%d%Y-%T-error.log". + +-s SYMLINK + Specifies the name of a symlink to the current file. + +-r SIZE + Rotate files when they reach SIZE. SIZE is given in bytes. + +-d CONFIG + Use the DBI usage tracker. + +-h + Displays help. + +-v + Prints version information. + +=head1 DBI USAGE TRACKER + + Vlogger can automatically keep track of per-virtualhost usage statistics in a +database. DBI and the relevant drivers (eg. DBD::mysql) needs to be installed for +this to work. Create a table in your database to hold the data. A "mysql_create.sql" +script is provided for using this feature with MySQL. Configure the dsn, user, pass +and dump values in the vlogger-dbi.conf file. The "dump" parameter controls how often +vlogger will dump its stats into the database (the default is 30 seconds). Copy this +file to somewhere convienient on your filesystem (like /etc/apache/vlogger-dbi.conf) and +start vlogger with "-d /etc/apache/vlogger-dbi.conf". You might want to use this feature +to easily bill customers on a daily/weekly/monthly basis for bandwidth usage. + +=head1 SEE ALSO +cronolog(1), httplog(1) + +=head1 BUGS +None, yet. + +=head1 AUTHORS +Steve J. Kondik + +WWW: http://n0rp.chemlab.org/vlogger + +=cut + +# a couple modules we need +use strict; +no strict "refs"; +use warnings; +use sigtrap qw(handler exitall HUP USR1 TERM INT PIPE); +use Date::Format; +use Getopt::Std; +use IO::Handle; + +# get command line options +our %OPTS; +getopts( 'f:t:s:hu:g:aeivr:d:', \%OPTS ); + +# print out version +if ( $OPTS{'v'} ) { + print "VLogger $VERSION (apache logfile parser)\n"; + print "Written by Steve J. Kondik \n\n"; + print "This is free software; see the source for copying conditions. There is NO\n"; + print "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"; + exit; +} + +# print help +if ( $OPTS{'h'} || !$ARGV[0] ) { + usage(); + exit; +} + +# log directory +my $LOGDIR; +if ( $ARGV[0] ) { + if ( !-d $ARGV[0] ) { + print STDERR + "[vlogger] target directory $ARGV[0] does not exist - exiting.\n\n"; + exit; + } + $LOGDIR = $ARGV[0]; +} +$LOGDIR =~ /(.*)/; +$LOGDIR = $1; + +# change uid/gid if requested (and running as root) +if ( $> == "0" ) { + if ( $OPTS{'g'} ) { + my $guid = getgrnam( $OPTS{'g'} ); + if ( !defined $guid || $guid == 0 ) { + print STDERR + "[vlogger] cannot run as root or nonexistant group.\n\n"; + exit; + } + + $) = $guid; + $( = $guid; + if ( $) != $guid and $) != ( $guid - 2**32 ) ) { + die "fatal: setgid to gid $guid failed\n"; + } + } + + if ( $OPTS{'u'} ) { + my $uuid = getpwnam( $OPTS{'u'} ); + if ( !defined $uuid || $uuid == 0 ) { + print STDERR + "[vlogger] cannot run as root or nonexistant user.\n\n"; + exit; + } + + $> = $uuid; + $< = $uuid; + if ( $> != $uuid and $> != ( $uuid - 2**32 ) ) { + die "fatal: setuid to uid $uuid failed\n"; + } + } +} + +# set up dbi stuffs + +my $DBI_DSN; +my $DBI_USER; +my $DBI_PASS; +my $DBI_DUMP; +if ( $OPTS{'d'} ) { + if ( $OPTS{'e'} ) { + print "-d not valid with -e. exiting.\n"; + exit; + } + + eval "use DBI"; + + open CONF, $OPTS{'d'}; + while () { + chomp; + my @conf = split (/\s/); + if ( $conf[0] eq "dsn" ) { + $DBI_DSN = $conf[1]; + } + elsif ( $conf[0] eq "user" ) { + $DBI_USER = $conf[1]; + } + elsif ( $conf[0] eq "pass" ) { + $DBI_PASS = $conf[1]; + } + elsif ( $conf[0] eq "dump" ) { + $DBI_DUMP = $conf[1]; + } + } + close CONF; + + unless ( $DBI_DSN && $DBI_USER && $DBI_PASS && $DBI_DUMP ) { + print "All values for DBI configuration are not properly defined.\n\n"; + exit; + } + + # test the connection + eval { + my $dbh = DBI->connect( $DBI_DSN, $DBI_USER, $DBI_PASS ) + or die "DBI Error: $!"; + $dbh->disconnect; + }; + if ($@) { + print "MySQL Connection problem\n"; + } + + # SIGALRM dumps the tracker hash + $SIG{ALRM} = \&dump_tracker; + + alarm $DBI_DUMP; + +} + +# max files to keep open +my $MAXFILES; +if ( $OPTS{'f'} ) { + $MAXFILES = $OPTS{'f'}; +} +else { + $MAXFILES = "100"; +} + +# filesize rotation +my $MAXSIZE; +if ( $OPTS{'r'} ) { + $MAXSIZE = $OPTS{'r'}; +} + +# filename template +my $TEMPLATE; +if ( $OPTS{'t'} ) { + $TEMPLATE = $OPTS{'t'}; + $TEMPLATE =~ /(.*)/; + $TEMPLATE = $1; + +} +elsif ( $OPTS{'e'} ) { + if ( $OPTS{'r'} ) { + $TEMPLATE = "%m%d%Y-%T-error.log"; + } + else { + $TEMPLATE = "%m%d%Y-error.log"; + } +} +else { + if ( $OPTS{'r'} ) { + $TEMPLATE = "%m%d%Y-%T-access.log"; + } + else { + $TEMPLATE = "%m%d%Y-access.log"; + } +} + +# symlink +if ( $OPTS{'s'} ) { + $OPTS{'s'} =~ /(.*)/; + $OPTS{'s'} = $1; +} + +# chroot to the logdir +chdir($LOGDIR); +#chroot("."); we better do not chroot as DBI requires to load a module on the fly -> error! + +my %logs = (); +my %tracker = (); +my $LASTDUMP = time(); + +# pick a mode +if ( $OPTS{'e'} ) { + + $0 = "vlogger (error log)"; + # errorlog mode + open ELOG, ">>" . time2str( $TEMPLATE, time() ) + or die ( "can't open $LOGDIR/" . time2str( $TEMPLATE, time() ) ); + + unless ( $OPTS{'a'} ) { + ELOG->autoflush(1); + } + if ( $OPTS{'s'} ) { + if ( -l $OPTS{'s'} ) { + unlink( $OPTS{'s'} ); + } + symlink( time2str( $TEMPLATE, time() ), $OPTS{'s'} ); + } + + my $LASTWRITE = time(); + + while ( my $log_line = ) { + unless ( $OPTS{'n'} ) { + if ( time2str( "%Y%m%d", time() ) > + time2str( "%Y%m%d", $LASTWRITE ) ) + { + + # open a new file + close ELOG; + open_errorlog(); + } + elsif ( $OPTS{'r'} ) { + + # check the size + my @filesize = ELOG->stat; + print $filesize[7] . "\n"; + if ( $filesize[7] > $MAXSIZE ) { + close ELOG; + open_errorlog(); + } + } + + $LASTWRITE = time(); + } + + # we dont need to do any other parsing at all, so write the line. + print ELOG $log_line; + } + +} +else { + + # accesslog mode + $0 = "vlogger (access log)"; + while ( my $log_line = ) { + + # parse out the first word (the vhost) + my @this_line = split ( /\s/, $log_line ); + my ($vhost) = $this_line[0]; + my $reqsize = $this_line[10]; + $vhost = lc($vhost) || "default"; + if ( $vhost =~ m#[/\\]# ) { $vhost = "default" } + $vhost =~ /(.*)/o; + $vhost = $1; + $vhost = 'default' unless $vhost; + + if ( $OPTS{'i'} ) { + $reqsize = $this_line[1] + $this_line[2]; + } + + # if we're writing to a log, and it rolls to a new day, close all files. + unless ( $OPTS{'n'} ) { + if ( $logs{$vhost} + && ( time2str( "%Y%m%d", time() ) > + time2str( "%Y%m%d", $logs{$vhost} ) ) ) + { + foreach my $key ( keys %logs ) { + close $key; + } + %logs = (); + } + elsif ( $OPTS{'r'} && $logs{$vhost} ) { + + # check the size + my @filesize = $vhost->stat; + if ( $filesize[7] > $MAXSIZE ) { + close $vhost; + delete( $logs{$vhost} ); + } + } + } + + # open a new log + if ( !$logs{$vhost} ) { + + # check how many files we have open, close the oldest one + if ( keys(%logs) > $MAXFILES ) { + my ( $key, $value ) = + sort { $logs{$a} <=> $logs{$b} } ( keys(%logs) ); + close $key; + delete( $logs{$key} ); + } + + # check if directory is there + unless ( -d "${vhost}" ) { + mkdir("${vhost}"); + } + + # open the file using the template + open $vhost, ">>${vhost}/" . time2str( $TEMPLATE, time() ) + or die ( "can't open $LOGDIR/${vhost}/" + . time2str( $TEMPLATE, time() ) ); + + # autoflush the handle unless -a + if ( !$OPTS{'a'} ) { + $vhost->autoflush(1); + } + + # make a symlink if -s + if ( $OPTS{'s'} ) { + chdir("${vhost}"); + if ( -l $OPTS{'s'} ) { + unlink( $OPTS{'s'} ); + } + symlink( time2str( $TEMPLATE, time() ), $OPTS{'s'} ); + chdir(".."); + } + } + + # update the timestamp and write the line + $logs{$vhost} = time(); + if ($OPTS{'i'}) { + $log_line =~ s/^\S*\s+\S*\s+\S*\s+//o; + } + else { + $log_line =~ s/^\S*\s+//o; + } + + if ( $reqsize =~ m/^\d*$/ && $reqsize > 0 ) { + $tracker{$vhost} += $reqsize; + } + + print $vhost $log_line; + + } +} + +# sub to close all files +sub closeall { + if ( $OPTS{'e'} ) { + close ELOG; + } + else { + foreach my $key ( keys %logs ) { + close $key; + } + %logs = (); + if ( $OPTS{'d'} ) { + vlogger::dump_tracker(); + } + } +} + +sub exitall { + vlogger::closeall; + exit; +} + +# sub to open new errorlog +sub open_errorlog { + open ELOG, ">>" . time2str( $TEMPLATE, time() ) + or die ( "can't open $LOGDIR/" . time2str( $TEMPLATE, time() ) ); + if ( $OPTS{'s'} ) { + if ( -l $OPTS{'s'} ) { + unlink( $OPTS{'s'} ); + } + symlink( time2str( $TEMPLATE, time() ), $OPTS{'s'} ); + } + + # autoflush it unless -a + unless ( $OPTS{'a'} ) { + ELOG->autoflush(1); + } +} + +# sub to update the database with the tracker data +sub dump_tracker { + eval { + if ( keys(%tracker) > 0 ) { + my $dbh = DBI->connect( $DBI_DSN, $DBI_USER, $DBI_PASS ) + or warn "DBI Error: $!"; + foreach my $key ( keys(%tracker) ) { + my $ts = time2str( "%Y-%m-%d", time() ); + my $sth = + $dbh->prepare( "select * from web_traffic where hostname='" . $key + . "' and traffic_date='" . $ts . "'" ); + $sth->execute; + if ( $sth->rows ) { + my $query = + "update web_traffic set traffic_bytes=traffic_bytes+" + . $tracker{$key} + . " where hostname='" . $key + . "' and traffic_date='" . $ts . "'"; + $dbh->do($query); + } + else { + my $query = "insert into web_traffic (hostname, traffic_date, traffic_bytes) values ('$key', '$ts', '$tracker{$key}')"; + $dbh->do($query); + } + } + $dbh->disconnect; + %tracker = (); + } + alarm $DBI_DUMP; + }; + if ($@) { + print "Unable to store vlogger data in database\n"; + } +} + +# print usage info +sub usage { + print "Usage: vlogger [OPTIONS]... [LOGDIR]\n"; + print "Handles a piped logfile from a webserver, splitting it into it's\n"; + print "host components, and rotates the files daily.\n\n"; + print " -a do not autoflush files\n"; + print " -e errorlog mode\n"; + print " -n don't rotate files\n"; + print " -f MAXFILES max number of files to keep open\n"; + print " -u UID uid to switch to when running as root\n"; + print " -g GID gid to switch to when running as root\n"; + print " -t TEMPLATE filename template (see perldoc Date::Format)\n"; + print " -s SYMLINK maintain a symlink to most recent file\n"; + print " -r SIZE rotate when file reaches SIZE\n"; + print " -d CONFIG use DBI usage tracker (see perldoc vlogger)\n"; + print " -i extract mod_logio instead of filesize\n"; + print " -h display this help\n"; + print " -v output version information\n\n"; + print "TEMPLATE may be a filename with Date::Format codes. The default template\n"; + print "is %m%d%Y-access.log. SYMLINK is the name of a file that will be linked to\n"; + print "the most recent file inside the log directory. The default is access.log.\n"; + print "MAXFILES is the maximum number of filehandles to cache. This defaults to 100.\n"; + print "When running with -a, performance may improve, but this might confuse some\n"; + print "log analysis software that expects complete log entries at all times.\n"; + print "Errorlog mode is used when running with an Apache errorlog. In this mode,\n"; + print "virtualhost parsing is disabled, and a single file is written in LOGDIR\n"; + print "using the TEMPLATE (%m%d%Y-error.log is default for -e). When running with\n"; + print "-r, the template becomes %m%d%Y-%T-xxx.log. SIZE is given in bytes.\n\n"; + print "Report bugs to .\n"; +} + diff --git a/interface/ispconfig/server/server.php b/interface/ispconfig/server/server.php new file mode 100644 index 0000000000000000000000000000000000000000..80a6b9f8990db338eb4a9cce2d5a5b18bc974584 --- /dev/null +++ b/interface/ispconfig/server/server.php @@ -0,0 +1,148 @@ +db->queryOneRecord("SELECT * FROM server WHERE update = 1 AND server_id = ".$conf["server_id"]); +if($server_db_record == false) { + $app->log("Nothing to update for server_id ".$conf["server_id"]); + die(); +} else { + // Set update status to 0, so we dont start the update process twice + $app->db->query("UPDATE server SET update = 0 WHERE server_id = ".$conf["server_id"]); + $app->log("Begin update."); +} +*/ + +//* Load the server configuration +if($app->dbmaster->connect()) { + // get the dalaog_id of the last performed record + $server_db_record = $app->dbmaster->queryOneRecord("SELECT * FROM server WHERE server_id = ".$conf["server_id"]); + $conf['last_datalog_id'] = (int)$server_db_record['updated']; + $conf["mirror_server_id"] = (int)$server_db_record['mirror_server_id']; + // Load the ini_parser + $app->uses('ini_parser'); + // Get server configuration + $conf["serverconfig"] = $app->ini_parser->parse_ini_string(stripslashes($server_db_record["config"])); + // Set the loglevel + $conf["log_priority"] = intval($conf["serverconfig"]["server"]["loglevel"]); + + unset($server_db_record); +} + + +// Check if another process is running +if(is_file($conf["temppath"].$conf["fs_div"].".ispconfig_lock")){ + clearstatcache(); + for($i=0;$i<120;$i++){ // Wait max. 1200 sec, then proceed + if(is_file($conf["temppath"].$conf["fs_div"].".ispconfig_lock")){ + exec("ps aux | grep '/usr/local/ispconfig/server/server.php' | grep -v 'grep' | wc -l", $check); + if(intval($check[0]) > 1) { // 1 because this is 2nd instance! + $app->log("There is already an instance of server.php running. Exiting.", LOGLEVEL_DEBUG); + exit; + } + $app->log("There is already a lockfile set. Waiting another 10 seconds...", LOGLEVEL_DEBUG); + sleep(10); + clearstatcache(); + } + } +} + +// Set Lockfile +@touch($conf["temppath"].$conf["fs_div"].".ispconfig_lock"); +$app->log("Set Lock: ".$conf["temppath"].$conf["fs_div"].".ispconfig_lock", LOGLEVEL_DEBUG); + + +if($app->db->connect() && $app->dbmaster->connect()) { + + // Check if there is anything to update + if($conf["mirror_server_id"] > 0) { + $tmp_rec = $app->dbmaster->queryOneRecord("SELECT count(server_id) as number from sys_datalog WHERE datalog_id > ".$conf['last_datalog_id']." AND (server_id = ".$conf["server_id"]." OR server_id = ".$conf["mirror_server_id"]." OR server_id = 0)"); + } else { + $tmp_rec = $app->dbmaster->queryOneRecord("SELECT count(server_id) as number from sys_datalog WHERE datalog_id > ".$conf['last_datalog_id']." AND (server_id = ".$conf["server_id"]." OR server_id = 0)"); + } + + $tmp_num_records = $tmp_rec["number"]; + unset($tmp_rec); + + if($tmp_num_records > 0) { + /* + There is something to do, triggert by the database -> do it! + */ + // Write the Log + $app->log("Found $tmp_num_records changes, starting update process.", LOGLEVEL_DEBUG); + // Load required base-classes + $app->uses('modules,plugins,file,services'); + // Load the modules that are im the mods-enabled folder + $app->modules->loadModules('all'); + // Load the plugins that are in the plugins-enabled folder + $app->plugins->loadPlugins('all'); + // Go trough the sys_datalog table and call the processing functions + // in the modules that are hooked on to the table actions + $app->modules->processDatalog(); + // Restart services that need to be restarted after configuration + $app->services->processDelayedActions(); + } else { + /* + There is no trigger inside the database -> load only the core, maybe they have to do something + */ + // Write the log + $app->log('No Updated records found, starting only the core.', LOGLEVEL_DEBUG); + // Load required base-classes + $app->uses('modules,plugins,file,services'); + // Load the modules that are im the mods-core folder + $app->modules->loadModules('core'); + // Load the plugins that are in the plugins-core folder + $app->plugins->loadPlugins('core'); + } +} else { + if(!$app->db->connect()) { + $app->log("Unable to connect to local server.".$app->db->errorMessage,LOGLEVEL_WARN); + } else { + $app->log("Unable to connect to master server.".$app->dbmaster->errorMessage,LOGLEVEL_WARN); + } +} + +// Remove lock +@unlink($conf["temppath"].$conf["fs_div"].".ispconfig_lock"); +$app->log("Remove Lock: ".$conf["temppath"].$conf["fs_div"].".ispconfig_lock",LOGLEVEL_DEBUG); + + +die("finished.\n"); +?> diff --git a/interface/ispconfig/server/server.sh b/interface/ispconfig/server/server.sh new file mode 100644 index 0000000000000000000000000000000000000000..cabfd6968d9bdfe3469830304b4b90b933799a83 --- /dev/null +++ b/interface/ispconfig/server/server.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin:/usr/local/bin:/usr/X11R6/bin + +. /etc/profile + +/usr/bin/php -q /usr/local/ispconfig/server/server.php \ No newline at end of file diff --git a/interface/ispconfig/vpproject/ispconfig.vpppath b/interface/ispconfig/vpproject/ispconfig.vpppath new file mode 100644 index 0000000000000000000000000000000000000000..674693ddbd28438cf08b73f18011dc631088a714 --- /dev/null +++ b/interface/ispconfig/vpproject/ispconfig.vpppath @@ -0,0 +1 @@ +C:\Users\ajaouni\Desktop\uml\vpproject.vpp \ No newline at end of file