diff --git a/.gitignore b/.gitignore index 3317dca5..866d200a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,14 +1,13 @@ admin/admin_suggest_articles.php admin/archive.php +admin/custom_statuses.php +admin/email_templates.php admin/generate_spam_question.php admin/priority.php admin/test_connection.php attachments/index.htm -docs/changelog.html -docs/docs_style.css -docs/index.html -docs/quick-guide.html -docs/step-by-step-guide.html +cache/ +docs/ file_limits.php footer.txt header.txt @@ -27,6 +26,7 @@ img/clip.png img/code.png img/code_off.png img/delete.png +img/delete_off.png img/delete_ticket.png img/edit.png img/error.png @@ -114,6 +114,7 @@ img/print.png img/private.png img/public.png img/reload.png +img/refresh.png img/roundcornersb.jpg img/roundcornerslb.jpg img/roundcornerslm.jpg @@ -156,10 +157,11 @@ inc/calendar/tcal.js inc/calendar/tcal.php inc/database.inc.php inc/database_mysqli.inc.php -inc/footer.inc.php inc/htmlpurifier inc/index.htm +inc/jscolor/ inc/mail/email_parser.php +inc/mail/hesk_imap.php inc/mail/hesk_pipe.php inc/mail/hesk_pop3.php inc/mail/index.htm @@ -184,6 +186,7 @@ inc/recaptcha/recaptchalib.php inc/reporting_functions.inc.php inc/secimg.inc.php inc/setup_functions.inc.php +inc/statuses.inc.php inc/tabs/index.htm inc/tabs/tabber-minimized.js inc/tabs/tabber.css diff --git a/admin/admin_main.php b/admin/admin_main.php index 48126683..58775298 100644 --- a/admin/admin_main.php +++ b/admin/admin_main.php @@ -1,32 +1,15 @@ - -
-
- -
-

' . $hesklang['open_tickets'] . ' ' . $hesklang['nti'] . '

-
'; // The rest of the panel will be printed by print_tickets.inc.php +
+ +
+
+

+ +

+
+ +
+
+
+
+ +
+
+ '; + /* Print forms for listing and searching tickets */ + require(HESK_PATH . 'inc/show_search_form.inc.php'); + } else { + echo '

' . $hesklang['na_view_tickets'] . '

'; } - - /* Reset default settings? */ - if (isset($_GET['reset']) && hesk_token_check()) { - $res = hesk_dbQuery("UPDATE `" . hesk_dbEscape($hesk_settings['db_pfix']) . "users` SET `default_list`='' WHERE `id` = '" . intval($_SESSION['id']) . "' LIMIT 1"); - $_SESSION['default_list'] = ''; - } /* Get default settings */ - else { - parse_str($_SESSION['default_list'], $defaults); - $_GET = isset($_GET) && is_array($_GET) ? array_merge($_GET, $defaults) : $defaults; - } - - /* Print the list of tickets */ - require(HESK_PATH . 'inc/print_tickets.inc.php'); - - echo " 
"; - - /* Print forms for listing and searching tickets */ - require(HESK_PATH . 'inc/show_search_form.inc.php'); - } else { - echo '

' . $hesklang['na_view_tickets'] . '

'; - } - - $hesk_settings['hesk_license']('HMgPSAxOw0KaWYgKGZpbGVfZXhpc3RzKEhFU0tfUEFUSCAuI + ?> +
+
+  
'; - - /* Clean unneeded session variables */ - hesk_cleanSessionVars('hide'); - ?> -
-
+ /* Clean unneeded session variables */ + hesk_cleanSessionVars('hide'); + ?> + If locked, keep it resolved if ($ticket['locked']) { $new_status = $lockedTicketStatus['ID']; @@ -248,7 +237,7 @@ if ($ticket['locked']) { $newStatusRs = hesk_dbQuery('SELECT `IsClosed`, `Key` FROM `' . hesk_dbEscape($hesk_settings['db_pfix']) . 'statuses` WHERE `ID` = ' . hesk_dbEscape($new_status)); $newStatus = hesk_dbFetchAssoc($newStatusRs); - if ($newStatus['IsClosed']) { + if ($newStatus['IsClosed'] && hesk_checkPermission('can_resolve', 0)) { $revision = sprintf($hesklang['thist3'], hesk_date(), $_SESSION['name'] . ' (' . $_SESSION['user'] . ')'); $sql_status = " , `closedat`=NOW(), `closedby`=" . intval($_SESSION['id']) . ", `history`=CONCAT(`history`,'" . hesk_dbEscape($revision) . "') "; @@ -257,7 +246,7 @@ if ($ticket['locked']) { $sql_status .= " , `locked`='1' "; } } else { - // Ticket isn't being closed, just add the history to the sql query + // Ticket isn't being closed, just add the history to the sql query (or tried to close but doesn't have permission) $revision = sprintf($hesklang['thist9'], hesk_date(), $hesklang[$newStatus['Key']], $_SESSION['name'] . ' (' . $_SESSION['user'] . ')'); $sql_status = " , `history`=CONCAT(`history`,'" . hesk_dbEscape($revision) . "') "; } @@ -310,12 +299,12 @@ $sql .= " , `replies`=`replies`+1 "; $sql .= $submit_as_customer ? '' : " , `staffreplies`=`staffreplies`+1 "; // End and execute the query -$sql .= " WHERE `id`='{$replyto}' LIMIT 1"; +$sql .= " WHERE `id`='{$replyto}'"; hesk_dbQuery($sql); unset($sql); /* Update number of replies in the users table */ -hesk_dbQuery("UPDATE `" . hesk_dbEscape($hesk_settings['db_pfix']) . "users` SET `replies`=`replies`+1 WHERE `id`='" . intval($_SESSION['id']) . "' LIMIT 1"); +hesk_dbQuery("UPDATE `" . hesk_dbEscape($hesk_settings['db_pfix']) . "users` SET `replies`=`replies`+1 WHERE `id`='" . intval($_SESSION['id']) . "'"); // --> Prepare reply message @@ -357,7 +346,7 @@ elseif (!isset($_POST['no_notify']) || intval(hesk_POST('no_notify')) != 1) { } // Delete any existing drafts from this owner for this ticket -hesk_dbQuery("DELETE FROM `" . hesk_dbEscape($hesk_settings['db_pfix']) . "reply_drafts` WHERE `owner`=" . intval($_SESSION['id']) . " AND `ticket`=" . intval($ticket['id']) . " LIMIT 1"); +hesk_dbQuery("DELETE FROM `" . hesk_dbEscape($hesk_settings['db_pfix']) . "reply_drafts` WHERE `owner`=" . intval($_SESSION['id']) . " AND `ticket`=" . intval($ticket['id'])); /* Set reply submitted message */ $_SESSION['HESK_SUCCESS'] = TRUE; diff --git a/admin/admin_settings.php b/admin/admin_settings.php index b19f7018..f29d028d 100644 --- a/admin/admin_settings.php +++ b/admin/admin_settings.php @@ -1,32 +1,15 @@ +// Check file attachment limits +if ($hesk_settings['attachments']['use'] && !defined('HESK_DEMO')) { + // Check number of attachments per post + if (version_compare(phpversion(), '5.2.12', '>=') && @ini_get('max_file_uploads') && @ini_get('max_file_uploads') < $hesk_settings['attachments']['max_number']) { + hesk_show_notice($hesklang['fatte1']); + } -
-
-
-
+ // Check max attachment size + $tmp = @ini_get('upload_max_filesize'); + if ($tmp) { + $last = strtoupper(substr($tmp, -1)); + + switch ($last) { + case 'K': + $tmp = $tmp * 1024; + break; + case 'M': + $tmp = $tmp * 1048576; + break; + case 'G': + $tmp = $tmp * 1073741824; + break; + default: + $tmp = $tmp; + } + + if ($tmp < $hesk_settings['attachments']['max_size']) { + hesk_show_notice($hesklang['fatte2']); + } + } + + // Check max post size + $tmp = @ini_get('post_max_size'); + if ($tmp) { + $last = strtoupper(substr($tmp, -1)); + + switch ($last) { + case 'K': + $tmp = $tmp * 1024; + break; + case 'M': + $tmp = $tmp * 1048576; + break; + case 'G': + $tmp = $tmp * 1073741824; + break; + default: + $tmp = $tmp; + } + + if ($tmp < ($hesk_settings['attachments']['max_size'] * $hesk_settings['attachments']['max_number'] + 524288)) { + hesk_show_notice($hesklang['fatte3']); + } + } +} + + +$hesklang['err_custname'] = addslashes($hesklang['err_custname']); + +$modsForHesk_settings = mfh_getSettings(); +?> + +
+ +
+
+

+ +

+
+ +
+
+
+ + + + +
@@ -163,7 +372,11 @@ if (defined('HESK_DEMO')) { ' . $hesklang['beta'] . ' '; ?> ' . $hesklang['mfh_up_to_date'] . ''; } else { ?> -
+ / + + ' . $hesklang['exists'] . ', '; + if ($attachmentsWritable) { + $enable_use_attachments = 1; + echo '' . $hesklang['writable'] . ''; + } else { + echo '' . $hesklang['not_writable'] . '
' . $hesklang['e_cdir']; + } + } else { + echo '' . $hesklang['no_exists'] . ', ' . $hesklang['not_writable'] . '
' . $hesklang['e_cdir']; + } + ?> +
-
- + + + +
- // Check file attachment limits - if ($hesk_settings['attachments']['use'] && !defined('HESK_DEMO')) { - // Check number of attachments per post - if (version_compare(phpversion(), '5.2.12', '>=') && @ini_get('max_file_uploads') && @ini_get('max_file_uploads') < $hesk_settings['attachments']['max_number']) { - hesk_show_notice($hesklang['fatte1']); - } + +
+
+

+ +

+
+ +
+
+
+

- // Check max attachment size - $tmp = @ini_get('upload_max_filesize'); - if ($tmp) { - $last = strtoupper(substr($tmp, -1)); +
+ - switch ($last) { - case 'K': - $tmp = $tmp * 1024; - break; - case 'M': - $tmp = $tmp * 1048576; - break; - case 'G': - $tmp = $tmp * 1073741824; - break; - default: - $tmp = $tmp; - } - - if ($tmp < $hesk_settings['attachments']['max_size']) { - hesk_show_notice($hesklang['fatte2']); - } - } - - // Check max post size - $tmp = @ini_get('post_max_size'); - if ($tmp) { - $last = strtoupper(substr($tmp, -1)); - - switch ($last) { - case 'K': - $tmp = $tmp * 1024; - break; - case 'M': - $tmp = $tmp * 1048576; - break; - case 'G': - $tmp = $tmp * 1073741824; - break; - default: - $tmp = $tmp; - } - - if ($tmp < ($hesk_settings['attachments']['max_size'] * $hesk_settings['attachments']['max_number'] + 524288)) { - hesk_show_notice($hesklang['fatte3']); - } - } - } - - - $hesklang['err_custname'] = addslashes($hesklang['err_custname']); - - $modsForHesk_settings = mfh_getSettings(); - ?> - - -

- -
- - - - - - -
- -
-
- -
- -
- - -
- -
+
+
-
- +
+
+ -
- -
+
+
-
-
+
+ + + + -
- -
+
+
-
- +
+
+ -
- -
+
+
-
- +
+
+ -
- -
+
+
-
- +
+
+ -
- -
-
- -
- -
-
- - -
- -   - -
-
-
- - -
-
-
'; - ?> -
-
- -
- -
- -
- - -
- -
-
-
- - -
- -
-
-
- - -
- -
-
-
- - -
- -
-
-
- - -
- -
-
-
-
- - - - - - -
+
+
- -
-
+

-
+
+
+ -
- - -
- -
+
+ +   +
-
- +
+
+ -
- -
+
+
+
'; + ?>
-
- +
-
- -
+

+ +
+ + +
+
-
- +
+
+ -
- -
+
+
-
- +
+
+ -
- -
+
+
-
- +
+
+ -
- -
+
+
-
- +
+
+ -
- -
+
+
-
- - -
- +
+
+
+ + + -
-
- -
- + function hesk_testMySQL() { + var element = document.getElementById('mysql_test'); + element.innerHTML = ' '; + element.style.display = 'block'; + + var s_db_host = document.getElementById('m1').value; + var s_db_name = document.getElementById('m2').value; + var s_db_user = document.getElementById('m3').value; + var s_db_pass = document.getElementById('m4').value; + var s_db_pfix = document.getElementById('m5').value; + + var params = "test=mysql" + + "&s_db_host=" + encodeURIComponent(s_db_host) + + "&s_db_name=" + encodeURIComponent(s_db_name) + + "&s_db_user=" + encodeURIComponent(s_db_user) + + "&s_db_pass=" + encodeURIComponent(s_db_pass) + + "&s_db_pfix=" + encodeURIComponent(s_db_pfix); + + xmlHttp = GetXmlHttpObject(); + if (xmlHttp == null) { + return; + } + + xmlHttp.open('POST', 'test_connection.php', true); + xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); + xmlHttp.setRequestHeader("Content-length", params.length); + xmlHttp.setRequestHeader("Connection", "close"); + + xmlHttp.onreadystatechange = function () { + if (xmlHttp.readyState == 4 && xmlHttp.status == 200) { + element.innerHTML = xmlHttp.responseText; + } + } + + xmlHttp.send(params); + } + + +
+
+
+
+ + +
+
+

+ +

+
+ +
+
+
+

+
+ + +
+ +
+
+
+ + +
+ +
+
+
+ + +
+ +
+
+
+ + +
+ +
+
+
+ + +
+ +
+
+
+ + +
+ +
+
+
+ + +
+ +
+
+
+ + +
+ +
+
+
+ + +
+ +
+
+
+ + +
+
'; - ?> -
+ ?>
-
- +
+
+ -
- +
'; - ?> -
+ ?>
+
-
+

+
+
+
+ -
-
-
-
- - -
- +
   
'; - ?> -
+ ?>
-
- +
+
+ -
- +
    +
'; + ?> +
+
+
+ + +
+
    +
'; + ?> +
+
+
+ + +
+
    +
    +
'; + ?> +
+
+
+ + +
+
   
'; - ?> -
+ ?>
-
- +
+
+ -
- +
   
'; - ?> -
+ ?>
-
- +
+
+ -
- +
   
'; - ?> -
+ ?>
-
- +
+
+ -
- +
   
'; - ?> -
+ ?>
-
- +
+
+ -
- +
   
'; - ?> -
+ ?>
-
- +
+
+ -
- +
   
'; - ?> -
+ ?>
-
-
+
+ + + + -
- +
'; - ?> -
+ ?>
-
-
+
+ + + + -
- +
   
   
'; - ?> -
+ ?>
-
-
+
+ + + + -
- +
'; - ?> -
+ ?>
-
-
+
+ + + + -
- +
'; - ?> -
-
-
- -
-
- - -
-
    -
'; - ?> -
-
-
- - -
-
    -
'; - ?> -
-
-
- - -
-
    -
'; - ?> -
-
-
- - -
-
    -
'; - ?> -
-
-
- - -
-
    -
'; - ?> -
-
-
- - -
-
    -
'; - ?> -
-
-
- - -
-
- -
-
- -
-
-
-
- - -
- -
- -
- -
+ ?>
+ +
+
+ -
+
+
    +
'; + ?> +
+
+
+ -
+
+
    +
    +
'; + ?> +
+
+
+ -
- +
+
    +
'; + ?> +
+
+
+ -
- +
    +
'; + ?> +
+
+
+ - echo ' +
+
    +
'; + ?> +
+
+
+ + +
+
    +
'; + ?> +
+ +
+ + +
+
    +
'; + ?> +
+ +
+ + +
+
+ +
+
+ +
+
+
+
+ + +
+ +
+ +
+ +
+
+
+ + +
+ + +
+
+ + + +

+
+ + +
+
   
   
'; - ?> -
+ ?> +
-  
+  
- :
+ :
- - -
-
- -
-
- -
-
- -
- -  
- - -
-  
- - -
-  
-
-
-
-
-
- - -
    -
'; ?> -
-  
-
+
+
-
+
+
+ +
+
+ +
+ +  
+ + +
+  
+ + +
+  
+
+
+
+ +
+ + +
+
    +
'; + ?> + +
+  
+
+ +

-  
+  
-
-
-  
+
+
+  
-
-
-
+ +

+
+ -
+
+ +
+
+
+ -
- +
+ +
+
+
+ -
- +
+
+
-
- +
+
+ -
- +
+
+
-
- +
+
+ -
-
- -
+
+
+
-
- +
+
+ -
-
- -
+
+
+ + + +
-
-
+
+ + + + -
-
- -
+
+
+
-
-
- -
- -
- - -
- -
    -
- - - -   () - - - ' . $hesklang['e_attach'] . ''; - } - ?> -
-
-
- - -
- /> -
-
-
- $hesklang['B'] . ' (' . $hesklang['bytes'] . ')', - 'kB' => $hesklang['kB'] . ' (' . $hesklang['kilobytes'] . ')', - 'MB' => $hesklang['MB'] . ' (' . $hesklang['megabytes'] . ')', - 'GB' => $hesklang['GB'] . ' (' . $hesklang['gigabytes'] . ')', - ); - $tmp = hesk_formatBytes($hesk_settings['attachments']['max_size'], 0); - list($size, $unit) = explode(' ', $tmp); - ?> - - -
- /> -
-
- -
-
-
- - -
- /> -
-
-
-
-
+

+
+ -
-
- +
+ +
    +
-
+ +   () + + + ' . $hesklang['e_attach'] . ''; + } + ?> +
+
+
+ + +
+ /> +
+
+
+ $hesklang['B'] . ' (' . $hesklang['bytes'] . ')', + 'kB' => $hesklang['kB'] . ' (' . $hesklang['kilobytes'] . ')', + 'MB' => $hesklang['MB'] . ' (' . $hesklang['megabytes'] . ')', + 'GB' => $hesklang['GB'] . ' (' . $hesklang['gigabytes'] . ')', + ); + $tmp = hesk_formatBytes($hesk_settings['attachments']['max_size'], 0); + list($size, $unit) = explode(' ', $tmp); + ?> + + +
+ /> +
+
+ +
+
+
+ + +
+ /> +
+
+
+
+ + +
+
+

+ +

+
+ +
+
+
+
+ + +
+


'; - ?> -
+ ?>
+
-
-
-
- +
+
+ -
- +
   
'; - ?> -
+ ?>
-
- +
+
+ -
- +
   
   
'; - ?> -
-
-
- - -
- -
-
-
- - -
- -
-
-
- - -
- -
-
-
- - -
- -
-
-
- - -
- -
-
-

-
-
-
-
- -
-
-

-
-
-
- - -
- -
-
-

-
-
-
-
- -
-
-

-
-
-
- - -
- -
-
-

-
+ ?>
+
+ - -
-
-
-
- -
- + +
+
+
+ + +
+ +
+
+
+ + +
+ +
+
+
+ + +
+ +
+
+
+ + +
+ +
+
+

+
+
+
+
+ +
+
+

+
+
+
+ + +
+ +
+
+

+
+
+
+
+ +
+
+

+
+
+
+ + +
+ +
+
+

+
+
+
+
+ + +
+
+

+ + + + +

+
+ +
+
+
+

+
+ +
+


'; - ?> -
-
-
- -
- -
-
-
- -
- -
-
-
- - -
-
- -
- - -
- - -
-
- -
-
-
- - - - - - - - - - - - - - - - - - - - '; - } // End FOR ?> -
- -
- -
-

-
-
- - - ' . $hesklang['opt'] . ' -
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+ +
+
+

+ +

+
+ +
+
+
+

- -
-
+
+ -
+
+ - + if ($hesk_settings['smtp']) { + $on = 'checked="checked"'; + $onload_div = 'block'; + } elseif ($modsForHesk_settings['use_mailgun']) { + $mailgunOn = 'checked="checked"'; + $onload_mailgun = 'block'; + } else { + $off = 'checked="checked"'; + $onload_status = ' disabled="disabled" '; + } -
-
'; - ?> - - - - - - - + ?> + + + + + + + -
-
-
-
- - -
- -
-
-
- - -
- -
-
-
-
-
- - -
- /> -
-
-
- - -
- /> -
-
-
- - -
- /> -
-
-
- - -
-
    -
'; - ?> -
-
-
- - -
-
    -
'; - ?> -
-
-
- - -
- - autocomplete="off"/> -
-
-
- - -
- - autocomplete="off"/> -
-
-
-
- -
-
- - - - - - -
- - -
- -
- +
+
-
+
+ + +
+ +
+
+
+
+
+ + +
+ /> +
+
+
+ + +
+ /> +
+
+
+ + +
+ /> +
+
+
+
    -
'; +
    +
'; ?>
- -
- -
-
- + +
+
    +
'; + ?> +
+
+
+ + +
+ + autocomplete="off"/> +
+
+
+ + +
+ + autocomplete="off"/> +
+
+
+
+ +
+
+ + + + + + + +
+ + +

+
+ + +
+
    +
'; + ?> +
+
+ +

+
+ + +
+
    +
'; + ?> + + + + + + +
+
+
+
+ + +
+ /> +
+
+
+ -
-
    -
'; - ?> - - - - - - +
+ />
-
-
- +
+ -
- /> -
+
+ />
-
- +
+
+ -
- /> -
-
-
- - -
- /> -
-
-
- - -
- +
   
'; - ?> -
-
-
- - -
-
-
'; - ?> -
-
-
- - -
- - autocomplete="off"/> -
-
-
- - -
- - autocomplete="off"/> -
-
-
-
- -
-
- - - - - - - - - -
 
- - - - - - - -
- - -
- -
- -
- - -
- + ?>
- - -
- -
-
-

-
-
- -
- -
- -
-
    -
'; +
+
'; ?>
-
-
- +
+ -
+
+ + autocomplete="off"/> +
+
+
+ + +
+ + autocomplete="off"/> +
+
+
+
+ +
+
+ + + + + + + + + +
 
+ + + + + + +
+ + + +

+ +
+ + +
+
    +
'; + ?> + + + + + + +
+
+
+
+ + +
+ > +
+
+
+ + +
+ > +
+
+
+ + +
+ > +
+
+
+ + +
+
    +
    +
+ '; + ?> +
+
+
+ + +
+
    +
+ '; + ?> +
+
+
+ + +
+ autocomplete="off"> +
+
+
+ + +
+ autocomplete="off"> +
+
+
+
+ +
+
+ + + + + + + +
+ +

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

+
+
+ +

+
+ + +
+
    +
'; + ?> +
+ +
+
+ + +
-
- - - - - -
+ + + + + +
+ -
+

+
+ -
+
+
+ +
+
+
+
- - -
+
- + } ?>/>
-
-
-
-
-
-
- -
-
-
-
-
- - -
-
- -
-
-
- -
- -
- -
- - -
-
- -
-
-
-
- - -
-
- -
-
-
-
- - -
-
- -
-
-
-
- - -
-
- - - - - - -
-
-
-
- - -
-
- -
-
-
-
- - -
-
- -
-
-
-
- - -
-
- -
-
-
-
- - -
-
- -
-
- -
-
-
-
- - -
-
- - -
- $title) { - echo ' -
- -
- '; - } - ?> -
-
-
- - -
-
- -
-
-
-
-
- - -
-

-

-
'; - ?> -
-
-
- - -
-

-

-
'; - ?> -
-
- - - -
-
- -
- -
- - -
-

' . $server_time . ''; ?>

- -
-
-
-
-
- -
-
-

-
-
-
-
- -
-
-

-
-
-
-
- - -
-
    -
'; - ?> -
-
-
- - -
- -
-
- -
- -
- -
- - -
- -
-
-
- -
- - -
-
- -
-
-
-
- - -
-
- -
-
-
-
- - -
-
- -
-
-
-
- - -
-
- -
-
-
- -
-
-
- - -
-
- -
-
-
-
- - -
-
- -
-
-
-
- - -
-
- -
-
-
-
- - -
-
- -
-
-
- - -
-
- -
-
-
-
- - -
- -
-
-
-
-
- - -
- -
-
-
-
-
-
-
- - -
- -
-
-
-
-
- - -
- -
-
-
-
-
-
-
- - -
- -
-
-
-
-
- - -
- -
-
-
-
-
-
-
- - -
- -
-
-
-
-
- - -
- -
-
-
-
-
-
-
- - -
- -
-
-
-
-
- - -
- -
-
-
-
-
-
-
- - -
- -
-
-
-
- + + +
+
+ +
+
+
+ +

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

+ +

+
+ +
+
+
+
+ + +
'; - } else { - echo '
' . $hesklang['e_save_settings'] . ''; + // List available fields + foreach ($hesk_settings['possible_ticket_list'] as $key => $title) { + echo ' +
+ +
+ '; } ?>
+
+ + +
+
+ +
+
+
+
+ + +
+

+

+
'; + ?> +
+
+
+ + +
+

+

+
'; + ?> +
+
- - + + + +
+
+

+ +

+
+ +
+
+
+

+
+ + +
+

' . $server_time . ''; ?>

+ +
+
+
+
+
+ +
+
+

+
+
+
+
+ +
+
+

+
+
+
+
+ + +
+
    +
'; + ?> +
+
+
+ + +
+ +
+
+ +

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

+ + + + +

+
+ +
+
+
+

Common Properties

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

Customer View

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

Admin Panel

+
+
+
+ + +
+ +
+ +
+
+
+
+
+
+ + '; + } else { + echo '
' . $hesklang['e_save_settings'] . ''; + } + ?> +
+ + WRONG VERSION (not " . $hesk_settings['hesk_version'] . ")\n"; } diff --git a/admin/admin_settings_save.php b/admin/admin_settings_save.php index 4b9cb092..be46d35a 100644 --- a/admin/admin_settings_save.php +++ b/admin/admin_settings_save.php @@ -1,32 +1,15 @@ Database settings */ -hesk_dbClose(); - if (hesk_testMySQL()) { // Database connection OK } elseif ($mysql_log) { @@ -125,6 +105,7 @@ if ( ! is_writable(HESK_PATH . $set['attach_dir']) ) } */ +$set['cache_dir'] = isset($_POST['s_cache_dir']) && ! is_array($_POST['s_cache_dir']) ? preg_replace('/[^a-zA-Z0-9_-]/', '', $_POST['s_cache_dir']) : 'cache'; $set['max_listings'] = hesk_checkMinMax(intval(hesk_POST('s_max_listings')), 1, 999, 10); $set['print_font_size'] = hesk_checkMinMax(intval(hesk_POST('s_print_font_size')), 1, 99, 12); $set['autoclose'] = hesk_checkMinMax(intval(hesk_POST('s_autoclose')), 0, 999, 7); @@ -135,6 +116,10 @@ $set['reply_top'] = empty($_POST['s_reply_top']) ? 0 : 1; /* --> Features */ $set['autologin'] = empty($_POST['s_autologin']) ? 0 : 1; $set['autoassign'] = empty($_POST['s_autoassign']) ? 0 : 1; +$set['require_email'] = empty($_POST['s_require_email']) ? 0 : 1; +$set['require_owner'] = empty($_POST['s_require_owner']) ? 0 : 1; +$set['require_subject'] = hesk_checkMinMax( intval( hesk_POST('s_require_subject') ) , -1, 1, 1); +$set['require_message'] = hesk_checkMinMax( intval( hesk_POST('s_require_message') ) , -1, 1, 1); $set['custclose'] = empty($_POST['s_custclose']) ? 0 : 1; $set['custopen'] = empty($_POST['s_custopen']) ? 0 : 1; $set['rating'] = empty($_POST['s_rating']) ? 0 : 1; @@ -147,6 +132,7 @@ $set['debug_mode'] = empty($_POST['s_debug_mode']) ? 0 : 1; $set['short_link'] = empty($_POST['s_short_link']) ? 0 : 1; $set['select_cat'] = empty($_POST['s_select_cat']) ? 0 : 1; $set['select_pri'] = empty($_POST['s_select_pri']) ? 0 : 1; +$set['cat_show_select'] = hesk_checkMinMax( intval( hesk_POST('s_cat_show_select') ) , 0, 999, 10); /* --> SPAM prevention */ $set['secimg_use'] = empty($_POST['s_secimg_use']) ? 0 : (hesk_POST('s_secimg_use') == 2 ? 2 : 1); @@ -168,7 +154,14 @@ if ($set['attempt_limit'] > 0) { } $set['attempt_banmin'] = hesk_checkMinMax(intval(hesk_POST('s_attempt_banmin')), 5, 99999, 60); $set['reset_pass'] = empty($_POST['s_reset_pass']) ? 0 : 1; -$set['email_view_ticket'] = empty($_POST['s_email_view_ticket']) ? 0 : 1; +$set['email_view_ticket'] = ($set['require_email'] == 0) ? 0 : (empty($_POST['s_email_view_ticket']) ? 0 : 1); +$set['x_frame_opt'] = empty($_POST['s_x_frame_opt']) ? 0 : 1; +$set['force_ssl'] = HESK_SSL && isset($_POST['s_force_ssl']) && $_POST['s_force_ssl'] == 1 ? 1 : 0; + +// Make sure help desk URL starts with https if forcing SSL +if ($set['force_ssl']) { + $set['hesk_url'] = preg_replace('/^http:/i', 'https:', $set['hesk_url']); +} /* --> Attachments */ $set['attachments']['use'] = empty($_POST['s_attach_use']) ? 0 : 1; @@ -246,7 +239,7 @@ if ($set['smtp']) { $set['smtp'] = 0; } } else { - $set['smtp_host_name'] = hesk_input(hesk_POST('tmp_smtp_host_name', 'mail.domain.com')); + $set['smtp_host_name'] = hesk_input(hesk_POST('tmp_smtp_host_name', 'mail.example.com')); $set['smtp_host_port'] = intval(hesk_POST('tmp_smtp_host_port', 25)); $set['smtp_timeout'] = intval(hesk_POST('tmp_smtp_timeout', 10)); $set['smtp_ssl'] = empty($_POST['tmp_smtp_ssl']) ? 0 : 1; @@ -279,7 +272,7 @@ if ($set['pop3']) { } } else { $set['pop3_job_wait'] = intval(hesk_POST('s_pop3_job_wait', 15)); - $set['pop3_host_name'] = hesk_input(hesk_POST('tmp_pop3_host_name', 'mail.domain.com')); + $set['pop3_host_name'] = hesk_input(hesk_POST('tmp_pop3_host_name', 'mail.example.com')); $set['pop3_host_port'] = intval(hesk_POST('tmp_pop3_host_port', 110)); $set['pop3_tls'] = empty($_POST['tmp_pop3_tls']) ? 0 : 1; $set['pop3_keep'] = empty($_POST['tmp_pop3_keep']) ? 0 : 1; @@ -287,6 +280,32 @@ if ($set['pop3']) { $set['pop3_password'] = hesk_input(hesk_POST('tmp_pop3_password')); } +/* --> IMAP fetching */ +$imap_OK = true; +$set['imap'] = empty($_POST['s_imap']) ? 0 : 1; + +if ($set['imap']) { + // Get IMAP fetching timeout + $set['imap_job_wait'] = hesk_checkMinMax( intval( hesk_POST('s_imap_job_wait') ) , 0, 1440, 15); + + // Test IMAP connection + $imap_OK = hesk_testIMAP(true); + + // If IMAP not working, disable it + if ( ! $imap_OK) { + $set['imap'] = 0; + } +} else { + $set['imap_job_wait'] = intval( hesk_POST('s_imap_job_wait', 15) ); + $set['imap_host_name'] = hesk_input( hesk_POST('tmp_imap_host_name', 'mail.example.com') ); + $set['imap_host_port'] = intval( hesk_POST('tmp_imap_host_port', 110) ); + $set['imap_enc'] = hesk_POST('tmp_imap_enc'); + $set['imap_enc'] = ($set['imap_enc'] == 'ssl' || $set['imap_enc'] == 'tls') ? $set['imap_enc'] : ''; + $set['imap_keep'] = empty($_POST['tmp_imap_keep']) ? 0 : 1; + $set['imap_user'] = hesk_input( hesk_POST('tmp_imap_user') ); + $set['imap_password'] = hesk_input( hesk_POST('tmp_imap_password') ); +} + /* --> Email loops */ $set['loop_hits'] = hesk_checkMinMax(intval(hesk_POST('s_loop_hits')), 0, 999, 5); $set['loop_time'] = hesk_checkMinMax(intval(hesk_POST('s_loop_time')), 1, 86400, 300); @@ -323,10 +342,10 @@ if (!empty($_POST['s_email_providers']) && !is_array($_POST['s_email_providers'] if (!$set['detect_typos'] || count($set['email_providers']) < 1) { $set['detect_typos'] = 0; - $set['email_providers'] = array('gmail.com', 'hotmail.com', 'hotmail.co.uk', 'yahoo.com', 'yahoo.co.uk', 'aol.com', 'aol.co.uk', 'msn.com', 'live.com', 'live.co.uk', 'mail.com', 'googlemail.com', 'btinternet.com', 'btopenworld.com'); + $set['email_providers']=array('aim.com','aol.co.uk','aol.com','att.net','bellsouth.net','blueyonder.co.uk','bt.com','btinternet.com','btopenworld.com','charter.net','comcast.net','cox.net','earthlink.net','email.com','facebook.com','fastmail.fm','free.fr','freeserve.co.uk','gmail.com','gmx.at','gmx.ch','gmx.com','gmx.de','gmx.fr','gmx.net','gmx.us','googlemail.com','hotmail.be','hotmail.co.uk','hotmail.com','hotmail.com.ar','hotmail.com.mx','hotmail.de','hotmail.es','hotmail.fr','hushmail.com','icloud.com','inbox.com','laposte.net','lavabit.com','list.ru','live.be','live.co.uk','live.com','live.com.ar','live.com.mx','live.de','live.fr','love.com','lycos.com','mac.com','mail.com','mail.ru','me.com','msn.com','nate.com','naver.com','neuf.fr','ntlworld.com','o2.co.uk','online.de','orange.fr','orange.net','outlook.com','pobox.com','prodigy.net.mx','qq.com','rambler.ru','rocketmail.com','safe-mail.net','sbcglobal.net','t-online.de','talktalk.co.uk','tiscali.co.uk','verizon.net','virgin.net','virginmedia.com','wanadoo.co.uk','wanadoo.fr','yahoo.co.id','yahoo.co.in','yahoo.co.jp','yahoo.co.kr','yahoo.co.uk','yahoo.com','yahoo.com.ar','yahoo.com.mx','yahoo.com.ph','yahoo.com.sg','yahoo.de','yahoo.fr','yandex.com','yandex.ru','ymail.com'); } -$set['email_providers'] = count($set['email_providers']) ? "'" . implode("','", $set['email_providers']) . "'" : ''; +$set['email_providers'] = count($set['email_providers']) ? "'" . implode("','", array_unique($set['email_providers'])) . "'" : ''; /* --> Notify customer when */ @@ -386,7 +405,8 @@ foreach ($hesk_settings['possible_ticket_list'] as $key => $title) { // We need at least one of these: id, trackid, subject if (!in_array('id', $set['ticket_list']) && !in_array('trackid', $set['ticket_list']) && !in_array('subject', $set['ticket_list'])) { - $set['ticket_list'][] = 'trackid'; + // None of the required fields are there, add "trackid" as the first one + array_unshift($set['ticket_list'], 'trackid'); } $set['ticket_list'] = count($set['ticket_list']) ? "'" . implode("','", $set['ticket_list']) . "'" : 'trackid'; @@ -419,49 +439,9 @@ $set['submit_notice'] = empty($_POST['s_submit_notice']) ? 0 : 1; $set['online'] = empty($_POST['s_online']) ? 0 : 1; $set['online_min'] = hesk_checkMinMax(intval(hesk_POST('s_online_min')), 1, 999, 10); $set['check_updates'] = empty($_POST['s_check_updates']) ? 0 : 1; - -/*** CUSTOM FIELDS ***/ - -for ($i = 1; $i <= 20; $i++) { - $this_field = 'custom' . $i; - $set['custom_fields'][$this_field]['use'] = !empty($_POST['s_custom' . $i . '_use']) ? 1 : 0; - - if ($set['custom_fields'][$this_field]['use']) { - $set['custom_fields'][$this_field]['place'] = empty($_POST['s_custom' . $i . '_place']) ? 0 : 1; - $set['custom_fields'][$this_field]['type'] = hesk_htmlspecialchars(hesk_POST('s_custom' . $i . '_type', 'text')); - $set['custom_fields'][$this_field]['req'] = !empty($_POST['s_custom' . $i . '_req']) ? 1 : 0; - $set['custom_fields'][$this_field]['name'] = hesk_input(hesk_POST('s_custom' . $i . '_name'), $hesklang['err_custname']); - $set['custom_fields'][$this_field]['maxlen'] = intval(hesk_POST('s_custom' . $i . '_maxlen', 255)); - $set['custom_fields'][$this_field]['value'] = hesk_input(hesk_POST('s_custom' . $i . '_val')); - - if ($set['custom_fields'][$this_field]['type'] == 'email' && $set['custom_fields'][$this_field]['value'] == '') { - // New custom field without any options set. Default to Cc - $set['custom_fields'][$this_field]['value'] = 'cc'; - } - - if (!in_array($set['custom_fields'][$this_field]['type'], array('text', 'textarea', 'select', 'radio', 'checkbox', 'date', 'multiselect', 'email', 'hidden', 'readonly'))) { - $set['custom_fields'][$this_field]['type'] = 'text'; - } - - // Try to detect if field type changed to anything except "select" - if ($set['custom_fields'][$this_field]['type'] != 'select') { - // If type is "radio" or "checkbox" remove "please select", keep other options - $set['custom_fields'][$this_field]['value'] = str_replace('{HESK_SELECT}', '', $set['custom_fields'][$this_field]['value']); - - // Field type changed to "text" or "textarea", clear default value if it contains "#HESK#" separator - if (in_array($set['custom_fields'][$this_field]['type'], array('text', 'textarea')) && !in_array($hesk_settings['custom_fields'][$this_field]['type'], array('text', 'textarea')) && strpos($set['custom_fields'][$this_field]['value'], '#HESK#') !== false) { - $set['custom_fields'][$this_field]['value'] = ''; - } - } - } else { - $set['custom_fields'][$this_field] = array('use' => 0, 'place' => 0, 'type' => 'text', 'req' => 0, 'name' => 'Custom field ' . $i, 'maxlen' => 255, 'value' => ''); - } -} - $set['hesk_version'] = $hesk_settings['hesk_version']; // Process quick help sections -hesk_dbConnect(); hesk_dbQuery("UPDATE `" . hesk_dbEscape($hesk_settings['db_pfix']) . "quick_help_sections` SET `show` = '0'"); $postArray = hesk_POST_array('quick_help_sections'); foreach ($postArray as $value) { @@ -516,6 +496,7 @@ $set['dropdownItemTextColor'] = hesk_input(hesk_POST('dropdownItemTextColor')); $set['dropdownItemTextHoverColor'] = hesk_input(hesk_POST('dropdownItemTextHoverColor')); $set['questionMarkColor'] = hesk_input(hesk_POST('questionMarkColor')); $set['dropdownItemTextHoverBackgroundColor'] = hesk_input(hesk_POST('dropdownItemTextHoverBackgroundColor')); +$set['admin_color_scheme'] = hesk_input(hesk_POST('admin-color-scheme')); mfh_updateSetting('rtl', $set['rtl']); mfh_updateSetting('show_icons', $set['show-icons']); mfh_updateSetting('custom_field_setting', $set['custom-field-setting']); @@ -552,6 +533,7 @@ mfh_updateSetting('use_mailgun', $set['use_mailgun'], false); mfh_updateSetting('enable_calendar', $set['enable_calendar'], false); mfh_updateSetting('first_day_of_week', $set['first_day_of_week'], false); mfh_updateSetting('default_calendar_view', $set['default_view'], true); +mfh_updateSetting('admin_color_scheme', $set['admin_color_scheme'], true); // Prepare settings file and save it $settings_file_content = ' Features $hesk_settings[\'autologin\']=' . $set['autologin'] . '; $hesk_settings[\'autoassign\']=' . $set['autoassign'] . '; +$hesk_settings[\'require_email\']=' . $set['require_email'] . '; +$hesk_settings[\'require_owner\']=' . $set['require_owner'] . '; +$hesk_settings[\'require_subject\']=' . $set['require_subject'] . '; +$hesk_settings[\'require_message\']=' . $set['require_message'] . '; $hesk_settings[\'custclose\']=' . $set['custclose'] . '; $hesk_settings[\'custopen\']=' . $set['custopen'] . '; $hesk_settings[\'rating\']=' . $set['rating'] . '; @@ -610,6 +597,7 @@ $hesk_settings[\'debug_mode\']=' . $set['debug_mode'] . '; $hesk_settings[\'short_link\']=' . $set['short_link'] . '; $hesk_settings[\'select_cat\']=' . $set['select_cat'] . '; $hesk_settings[\'select_pri\']=' . $set['select_pri'] . '; +$hesk_settings[\'cat_show_select\']=' . $set['cat_show_select'] . '; // --> SPAM Prevention $hesk_settings[\'secimg_use\']=' . $set['secimg_use'] . '; @@ -626,6 +614,8 @@ $hesk_settings[\'attempt_limit\']=' . $set['attempt_limit'] . '; $hesk_settings[\'attempt_banmin\']=' . $set['attempt_banmin'] . '; $hesk_settings[\'reset_pass\']=' . $set['reset_pass'] . '; $hesk_settings[\'email_view_ticket\']=' . $set['email_view_ticket'] . '; +$hesk_settings[\'x_frame_opt\']=' . $set['x_frame_opt'] . '; +$hesk_settings[\'force_ssl\']=' . $set['force_ssl'] . '; // --> Attachments $hesk_settings[\'attachments\']=array ( @@ -635,6 +625,15 @@ $hesk_settings[\'attachments\']=array ( \'allowed_types\' => array(\'' . implode('\',\'', $set['attachments']['allowed_types']) . '\') ); +// --> IMAP Fetching +$hesk_settings[\'imap\']=' . $set['imap'] . '; +$hesk_settings[\'imap_job_wait\']=' . $set['imap_job_wait'] . '; +$hesk_settings[\'imap_host_name\']=\'' . $set['imap_host_name'] . '\'; +$hesk_settings[\'imap_host_port\']=' . $set['imap_host_port'] . '; +$hesk_settings[\'imap_enc\']=\'' . $set['imap_enc'] . '\'; +$hesk_settings[\'imap_keep\']=' . $set['imap_keep'] . '; +$hesk_settings[\'imap_user\']=\'' . $set['imap_user'] . '\'; +$hesk_settings[\'imap_password\']=\'' . $set['imap_password'] . '\'; // ==> KNOWLEDGEBASE @@ -731,22 +730,6 @@ $hesk_settings[\'online_min\']=' . $set['online_min'] . '; $hesk_settings[\'check_updates\']=' . $set['check_updates'] . '; -// ==> CUSTOM FIELDS - -$hesk_settings[\'custom_fields\']=array ( -'; - -for ($i = 1; $i <= 20; $i++) { - $settings_file_content .= '\'custom' . $i . '\'=>array(\'use\'=>' . $set['custom_fields']['custom' . $i]['use'] . ',\'place\'=>' . $set['custom_fields']['custom' . $i]['place'] . ',\'type\'=>\'' . $set['custom_fields']['custom' . $i]['type'] . '\',\'req\'=>' . $set['custom_fields']['custom' . $i]['req'] . ',\'name\'=>\'' . $set['custom_fields']['custom' . $i]['name'] . '\',\'maxlen\'=>' . $set['custom_fields']['custom' . $i]['maxlen'] . ',\'value\'=>\'' . $set['custom_fields']['custom' . $i]['value'] . '\')'; - if ($i != 20) { - $settings_file_content .= ', -'; - } -} - -$settings_file_content .= ' -); - ############################# # DO NOT EDIT BELOW # ############################# @@ -796,14 +779,6 @@ function mfh_updateSetting($key, $value, $isString = false) hesk_dbQuery("UPDATE `" . hesk_dbEscape($hesk_settings['db_pfix']) . "settings` SET `Value` = " . $formattedValue . " WHERE `Key` = '" . $key . "'"); } -function hesk_checkMinMax($myint, $min, $max, $defval) -{ - if ($myint > $max || $myint < $min) { - return $defval; - } - return $myint; -} // END hesk_checkMinMax() - function hesk_getLanguagesArray($returnArray = 0) { @@ -847,7 +822,7 @@ function hesk_getLanguagesArray($returnArray = 0) $add = 0; } elseif (!preg_match('/\$hesklang\[\'EMAIL_HR\'\]\=\'(.*)\'\;/', $tmp, $hr)) { $add = 0; - } elseif (!preg_match('/\$hesklang\[\'ms01\'\]/', $tmp)) { + } elseif (!preg_match('/\$hesklang\[\'refresh_page\'\]/', $tmp)) { $add = 0; } } else { diff --git a/admin/admin_submit_ticket.php b/admin/admin_submit_ticket.php index d6241840..f918dc6e 100644 --- a/admin/admin_submit_ticket.php +++ b/admin/admin_submit_ticket.php @@ -1,32 +1,15 @@ 3) { } } -$tmpvar['subject'] = hesk_input(hesk_POST('subject')) or $hesk_error_buffer['subject'] = $hesklang['enter_ticket_subject']; -$tmpvar['message'] = hesk_input(hesk_POST('message')) or $hesk_error_buffer['message'] = $hesklang['enter_message']; +$tmpvar['subject'] = hesk_input( hesk_POST('subject') ); +if ($hesk_settings['require_subject'] == 1 && $tmpvar['subject'] == '') { + $hesk_error_buffer['subject'] = $hesklang['enter_ticket_subject']; +} + +$tmpvar['message'] = hesk_input( hesk_POST('message') ); +if ($hesk_settings['require_message'] == 1 && $tmpvar['message'] == '') { + $hesk_error_buffer['message'] = $hesklang['enter_message']; +} // Is category a valid choice? if ($tmpvar['category']) { + if ( ! hesk_checkPermission('can_submit_any_cat', 0) && ! hesk_okCategory($tmpvar['category'], 0) ) { + hesk_process_messages($hesklang['noauth_submit'],'new_ticket.php'); + } + hesk_verifyCategory(1); // Is auto-assign of tickets disabled in this category? @@ -94,19 +103,69 @@ if ($tmpvar['category']) { } // Custom fields -foreach ($hesk_settings['custom_fields'] as $k => $v) { - if ($v['use'] && isset($_POST[$k])) { - // Date will be handled by the jQuery datepicker - if ($v['type'] == 'date' && $_POST[$k] != '') { - $tmpvar[$k] = strtotime($_POST[$k]); - } else if (is_array($_POST[$k])) { - $tmpvar[$k] = ''; - foreach ($_POST[$k] as $myCB) { - $tmpvar[$k] .= (is_array($myCB) ? '' : hesk_input($myCB)) . '
'; +foreach ($hesk_settings['custom_fields'] as $k=>$v) { + if ($v['use'] && hesk_is_custom_field_in_category($k, $tmpvar['category'])) { + if ($v['type'] == 'checkbox') { + $tmpvar[$k]=''; + + if (isset($_POST[$k]) && is_array($_POST[$k])) { + foreach ($_POST[$k] as $myCB) { + $tmpvar[$k] .= ( is_array($myCB) ? '' : hesk_input($myCB) ) . '
';; + } + $tmpvar[$k]=substr($tmpvar[$k],0,-6); + } else { + if ($v['req'] == 2) { + $hesk_error_buffer[$k]=$hesklang['fill_all'].': '.$v['name']; + } + $_POST[$k] = ''; + } + } elseif ($v['type'] == 'date') { + $tmpvar[$k] = hesk_POST($k); + $_SESSION["as_$k"] = ''; + if (preg_match("/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/", $tmpvar[$k])) { + $date = strtotime($tmpvar[$k] . ' t00:00:00'); + $dmin = strlen($v['value']['dmin']) ? strtotime($v['value']['dmin'] . ' t00:00:00') : false; + $dmax = strlen($v['value']['dmax']) ? strtotime($v['value']['dmax'] . ' t00:00:00') : false; + + $_SESSION["as_$k"] = $tmpvar[$k]; + + if ($dmin && $dmin > $date) { + $hesk_error_buffer[$k] = sprintf($hesklang['d_emin'], $v['name'], hesk_custom_date_display_format($dmin, $v['value']['date_format'])); + } elseif ($dmax && $dmax < $date) { + $hesk_error_buffer[$k] = sprintf($hesklang['d_emax'], $v['name'], hesk_custom_date_display_format($dmax, $v['value']['date_format'])); + } else { + $tmpvar[$k] = $date; + } + } else { + $tmpvar[$k] = ''; + + if ($v['req'] == 2) { + $hesk_error_buffer[$k]=$hesklang['fill_all'].': '.$v['name']; + } + } + } elseif ($v['type'] == 'email') + { + $tmp = $hesk_settings['multi_eml']; + $hesk_settings['multi_eml'] = $v['value']['multiple']; + $tmpvar[$k] = hesk_validateEmail( hesk_POST($k), 'ERR', 0); + $hesk_settings['multi_eml'] = $tmp; + + if ($tmpvar[$k] != '') { + $_SESSION["as_$k"] = hesk_input($tmpvar[$k]); + } else { + $_SESSION["as_$k"] = ''; + + if ($v['req'] == 2) { + $hesk_error_buffer[$k] = $v['value']['multiple'] ? sprintf($hesklang['cf_noem'], $v['name']) : sprintf($hesklang['cf_noe'], $v['name']); + } + } + } elseif ($v['req'] == 2) { + $tmpvar[$k]=hesk_makeURL(nl2br(hesk_input( hesk_POST($k) ))); + if ($tmpvar[$k] == '') { + $hesk_error_buffer[$k]=$hesklang['fill_all'].': '.$v['name']; } - $tmpvar[$k] = substr($tmpvar[$k], 0, -6); } else { - $tmpvar[$k] = hesk_makeURL(nl2br(hesk_input($_POST[$k]))); + $tmpvar[$k]=hesk_makeURL(nl2br(hesk_input(hesk_POST($k)))); } } else { $tmpvar[$k] = ''; @@ -202,7 +261,6 @@ if (count($hesk_error_buffer) != 0) { $_SESSION['as_name'] = hesk_POST('name'); $_SESSION['as_email'] = hesk_POST('email'); - $_SESSION['as_category'] = hesk_POST('category'); $_SESSION['as_priority'] = $tmpvar['priority']; $_SESSION['as_subject'] = hesk_POST('subject'); $_SESSION['as_message'] = hesk_POST('message'); @@ -211,7 +269,7 @@ if (count($hesk_error_buffer) != 0) { $_SESSION['as_show'] = $show; foreach ($hesk_settings['custom_fields'] as $k => $v) { - if ($v['use']) { + if ($v['use'] && ! in_array($v['type'], array('date', 'email'))) { $_SESSION["as_$k"] = ($v['type'] == 'checkbox') ? hesk_POST_array($k) : hesk_POST($k); } } @@ -228,7 +286,7 @@ if (count($hesk_error_buffer) != 0) { } $hesk_error_buffer = $hesklang['pcer'] . '

'; - hesk_process_messages($hesk_error_buffer, 'new_ticket.php'); + hesk_process_messages($hesk_error_buffer,'new_ticket.php?category='.$tmpvar['category']); } if ($hesk_settings['attachments']['use'] && !empty($attachments)) { @@ -258,7 +316,7 @@ $tmpvar['screen_resolution_width'] = "NULL"; $ticket = hesk_newTicket($tmpvar); // Notify the customer about the ticket? -if ($notify) { +if ($notify && $email_available) { hesk_notifyCustomer($modsForHesk_settings); } @@ -288,9 +346,7 @@ hesk_cleanSessionVars('as_owner'); hesk_cleanSessionVars('as_notify'); hesk_cleanSessionVars('as_show'); foreach ($hesk_settings['custom_fields'] as $k => $v) { - if ($v['use']) { - hesk_cleanSessionVars("as_$k"); - } + hesk_cleanSessionVars("as_$k"); } // If ticket has been assigned to the person submitting it lets show a message saying so @@ -304,5 +360,4 @@ if ($show) { hesk_process_messages($hesklang['new_ticket_submitted'], 'admin_ticket.php?track=' . $ticket['trackid'] . '&Refresh=' . mt_rand(10000, 99999), 'SUCCESS'); } else { hesk_process_messages($hesklang['new_ticket_submitted'] . '. ' . $hesklang['view_ticket'] . '', 'new_ticket.php', 'SUCCESS'); -} -?> +} \ No newline at end of file diff --git a/admin/admin_ticket.php b/admin/admin_ticket.php index 7f79447d..cd295a38 100644 --- a/admin/admin_ticket.php +++ b/admin/admin_ticket.php @@ -1,32 +1,15 @@ 2 ORDER BY `" . $orderBy . "` ASC"); +if ($can_change_cat) { + $result = hesk_dbQuery("SELECT `id`,`name` FROM `".hesk_dbEscape($hesk_settings['db_pfix'])."categories` WHERE `usage` <> 2 ORDER BY `cat_order` ASC"); +} else { + $result = hesk_dbQuery("SELECT `id`,`name` FROM `".hesk_dbEscape($hesk_settings['db_pfix'])."categories` WHERE `usage` <> 2 AND ".hesk_myCategories('id')." ORDER BY `cat_order` ASC"); +} $categories_options = ''; while ($row = hesk_dbFetchAssoc($result)) { $selected = ''; @@ -624,523 +632,381 @@ if ($ticket['email'] != '') { } } +// TODO Here we go! /* Print admin navigation */ require_once(HESK_PATH . 'inc/show_admin_nav.inc.php'); ?> -
-
-
-
-
    -
  • -
    - + $v) { + if ($v['use'] && hesk_is_custom_field_in_category($k, $ticket['category']) ) { + switch ($v['type']) { + case 'date': + $ticket[$k] = hesk_custom_date_display_format($ticket[$k], $v['value']['date_format']); + break; + } + } + } + ?> +

    +

    + ' . $tmp; ?> -

  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - ' . $hesklang['asss'] . '' : $hesklang['unas']); - ?> -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    -
    - - -
    - -
    - -
  • -
  • -
    - -
  • + $tmp = ''; + if ($hesk_settings['sequential']) { + $tmp = ' (' . $hesklang['seqid'] . ': ' . $ticket['id'] . ')'; + } + + echo $trackingID . $tmp; ?> + +
    +
    +

    + -
  • -
    - - + echo $ticket['name']; + if ($ticket['archive']) { + echo ' ' . $hesklang['archived'] . ''; + } + if ($ticket['locked']) { + echo ' ' . $hesklang['loc'] . ''; + } + ?> +
  • +
    + +
    +
    +
    +
    +
    +
    + + +
    +
    + + +
    + +
    + + +
    +
    + + +
    + +
    +
    +
    +
    + + + + + + + + + + + + + + + - - - -
  • - - -

    " /> + + + + + +

  • + + + + + + +
    + + + + '; + } else { + echo ''; + } + } else { + echo ' + + '; + } + } + ?> +
    + + // Format IP for lookup + if ($ticket['ip'] == 'Unknown' || $ticket['ip'] == $hesklang['unknown']) { + echo $hesklang['unknown']; + } else { + echo '' . $ticket['ip'] . ''; -
    + + + + -
    -
    - -
    - +
    + + $parent = hesk_dbFetchAssoc($parentRs); + echo ' '; - echo ' ' . $parent['trackid'] . ''; - } - //-- Check if any tickets have a parent set to this tracking ID - $hasRows = false; - $childrenRS = hesk_dbQuery('SELECT * FROM `' . hesk_dbEscape($hesk_settings['db_pfix']) . 'tickets` + echo ' ' . $parent['trackid'] . ''; + } + //-- Check if any tickets have a parent set to this tracking ID + $hasRows = false; + $childrenRS = hesk_dbQuery('SELECT * FROM `' . hesk_dbEscape($hesk_settings['db_pfix']) . 'tickets` WHERE `parent` = ' . hesk_dbEscape($ticket['id'])); - while ($row = hesk_dbFetchAssoc($childrenRS)) { - $hasRows = true; - echo ' + while ($row = hesk_dbFetchAssoc($childrenRS)) { + $hasRows = true; + echo ' '; - echo ' ' . $row['trackid'] . ''; - echo '
    '; - } - if (!$hasRows && $ticket['parent'] == null) { - echo $hesklang['none']; - } - ?>

    - -
    -

    ' . $hesklang['add_ticket'] . ''; ?>

    -
    -
    +
    +
    + + + + + + + + + + + + + + + +
    +
    + +
    -
    - - - - + - - - -
    - - - -
  • - - -

    - - ' . $recentTicket['trackid'] . ''; ?> -

    - -
  • - - +
    + +

    + +

    + + ' . $recentTicket['trackid'] . ''; ?> +

    + +
    +
    +
    -
    - +
    + $hesklang['critical'], + 1 => $hesklang['high'], + 2 => $hesklang['medium'], + 3 => $hesklang['low'] + ); + $options = array(); + for ($i = 0; $i < 4; $i++) { + $selected = $ticket['priority'] == $i ? 'selected' : ''; + array_push($options, ''); + } - echo hesk_getAdminButtons(); - ?> -
    - -
    -
    -
    -

    -  '; - } - if ($ticket['locked']) { - echo ' '; - } - if ($modsForHesk_settings['display_user_agent_information'] - && $ticket['user_agent'] !== NULL - && $ticket['screen_resolution_height'] !== NULL - && $ticket['screen_resolution_height'] != 0 - && $ticket['screen_resolution_width'] !== NULL - && $ticket['screen_resolution_width'] != 0 - ): - ?> - - - - - '; + } elseif ($ticket['priority'] == 1) { + echo 'high-priority">'; + } else { + echo 'med-low-priority">'; + } - if ($modsForHesk_settings['request_location']) { - $locationText = ''; - $iconColor = ''; - $hasLocation = true; - if (strpos($ticket['latitude'], 'E') === false) { - $locationText = $hesklang['click_for_map']; - $iconColor = 'inherit'; - } else { - $hasLocation = false; - $locationText = $hesklang['location_unavailable']; - $iconColor = '#ccc'; - } - ?> - - - -

    '; - endif; - ?> -
    -
    -
    -
    - - - - -
    -
-
-
-

-
-
-

-
-
- '; - $mgr = $isManager ? '&isManager=1' : ''; - if ($isTicketClosed == 0 && $isClosable) // Ticket is still open - { - echo ' - ' . $hesklang['close_action'] . ''; - } elseif ($isTicketClosed == 1) { - echo ' - ' . $hesklang['open_action'] . ''; - } - - $strippedName = strip_tags($ticket['name']); - $strippedEmail = strip_tags($ticket['email']); - $linkText = 'new_ticket.php?name=' . $strippedName . '&email=' . $strippedEmail . '&catid=' . $category['id'] . '&priority=' . $ticket['priority']; - foreach ($hesk_settings['custom_fields'] as $k => $v) { - if ($v['use'] == 1) { - - if ($v['type'] == 'checkbox') { - $value = str_replace('
', '-CHECKBOX-', $ticket[$k]); - } else { - $value = $ticket[$k]; - } - $strippedCustomField = strip_tags($value); - $linkText .= '&c_' . $k . '=' . $strippedCustomField; - } - } - - echo ' - ' . $hesklang['create_based_on_contact'] . ' - '; - echo '
'; - ?> -
-
-
- $hesklang['critical'], - 1 => $hesklang['high'], - 2 => $hesklang['medium'], - 3 => $hesklang['low'] - ); - $options = array(); - for ($i = 0; $i < 4; $i++) { - $selected = $ticket['priority'] == $i ? 'selected' : ''; - array_push($options, ''); - } - - echo '
'; - } elseif ($ticket['priority'] == 1) { - echo 'highPriority">'; - } else { - echo 'medLowPriority">'; - } - - echo '

' . $hesklang['priority'] . '

'; - - echo '
+ echo ' '; - if ($isManager) { - echo ''; - } - echo ' + if ($isManager) { + echo ''; + } + echo '
'; - echo '

' . $hesklang['status'] . '

'; - $status_options = array(); - $results = mfh_getAllStatuses(); - foreach ($results as $row) { - $selected = $ticket['status'] == $row['ID'] ? 'selected' : ''; - $status_options[$row['ID']] = ''; - } + echo '

' . $hesklang['status'] . '

'; + $status_options = array(); + $results = mfh_getAllStatuses(); + foreach ($results as $row) { + $selected = $ticket['status'] == $row['ID'] ? 'selected' : ''; + $status_options[$row['ID']] = ''; + } - echo ' + echo '
'; - if ($isManager) { - echo ''; - } - echo ' + if ($isManager) { + echo ''; + } + echo '
'; - echo '

' . $hesklang['owner'] . '

'; + echo '

' . $hesklang['owner'] . '

'; - if (hesk_checkPermission('can_assign_others', 0) || $isManager) { - echo ' + if (hesk_checkPermission('can_assign_others', 0) || $isManager) { + echo '
- - - + echo ''; + } + echo ''; + echo ' + + + '; - } else { - echo '

'; - echo isset($admins[$ticket['owner']]) ? $admins[$ticket['owner']] : - ($can_assign_self ? $hesklang['unas'] . ' [' . $hesklang['asss'] . ']' : $hesklang['unas']); - echo '

'; + if ( ! $ticket['owner']) + { + echo ''; } echo '
'; - echo '

' . $hesklang['category'] . '

'; - if ($can_change_cat) { - echo ' + } else { + echo '

'; + echo isset($admins[$ticket['owner']]) ? $admins[$ticket['owner']] : + ($can_assign_self ? $hesklang['unas'] . ' [' . $hesklang['asss'] . ']' : $hesklang['unas']); + echo '

'; + } + echo '

' . $hesklang['category'] . '

'; + if (strlen($categories_options) && ($can_change_cat || $can_change_own_cat)) { + echo '
@@ -1195,311 +1065,191 @@ require_once(HESK_PATH . 'inc/show_admin_nav.inc.php'); ' . $categories_options . ' - - + + +
'; - } else { - echo '

' . $category['name'] . '

'; - } - echo '
'; - ?> + } else { + echo '

' . $category['name'] . '

'; + } + echo '
'; + ?> +
+
+
+
+

+ +

+
+
- + 0): + $first = true; + while ($note = hesk_dbFetchAssoc($res)): + if (!$first) { + echo '
'; + } else { + $first = false; + } ?>
-
-
-
-

- - -

- +

+ + -

+
' : ''; + // Attachments + if ($hesk_settings['attachments']['use'] && strlen($note['attachments'])) { + echo strlen($note['message']) ? '

' : ''; - $att = explode(',', substr($note['attachments'], 0, -1)); - $num = count($att); - foreach ($att as $myatt) { - list($att_id, $att_name) = explode('#', $myatt); + $att = explode(',', substr($note['attachments'], 0, -1)); + $num = count($att); + foreach ($att as $myatt) { + list($att_id, $att_name) = explode('#', $myatt); - // Can edit and delete note (attachments)? - if ($can_del_notes || $note['who'] == $_SESSION['id']) { - // If this is the last attachment and no message, show "delete ticket" link - if ($num == 1 && strlen($note['message']) == 0) { - echo ' - - '; - } // Show "delete attachment" link - else { - echo ' - - '; - } - } - - echo ' - - - - ' . $att_name . '
- '; + // Can edit and delete note (attachments)? + if ($can_del_notes || $note['who'] == $_SESSION['id']) { + // If this is the last attachment and no message, show "delete ticket" link + if ($num == 1 && strlen($note['message']) == 0) { + echo ' + + '; + } // Show "delete attachment" link + else { + echo ' + + '; } } - ?> -
- -
+ ' . $att_name . '
+ '; + } + } + ?> +
+
+ + + +   + + + +
-
-
- : - -   - - -
-
-
-
-
- + + +
+ + + +
+ + '; + + /* Reply form on bottom? */ + if ($can_reply && !$hesk_settings['reply_top']) { + hesk_printReplyForm(); + } + + /* Display ticket history */ + if (strlen($ticket['history'])) { + ?> +
+
+

+ +

+
+ +
+
+
+ +
+
+ +

@@ -1518,74 +1268,232 @@ require_once(HESK_PATH . 'inc/footer.inc.php'); /*** START FUNCTIONS ***/ -function hesk_getAdminButtons($reply = 0, $white = 1) +function hesk_getAdminButtons($category_id) { - global $hesk_settings, $hesklang, $ticket, $reply, $trackingID, $can_edit, $can_archive, $can_delete, $isManager; + global $hesk_settings, $hesklang, $modsForHesk_settings, $ticket, $reply, $trackingID, $can_edit, $can_archive, $can_delete, $can_resolve, $isManager; - $options = '
'; - - /* Style and mousover/mousout */ - $tmp = $white ? 'White' : 'Blue'; - $style = 'class="option' . $tmp . 'OFF" onmouseover="this.className=\'option' . $tmp . 'ON\'" onmouseout="this.className=\'option' . $tmp . 'OFF\'"'; - - /* Lock ticket button */ - if ( /* ! $reply && */ - $can_edit - ) { - if ($ticket['locked']) { - $des = $hesklang['tul'] . ' - ' . $hesklang['isloc']; - $options .= ' ' . $hesklang['tul'] . ' '; - } else { - $des = $hesklang['tlo'] . ' - ' . $hesklang['isloc']; - $options .= ' ' . $hesklang['tlo'] . ' '; - } - } - - /* Tag ticket button */ - if ( /* ! $reply && */ - $can_archive - ) { - if ($ticket['archive']) { - $options .= '' . $hesklang['remove_archive'] . ' '; - } else { - $options .= ' ' . $hesklang['add_archive'] . ' '; - } - } - - /* Import to knowledgebase button */ - if ($hesk_settings['kb_enable'] && hesk_checkPermission('can_man_kb', 0)) { - $options .= ' ' . $hesklang['import_kb'] . ' '; - } - - /* Print ticket button */ - $options .= ' ' . $hesklang['printer_friendly'] . ' '; + $options = ''; /* Edit post */ if ($can_edit) { $tmp = $reply ? '&reply=' . $reply['id'] : ''; $mgr = $isManager ? '&isManager=true' : ''; - $options .= ' ' . $hesklang['edtt'] . ' '; + $options .= ' ' . $hesklang['edit'] . ' '; } + /* Print ticket button */ + $options .= ' ' . $hesklang['printer_friendly'] . ' '; + /* Delete ticket */ if ($can_delete) { if ($reply) { $url = 'admin_ticket.php'; $tmp = 'delete_post=' . $reply['id']; - $img = 'delete.png'; $txt = $hesklang['delt']; } else { $url = 'delete_tickets.php'; $tmp = 'delete_ticket=1'; - $img = 'delete_ticket.png'; $txt = $hesklang['dele']; } - $options .= ' ' . $txt . ' '; + $options .= ' ' . $txt . ' '; } + $dropdown = ' +
+ +
'; + $options .= $dropdown; + /* Return generated HTML */ - $options .= '
'; return $options; } // END hesk_getAdminButtons() @@ -1594,17 +1502,13 @@ function hesk_getAdminButtonsInTicket($reply = 0, $white = 1) { global $hesk_settings, $hesklang, $ticket, $reply, $trackingID, $can_edit, $can_archive, $can_delete, $isManager; - $options = '
'; - - /* Style and mousover/mousout */ - $tmp = $white ? 'White' : 'Blue'; - $style = 'class="option' . $tmp . 'OFF" onmouseover="this.className=\'option' . $tmp . 'ON\'" onmouseout="this.className=\'option' . $tmp . 'OFF\'"'; + $options = $reply ? '' : '
'; /* Edit post */ if ($can_edit) { $tmp = $reply ? '&reply=' . $reply['id'] : ''; $mgr = $isManager ? '&isManager=true' : ''; - $options .= ' ' . $hesklang['edtt'] . ' '; + $options .= ' ' . $hesklang['edtt'] . ' '; } @@ -1613,19 +1517,17 @@ function hesk_getAdminButtonsInTicket($reply = 0, $white = 1) if ($reply) { $url = 'admin_ticket.php'; $tmp = 'delete_post=' . $reply['id']; - $img = 'delete.png'; $txt = $hesklang['delt']; } else { $url = 'delete_tickets.php'; $tmp = 'delete_ticket=1'; - $img = 'delete_ticket.png'; $txt = $hesklang['dele']; } - $options .= ' ' . $txt . ' '; + $options .= ' ' . $txt . ' '; } /* Return generated HTML */ - $options .= '
'; + $options .= $reply ? '' : '
'; return $options; } // END hesk_getAdminButtonsInTicket() @@ -1673,64 +1575,192 @@ function print_form() exit(); } // End print_form() - -function hesk_printTicketReplies() -{ - global $hesklang, $hesk_settings, $result, $reply, $isManager, $modsForHesk_settings; - - $i = $hesk_settings['new_top'] ? 0 : 1; - - if ($reply === false) { - return $i; - } - - while ($reply = hesk_dbFetchAssoc($result)) { - $color = 'class="ticketMessageContainer"'; - - $reply['dt'] = hesk_date($reply['dt'], true); - ?> -
-
-
-
-
-
- -
-

:

+function mfh_print_message() { + global $ticket, $hesklang, $hesk_settings, $modsForHesk_settings; + ?> +
  • +
    + +

    +
    +
    +
    + +
    +
    + +
    -
    -

    :

    - -

    $v) { + if ($v['use'] && $v['place'] == 0 && hesk_is_custom_field_in_category($k, $ticket['category'])) { + echo '

    '; + echo '
    ' . $v['name'] . ':
    '; + if ($v['type'] == 'email') { + echo ''; } else { - echo $reply['message']; - } ?>

    -
    -
    - ' . $hesklang['rnh'] . '

    '; - } elseif ($reply['rating'] == 5) { - echo '

    ' . $hesklang['rh'] . '

    '; + echo '
    ' . $ticket[$k] . '
    '; } + echo '
    '; } + } + ?> +
    +
    + +
    + $v) { + if ($v['use'] && $v['place'] && hesk_is_custom_field_in_category($k, $ticket['category'])) { + if ($first) { + echo ''; + } + ?> + + + +
    +
  • +'; + if (!$hesk_settings['new_top']) { + mfh_print_message(); + } else { + echo '
  • '; + } + + while ($reply = hesk_dbFetchAssoc($result)) { + $reply['dt'] = hesk_date($reply['dt'], true); + ?> +
  • + + + + + +
    + +

    +
    + +
    + + + + +
    +
  • '; + } + echo ''; + + return; } // End hesk_printTicketReplies() @@ -1738,6 +1768,13 @@ function hesk_printTicketReplies() function hesk_printReplyForm() { global $hesklang, $hesk_settings, $ticket, $admins, $can_options, $options, $can_assign_self, $isManager, $modsForHesk_settings; + + // Force assigning a ticket before allowing to reply? + if ($hesk_settings['require_owner'] && ! $ticket['owner']) + { + hesk_show_notice($hesklang['atbr'].($can_assign_self ? '

    '.$hesklang['attm'].'' : ''), $hesklang['owneed']); + return ''; + } ?> @@ -1761,78 +1798,86 @@ function hesk_printReplyForm() }); /* ]]> */ - + -

    -
    -
    - - -
    > +
    +
    +

    + +

    +
    + +
    +
    +
    - -
    - - -
    - -
    -
    -
    - - -
    -
    -
    - -
    - -
    -
    - - -
    -
    - -
    - + > + + /* Ticket assigned to someone else? */ + if ($ticket['owner'] && $ticket['owner'] != $_SESSION['id'] && isset($admins[$ticket['owner']])) { + hesk_show_notice($hesklang['nyt'] . ' ' . $admins[$ticket['owner']]); + } + + /* Ticket locked? */ + if ($ticket['locked']) { + hesk_show_notice($hesklang['tislock']); + } + + // Track time worked? + if ($hesk_settings['time_worked']) { + ?> + +
    + + +
    + +
    +
    +
    + + +
    +
    +
    + +
    + +
    +
    + + +
    +
    + +
    + + +
    -
    -
    - -
    - - -
    -
    -
    - - -
    - ' . $hesklang['asss2'] . '
    '; - } else { - echo '
    '; - } - } - + /* attachments */ + if ($hesk_settings['attachments']['use']) { ?> -
    - - -
    -
    - - () -
    -

    - '; - } ?> - - + - - + +
    +
    '); myMsg = myMsg.replace(/%%HESK_EMAIL%%/g, ''); myMsg = myMsg.replace(/%%HESK_OWNER%%/g, ''); - myMsg = myMsg.replace(/%%HESK_custom1%%/g, ''); - myMsg = myMsg.replace(/%%HESK_custom2%%/g, ''); - myMsg = myMsg.replace(/%%HESK_custom3%%/g, ''); - myMsg = myMsg.replace(/%%HESK_custom4%%/g, ''); - myMsg = myMsg.replace(/%%HESK_custom5%%/g, ''); - myMsg = myMsg.replace(/%%HESK_custom6%%/g, ''); - myMsg = myMsg.replace(/%%HESK_custom7%%/g, ''); - myMsg = myMsg.replace(/%%HESK_custom8%%/g, ''); - myMsg = myMsg.replace(/%%HESK_custom9%%/g, ''); - myMsg = myMsg.replace(/%%HESK_custom10%%/g, ''); - myMsg = myMsg.replace(/%%HESK_custom11%%/g, ''); - myMsg = myMsg.replace(/%%HESK_custom12%%/g, ''); - myMsg = myMsg.replace(/%%HESK_custom13%%/g, ''); - myMsg = myMsg.replace(/%%HESK_custom14%%/g, ''); - myMsg = myMsg.replace(/%%HESK_custom15%%/g, ''); - myMsg = myMsg.replace(/%%HESK_custom16%%/g, ''); - myMsg = myMsg.replace(/%%HESK_custom17%%/g, ''); - myMsg = myMsg.replace(/%%HESK_custom18%%/g, ''); - myMsg = myMsg.replace(/%%HESK_custom19%%/g, ''); - myMsg = myMsg.replace(/%%HESK_custom20%%/g, ''); + + if (document.getElementById) { if (document.getElementById('moderep').checked) { @@ -2071,4 +2107,52 @@ function hesk_printCanned() return $can_options; } // End hesk_printCanned() + +function buildUserAgentModal($user_agent, $width, $height) { + global $hesklang; + + echo ' + '; +} ?> diff --git a/admin/api_settings.php b/admin/api_settings.php index 61a14abc..2bdc36b7 100644 --- a/admin/api_settings.php +++ b/admin/api_settings.php @@ -41,6 +41,7 @@ if (is_dir(HESK_PATH . 'install')) { require(HESK_PATH . 'hesk_settings.inc.php'); require(HESK_PATH . 'inc/common.inc.php'); require(HESK_PATH . 'inc/admin_functions.inc.php'); +require(HESK_PATH . 'inc/mail_functions.inc.php'); hesk_load_database_functions(); hesk_session_start(); @@ -60,86 +61,103 @@ require_once(HESK_PATH . 'inc/headerAdmin.inc.php'); // Print main manage users page require_once(HESK_PATH . 'inc/show_admin_nav.inc.php'); ?> - -
    -
    -
    -
    - API Information +
    +
    +
    +

    + +

    +
    +
    +
    +
    - -
    - API Version + +
    - External API + + - Disabled - Enabled + + + + + +
    -
    -

    API Settings

    -
    - -
    -
    -
    -
    - -
    +
    +
    +

    + +

    +
    + +
    +
    +
    +
    - ' . $hesklang['unas'] . '
    ', $_SESSION['name'] . ' (' . $_SESSION['user'] . ')'); - $res = hesk_dbQuery("UPDATE `" . hesk_dbEscape($hesk_settings['db_pfix']) . "tickets` SET `owner`=0 , `history`=CONCAT(`history`,'" . hesk_dbEscape($revision) . "') WHERE `trackid`='" . hesk_dbEscape($trackingID) . "' LIMIT 1"); + $res = hesk_dbQuery("UPDATE `" . hesk_dbEscape($hesk_settings['db_pfix']) . "tickets` SET `owner`=0 , `history`=CONCAT(`history`,'" . hesk_dbEscape($revision) . "') WHERE `trackid`='" . hesk_dbEscape($trackingID) . "'"); hesk_process_messages($hesklang['tunasi2'], $_SERVER['PHP_SELF'], 'SUCCESS'); } elseif ($owner < 1) { @@ -89,10 +89,31 @@ if (!$row['isadmin']) { } } +// Make sure two people don't assign a ticket to a different user at the same time +if ($ticket['owner'] && $ticket['owner'] != $owner && hesk_REQUEST('unassigned') && hesk_GET('confirm') != 'Y') { + $new_owner = ($owner == $_SESSION['id']) ? $hesklang['scoy'] : sprintf($hesklang['scot'], $row['name']); + + $res = hesk_dbQuery("SELECT `name` FROM `".hesk_dbEscape($hesk_settings['db_pfix'])."users` WHERE `id`='{$ticket['owner']}' LIMIT 1"); + + if (hesk_dbNumRows($res) == 1) { + $row = hesk_dbFetchAssoc($res); + + hesk_process_messages( + sprintf($hesklang['taat'], $row['name']) . + '

    ' . + $new_owner . + '

    ' . + ''.$hesklang['ycto'].' | ' . + ''.$hesklang['ncto'].'', + $_SERVER['PHP_SELF'], 'NOTICE' + ); + } +} + /* Assigning to self? */ if ($can_assign_others || ($owner == $_SESSION['id'] && $can_assign_self)) { $revision = sprintf($hesklang['thist2'], hesk_date(), $row['name'] . ' (' . $row['user'] . ')', $_SESSION['name'] . ' (' . $_SESSION['user'] . ')'); - $res = hesk_dbQuery("UPDATE `" . hesk_dbEscape($hesk_settings['db_pfix']) . "tickets` SET `owner`={$owner} , `history`=CONCAT(`history`,'" . hesk_dbEscape($revision) . "') WHERE `trackid`='" . hesk_dbEscape($trackingID) . "' LIMIT 1"); + $res = hesk_dbQuery("UPDATE `" . hesk_dbEscape($hesk_settings['db_pfix']) . "tickets` SET `owner`={$owner} , `history`=CONCAT(`history`,'" . hesk_dbEscape($revision) . "') WHERE `trackid`='" . hesk_dbEscape($trackingID) . "'"); if ($owner != $_SESSION['id'] && !hesk_checkPermission('can_view_ass_others', 0)) { $_SERVER['PHP_SELF'] = 'admin_main.php'; diff --git a/admin/banned_emails.php b/admin/banned_emails.php index e44bf575..6fd9892c 100644 --- a/admin/banned_emails.php +++ b/admin/banned_emails.php @@ -1,32 +1,15 @@ - -
    -
    + + + - -
    -
    -
    + + - -
    -
    -
    -
    -

    -
    -
    -
    - - +
    +
    +
    +
    +
    +

    + +

    +
    + +
    -
      - -
    • -
      - +
      +
      + + +
      +
        + +
      • +
        + +
        +
        + +
        +
      • + +
      +
      +
      +
      +
      +

      + +

      +
      + +
      +
      +
      +
      +
      +
      -
      - +
      +
      -
    • - -
    +
    + +
    +
    +
    -
    -
    -

    -
    -
    -
    -
    - -
    -
    - -
    -
    - +
    +
    +
    +

    + +

    +
    +
    +
    +
    +
    + +
    @@ -138,7 +173,7 @@ require_once(HESK_PATH . 'inc/show_admin_nav.inc.php');
    -
    +
    diff --git a/admin/change_status.php b/admin/change_status.php index 7a16fd3a..36622e97 100644 --- a/admin/change_status.php +++ b/admin/change_status.php @@ -1,32 +1,15 @@ diff --git a/admin/custom_fields.php b/admin/custom_fields.php new file mode 100755 index 00000000..09f6d65f --- /dev/null +++ b/admin/custom_fields.php @@ -0,0 +1,1317 @@ + +
    + +
    +
    + +
    +
    +
    + +$error\n"; + } + $hesk_error_buffer = $tmp; + + $hesk_error_buffer = $hesklang['rfm'].'

      '.$hesk_error_buffer.'
    '; + hesk_process_messages($hesk_error_buffer,'custom_fields.php'); + } + + // Add custom field data into database + hesk_dbQuery("UPDATE `".hesk_dbEscape($hesk_settings['db_pfix'])."custom_fields` SET + `use` = '{$cf['use']}', + `place` = '{$cf['place']}', + `type` = '{$cf['type']}', + `req` = '{$cf['req']}', + `category` = ".(count($cf['categories']) ? "'".json_encode($cf['categories'])."'" : 'NULL').", + `name` = '".hesk_dbEscape($cf['names'])."', + `value` = ".(strlen($cf['value']) ? "'".hesk_dbEscape($cf['value'])."'" : 'NULL')." + WHERE `id`={$id}"); + + // Clear cache + hesk_purge_cache('cf'); + + // Show success + $_SESSION['cford'] = $id; + hesk_process_messages($hesklang['cf_mdf'],'custom_fields.php','SUCCESS'); + +} // End save_cf() + + +function edit_cf() +{ + global $hesk_settings, $hesklang; + + // Get custom field ID + $id = intval( hesk_GET('id') ) or hesk_error($hesklang['cf_e_id']); + + // Get details from the database + $res = hesk_dbQuery("SELECT * FROM `".hesk_dbEscape($hesk_settings['db_pfix'])."custom_fields` WHERE `id`={$id} LIMIT 1"); + if ( hesk_dbNumRows($res) != 1 ) + { + hesk_error($hesklang['cf_not_found']); + } + $cf = hesk_dbFetchAssoc($res); + + $cf['names'] = json_decode($cf['name'], true); + unset($cf['name']); + + if (strlen($cf['category'])) + { + $cf['categories'] = json_decode($cf['category'], true); + $cf['category'] = 1; + } + else + { + $cf['categories'] = array(); + $cf['category'] = 0; + } + + $_SESSION['new_cf'] = $cf; + $_SESSION['edit_cf'] = true; + +} // End edit_cf() + + +function order_cf() +{ + global $hesk_settings, $hesklang; + + // A security check + hesk_token_check(); + + // Get ID and move parameters + $id = intval( hesk_GET('id') ) or hesk_error($hesklang['cf_e_id']); + $move = intval( hesk_GET('move') ); + $_SESSION['cford'] = $id; + + // Update article details + hesk_dbQuery("UPDATE `".hesk_dbEscape($hesk_settings['db_pfix'])."custom_fields` SET `order`=`order`+".intval($move)." WHERE `id`={$id}"); + + // Update order of all custom fields + update_cf_order(); + + // Clear cache + hesk_purge_cache('cf'); + + // Finish + header('Location: custom_fields.php'); + exit(); + +} // End order_cf() + + +function update_cf_order() +{ + global $hesk_settings, $hesklang; + + // Get list of current custom fields + $res = hesk_dbQuery("SELECT `id` FROM `".hesk_dbEscape($hesk_settings['db_pfix'])."custom_fields` WHERE `use` IN ('1','2') ORDER BY `place` ASC, `order` ASC"); + + // Update database + $i = 10; + while ( $cf = hesk_dbFetchAssoc($res) ) + { + hesk_dbQuery("UPDATE `".hesk_dbEscape($hesk_settings['db_pfix'])."custom_fields` SET `order`=".intval($i)." WHERE `id`='".intval($cf['id'])."'"); + $i += 10; + } + + hesk_dbQuery("UPDATE `".hesk_dbEscape($hesk_settings['db_pfix'])."custom_fields` SET `order`=1000 WHERE `use`='0'"); + + return true; + +} // END update_cf_order() + + +function remove_cf() +{ + global $hesk_settings, $hesklang; + + // A security check + hesk_token_check(); + + // Get ID + $id = intval( hesk_GET('id') ) or hesk_error($hesklang['cf_e_id']); + + // Reset the custom field + hesk_dbQuery("UPDATE `".hesk_dbEscape($hesk_settings['db_pfix'])."custom_fields` SET `use`='0', `place`='0', `type`='text', `req`='0', `category`=NULL, `name`='', `value`=NULL, `order`=1000 WHERE `id`={$id}"); + + // Were we successful? + if ( hesk_dbAffectedRows() == 1 ) + { + // Update order + update_cf_order(); + + // Clear cache + hesk_purge_cache('cf'); + + // Delete custom field data from tickets + hesk_dbQuery("UPDATE `".hesk_dbEscape($hesk_settings['db_pfix'])."tickets` SET `custom{$id}`=''"); + + // Show success message + hesk_process_messages($hesklang['cf_deleted'],'./custom_fields.php','SUCCESS'); + } + else + { + hesk_process_messages($hesklang['cf_not_found'],'./custom_fields.php'); + } + +} // End remove_cf() + + +function cf_validate() +{ + global $hesk_settings, $hesklang; + global $hesk_error_buffer; + + $hesk_error_buffer = array(); + + // Get names + $cf['names'] = hesk_POST_array('name'); + + // Make sure only valid names pass + foreach ($cf['names'] as $key => $name) + { + if ( ! isset($hesk_settings['languages'][$key])) + { + unset($cf['names'][$key]); + } + else + { + $name = is_array($name) ? '' : hesk_input($name, 0, 0, HESK_SLASH); + + if (strlen($name) < 1) + { + unset($cf['names'][$key]); + } + else + { + $cf['names'][$key] = stripslashes($name); + } + } + } + + // No name entered? + if ( ! count($cf['names'])) + { + $hesk_error_buffer[] = $hesklang['err_custname']; + } + + // Get type and values + $cf['type'] = hesk_POST('type'); + switch ($cf['type']) + { + case 'textarea': + $cf['rows'] = hesk_checkMinMax(intval(hesk_POST('rows')), 1, 100, 12); + $cf['cols'] = hesk_checkMinMax(intval(hesk_POST('cols')), 1, 500, 60); + $cf['value'] = array('rows' => $cf['rows'], 'cols' => $cf['cols']); + break; + + case 'radio': + $cf['radio_options'] = stripslashes(hesk_input(hesk_POST('radio_options'), 0, 0, HESK_SLASH)); + + $options = preg_split("/\\r\\n|\\r|\\n/", $cf['radio_options']); + + $no_default = hesk_POST('no_default') ? 1 : 0; + + $cf['value'] = array('radio_options' => $options, 'no_default' => $no_default); + + if (count($options) < 2) + { + $hesk_error_buffer[] = $hesklang['atl2']; + } + + break; + + case 'select': + $cf['select_options'] = stripslashes(hesk_input(hesk_POST('select_options'), 0, 0, HESK_SLASH)); + + $options = preg_split("/\\r\\n|\\r|\\n/", $cf['select_options']); + + $show_select = hesk_POST('show_select') ? 1 : 0; + + $cf['value'] = array('show_select' => $show_select, 'select_options' => $options); + + if (count($options) < 2) + { + $hesk_error_buffer[] = $hesklang['atl2']; + } + + break; + + case 'checkbox': + $cf['checkbox_options'] = stripslashes(hesk_input(hesk_POST('checkbox_options'), 0, 0, HESK_SLASH)); + + $options = preg_split("/\\r\\n|\\r|\\n/", $cf['checkbox_options']); + + $cf['value'] = array('checkbox_options' => $options); + + if ( ! isset($options[0]) || strlen($options[0]) < 1) + { + $hesk_error_buffer[] = $hesklang['atl1']; + } + + break; + + case 'date': + $cf['dmin'] = ''; + $cf['dmax'] = ''; + + // Minimum date + $dmin_rf = hesk_POST('dmin_rf'); + + if ($dmin_rf == 1) + { + $dmin = hesk_POST('dmin'); + + if (preg_match("/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/", $dmin)) + { + $cf['dmin'] = $dmin; + } + } + elseif ($dmin_rf == 2) + { + $dmin_pm = hesk_POST('dmin_pm') == '+' ? '+' : '-'; + $dmin_num = intval(hesk_POST('dmin_num', 0)); + $dmin_type = hesk_POST('dmin_type'); + if ( ! in_array($dmin_type, array('day', 'week', 'month', 'year'))) + { + $dmin_type = 'day'; + } + + $cf['dmin'] = $dmin_pm . $dmin_num . ' ' . $dmin_type; + } + + // Maximum date + $dmax_rf = hesk_POST('dmax_rf'); + + if ($dmax_rf == 1) + { + $dmax = hesk_POST('dmax'); + + if (preg_match("/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/", $dmax)) + { + $cf['dmax'] = $dmax; + } + } + elseif ($dmax_rf == 2) + { + $dmax_pm = hesk_POST('dmax_pm') == '+' ? '+' : '-'; + $dmax_num = intval(hesk_POST('dmax_num', 0)); + $dmax_type = hesk_POST('dmax_type'); + if ( ! in_array($dmax_type, array('day', 'week', 'month', 'year'))) + { + $dmax_type = 'day'; + } + + $cf['dmax'] = $dmax_pm . $dmax_num . ' ' . $dmax_type; + } + + // Minimum date should not be higher than maximum date + if (strlen($cf['dmin']) && strlen($cf['dmax'])) + { + if (strtotime($cf['dmin']) > strtotime($cf['dmax'])) + { + $hesk_error_buffer[] = $hesklang['d_mm']; + } + } + + // Date format + $date_format = hesk_POST('date_format'); + if ($date_format == 'custom') + { + $date_format = hesk_POST('date_format_custom'); + } + + $cf['date_format'] = preg_replace('/[^a-zA-Z0-9 \/\.\_+\-,;:#(){}\[\]\'@*]/', '', $date_format); + + $cf['value'] = array('dmin' => $cf['dmin'], 'dmax' => $cf['dmax'], 'date_format' => $cf['date_format']); + + break; + + case 'email': + $cf['email_multi'] = hesk_POST('email_multi') ? 1 : 0; + $cf['email_type'] = hesk_POST('email_type', 'none'); + $cf['value'] = array('multiple' => $cf['email_multi'], 'email_type' => $cf['email_type']); + break; + + case 'hidden': + $cf['hidden_max_length'] = hesk_checkMinMax(intval(hesk_POST('hidden_max_length')), 1, 10000, 255); + $cf['hidden_default_value'] = stripslashes(hesk_input(hesk_POST('hidden_default_value'), 0, 0, HESK_SLASH)); + $cf['value'] = array('max_length' => $cf['hidden_max_length'], 'default_value' => $cf['hidden_default_value']); + break; + + case 'readonly': + $max_length = hesk_POST('max_length'); + $value = hesk_POST('default_value'); + $cf['value'] = array('default_value' => $value, 'max_length' => $max_length); + break; + + default: + $cf['type'] = 'text'; + $cf['max_length'] = hesk_checkMinMax(intval(hesk_POST('max_length')), 1, 10000, 255); + $cf['default_value'] = stripslashes(hesk_input(hesk_POST('default_value'), 0, 0, HESK_SLASH)); + $cf['value'] = array('max_length' => $cf['max_length'], 'default_value' => $cf['default_value']); + + } + + // Enable + $cf['use'] = hesk_POST('use') == 2 ? 2 : 1; + + // req + $cf['req'] = hesk_POST('req'); + $cf['req'] = $cf['req'] == 2 ? 2 : ($cf['req'] == 1 ? 1 : 0); + + // Private fields cannot be req for customers + if ($cf['use'] == 2 && $cf['req'] == 1) + { + $cf['req'] = 0; + } + + // Located above or below "Message"? + $cf['place'] = hesk_POST('place') ? 1 : 0; + + // Get allowed categories + if (hesk_POST('category')) + { + $cf['category'] = 1; + $cf['categories'] = hesk_POST_array('categories'); + + foreach ($cf['categories'] as $key => $cat_id) + { + if ( ! isset($hesk_settings['categories'][$cat_id]) ) + { + unset($cf['categories'][$key]); + } + } + + if ( ! count($cf['categories'])) + { + $hesk_error_buffer[] = $hesklang['cf_nocat']; + } + } + else + { + $cf['category'] = 0; + $cf['categories'] = array(); + } + + // Any errors? + if (count($hesk_error_buffer)) + { + $_SESSION['new_cf'] = $cf; + return false; + } + + $cf['names'] = addslashes(json_encode($cf['names'])); + $cf['value'] = $cf['type'] == 'date' ? json_encode($cf['value']) : addslashes(json_encode($cf['value'])); + + return $cf; +} // END cf_validate() + + +function new_cf() +{ + global $hesk_settings, $hesklang; + global $hesk_error_buffer; + + // A security check + # hesk_token_check('POST'); + + // Validate inputs + if (($cf = cf_validate()) == false) + { + $tmp = ''; + foreach ($hesk_error_buffer as $error) + { + $tmp .= "
  • $error
  • \n"; + } + $hesk_error_buffer = $tmp; + + $hesk_error_buffer = $hesklang['rfm'].'

      '.$hesk_error_buffer.'
    '; + hesk_process_messages($hesk_error_buffer,'custom_fields.php'); + } + + // Get the lowest available custom field ID + $res = hesk_dbQuery("SELECT `id` FROM `".hesk_dbEscape($hesk_settings['db_pfix'])."custom_fields` WHERE `use`='0' ORDER BY `id` ASC LIMIT 1"); + $row = hesk_dbFetchRow($res); + $_SESSION['cford'] = intval($row[0]); + + // Insert custom field into database + hesk_dbQuery("UPDATE `".hesk_dbEscape($hesk_settings['db_pfix'])."custom_fields` SET + `use` = '{$cf['use']}', + `place` = '{$cf['place']}', + `type` = '{$cf['type']}', + `req` = '{$cf['req']}', + `category` = ".(count($cf['categories']) ? "'".json_encode($cf['categories'])."'" : 'NULL').", + `name` = '".hesk_dbEscape($cf['names'])."', + `value` = ".(strlen($cf['value']) ? "'".hesk_dbEscape($cf['value'])."'" : 'NULL').", + `order` = 990 + WHERE `id`={$_SESSION['cford']}"); + + // Update order + update_cf_order(); + + // Clear cache + hesk_purge_cache('cf'); + + // Show success + hesk_process_messages($hesklang['cf_added'],'custom_fields.php','SUCCESS'); + +} // End new_cf() diff --git a/admin/delete_tickets.php b/admin/delete_tickets.php index 4880d4cb..e387ea3f 100644 --- a/admin/delete_tickets.php +++ b/admin/delete_tickets.php @@ -1,32 +1,15 @@ -
    -
    -

    +
    +
    +
    +

    + +

    +
    + +
    +
    +
    +
    +
    + -
    - - -
    - - -
    +
    +
    -
    -
    -
    - - - - - +
    +
    + + + + +
    + + +
    +
    -
    - + +
    -
    +
    $v) { + if ($v['use'] && hesk_is_custom_field_in_category($k, $ticket['category'])) { + if ($v['req'] == 2) { + $v['req'] = '*'; + $required_attribute = 'data-error="' . $hesklang['this_field_is_required'] . '" required'; + } else { + $v['req'] = ''; + $required_attribute = ''; + } + + if ($v['type'] == 'checkbox') { + $tmpvar[$k]=''; + + if (isset($_POST[$k]) && is_array($_POST[$k])) { + foreach ($_POST[$k] as $myCB) { + $tmpvar[$k] .= ( is_array($myCB) ? '' : hesk_input($myCB) ) . '
    '; + } + $tmpvar[$k]=substr($tmpvar[$k],0,-6); + } else { + if ($v['req'] == 2) { + $hesk_error_buffer[$k]=$hesklang['fill_all'].': '.$v['name']; + } + $_POST[$k] = ''; + } + } elseif ($v['type'] == 'date') { + $tmpvar[$k] = hesk_POST($k); + $_SESSION["as_$k"] = ''; + + if (preg_match("/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/", $tmpvar[$k])) { + $date = strtotime($tmpvar[$k] . ' t00:00:00'); + $dmin = strlen($v['value']['dmin']) ? strtotime($v['value']['dmin'] . ' t00:00:00') : false; + $dmax = strlen($v['value']['dmax']) ? strtotime($v['value']['dmax'] . ' t00:00:00') : false; + + $_SESSION["as_$k"] = $tmpvar[$k]; + + if ($dmin && $dmin > $date) { + $hesk_error_buffer[$k] = sprintf($hesklang['d_emin'], $v['name'], hesk_custom_date_display_format($dmin, $v['value']['date_format'])); + } elseif ($dmax && $dmax < $date) { + $hesk_error_buffer[$k] = sprintf($hesklang['d_emax'], $v['name'], hesk_custom_date_display_format($dmax, $v['value']['date_format'])); + } else { + $tmpvar[$k] = $date; + } + } else { + if ($v['req'] == 2) { + $hesk_error_buffer[$k]=$hesklang['fill_all'].': '.$v['name']; + } + } + } elseif ($v['type'] == 'email') { + $tmp = $hesk_settings['multi_eml']; + $hesk_settings['multi_eml'] = $v['value']['multiple']; + $tmpvar[$k] = hesk_validateEmail( hesk_POST($k), 'ERR', 0); + $hesk_settings['multi_eml'] = $tmp; + + if ($tmpvar[$k] != '') { + $_SESSION["as_$k"] = hesk_input($tmpvar[$k]); + } else { + $_SESSION["as_$k"] = ''; + + if ($v['req'] == 2) { + $hesk_error_buffer[$k] = $v['value']['multiple'] ? sprintf($hesklang['cf_noem'], $v['name']) : sprintf($hesklang['cf_noe'], $v['name']); + } + } + } elseif ($v['req'] == 2) { + $tmpvar[$k]=hesk_makeURL(nl2br(hesk_input( hesk_POST($k) ))); + if ($tmpvar[$k] == '') { + $hesk_error_buffer[$k]=$hesklang['fill_all'].': '.$v['name']; + } + } else { + $tmpvar[$k]=hesk_makeURL(nl2br(hesk_input(hesk_POST($k)))); + } + } else { + $tmpvar[$k] = ''; + } + } + if (count($hesk_error_buffer)) { $myerror = '
      '; foreach ($hesk_error_buffer as $error) { @@ -137,51 +220,20 @@ if (isset($_POST['save'])) { $tmpvar['message'] = nl2br($tmpvar['message']); } - foreach ($hesk_settings['custom_fields'] as $k => $v) { - if ($v['use'] && isset($_POST[$k])) { - if ($v['type'] == 'date' && $_POST[$k] != '') { - $tmpvar[$k] = strtotime($_POST[$k]); - } elseif (is_array($_POST[$k])) { - $tmpvar[$k] = ''; - foreach ($_POST[$k] as $myCB) { - $tmpvar[$k] .= (is_array($myCB) ? '' : hesk_input($myCB)) . '
      '; - } - $tmpvar[$k] = substr($tmpvar[$k], 0, -6); - } else { - $tmpvar[$k] = hesk_makeURL(nl2br(hesk_input($_POST[$k]))); - } - } else { - $tmpvar[$k] = ''; - } + $custom_SQL = ''; + for ($i = 1; $i <= 50; $i++) { + $custom_SQL .= '`custom'.$i.'`=' . (isset($tmpvar['custom'.$i]) ? "'".hesk_dbEscape($tmpvar['custom'.$i])."'" : "''") . ','; } + $custom_SQL = rtrim($custom_SQL, ','); hesk_dbQuery("UPDATE `" . hesk_dbEscape($hesk_settings['db_pfix']) . "tickets` SET `name`='" . hesk_dbEscape($tmpvar['name']) . "', `email`='" . hesk_dbEscape($tmpvar['email']) . "', `subject`='" . hesk_dbEscape($tmpvar['subject']) . "', `message`='" . hesk_dbEscape($tmpvar['message']) . "', - `custom1`='" . hesk_dbEscape($tmpvar['custom1']) . "', - `custom2`='" . hesk_dbEscape($tmpvar['custom2']) . "', - `custom3`='" . hesk_dbEscape($tmpvar['custom3']) . "', - `custom4`='" . hesk_dbEscape($tmpvar['custom4']) . "', - `custom5`='" . hesk_dbEscape($tmpvar['custom5']) . "', - `custom6`='" . hesk_dbEscape($tmpvar['custom6']) . "', - `custom7`='" . hesk_dbEscape($tmpvar['custom7']) . "', - `custom8`='" . hesk_dbEscape($tmpvar['custom8']) . "', - `custom9`='" . hesk_dbEscape($tmpvar['custom9']) . "', - `custom10`='" . hesk_dbEscape($tmpvar['custom10']) . "', - `custom11`='" . hesk_dbEscape($tmpvar['custom11']) . "', - `custom12`='" . hesk_dbEscape($tmpvar['custom12']) . "', - `custom13`='" . hesk_dbEscape($tmpvar['custom13']) . "', - `custom14`='" . hesk_dbEscape($tmpvar['custom14']) . "', - `custom15`='" . hesk_dbEscape($tmpvar['custom15']) . "', - `custom16`='" . hesk_dbEscape($tmpvar['custom16']) . "', - `custom17`='" . hesk_dbEscape($tmpvar['custom17']) . "', - `custom18`='" . hesk_dbEscape($tmpvar['custom18']) . "', - `custom19`='" . hesk_dbEscape($tmpvar['custom19']) . "', - `custom20`='" . hesk_dbEscape($tmpvar['custom20']) . "', `language`='" . hesk_dbEscape($tmpvar['language']) . "', - `html`='" . hesk_dbEscape($tmpvar['html']) . "' + `html`='" . hesk_dbEscape($tmpvar['html']) . "', + $custom_SQL WHERE `id`='" . intval($ticket['id']) . "' LIMIT 1"); } @@ -207,283 +259,307 @@ require_once(HESK_PATH . 'inc/show_admin_nav.inc.php');
    • -
      -
      -

      - -
      - -
      +
      +
      +
      +

      + +

      +
      + +
      +
      +
      + $onsubmit = ''; + if ($modsForHesk_settings['rich_text_for_tickets']) { + $onsubmit = 'onsubmit="return validateRichText(\'message-help-block\', \'message-group\', \'message\', \''.htmlspecialchars($hesklang['this_field_is_required']).'\')"'; + } + ?> + > + +
      + + +
      + +
      +
      + '; + } ?>
      - + *'; + $required_attribute = 'data-error="' . $hesklang['this_field_is_required'] . '" required'; + } + ?> +
      - +
      - '; - } ?> -
      - +
      + -
      - +
      + +
      -
      -
      - - -
      - -
      -
      -
      - - -
      - -
      -
      - $v) { - if ($v['use']) { - if ($modsForHesk_settings['custom_field_setting']) { - $v['name'] = $hesklang[$v['name']]; +
      + *'; + $required_attribute = 'data-error="' . $hesklang['this_field_is_required'] . '" required'; } + ?> + - $k_value = $ticket[$k]; +
      + > +
      +
      +
      + $v) { + if ($v['use'] && hesk_is_custom_field_in_category($k, $ticket['category'])) { + $k_value = $ticket[$k]; - if ($v['type'] == 'checkbox') { - $k_value = explode('
      ', $k_value); - } + if ($v['type'] == 'checkbox') { + $k_value = explode('
      ', $k_value); + } - switch ($v['type']) { - /* Radio box */ - case 'radio': - echo ' -
      - -
      '; + if ($v['req'] == 2) { + $v['req'] = '*'; + $required_attribute = 'data-error="' . $hesklang['this_field_is_required'] . '" required'; + } else { + $v['req'] = ''; + $required_attribute = ''; + } - $options = explode('#HESK#', $v['value']); + switch ($v['type']) { + /* Radio box */ + case 'radio': + $cls = in_array($k, $_SESSION['iserror']) ? ' isError' : ''; + echo ' +
      + +
      '; + foreach ($v['value']['radio_options'] as $option) { + if (strlen($k_value) == 0) { + $k_value = $option; + $checked = empty($v['value']['no_default']) ? 'checked="checked"' : ''; + } elseif ($k_value == $option) { + $k_value = $option; + $checked = 'checked="checked"'; + } else { + $checked = ''; + } - foreach ($options as $option) { + echo '
      '; + } + echo '
      +
      '; - if (strlen($k_value) == 0 || $k_value == $option) { - $k_value = $option; - $checked = 'checked="checked"'; - } else { - $checked = ''; + break; + + /* Select drop-down box */ + case 'select': + + $cls = in_array($k, $_SESSION['iserror']) ? ' isError' : ''; + + echo ' +
      + +
      + ' . $option . '
      '; - } + foreach ($v['value']['select_options'] as $option) { + if ($k_value == $option) { + $k_value = $option; + $selected = 'selected'; + } else { + $selected = ''; + } - echo '
      -
      - '; - break; - - /* Select drop-down box */ - case 'select': - echo ' -
      - -
      +
      +
      +
      '; + break; - echo '
      -
      - '; - break; + /* Checkbox */ + case 'checkbox': + $cls = in_array($k, $_SESSION['iserror']) ? ' isError' : ''; + echo ' +
      + +
      '; + foreach ($v['value']['checkbox_options'] as $option) { + if (in_array($option, $k_value)) { + $checked = 'checked'; + } else { + $checked = ''; + } - /* Checkbox */ - case 'checkbox': - echo ' -
      - -
      '; - - $options = explode('#HESK#', $v['value']); - - foreach ($options as $option) { - - if (in_array($option, $k_value)) { - $checked = 'checked="checked"'; - } else { - $checked = ''; + echo '
      '; } + echo '
      +
      +
      '; + break; - echo '
      '; - } - - echo '
      -
      - '; - break; - - /* Large text box */ - case 'textarea': - $size = explode('#', $v['value']); - $size[0] = empty($size[0]) ? 5 : intval($size[0]); - $size[1] = empty($size[1]) ? 30 : intval($size[1]); - $k_value = hesk_msgToPlain($k_value, 0, 0); - - echo ' -
      - -
      - -
      -
      '; - break; - - case 'date': - if (strlen($k_value) != 0) { - $v['value'] = $k_value; - } - echo ' -
      - -
      - -
      -
      '; - break; - case 'multiselect': - echo '
      -
      -
      - - -
      '; - break; - - case 'hidden': - //Clean up multiple dashes or whitespaces - $formattedId = preg_replace("/[\s-]+/", " ", $v['name']); - $formattedId = preg_replace("/[\s_]/", "-", $formattedId); - - if (strlen($k_value) != 0) { - $v['value'] = $k_value; - } - - echo ''; - - break; - - case 'readonly': - //Clean up multiple dashes or whitespaces - $formattedId = preg_replace("/[\s-]+/", " ", $v['name']); - $formattedId = preg_replace("/[\s_]/", "-", $formattedId); - - if (strlen($k_value) != 0) { - $v['value'] = $k_value; - } - - echo '
      - -
      -
      '; - - break; - - /* Default text input */ - default: - if (strlen($k_value) != 0) { + /* Large text box */ + case 'textarea': + $cls = in_array($k, $_SESSION['iserror']) ? ' isError' : ''; $k_value = hesk_msgToPlain($k_value, 0, 0); - $v['value'] = $k_value; - } - echo ' -
      - -
      - -
      -
      - '; + + echo ' +
      + +
      + +
      +
      +
      '; + break; + + // Date + case 'date': + if ($required_attribute !== '') { + $required_attribute .= ' pattern="[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])"'; + } + + $cls = in_array($k, $_SESSION['iserror']) ? ' isError' : ''; + + $k_value = hesk_custom_date_display_format($k_value, 'Y-m-d'); + + echo ' +
      + +
      + +
      +
      +
      '; + break; + + // Email + case 'email': + $cls = in_array($k, $_SESSION['iserror']) ? ' class="isError" ' : ''; + + $suggest = $hesk_settings['detect_typos'] ? 'onblur="Javascript:hesk_suggestEmail(\'' . $k . '\', \'' . $k . '_suggestions\', 0, 1' . ($v['value']['multiple'] ? ',1' : '') . ')"' : ''; + + echo ' +
      + +
      + +
      +
      +
      +
      + '; + break; + + // Hidden (same as text for staff) + case 'hidden': + case 'readonly': + default: + if (strlen($k_value) != 0) { + $v['value']['default_value'] = $k_value; + } + + $cls = in_array($k, $_SESSION['iserror']) ? ' isError' : ''; + + echo ' +
      + +
      + +
      +
      +
      + '; + } } } - } - ?> + } ?> +
      + *'; + $required_attribute = 'data-error="' . $hesklang['this_field_is_required'] . '" required'; + } - -
      - + ?> + -
      - - -
      -
      +
      + + +
      +
      +
      - - + + + - +
      - + @@ -492,7 +568,10 @@ require_once(HESK_PATH . 'inc/show_admin_nav.inc.php');
      - + + + '; + } + /* Clean unneeded session variables */ + hesk_cleanSessionVars('hide'); + + /* Show the search form */ + require_once(HESK_PATH . 'inc/show_search_form.inc.php'); + ?> +
      +
      + diff --git a/admin/index.php b/admin/index.php index 5e7598f1..f3a3031b 100644 --- a/admin/index.php +++ b/admin/index.php @@ -1,35 +1,19 @@ -
      -
      - - -
      - -

       

      - - +
      - - - - - - - - - -
      - - - +
      + +
      -

      ()

      -
      +
      +
      +
      +

      + () +

      +
      + +
      +
      +
      + '.$hesklang['nosr'].''; + $show_default_category = true; + } else { + ?> + + '.$hesklang['nosr'].'

      '; - hesk_show_kb_category(1,1); - } - else - { -?> -
      - -
      -
      - - ' . mfh_get_stars($article['rating']) . ''; + } + else + { + $rat = ''; + } - if ($hesk_settings['kb_rating']) - { - $alt = $article['rating'] ? sprintf($hesklang['kb_rated'], sprintf("%01.1f", $article['rating'])) : $hesklang['kb_not_rated']; - $rat = ''; - } - else - { - $rat = ''; - } - - echo ' + echo ' - -
      '.$alt.'
      @@ -207,18 +203,16 @@ function hesk_kb_search($query) '; - } - ?> -
      - -
      - -


       

      + } + ?> +
      +   + +
      +
      +
      '.$article['subject'].' -
      +?> +
      +
      +
      +

      + +

      +
      + +
      +
      +
      + +
      + + + +
      + '.$hesklang['as'].' - '. $article['content']; - - if ( ! empty($article['attachments'])) - { - echo '

      '.$hesklang['attachments'].':
      '; - $att=explode(',',substr($article['attachments'], 0, -1)); - foreach ($att as $myatt) - { - list($att_id, $att_name) = explode('#', $myatt); - echo ' '.$att_name.'
      '; + if ($article['catid']==1) + { + $link = 'knowledgebase_private.php'; } - echo '

      '; - } + else + { + $link = 'knowledgebase_private.php?category='.$article['catid']; + } + ?> +

      +
      + -

      -
      - +
      +
      +
      +

      + +

      +
      + +
      +
      +
      + + + + + + + + + + + + + + + + + +
      : + ' . $hesklang['public_link'] . ']'; + } + ?> +
      :
      :
      :
      +
      +
      +
      + +
      +
      +
      +

      + +

      +
      + +
      +
      +
      + $subject) + { + echo ' '.$subject.'
      '; + } + ?> +
      +
      +
      + +
      - // Stop when articles reach less than 10% of base score - if ($related['score'] / $base_score < 0.10) - { - break; - } - - // This is a valid related article - $related_articles[$related['id']] = $related['subject']; - } - - // Print related articles if we have any valid matches - if ( count($related_articles) ) { - $column = 'col-md-6'; - $showRelated = true; - } - ?> -
      -

      -
      - - - - - - - - - - - - - - - - - -
      :
      :
      :
      :
      -
      - -
      -

      -
      - $subject) - { - echo ' '.$subject.'
      '; - } - ?> -
      - -
      - - -


       

      - -

       

      - +


       

      + +
      +'.$hesklang['kb_cat'].': '.$thiscat['name'].' -

      '.$hesklang['back'].'

      -
      '; - } - - $result = hesk_dbQuery("SELECT `id`,`name`,`articles`,`type` FROM `".hesk_dbEscape($hesk_settings['db_pfix'])."kb_categories` WHERE `parent`='".intval($catid)."' ORDER BY `parent` ASC, `cat_order` ASC"); - if (hesk_dbNumRows($result) > 0) - { - ?> - -

      -
      - - - -
      - - - +?> +
      + +

      +

      + + +

      '; - } + if (hesk_dbNumRows($result) > 0) { + ?> +
      +
      +

      + +

      +
      + +
      +
      +
      +
      + '; + } + + $private = ($cat['type'] == 1) ? ' *' : ''; + + echo ' '; - if ($i == $per_col) - { - echo ''; - $i = 0; - } - $i++; - } - /* Finish the table if needed */ - if ($i != 1) - { - for ($j=1;$j<=$per_col;$j++) - { - echo ''; - if ($i == $per_col) - { - echo ''; - break; - } - $i++; - } - } + if ($i == $per_col) + { + echo ''; + $i = 0; + } + $i++; + } + /* Finish the table if needed */ + if ($i != 1) + { + for ($j=1;$j<=$per_col;$j++) + { + echo ''; + if ($i == $per_col) + { + echo ''; + break; + } + $i++; + } + } - ?> -
      '; - /* Print most popular/sticky articles */ - if ($hesk_settings['kb_numshow'] && $cat['articles']) - { - $res = hesk_dbQuery("SELECT `id`,`subject`,`type` FROM `".hesk_dbEscape($hesk_settings['db_pfix'])."kb_articles` WHERE `catid`='".intval($cat['id'])."' AND `type` IN ('0','1') ORDER BY `sticky` DESC, `views` DESC, `art_order` ASC LIMIT " . (intval($hesk_settings['kb_numshow']) + 1) ); - $num = 1; - while ($art = hesk_dbFetchAssoc($res)) - { - $private = ($art['type'] == 1) ? ' *' : ''; - echo ' + /* Print most popular/sticky articles */ + if ($hesk_settings['kb_numshow'] && $cat['articles']) + { + $res = hesk_dbQuery("SELECT `id`,`subject`,`type` FROM `".hesk_dbEscape($hesk_settings['db_pfix'])."kb_articles` WHERE `catid`='".intval($cat['id'])."' AND `type` IN ('0','1') ORDER BY `sticky` DESC, `views` DESC, `art_order` ASC LIMIT " . (intval($hesk_settings['kb_numshow']) + 1) ); + $num = 1; + while ($art = hesk_dbFetchAssoc($res)) + { + $private = ($art['type'] == 1) ? ' *' : ''; + echo ' '; - if ($num == $hesk_settings['kb_numshow']) - { - break; - } - else - { - $num++; - } - } - if (hesk_dbNumRows($res) > $hesk_settings['kb_numshow']) - { - echo ''; - } - } + if ($num == $hesk_settings['kb_numshow']) + { + break; + } + else + { + $num++; + } + } + if (hesk_dbNumRows($res) > $hesk_settings['kb_numshow']) + { + echo ''; + } + } - echo ' + echo '
       '.$cat['name'].''.$private.'
             '.$art['subject'].''.$private.'
      » '.$hesklang['m'].'
      » '.$hesklang['m'].'
       
       
      + ?> +
      +
      + +
    + +
    +
    +

    + +

    +
    + +
    +
    +
    + '.$hesklang['noac'].''; + } + else + { + echo ''; + while ($article = hesk_dbFetchAssoc($res)) + { + $private = ($article['type'] == 1) ? ' *' : ''; - - -
    + $txt = hesk_kbArticleContentPreview($article['content']); - 0 - ?> -
    -

    -
    - - - - - -
    - - '.$hesklang['noac'].'

    '; - } - else - { - echo '
    '; - while ($article = hesk_dbFetchAssoc($res)) - { - $private = ($article['type'] == 1) ? ' *' : ''; - - $txt = hesk_kbArticleContentPreview($article['content']); - - echo ' + echo ' '; - } - echo '
    @@ -528,14 +564,16 @@ function hesk_show_kb_category($catid, $is_search = 0) {
    '; - } - ?> - -
    + } + echo ''; + } + ?> +
    + +
    + -
    -
    -
    -
    -
      - ' . $hesk_settings['mailtmp']['inbox'] . ' -
    • ' . $hesk_settings['mailtmp']['outbox'] . '
    • -
    • ' . $hesk_settings['mailtmp']['new'] . '
    • '; - ?> -
    +
    +
    +
    +
    +
    +

    + +

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

    + +

    +
    + +
    +
    +
    + +
    +
    + + +
    -
    -

    - -
    - - -
    -
    + '.$admins[$pm[$hesk_settings['mailtmp']['other']]].'' : (($pm['from'] == 9999) ? 'HESK.com' : $hesklang['e_udel']); - - echo $pm['dt']; $pm['dt'] = hesk_dateToString($pm['dt'],0,1,0,true); ?> +
    +
    +

    + +

    +
    + +
    +
    +
    +
    +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    +
    + + + - + @@ -620,78 +629,89 @@ function show_new_form() { global $hesk_settings, $hesklang, $admins; ?> -
    + -

    +
    +
    +

    + +

    +
    + +
    +
    +
    +
    + -
    - -
    - - -
    - + + $v) { + if ($k != $_SESSION['id']) { + if (isset($_SESSION['mail']) && $k == $_SESSION['mail']['to']) { + echo ''; + } else { + echo ''; + } + } } - } - } - ?> - -
    -
    -
    -
    - + ?> + +
    +
    +
    +
    + -
    - data-error="" required> -
    -
    -
    -
    - +
    + data-error="" required> +
    +
    +
    +
    + -
    +
    -
    -
    -
    -
    -
    -
    - () +
    +
    +
    +
    +
    +
    + () +
    +
    +
    +
    +
    + + + +
    -
    -
    - - - -
    -
    + diff --git a/admin/manage_canned.php b/admin/manage_canned.php index 191ba920..726ad8cf 100644 --- a/admin/manage_canned.php +++ b/admin/manage_canned.php @@ -1,32 +1,15 @@ -
    -
    -
    -
    -
    - ' . $hesklang['no_saved'] . '

    '; - } - else - { ?> -
    - - - - -
    - - - - - -
    - - - - - - - - - - - - - + + +
    -
    - - '; - $folder = ''; - } - echo ''; - ?> - -
    - -

    - -
    -
    - - +

    + + +
    - - - - - +
    +
    +

    + +

    +
    + +
    +
    +
    + ' . $hesklang['no_saved'] . '

    '; + } + else + { ?> +
    + + + + + ' . $mysaved['title'] . ''; + $options .= ' '; - } // End while - } - ?> -
    ' . $mysaved['title'] . ' '; - if ($num > 1) { - if ($j == 1) { - echo ' '; - } elseif ($j == $num) { - echo ' '; - } else { - echo ' + if ($num > 1) { + if ($j == 1) { + echo ' '; + } elseif ($j == $num) { + echo ' '; + } else { + echo ' '; - } - } else { - echo ''; } + } else { + echo ''; + } - echo ' + echo '  
    -
    + } // End while + } + ?> +
    @@ -225,117 +219,123 @@ $num = hesk_dbNumRows($result); /* ]]> */ -
    - + + - - -

    - -
    - - -
    > -

    - -
    -
    -
    - 0) { - ?> -
    -
    - -
    -
    -
    -
    -
    - : + ?> + > +
    +
    + 0) { + ?> +
    +
    +
    + +
    -
    - +
    +
    +
    + : +
    +
    +
    + +
    -
    - '; - } - ?> + '; + } + ?> +
    -
    -
    - +
    + -
    +
    required> -
    +
    +
    -
    -
    - +
    + -
    +
    -
    - : - | - | - | - | - - $v) { - if ($v['use']) { - if ($modsForHesk_settings['custom_field_setting']) { - $v['name'] = $hesklang[$v['name']]; - } +
    + : + | + | + | + | + + $v) { + if ($v['use']) { + if ($modsForHesk_settings['custom_field_setting']) { + $v['name'] = $hesklang[$v['name']]; + } - echo '| ' . $v['name'] . ' '; + echo '| ' . $v['name'] . ' '; + } } - } - ?> + ?> +
    -
    -
    - - -
    - +
    + + +
    + +
    -
    + array('value' => 3, 'text' => $hesklang['low'], 'formatted' => $hesklang['low']), - 2 => array('value' => 2, 'text' => $hesklang['medium'], 'formatted' => '' . $hesklang['medium'] . ''), - 1 => array('value' => 1, 'text' => $hesklang['high'], 'formatted' => '' . $hesklang['high'] . ''), - 0 => array('value' => 0, 'text' => $hesklang['critical'], 'formatted' => '' . $hesklang['critical'] . ''), + 2 => array('value' => 2, 'text' => $hesklang['medium'], 'formatted' => '' . $hesklang['medium'] . ''), + 1 => array('value' => 1, 'text' => $hesklang['high'], 'formatted' => '' . $hesklang['high'] . ''), + 0 => array('value' => 0, 'text' => $hesklang['critical'], 'formatted' => '' . $hesklang['critical'] . ''), ); /* What should we do? */ @@ -106,221 +90,232 @@ while ($mycat = hesk_dbFetchAssoc($res)) { $options .= '>' . $mycat['name'] . ''; } ?> -
    -
    -
    -
    +
    +
    +
    +

    -

    -
    -
    -
    -

    - ()

    - -
    - - data-error="" - required> -
    -
    -
    -
    - - -
    -

    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - - -
    - -
    -
    -
    - -
    - -
    -
    -
    -
    - - - -
    -
    + +
    +
    +
    +
    +
    +

    + ()

    + +
    + + data-error="" + required> +
    +
    +
    +
    + + +
    + + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + + +
    + +
    +
    +
    + +
    + +
    +
    +
    +
    + + + +
    +
    +
    -
    -
    -
    +
    +
    +

    +

    +
    +
    -
    +
    +
    + + + + + + + + + + + + + -
    - - - - - - - - - - - ' + $usage = array( + 0 => '', - 1 => '', - 2 => ' ' - ); + 1 => '', + 2 => ' ' + ); - while ($mycat = hesk_dbFetchAssoc($res)) { - $j++; + while ($mycat = hesk_dbFetchAssoc($res)) { + $j++; - if (isset($_SESSION['selcat2']) && $mycat['id'] == $_SESSION['selcat2']) { - $color = 'admin_green'; - unset($_SESSION['selcat2']); + if (isset($_SESSION['selcat2']) && $mycat['id'] == $_SESSION['selcat2']) { + $color = 'admin_green'; + unset($_SESSION['selcat2']); + } else { + $color = $i ? 'admin_white' : 'admin_gray'; + } + + $tmp = $i ? 'White' : 'Blue'; + $style = ''; + if ($mycat['color'] == null) { + $style .= 'color: black; border: solid 1px #000'; + } else { + $style .= 'background: ' . $mycat['color']; + } + $i = $i ? 0 : 1; + + /* Number of tickets and graph width */ + $all = isset($tickets_all[$mycat['id']]) ? $tickets_all[$mycat['id']] : 0; + $width_all = 0; + if ($tickets_total && $all) { + $width_all = round(($all / $tickets_total) * 100); + } + + /* Deleting category with ID 1 (default category) is not allowed */ + if ($mycat['id'] == 1) { + $remove_code = ' '; + } else { + $remove_code = ' '; + } + + /* Is category private or public? */ + if ($mycat['type']) { + $type_code = ''; + } else { + $type_code = ''; + } + + /* Is auto assign enabled? */ + if ($hesk_settings['autoassign']) { + if ($mycat['autoassign']) { + $autoassign_code = ''; } else { - $color = $i ? 'admin_white' : 'admin_gray'; + $autoassign_code = ''; } + } else { + $autoassign_code = ''; + } - $tmp = $i ? 'White' : 'Blue'; - $style = ''; - if ($mycat['color'] == null) { - $style .= 'color: black; border: solid 1px #000'; - } else { - $style .= 'background: ' . $mycat['color']; - } - $i = $i ? 0 : 1; - - /* Number of tickets and graph width */ - $all = isset($tickets_all[$mycat['id']]) ? $tickets_all[$mycat['id']] : 0; - $width_all = 0; - if ($tickets_total && $all) { - $width_all = round(($all / $tickets_total) * 100); - } - - /* Deleting category with ID 1 (default category) is not allowed */ - if ($mycat['id'] == 1) { - $remove_code = ' '; - } else { - $remove_code = ' '; - } - - /* Is category private or public? */ - if ($mycat['type']) { - $type_code = ''; - } else { - $type_code = ''; - } - - /* Is auto assign enabled? */ - if ($hesk_settings['autoassign']) { - if ($mycat['autoassign']) { - $autoassign_code = ''; - } else { - $autoassign_code = ''; - } - } else { - $autoassign_code = ''; - } - - echo ' + echo ' @@ -342,31 +337,30 @@ while ($mycat = hesk_dbFetchAssoc($res)) { ' . $autoassign_code . ' ' . $type_code . ' '; - if ($orderBy != 'name' && $num > 1) { - if ($j == 1) { - echo ' '; - } elseif ($j == $num) { - echo ''; - } else { - echo ' + if ($orderBy != 'name' && $num > 1) { + if ($j == 1) { + echo ' '; + } elseif ($j == $num) { + echo ''; + } else { + echo '   '; - } } - echo ''; - echo $remove_code . ' + } + echo ''; + echo $remove_code . ' '; - } // End while + } // End while - ?> -
    -
    + ?> +
    -
    +
    + + + -
    -

    -
    +
    +

    + + + + +

    + - - - - - - - - -

    -
    - -

    -
    -
    -
    -

    - -  
    - -
     
    + // Show a notice if total public articles is less than 5 + if ($total_articles < 5) + { + hesk_show_notice($hesklang['nkba']); + } + ?> +
    +
    + +
    +
    +
    +
    +

    + +

    +
    + +
    +
    +
    +
      +
    • +
    • +
    • +
    • +
    +
    +
    +
    +
    + - - - - -

    -
    +
    + +
    > +
    +
    +

    + +

    +
    + +
    +
    +
    + - - > -
    -
    -
    -
    -
    -
    - - + +
    +
    + +
    +
    + + required> +
    +
    +
    + +
    +
    +
    +
    +
    +
    +

    + +

    +
    + +
    +
    +
    +
    +
    +
    + + +
    +
    + + +
    + +
    +
    + +
    +
    + +
    +
    +
    + +
    + +
    +
    -
    - - +
    + +


    + +
    + +
    + + +
    + -
    - -
    -
    - -
    -
    - -
    -
    - -
    - -
    +
    +
    +
    -
    - - - -
    -
    - -
    -
    - - required> -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    - -


    - -
    - -
    - - -
    - -
    -
    - - - -
    - - -
    -
    -
    -
    -
    -
    - - - - - - -
    - -
    - - - - -
    - - - -
    - -

     

    -
      -

    - -

    -
    - -
    -
    -
    + +
  • - - - - - -
    -
    - + +
    +
    + -
    -
    -
    -

    -
    - -
    - -
    - -
    -
    -
    -
    - -
    - -
    -
    -
    - -
    -
    - -

    + ?> +
    +
    + +
    +
    +

    + +

    +
    + +
    -
    - -

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

    +
    +
    + +

    +
    +
    +
    +
    +
    + + +
    + + +
    +
    +
    -
    -
    -
    - - -
    - - -
    -
    -
    - + +
    -
    + - - - - - - +
    + +
    +
    +

    + +

    +
    + +
    +
    +
    + + + + + + + + + + + - - + $j=1; + + while ($article = hesk_dbFetchAssoc($res)) + { + + if (isset($_SESSION['artord']) && $article['id'] == $_SESSION['artord']) + { + unset($_SESSION['artord']); + } + + // Check for articles with no existing parent category + if ( ! isset($kb_cat[$article['catid']]) ) + { + $article['catid'] = hesk_stray_article($article['id']); + } + + ?> + + + + + + + +
     
    . + + +
    + +
    + +
    +
    '.$hesklang['kb_no_dart'].'   '.$hesklang['kb_i_art2'].'

    '; - } - else - { - ?> - - -

    »

    - -
    - - - - - - - - - - - - - - - -
       
    . - <?php echo $hesklang['viewart']; ?> /> - - <?php echo $hesklang['delete']; ?> /> 
    -
    -  '; @@ -722,116 +744,119 @@ function list_private() { /* Print main manage users page */ require_once(HESK_PATH . 'inc/show_admin_nav.inc.php'); - ?> - - - - + $res = hesk_dbQuery("SELECT * FROM `". hesk_dbEscape($hesk_settings['db_pfix'])."kb_articles` WHERE `type`='1' " . (count($private_categories) ? " OR `catid` IN('" . implode("','", $private_categories) . "') " : '') . " ORDER BY `catid` ASC, `id` ASC"); + $num = hesk_dbNumRows($res); + ?> +
    + +
    +
    +

    + +

    +
    + +
    +
    +
    + '.$hesklang['kb_no_part'].'

    '; + } + else + { + ?> + + + + + + + + + + + + + + - - + $i=1; + $j=1; + + while ($article = hesk_dbFetchAssoc($res)) + { + + if (isset($_SESSION['artord']) && $article['id'] == $_SESSION['artord']) + { + unset($_SESSION['artord']); + } + + // Check for articles with no existing parent category + if ( ! isset($kb_cat[$article['catid']]) ) + { + $article['catid'] = hesk_stray_article($article['id']); + } + + $tmp = $i ? 'White' : 'Blue'; + $i = $i ? 0 : 1; + + + if ($hesk_settings['kb_rating']) + { + $alt = $article['rating'] ? sprintf($hesklang['kb_rated'], sprintf("%01.1f", $article['rating'])) : $hesklang['kb_not_rated']; + $rat = ''; + } + else + { + $rat = ''; + } + + ?> + + + + + + + + + +
     
    ' . mfh_get_stars(hesk_round_to_half($article['rating'])) . ' (' . $article['votes'] . ')
    . + + +  
    + +
    + +
    +
    '.$hesklang['kb_no_part'].'   '.$hesklang['kb_i_art2'].'

    '; - } - else - { - ?> - - -

    »

    - -
    - - - - - - - - - - - - '.$alt.' ('.$article['votes'].') '; - } - else - { - $rat = ''; - } - - ?> - - - - - - - - - -
       
    . - <?php echo $hesklang['viewart']; ?> /> - - <?php echo $hesklang['delete']; ?> /> 
    -
    -  '; @@ -991,7 +1016,7 @@ function remove_kb_att() // Remove attachment from article $art['attachments'] = str_replace($att_id.'#'.$att['real_name'].',','',$art['attachments']); - hesk_dbQuery("UPDATE `".hesk_dbEscape($hesk_settings['db_pfix'])."kb_articles` SET `attachments`='".hesk_dbEscape($art['attachments'])."', `history`=CONCAT(`history`,'".hesk_dbEscape($revision)."') WHERE `id`='".intval($id)."' LIMIT 1"); + hesk_dbQuery("UPDATE `".hesk_dbEscape($hesk_settings['db_pfix'])."kb_articles` SET `attachments`='".hesk_dbEscape($art['attachments'])."', `history`=CONCAT(`history`,'".hesk_dbEscape($revision)."') WHERE `id`='".intval($id)."'"); hesk_process_messages($hesklang['kb_att_rem'],'manage_knowledgebase.php?a=edit_article&id='.$id,'SUCCESS'); } // END remove_kb_att() @@ -1064,7 +1089,7 @@ function edit_category() } // Now delete the category - hesk_dbQuery("DELETE FROM `".hesk_dbEscape($hesk_settings['db_pfix'])."kb_categories` WHERE `id`='".intval($catid)."' LIMIT 1"); + hesk_dbQuery("DELETE FROM `".hesk_dbEscape($hesk_settings['db_pfix'])."kb_categories` WHERE `id`='".intval($catid)."'"); $_SESSION['hide'] = array( //'treemenu' => 1, @@ -1075,7 +1100,7 @@ function edit_category() hesk_process_messages($hesklang['kb_cat_dlt'],'./manage_knowledgebase.php','SUCCESS'); } - hesk_dbQuery("UPDATE `".hesk_dbEscape($hesk_settings['db_pfix'])."kb_categories` SET `name`='".hesk_dbEscape($title)."',`parent`=".intval($parent).",`type`='".intval($type)."' WHERE `id`='".intval($catid)."' LIMIT 1"); + hesk_dbQuery("UPDATE `".hesk_dbEscape($hesk_settings['db_pfix'])."kb_categories` SET `name`='".hesk_dbEscape($title)."',`parent`=".intval($parent).",`type`='".intval($type)."' WHERE `id`='".intval($catid)."'"); unset($_SESSION['hide']); @@ -1101,6 +1126,7 @@ function save_article() $old_catid = intval( hesk_POST('old_catid') ); $old_type = intval( hesk_POST('old_type') ); $old_type = ($old_type < 0 || $old_type > 2) ? 0 : $old_type; + $from = hesk_POST('from'); $subject = hesk_input( hesk_POST('subject') ) or $hesk_error_buffer[] = $hesklang['kb_e_subj']; @@ -1114,9 +1140,9 @@ function save_article() $content = hesk_getHTML( hesk_POST('content') ); // Clean the HTML code - require(HESK_PATH . 'inc/htmlpurifier/HTMLPurifier.standalone.php'); - $purifier = new HTMLPurifier(); - $content = $purifier->purify($content); + require(HESK_PATH . 'inc/htmlpurifier/HeskHTMLPurifier.php'); + $purifier = new HeskHTMLPurifier($hesk_settings['cache_dir']); + $content = $purifier->heskPurify($content); } else { @@ -1199,7 +1225,7 @@ function save_article() $hesk_error_buffer = $tmp; $hesk_error_buffer = $hesklang['rfm'].'

      '.$hesk_error_buffer.'
    '; - hesk_process_messages($hesk_error_buffer,'./manage_knowledgebase.php?a=edit_article&id='.$id); + hesk_process_messages($hesk_error_buffer,'./manage_knowledgebase.php?a=edit_article&id='.$id.'&from='.$from); } /* Add to database */ @@ -1226,7 +1252,7 @@ function save_article() `html`='".intval($html)."', `sticky`='".intval($sticky)."', `history`=CONCAT(`history`,'".hesk_dbEscape($revision)."') - WHERE `id`='".intval($id)."' LIMIT 1"); + WHERE `id`='".intval($id)."'"); $_SESSION['artord'] = $id; @@ -1237,7 +1263,20 @@ function save_article() // Update article order update_article_order($catid); - hesk_process_messages($hesklang['your_kb_mod'],'./manage_knowledgebase.php?a=manage_cat&catid='.$catid,'SUCCESS'); + // Redirect to the correct page + switch ($from) { + case 'draft': + $redirect_action = 'a=list_draft'; + break; + case 'private': + $redirect_action = 'a=list_private'; + break; + default: + $redirect_action = 'a=manage_cat&catid='.$catid; + break; + } + + hesk_process_messages($hesklang['your_kb_mod'],'./manage_knowledgebase.php?'.$redirect_action,'SUCCESS'); } // END save_article() @@ -1268,6 +1307,8 @@ function edit_article() $catid = $article['catid']; + $from = hesk_GET('from'); + if (isset($_SESSION['edit_article'])) { $_SESSION['edit_article'] = hesk_stripArray($_SESSION['edit_article']); @@ -1363,11 +1404,6 @@ function edit_article() require_once(HESK_PATH . 'inc/show_admin_nav.inc.php'); ?> - - - - -
    - - - - -
    -
    + + + + + +
    +
    @@ -1635,47 +1672,40 @@ function manage_category() { require_once(HESK_PATH . 'inc/show_admin_nav.inc.php'); ?> - - - +
    + - - - - - -

    :

    - - -  
    - - -
    - -
    -
    -
    -
    -
    + if ( ! isset($_SESSION['hide']['article_list'])): + ?> +
    + +
    +
    +
    +

    + +

    +
    + +
    +
    +
    + onsubmit="Javascript:return hesk_deleteIfSelected('dodelete','')">
    + data-error="" required>
    @@ -1722,161 +1752,166 @@ function manage_category() {
    -
    - -
    - '.$hesklang['kb_no_art'].'   '.$hesklang['kb_i_art2'].'

    '; - } - else - { - /* Get number of sticky articles */ - $res2 = hesk_dbQuery("SELECT COUNT(*) FROM `".hesk_dbEscape($hesk_settings['db_pfix'])."kb_articles` WHERE `catid`='{$catid}' AND `sticky` = '1' "); - $num_sticky = hesk_dbResult($res2); - - $num_nosticky = $num - $num_sticky; - - ?> -

    '.$hesklang['kb_i_art2'].''; ?>

    -
    - - - - - - - - - - - - - ' . $hesklang['kb_private'] . ''; - break; - case '2': - $type = '' . $hesklang['kb_draft'] . ''; - break; - default: - $type = '' . $hesklang['kb_published'] . ''; - } - - if ($hesk_settings['kb_rating']) - { - $alt = $article['rating'] ? sprintf($hesklang['kb_rated'], sprintf("%01.1f", $article['rating'])) : $hesklang['kb_not_rated']; - $rat = ''; - } - else - { - $rat = ''; - } - - ?> - - - - - - - - - -
       
    '.$alt.' ('.$article['votes'].')
    . - 1) - { - if ($k == 1) - { - ?> - - + +
    +
    +
    +

    + '.$this_cat['name']).''; ?> +

    +
    + +
    +
    +
    - - - '.$hesklang['kb_no_art'].'

    '; } else { - ?> - - - 1 || $num_nosticky > 1 ) - { - echo ' '; - } - ?> - - - -  
    + /* Get number of sticky articles */ + $res2 = hesk_dbQuery("SELECT COUNT(*) FROM `".hesk_dbEscape($hesk_settings['db_pfix'])."kb_articles` WHERE `catid`='{$catid}' AND `sticky` = '1' "); + $num_sticky = hesk_dbResult($res2); - + $num_nosticky = $num - $num_sticky; + ?> + + + + + + + + + + + + + + - + $i=1; + $j=1; + $k=1; + $previous_sticky=1; + $num = $num_sticky; -  '; + if ($previous_sticky != $article['sticky']) + { + $k = 1; + $num = $num_nosticky; + $previous_sticky = $article['sticky']; + } + if (isset($_SESSION['artord']) && $article['id'] == $_SESSION['artord']) + { + unset($_SESSION['artord']); + } + + $tmp = $i ? 'White' : 'Blue'; + $i = $i ? 0 : 1; + + switch ($article['type']) + { + case '1': + $type = '' . $hesklang['kb_private'] . ''; + break; + case '2': + $type = '' . $hesklang['kb_draft'] . ''; + break; + default: + $type = '' . $hesklang['kb_published'] . ''; + } + + if ($hesk_settings['kb_rating']) + { + $alt = $article['rating'] ? sprintf($hesklang['kb_rated'], sprintf("%01.1f", $article['rating'])) : $hesklang['kb_not_rated']; + $rat = ''; + } + else + { + $rat = ''; + } + + ?> + + + + + + + + + +
       
    ' . mfh_get_stars(hesk_round_to_half($article['rating'])) . ' (' . $article['votes'] . ')
    . + 1) + { + if ($k == 1) + { + ?> + + + + + + + + + 1 || $num_nosticky > 1 ) + { + echo ' '; + } + ?> + + + +  
    + + +
    + +
    +
    +
    + +
    + + purify($content); + require(HESK_PATH . 'inc/htmlpurifier/HeskHTMLPurifier.php'); + $purifier = new HeskHTMLPurifier($hesk_settings['cache_dir']); + $content = $purifier->heskPurify($content); } else { @@ -2128,8 +2163,9 @@ function remove_article() $article = hesk_dbFetchAssoc($result); $catid = intval($article['catid']); + $from = hesk_GET('from'); - $result = hesk_dbQuery("DELETE FROM `".hesk_dbEscape($hesk_settings['db_pfix'])."kb_articles` WHERE `id`='".intval($id)."' LIMIT 1"); + $result = hesk_dbQuery("DELETE FROM `".hesk_dbEscape($hesk_settings['db_pfix'])."kb_articles` WHERE `id`='".intval($id)."'"); // Remove any attachments delete_kb_attachments($article['attachments']); @@ -2148,7 +2184,20 @@ function remove_article() hesk_dbQuery("UPDATE `".hesk_dbEscape($hesk_settings['db_pfix'])."kb_categories` SET `articles_draft`=`articles_draft`-1 WHERE `id`='{$catid}'"); } - hesk_process_messages($hesklang['your_kb_deleted'],'./manage_knowledgebase.php?a=manage_cat&catid='.$catid,'SUCCESS'); + // Redirect to the correct page + switch ($from) { + case 'draft': + $redirect_action = 'a=list_draft'; + break; + case 'private': + $redirect_action = 'a=list_private'; + break; + default: + $redirect_action = 'a=manage_cat&catid='.$catid; + break; + } + + hesk_process_messages($hesklang['your_kb_deleted'],'./manage_knowledgebase.php?'.$redirect_action,'SUCCESS'); } // End remove_article() @@ -2164,7 +2213,7 @@ function order_category() $_SESSION['newcat'] = $catid; - $result = hesk_dbQuery("UPDATE `".hesk_dbEscape($hesk_settings['db_pfix'])."kb_categories` SET `cat_order`=`cat_order`+".intval($move)." WHERE `id`='".intval($catid)."' LIMIT 1"); + $result = hesk_dbQuery("UPDATE `".hesk_dbEscape($hesk_settings['db_pfix'])."kb_categories` SET `cat_order`=`cat_order`+".intval($move)." WHERE `id`='".intval($catid)."'"); if (hesk_dbAffectedRows() != 1) { hesk_error($hesklang['kb_cat_inv']); @@ -2190,7 +2239,7 @@ function order_article() $_SESSION['artord'] = $id; - $result = hesk_dbQuery("UPDATE `".hesk_dbEscape($hesk_settings['db_pfix'])."kb_articles` SET `art_order`=`art_order`+".intval($move)." WHERE `id`='".intval($id)."' LIMIT 1"); + $result = hesk_dbQuery("UPDATE `".hesk_dbEscape($hesk_settings['db_pfix'])."kb_articles` SET `art_order`=`art_order`+".intval($move)." WHERE `id`='".intval($id)."'"); if (hesk_dbAffectedRows() != 1) { hesk_error($hesklang['kb_art_id']); @@ -2209,19 +2258,28 @@ function show_treeMenu() { ?> -

    -
    +
    +
    +

    + +

    +
    + +
    +
    +
    + printMenu(); ?> + =
    + =
    + =
    + (1, 2, 3) =
    +
    +
    - printMenu(); - ?> -  
    - =
    - =
    - =
    - (1, 2, 3) =
    -
    -
    - -
    -
    -

    - - - - - - -

    +
    + +
    +
    +

    + + +

    +
    +
    +
    +
    + + + @@ -129,23 +115,23 @@ while ($row = hesk_dbFetchAssoc($res)) { - - - - - - - - - - "> + + + + + + + + + @@ -159,7 +145,7 @@ while ($row = hesk_dbFetchAssoc($res)) {
    -
    +
    -
    - +
    +
    + +
    diff --git a/admin/manage_statuses.php b/admin/manage_statuses.php index 88c6b845..1b24074d 100644 --- a/admin/manage_statuses.php +++ b/admin/manage_statuses.php @@ -9,6 +9,7 @@ require(HESK_PATH . 'hesk_settings.inc.php'); require(HESK_PATH . 'inc/common.inc.php'); require(HESK_PATH . 'inc/admin_functions.inc.php'); require(HESK_PATH . 'inc/status_functions.inc.php'); +require(HESK_PATH . 'inc/mail_functions.inc.php'); hesk_load_database_functions(); hesk_session_start(); @@ -45,318 +46,336 @@ require_once(HESK_PATH . 'inc/headerAdmin.inc.php'); /* Print main manage users page */ require_once(HESK_PATH . 'inc/show_admin_nav.inc.php'); ?> - -
    - +
    +
    +
    + + +
    +
    +

    + + + + +

    +
    + + + + + + + + + + + $row): ?> - - - - -
    - - - - - - - - - - $row): - ?> - - - - - + + + + - - - -
    - - - - - '; - } - ?> - +
    + + + + + '; + } + ?> + - - - - style=";"> + + + + style=";"> -
    + + + + + +
    +
    +
    +

    +
    +
    +
    + + +
    + +
    +
    +
    + + +
    + +
    +
    +
    + + +
    + +
    +
    +
    + + +
    + +
    +
    +
    + + +
    + +
    +
    +
    + + +
    + +
    +
    +
    + + +
    + +
    +
    +
    + + +
    + +
    +
    +
    +
    +
    + + +
    +
    -
    -
    -

    -
    -
    -
    - - -
    - -
    -
    -
    - - -
    - -
    -
    -
    - - -
    - -
    -
    -
    - - -
    - -
    -
    -
    - - -
    - -
    -
    -
    - - -
    - -
    -
    -
    - - -
    - -
    -
    -
    - - -
    - -
    -
    -
    -
    -
    - - -
    - +
    + + + -
    - -
    - - - - -

    - -
    - +
    + + +
    +
    +

    + + + + +

    +
    + +
    +
    +
    + * +
    + +
    +
    +
    +
    +
    +

    + + + + +

    +
    + +
    +
    +
    @@ -253,11 +259,11 @@ if ($action = hesk_REQUEST('a')) { /* To edit yourself go to "Profile" page, not here. */ if ($myuser['id'] == $_SESSION['id']) { - $edit_code = ''; + $edit_code = ''; } elseif ($myuser['id'] == 1) { $edit_code = ' '; } else { - $edit_code = ''; + $edit_code = ''; } if ($myuser['isadmin']) { @@ -329,29 +335,15 @@ EOC; } ?> -
    -
    -

    -
    *
    - -
    - -
    - - -
    -
    - + -

     

    - - -
    -
    - - -

    -
    *
    - -
    - -
    - - - +
    +
    +
    +

    + ' . $_SESSION['original_user'] . ''; ?> +

    +
    +
    + +
    *
    +
    + + + +
    -
    + 65535) { + $myuser['autoreload'] = 30; + } + } $myuser['default_calendar_view'] = hesk_POST('default-calendar-view', 0); /* Notifications */ diff --git a/admin/move_category.php b/admin/move_category.php index cedd2216..d78b8ab3 100755 --- a/admin/move_category.php +++ b/admin/move_category.php @@ -44,7 +44,9 @@ hesk_isLoggedIn(); $modsForHesk_settings = mfh_getSettings(); /* Check permissions for this feature */ -hesk_checkPermission('can_change_cat'); +if (hesk_checkPermission('can_change_cat', 0)) { + hesk_checkPermission('can_change_own_cat'); +} /* A security check */ hesk_token_check('POST'); @@ -73,6 +75,11 @@ if (!$row['autoassign']) { /* Is user allowed to view tickets in new category? */ $category_ok = hesk_okCategory($category, 0); +// Is user allowed to move tickets to this category? +if (!$category_ok && !hesk_checkPermission('can_submit_any_cat', 0)) { + hesk_process_messages($hesklang['noauth_move'],'admin_main.php'); +} + /* Get details about the original ticket */ $res = hesk_dbQuery("SELECT * FROM `" . hesk_dbEscape($hesk_settings['db_pfix']) . "tickets` WHERE `trackid`='" . hesk_dbEscape($trackingID) . "' LIMIT 1"); if (hesk_dbNumRows($res) != 1) { @@ -113,7 +120,7 @@ if ($need_to_reassign || !$ticket['owner']) { } } -hesk_dbQuery("UPDATE `" . hesk_dbEscape($hesk_settings['db_pfix']) . "tickets` SET `category`='" . intval($category) . "', `owner`='" . intval($ticket['owner']) . "' , `history`=CONCAT(`history`,'" . hesk_dbEscape($history) . "') WHERE `trackid`='" . hesk_dbEscape($trackingID) . "' LIMIT 1"); +hesk_dbQuery("UPDATE `" . hesk_dbEscape($hesk_settings['db_pfix']) . "tickets` SET `category`='" . intval($category) . "', `owner`='" . intval($ticket['owner']) . "' , `history`=CONCAT(`history`,'" . hesk_dbEscape($history) . "') WHERE `trackid`='" . hesk_dbEscape($trackingID) . "'"); $ticket['category'] = $category; diff --git a/admin/new_ticket.php b/admin/new_ticket.php index c605b9dc..a0926d18 100644 --- a/admin/new_ticket.php +++ b/admin/new_ticket.php @@ -1,32 +1,15 @@ -
    - -
    -
    -
    -
    -

    -
    +
    + *

    -
    + if ($show_quick_help): ?> +
    +
    +

    + +

    +
    +
    +
    +

    +
    + +

    *

    +
    +
    -
    - -

    +
    +
    +

    + +

    +
    + +
    +
    +
    + + + + +
    > + +
    + - theme_advanced_toolbar_location: "top", - theme_advanced_toolbar_align: "left", - theme_advanced_statusbar_location: "bottom", - theme_advanced_resizing: true - }); - /* ]]> */ - - - > - -
    -
    +
    + + + +
    +
    - + +
    - - - '; - } else { - echo '
    '; - } ?> - +
    + -
    - -
    -
    -
    -
    - +
    + + placeholder="" + onkeyup="disableIfEmpty('email','notify-email')" + > +
    +
    -
    - - placeholder="" - onkeyup="disableIfEmpty('email-input','notify-email')"> -
    +
    +
    + + +
    + +
    + +
    +
    +
    + $v) { + if ($v['use'] && $v['place'] == 0 && hesk_is_custom_field_in_category($k, $category)) { + if ($v['req'] == 2) { + $v['req']= '*'; + $required_attribute = 'data-error="' . $hesklang['this_field_is_required'] . '" required'; + } else { + $v['req'] = ''; + $required_attribute = ''; + } -
    -
    -
    - - '; - } elseif (in_array('category', $_SESSION['isnotice'])) { - echo '
    '; - } else { - echo '
    '; - } ?> - + if ($v['type'] == 'checkbox') { + $k_value = array(); + if (isset($_SESSION["as_$k"]) && is_array($_SESSION["as_$k"])) { + foreach ($_SESSION["as_$k"] as $myCB) { + $k_value[] = stripslashes(hesk_input($myCB)); + } + } + } elseif (isset($_SESSION["as_$k"])) { + $k_value = stripslashes(hesk_input($_SESSION["as_$k"])); + } else { + $k_value = ''; + } -
    - -
    -
    -
    -'; -} else { - echo '
    '; -} ?> - -
    - -
    -
    -
    - - $v) { - if ($v['use'] && $v['place'] == 0) { - if ($modsForHesk_settings['custom_field_setting']) { - $v['name'] = $hesklang[$v['name']]; - } + //Clean up multiple dashes or whitespaces + $formattedId = preg_replace("/[\s-]+/", " ", $v['name']); + $formattedId = preg_replace("/[\s_]/", "-", $formattedId); - // $v['req'] = $v['req'] ? '*' : ''; - // Staff doesn't need to fill in required custom fields - $v['req'] = ''; + echo '
    + +
    '; + } - if ($v['type'] == 'checkbox' && !isset($_GET["c_$k"])) { - $k_value = array(); - if (isset($_SESSION["c_$k"]) && is_array($_SESSION["c_$k"])) { - foreach ($_SESSION["c_$k"] as $myCB) { - $k_value[] = stripslashes(hesk_input($myCB)); - } - } - } elseif (isset($_SESSION["as_$k"])) { - $k_value = stripslashes(hesk_input($_SESSION["as_$k"])); - } elseif (isset($_GET["as_$k"])) { - if ($v['type'] == 'checkbox') { - $k_value = explode('-CHECKBOX-', $_GET["as_$k"]); - } else { - $k_value = stripslashes(hesk_GET("as_$k")); - } - } else { - $k_value = ''; - } - - switch ($v['type']) { - /* Radio box */ - case 'radio': - echo '
    '; - - $options = explode('#HESK#', $v['value']); - $cls = in_array($k, $_SESSION['iserror']) ? ' class="isError" ' : ''; - - foreach ($options as $option) { - - if (strlen($k_value) == 0 || $k_value == $option) { - $k_value = $option; - $checked = 'checked="checked"'; - } else { - $checked = ''; - } - - //Clean up multiple dashes or whitespaces - $formattedId = preg_replace("/[\s-]+/", " ", $v['name']); - $formattedId = preg_replace("/[\s_]/", "-", $v['name']); - - echo '
    '; - } - - echo '
    '; - break; - - /* Select drop-down box */ - case 'select': - - //Clean up multiple dashes or whitespaces - $formattedId = preg_replace("/[\s-]+/", " ", $v['name']); - $formattedId = preg_replace("/[\s_]/", "-", $v['name']); - - $cls = in_array($k, $_SESSION['iserror']) ? ' class="isError" ' : ''; - - echo '
    -
    '; - break; - - case 'multiselect': - //Clean up multiple dashes or whitespaces - $formattedId = preg_replace("/[\s-]+/", " ", $v['name']); - $formattedId = preg_replace("/[\s_]/", "-", $v['name']); - - $cls = in_array($k, $_SESSION['iserror']) ? ' class="isError" ' : ''; - - echo '
    -
    -
    - - -
    '; - break; - - /* Checkbox */ - case 'checkbox': - //Clean up multiple dashes or whitespaces - $formattedId = preg_replace("/[\s-]+/", " ", $v['name']); - $formattedId = preg_replace("/[\s_]/", "-", $v['name']); - - echo '
    '; - $options = explode('#HESK#', $v['value']); - $cls = in_array($k, $_SESSION['iserror']) ? ' class="isError" ' : ''; - - foreach ($options as $option) { - - if (in_array($option, $k_value)) { - $checked = 'checked="checked"'; - } else { - $checked = ''; - } - - echo '
    '; - } - echo '
    '; - break; - - /* Large text box */ - case 'textarea': - //Clean up multiple dashes or whitespaces - $formattedId = preg_replace("/[\s-]+/", " ", $v['name']); - $formattedId = preg_replace("/[\s_]/", "-", $v['name']); - - $size = explode('#', $v['value']); - $size[0] = empty($size[0]) ? 5 : intval($size[0]); - $size[1] = empty($size[1]) ? 30 : intval($size[1]); - - $cls = in_array($k, $_SESSION['iserror']) ? ' class="isError" ' : ''; - - echo '
    - -
    -
    '; - break; - - case 'date': - //Clean up multiple dashes or whitespaces - $formattedId = preg_replace("/[\s-]+/", " ", $v['name']); - $formattedId = preg_replace("/[\s_]/", "-", $v['name']); - - if (strlen($k_value) != 0) { - $v['value'] = $k_value; - } - - $cls = in_array($k, $_SESSION['iserror']) ? ' isError ' : ''; - - echo ' -
    - -
    - - ' . $hesklang['date_format'] . ' + echo ' +
    '; - break; + break; - case 'email': - //Clean up multiple dashes or whitespaces - $formattedId = preg_replace("/[\s-]+/", " ", $v['name']); - $formattedId = preg_replace("/[\s_]/", "-", $v['name']); + /* Select drop-down box */ + case 'select': - if (strlen($k_value) != 0) { - $v['value'] = $k_value; - } + //Clean up multiple dashes or whitespaces + $formattedId = preg_replace("/[\s-]+/", " ", $v['name']); + $formattedId = preg_replace("/[\s_]/", "-", $formattedId); - if ($v['value'] == 'cc' || $v['value'] == 'bcc') { - // (b)cc isn't a valid email but is the "value" used by settings. Just remove it. - $v['value'] = ''; - } + $cls = in_array($k, $_SESSION['iserror']) ? ' isError' : ''; - $cls = in_array($k, $_SESSION['iserror']) ? ' class="isError" ' : ''; + echo '
    +
    -
    '; + // Show "Click to select"? + if (!empty($v['value']['show_select'])) { + echo ''; + } - break; + foreach ($v['value']['select_options'] as $option) { + if ($k_value == $option) { + $k_value = $option; + $selected = 'selected'; + } else { + $selected = ''; + } - case 'hidden': - //Clean up multiple dashes or whitespaces - $formattedId = preg_replace("/[\s-]+/", " ", $v['name']); - $formattedId = preg_replace("/[\s_]/", "-", $formattedId); + echo ''; + } - if (strlen($k_value) != 0) { - $v['value'] = $k_value; - } + echo ' +
    '; + break; - $cls = in_array($k, $_SESSION['iserror']) ? ' class="isError" ' : ''; + /* Checkbox */ + case 'checkbox': + //Clean up multiple dashes or whitespaces + $formattedId = preg_replace("/[\s-]+/", " ", $v['name']); + $formattedId = preg_replace("/[\s_]/", "-", $formattedId); - echo ''; + $cls = in_array($k, $_SESSION['iserror']) ? ' isError' : ''; + echo '
    '; - break; + foreach ($v['value']['checkbox_options'] as $option) { + if (in_array($option, $k_value)) { + $checked = 'checked'; + } else { + $checked = ''; + } - case 'readonly': - //Clean up multiple dashes or whitespaces - $formattedId = preg_replace("/[\s-]+/", " ", $v['name']); - $formattedId = preg_replace("/[\s_]/", "-", $formattedId); + echo '
    '; + } + echo ' +
    '; + break; - if (strlen($k_value) != 0) { - $v['value'] = $k_value; - } + /* Large text box */ + case 'textarea': + //Clean up multiple dashes or whitespaces + $formattedId = preg_replace("/[\s-]+/", " ", $v['name']); + $formattedId = preg_replace("/[\s_]/", "-", $formattedId); - $cls = in_array($k, $_SESSION['iserror']) ? ' class="isError" ' : ''; + $cls = in_array($k, $_SESSION['iserror']) ? ' isError' : ''; - echo '
    - -
    -
    '; + echo '
    + +
    +
    '; + break; - break; + case 'date': + if ($required_attribute != '') { + $required_attribute .= ' pattern="[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])"'; + } - /* Default text input */ - default: - //Clean up multiple dashes or whitespaces - $formattedId = preg_replace("/[\s-]+/", " ", $v['name']); - $formattedId = preg_replace("/[\s_]/", "-", $v['name']); + //Clean up multiple dashes or whitespaces + $formattedId = preg_replace("/[\s-]+/", " ", $v['name']); + $formattedId = preg_replace("/[\s_]/", "-", $formattedId); - if (strlen($k_value) != 0) { - $v['value'] = $k_value; - } + $cls = in_array($k, $_SESSION['iserror']) ? ' isError' : ''; - $cls = in_array($k, $_SESSION['iserror']) ? ' class="isError" ' : ''; + echo ' +
    + +
    + +
    +
    +
    '; + break; + case 'email': + //Clean up multiple dashes or whitespaces + $formattedId = preg_replace("/[\s-]+/", " ", $v['name']); + $formattedId = preg_replace("/[\s_]/", "-", $v['name']); - echo '
    - -
    -
    '; - } - } -} -?> - - - - + +
    + + +
    +
    + +
    +
    + +
    + ' . $hesklang['ticket_tpl_man'] . ')' : ''; ?> +
    +
    +
    + + +
    + +
    +
    + +
    +
    + +
    +
    + +
    + +
    + + +
    +
    + *'; + $validator = 'data-error="' . htmlspecialchars($hesklang['enter_subject']) . '"" required'; + } + ?> +
    + +
    + > +
    +
    +
    + *'; + $validator = 'data-error="' . htmlspecialchars($hesklang['enter_message']) . '"" required'; + } + ?> +
    + +
    + + + +
    +
    +
    + $v) { + if ($v['use'] && $v['place'] == 1 && hesk_is_custom_field_in_category($k, $category)) { + if ($v['req'] == 2) { + $v['req']= '*'; + $required_attribute = 'data-error="' . $hesklang['this_field_is_required'] . '" required'; + } else { + $v['req'] = ''; + $required_attribute = ''; + } + + if ($v['type'] == 'checkbox') { + $k_value = array(); + if (isset($_SESSION["as_$k"]) && is_array($_SESSION["as_$k"])) { + foreach ($_SESSION["as_$k"] as $myCB) { + $k_value[] = stripslashes(hesk_input($myCB)); + } + } + } elseif (isset($_SESSION["as_$k"])) { + $k_value = stripslashes(hesk_input($_SESSION["as_$k"])); + } else { + $k_value = ''; + } + + switch ($v['type']) { + /* Radio box */ + case 'radio': + $cls = in_array($k, $_SESSION['iserror']) ? ' isError' : ''; + + echo '
    '; + + + foreach ($v['value']['radio_options'] as $option) { + + if (strlen($k_value) == 0) { + $k_value = $option; + $checked = empty($v['value']['no_default']) ? 'checked' : ''; + } elseif ($k_value == $option) { + $k_value = $option; + $checked = 'checked'; + } else { + $checked = ''; + } + + //Clean up multiple dashes or whitespaces + $formattedId = preg_replace("/[\s-]+/", " ", $v['name']); + $formattedId = preg_replace("/[\s_]/", "-", $formattedId); + + echo '
    '; + } + + echo '
    '; + break; + + /* Select drop-down box */ + case 'select': + + //Clean up multiple dashes or whitespaces + $formattedId = preg_replace("/[\s-]+/", " ", $v['name']); + $formattedId = preg_replace("/[\s_]/", "-", $formattedId); + + $cls = in_array($k, $_SESSION['iserror']) ? ' isError' : ''; + + echo '
    +
    '; + break; + + /* Checkbox */ + case 'checkbox': + //Clean up multiple dashes or whitespaces + $formattedId = preg_replace("/[\s-]+/", " ", $v['name']); + $formattedId = preg_replace("/[\s_]/", "-", $formattedId); + + $cls = in_array($k, $_SESSION['iserror']) ? ' isError' : ''; + echo '
    '; + + foreach ($v['value']['checkbox_options'] as $option) { + if (in_array($option, $k_value)) { + $checked = 'checked'; + } else { + $checked = ''; + } + + echo '
    '; + } + echo '
    '; + break; + + /* Large text box */ + case 'textarea': + //Clean up multiple dashes or whitespaces + $formattedId = preg_replace("/[\s-]+/", " ", $v['name']); + $formattedId = preg_replace("/[\s_]/", "-", $formattedId); + + $cls = in_array($k, $_SESSION['iserror']) ? ' isError' : ''; + + echo '
    + +
    +
    +
    '; + break; + + case 'date': + if ($required_attribute != '') { + $required_attribute .= ' pattern="[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])"'; + } + + //Clean up multiple dashes or whitespaces + $formattedId = preg_replace("/[\s-]+/", " ", $v['name']); + $formattedId = preg_replace("/[\s_]/", "-", $formattedId); + + $cls = in_array($k, $_SESSION['iserror']) ? ' isError' : ''; + + echo ' +
    + +
    + +
    +
    +
    '; + break; + case 'email': + //Clean up multiple dashes or whitespaces + $formattedId = preg_replace("/[\s-]+/", " ", $v['name']); + $formattedId = preg_replace("/[\s_]/", "-", $formattedId); + + $suggest = $hesk_settings['detect_typos'] ? 'onblur="Javascript:hesk_suggestEmail(\''.$k.'\', \''.$k.'_suggestions\', 0, 1'.($v['value']['multiple'] ? ',1' : '').')"' : ''; + + $cls = in_array($k, $_SESSION['iserror']) ? ' isError' : ''; + + echo '
    + +
    + +
    +
    +
    '; + + break; + + case 'hidden': + case 'readonly': + default: + //Clean up multiple dashes or whitespaces + $formattedId = preg_replace("/[\s-]+/", " ", $v['name']); + $formattedId = preg_replace("/[\s_]/", "-", $formattedId); + + if (strlen($k_value) != 0 || isset($_SESSION["as_$k"])) { + $v['value']['default_value'] = $k_value; + } + + $cls = in_array($k, $_SESSION['iserror']) ? ' class="isError" ' : ''; + + echo '
    + +
    + +
    +
    +
    '; + } } } - } + /* end custom after */ + /* attachments */ + if ($hesk_settings['attachments']['use']) { - } - //--> - - +
    + -// Print templates -if (strlen($can_options)) { - ?> -
    - +
    + +
    +
    + -
    - -
    -
    - -
    - ' . $hesklang['ticket_tpl_man'] . ')' : ''; ?> + if (!isset($_SESSION['as_notify'])) { + $_SESSION['as_notify'] = $_SESSION['notify_customer_new'] ? 1 : 0; + } + ?> +
    + + +
    +
    + +
    +
    + +
    + +
    + +
    +
    + +
    +
    + +
    +
    + +
    + + +
    +

    + + +
    +
    + + +
    +
    + + + + + +
    +
    +
    -
    - + -
    - -
    -
    - -
    -
    - -
    -
    - - -
    - -
    - - -
    -
    - -'; -} else { - echo '
    '; -} ?> - -
    - -
    -
    -
    -'; -} else { - echo '
    '; -} ?> - -
    - - - -
    -
    -
    -
    - - $v) { - if ($v['use'] && $v['place']) { - if ($modsForHesk_settings['custom_field_setting']) { - $v['name'] = $hesklang[$v['name']]; - } - - // $v['req'] = $v['req'] ? '*' : ''; - // Staff doesn't need to fill in required custom fields - $v['req'] = ''; - - if ($v['type'] == 'checkbox') { - $k_value = array(); - if (isset($_SESSION["c_$k"]) && is_array($_SESSION["c_$k"])) { - foreach ($_SESSION["c_$k"] as $myCB) { - $k_value[] = stripslashes(hesk_input($myCB)); - } - } - } elseif (isset($_SESSION["c_$k"])) { - $k_value = stripslashes(hesk_input($_SESSION["c_$k"])); - } else { - $k_value = ''; - } - - switch ($v['type']) { - /* Radio box */ - case 'radio': - //Clean up multiple dashes or whitespaces - $formattedId = preg_replace("/[\s-]+/", " ", $v['name']); - $formattedId = preg_replace("/[\s_]/", "-", $v['name']); - - echo '
    '; - - $options = explode('#HESK#', $v['value']); - $cls = in_array($k, $_SESSION['iserror']) ? ' class="isError" ' : ''; - - foreach ($options as $option) { - - if (strlen($k_value) == 0 || $k_value == $option) { - $k_value = $option; - $checked = 'checked="checked"'; - } else { - $checked = ''; - } - - echo '
    '; - } - - echo '
    '; - break; - - /* Select drop-down box */ - case 'select': - //Clean up multiple dashes or whitespaces - $formattedId = preg_replace("/[\s-]+/", " ", $v['name']); - $formattedId = preg_replace("/[\s_]/", "-", $v['name']); - - $cls = in_array($k, $_SESSION['iserror']) ? ' class="isError" ' : ''; - - echo '
    -
    '; - break; - - /* Checkbox */ - case 'checkbox': - //Clean up multiple dashes or whitespaces - $formattedId = preg_replace("/[\s-]+/", " ", $v['name']); - $formattedId = preg_replace("/[\s_]/", "-", $v['name']); - - echo '
    '; - - $options = explode('#HESK#', $v['value']); - $cls = in_array($k, $_SESSION['iserror']) ? ' class="isError" ' : ''; - - foreach ($options as $option) { - - if (in_array($option, $k_value)) { - $checked = 'checked="checked"'; - } else { - $checked = ''; - } - - echo '
    '; - } - echo '
    '; - break; - - /* Large text box */ - case 'textarea': - //Clean up multiple dashes or whitespaces - $formattedId = preg_replace("/[\s-]+/", " ", $v['name']); - $formattedId = preg_replace("/[\s_]/", "-", $v['name']); - - $size = explode('#', $v['value']); - $size[0] = empty($size[0]) ? 5 : intval($size[0]); - $size[1] = empty($size[1]) ? 30 : intval($size[1]); - - $cls = in_array($k, $_SESSION['iserror']) ? ' class="isError" ' : ''; - - echo '
    - -
    -
    '; - break; - - case 'date': - //Clean up multiple dashes or whitespaces - $formattedId = preg_replace("/[\s-]+/", " ", $v['name']); - $formattedId = preg_replace("/[\s_]/", "-", $v['name']); - - if (strlen($k_value) != 0) { - $v['value'] = $k_value; - } - - $cls = in_array($k, $_SESSION['iserror']) ? ' isError ' : ''; - - echo ' -
    - -
    - - ' . $hesklang['date_format'] . ' -
    -
    '; - break; - - case 'multiselect': - //Clean up multiple dashes or whitespaces - $formattedId = preg_replace("/[\s-]+/", " ", $v['name']); - $formattedId = preg_replace("/[\s_]/", "-", $v['name']); - - $cls = in_array($k, $_SESSION['iserror']) ? ' class="isError" ' : ''; - - echo '
    -
    -
    - - -
    '; - break; - - case 'email': - //Clean up multiple dashes or whitespaces - $formattedId = preg_replace("/[\s-]+/", " ", $v['name']); - $formattedId = preg_replace("/[\s_]/", "-", $v['name']); - - if (strlen($k_value) != 0) { - $v['value'] = $k_value; - } - - if ($v['value'] == 'cc' || $v['value'] == 'bcc') { - // (b)cc isn't a valid email but is the "value" used by settings. Just remove it. - $v['value'] = ''; - } - - $cls = in_array($k, $_SESSION['iserror']) ? ' class="isError" ' : ''; - - echo '
    - -
    -
    '; - - break; - - case 'hidden': - //Clean up multiple dashes or whitespaces - $formattedId = preg_replace("/[\s-]+/", " ", $v['name']); - $formattedId = preg_replace("/[\s_]/", "-", $formattedId); - - if (strlen($k_value) != 0) { - $v['value'] = $k_value; - } - - $cls = in_array($k, $_SESSION['iserror']) ? ' class="isError" ' : ''; - - echo ''; - - break; - - case 'readonly': - //Clean up multiple dashes or whitespaces - $formattedId = preg_replace("/[\s-]+/", " ", $v['name']); - $formattedId = preg_replace("/[\s_]/", "-", $formattedId); - - if (strlen($k_value) != 0) { - $v['value'] = $k_value; - } - - $cls = in_array($k, $_SESSION['iserror']) ? ' class="isError" ' : ''; - - echo '
    - -
    -
    '; - - break; - - /* Default text input */ - default: - //Clean up multiple dashes or whitespaces - $formattedId = preg_replace("/[\s-]+/", " ", $v['name']); - $formattedId = preg_replace("/[\s_]/", "-", $v['name']); - - if (strlen($k_value) != 0) { - $v['value'] = $k_value; - } - - $cls = in_array($k, $_SESSION['iserror']) ? ' class="isError" ' : ''; - - echo '
    - -
    -
    '; - } - } -} -/* end custom after */ -/* attachments */ -if ($hesk_settings['attachments']['use']) { - - ?> -
    - - -
    - -
    -
    -
    - - - -
    - - -
    -
    -
    -
    -
    -
    -';} else {echo '
    ';} ?> - -
    - -
    -
    - -
    -
    - -
    -
    - -
    - - -
    -

    - - -
    -
    - - -
    -
    - - - - -
    -
    - -
    - - - - - - -
    ' . $hesklang['custom_l'] . ': -
    ' . $hesklang['defw'] . ': -
    -

    - '; - break; - case 'hidden': - echo ' - -

    ' . $hesklang['hidden_custom_field_help'] . '

    - - - - -
    ' . $hesklang['value_colon'] . ' -
    -

    - '; - break; - case 'readonly': - echo ' - -

    ' . $hesklang['readonly_custom_field_help'] . '

    - - - - -
    ' . $hesklang['value_colon'] . ' -
    -

    - '; - break; - case 'textarea': - if (strpos($query, '#') !== false) { - list($rows, $cols) = explode('#', $query); - } else { - $rows = ''; - $cols = ''; - } - echo ' - - - - - - - - -
    ' . $hesklang['rows'] . ': -
    ' . $hesklang['cols'] . ': -
    -

    - '; - break; - case 'radio': - $options = str_replace('#HESK#', "\n", $query); - echo ' - - -

    ' . $hesklang['opt2'] . '

    - -

    - '; - break; - case 'select': - $query = str_replace('{HESK_SELECT}', '', $query, $show_select); - - $options = str_replace('#HESK#', "\n", $query); - echo ' - - -

    ' . $hesklang['opt3'] . '

    -

    - -

    - '; - break; - case 'checkbox': - $options = str_replace('#HESK#', "\n", $query); - echo ' - - -

    ' . $hesklang['opt4'] . '

    - -

    - '; - break; - case 'date': - echo '

    ' . $hesklang['date_custom_field_text'] . '

    '; - break; - case 'multiselect': - $options = str_replace('#HESK#', "\n", $query); - echo ' - - -

    ' . $hesklang['multiple_select_custom_field_text'] . '

    - -

    - '; - break; - case 'email': - $ccSelected = $query == 'cc' ? 'selected="selected"' : ''; - $bccSelected = $query == 'bcc' ? 'selected="selected"' : ''; - echo ' - -

    ' . $hesklang['email_custom_field_help'] . '

    - - - - - -
    ' . $hesklang['email_custom_field_label'] . ': - -
    -

    - '; - break; - default: - die('Invalid type'); -} -?> - -

    - -

     

    - - - - - diff --git a/admin/password.php b/admin/password.php index efec81aa..8fef7c6e 100644 --- a/admin/password.php +++ b/admin/password.php @@ -1,35 +1,19 @@ - - -
    -
    -
    65535) { + $_SESSION['new']['autoreload'] = 30; + } + } else { + hesk_setcookie('autorefresh', ''); + } /* Auto-start ticket timer */ $_SESSION['new']['autostart'] = isset($_POST['autostart']) ? 1 : 0; @@ -233,9 +237,6 @@ function update_profile() /* Default calendar view */ $_SESSION['new']['default_calendar_view'] = hesk_POST('default-calendar-view', 0); - /* Update auto-refresh time */ - $_SESSION['new']['autorefresh'] = isset($_POST['autorefresh']) ? $_POST['autorefresh'] : 0; - /* Notifications */ if (!(!$_SESSION[$session_array]['isadmin'] && isset($_SESSION[$session_array]['heskprivileges']) && strpos($_SESSION[$session_array]['heskprivileges'], 'can_change_notification_settings') === false)) { @@ -268,7 +269,7 @@ function update_profile() $sql_pass , `afterreply`='" . intval($_SESSION['new']['afterreply']) . "' , `autostart`='" . intval($_SESSION['new']['autostart']) . "' , - `autorefresh`='" . intval($_SESSION['new']['autorefresh']) . "' , + `autoreload`='".($_SESSION['new']['autoreload'])."' , `notify_new_unassigned`='" . intval($_SESSION['new']['notify_new_unassigned']) . "' , `notify_new_my`='" . intval($_SESSION['new']['notify_new_my']) . "' , `notify_reply_unassigned`='" . intval($_SESSION['new']['notify_reply_unassigned']) . "' , @@ -282,7 +283,7 @@ function update_profile() `notify_overdue_unassigned`='" . $_SESSION['new']['notify_overdue_unassigned'] . "', `show_suggested`='" . $_SESSION['new']['show_suggested'] . "', `default_calendar_view`=" . intval($_SESSION['new']['default_calendar_view']) . " - WHERE `id`='" . intval($_SESSION['id']) . "' LIMIT 1" + WHERE `id`='" . intval($_SESSION['id']) . "'" ); /* Process the session variables */ diff --git a/admin/reports.php b/admin/reports.php index 9e9fd630..5edefd8a 100644 --- a/admin/reports.php +++ b/admin/reports.php @@ -1,32 +1,15 @@ - -
    -
    -
    -
    - -
    - -
    > - ' . $hesklang['export'] . '
    '; - } - ?> -
    -
    - - -
    - /> - -
    -
    - /> - - -
    -
    -
    - - -
    -
    - - -
    -
    -
    +
    +
    + +
    +

    + +

    + ' . $hesklang['export'] . '
    '; + } + ?> +
    +
    -
    +
    +
    +
    + + +
    + style="position: relative"> + +
    +
    + style="position: relative"> + + +
    +
    +
    + + +
    +
    + + +
    +
    +
    +
    +
    +
    +

    + +

    +
    + +
    +
    +
    -

    -
    - -

    -

    -
    - 0, 'resolved' => 0, 'tickets' => 0, 'replies' => 0, 'worked' => 0); + $totals = array('asstickets' => 0, 'resolved' => 0, 'tickets' => 0, 'replies' => 0, 'worked' => 0, 'openedby' => 0); // Get list of users $admins = array(); @@ -539,6 +534,7 @@ require_once(HESK_PATH . 'inc/show_admin_nav.inc.php'); 'tickets' => 0, 'replies' => 0, 'worked' => '', + 'openedby' => 0, ); } @@ -614,10 +610,21 @@ require_once(HESK_PATH . 'inc/show_admin_nav.inc.php'); // Convert total seconds worked to HH:MM:SS $totals['worked'] = $hesk_settings['time_worked'] ? hesk_SecondsToHHMMSS($totals['worked']) : 0; + // Get total opened by tickets + $res = hesk_dbQuery("SELECT `openedby`, COUNT(*) AS `cnt` FROM `".hesk_dbEscape($hesk_settings['db_pfix'])."tickets` WHERE `openedby` IN ('" . implode("','", array_keys($admins) ) . "') AND DATE(`dt`) BETWEEN '" . hesk_dbEscape($date_from) . "' AND '" . hesk_dbEscape($date_to) . "' GROUP BY `openedby`"); + + // -> update ticket list values + while ($row = hesk_dbFetchAssoc($res)) + { + $tickets[$row['openedby']]['openedby'] += $row['cnt']; + $totals['openedby'] += $row['cnt']; + } + ?> + @@ -636,6 +643,7 @@ require_once(HESK_PATH . 'inc/show_admin_nav.inc.php'); ?> + @@ -655,6 +663,7 @@ require_once(HESK_PATH . 'inc/show_admin_nav.inc.php'); ?> + @@ -671,6 +680,7 @@ require_once(HESK_PATH . 'inc/show_admin_nav.inc.php'); ?> + @@ -909,6 +919,7 @@ require_once(HESK_PATH . 'inc/show_admin_nav.inc.php'); ?> + - -
    -
    - - - - - - - - - + } + // Show a link to custom_fields.php if user has permission to do so + if ( hesk_checkPermission('can_man_settings',0) ) { + echo ' +
  • + ' . $hesklang['tab_4'] . ' +
  • + '; + } + ?> + +
    +
    +
    -
    - - - - - - + + + + + + + + + + - -
      
    -
    - - -
    -
    - 1) { - if ($k == 1) { - ?> - - - - - - - - - - - - - + tinyMCE.init({ + mode: "exact", + elements: "content", + theme: "advanced", + convert_urls: false, + gecko_spellcheck: true, + + theme_advanced_buttons1: "cut,copy,paste,|,undo,redo,|,formatselect,fontselect,fontsizeselect,|,bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull", + theme_advanced_buttons2: "sub,sup,|,charmap,|,bullist,numlist,|,outdent,indent,insertdate,inserttime,preview,|,forecolor,backcolor,|,hr,removeformat,visualaid,|,link,unlink,anchor,image,cleanup,code", + theme_advanced_buttons3: "", + + theme_advanced_toolbar_location: "top", + theme_advanced_toolbar_align: "left", + theme_advanced_statusbar_location: "bottom", + theme_advanced_resizing: true + }); + + +
    +
    +

    +
    +
    + ' . $hesklang['no_sm'] . '

    '; + } else { + // List of staff + if (!isset($admins)) { + $admins = array(); + $res2 = hesk_dbQuery("SELECT `id`,`name` FROM `" . hesk_dbEscape($hesk_settings['db_pfix']) . "users`"); + while ($row = hesk_dbFetchAssoc($res2)) { + $admins[$row['id']] = $row['name']; } } + ?> - - - -   -
      
    - -
    -
    + $type = $sm['type'] ? $hesklang['sm_draft'] : $hesklang['sm_published']; -
    -
    -

    -
    -
    -
    -
    - + ?> + + +
    + + +
    + + + + + 1) { + if ($k == 1) { + ?> + + + + + + + + + + + + + + + + +   + + + -
    - + ?> + + +
    -
    -
    - + +
    +
    +

    -
    -
    -
    - -
    -
    -
    -
    - -
    -
    -
    -
    - +
    + +
    + + +
    +
    + +
    +
    +
    +
    + +
    +
    +
    +
    + +
    +
    +
    +
    + +
    +
    +
    +
    + +
    +
    +
    +
    + + +
    + + + + + + +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    +
    + +
    +
    +
    +
    + + +
    + data-error="" required> +
    +
    +
    +
    + + +
    + +
    +
    +
    + ' : ''; ?> + + +
    +
    + + +
    +
    +
    +
    -
    - - -
    - - - - - - -
    -
    -
    -
    - - -
    -
    - -
    -
    -
    -
    - -
    -
    -
    -
    - - -
    - data-error="" required> -
    -
    -
    -
    - - -
    - -
    -
    -
    - ' : ''; ?> - - -
    -
    - - -
    -
    -
    - +
    -
    + purify($message); + require(HESK_PATH . 'inc/htmlpurifier/HeskHTMLPurifier.php'); + $purifier = new HeskHTMLPurifier($hesk_settings['cache_dir']); + $message = $purifier->heskPurify($message); // Any errors? if (count($hesk_error_buffer)) { @@ -539,7 +527,7 @@ function save_sm() `style` = '{$style}', `type` = '{$type}', `icon` = '{$icon}' - WHERE `id`={$id} LIMIT 1"); + WHERE `id`={$id}"); $_SESSION['smord'] = $id; hesk_process_messages($hesklang['sm_mdf'], 'service_messages.php', 'SUCCESS'); @@ -580,7 +568,7 @@ function order_sm() $_SESSION['smord'] = $id; // Update article details - hesk_dbQuery("UPDATE `" . hesk_dbEscape($hesk_settings['db_pfix']) . "service_messages` SET `order`=`order`+" . intval($move) . " WHERE `id`={$id} LIMIT 1"); + hesk_dbQuery("UPDATE `" . hesk_dbEscape($hesk_settings['db_pfix']) . "service_messages` SET `order`=`order`+" . intval($move) . " WHERE `id`={$id}"); // Update order of all service messages update_sm_order(); @@ -602,7 +590,7 @@ function update_sm_order() // Update database $i = 10; while ($sm = hesk_dbFetchAssoc($res)) { - hesk_dbQuery("UPDATE `" . hesk_dbEscape($hesk_settings['db_pfix']) . "service_messages` SET `order`=" . intval($i) . " WHERE `id`='" . intval($sm['id']) . "' LIMIT 1"); + hesk_dbQuery("UPDATE `" . hesk_dbEscape($hesk_settings['db_pfix']) . "service_messages` SET `order`=" . intval($i) . " WHERE `id`='" . intval($sm['id']) . "'"); $i += 10; } @@ -622,7 +610,7 @@ function remove_sm() $id = intval(hesk_GET('id')) or hesk_error($hesklang['sm_e_id']); // Delete the service message - hesk_dbQuery("DELETE FROM `" . hesk_dbEscape($hesk_settings['db_pfix']) . "service_messages` WHERE `id`={$id} LIMIT 1"); + hesk_dbQuery("DELETE FROM `" . hesk_dbEscape($hesk_settings['db_pfix']) . "service_messages` WHERE `id`={$id}"); // Were we successful? if (hesk_dbAffectedRows() == 1) { @@ -655,9 +643,9 @@ function new_sm() $message = hesk_getHTML(hesk_POST('message')); // Clean the HTML code - require(HESK_PATH . 'inc/htmlpurifier/HTMLPurifier.standalone.php'); - $purifier = new HTMLPurifier(); - $message = $purifier->purify($message); + require(HESK_PATH . 'inc/htmlpurifier/HeskHTMLPurifier.php'); + $purifier = new HeskHTMLPurifier($hesk_settings['cache_dir']); + $message = $purifier->heskPurify($message); // Any errors? if (count($hesk_error_buffer)) { diff --git a/admin/show_tickets.php b/admin/show_tickets.php index 652966d2..1ba42e2c 100644 --- a/admin/show_tickets.php +++ b/admin/show_tickets.php @@ -1,32 +1,15 @@ -
    -
    - -
    -
    -

    +
    + +
    +
    +

    + +

    +
    +
    +
    +
    +
    + +
    + '; /* Update staff default settings? */ if (!empty($_GET['def'])) { hesk_updateStaffDefaults(); @@ -83,11 +77,34 @@ require_once(HESK_PATH . 'inc/show_admin_nav.inc.php');
    +
    + diff --git a/admin/view_message_log.php b/admin/view_message_log.php index 66fce341..d96f9b2b 100644 --- a/admin/view_message_log.php +++ b/admin/view_message_log.php @@ -8,6 +8,7 @@ define('PAGE_TITLE', 'ADMIN_TOOLS'); require(HESK_PATH . 'hesk_settings.inc.php'); require(HESK_PATH . 'inc/common.inc.php'); require(HESK_PATH . 'inc/admin_functions.inc.php'); +require(HESK_PATH . 'inc/mail_functions.inc.php'); hesk_load_database_functions(); hesk_session_start(); @@ -24,75 +25,83 @@ require_once(HESK_PATH . 'inc/headerAdmin.inc.php'); /* Print main manage users page */ require_once(HESK_PATH . 'inc/show_admin_nav.inc.php'); ?> - -
    -
    -
    -
    - +
    +
    +
    +

    + +

    +
    + +
    +
    +
    +
    +
    + +
    + +
    -
    -
    -
    - -
    - -
    -
    -
    - -
    - - -
    -
    -
    - -
    - -
    -
    -
    -
    - -
    -
    +
    + +
    + + +
    +
    +
    + +
    + +
    +
    +
    +
    +
    -
    -
    -
    - -
    -
    - - - - - - - - - - -
    -
    +
    +
    +
    +

    + +

    +
    +
    +
    + + + + + + + + + + +
    +
    - +
    + * License: Open source - MIT + * Please visit http://opensource.org/licenses/MIT for more information +!*/html,body{min-height:100%}.layout-boxed html,.layout-boxed body{height:100%}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:'Source Sans Pro','Helvetica Neue',Helvetica,Arial,sans-serif;font-weight:400;overflow-x:hidden;overflow-y:auto}.wrapper{min-height:100%;position:relative;overflow:hidden}.wrapper:before,.wrapper:after{content:" ";display:table}.wrapper:after{clear:both}.layout-boxed .wrapper{max-width:1250px;margin:0 auto;min-height:100%;box-shadow:0 0 8px rgba(0,0,0,0.5);position:relative}.layout-boxed{background:url('../img/boxed-bg.jpg') repeat fixed}.content-wrapper,.right-side,.main-footer{-webkit-transition:-webkit-transform .3s ease-in-out,margin .3s ease-in-out;-moz-transition:-moz-transform .3s ease-in-out,margin .3s ease-in-out;-o-transition:-o-transform .3s ease-in-out,margin .3s ease-in-out;transition:transform .3s ease-in-out,margin .3s ease-in-out;margin-left:230px;z-index:820}.layout-top-nav .content-wrapper,.layout-top-nav .right-side,.layout-top-nav .main-footer{margin-left:0}@media (max-width:767px){.content-wrapper,.right-side,.main-footer{margin-left:0}}@media (min-width:768px){.sidebar-collapse .content-wrapper,.sidebar-collapse .right-side,.sidebar-collapse .main-footer{margin-left:0}}@media (max-width:767px){.sidebar-open .content-wrapper,.sidebar-open .right-side,.sidebar-open .main-footer{-webkit-transform:translate(230px, 0);-ms-transform:translate(230px, 0);-o-transform:translate(230px, 0);transform:translate(230px, 0)}}.content-wrapper,.right-side{min-height:100%;background-color:#ecf0f5;z-index:800}.main-footer{background:#fff;padding:15px;color:#444;border-top:1px solid #d2d6de}.fixed .main-header,.fixed .main-sidebar,.fixed .left-side{position:fixed}.fixed .main-header{top:0;right:0;left:0}.fixed .content-wrapper,.fixed .right-side{padding-top:50px}@media (max-width:767px){.fixed .content-wrapper,.fixed .right-side{padding-top:100px}}.fixed.layout-boxed .wrapper{max-width:100%}body.hold-transition .content-wrapper,body.hold-transition .right-side,body.hold-transition .main-footer,body.hold-transition .main-sidebar,body.hold-transition .left-side,body.hold-transition .main-header .navbar,body.hold-transition .main-header .logo{-webkit-transition:none;-o-transition:none;transition:none}.content{min-height:250px;padding:15px;margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:'Source Sans Pro',sans-serif}a{color:#3c8dbc}a:hover,a:active,a:focus{outline:none;text-decoration:none;color:#72afd2}.page-header{margin:10px 0 20px 0;font-size:22px}.page-header>small{color:#666;display:block;margin-top:5px}.main-header{position:relative;max-height:100px;z-index:1030}.main-header .navbar{-webkit-transition:margin-left .3s ease-in-out;-o-transition:margin-left .3s ease-in-out;transition:margin-left .3s ease-in-out;margin-bottom:0;margin-left:230px;border:none;min-height:50px;border-radius:0}.layout-top-nav .main-header .navbar{margin-left:0}.main-header #navbar-search-input.form-control{background:rgba(255,255,255,0.2);border-color:transparent}.main-header #navbar-search-input.form-control:focus,.main-header #navbar-search-input.form-control:active{border-color:rgba(0,0,0,0.1);background:rgba(255,255,255,0.9)}.main-header #navbar-search-input.form-control::-moz-placeholder{color:#ccc;opacity:1}.main-header #navbar-search-input.form-control:-ms-input-placeholder{color:#ccc}.main-header #navbar-search-input.form-control::-webkit-input-placeholder{color:#ccc}.main-header .navbar-custom-menu,.main-header .navbar-right{float:right}@media (max-width:991px){.main-header .navbar-custom-menu a,.main-header .navbar-right a{color:inherit;background:transparent}}@media (max-width:767px){.main-header .navbar-right{float:none}.navbar-collapse .main-header .navbar-right{margin:7.5px -15px}.main-header .navbar-right>li{color:inherit;border:0}}.main-header .sidebar-toggle{float:left;background-color:transparent;background-image:none;padding:15px 15px;font-family:fontAwesome}.main-header .sidebar-toggle:before{content:"\f0c9"}.main-header .sidebar-toggle:hover{color:#fff}.main-header .sidebar-toggle:focus,.main-header .sidebar-toggle:active{background:transparent}.main-header .sidebar-toggle .icon-bar{display:none}.main-header .navbar .nav>li.user>a>.fa,.main-header .navbar .nav>li.user>a>.glyphicon,.main-header .navbar .nav>li.user>a>.ion{margin-right:5px}.main-header .navbar .nav>li>a>.label{position:absolute;top:9px;right:7px;text-align:center;font-size:9px;padding:2px 3px;line-height:.9}.main-header .logo{-webkit-transition:width .3s ease-in-out;-o-transition:width .3s ease-in-out;transition:width .3s ease-in-out;display:block;float:left;height:50px;font-size:20px;line-height:50px;text-align:center;width:230px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;padding:0 15px;font-weight:300;overflow:hidden}.main-header .logo .logo-lg{display:block}.main-header .logo .logo-mini{display:none}.main-header .navbar-brand{color:#fff}.content-header{position:relative;padding:15px 15px 0 15px}.content-header>h1{margin:0;font-size:24px}.content-header>h1>small{font-size:15px;display:inline-block;padding-left:4px;font-weight:300}.content-header>.breadcrumb{float:right;background:transparent;margin-top:0;margin-bottom:0;font-size:12px;padding:7px 5px;position:absolute;top:15px;right:10px;border-radius:2px}.content-header>.breadcrumb>li>a{color:#444;text-decoration:none;display:inline-block}.content-header>.breadcrumb>li>a>.fa,.content-header>.breadcrumb>li>a>.glyphicon,.content-header>.breadcrumb>li>a>.ion{margin-right:5px}.content-header>.breadcrumb>li+li:before{content:'>\00a0'}@media (max-width:991px){.content-header>.breadcrumb{position:relative;margin-top:5px;top:0;right:0;float:none;background:#d2d6de;padding-left:10px}.content-header>.breadcrumb li:before{color:#97a0b3}}.navbar-toggle{color:#fff;border:0;margin:0;padding:15px 15px}@media (max-width:991px){.navbar-custom-menu .navbar-nav>li{float:left}.navbar-custom-menu .navbar-nav{margin:0;float:left}.navbar-custom-menu .navbar-nav>li>a{padding-top:15px;padding-bottom:15px;line-height:20px}}@media (max-width:767px){.main-header{position:relative}.main-header .logo,.main-header .navbar{width:100%;float:none}.main-header .navbar{margin:0}.main-header .navbar-custom-menu{float:right}}@media (max-width:991px){.navbar-collapse.pull-left{float:none !important}.navbar-collapse.pull-left+.navbar-custom-menu{display:block;position:absolute;top:0;right:40px}}.main-sidebar,.left-side{position:absolute;top:0;left:0;padding-top:50px;min-height:100%;width:230px;z-index:810;-webkit-transition:-webkit-transform .3s ease-in-out,width .3s ease-in-out;-moz-transition:-moz-transform .3s ease-in-out,width .3s ease-in-out;-o-transition:-o-transform .3s ease-in-out,width .3s ease-in-out;transition:transform .3s ease-in-out,width .3s ease-in-out}@media (max-width:767px){.main-sidebar,.left-side{padding-top:100px}}@media (max-width:767px){.main-sidebar,.left-side{-webkit-transform:translate(-230px, 0);-ms-transform:translate(-230px, 0);-o-transform:translate(-230px, 0);transform:translate(-230px, 0)}}@media (min-width:768px){.sidebar-collapse .main-sidebar,.sidebar-collapse .left-side{-webkit-transform:translate(-230px, 0);-ms-transform:translate(-230px, 0);-o-transform:translate(-230px, 0);transform:translate(-230px, 0)}}@media (max-width:767px){.sidebar-open .main-sidebar,.sidebar-open .left-side{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0)}}.sidebar{padding-bottom:10px}.sidebar-form input:focus{border-color:transparent}.user-panel{position:relative;width:100%;padding:10px;overflow:hidden}.user-panel:before,.user-panel:after{content:" ";display:table}.user-panel:after{clear:both}.user-panel>.image>img{width:100%;max-width:45px;height:auto}.user-panel>.info{padding:5px 5px 5px 15px;line-height:1;position:absolute;left:55px}.user-panel>.info>p{font-weight:600;margin-bottom:9px}.user-panel>.info>a{text-decoration:none;padding-right:5px;margin-top:3px;font-size:11px}.user-panel>.info>a>.fa,.user-panel>.info>a>.ion,.user-panel>.info>a>.glyphicon{margin-right:3px}.sidebar-menu{list-style:none;margin:0;padding:0}.sidebar-menu>li{position:relative;margin:0;padding:0}.sidebar-menu>li>a{padding:12px 5px 12px 15px;display:block}.sidebar-menu>li>a>.fa,.sidebar-menu>li>a>.glyphicon,.sidebar-menu>li>a>.ion{width:20px}.sidebar-menu>li .label,.sidebar-menu>li .badge{margin-right:5px}.sidebar-menu>li .badge{margin-top:3px}.sidebar-menu li.header{padding:10px 25px 10px 15px;font-size:12px}.sidebar-menu li>a>.pull-right-container>.fa-angle-left{width:auto;height:auto;padding:0;margin-right:10px}.sidebar-menu li.active>a>.pull-right-container>.fa-angle-left{-webkit-transform:rotate(-90deg);-ms-transform:rotate(-90deg);-o-transform:rotate(-90deg);transform:rotate(-90deg)}.sidebar-menu li.active>.treeview-menu{display:block}.sidebar-menu .treeview-menu{display:none;list-style:none;padding:0;margin:0;padding-left:5px}.sidebar-menu .treeview-menu .treeview-menu{padding-left:20px}.sidebar-menu .treeview-menu>li{margin:0}.sidebar-menu .treeview-menu>li>a{padding:5px 5px 5px 15px;display:block;font-size:14px}.sidebar-menu .treeview-menu>li>a>.fa,.sidebar-menu .treeview-menu>li>a>.glyphicon,.sidebar-menu .treeview-menu>li>a>.ion{width:20px}.sidebar-menu .treeview-menu>li>a>.pull-right-container>.fa-angle-left,.sidebar-menu .treeview-menu>li>a>.fa-angle-down{width:auto}@media (min-width:768px){.sidebar-mini.sidebar-collapse .content-wrapper,.sidebar-mini.sidebar-collapse .right-side,.sidebar-mini.sidebar-collapse .main-footer{margin-left:50px !important;z-index:840}.sidebar-mini.sidebar-collapse .main-sidebar{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0);width:50px !important;z-index:850}.sidebar-mini.sidebar-collapse .sidebar-menu>li{position:relative}.sidebar-mini.sidebar-collapse .sidebar-menu>li>a{margin-right:0}.sidebar-mini.sidebar-collapse .sidebar-menu>li>a>span{border-top-right-radius:4px}.sidebar-mini.sidebar-collapse .sidebar-menu>li:not(.treeview)>a>span{border-bottom-right-radius:4px}.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{padding-top:5px;padding-bottom:5px;border-bottom-right-radius:4px}.sidebar-mini.sidebar-collapse .sidebar-menu>li:hover>a>span:not(.pull-right),.sidebar-mini.sidebar-collapse .sidebar-menu>li:hover>.treeview-menu{display:block !important;position:absolute;width:180px;left:50px}.sidebar-mini.sidebar-collapse .sidebar-menu>li:hover>a>span{top:0;margin-left:-3px;padding:12px 5px 12px 20px;background-color:inherit}.sidebar-mini.sidebar-collapse .sidebar-menu>li:hover>a>.pull-right-container{float:right;width:auto!important;left:200px!important;top:10px!important}.sidebar-mini.sidebar-collapse .sidebar-menu>li:hover>a>.pull-right-container>.label:not(:first-of-type){display:none}.sidebar-mini.sidebar-collapse .sidebar-menu>li:hover>.treeview-menu{top:44px;margin-left:0}.sidebar-mini.sidebar-collapse .main-sidebar .user-panel>.info,.sidebar-mini.sidebar-collapse .sidebar-form,.sidebar-mini.sidebar-collapse .sidebar-menu>li>a>span,.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu,.sidebar-mini.sidebar-collapse .sidebar-menu>li>a>.pull-right,.sidebar-mini.sidebar-collapse .sidebar-menu li.header{display:none !important;-webkit-transform:translateZ(0)}.sidebar-mini.sidebar-collapse .main-header .logo{width:50px}.sidebar-mini.sidebar-collapse .main-header .logo>.logo-mini{display:block;margin-left:-15px;margin-right:-15px;font-size:18px}.sidebar-mini.sidebar-collapse .main-header .logo>.logo-lg{display:none}.sidebar-mini.sidebar-collapse .main-header .navbar{margin-left:50px}}.sidebar-menu,.main-sidebar .user-panel,.sidebar-menu>li.header{white-space:nowrap;overflow:hidden}.sidebar-menu:hover{overflow:visible}.sidebar-form,.sidebar-menu>li.header{overflow:hidden;text-overflow:clip}.sidebar-menu li>a{position:relative}.sidebar-menu li>a>.pull-right-container{position:absolute;right:10px;top:50%;margin-top:-7px}.control-sidebar-bg{position:fixed;z-index:1000;bottom:0}.control-sidebar-bg,.control-sidebar{top:0;right:-230px;width:230px;-webkit-transition:right .3s ease-in-out;-o-transition:right .3s ease-in-out;transition:right .3s ease-in-out}.control-sidebar{position:absolute;padding-top:50px;z-index:1010}@media (max-width:768px){.control-sidebar{padding-top:100px}}.control-sidebar>.tab-content{padding:10px 15px}.control-sidebar.control-sidebar-open,.control-sidebar.control-sidebar-open+.control-sidebar-bg{right:0}.control-sidebar-open .control-sidebar-bg,.control-sidebar-open .control-sidebar{right:0}@media (min-width:768px){.control-sidebar-open .content-wrapper,.control-sidebar-open .right-side,.control-sidebar-open .main-footer{margin-right:230px}}.nav-tabs.control-sidebar-tabs>li:first-of-type>a,.nav-tabs.control-sidebar-tabs>li:first-of-type>a:hover,.nav-tabs.control-sidebar-tabs>li:first-of-type>a:focus{border-left-width:0}.nav-tabs.control-sidebar-tabs>li>a{border-radius:0}.nav-tabs.control-sidebar-tabs>li>a,.nav-tabs.control-sidebar-tabs>li>a:hover{border-top:none;border-right:none;border-left:1px solid transparent;border-bottom:1px solid transparent}.nav-tabs.control-sidebar-tabs>li>a .icon{font-size:16px}.nav-tabs.control-sidebar-tabs>li.active>a,.nav-tabs.control-sidebar-tabs>li.active>a:hover,.nav-tabs.control-sidebar-tabs>li.active>a:focus,.nav-tabs.control-sidebar-tabs>li.active>a:active{border-top:none;border-right:none;border-bottom:none}@media (max-width:768px){.nav-tabs.control-sidebar-tabs{display:table}.nav-tabs.control-sidebar-tabs>li{display:table-cell}}.control-sidebar-heading{font-weight:400;font-size:16px;padding:10px 0;margin-bottom:10px}.control-sidebar-subheading{display:block;font-weight:400;font-size:14px}.control-sidebar-menu{list-style:none;padding:0;margin:0 -15px}.control-sidebar-menu>li>a{display:block;padding:10px 15px}.control-sidebar-menu>li>a:before,.control-sidebar-menu>li>a:after{content:" ";display:table}.control-sidebar-menu>li>a:after{clear:both}.control-sidebar-menu>li>a>.control-sidebar-subheading{margin-top:0}.control-sidebar-menu .menu-icon{float:left;width:35px;height:35px;border-radius:50%;text-align:center;line-height:35px}.control-sidebar-menu .menu-info{margin-left:45px;margin-top:3px}.control-sidebar-menu .menu-info>.control-sidebar-subheading{margin:0}.control-sidebar-menu .menu-info>p{margin:0;font-size:11px}.control-sidebar-menu .progress{margin:0}.control-sidebar-dark{color:#b8c7ce}.control-sidebar-dark,.control-sidebar-dark+.control-sidebar-bg{background:#222d32}.control-sidebar-dark .nav-tabs.control-sidebar-tabs{border-bottom:#1c2529}.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a{background:#181f23;color:#b8c7ce}.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:hover,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:focus{border-left-color:#141a1d;border-bottom-color:#141a1d}.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:hover,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:focus,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:active{background:#1c2529}.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:hover{color:#fff}.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li.active>a,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li.active>a:hover,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li.active>a:focus,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li.active>a:active{background:#222d32;color:#fff}.control-sidebar-dark .control-sidebar-heading,.control-sidebar-dark .control-sidebar-subheading{color:#fff}.control-sidebar-dark .control-sidebar-menu>li>a:hover{background:#1e282c}.control-sidebar-dark .control-sidebar-menu>li>a .menu-info>p{color:#b8c7ce}.control-sidebar-light{color:#5e5e5e}.control-sidebar-light,.control-sidebar-light+.control-sidebar-bg{background:#f9fafc;border-left:1px solid #d2d6de}.control-sidebar-light .nav-tabs.control-sidebar-tabs{border-bottom:#d2d6de}.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a{background:#e8ecf4;color:#444}.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:hover,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:focus{border-left-color:#d2d6de;border-bottom-color:#d2d6de}.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:hover,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:focus,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:active{background:#eff1f7}.control-sidebar-light .nav-tabs.control-sidebar-tabs>li.active>a,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li.active>a:hover,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li.active>a:focus,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li.active>a:active{background:#f9fafc;color:#111}.control-sidebar-light .control-sidebar-heading,.control-sidebar-light .control-sidebar-subheading{color:#111}.control-sidebar-light .control-sidebar-menu{margin-left:-14px}.control-sidebar-light .control-sidebar-menu>li>a:hover{background:#f4f4f5}.control-sidebar-light .control-sidebar-menu>li>a .menu-info>p{color:#5e5e5e}.dropdown-menu{box-shadow:none;border-color:#eee}.dropdown-menu>li>a{color:#777}.dropdown-menu>li>a>.glyphicon,.dropdown-menu>li>a>.fa,.dropdown-menu>li>a>.ion{margin-right:10px}.dropdown-menu>li>a:hover{background-color:#e1e3e9;color:#333}.dropdown-menu>.divider{background-color:#eee}.navbar-nav>.notifications-menu>.dropdown-menu,.navbar-nav>.messages-menu>.dropdown-menu,.navbar-nav>.tasks-menu>.dropdown-menu{width:280px;padding:0 0 0 0;margin:0;top:100%}.navbar-nav>.notifications-menu>.dropdown-menu>li,.navbar-nav>.messages-menu>.dropdown-menu>li,.navbar-nav>.tasks-menu>.dropdown-menu>li{position:relative}.navbar-nav>.notifications-menu>.dropdown-menu>li.header,.navbar-nav>.messages-menu>.dropdown-menu>li.header,.navbar-nav>.tasks-menu>.dropdown-menu>li.header{border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0;background-color:#ffffff;padding:7px 10px;border-bottom:1px solid #f4f4f4;color:#444444;font-size:14px}.navbar-nav>.notifications-menu>.dropdown-menu>li.footer>a,.navbar-nav>.messages-menu>.dropdown-menu>li.footer>a,.navbar-nav>.tasks-menu>.dropdown-menu>li.footer>a{border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px;font-size:12px;background-color:#fff;padding:7px 10px;border-bottom:1px solid #eeeeee;color:#444 !important;text-align:center}@media (max-width:991px){.navbar-nav>.notifications-menu>.dropdown-menu>li.footer>a,.navbar-nav>.messages-menu>.dropdown-menu>li.footer>a,.navbar-nav>.tasks-menu>.dropdown-menu>li.footer>a{background:#fff !important;color:#444 !important}}.navbar-nav>.notifications-menu>.dropdown-menu>li.footer>a:hover,.navbar-nav>.messages-menu>.dropdown-menu>li.footer>a:hover,.navbar-nav>.tasks-menu>.dropdown-menu>li.footer>a:hover{text-decoration:none;font-weight:normal}.navbar-nav>.notifications-menu>.dropdown-menu>li .menu,.navbar-nav>.messages-menu>.dropdown-menu>li .menu,.navbar-nav>.tasks-menu>.dropdown-menu>li .menu{max-height:200px;margin:0;padding:0;list-style:none;overflow-x:hidden}.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a,.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a,.navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a{display:block;white-space:nowrap;border-bottom:1px solid #f4f4f4}.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a:hover,.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a:hover,.navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a:hover{background:#f4f4f4;text-decoration:none}.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a{color:#444444;overflow:hidden;text-overflow:ellipsis;padding:10px}.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a>.glyphicon,.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a>.fa,.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a>.ion{width:20px}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a{margin:0;padding:10px 10px}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a>div>img{margin:auto 10px auto auto;width:40px;height:40px}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a>h4{padding:0;margin:0 0 0 45px;color:#444444;font-size:15px;position:relative}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a>h4>small{color:#999999;font-size:10px;position:absolute;top:0;right:0}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a>p{margin:0 0 0 45px;font-size:12px;color:#888888}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a:before,.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a:after{content:" ";display:table}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a:after{clear:both}.navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a{padding:10px}.navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a>h3{font-size:14px;padding:0;margin:0 0 10px 0;color:#666666}.navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a>.progress{padding:0;margin:0}.navbar-nav>.user-menu>.dropdown-menu{border-top-right-radius:0;border-top-left-radius:0;padding:1px 0 0 0;border-top-width:0;width:280px}.navbar-nav>.user-menu>.dropdown-menu,.navbar-nav>.user-menu>.dropdown-menu>.user-body{border-bottom-right-radius:4px;border-bottom-left-radius:4px}.navbar-nav>.user-menu>.dropdown-menu>li.user-header{height:175px;padding:10px;text-align:center}.navbar-nav>.user-menu>.dropdown-menu>li.user-header>img{z-index:5;height:90px;width:90px;border:3px solid;border-color:transparent;border-color:rgba(255,255,255,0.2)}.navbar-nav>.user-menu>.dropdown-menu>li.user-header>p{z-index:5;color:#fff;color:rgba(255,255,255,0.8);font-size:17px;margin-top:10px}.navbar-nav>.user-menu>.dropdown-menu>li.user-header>p>small{display:block;font-size:12px}.navbar-nav>.user-menu>.dropdown-menu>.user-body{padding:15px;border-bottom:1px solid #f4f4f4;border-top:1px solid #dddddd}.navbar-nav>.user-menu>.dropdown-menu>.user-body:before,.navbar-nav>.user-menu>.dropdown-menu>.user-body:after{content:" ";display:table}.navbar-nav>.user-menu>.dropdown-menu>.user-body:after{clear:both}.navbar-nav>.user-menu>.dropdown-menu>.user-body a{color:#444 !important}@media (max-width:991px){.navbar-nav>.user-menu>.dropdown-menu>.user-body a{background:#fff !important;color:#444 !important}}.navbar-nav>.user-menu>.dropdown-menu>.user-footer{background-color:#f9f9f9;padding:10px}.navbar-nav>.user-menu>.dropdown-menu>.user-footer:before,.navbar-nav>.user-menu>.dropdown-menu>.user-footer:after{content:" ";display:table}.navbar-nav>.user-menu>.dropdown-menu>.user-footer:after{clear:both}.navbar-nav>.user-menu>.dropdown-menu>.user-footer .btn-default{color:#666666}@media (max-width:991px){.navbar-nav>.user-menu>.dropdown-menu>.user-footer .btn-default:hover{background-color:#f9f9f9}}.navbar-nav>.user-menu .user-image{float:left;width:25px;height:25px;border-radius:50%;margin-right:10px;margin-top:-2px}@media (max-width:767px){.navbar-nav>.user-menu .user-image{float:none;margin-right:0;margin-top:-8px;line-height:10px}}.open:not(.dropup)>.animated-dropdown-menu{backface-visibility:visible !important;-webkit-animation:flipInX .7s both;-o-animation:flipInX .7s both;animation:flipInX .7s both}@keyframes flipInX{0%{transform:perspective(400px) rotate3d(1, 0, 0, 90deg);transition-timing-function:ease-in;opacity:0}40%{transform:perspective(400px) rotate3d(1, 0, 0, -20deg);transition-timing-function:ease-in}60%{transform:perspective(400px) rotate3d(1, 0, 0, 10deg);opacity:1}80%{transform:perspective(400px) rotate3d(1, 0, 0, -5deg)}100%{transform:perspective(400px)}}@-webkit-keyframes flipInX{0%{-webkit-transform:perspective(400px) rotate3d(1, 0, 0, 90deg);-webkit-transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(1, 0, 0, -20deg);-webkit-transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(1, 0, 0, 10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(1, 0, 0, -5deg)}100%{-webkit-transform:perspective(400px)}}.navbar-custom-menu>.navbar-nav>li{position:relative}.navbar-custom-menu>.navbar-nav>li>.dropdown-menu{position:absolute;right:0;left:auto}@media (max-width:991px){.navbar-custom-menu>.navbar-nav{float:right}.navbar-custom-menu>.navbar-nav>li{position:static}.navbar-custom-menu>.navbar-nav>li>.dropdown-menu{position:absolute;right:5%;left:auto;border:1px solid #ddd;background:#fff}}.form-control{border-radius:0;box-shadow:none;border-color:#d2d6de}.form-control:focus{border-color:#3c8dbc;box-shadow:none}.form-control::-moz-placeholder,.form-control:-ms-input-placeholder,.form-control::-webkit-input-placeholder{color:#bbb;opacity:1}.form-control:not(select){-webkit-appearance:none;-moz-appearance:none;appearance:none}.form-group.has-success label{color:#00a65a}.form-group.has-success .form-control{border-color:#00a65a;box-shadow:none}.form-group.has-success .help-block{color:#00a65a}.form-group.has-warning label{color:#f39c12}.form-group.has-warning .form-control{border-color:#f39c12;box-shadow:none}.form-group.has-warning .help-block{color:#f39c12}.form-group.has-error label{color:#dd4b39}.form-group.has-error .form-control{border-color:#dd4b39;box-shadow:none}.form-group.has-error .help-block{color:#dd4b39}.input-group .input-group-addon{border-radius:0;border-color:#d2d6de;background-color:#fff}.btn-group-vertical .btn.btn-flat:first-of-type,.btn-group-vertical .btn.btn-flat:last-of-type{border-radius:0}.icheck>label{padding-left:0}.form-control-feedback.fa{line-height:34px}.input-lg+.form-control-feedback.fa,.input-group-lg+.form-control-feedback.fa,.form-group-lg .form-control+.form-control-feedback.fa{line-height:46px}.input-sm+.form-control-feedback.fa,.input-group-sm+.form-control-feedback.fa,.form-group-sm .form-control+.form-control-feedback.fa{line-height:30px}.progress,.progress>.progress-bar{-webkit-box-shadow:none;box-shadow:none}.progress,.progress>.progress-bar,.progress .progress-bar,.progress>.progress-bar .progress-bar{border-radius:1px}.progress.sm,.progress-sm{height:10px}.progress.sm,.progress-sm,.progress.sm .progress-bar,.progress-sm .progress-bar{border-radius:1px}.progress.xs,.progress-xs{height:7px}.progress.xs,.progress-xs,.progress.xs .progress-bar,.progress-xs .progress-bar{border-radius:1px}.progress.xxs,.progress-xxs{height:3px}.progress.xxs,.progress-xxs,.progress.xxs .progress-bar,.progress-xxs .progress-bar{border-radius:1px}.progress.vertical{position:relative;width:30px;height:200px;display:inline-block;margin-right:10px}.progress.vertical>.progress-bar{width:100%;position:absolute;bottom:0}.progress.vertical.sm,.progress.vertical.progress-sm{width:20px}.progress.vertical.xs,.progress.vertical.progress-xs{width:10px}.progress.vertical.xxs,.progress.vertical.progress-xxs{width:3px}.progress-group .progress-text{font-weight:600}.progress-group .progress-number{float:right}.table tr>td .progress{margin:0}.progress-bar-light-blue,.progress-bar-primary{background-color:#3c8dbc}.progress-striped .progress-bar-light-blue,.progress-striped .progress-bar-primary{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-green,.progress-bar-success{background-color:#00a65a}.progress-striped .progress-bar-green,.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-aqua,.progress-bar-info{background-color:#00c0ef}.progress-striped .progress-bar-aqua,.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-yellow,.progress-bar-warning{background-color:#f39c12}.progress-striped .progress-bar-yellow,.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-red,.progress-bar-danger{background-color:#dd4b39}.progress-striped .progress-bar-red,.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.small-box{border-radius:2px;position:relative;display:block;margin-bottom:20px;box-shadow:0 1px 1px rgba(0,0,0,0.1)}.small-box>.inner{padding:10px}.small-box>.small-box-footer{position:relative;text-align:center;padding:3px 0;color:#fff;color:rgba(255,255,255,0.8);display:block;z-index:10;background:rgba(0,0,0,0.1);text-decoration:none}.small-box>.small-box-footer:hover{color:#fff;background:rgba(0,0,0,0.15)}.small-box h3{font-size:38px;font-weight:bold;margin:0 0 10px 0;white-space:nowrap;padding:0}.small-box p{font-size:15px}.small-box p>small{display:block;color:#f9f9f9;font-size:13px;margin-top:5px}.small-box h3,.small-box p{z-index:5}.small-box .icon{-webkit-transition:all .3s linear;-o-transition:all .3s linear;transition:all .3s linear;position:absolute;top:-10px;right:10px;z-index:0;font-size:90px;color:rgba(0,0,0,0.15)}.small-box:hover{text-decoration:none;color:#f9f9f9}.small-box:hover .icon{font-size:95px}@media (max-width:767px){.small-box{text-align:center}.small-box .icon{display:none}.small-box p{font-size:12px}}.box{position:relative;border-radius:3px;background:#ffffff;border-top:3px solid #d2d6de;margin-bottom:20px;width:100%;box-shadow:0 1px 1px rgba(0,0,0,0.1)}.box.box-primary{border-top-color:#3c8dbc}.box.box-info{border-top-color:#00c0ef}.box.box-danger{border-top-color:#dd4b39}.box.box-warning{border-top-color:#f39c12}.box.box-success{border-top-color:#00a65a}.box.box-default{border-top-color:#d2d6de}.box.collapsed-box .box-body,.box.collapsed-box .box-footer{display:none}.box .nav-stacked>li{border-bottom:1px solid #f4f4f4;margin:0}.box .nav-stacked>li:last-of-type{border-bottom:none}.box.height-control .box-body{max-height:300px;overflow:auto}.box .border-right{border-right:1px solid #f4f4f4}.box .border-left{border-left:1px solid #f4f4f4}.box.box-solid{border-top:0}.box.box-solid>.box-header .btn.btn-default{background:transparent}.box.box-solid>.box-header .btn:hover,.box.box-solid>.box-header a:hover{background:rgba(0,0,0,0.1)}.box.box-solid.box-default{border:1px solid #d2d6de}.box.box-solid.box-default>.box-header{color:#444;background:#d2d6de;background-color:#d2d6de}.box.box-solid.box-default>.box-header a,.box.box-solid.box-default>.box-header .btn{color:#444}.box.box-solid.box-primary{border:1px solid #3c8dbc}.box.box-solid.box-primary>.box-header{color:#fff;background:#3c8dbc;background-color:#3c8dbc}.box.box-solid.box-primary>.box-header a,.box.box-solid.box-primary>.box-header .btn{color:#fff}.box.box-solid.box-info{border:1px solid #00c0ef}.box.box-solid.box-info>.box-header{color:#fff;background:#00c0ef;background-color:#00c0ef}.box.box-solid.box-info>.box-header a,.box.box-solid.box-info>.box-header .btn{color:#fff}.box.box-solid.box-danger{border:1px solid #dd4b39}.box.box-solid.box-danger>.box-header{color:#fff;background:#dd4b39;background-color:#dd4b39}.box.box-solid.box-danger>.box-header a,.box.box-solid.box-danger>.box-header .btn{color:#fff}.box.box-solid.box-warning{border:1px solid #f39c12}.box.box-solid.box-warning>.box-header{color:#fff;background:#f39c12;background-color:#f39c12}.box.box-solid.box-warning>.box-header a,.box.box-solid.box-warning>.box-header .btn{color:#fff}.box.box-solid.box-success{border:1px solid #00a65a}.box.box-solid.box-success>.box-header{color:#fff;background:#00a65a;background-color:#00a65a}.box.box-solid.box-success>.box-header a,.box.box-solid.box-success>.box-header .btn{color:#fff}.box.box-solid>.box-header>.box-tools .btn{border:0;box-shadow:none}.box.box-solid[class*='bg']>.box-header{color:#fff}.box .box-group>.box{margin-bottom:5px}.box .knob-label{text-align:center;color:#333;font-weight:100;font-size:12px;margin-bottom:0.3em}.box>.overlay,.overlay-wrapper>.overlay,.box>.loading-img,.overlay-wrapper>.loading-img{position:absolute;top:0;left:0;width:100%;height:100%}.box .overlay,.overlay-wrapper .overlay{z-index:50;background:rgba(255,255,255,0.7);border-radius:3px}.box .overlay>.fa,.overlay-wrapper .overlay>.fa{position:absolute;top:50%;left:50%;margin-left:-15px;margin-top:-15px;color:#000;font-size:30px}.box .overlay.dark,.overlay-wrapper .overlay.dark{background:rgba(0,0,0,0.5)}.box-header:before,.box-body:before,.box-footer:before,.box-header:after,.box-body:after,.box-footer:after{content:" ";display:table}.box-header:after,.box-body:after,.box-footer:after{clear:both}.box-header{color:#444;display:block;padding:10px;position:relative}.box-header.with-border{border-bottom:1px solid #f4f4f4}.collapsed-box .box-header.with-border{border-bottom:none}.box-header>.fa,.box-header>.glyphicon,.box-header>.ion,.box-header .box-title{display:inline-block;font-size:18px;margin:0;line-height:1}.box-header>.fa,.box-header>.glyphicon,.box-header>.ion{margin-right:5px}.box-header>.box-tools{position:absolute;right:10px;top:5px}.box-header>.box-tools [data-toggle="tooltip"]{position:relative}.box-header>.box-tools.pull-right .dropdown-menu{right:0;left:auto}.btn-box-tool{padding:5px;font-size:12px;background:transparent;color:#97a0b3}.open .btn-box-tool,.btn-box-tool:hover{color:#606c84}.btn-box-tool.btn:active{box-shadow:none}.box-body{border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px;padding:10px}.no-header .box-body{border-top-right-radius:3px;border-top-left-radius:3px}.box-body>.table{margin-bottom:0}.box-body .fc{margin-top:5px}.box-body .full-width-chart{margin:-19px}.box-body.no-padding .full-width-chart{margin:-9px}.box-body .box-pane{border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:3px}.box-body .box-pane-right{border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:3px;border-bottom-left-radius:0}.box-footer{border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px;border-top:1px solid #f4f4f4;padding:10px;background-color:#fff}.chart-legend{margin:10px 0}@media (max-width:991px){.chart-legend>li{float:left;margin-right:10px}}.box-comments{background:#f7f7f7}.box-comments .box-comment{padding:8px 0;border-bottom:1px solid #eee}.box-comments .box-comment:before,.box-comments .box-comment:after{content:" ";display:table}.box-comments .box-comment:after{clear:both}.box-comments .box-comment:last-of-type{border-bottom:0}.box-comments .box-comment:first-of-type{padding-top:0}.box-comments .box-comment img{float:left}.box-comments .comment-text{margin-left:40px;color:#555}.box-comments .username{color:#444;display:block;font-weight:600}.box-comments .text-muted{font-weight:400;font-size:12px}.todo-list{margin:0;padding:0;list-style:none;overflow:auto}.todo-list>li{border-radius:2px;padding:10px;background:#f4f4f4;margin-bottom:2px;border-left:2px solid #e6e7e8;color:#444}.todo-list>li:last-of-type{margin-bottom:0}.todo-list>li>input[type='checkbox']{margin:0 10px 0 5px}.todo-list>li .text{display:inline-block;margin-left:5px;font-weight:600}.todo-list>li .label{margin-left:10px;font-size:9px}.todo-list>li .tools{display:none;float:right;color:#dd4b39}.todo-list>li .tools>.fa,.todo-list>li .tools>.glyphicon,.todo-list>li .tools>.ion{margin-right:5px;cursor:pointer}.todo-list>li:hover .tools{display:inline-block}.todo-list>li.done{color:#999}.todo-list>li.done .text{text-decoration:line-through;font-weight:500}.todo-list>li.done .label{background:#d2d6de !important}.todo-list .danger{border-left-color:#dd4b39}.todo-list .warning{border-left-color:#f39c12}.todo-list .info{border-left-color:#00c0ef}.todo-list .success{border-left-color:#00a65a}.todo-list .primary{border-left-color:#3c8dbc}.todo-list .handle{display:inline-block;cursor:move;margin:0 5px}.chat{padding:5px 20px 5px 10px}.chat .item{margin-bottom:10px}.chat .item:before,.chat .item:after{content:" ";display:table}.chat .item:after{clear:both}.chat .item>img{width:40px;height:40px;border:2px solid transparent;border-radius:50%}.chat .item>.online{border:2px solid #00a65a}.chat .item>.offline{border:2px solid #dd4b39}.chat .item>.message{margin-left:55px;margin-top:-40px}.chat .item>.message>.name{display:block;font-weight:600}.chat .item>.attachment{border-radius:3px;background:#f4f4f4;margin-left:65px;margin-right:15px;padding:10px}.chat .item>.attachment>h4{margin:0 0 5px 0;font-weight:600;font-size:14px}.chat .item>.attachment>p,.chat .item>.attachment>.filename{font-weight:600;font-size:13px;font-style:italic;margin:0}.chat .item>.attachment:before,.chat .item>.attachment:after{content:" ";display:table}.chat .item>.attachment:after{clear:both}.box-input{max-width:200px}.modal .panel-body{color:#444}.info-box{display:block;min-height:90px;background:#fff;width:100%;box-shadow:0 1px 1px rgba(0,0,0,0.1);border-radius:2px;margin-bottom:15px}.info-box small{font-size:14px}.info-box .progress{background:rgba(0,0,0,0.2);margin:5px -10px 5px -10px;height:2px}.info-box .progress,.info-box .progress .progress-bar{border-radius:0}.info-box .progress .progress-bar{background:#fff}.info-box-icon{border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px;display:block;float:left;height:90px;width:90px;text-align:center;font-size:45px;line-height:90px;background:rgba(0,0,0,0.2)}.info-box-icon>img{max-width:100%}.info-box-content{padding:5px 10px;margin-left:90px}.info-box-number{display:block;font-weight:bold;font-size:18px}.progress-description,.info-box-text{display:block;font-size:14px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.info-box-text{text-transform:uppercase}.info-box-more{display:block}.progress-description{margin:0}.timeline{position:relative;margin:0 0 30px 0;padding:0;list-style:none}.timeline:before{content:'';position:absolute;top:0;bottom:0;width:4px;background:#ddd;left:31px;margin:0;border-radius:2px}.timeline>li{position:relative;margin-right:10px;margin-bottom:15px}.timeline>li:before,.timeline>li:after{content:" ";display:table}.timeline>li:after{clear:both}.timeline>li>.timeline-item{-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.1);box-shadow:0 1px 1px rgba(0,0,0,0.1);border-radius:3px;margin-top:0;background:#fff;color:#444;margin-left:60px;margin-right:15px;padding:0;position:relative}.timeline>li>.timeline-item>.time{color:#999;float:right;padding:10px;font-size:12px}.timeline>li>.timeline-item>.timeline-header{margin:0;color:#555;border-bottom:1px solid #f4f4f4;padding:10px;font-size:16px;line-height:1.1}.timeline>li>.timeline-item>.timeline-header>a{font-weight:600}.timeline>li>.timeline-item>.timeline-body,.timeline>li>.timeline-item>.timeline-footer{padding:10px}.timeline>li>.fa,.timeline>li>.glyphicon,.timeline>li>.ion{width:30px;height:30px;font-size:15px;line-height:30px;position:absolute;color:#666;background:#d2d6de;border-radius:50%;text-align:center;left:18px;top:0}.timeline>.time-label>span{font-weight:600;padding:5px;display:inline-block;background-color:#fff;border-radius:4px}.timeline-inverse>li>.timeline-item{background:#f0f0f0;border:1px solid #ddd;-webkit-box-shadow:none;box-shadow:none}.timeline-inverse>li>.timeline-item>.timeline-header{border-bottom-color:#ddd}.btn{border-radius:3px;-webkit-box-shadow:none;box-shadow:none;border:1px solid transparent}.btn.uppercase{text-transform:uppercase}.btn.btn-flat{border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;border-width:1px}.btn:active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);-moz-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn:focus{outline:none}.btn.btn-file{position:relative;overflow:hidden}.btn.btn-file>input[type='file']{position:absolute;top:0;right:0;min-width:100%;min-height:100%;font-size:100px;text-align:right;opacity:0;filter:alpha(opacity=0);outline:none;background:white;cursor:inherit;display:block}.btn-default{background-color:#f4f4f4;color:#444;border-color:#ddd}.btn-default:hover,.btn-default:active,.btn-default.hover{background-color:#e7e7e7}.btn-primary{background-color:#3c8dbc;border-color:#367fa9}.btn-primary:hover,.btn-primary:active,.btn-primary.hover{background-color:#367fa9}.btn-success{background-color:#00a65a;border-color:#008d4c}.btn-success:hover,.btn-success:active,.btn-success.hover{background-color:#008d4c}.btn-info{background-color:#00c0ef;border-color:#00acd6}.btn-info:hover,.btn-info:active,.btn-info.hover{background-color:#00acd6}.btn-danger{background-color:#dd4b39;border-color:#d73925}.btn-danger:hover,.btn-danger:active,.btn-danger.hover{background-color:#d73925}.btn-warning{background-color:#f39c12;border-color:#e08e0b}.btn-warning:hover,.btn-warning:active,.btn-warning.hover{background-color:#e08e0b}.btn-outline{border:1px solid #fff;background:transparent;color:#fff}.btn-outline:hover,.btn-outline:focus,.btn-outline:active{color:rgba(255,255,255,0.7);border-color:rgba(255,255,255,0.7)}.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn[class*='bg-']:hover{-webkit-box-shadow:inset 0 0 100px rgba(0,0,0,0.2);box-shadow:inset 0 0 100px rgba(0,0,0,0.2)}.btn-app{border-radius:3px;position:relative;padding:15px 5px;margin:0 0 10px 10px;min-width:80px;height:60px;text-align:center;color:#666;border:1px solid #ddd;background-color:#f4f4f4;font-size:12px}.btn-app>.fa,.btn-app>.glyphicon,.btn-app>.ion{font-size:20px;display:block}.btn-app:hover{background:#f4f4f4;color:#444;border-color:#aaa}.btn-app:active,.btn-app:focus{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);-moz-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-app>.badge{position:absolute;top:-3px;right:-10px;font-size:10px;font-weight:400}.callout{border-radius:3px;margin:0 0 20px 0;padding:15px 30px 15px 15px;border-left:5px solid #eee}.callout a{color:#fff;text-decoration:underline}.callout a:hover{color:#eee}.callout h4{margin-top:0;font-weight:600}.callout p:last-child{margin-bottom:0}.callout code,.callout .highlight{background-color:#fff}.callout.callout-danger{border-color:#c23321}.callout.callout-warning{border-color:#c87f0a}.callout.callout-info{border-color:#0097bc}.callout.callout-success{border-color:#00733e}.alert{border-radius:3px}.alert h4{font-weight:600}.alert .icon{margin-right:10px}.alert .close{color:#000;opacity:.2;filter:alpha(opacity=20)}.alert .close:hover{opacity:.5;filter:alpha(opacity=50)}.alert a{color:#fff;text-decoration:underline}.alert-success{border-color:#008d4c}.alert-danger,.alert-error{border-color:#d73925}.alert-warning{border-color:#e08e0b}.alert-info{border-color:#00acd6}.nav>li>a:hover,.nav>li>a:active,.nav>li>a:focus{color:#444;background:#f7f7f7}.nav-pills>li>a{border-radius:0;border-top:3px solid transparent;color:#444}.nav-pills>li>a>.fa,.nav-pills>li>a>.glyphicon,.nav-pills>li>a>.ion{margin-right:5px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{border-top-color:#3c8dbc}.nav-pills>li.active>a{font-weight:600}.nav-stacked>li>a{border-radius:0;border-top:0;border-left:3px solid transparent;color:#444}.nav-stacked>li.active>a,.nav-stacked>li.active>a:hover{background:transparent;color:#444;border-top:0;border-left-color:#3c8dbc}.nav-stacked>li.header{border-bottom:1px solid #ddd;color:#777;margin-bottom:10px;padding:5px 10px;text-transform:uppercase}.nav-tabs-custom{margin-bottom:20px;background:#fff;box-shadow:0 1px 1px rgba(0,0,0,0.1);border-radius:3px}.nav-tabs-custom>.nav-tabs{margin:0;border-bottom-color:#f4f4f4;border-top-right-radius:3px;border-top-left-radius:3px}.nav-tabs-custom>.nav-tabs>li{border-top:3px solid transparent;margin-bottom:-2px;margin-right:5px}.nav-tabs-custom>.nav-tabs>li>a{color:#444;border-radius:0}.nav-tabs-custom>.nav-tabs>li>a.text-muted{color:#999}.nav-tabs-custom>.nav-tabs>li>a,.nav-tabs-custom>.nav-tabs>li>a:hover{background:transparent;margin:0}.nav-tabs-custom>.nav-tabs>li>a:hover{color:#999}.nav-tabs-custom>.nav-tabs>li:not(.active)>a:hover,.nav-tabs-custom>.nav-tabs>li:not(.active)>a:focus,.nav-tabs-custom>.nav-tabs>li:not(.active)>a:active{border-color:transparent}.nav-tabs-custom>.nav-tabs>li.active{border-top-color:#3c8dbc}.nav-tabs-custom>.nav-tabs>li.active>a,.nav-tabs-custom>.nav-tabs>li.active:hover>a{background-color:#fff;color:#444}.nav-tabs-custom>.nav-tabs>li.active>a{border-top-color:transparent;border-left-color:#f4f4f4;border-right-color:#f4f4f4}.nav-tabs-custom>.nav-tabs>li:first-of-type{margin-left:0}.nav-tabs-custom>.nav-tabs>li:first-of-type.active>a{border-left-color:transparent}.nav-tabs-custom>.nav-tabs.pull-right{float:none !important}.nav-tabs-custom>.nav-tabs.pull-right>li{float:right}.nav-tabs-custom>.nav-tabs.pull-right>li:first-of-type{margin-right:0}.nav-tabs-custom>.nav-tabs.pull-right>li:first-of-type>a{border-left-width:1px}.nav-tabs-custom>.nav-tabs.pull-right>li:first-of-type.active>a{border-left-color:#f4f4f4;border-right-color:transparent}.nav-tabs-custom>.nav-tabs>li.header{line-height:35px;padding:0 10px;font-size:20px;color:#444}.nav-tabs-custom>.nav-tabs>li.header>.fa,.nav-tabs-custom>.nav-tabs>li.header>.glyphicon,.nav-tabs-custom>.nav-tabs>li.header>.ion{margin-right:5px}.nav-tabs-custom>.tab-content{background:#fff;padding:10px;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.nav-tabs-custom .dropdown.open>a:active,.nav-tabs-custom .dropdown.open>a:focus{background:transparent;color:#999}.nav-tabs-custom.tab-primary>.nav-tabs>li.active{border-top-color:#3c8dbc}.nav-tabs-custom.tab-info>.nav-tabs>li.active{border-top-color:#00c0ef}.nav-tabs-custom.tab-danger>.nav-tabs>li.active{border-top-color:#dd4b39}.nav-tabs-custom.tab-warning>.nav-tabs>li.active{border-top-color:#f39c12}.nav-tabs-custom.tab-success>.nav-tabs>li.active{border-top-color:#00a65a}.nav-tabs-custom.tab-default>.nav-tabs>li.active{border-top-color:#d2d6de}.pagination>li>a{background:#fafafa;color:#666}.pagination.pagination-flat>li>a{border-radius:0 !important}.products-list{list-style:none;margin:0;padding:0}.products-list>.item{border-radius:3px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.1);box-shadow:0 1px 1px rgba(0,0,0,0.1);padding:10px 0;background:#fff}.products-list>.item:before,.products-list>.item:after{content:" ";display:table}.products-list>.item:after{clear:both}.products-list .product-img{float:left}.products-list .product-img img{width:50px;height:50px}.products-list .product-info{margin-left:60px}.products-list .product-title{font-weight:600}.products-list .product-description{display:block;color:#999;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.product-list-in-box>.item{-webkit-box-shadow:none;box-shadow:none;border-radius:0;border-bottom:1px solid #f4f4f4}.product-list-in-box>.item:last-of-type{border-bottom-width:0}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{border-top:1px solid #f4f4f4}.table>thead>tr>th{border-bottom:2px solid #f4f4f4}.table tr td .progress{margin-top:5px}.table-bordered{border:1px solid #f4f4f4}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #f4f4f4}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table.no-border,.table.no-border td,.table.no-border th{border:0}table.text-center,table.text-center td,table.text-center th{text-align:center}.table.align th{text-align:left}.table.align td{text-align:right}.label-default{background-color:#d2d6de;color:#444}.direct-chat .box-body{border-bottom-right-radius:0;border-bottom-left-radius:0;position:relative;overflow-x:hidden;padding:0}.direct-chat.chat-pane-open .direct-chat-contacts{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0)}.direct-chat-messages{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0);padding:10px;height:250px;overflow:auto}.direct-chat-msg,.direct-chat-text{display:block}.direct-chat-msg{margin-bottom:10px}.direct-chat-msg:before,.direct-chat-msg:after{content:" ";display:table}.direct-chat-msg:after{clear:both}.direct-chat-messages,.direct-chat-contacts{-webkit-transition:-webkit-transform .5s ease-in-out;-moz-transition:-moz-transform .5s ease-in-out;-o-transition:-o-transform .5s ease-in-out;transition:transform .5s ease-in-out}.direct-chat-text{border-radius:5px;position:relative;padding:5px 10px;background:#d2d6de;border:1px solid #d2d6de;margin:5px 0 0 50px;color:#444}.direct-chat-text:after,.direct-chat-text:before{position:absolute;right:100%;top:15px;border:solid transparent;border-right-color:#d2d6de;content:' ';height:0;width:0;pointer-events:none}.direct-chat-text:after{border-width:5px;margin-top:-5px}.direct-chat-text:before{border-width:6px;margin-top:-6px}.right .direct-chat-text{margin-right:50px;margin-left:0}.right .direct-chat-text:after,.right .direct-chat-text:before{right:auto;left:100%;border-right-color:transparent;border-left-color:#d2d6de}.direct-chat-img{border-radius:50%;float:left;width:40px;height:40px}.right .direct-chat-img{float:right}.direct-chat-info{display:block;margin-bottom:2px;font-size:12px}.direct-chat-name{font-weight:600}.direct-chat-timestamp{color:#999}.direct-chat-contacts-open .direct-chat-contacts{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0)}.direct-chat-contacts{-webkit-transform:translate(101%, 0);-ms-transform:translate(101%, 0);-o-transform:translate(101%, 0);transform:translate(101%, 0);position:absolute;top:0;bottom:0;height:250px;width:100%;background:#222d32;color:#fff;overflow:auto}.contacts-list>li{border-bottom:1px solid rgba(0,0,0,0.2);padding:10px;margin:0}.contacts-list>li:before,.contacts-list>li:after{content:" ";display:table}.contacts-list>li:after{clear:both}.contacts-list>li:last-of-type{border-bottom:none}.contacts-list-img{border-radius:50%;width:40px;float:left}.contacts-list-info{margin-left:45px;color:#fff}.contacts-list-name,.contacts-list-status{display:block}.contacts-list-name{font-weight:600}.contacts-list-status{font-size:12px}.contacts-list-date{color:#aaa;font-weight:normal}.contacts-list-msg{color:#999}.direct-chat-danger .right>.direct-chat-text{background:#dd4b39;border-color:#dd4b39;color:#fff}.direct-chat-danger .right>.direct-chat-text:after,.direct-chat-danger .right>.direct-chat-text:before{border-left-color:#dd4b39}.direct-chat-primary .right>.direct-chat-text{background:#3c8dbc;border-color:#3c8dbc;color:#fff}.direct-chat-primary .right>.direct-chat-text:after,.direct-chat-primary .right>.direct-chat-text:before{border-left-color:#3c8dbc}.direct-chat-warning .right>.direct-chat-text{background:#f39c12;border-color:#f39c12;color:#fff}.direct-chat-warning .right>.direct-chat-text:after,.direct-chat-warning .right>.direct-chat-text:before{border-left-color:#f39c12}.direct-chat-info .right>.direct-chat-text{background:#00c0ef;border-color:#00c0ef;color:#fff}.direct-chat-info .right>.direct-chat-text:after,.direct-chat-info .right>.direct-chat-text:before{border-left-color:#00c0ef}.direct-chat-success .right>.direct-chat-text{background:#00a65a;border-color:#00a65a;color:#fff}.direct-chat-success .right>.direct-chat-text:after,.direct-chat-success .right>.direct-chat-text:before{border-left-color:#00a65a}.users-list>li{width:25%;float:left;padding:10px;text-align:center}.users-list>li img{border-radius:50%;max-width:100%;height:auto}.users-list>li>a:hover,.users-list>li>a:hover .users-list-name{color:#999}.users-list-name,.users-list-date{display:block}.users-list-name{font-weight:600;color:#444;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.users-list-date{color:#999;font-size:12px}.carousel-control.left,.carousel-control.right{background-image:none}.carousel-control>.fa{font-size:40px;position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-20px}.modal{background:rgba(0,0,0,0.3)}.modal-content{border-radius:0;-webkit-box-shadow:0 2px 3px rgba(0,0,0,0.125);box-shadow:0 2px 3px rgba(0,0,0,0.125);border:0}@media (min-width:768px){.modal-content{-webkit-box-shadow:0 2px 3px rgba(0,0,0,0.125);box-shadow:0 2px 3px rgba(0,0,0,0.125)}}.modal-header{border-bottom-color:#f4f4f4}.modal-footer{border-top-color:#f4f4f4}.modal-primary .modal-header,.modal-primary .modal-footer{border-color:#307095}.modal-warning .modal-header,.modal-warning .modal-footer{border-color:#c87f0a}.modal-info .modal-header,.modal-info .modal-footer{border-color:#0097bc}.modal-success .modal-header,.modal-success .modal-footer{border-color:#00733e}.modal-danger .modal-header,.modal-danger .modal-footer{border-color:#c23321}.box-widget{border:none;position:relative}.widget-user .widget-user-header{padding:20px;height:120px;border-top-right-radius:3px;border-top-left-radius:3px}.widget-user .widget-user-username{margin-top:0;margin-bottom:5px;font-size:25px;font-weight:300;text-shadow:0 1px 1px rgba(0,0,0,0.2)}.widget-user .widget-user-desc{margin-top:0}.widget-user .widget-user-image{position:absolute;top:65px;left:50%;margin-left:-45px}.widget-user .widget-user-image>img{width:90px;height:auto;border:3px solid #fff}.widget-user .box-footer{padding-top:30px}.widget-user-2 .widget-user-header{padding:20px;border-top-right-radius:3px;border-top-left-radius:3px}.widget-user-2 .widget-user-username{margin-top:5px;margin-bottom:5px;font-size:25px;font-weight:300}.widget-user-2 .widget-user-desc{margin-top:0}.widget-user-2 .widget-user-username,.widget-user-2 .widget-user-desc{margin-left:75px}.widget-user-2 .widget-user-image>img{width:65px;height:auto;float:left}.mailbox-messages>.table{margin:0}.mailbox-controls{padding:5px}.mailbox-controls.with-border{border-bottom:1px solid #f4f4f4}.mailbox-read-info{border-bottom:1px solid #f4f4f4;padding:10px}.mailbox-read-info h3{font-size:20px;margin:0}.mailbox-read-info h5{margin:0;padding:5px 0 0 0}.mailbox-read-time{color:#999;font-size:13px}.mailbox-read-message{padding:10px}.mailbox-attachments li{float:left;width:200px;border:1px solid #eee;margin-bottom:10px;margin-right:10px}.mailbox-attachment-name{font-weight:bold;color:#666}.mailbox-attachment-icon,.mailbox-attachment-info,.mailbox-attachment-size{display:block}.mailbox-attachment-info{padding:10px;background:#f4f4f4}.mailbox-attachment-size{color:#999;font-size:12px}.mailbox-attachment-icon{text-align:center;font-size:65px;color:#666;padding:20px 10px}.mailbox-attachment-icon.has-img{padding:0}.mailbox-attachment-icon.has-img>img{max-width:100%;height:auto}.lockscreen{background:#d2d6de}.lockscreen-logo{font-size:35px;text-align:center;margin-bottom:25px;font-weight:300}.lockscreen-logo a{color:#444}.lockscreen-wrapper{max-width:400px;margin:0 auto;margin-top:10%}.lockscreen .lockscreen-name{text-align:center;font-weight:600}.lockscreen-item{border-radius:4px;padding:0;background:#fff;position:relative;margin:10px auto 30px auto;width:290px}.lockscreen-image{border-radius:50%;position:absolute;left:-10px;top:-25px;background:#fff;padding:5px;z-index:10}.lockscreen-image>img{border-radius:50%;width:70px;height:70px}.lockscreen-credentials{margin-left:70px}.lockscreen-credentials .form-control{border:0}.lockscreen-credentials .btn{background-color:#fff;border:0;padding:0 10px}.lockscreen-footer{margin-top:10px}.login-logo,.register-logo{font-size:35px;text-align:center;margin-bottom:25px;font-weight:300}.login-logo a,.register-logo a{color:#444}.login-page,.register-page{background:#d2d6de}.login-box,.register-box{width:360px;margin:7% auto}@media (max-width:768px){.login-box,.register-box{width:90%;margin-top:20px}}.login-box-body,.register-box-body{background:#fff;padding:20px;border-top:0;color:#666}.login-box-body .form-control-feedback,.register-box-body .form-control-feedback{color:#777}.login-box-msg,.register-box-msg{margin:0;text-align:center;padding:0 20px 20px 20px}.social-auth-links{margin:10px 0}.error-page{width:600px;margin:20px auto 0 auto}@media (max-width:991px){.error-page{width:100%}}.error-page>.headline{float:left;font-size:100px;font-weight:300}@media (max-width:991px){.error-page>.headline{float:none;text-align:center}}.error-page>.error-content{margin-left:190px;display:block}@media (max-width:991px){.error-page>.error-content{margin-left:0}}.error-page>.error-content>h3{font-weight:300;font-size:25px}@media (max-width:991px){.error-page>.error-content>h3{text-align:center}}.invoice{position:relative;background:#fff;border:1px solid #f4f4f4;padding:20px;margin:10px 25px}.invoice-title{margin-top:0}.profile-user-img{margin:0 auto;width:100px;padding:3px;border:3px solid #d2d6de}.profile-username{font-size:21px;margin-top:5px}.post{border-bottom:1px solid #d2d6de;margin-bottom:15px;padding-bottom:15px;color:#666}.post:last-of-type{border-bottom:0;margin-bottom:0;padding-bottom:0}.post .user-block{margin-bottom:15px}.btn-social{position:relative;padding-left:44px;text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.btn-social>:first-child{position:absolute;left:0;top:0;bottom:0;width:32px;line-height:34px;font-size:1.6em;text-align:center;border-right:1px solid rgba(0,0,0,0.2)}.btn-social.btn-lg{padding-left:61px}.btn-social.btn-lg>:first-child{line-height:45px;width:45px;font-size:1.8em}.btn-social.btn-sm{padding-left:38px}.btn-social.btn-sm>:first-child{line-height:28px;width:28px;font-size:1.4em}.btn-social.btn-xs{padding-left:30px}.btn-social.btn-xs>:first-child{line-height:20px;width:20px;font-size:1.2em}.btn-social-icon{position:relative;padding-left:44px;text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;height:34px;width:34px;padding:0}.btn-social-icon>:first-child{position:absolute;left:0;top:0;bottom:0;width:32px;line-height:34px;font-size:1.6em;text-align:center;border-right:1px solid rgba(0,0,0,0.2)}.btn-social-icon.btn-lg{padding-left:61px}.btn-social-icon.btn-lg>:first-child{line-height:45px;width:45px;font-size:1.8em}.btn-social-icon.btn-sm{padding-left:38px}.btn-social-icon.btn-sm>:first-child{line-height:28px;width:28px;font-size:1.4em}.btn-social-icon.btn-xs{padding-left:30px}.btn-social-icon.btn-xs>:first-child{line-height:20px;width:20px;font-size:1.2em}.btn-social-icon>:first-child{border:none;text-align:center;width:100%}.btn-social-icon.btn-lg{height:45px;width:45px;padding-left:0;padding-right:0}.btn-social-icon.btn-sm{height:30px;width:30px;padding-left:0;padding-right:0}.btn-social-icon.btn-xs{height:22px;width:22px;padding-left:0;padding-right:0}.btn-adn{color:#fff;background-color:#d87a68;border-color:rgba(0,0,0,0.2)}.btn-adn:focus,.btn-adn.focus{color:#fff;background-color:#ce563f;border-color:rgba(0,0,0,0.2)}.btn-adn:hover{color:#fff;background-color:#ce563f;border-color:rgba(0,0,0,0.2)}.btn-adn:active,.btn-adn.active,.open>.dropdown-toggle.btn-adn{color:#fff;background-color:#ce563f;border-color:rgba(0,0,0,0.2)}.btn-adn:active,.btn-adn.active,.open>.dropdown-toggle.btn-adn{background-image:none}.btn-adn .badge{color:#d87a68;background-color:#fff}.btn-bitbucket{color:#fff;background-color:#205081;border-color:rgba(0,0,0,0.2)}.btn-bitbucket:focus,.btn-bitbucket.focus{color:#fff;background-color:#163758;border-color:rgba(0,0,0,0.2)}.btn-bitbucket:hover{color:#fff;background-color:#163758;border-color:rgba(0,0,0,0.2)}.btn-bitbucket:active,.btn-bitbucket.active,.open>.dropdown-toggle.btn-bitbucket{color:#fff;background-color:#163758;border-color:rgba(0,0,0,0.2)}.btn-bitbucket:active,.btn-bitbucket.active,.open>.dropdown-toggle.btn-bitbucket{background-image:none}.btn-bitbucket .badge{color:#205081;background-color:#fff}.btn-dropbox{color:#fff;background-color:#1087dd;border-color:rgba(0,0,0,0.2)}.btn-dropbox:focus,.btn-dropbox.focus{color:#fff;background-color:#0d6aad;border-color:rgba(0,0,0,0.2)}.btn-dropbox:hover{color:#fff;background-color:#0d6aad;border-color:rgba(0,0,0,0.2)}.btn-dropbox:active,.btn-dropbox.active,.open>.dropdown-toggle.btn-dropbox{color:#fff;background-color:#0d6aad;border-color:rgba(0,0,0,0.2)}.btn-dropbox:active,.btn-dropbox.active,.open>.dropdown-toggle.btn-dropbox{background-image:none}.btn-dropbox .badge{color:#1087dd;background-color:#fff}.btn-facebook{color:#fff;background-color:#3b5998;border-color:rgba(0,0,0,0.2)}.btn-facebook:focus,.btn-facebook.focus{color:#fff;background-color:#2d4373;border-color:rgba(0,0,0,0.2)}.btn-facebook:hover{color:#fff;background-color:#2d4373;border-color:rgba(0,0,0,0.2)}.btn-facebook:active,.btn-facebook.active,.open>.dropdown-toggle.btn-facebook{color:#fff;background-color:#2d4373;border-color:rgba(0,0,0,0.2)}.btn-facebook:active,.btn-facebook.active,.open>.dropdown-toggle.btn-facebook{background-image:none}.btn-facebook .badge{color:#3b5998;background-color:#fff}.btn-flickr{color:#fff;background-color:#ff0084;border-color:rgba(0,0,0,0.2)}.btn-flickr:focus,.btn-flickr.focus{color:#fff;background-color:#cc006a;border-color:rgba(0,0,0,0.2)}.btn-flickr:hover{color:#fff;background-color:#cc006a;border-color:rgba(0,0,0,0.2)}.btn-flickr:active,.btn-flickr.active,.open>.dropdown-toggle.btn-flickr{color:#fff;background-color:#cc006a;border-color:rgba(0,0,0,0.2)}.btn-flickr:active,.btn-flickr.active,.open>.dropdown-toggle.btn-flickr{background-image:none}.btn-flickr .badge{color:#ff0084;background-color:#fff}.btn-foursquare{color:#fff;background-color:#f94877;border-color:rgba(0,0,0,0.2)}.btn-foursquare:focus,.btn-foursquare.focus{color:#fff;background-color:#f71752;border-color:rgba(0,0,0,0.2)}.btn-foursquare:hover{color:#fff;background-color:#f71752;border-color:rgba(0,0,0,0.2)}.btn-foursquare:active,.btn-foursquare.active,.open>.dropdown-toggle.btn-foursquare{color:#fff;background-color:#f71752;border-color:rgba(0,0,0,0.2)}.btn-foursquare:active,.btn-foursquare.active,.open>.dropdown-toggle.btn-foursquare{background-image:none}.btn-foursquare .badge{color:#f94877;background-color:#fff}.btn-github{color:#fff;background-color:#444;border-color:rgba(0,0,0,0.2)}.btn-github:focus,.btn-github.focus{color:#fff;background-color:#2b2b2b;border-color:rgba(0,0,0,0.2)}.btn-github:hover{color:#fff;background-color:#2b2b2b;border-color:rgba(0,0,0,0.2)}.btn-github:active,.btn-github.active,.open>.dropdown-toggle.btn-github{color:#fff;background-color:#2b2b2b;border-color:rgba(0,0,0,0.2)}.btn-github:active,.btn-github.active,.open>.dropdown-toggle.btn-github{background-image:none}.btn-github .badge{color:#444;background-color:#fff}.btn-google{color:#fff;background-color:#dd4b39;border-color:rgba(0,0,0,0.2)}.btn-google:focus,.btn-google.focus{color:#fff;background-color:#c23321;border-color:rgba(0,0,0,0.2)}.btn-google:hover{color:#fff;background-color:#c23321;border-color:rgba(0,0,0,0.2)}.btn-google:active,.btn-google.active,.open>.dropdown-toggle.btn-google{color:#fff;background-color:#c23321;border-color:rgba(0,0,0,0.2)}.btn-google:active,.btn-google.active,.open>.dropdown-toggle.btn-google{background-image:none}.btn-google .badge{color:#dd4b39;background-color:#fff}.btn-instagram{color:#fff;background-color:#3f729b;border-color:rgba(0,0,0,0.2)}.btn-instagram:focus,.btn-instagram.focus{color:#fff;background-color:#305777;border-color:rgba(0,0,0,0.2)}.btn-instagram:hover{color:#fff;background-color:#305777;border-color:rgba(0,0,0,0.2)}.btn-instagram:active,.btn-instagram.active,.open>.dropdown-toggle.btn-instagram{color:#fff;background-color:#305777;border-color:rgba(0,0,0,0.2)}.btn-instagram:active,.btn-instagram.active,.open>.dropdown-toggle.btn-instagram{background-image:none}.btn-instagram .badge{color:#3f729b;background-color:#fff}.btn-linkedin{color:#fff;background-color:#007bb6;border-color:rgba(0,0,0,0.2)}.btn-linkedin:focus,.btn-linkedin.focus{color:#fff;background-color:#005983;border-color:rgba(0,0,0,0.2)}.btn-linkedin:hover{color:#fff;background-color:#005983;border-color:rgba(0,0,0,0.2)}.btn-linkedin:active,.btn-linkedin.active,.open>.dropdown-toggle.btn-linkedin{color:#fff;background-color:#005983;border-color:rgba(0,0,0,0.2)}.btn-linkedin:active,.btn-linkedin.active,.open>.dropdown-toggle.btn-linkedin{background-image:none}.btn-linkedin .badge{color:#007bb6;background-color:#fff}.btn-microsoft{color:#fff;background-color:#2672ec;border-color:rgba(0,0,0,0.2)}.btn-microsoft:focus,.btn-microsoft.focus{color:#fff;background-color:#125acd;border-color:rgba(0,0,0,0.2)}.btn-microsoft:hover{color:#fff;background-color:#125acd;border-color:rgba(0,0,0,0.2)}.btn-microsoft:active,.btn-microsoft.active,.open>.dropdown-toggle.btn-microsoft{color:#fff;background-color:#125acd;border-color:rgba(0,0,0,0.2)}.btn-microsoft:active,.btn-microsoft.active,.open>.dropdown-toggle.btn-microsoft{background-image:none}.btn-microsoft .badge{color:#2672ec;background-color:#fff}.btn-openid{color:#fff;background-color:#f7931e;border-color:rgba(0,0,0,0.2)}.btn-openid:focus,.btn-openid.focus{color:#fff;background-color:#da7908;border-color:rgba(0,0,0,0.2)}.btn-openid:hover{color:#fff;background-color:#da7908;border-color:rgba(0,0,0,0.2)}.btn-openid:active,.btn-openid.active,.open>.dropdown-toggle.btn-openid{color:#fff;background-color:#da7908;border-color:rgba(0,0,0,0.2)}.btn-openid:active,.btn-openid.active,.open>.dropdown-toggle.btn-openid{background-image:none}.btn-openid .badge{color:#f7931e;background-color:#fff}.btn-pinterest{color:#fff;background-color:#cb2027;border-color:rgba(0,0,0,0.2)}.btn-pinterest:focus,.btn-pinterest.focus{color:#fff;background-color:#9f191f;border-color:rgba(0,0,0,0.2)}.btn-pinterest:hover{color:#fff;background-color:#9f191f;border-color:rgba(0,0,0,0.2)}.btn-pinterest:active,.btn-pinterest.active,.open>.dropdown-toggle.btn-pinterest{color:#fff;background-color:#9f191f;border-color:rgba(0,0,0,0.2)}.btn-pinterest:active,.btn-pinterest.active,.open>.dropdown-toggle.btn-pinterest{background-image:none}.btn-pinterest .badge{color:#cb2027;background-color:#fff}.btn-reddit{color:#000;background-color:#eff7ff;border-color:rgba(0,0,0,0.2)}.btn-reddit:focus,.btn-reddit.focus{color:#000;background-color:#bcddff;border-color:rgba(0,0,0,0.2)}.btn-reddit:hover{color:#000;background-color:#bcddff;border-color:rgba(0,0,0,0.2)}.btn-reddit:active,.btn-reddit.active,.open>.dropdown-toggle.btn-reddit{color:#000;background-color:#bcddff;border-color:rgba(0,0,0,0.2)}.btn-reddit:active,.btn-reddit.active,.open>.dropdown-toggle.btn-reddit{background-image:none}.btn-reddit .badge{color:#eff7ff;background-color:#000}.btn-soundcloud{color:#fff;background-color:#f50;border-color:rgba(0,0,0,0.2)}.btn-soundcloud:focus,.btn-soundcloud.focus{color:#fff;background-color:#c40;border-color:rgba(0,0,0,0.2)}.btn-soundcloud:hover{color:#fff;background-color:#c40;border-color:rgba(0,0,0,0.2)}.btn-soundcloud:active,.btn-soundcloud.active,.open>.dropdown-toggle.btn-soundcloud{color:#fff;background-color:#c40;border-color:rgba(0,0,0,0.2)}.btn-soundcloud:active,.btn-soundcloud.active,.open>.dropdown-toggle.btn-soundcloud{background-image:none}.btn-soundcloud .badge{color:#f50;background-color:#fff}.btn-tumblr{color:#fff;background-color:#2c4762;border-color:rgba(0,0,0,0.2)}.btn-tumblr:focus,.btn-tumblr.focus{color:#fff;background-color:#1c2d3f;border-color:rgba(0,0,0,0.2)}.btn-tumblr:hover{color:#fff;background-color:#1c2d3f;border-color:rgba(0,0,0,0.2)}.btn-tumblr:active,.btn-tumblr.active,.open>.dropdown-toggle.btn-tumblr{color:#fff;background-color:#1c2d3f;border-color:rgba(0,0,0,0.2)}.btn-tumblr:active,.btn-tumblr.active,.open>.dropdown-toggle.btn-tumblr{background-image:none}.btn-tumblr .badge{color:#2c4762;background-color:#fff}.btn-twitter{color:#fff;background-color:#55acee;border-color:rgba(0,0,0,0.2)}.btn-twitter:focus,.btn-twitter.focus{color:#fff;background-color:#2795e9;border-color:rgba(0,0,0,0.2)}.btn-twitter:hover{color:#fff;background-color:#2795e9;border-color:rgba(0,0,0,0.2)}.btn-twitter:active,.btn-twitter.active,.open>.dropdown-toggle.btn-twitter{color:#fff;background-color:#2795e9;border-color:rgba(0,0,0,0.2)}.btn-twitter:active,.btn-twitter.active,.open>.dropdown-toggle.btn-twitter{background-image:none}.btn-twitter .badge{color:#55acee;background-color:#fff}.btn-vimeo{color:#fff;background-color:#1ab7ea;border-color:rgba(0,0,0,0.2)}.btn-vimeo:focus,.btn-vimeo.focus{color:#fff;background-color:#1295bf;border-color:rgba(0,0,0,0.2)}.btn-vimeo:hover{color:#fff;background-color:#1295bf;border-color:rgba(0,0,0,0.2)}.btn-vimeo:active,.btn-vimeo.active,.open>.dropdown-toggle.btn-vimeo{color:#fff;background-color:#1295bf;border-color:rgba(0,0,0,0.2)}.btn-vimeo:active,.btn-vimeo.active,.open>.dropdown-toggle.btn-vimeo{background-image:none}.btn-vimeo .badge{color:#1ab7ea;background-color:#fff}.btn-vk{color:#fff;background-color:#587ea3;border-color:rgba(0,0,0,0.2)}.btn-vk:focus,.btn-vk.focus{color:#fff;background-color:#466482;border-color:rgba(0,0,0,0.2)}.btn-vk:hover{color:#fff;background-color:#466482;border-color:rgba(0,0,0,0.2)}.btn-vk:active,.btn-vk.active,.open>.dropdown-toggle.btn-vk{color:#fff;background-color:#466482;border-color:rgba(0,0,0,0.2)}.btn-vk:active,.btn-vk.active,.open>.dropdown-toggle.btn-vk{background-image:none}.btn-vk .badge{color:#587ea3;background-color:#fff}.btn-yahoo{color:#fff;background-color:#720e9e;border-color:rgba(0,0,0,0.2)}.btn-yahoo:focus,.btn-yahoo.focus{color:#fff;background-color:#500a6f;border-color:rgba(0,0,0,0.2)}.btn-yahoo:hover{color:#fff;background-color:#500a6f;border-color:rgba(0,0,0,0.2)}.btn-yahoo:active,.btn-yahoo.active,.open>.dropdown-toggle.btn-yahoo{color:#fff;background-color:#500a6f;border-color:rgba(0,0,0,0.2)}.btn-yahoo:active,.btn-yahoo.active,.open>.dropdown-toggle.btn-yahoo{background-image:none}.btn-yahoo .badge{color:#720e9e;background-color:#fff}.fc-button{background:#f4f4f4;background-image:none;color:#444;border-color:#ddd;border-bottom-color:#ddd}.fc-button:hover,.fc-button:active,.fc-button.hover{background-color:#e9e9e9}.fc-header-title h2{font-size:15px;line-height:1.6em;color:#666;margin-left:10px}.fc-header-right{padding-right:10px}.fc-header-left{padding-left:10px}.fc-widget-header{background:#fafafa}.fc-grid{width:100%;border:0}.fc-widget-header:first-of-type,.fc-widget-content:first-of-type{border-left:0;border-right:0}.fc-widget-header:last-of-type,.fc-widget-content:last-of-type{border-right:0}.fc-toolbar{padding:10px;margin:0}.fc-day-number{font-size:20px;font-weight:300;padding-right:10px}.fc-color-picker{list-style:none;margin:0;padding:0}.fc-color-picker>li{float:left;font-size:30px;margin-right:5px;line-height:30px}.fc-color-picker>li .fa{-webkit-transition:-webkit-transform linear .3s;-moz-transition:-moz-transform linear .3s;-o-transition:-o-transform linear .3s;transition:transform linear .3s}.fc-color-picker>li .fa:hover{-webkit-transform:rotate(30deg);-ms-transform:rotate(30deg);-o-transform:rotate(30deg);transform:rotate(30deg)}#add-new-event{-webkit-transition:all linear .3s;-o-transition:all linear .3s;transition:all linear .3s}.external-event{padding:5px 10px;font-weight:bold;margin-bottom:4px;box-shadow:0 1px 1px rgba(0,0,0,0.1);text-shadow:0 1px 1px rgba(0,0,0,0.1);border-radius:3px;cursor:move}.external-event:hover{box-shadow:inset 0 0 90px rgba(0,0,0,0.2)}.select2-container--default.select2-container--focus,.select2-selection.select2-container--focus,.select2-container--default:focus,.select2-selection:focus,.select2-container--default:active,.select2-selection:active{outline:none}.select2-container--default .select2-selection--single,.select2-selection .select2-selection--single{border:1px solid #d2d6de;border-radius:0;padding:6px 12px;height:34px}.select2-container--default.select2-container--open{border-color:#3c8dbc}.select2-dropdown{border:1px solid #d2d6de;border-radius:0}.select2-container--default .select2-results__option--highlighted[aria-selected]{background-color:#3c8dbc;color:white}.select2-results__option{padding:6px 12px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{padding-left:0;padding-right:0;height:auto;margin-top:-4px}.select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered{padding-right:6px;padding-left:20px}.select2-container--default .select2-selection--single .select2-selection__arrow{height:28px;right:3px}.select2-container--default .select2-selection--single .select2-selection__arrow b{margin-top:0}.select2-dropdown .select2-search__field,.select2-search--inline .select2-search__field{border:1px solid #d2d6de}.select2-dropdown .select2-search__field:focus,.select2-search--inline .select2-search__field:focus{outline:none;border:1px solid #3c8dbc}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option[aria-selected=true],.select2-container--default .select2-results__option[aria-selected=true]:hover{color:#444}.select2-container--default .select2-selection--multiple{border:1px solid #d2d6de;border-radius:0}.select2-container--default .select2-selection--multiple:focus{border-color:#3c8dbc}.select2-container--default.select2-container--focus .select2-selection--multiple{border-color:#d2d6de}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#3c8dbc;border-color:#367fa9;padding:1px 10px;color:#fff}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{margin-right:5px;color:rgba(255,255,255,0.7)}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#fff}.select2-container .select2-selection--single .select2-selection__rendered{padding-right:10px}.pad{padding:10px}.margin{margin:10px}.margin-bottom{margin-bottom:20px}.margin-bottom-none{margin-bottom:0}.margin-r-5{margin-right:5px}.inline{display:inline}.description-block{display:block;margin:10px 0;text-align:center}.description-block.margin-bottom{margin-bottom:25px}.description-block>.description-header{margin:0;padding:0;font-weight:600;font-size:16px}.description-block>.description-text{text-transform:uppercase}.bg-red,.bg-yellow,.bg-aqua,.bg-blue,.bg-light-blue,.bg-green,.bg-navy,.bg-teal,.bg-olive,.bg-lime,.bg-orange,.bg-fuchsia,.bg-purple,.bg-maroon,.bg-black,.bg-red-active,.bg-yellow-active,.bg-aqua-active,.bg-blue-active,.bg-light-blue-active,.bg-green-active,.bg-navy-active,.bg-teal-active,.bg-olive-active,.bg-lime-active,.bg-orange-active,.bg-fuchsia-active,.bg-purple-active,.bg-maroon-active,.bg-black-active,.callout.callout-danger,.callout.callout-warning,.callout.callout-info,.callout.callout-success,.alert-success,.alert-danger,.alert-error,.alert-warning,.alert-info,.label-danger,.label-info,.label-warning,.label-primary,.label-success,.modal-primary .modal-body,.modal-primary .modal-header,.modal-primary .modal-footer,.modal-warning .modal-body,.modal-warning .modal-header,.modal-warning .modal-footer,.modal-info .modal-body,.modal-info .modal-header,.modal-info .modal-footer,.modal-success .modal-body,.modal-success .modal-header,.modal-success .modal-footer,.modal-danger .modal-body,.modal-danger .modal-header,.modal-danger .modal-footer{color:#fff !important}.bg-gray{color:#000;background-color:#d2d6de !important}.bg-gray-light{background-color:#f7f7f7}.bg-black{background-color:#111 !important}.bg-red,.callout.callout-danger,.alert-danger,.alert-error,.label-danger,.modal-danger .modal-body{background-color:#dd4b39 !important}.bg-yellow,.callout.callout-warning,.alert-warning,.label-warning,.modal-warning .modal-body{background-color:#f39c12 !important}.bg-aqua,.callout.callout-info,.alert-info,.label-info,.modal-info .modal-body{background-color:#00c0ef !important}.bg-blue{background-color:#0073b7 !important}.bg-light-blue,.label-primary,.modal-primary .modal-body{background-color:#3c8dbc !important}.bg-green,.callout.callout-success,.alert-success,.label-success,.modal-success .modal-body{background-color:#00a65a !important}.bg-navy{background-color:#001f3f !important}.bg-teal{background-color:#39cccc !important}.bg-olive{background-color:#3d9970 !important}.bg-lime{background-color:#01ff70 !important}.bg-orange{background-color:#ff851b !important}.bg-fuchsia{background-color:#f012be !important}.bg-purple{background-color:#605ca8 !important}.bg-maroon{background-color:#d81b60 !important}.bg-gray-active{color:#000;background-color:#b5bbc8 !important}.bg-black-active{background-color:#000 !important}.bg-red-active,.modal-danger .modal-header,.modal-danger .modal-footer{background-color:#d33724 !important}.bg-yellow-active,.modal-warning .modal-header,.modal-warning .modal-footer{background-color:#db8b0b !important}.bg-aqua-active,.modal-info .modal-header,.modal-info .modal-footer{background-color:#00a7d0 !important}.bg-blue-active{background-color:#005384 !important}.bg-light-blue-active,.modal-primary .modal-header,.modal-primary .modal-footer{background-color:#357ca5 !important}.bg-green-active,.modal-success .modal-header,.modal-success .modal-footer{background-color:#008d4c !important}.bg-navy-active{background-color:#001a35 !important}.bg-teal-active{background-color:#30bbbb !important}.bg-olive-active{background-color:#368763 !important}.bg-lime-active{background-color:#00e765 !important}.bg-orange-active{background-color:#ff7701 !important}.bg-fuchsia-active{background-color:#db0ead !important}.bg-purple-active{background-color:#555299 !important}.bg-maroon-active{background-color:#ca195a !important}[class^="bg-"].disabled{opacity:.65;filter:alpha(opacity=65)}.text-red{color:#dd4b39 !important}.text-yellow{color:#f39c12 !important}.text-aqua{color:#00c0ef !important}.text-blue{color:#0073b7 !important}.text-black{color:#111 !important}.text-light-blue{color:#3c8dbc !important}.text-green{color:#00a65a !important}.text-gray{color:#d2d6de !important}.text-navy{color:#001f3f !important}.text-teal{color:#39cccc !important}.text-olive{color:#3d9970 !important}.text-lime{color:#01ff70 !important}.text-orange{color:#ff851b !important}.text-fuchsia{color:#f012be !important}.text-purple{color:#605ca8 !important}.text-maroon{color:#d81b60 !important}.link-muted{color:#7a869d}.link-muted:hover,.link-muted:focus{color:#606c84}.link-black{color:#666}.link-black:hover,.link-black:focus{color:#999}.hide{display:none !important}.no-border{border:0 !important}.no-padding{padding:0 !important}.no-margin{margin:0 !important}.no-shadow{box-shadow:none !important}.list-unstyled,.chart-legend,.contacts-list,.users-list,.mailbox-attachments{list-style:none;margin:0;padding:0}.list-group-unbordered>.list-group-item{border-left:0;border-right:0;border-radius:0;padding-left:0;padding-right:0}.flat{border-radius:0 !important}.text-bold,.text-bold.table td,.text-bold.table th{font-weight:700}.text-sm{font-size:12px}.jqstooltip{padding:5px !important;width:auto !important;height:auto !important}.bg-teal-gradient{background:#39cccc !important;background:-webkit-gradient(linear, left bottom, left top, color-stop(0, #39cccc), color-stop(1, #7adddd)) !important;background:-ms-linear-gradient(bottom, #39cccc, #7adddd) !important;background:-moz-linear-gradient(center bottom, #39cccc 0, #7adddd 100%) !important;background:-o-linear-gradient(#7adddd, #39cccc) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#7adddd', endColorstr='#39cccc', GradientType=0) !important;color:#fff}.bg-light-blue-gradient{background:#3c8dbc !important;background:-webkit-gradient(linear, left bottom, left top, color-stop(0, #3c8dbc), color-stop(1, #67a8ce)) !important;background:-ms-linear-gradient(bottom, #3c8dbc, #67a8ce) !important;background:-moz-linear-gradient(center bottom, #3c8dbc 0, #67a8ce 100%) !important;background:-o-linear-gradient(#67a8ce, #3c8dbc) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#67a8ce', endColorstr='#3c8dbc', GradientType=0) !important;color:#fff}.bg-blue-gradient{background:#0073b7 !important;background:-webkit-gradient(linear, left bottom, left top, color-stop(0, #0073b7), color-stop(1, #0089db)) !important;background:-ms-linear-gradient(bottom, #0073b7, #0089db) !important;background:-moz-linear-gradient(center bottom, #0073b7 0, #0089db 100%) !important;background:-o-linear-gradient(#0089db, #0073b7) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#0089db', endColorstr='#0073b7', GradientType=0) !important;color:#fff}.bg-aqua-gradient{background:#00c0ef !important;background:-webkit-gradient(linear, left bottom, left top, color-stop(0, #00c0ef), color-stop(1, #14d1ff)) !important;background:-ms-linear-gradient(bottom, #00c0ef, #14d1ff) !important;background:-moz-linear-gradient(center bottom, #00c0ef 0, #14d1ff 100%) !important;background:-o-linear-gradient(#14d1ff, #00c0ef) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#14d1ff', endColorstr='#00c0ef', GradientType=0) !important;color:#fff}.bg-yellow-gradient{background:#f39c12 !important;background:-webkit-gradient(linear, left bottom, left top, color-stop(0, #f39c12), color-stop(1, #f7bc60)) !important;background:-ms-linear-gradient(bottom, #f39c12, #f7bc60) !important;background:-moz-linear-gradient(center bottom, #f39c12 0, #f7bc60 100%) !important;background:-o-linear-gradient(#f7bc60, #f39c12) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f7bc60', endColorstr='#f39c12', GradientType=0) !important;color:#fff}.bg-purple-gradient{background:#605ca8 !important;background:-webkit-gradient(linear, left bottom, left top, color-stop(0, #605ca8), color-stop(1, #9491c4)) !important;background:-ms-linear-gradient(bottom, #605ca8, #9491c4) !important;background:-moz-linear-gradient(center bottom, #605ca8 0, #9491c4 100%) !important;background:-o-linear-gradient(#9491c4, #605ca8) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#9491c4', endColorstr='#605ca8', GradientType=0) !important;color:#fff}.bg-green-gradient{background:#00a65a !important;background:-webkit-gradient(linear, left bottom, left top, color-stop(0, #00a65a), color-stop(1, #00ca6d)) !important;background:-ms-linear-gradient(bottom, #00a65a, #00ca6d) !important;background:-moz-linear-gradient(center bottom, #00a65a 0, #00ca6d 100%) !important;background:-o-linear-gradient(#00ca6d, #00a65a) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00ca6d', endColorstr='#00a65a', GradientType=0) !important;color:#fff}.bg-red-gradient{background:#dd4b39 !important;background:-webkit-gradient(linear, left bottom, left top, color-stop(0, #dd4b39), color-stop(1, #e47365)) !important;background:-ms-linear-gradient(bottom, #dd4b39, #e47365) !important;background:-moz-linear-gradient(center bottom, #dd4b39 0, #e47365 100%) !important;background:-o-linear-gradient(#e47365, #dd4b39) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#e47365', endColorstr='#dd4b39', GradientType=0) !important;color:#fff}.bg-black-gradient{background:#111 !important;background:-webkit-gradient(linear, left bottom, left top, color-stop(0, #111), color-stop(1, #2b2b2b)) !important;background:-ms-linear-gradient(bottom, #111, #2b2b2b) !important;background:-moz-linear-gradient(center bottom, #111 0, #2b2b2b 100%) !important;background:-o-linear-gradient(#2b2b2b, #111) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#2b2b2b', endColorstr='#111111', GradientType=0) !important;color:#fff}.bg-maroon-gradient{background:#d81b60 !important;background:-webkit-gradient(linear, left bottom, left top, color-stop(0, #d81b60), color-stop(1, #e73f7c)) !important;background:-ms-linear-gradient(bottom, #d81b60, #e73f7c) !important;background:-moz-linear-gradient(center bottom, #d81b60 0, #e73f7c 100%) !important;background:-o-linear-gradient(#e73f7c, #d81b60) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#e73f7c', endColorstr='#d81b60', GradientType=0) !important;color:#fff}.description-block .description-icon{font-size:16px}.no-pad-top{padding-top:0}.position-static{position:static !important}.list-header{font-size:15px;padding:10px 4px;font-weight:bold;color:#666}.list-seperator{height:1px;background:#f4f4f4;margin:15px 0 9px 0}.list-link>a{padding:4px;color:#777}.list-link>a:hover{color:#222}.font-light{font-weight:300}.user-block:before,.user-block:after{content:" ";display:table}.user-block:after{clear:both}.user-block img{width:40px;height:40px;float:left}.user-block .username,.user-block .description,.user-block .comment{display:block;margin-left:50px}.user-block .username{font-size:16px;font-weight:600}.user-block .description{color:#999;font-size:13px}.user-block.user-block-sm .username,.user-block.user-block-sm .description,.user-block.user-block-sm .comment{margin-left:40px}.user-block.user-block-sm .username{font-size:14px}.img-sm,.img-md,.img-lg,.box-comments .box-comment img,.user-block.user-block-sm img{float:left}.img-sm,.box-comments .box-comment img,.user-block.user-block-sm img{width:30px !important;height:30px !important}.img-sm+.img-push{margin-left:40px}.img-md{width:60px;height:60px}.img-md+.img-push{margin-left:70px}.img-lg{width:100px;height:100px}.img-lg+.img-push{margin-left:110px}.img-bordered{border:3px solid #d2d6de;padding:3px}.img-bordered-sm{border:2px solid #d2d6de;padding:2px}.attachment-block{border:1px solid #f4f4f4;padding:5px;margin-bottom:10px;background:#f7f7f7}.attachment-block .attachment-img{max-width:100px;max-height:100px;height:auto;float:left}.attachment-block .attachment-pushed{margin-left:110px}.attachment-block .attachment-heading{margin:0}.attachment-block .attachment-text{color:#555}.connectedSortable{min-height:100px}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sort-highlight{background:#f4f4f4;border:1px dashed #ddd;margin-bottom:10px}.full-opacity-hover{opacity:.65;filter:alpha(opacity=65)}.full-opacity-hover:hover{opacity:1;filter:alpha(opacity=100)}.chart{position:relative;overflow:hidden;width:100%}.chart svg,.chart canvas{width:100% !important}@media print{.no-print,.main-sidebar,.left-side,.main-header,.content-header{display:none !important}.content-wrapper,.right-side,.main-footer{margin-left:0 !important;min-height:0 !important;-webkit-transform:translate(0, 0) !important;-ms-transform:translate(0, 0) !important;-o-transform:translate(0, 0) !important;transform:translate(0, 0) !important}.fixed .content-wrapper,.fixed .right-side{padding-top:0 !important}.invoice{width:100%;border:0;margin:0;padding:0}.invoice-col{float:left;width:33.3333333%}.table-responsive{overflow:auto}.table-responsive>.table tr th,.table-responsive>.table tr td{white-space:normal !important}} \ No newline at end of file diff --git a/css/colors.css b/css/colors.css new file mode 100644 index 00000000..afe383f8 --- /dev/null +++ b/css/colors.css @@ -0,0 +1,51 @@ +.white { + color: #fff; +} + +.red, +.important, +.critical-priority { + color: red; +} + +.green { + color: green; +} + +.orange, +.rating { + color: orange; +} + +.medium { + color: #FF9900; +} + +.gray { + color: grey; +} + +.critical { + color: #9400d3; +} + +.blue { + color: blue; +} + +.med-low-priority { + background-color: #8BB467; +} + +.high-priority { + background-color: #ff6a00; +} + +/* Hover colors */ +.red-on-hover:hover { + color: red; +} + +.gray-on-hover:hover { + color: grey; +} \ No newline at end of file diff --git a/css/displays.css b/css/displays.css new file mode 100644 index 00000000..6a311eb7 --- /dev/null +++ b/css/displays.css @@ -0,0 +1,13 @@ +.hide-on-overflow { + overflow: hidden; + text-overflow: ellipsis; +} + +.no-wrap { + white-space: nowrap; +} + +.event-category { + border-radius: 4px; + padding: 5px; +} \ No newline at end of file diff --git a/css/mods-for-hesk-new.css b/css/mods-for-hesk-new.css new file mode 100644 index 00000000..3881aa10 --- /dev/null +++ b/css/mods-for-hesk-new.css @@ -0,0 +1,179 @@ +.navbar-nav > .messages-menu > .dropdown-menu >li .menu > li > a, +.sidebar-menu, .main-sidebar .user-panel, .sidebar-menu > li.header{ + white-space: normal; +} + +.icon-link { + font-size: 16px; !important; +} + +#due-date:hover, +.click-to-edit:hover { + font-weight: bolder; + cursor: pointer; +} + +.linkless-dropdown { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 1.42857143; + white-space: nowrap; +} + +.dropdown-menu>li>span>.fa { + margin-right: 10px; +} + +.no-margins { + margin: 0; +} + +@media (max-width: 991px) { + .ticket-cell-admin { + border-bottom: solid 1px #ddd; + border-right: 0; + padding-top: 5px; + height: 100px; + } +} + +@media (min-width: 992px) { + .ticket-cell-admin { + border-bottom: 0; + border-right: solid 1px #ddd; + margin-top: 1px; + height: 100px; + padding-top: 10px; + } +} + +.ticket-property-title { + color: rgba(255, 255, 255, .75); + font-size: 11px; + text-transform: uppercase; +} + +@media (min-width: 992px) { + .ticketPropertyText { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + + .ticketPropertyText:hover { + white-space: normal; + overflow: visible; + } +} + +.ticketPropertyText { + font-size: 16px; + line-height: 1em; + color: #fff; + padding-bottom: 2px; +} + +.status-row { + margin-bottom: 20px; +} + +.push-down-10 { + margin-top: 10px; +} + + +.attachment-table > tbody > tr > td > i { + color: #ddd; + text-shadow: 2px 2px #ccc; +} + +.attachment-table > tbody > tr > td { + vertical-align: middle; +} + +.attachment-table > tbody > tr > td > span > img { + max-height: 80px; + max-width: 80px; + cursor: pointer; +} + +.note { + border-bottom: solid 1px #000; +} + +.fileinput-button { + width: 100%; + border-top-left-radius: 0; + border-top-right-radius: 0; + margin-top: -2px; +} + +.file-row p.name { + overflow: hidden; + text-overflow: ellipsis; +} + +.timeline-footer { + border-top: 1px solid #f4f4f4; +} + +.timeline > .today-top { + margin-bottom: 60px; +} + +.white-readonly { + cursor: text !important; + background-color: #fff !important; +} + +button.dropdown-submit { + background: none !important; + border: none; +} + +.form-signin { + max-width: 800px; + margin: 0 auto; +} + +.loginError { + padding-top: 20px; + margin-left: auto; + margin-right: auto; +} + +.login-box { + width: 500px; +} + +.login-box-body { + border-radius: 5px; +} + +.button-link { + color: #4a5571; +} + +.button-link:hover { + text-decoration: none; + color: #000; +} + +.button-link .col-xs-1 { + margin: 0 auto; + padding: 0; +} + +.button-link .panel-body:hover { + background-color: #EEE; +} + +.timeline-header.header-info { + font-size: 14px !important; +} + +.full-width { + width: 100%; +} \ No newline at end of file diff --git a/css/positions.css b/css/positions.css new file mode 100644 index 00000000..70205742 --- /dev/null +++ b/css/positions.css @@ -0,0 +1,7 @@ +.move-down-20 { + margin-top: 20px; +} + +.move-right-20 { + margin-left: 20px; +} \ No newline at end of file diff --git a/css/skins/_all-skins.min.css b/css/skins/_all-skins.min.css new file mode 100755 index 00000000..e1d2398f --- /dev/null +++ b/css/skins/_all-skins.min.css @@ -0,0 +1 @@ +.skin-blue .main-header .navbar{background-color:#3c8dbc}.skin-blue .main-header .navbar .nav>li>a{color:#fff}.skin-blue .main-header .navbar .nav>li>a:hover,.skin-blue .main-header .navbar .nav>li>a:active,.skin-blue .main-header .navbar .nav>li>a:focus,.skin-blue .main-header .navbar .nav .open>a,.skin-blue .main-header .navbar .nav .open>a:hover,.skin-blue .main-header .navbar .nav .open>a:focus,.skin-blue .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-blue .main-header .navbar .sidebar-toggle{color:#fff}.skin-blue .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-blue .main-header .navbar .sidebar-toggle{color:#fff}.skin-blue .main-header .navbar .sidebar-toggle:hover{background-color:#367fa9}@media (max-width:767px){.skin-blue .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-blue .main-header .navbar .dropdown-menu li a{color:#fff}.skin-blue .main-header .navbar .dropdown-menu li a:hover{background:#367fa9}}.skin-blue .main-header .logo{background-color:#367fa9;color:#fff;border-bottom:0 solid transparent}.skin-blue .main-header .logo:hover{background-color:#357ca5}.skin-blue .main-header li.user-header{background-color:#3c8dbc}.skin-blue .content-header{background:transparent}.skin-blue .wrapper,.skin-blue .main-sidebar,.skin-blue .left-side{background-color:#222d32}.skin-blue .user-panel>.info,.skin-blue .user-panel>.info>a{color:#fff}.skin-blue .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-blue .sidebar-menu>li>a{border-left:3px solid transparent}.skin-blue .sidebar-menu>li:hover>a,.skin-blue .sidebar-menu>li.active>a{color:#fff;background:#1e282c;border-left-color:#3c8dbc}.skin-blue .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-blue .sidebar a{color:#b8c7ce}.skin-blue .sidebar a:hover{text-decoration:none}.skin-blue .treeview-menu>li>a{color:#8aa4af}.skin-blue .treeview-menu>li.active>a,.skin-blue .treeview-menu>li>a:hover{color:#fff}.skin-blue .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-blue .sidebar-form input[type="text"],.skin-blue .sidebar-form .btn{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px}.skin-blue .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-blue .sidebar-form input[type="text"]:focus,.skin-blue .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-blue .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-blue .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}.skin-blue.layout-top-nav .main-header>.logo{background-color:#3c8dbc;color:#fff;border-bottom:0 solid transparent}.skin-blue.layout-top-nav .main-header>.logo:hover{background-color:#3b8ab8}.skin-blue-light .main-header .navbar{background-color:#3c8dbc}.skin-blue-light .main-header .navbar .nav>li>a{color:#fff}.skin-blue-light .main-header .navbar .nav>li>a:hover,.skin-blue-light .main-header .navbar .nav>li>a:active,.skin-blue-light .main-header .navbar .nav>li>a:focus,.skin-blue-light .main-header .navbar .nav .open>a,.skin-blue-light .main-header .navbar .nav .open>a:hover,.skin-blue-light .main-header .navbar .nav .open>a:focus,.skin-blue-light .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-blue-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-blue-light .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-blue-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-blue-light .main-header .navbar .sidebar-toggle:hover{background-color:#367fa9}@media (max-width:767px){.skin-blue-light .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-blue-light .main-header .navbar .dropdown-menu li a{color:#fff}.skin-blue-light .main-header .navbar .dropdown-menu li a:hover{background:#367fa9}}.skin-blue-light .main-header .logo{background-color:#3c8dbc;color:#fff;border-bottom:0 solid transparent}.skin-blue-light .main-header .logo:hover{background-color:#3b8ab8}.skin-blue-light .main-header li.user-header{background-color:#3c8dbc}.skin-blue-light .content-header{background:transparent}.skin-blue-light .wrapper,.skin-blue-light .main-sidebar,.skin-blue-light .left-side{background-color:#f9fafc}.skin-blue-light .content-wrapper,.skin-blue-light .main-footer{border-left:1px solid #d2d6de}.skin-blue-light .user-panel>.info,.skin-blue-light .user-panel>.info>a{color:#444}.skin-blue-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-blue-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-blue-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-blue-light .sidebar-menu>li:hover>a,.skin-blue-light .sidebar-menu>li.active>a{color:#000;background:#f4f4f5}.skin-blue-light .sidebar-menu>li.active{border-left-color:#3c8dbc}.skin-blue-light .sidebar-menu>li.active>a{font-weight:600}.skin-blue-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-blue-light .sidebar a{color:#444}.skin-blue-light .sidebar a:hover{text-decoration:none}.skin-blue-light .treeview-menu>li>a{color:#777}.skin-blue-light .treeview-menu>li.active>a,.skin-blue-light .treeview-menu>li>a:hover{color:#000}.skin-blue-light .treeview-menu>li.active>a{font-weight:600}.skin-blue-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px 10px}.skin-blue-light .sidebar-form input[type="text"],.skin-blue-light .sidebar-form .btn{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px}.skin-blue-light .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-blue-light .sidebar-form input[type="text"]:focus,.skin-blue-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-blue-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-blue-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-blue-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}}.skin-blue-light .main-footer{border-top-color:#d2d6de}.skin-blue.layout-top-nav .main-header>.logo{background-color:#3c8dbc;color:#fff;border-bottom:0 solid transparent}.skin-blue.layout-top-nav .main-header>.logo:hover{background-color:#3b8ab8}.skin-black .main-header{-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.skin-black .main-header .navbar-toggle{color:#333}.skin-black .main-header .navbar-brand{color:#333;border-right:1px solid #eee}.skin-black .main-header .navbar{background-color:#fff}.skin-black .main-header .navbar .nav>li>a{color:#333}.skin-black .main-header .navbar .nav>li>a:hover,.skin-black .main-header .navbar .nav>li>a:active,.skin-black .main-header .navbar .nav>li>a:focus,.skin-black .main-header .navbar .nav .open>a,.skin-black .main-header .navbar .nav .open>a:hover,.skin-black .main-header .navbar .nav .open>a:focus,.skin-black .main-header .navbar .nav>.active>a{background:#fff;color:#999}.skin-black .main-header .navbar .sidebar-toggle{color:#333}.skin-black .main-header .navbar .sidebar-toggle:hover{color:#999;background:#fff}.skin-black .main-header .navbar>.sidebar-toggle{color:#333;border-right:1px solid #eee}.skin-black .main-header .navbar .navbar-nav>li>a{border-right:1px solid #eee}.skin-black .main-header .navbar .navbar-custom-menu .navbar-nav>li>a,.skin-black .main-header .navbar .navbar-right>li>a{border-left:1px solid #eee;border-right-width:0}.skin-black .main-header>.logo{background-color:#fff;color:#333;border-bottom:0 solid transparent;border-right:1px solid #eee}.skin-black .main-header>.logo:hover{background-color:#fcfcfc}@media (max-width:767px){.skin-black .main-header>.logo{background-color:#222;color:#fff;border-bottom:0 solid transparent;border-right:none}.skin-black .main-header>.logo:hover{background-color:#1f1f1f}}.skin-black .main-header li.user-header{background-color:#222}.skin-black .content-header{background:transparent;box-shadow:none}.skin-black .wrapper,.skin-black .main-sidebar,.skin-black .left-side{background-color:#222d32}.skin-black .user-panel>.info,.skin-black .user-panel>.info>a{color:#fff}.skin-black .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-black .sidebar-menu>li>a{border-left:3px solid transparent}.skin-black .sidebar-menu>li:hover>a,.skin-black .sidebar-menu>li.active>a{color:#fff;background:#1e282c;border-left-color:#fff}.skin-black .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-black .sidebar a{color:#b8c7ce}.skin-black .sidebar a:hover{text-decoration:none}.skin-black .treeview-menu>li>a{color:#8aa4af}.skin-black .treeview-menu>li.active>a,.skin-black .treeview-menu>li>a:hover{color:#fff}.skin-black .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-black .sidebar-form input[type="text"],.skin-black .sidebar-form .btn{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px}.skin-black .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-black .sidebar-form input[type="text"]:focus,.skin-black .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-black .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-black .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}.skin-black .pace .pace-progress{background:#222}.skin-black .pace .pace-activity{border-top-color:#222;border-left-color:#222}.skin-black-light .main-header{-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.skin-black-light .main-header .navbar-toggle{color:#333}.skin-black-light .main-header .navbar-brand{color:#333;border-right:1px solid #eee}.skin-black-light .main-header .navbar{background-color:#fff}.skin-black-light .main-header .navbar .nav>li>a{color:#333}.skin-black-light .main-header .navbar .nav>li>a:hover,.skin-black-light .main-header .navbar .nav>li>a:active,.skin-black-light .main-header .navbar .nav>li>a:focus,.skin-black-light .main-header .navbar .nav .open>a,.skin-black-light .main-header .navbar .nav .open>a:hover,.skin-black-light .main-header .navbar .nav .open>a:focus,.skin-black-light .main-header .navbar .nav>.active>a{background:#fff;color:#999}.skin-black-light .main-header .navbar .sidebar-toggle{color:#333}.skin-black-light .main-header .navbar .sidebar-toggle:hover{color:#999;background:#fff}.skin-black-light .main-header .navbar>.sidebar-toggle{color:#333;border-right:1px solid #eee}.skin-black-light .main-header .navbar .navbar-nav>li>a{border-right:1px solid #eee}.skin-black-light .main-header .navbar .navbar-custom-menu .navbar-nav>li>a,.skin-black-light .main-header .navbar .navbar-right>li>a{border-left:1px solid #eee;border-right-width:0}.skin-black-light .main-header>.logo{background-color:#fff;color:#333;border-bottom:0 solid transparent;border-right:1px solid #eee}.skin-black-light .main-header>.logo:hover{background-color:#fcfcfc}@media (max-width:767px){.skin-black-light .main-header>.logo{background-color:#222;color:#fff;border-bottom:0 solid transparent;border-right:none}.skin-black-light .main-header>.logo:hover{background-color:#1f1f1f}}.skin-black-light .main-header li.user-header{background-color:#222}.skin-black-light .content-header{background:transparent;box-shadow:none}.skin-black-light .wrapper,.skin-black-light .main-sidebar,.skin-black-light .left-side{background-color:#f9fafc}.skin-black-light .content-wrapper,.skin-black-light .main-footer{border-left:1px solid #d2d6de}.skin-black-light .user-panel>.info,.skin-black-light .user-panel>.info>a{color:#444}.skin-black-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-black-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-black-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-black-light .sidebar-menu>li:hover>a,.skin-black-light .sidebar-menu>li.active>a{color:#000;background:#f4f4f5}.skin-black-light .sidebar-menu>li.active{border-left-color:#fff}.skin-black-light .sidebar-menu>li.active>a{font-weight:600}.skin-black-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-black-light .sidebar a{color:#444}.skin-black-light .sidebar a:hover{text-decoration:none}.skin-black-light .treeview-menu>li>a{color:#777}.skin-black-light .treeview-menu>li.active>a,.skin-black-light .treeview-menu>li>a:hover{color:#000}.skin-black-light .treeview-menu>li.active>a{font-weight:600}.skin-black-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px 10px}.skin-black-light .sidebar-form input[type="text"],.skin-black-light .sidebar-form .btn{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px}.skin-black-light .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-black-light .sidebar-form input[type="text"]:focus,.skin-black-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-black-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-black-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-black-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}}.skin-green .main-header .navbar{background-color:#00a65a}.skin-green .main-header .navbar .nav>li>a{color:#fff}.skin-green .main-header .navbar .nav>li>a:hover,.skin-green .main-header .navbar .nav>li>a:active,.skin-green .main-header .navbar .nav>li>a:focus,.skin-green .main-header .navbar .nav .open>a,.skin-green .main-header .navbar .nav .open>a:hover,.skin-green .main-header .navbar .nav .open>a:focus,.skin-green .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-green .main-header .navbar .sidebar-toggle{color:#fff}.skin-green .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-green .main-header .navbar .sidebar-toggle{color:#fff}.skin-green .main-header .navbar .sidebar-toggle:hover{background-color:#008d4c}@media (max-width:767px){.skin-green .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-green .main-header .navbar .dropdown-menu li a{color:#fff}.skin-green .main-header .navbar .dropdown-menu li a:hover{background:#008d4c}}.skin-green .main-header .logo{background-color:#008d4c;color:#fff;border-bottom:0 solid transparent}.skin-green .main-header .logo:hover{background-color:#008749}.skin-green .main-header li.user-header{background-color:#00a65a}.skin-green .content-header{background:transparent}.skin-green .wrapper,.skin-green .main-sidebar,.skin-green .left-side{background-color:#222d32}.skin-green .user-panel>.info,.skin-green .user-panel>.info>a{color:#fff}.skin-green .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-green .sidebar-menu>li>a{border-left:3px solid transparent}.skin-green .sidebar-menu>li:hover>a,.skin-green .sidebar-menu>li.active>a{color:#fff;background:#1e282c;border-left-color:#00a65a}.skin-green .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-green .sidebar a{color:#b8c7ce}.skin-green .sidebar a:hover{text-decoration:none}.skin-green .treeview-menu>li>a{color:#8aa4af}.skin-green .treeview-menu>li.active>a,.skin-green .treeview-menu>li>a:hover{color:#fff}.skin-green .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-green .sidebar-form input[type="text"],.skin-green .sidebar-form .btn{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px}.skin-green .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-green .sidebar-form input[type="text"]:focus,.skin-green .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-green .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-green .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}.skin-green-light .main-header .navbar{background-color:#00a65a}.skin-green-light .main-header .navbar .nav>li>a{color:#fff}.skin-green-light .main-header .navbar .nav>li>a:hover,.skin-green-light .main-header .navbar .nav>li>a:active,.skin-green-light .main-header .navbar .nav>li>a:focus,.skin-green-light .main-header .navbar .nav .open>a,.skin-green-light .main-header .navbar .nav .open>a:hover,.skin-green-light .main-header .navbar .nav .open>a:focus,.skin-green-light .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-green-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-green-light .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-green-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-green-light .main-header .navbar .sidebar-toggle:hover{background-color:#008d4c}@media (max-width:767px){.skin-green-light .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-green-light .main-header .navbar .dropdown-menu li a{color:#fff}.skin-green-light .main-header .navbar .dropdown-menu li a:hover{background:#008d4c}}.skin-green-light .main-header .logo{background-color:#00a65a;color:#fff;border-bottom:0 solid transparent}.skin-green-light .main-header .logo:hover{background-color:#00a157}.skin-green-light .main-header li.user-header{background-color:#00a65a}.skin-green-light .content-header{background:transparent}.skin-green-light .wrapper,.skin-green-light .main-sidebar,.skin-green-light .left-side{background-color:#f9fafc}.skin-green-light .content-wrapper,.skin-green-light .main-footer{border-left:1px solid #d2d6de}.skin-green-light .user-panel>.info,.skin-green-light .user-panel>.info>a{color:#444}.skin-green-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-green-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-green-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-green-light .sidebar-menu>li:hover>a,.skin-green-light .sidebar-menu>li.active>a{color:#000;background:#f4f4f5}.skin-green-light .sidebar-menu>li.active{border-left-color:#00a65a}.skin-green-light .sidebar-menu>li.active>a{font-weight:600}.skin-green-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-green-light .sidebar a{color:#444}.skin-green-light .sidebar a:hover{text-decoration:none}.skin-green-light .treeview-menu>li>a{color:#777}.skin-green-light .treeview-menu>li.active>a,.skin-green-light .treeview-menu>li>a:hover{color:#000}.skin-green-light .treeview-menu>li.active>a{font-weight:600}.skin-green-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px 10px}.skin-green-light .sidebar-form input[type="text"],.skin-green-light .sidebar-form .btn{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px}.skin-green-light .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-green-light .sidebar-form input[type="text"]:focus,.skin-green-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-green-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-green-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-green-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}}.skin-red .main-header .navbar{background-color:#dd4b39}.skin-red .main-header .navbar .nav>li>a{color:#fff}.skin-red .main-header .navbar .nav>li>a:hover,.skin-red .main-header .navbar .nav>li>a:active,.skin-red .main-header .navbar .nav>li>a:focus,.skin-red .main-header .navbar .nav .open>a,.skin-red .main-header .navbar .nav .open>a:hover,.skin-red .main-header .navbar .nav .open>a:focus,.skin-red .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-red .main-header .navbar .sidebar-toggle{color:#fff}.skin-red .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-red .main-header .navbar .sidebar-toggle{color:#fff}.skin-red .main-header .navbar .sidebar-toggle:hover{background-color:#d73925}@media (max-width:767px){.skin-red .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-red .main-header .navbar .dropdown-menu li a{color:#fff}.skin-red .main-header .navbar .dropdown-menu li a:hover{background:#d73925}}.skin-red .main-header .logo{background-color:#d73925;color:#fff;border-bottom:0 solid transparent}.skin-red .main-header .logo:hover{background-color:#d33724}.skin-red .main-header li.user-header{background-color:#dd4b39}.skin-red .content-header{background:transparent}.skin-red .wrapper,.skin-red .main-sidebar,.skin-red .left-side{background-color:#222d32}.skin-red .user-panel>.info,.skin-red .user-panel>.info>a{color:#fff}.skin-red .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-red .sidebar-menu>li>a{border-left:3px solid transparent}.skin-red .sidebar-menu>li:hover>a,.skin-red .sidebar-menu>li.active>a{color:#fff;background:#1e282c;border-left-color:#dd4b39}.skin-red .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-red .sidebar a{color:#b8c7ce}.skin-red .sidebar a:hover{text-decoration:none}.skin-red .treeview-menu>li>a{color:#8aa4af}.skin-red .treeview-menu>li.active>a,.skin-red .treeview-menu>li>a:hover{color:#fff}.skin-red .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-red .sidebar-form input[type="text"],.skin-red .sidebar-form .btn{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px}.skin-red .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-red .sidebar-form input[type="text"]:focus,.skin-red .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-red .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-red .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}.skin-red-light .main-header .navbar{background-color:#dd4b39}.skin-red-light .main-header .navbar .nav>li>a{color:#fff}.skin-red-light .main-header .navbar .nav>li>a:hover,.skin-red-light .main-header .navbar .nav>li>a:active,.skin-red-light .main-header .navbar .nav>li>a:focus,.skin-red-light .main-header .navbar .nav .open>a,.skin-red-light .main-header .navbar .nav .open>a:hover,.skin-red-light .main-header .navbar .nav .open>a:focus,.skin-red-light .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-red-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-red-light .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-red-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-red-light .main-header .navbar .sidebar-toggle:hover{background-color:#d73925}@media (max-width:767px){.skin-red-light .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-red-light .main-header .navbar .dropdown-menu li a{color:#fff}.skin-red-light .main-header .navbar .dropdown-menu li a:hover{background:#d73925}}.skin-red-light .main-header .logo{background-color:#dd4b39;color:#fff;border-bottom:0 solid transparent}.skin-red-light .main-header .logo:hover{background-color:#dc4735}.skin-red-light .main-header li.user-header{background-color:#dd4b39}.skin-red-light .content-header{background:transparent}.skin-red-light .wrapper,.skin-red-light .main-sidebar,.skin-red-light .left-side{background-color:#f9fafc}.skin-red-light .content-wrapper,.skin-red-light .main-footer{border-left:1px solid #d2d6de}.skin-red-light .user-panel>.info,.skin-red-light .user-panel>.info>a{color:#444}.skin-red-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-red-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-red-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-red-light .sidebar-menu>li:hover>a,.skin-red-light .sidebar-menu>li.active>a{color:#000;background:#f4f4f5}.skin-red-light .sidebar-menu>li.active{border-left-color:#dd4b39}.skin-red-light .sidebar-menu>li.active>a{font-weight:600}.skin-red-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-red-light .sidebar a{color:#444}.skin-red-light .sidebar a:hover{text-decoration:none}.skin-red-light .treeview-menu>li>a{color:#777}.skin-red-light .treeview-menu>li.active>a,.skin-red-light .treeview-menu>li>a:hover{color:#000}.skin-red-light .treeview-menu>li.active>a{font-weight:600}.skin-red-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px 10px}.skin-red-light .sidebar-form input[type="text"],.skin-red-light .sidebar-form .btn{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px}.skin-red-light .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-red-light .sidebar-form input[type="text"]:focus,.skin-red-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-red-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-red-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-red-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}}.skin-yellow .main-header .navbar{background-color:#f39c12}.skin-yellow .main-header .navbar .nav>li>a{color:#fff}.skin-yellow .main-header .navbar .nav>li>a:hover,.skin-yellow .main-header .navbar .nav>li>a:active,.skin-yellow .main-header .navbar .nav>li>a:focus,.skin-yellow .main-header .navbar .nav .open>a,.skin-yellow .main-header .navbar .nav .open>a:hover,.skin-yellow .main-header .navbar .nav .open>a:focus,.skin-yellow .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-yellow .main-header .navbar .sidebar-toggle{color:#fff}.skin-yellow .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-yellow .main-header .navbar .sidebar-toggle{color:#fff}.skin-yellow .main-header .navbar .sidebar-toggle:hover{background-color:#e08e0b}@media (max-width:767px){.skin-yellow .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-yellow .main-header .navbar .dropdown-menu li a{color:#fff}.skin-yellow .main-header .navbar .dropdown-menu li a:hover{background:#e08e0b}}.skin-yellow .main-header .logo{background-color:#e08e0b;color:#fff;border-bottom:0 solid transparent}.skin-yellow .main-header .logo:hover{background-color:#db8b0b}.skin-yellow .main-header li.user-header{background-color:#f39c12}.skin-yellow .content-header{background:transparent}.skin-yellow .wrapper,.skin-yellow .main-sidebar,.skin-yellow .left-side{background-color:#222d32}.skin-yellow .user-panel>.info,.skin-yellow .user-panel>.info>a{color:#fff}.skin-yellow .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-yellow .sidebar-menu>li>a{border-left:3px solid transparent}.skin-yellow .sidebar-menu>li:hover>a,.skin-yellow .sidebar-menu>li.active>a{color:#fff;background:#1e282c;border-left-color:#f39c12}.skin-yellow .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-yellow .sidebar a{color:#b8c7ce}.skin-yellow .sidebar a:hover{text-decoration:none}.skin-yellow .treeview-menu>li>a{color:#8aa4af}.skin-yellow .treeview-menu>li.active>a,.skin-yellow .treeview-menu>li>a:hover{color:#fff}.skin-yellow .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-yellow .sidebar-form input[type="text"],.skin-yellow .sidebar-form .btn{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px}.skin-yellow .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-yellow .sidebar-form input[type="text"]:focus,.skin-yellow .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-yellow .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-yellow .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}.skin-yellow-light .main-header .navbar{background-color:#f39c12}.skin-yellow-light .main-header .navbar .nav>li>a{color:#fff}.skin-yellow-light .main-header .navbar .nav>li>a:hover,.skin-yellow-light .main-header .navbar .nav>li>a:active,.skin-yellow-light .main-header .navbar .nav>li>a:focus,.skin-yellow-light .main-header .navbar .nav .open>a,.skin-yellow-light .main-header .navbar .nav .open>a:hover,.skin-yellow-light .main-header .navbar .nav .open>a:focus,.skin-yellow-light .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-yellow-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-yellow-light .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-yellow-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-yellow-light .main-header .navbar .sidebar-toggle:hover{background-color:#e08e0b}@media (max-width:767px){.skin-yellow-light .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-yellow-light .main-header .navbar .dropdown-menu li a{color:#fff}.skin-yellow-light .main-header .navbar .dropdown-menu li a:hover{background:#e08e0b}}.skin-yellow-light .main-header .logo{background-color:#f39c12;color:#fff;border-bottom:0 solid transparent}.skin-yellow-light .main-header .logo:hover{background-color:#f39a0d}.skin-yellow-light .main-header li.user-header{background-color:#f39c12}.skin-yellow-light .content-header{background:transparent}.skin-yellow-light .wrapper,.skin-yellow-light .main-sidebar,.skin-yellow-light .left-side{background-color:#f9fafc}.skin-yellow-light .content-wrapper,.skin-yellow-light .main-footer{border-left:1px solid #d2d6de}.skin-yellow-light .user-panel>.info,.skin-yellow-light .user-panel>.info>a{color:#444}.skin-yellow-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-yellow-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-yellow-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-yellow-light .sidebar-menu>li:hover>a,.skin-yellow-light .sidebar-menu>li.active>a{color:#000;background:#f4f4f5}.skin-yellow-light .sidebar-menu>li.active{border-left-color:#f39c12}.skin-yellow-light .sidebar-menu>li.active>a{font-weight:600}.skin-yellow-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-yellow-light .sidebar a{color:#444}.skin-yellow-light .sidebar a:hover{text-decoration:none}.skin-yellow-light .treeview-menu>li>a{color:#777}.skin-yellow-light .treeview-menu>li.active>a,.skin-yellow-light .treeview-menu>li>a:hover{color:#000}.skin-yellow-light .treeview-menu>li.active>a{font-weight:600}.skin-yellow-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px 10px}.skin-yellow-light .sidebar-form input[type="text"],.skin-yellow-light .sidebar-form .btn{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px}.skin-yellow-light .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-yellow-light .sidebar-form input[type="text"]:focus,.skin-yellow-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-yellow-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-yellow-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-yellow-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}}.skin-purple .main-header .navbar{background-color:#605ca8}.skin-purple .main-header .navbar .nav>li>a{color:#fff}.skin-purple .main-header .navbar .nav>li>a:hover,.skin-purple .main-header .navbar .nav>li>a:active,.skin-purple .main-header .navbar .nav>li>a:focus,.skin-purple .main-header .navbar .nav .open>a,.skin-purple .main-header .navbar .nav .open>a:hover,.skin-purple .main-header .navbar .nav .open>a:focus,.skin-purple .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-purple .main-header .navbar .sidebar-toggle{color:#fff}.skin-purple .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-purple .main-header .navbar .sidebar-toggle{color:#fff}.skin-purple .main-header .navbar .sidebar-toggle:hover{background-color:#555299}@media (max-width:767px){.skin-purple .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-purple .main-header .navbar .dropdown-menu li a{color:#fff}.skin-purple .main-header .navbar .dropdown-menu li a:hover{background:#555299}}.skin-purple .main-header .logo{background-color:#555299;color:#fff;border-bottom:0 solid transparent}.skin-purple .main-header .logo:hover{background-color:#545096}.skin-purple .main-header li.user-header{background-color:#605ca8}.skin-purple .content-header{background:transparent}.skin-purple .wrapper,.skin-purple .main-sidebar,.skin-purple .left-side{background-color:#222d32}.skin-purple .user-panel>.info,.skin-purple .user-panel>.info>a{color:#fff}.skin-purple .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-purple .sidebar-menu>li>a{border-left:3px solid transparent}.skin-purple .sidebar-menu>li:hover>a,.skin-purple .sidebar-menu>li.active>a{color:#fff;background:#1e282c;border-left-color:#605ca8}.skin-purple .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-purple .sidebar a{color:#b8c7ce}.skin-purple .sidebar a:hover{text-decoration:none}.skin-purple .treeview-menu>li>a{color:#8aa4af}.skin-purple .treeview-menu>li.active>a,.skin-purple .treeview-menu>li>a:hover{color:#fff}.skin-purple .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-purple .sidebar-form input[type="text"],.skin-purple .sidebar-form .btn{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px}.skin-purple .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-purple .sidebar-form input[type="text"]:focus,.skin-purple .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-purple .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-purple .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}.skin-purple-light .main-header .navbar{background-color:#605ca8}.skin-purple-light .main-header .navbar .nav>li>a{color:#fff}.skin-purple-light .main-header .navbar .nav>li>a:hover,.skin-purple-light .main-header .navbar .nav>li>a:active,.skin-purple-light .main-header .navbar .nav>li>a:focus,.skin-purple-light .main-header .navbar .nav .open>a,.skin-purple-light .main-header .navbar .nav .open>a:hover,.skin-purple-light .main-header .navbar .nav .open>a:focus,.skin-purple-light .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-purple-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-purple-light .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-purple-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-purple-light .main-header .navbar .sidebar-toggle:hover{background-color:#555299}@media (max-width:767px){.skin-purple-light .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-purple-light .main-header .navbar .dropdown-menu li a{color:#fff}.skin-purple-light .main-header .navbar .dropdown-menu li a:hover{background:#555299}}.skin-purple-light .main-header .logo{background-color:#605ca8;color:#fff;border-bottom:0 solid transparent}.skin-purple-light .main-header .logo:hover{background-color:#5d59a6}.skin-purple-light .main-header li.user-header{background-color:#605ca8}.skin-purple-light .content-header{background:transparent}.skin-purple-light .wrapper,.skin-purple-light .main-sidebar,.skin-purple-light .left-side{background-color:#f9fafc}.skin-purple-light .content-wrapper,.skin-purple-light .main-footer{border-left:1px solid #d2d6de}.skin-purple-light .user-panel>.info,.skin-purple-light .user-panel>.info>a{color:#444}.skin-purple-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-purple-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-purple-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-purple-light .sidebar-menu>li:hover>a,.skin-purple-light .sidebar-menu>li.active>a{color:#000;background:#f4f4f5}.skin-purple-light .sidebar-menu>li.active{border-left-color:#605ca8}.skin-purple-light .sidebar-menu>li.active>a{font-weight:600}.skin-purple-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-purple-light .sidebar a{color:#444}.skin-purple-light .sidebar a:hover{text-decoration:none}.skin-purple-light .treeview-menu>li>a{color:#777}.skin-purple-light .treeview-menu>li.active>a,.skin-purple-light .treeview-menu>li>a:hover{color:#000}.skin-purple-light .treeview-menu>li.active>a{font-weight:600}.skin-purple-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px 10px}.skin-purple-light .sidebar-form input[type="text"],.skin-purple-light .sidebar-form .btn{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px}.skin-purple-light .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-purple-light .sidebar-form input[type="text"]:focus,.skin-purple-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-purple-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-purple-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-purple-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}} \ No newline at end of file diff --git a/download_attachment.php b/download_attachment.php index 4254cd01..356638a6 100755 --- a/download_attachment.php +++ b/download_attachment.php @@ -1,32 +1,15 @@ $hesklang['ts'], ); -// Also possible to display all custom fields -for ($i = 1; $i <= 20; $i++) { - if ($hesk_settings['custom_fields']['custom' . $i]['use']) { - $hesk_settings['possible_ticket_list']['custom' . $i] = $hesk_settings['custom_fields']['custom' . $i]['name']; - } -} - /*** FUNCTIONS ***/ @@ -256,7 +232,7 @@ function hesk_mergeTickets($merge_these, $merge_into) } /* Update history (log) and merged IDs of target ticket */ - hesk_dbQuery("UPDATE `" . hesk_dbEscape($hesk_settings['db_pfix']) . "tickets` SET $replies_sql `time_worked`=ADDTIME(`time_worked`, '" . hesk_dbEscape($sec_worked) . "'), `merged`=CONCAT(`merged`,'" . hesk_dbEscape($merged . '#') . "'), `history`=CONCAT(`history`,'" . hesk_dbEscape($history) . "') WHERE `id`='" . intval($merge_into) . "' LIMIT 1"); + hesk_dbQuery("UPDATE `" . hesk_dbEscape($hesk_settings['db_pfix']) . "tickets` SET $replies_sql `time_worked`=ADDTIME(`time_worked`, '" . hesk_dbEscape($sec_worked) . "'), `merged`=CONCAT(`merged`,'" . hesk_dbEscape($merged . '#') . "'), `history`=CONCAT(`history`,'" . hesk_dbEscape($history) . "') WHERE `id`='" . intval($merge_into) . "'"); return true; @@ -393,8 +369,8 @@ function hesk_autoLogin($noredirect = 0) /* Check username */ $result = hesk_dbQuery('SELECT * FROM `' . $hesk_settings['db_pfix'] . "users` WHERE `user` = '" . hesk_dbEscape($user) . "' LIMIT 1"); if (hesk_dbNumRows($result) != 1) { - setcookie('hesk_username', ''); - setcookie('hesk_p', ''); + hesk_setcookie('hesk_username', ''); + hesk_setcookie('hesk_p', ''); header('Location: '.$url); exit(); } @@ -403,8 +379,8 @@ function hesk_autoLogin($noredirect = 0) /* Check password */ if ($hash != hesk_Pass2Hash($res['pass'] . strtolower($user) . $res['pass'])) { - setcookie('hesk_username', ''); - setcookie('hesk_p', ''); + hesk_setcookie('hesk_username', ''); + hesk_setcookie('hesk_p', ''); header('Location: '.$url); exit(); } @@ -437,8 +413,8 @@ function hesk_autoLogin($noredirect = 0) } /* Renew cookies */ - setcookie('hesk_username', "$user", strtotime('+1 year')); - setcookie('hesk_p', "$hash", strtotime('+1 year')); + hesk_setcookie('hesk_username', "$user", strtotime('+1 year')); + hesk_setcookie('hesk_p', "$hash", strtotime('+1 year')); /* Close any old tickets here so Cron jobs aren't necessary */ if ($hesk_settings['autoclose']) { @@ -646,7 +622,8 @@ function hesk_formatDate($dt, $from_database = true) function hesk_jsString($str) { - $str = str_replace(array('\'', '
    '), array('\\\'', ''), $str); + $str = addslashes($str); + $str = str_replace('
    ' , '' , $str); $from = array("/\r\n|\n|\r/", '/\([^\<]*)\<\/a\>/i', '/\([^\<]*)\<\/a\>/i'); $to = array("\\r\\n' + \r\n'", "$1", "$1"); return preg_replace($from, $to, $str); @@ -715,3 +692,53 @@ function hesk_checkPermission($feature, $showerror = 1) } } // END hesk_checkPermission() + +function hesk_purge_cache($type = '', $expire_after_seconds = 0) +{ + global $hesk_settings; + + $cache_dir = dirname(dirname(__FILE__)).'/'.$hesk_settings['cache_dir'].'/'; + + if ( ! is_dir($cache_dir)) + { + return false; + } + + switch ($type) + { + case 'export': + $files = glob($cache_dir.'hesk_export_*', GLOB_NOSORT); + break; + case 'status': + $files = glob($cache_dir.'status_*', GLOB_NOSORT); + break; + case 'cf': + $files = glob($cache_dir.'cf_*', GLOB_NOSORT); + break; + default: + hesk_rrmdir(trim($cache_dir, '/'), true); + return true; + } + + if (is_array($files)) + { + array_walk($files, 'hesk_unlink_callable', $expire_after_seconds); + } + + return true; + +} // END hesk_purge_cache() + + +function hesk_rrmdir($dir, $keep_top_level=false) +{ + $files = $keep_top_level ? array_diff(scandir($dir), array('.','..','index.htm')) : array_diff(scandir($dir), array('.','..')); + + foreach ($files as $file) + { + (is_dir("$dir/$file")) ? hesk_rrmdir("$dir/$file") : @unlink("$dir/$file"); + } + + return $keep_top_level ? true : @rmdir($dir); + +} // END hesk_rrmdir() diff --git a/inc/attachments.inc.php b/inc/attachments.inc.php index 89761a5e..1dfd4fee 100644 --- a/inc/attachments.inc.php +++ b/inc/attachments.inc.php @@ -1,32 +1,15 @@ '; + if ($trackingID !== false) { + $str .= ''; + + if ($hesk_settings['email_view_ticket'] && isset($hesk_settings['e_email'])) { + $str .= ''; + } + } + if (!isset($_GET)) { $_GET = array(); } @@ -1105,7 +1156,7 @@ function hesk_getLanguage() } /* Remember and set the selected language */ - setcookie('hesk_language', $hesk_settings['language'], time() + 31536000, '/'); + hesk_setcookie('hesk_language', $hesk_settings['language'], time() + 31536000, '/'); return hesk_returnLanguage(); } // END hesk_getLanguage() @@ -1113,10 +1164,45 @@ function hesk_getLanguage() function hesk_returnLanguage() { global $hesk_settings, $hesklang; - require(HESK_PATH . 'language/' . $hesk_settings['languages'][$hesk_settings['language']]['folder'] . '/text.php'); - $customLanguagePath = HESK_PATH . 'language/' . $hesk_settings['languages'][$hesk_settings['language']]['folder'] . '/custom-text.php'; - if (file_exists($customLanguagePath)) { - include($customLanguagePath); + // Variable that will be set to true if a language file was loaded + $language_loaded = false; + + // Load requested language file + $language_file = HESK_PATH . 'language/' . $hesk_settings['languages'][$hesk_settings['language']]['folder'] . '/text.php'; + if (file_exists($language_file)) { + require($language_file); + $language_loaded = true; + } + + // Requested language file not found, try to load default installed language + if (!$language_loaded && $hesk_settings['language'] != HESK_DEFAULT_LANGUAGE) { + $language_file = HESK_PATH . 'language/' . $hesk_settings['languages'][HESK_DEFAULT_LANGUAGE]['folder'] . '/text.php'; + if (file_exists($language_file)) { + require($language_file); + $language_loaded = true; + $hesk_settings['language'] = HESK_DEFAULT_LANGUAGE; + } + } + + // Requested language file not found, can we at least load English? + if (!$language_loaded && $hesk_settings['language'] != 'English' && HESK_DEFAULT_LANGUAGE != 'English') { + $language_file = HESK_PATH . 'language/en/text.php'; + if (file_exists($language_file)) { + require($language_file); + $language_loaded = true; + $hesk_settings['language'] = 'English'; + } + } + + // If a language is still not loaded, give up + if (!$language_loaded) { + die('Count not load a valid language file.'); + } + + // Load a custom text file if available + $language_file = HESK_PATH . 'language/' . $hesk_settings['languages'][$hesk_settings['language']]['folder'] . '/custom-text.php'; + if (file_exists($language_file)) { + require($language_file); } return true; } // END hesk_returnLanguage() @@ -1637,9 +1723,43 @@ function hesk_check_maintenance($dodie = true)
    -

    -

    - + {$hesklang['hni1']}

    + {$hesklang['hni2']}

    + {$hesklang['hni3']}"; + } + // Hesk appears to be installed, show a "Maintenance in progress" message + else + { + echo " + {$hesklang['mm1']}

    + {$hesklang['mm2']}

    + {$hesklang['mm3']}"; + } + ?>
    '; + } + + if ($has_half) { + $markup .= ''; + } + + for ($i = 0; $i < 5 - $int_value; $i++) { + $markup .= ''; + } + + return $markup; } \ No newline at end of file diff --git a/inc/custom_fields.inc.php b/inc/custom_fields.inc.php new file mode 100755 index 00000000..b077c502 --- /dev/null +++ b/inc/custom_fields.inc.php @@ -0,0 +1,249 @@ + $v) + { + $hesk_settings['possible_ticket_list'][$k] = $hesk_settings['custom_fields'][$k]['title']; + } +} + + +/*** FUNCTIONS ***/ + + +function hesk_load_custom_fields($category=0, $use_cache=1) +{ + global $hesk_settings, $hesklang; + + // Do we have a cached version available + $cache_dir = dirname(dirname(__FILE__)).'/'.$hesk_settings['cache_dir'].'/'; + $cache_file = $cache_dir . 'cf_' . sha1($hesk_settings['language']).'.cache.php'; + + if ($use_cache && file_exists($cache_file)) + { + require($cache_file); + return true; + } + + // Get custom fields from the database + $hesk_settings['custom_fields'] = array(); + + // Make sure we have database connection + hesk_load_database_functions(); + hesk_dbConnect(); + + $res = hesk_dbQuery("SELECT * FROM `".hesk_dbEscape($hesk_settings['db_pfix'])."custom_fields` WHERE `use` IN ('1', '2') ORDER BY `place` ASC, `order` ASC"); + while ($row = hesk_dbFetchAssoc($res)) + { + $id = 'custom' . $row['id']; + unset($row['id']); + + // Let's set field name for current language (or the first one we find) + $names = json_decode($row['name'], true); + $row['name'] = (isset($names[$hesk_settings['language']])) ? $names[$hesk_settings['language']] : reset($names); + + // Name for display in ticket list; punctuation removed and shortened + $row['title'] = hesk_remove_punctuation($row['name']); + $row['title'] = strlen($row['title']) > 30 ? substr($row['title'], 0, 30) . '...' : $row['title']; + + // A version with forced punctuation + $row['name:'] = in_array(substr($row['name'], -1), array(':', '?', '!', '.') ) ? $row['name'] : $row['name'] . ':'; + + // Decode categories + $row['category'] = strlen($row['category']) ? json_decode($row['category'], true) : array(); + + // Decode options + $row['value'] = json_decode($row['value'], true); + + // Add to custom_fields array + $hesk_settings['custom_fields'][$id] = $row; + } + + // Try to cache results + if ($use_cache && (is_dir($cache_dir) || ( @mkdir($cache_dir, 0777) && is_writable($cache_dir) ) ) ) + { + // Is there an index.htm file? + if ( ! file_exists($cache_dir.'index.htm')) + { + @file_put_contents($cache_dir.'index.htm', ''); + } + + // Write data + @file_put_contents($cache_file, ' $hesklang['m1'], + 'February' => $hesklang['m2'], + 'March' => $hesklang['m3'], + 'April' => $hesklang['m4'], + 'May' => $hesklang['m5'], + 'June' => $hesklang['m6'], + 'July' => $hesklang['m7'], + 'August' => $hesklang['m8'], + 'September' => $hesklang['m9'], + 'October' => $hesklang['m10'], + 'November' => $hesklang['m11'], + 'December' => $hesklang['m12'] + ); + + $translate_months_short = array( + 'Jan' => $hesklang['ms01'], + 'Feb' => $hesklang['ms02'], + 'Mar' => $hesklang['ms03'], + 'Apr' => $hesklang['ms04'], + 'May' => $hesklang['ms05'], + 'Jun' => $hesklang['ms06'], + 'Jul' => $hesklang['ms07'], + 'Aug' => $hesklang['ms08'], + 'Sep' => $hesklang['ms09'], + 'Oct' => $hesklang['ms10'], + 'Nov' => $hesklang['ms11'], + 'Dec' => $hesklang['ms12'] + ); + + $translate_days = array( + 'Monday' => $hesklang['d1'], + 'Tuesday' => $hesklang['d2'], + 'Wednesday' => $hesklang['d3'], + 'Thursday' => $hesklang['d4'], + 'Friday' => $hesklang['d5'], + 'Saturday' => $hesklang['d6'], + 'Sunday' => $hesklang['d0'] + ); + + $translate_days_short = array( + 'Mon' => $hesklang['mo'], + 'Tuw' => $hesklang['tu'], + 'Wes' => $hesklang['we'], + 'Thu' => $hesklang['th'], + 'Fri' => $hesklang['fr'], + 'Sat' => $hesklang['sa'], + 'Sun' => $hesklang['su'] + ); + + $date_translate = array(); + + if (strpos($format, 'F') !== false) + { + $date_translate = array_merge($date_translate, $translate_months); + } + + if (strpos($format, 'M') !== false) + { + $date_translate = array_merge($date_translate, $translate_months_short); + } + + if (strpos($format, 'l') !== false) + { + $date_translate = array_merge($date_translate, $translate_days); + } + + if (strpos($format, 'D') !== false) + { + $date_translate = array_merge($date_translate, $translate_days_short); + } + + if (count($date_translate)) + { + return str_replace( array_keys($date_translate), array_values($date_translate), gmdate($format, $timestamp)); + } + + return gmdate($format, $timestamp); + +} // END hesk_custom_date_display_format() + + +function hesk_remove_punctuation($in) +{ + return rtrim($in, ':?!.'); +} // END hesk_remove_punctuation() diff --git a/inc/email_functions.inc.php b/inc/email_functions.inc.php index 4bb14dc4..df45602f 100644 --- a/inc/email_functions.inc.php +++ b/inc/email_functions.inc.php @@ -1,38 +1,24 @@ $v) { + + //TODO Update the email custom field to handle this properly + /*foreach ($hesk_settings['custom_fields'] as $k => $v) { if ($v['use']) { if ($v['type'] == 'email' && !empty($ticket[$k])) { if ($v['value'] == 'cc') { @@ -75,7 +63,7 @@ function hesk_notifyCustomerForVerifyEmail($email_template = 'verify_email', $ac } } } - } + }*/ hesk_mail($ticket['email'], $subject, $message, $htmlMessage, $modsForHesk_settings, $ccEmails, $bccEmails, $hasMessage); } @@ -106,7 +94,9 @@ function hesk_notifyCustomer($modsForHesk_settings, $email_template = 'new_ticke // Add Cc / Bcc recipents if needed $ccEmails = array(); $bccEmails = array(); - foreach ($hesk_settings['custom_fields'] as $k => $v) { + + //TODO Update the email custom field to handle this properly + /*foreach ($hesk_settings['custom_fields'] as $k => $v) { if ($v['use']) { if ($v['type'] == 'email' && !empty($ticket[$k])) { if ($v['value'] == 'cc') { @@ -116,7 +106,7 @@ function hesk_notifyCustomer($modsForHesk_settings, $email_template = 'new_ticke } } } - } + }*/ // Send e-mail hesk_mail($ticket['email'], $subject, $message, $htmlMessage, $modsForHesk_settings, $ccEmails, $bccEmails, $hasMessage); @@ -846,15 +836,24 @@ function hesk_processMessage($msg, $ticket, $is_admin, $is_ticket, $just_message $msg = str_replace('%%ID%%', $ticket['id'], $msg); /* All custom fields */ - foreach ($hesk_settings['custom_fields'] as $k => $v) { - if ($v['use']) { - if ($v['type'] == 'checkbox') { - $ticket[$k] = str_replace("
    ", "\n", $ticket[$k]); + for ($i=1; $i<=50; $i++) { + $k = 'custom'.$i; + + if (isset($hesk_settings['custom_fields'][$k])) { + $v = $hesk_settings['custom_fields'][$k]; + + switch ($v['type']) { + case 'checkbox': + $ticket[$k] = str_replace("
    ","\n",$ticket[$k]); + break; + case 'date': + $ticket[$k] = hesk_custom_date_display_format($ticket[$k], $v['value']['date_format']); + break; } - $msg = str_replace('%%' . strtoupper($k) . '%%', stripslashes($ticket[$k]), $msg); + $msg = str_replace('%%'.strtoupper($k).'%%',stripslashes($ticket[$k]),$msg); } else { - $msg = str_replace('%%' . strtoupper($k) . '%%', '', $msg); + $msg = str_replace('%%'.strtoupper($k).'%%','',$msg); } } diff --git a/inc/footer.inc.php b/inc/footer.inc.php new file mode 100644 index 00000000..15259146 --- /dev/null +++ b/inc/footer.inc.php @@ -0,0 +1,90 @@ + + + +
    '; +} + + +/******************************************************************************* +The code below handles HESK licensing. Removing or modifying this code without +purchasing a HESK license is strictly prohibited. + +To purchase a HESK license and support future HESK development please visit: +https://www.hesk.com/buy.php +*******************************************************************************/ +$hesk_settings['hesk_license']('HMgPSAxOw0KaWYgKGZpbGVfZXhpc3RzKEhFU0tfUEFUSCAuI +CdoZXNrX2xpY2Vuc2UucGhwJykpDQp7DQokaCA9ICghZW1wdHkoJF9TRVJWRVJbJ0hUVFBfSE9TVCddK +SkgPyAkX1NFUlZFUlsnSFRUUF9IT1NUJ10gOiAoKCFlbXB0eSgkX1NFUlZFUlsnU0VSVkVSX05BTUUnX +SkpID8gJF9TRVJWRVJbJ1NFUlZFUl9OQU1FJ10gOiBnZXRlbnYoJ1NFUlZFUl9OQU1FJykpOw0KJGggP +SBzdHJfcmVwbGFjZSgnd3d3LicsJycsc3RydG9sb3dlcigkaCkpOw0KaW5jbHVkZShIRVNLX1BBVEggL +iAnaGVza19saWNlbnNlLnBocCcpOw0KaWYgKGlzc2V0KCRoZXNrX3NldHRpbmdzWydsaWNlbnNlJ10pI +CYmIHN0cnBvcygkaGVza19zZXR0aW5nc1snbGljZW5zZSddLHNoYTEoJGguJ2gzJkZwMiNMYUEmNTkhd +yg4LlpjXSordVI1MTInKSkgIT09IGZhbHNlKQ0Kew0KJHMgPSAwOw0KfQ0KZWxzZQ0Kew0KZWNobyAnP +HAgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyO2NvbG9yOnJlZDsiPklOVkFMSUQgTElDRU5TRSAoTk9UI +FJFR0lTVEVSRUQgRk9SICcuJGguJykhPC9wPic7DQp9DQp9DQppZiAoJHMpDQp7DQplY2hvICc8cCBzd +HlsZT0idGV4dC1hbGlnbjpjZW50ZXIiPjxzcGFuIGNsYXNzPSJzbWFsbGVyIj4mbmJzcDs8YnIgLz5Qb +3dlcmVkIGJ5IDxhIGhyZWY9Imh0dHA6Ly93d3cuaGVzay5jb20iIGNsYXNzPSJzbWFsbGVyIiB0aXRsZ +T0iRnJlZSBQSFAgSGVscCBEZXNrIFNvZnR3YXJlIj5IZWxwIERlc2sgU29mdHdhcmU8L2E+IDxiPkhFU +0s8L2I+LCBicm91Z2h0IHRvIHlvdSBieSA8YSBocmVmPSJodHRwczovL3d3dy5zeXNhaWQuY29tLz91d +G1fc291cmNlPUhlc2smYW1wO3V0bV9tZWRpdW09Y3BjJmFtcDt1dG1fY2FtcGFpZ249SGVza1Byb2R1Y +3RfVG9fSFAiPlN5c0FpZDwvYT48L3NwYW4+PC9wPic7DQp9DQplY2hvICc8L3RkPjwvdHI+PC90YWJsZ +T48L2Rpdj4nOw0KaW5jbHVkZShIRVNLX1BBVEggLiAnZm9vdGVyLnR4dCcpOw0KZWNobyAnPC9ib2R5P +jwvaHRtbD4nOw==',"\112"); + +if (defined('ADMIN_PAGE')) { + echo '
    '; +} + +exit(); diff --git a/inc/header.inc.php b/inc/header.inc.php index 1d03dd02..60705433 100644 --- a/inc/header.inc.php +++ b/inc/header.inc.php @@ -1,32 +1,15 @@ - - + + <?php echo(isset($hesk_settings['tmp_title']) ? $hesk_settings['tmp_title'] : $hesk_settings['hesk_title']); ?> @@ -283,34 +267,37 @@ if ($modsForHesk_settings['show_icons']) {