From 5327b0c0da3b9a0552f647af37ec3fbab954e6a7 Mon Sep 17 00:00:00 2001 From: Sujit Prasad Date: Tue, 19 Apr 2016 19:19:42 +0530 Subject: [PATCH] update 1.0.7 --- .env | 2 +- README.md | 2 +- app/Exceptions/Handler.php | 66 +- .../Admin/helpdesk/AgentController.php | 5 +- .../Admin/helpdesk/EmailsController.php | 60 +- .../Admin/helpdesk/GroupController.php | 3 - .../Admin/helpdesk/SettingsController.php | 109 +- .../Admin/helpdesk/TemplateController.php | 2 +- .../Admin/helpdesk/WorkflowController.php | 456 + .../Agent/helpdesk/MailController.php | 13 +- .../Agent/helpdesk/NotificationController.php | 25 + .../Agent/helpdesk/Ticket2Controller.php | 261 +- .../Agent/helpdesk/TicketController.php | 934 +- .../helpdesk/TicketWorkflowController.php | 510 + .../Agent/kb/SettingsController.php | 3 +- app/Http/Controllers/Api/v1/ApiController.php | 315 +- .../Api/v1/ApiExceptAuthController.php | 9 +- .../Controllers/Api/v1/TicketController.php | 146 +- .../Api/v1/TokenAuthController.php | 59 +- .../Client/helpdesk/FormController.php | 37 +- .../Common/NotificationController.php | 83 + .../Controllers/Common/SettingsController.php | 2 +- .../Installer/helpdesk/InstallController.php | 1 - app/Http/Requests/helpdesk/CompanyRequest.php | 2 +- .../Requests/helpdesk/OrganizationRequest.php | 2 +- .../Requests/helpdesk/OrganizationUpdate.php | 2 +- .../helpdesk/WorkflowCreateRequest.php | 39 + .../helpdesk/WorkflowUpdateRequest.php | 39 + app/Http/routes.php | 35 +- app/Model/helpdesk/Agent/Groups.php | 2 +- .../helpdesk/Notification/Notification.php | 14 + .../Notification/NotificationType.php | 14 + .../Notification/UserNotification.php | 14 + app/Model/helpdesk/Ticket/Ticket_Thread.php | 2 +- .../helpdesk/Workflow/WorkflowAction.php | 12 + app/Model/helpdesk/Workflow/WorkflowName.php | 12 + app/Model/helpdesk/Workflow/WorkflowRules.php | 12 + app/User.php | 9 + config/app.php | 5 +- config/lfm.php | 2 +- ...2_16_140450_create_ticket_thread_table.php | 2 + ...3_31_061239_create_notifications_table.php | 33 + ...061534_create_notification_types_table.php | 33 + ..._061740_create_user_notification_table.php | 33 + ...4_18_115852_create_workflow_name_table.php | 35 + ...4_18_115900_create_workflow_rule_table.php | 42 + ...18_115908_create_workflow_action_table.php | 39 + database/seeds/DatabaseSeeder.php | 8 +- nbproject/project.properties | 0 nbproject/project.xml | 12 + public/css/notification-style.css | 22 + public/downloads/en.zip | Bin 9494 -> 11795 bytes .../connectors/php/plugins/rsc/cloudfiles.php | 2 +- .../php/plugins/rsc/cloudfiles_exceptions.php | 2 +- .../php/plugins/rsc/cloudfiles_http.php | 2 +- public/lb-faveo/css/faveo-css.css | 35 + public/lb-faveo/media/company/4477.faveo.png | Bin 0 -> 7907 bytes public/lb-faveo/plugins/moment/moment.js | 11412 ++++++++++++++++ public/photos/1/1/sada/56c160fbad635.jpg | Bin 172655 -> 0 bytes .../photos/1/1/sada/thumbs/56c160fbad635.jpg | Bin 8629 -> 0 bytes release-notes.txt | 2671 ++++ resources/lang/en/lang.php | 59 +- resources/views/notifications-all.blade.php | 215 + .../agent/agents/agent-profile.blade.php | 4 +- .../helpdesk/agent/agents/create.blade.php | 4 +- .../helpdesk/agent/agents/edit.blade.php | 4 +- .../helpdesk/agent/agents/index.blade.php | 4 +- .../agent/departments/create.blade.php | 2 +- .../helpdesk/agent/departments/edit.blade.php | 2 +- .../agent/departments/index.blade.php | 2 +- .../helpdesk/agent/groups/create.blade.php | 6 +- .../helpdesk/agent/groups/edit.blade.php | 6 +- .../helpdesk/agent/groups/index.blade.php | 2 +- .../helpdesk/agent/teams/create.blade.php | 2 +- .../admin/helpdesk/agent/teams/edit.blade.php | 2 +- .../helpdesk/agent/teams/index.blade.php | 2 +- .../helpdesk/emails/banlist/create.blade.php | 4 +- .../helpdesk/emails/banlist/edit.blade.php | 4 +- .../helpdesk/emails/banlist/index.blade.php | 2 +- .../helpdesk/emails/emails/create.blade.php | 22 +- .../helpdesk/emails/emails/edit.blade.php | 88 +- .../helpdesk/emails/emails/index.blade.php | 2 +- .../helpdesk/emails/template/create.blade.php | 2 +- .../helpdesk/emails/template/edit.blade.php | 2 +- .../emails/template/formDiagno.blade.php | 4 +- .../helpdesk/emails/template/index.blade.php | 2 +- .../emails/template/listdirectories.blade.php | 2 +- .../emails/template/listtemplates.blade.php | 2 +- .../emails/template/readtemplates.blade.php | 2 +- .../admin/helpdesk/language/create.blade.php | 2 +- .../admin/helpdesk/language/index.blade.php | 2 +- .../helpdesk/manage/form/create.blade.php | 4 +- .../admin/helpdesk/manage/form/edit.blade.php | 2 +- .../admin/helpdesk/manage/form/form.blade.php | 2 +- .../helpdesk/manage/form/index.blade.php | 2 +- .../helpdesk/manage/form/preview.blade.php | 2 +- .../manage/helptopic/create.blade.php | 12 +- .../helpdesk/manage/helptopic/edit.blade.php | 19 +- .../helpdesk/manage/helptopic/index.blade.php | 4 +- .../helpdesk/manage/sla/create.blade.php | 4 +- .../admin/helpdesk/manage/sla/edit.blade.php | 8 +- .../admin/helpdesk/manage/sla/index.blade.php | 2 +- .../helpdesk/manage/workflow/create.blade.php | 381 + .../helpdesk/manage/workflow/edit.blade.php | 520 + .../helpdesk/manage/workflow/index.blade.php | 90 + .../default1/admin/helpdesk/setting.blade.php | 25 + .../admin/helpdesk/settings/alert.blade.php | 2 +- .../helpdesk/settings/checkupdate.blade.php | 4 +- .../admin/helpdesk/settings/company.blade.php | 73 +- .../admin/helpdesk/settings/crone.blade.php | 135 + .../admin/helpdesk/settings/email.blade.php | 15 +- .../admin/helpdesk/settings/plugins.blade.php | 4 +- .../helpdesk/settings/responder.blade.php | 2 +- .../admin/helpdesk/settings/system.blade.php | 2 +- .../admin/helpdesk/settings/ticket.blade.php | 2 +- .../admin/helpdesk/theme/social.blade.php | 4 +- .../admin/helpdesk/theme/widgets.blade.php | 4 +- .../default1/admin/layout/admin.blade.php | 200 +- .../helpdesk/dept-ticket/closed.blade.php | 63 +- .../helpdesk/dept-ticket/inprogress.blade.php | 59 +- .../agent/helpdesk/dept-ticket/open.blade.php | 61 +- .../helpdesk/organization/create.blade.php | 6 +- .../helpdesk/organization/edit.blade.php | 6 +- .../agent/helpdesk/ticket/answered.blade.php | 61 +- .../agent/helpdesk/ticket/assigned.blade.php | 61 +- .../agent/helpdesk/ticket/closed.blade.php | 59 +- .../agent/helpdesk/ticket/inbox.blade.php | 61 +- .../agent/helpdesk/ticket/myticket.blade.php | 61 +- .../agent/helpdesk/ticket/open.blade.php | 59 +- .../agent/helpdesk/ticket/overdue.blade.php | 548 +- .../agent/helpdesk/ticket/timeline.blade.php | 25 +- .../agent/helpdesk/ticket/trash.blade.php | 75 +- .../helpdesk/ticket/unassigned.blade.php | 61 +- .../agent/helpdesk/user/profile.blade.php | 146 +- .../agent/kb/article/create.blade.php | 2 +- .../default1/agent/kb/article/edit.blade.php | 2 +- .../default1/agent/layout/agent.blade.php | 117 +- .../client/helpdesk/ckeckticket.blade.php | 29 +- .../default1/client/helpdesk/form.blade.php | 9 +- .../helpdesk/guest-user/checkticket.blade.php | 3 - .../client/helpdesk/guest-user/form.blade.php | 2 +- .../default1/client/helpdesk/ticket.blade.php | 28 +- .../default1/client/layout/client.blade.php | 10 +- .../installer/helpdesk/view4.blade.php | 2 +- .../themes/default1/layouts/login.blade.php | 2 +- vendor/composer/ClassLoader.php | 8 +- vendor/composer/LICENSE | 2 +- vendor/composer/autoload_classmap.php | 6 + vendor/composer/autoload_files.php | 28 +- vendor/composer/autoload_real.php | 46 +- vendor/composer/autoload_static.php | 1040 ++ .../php-imap/php-imap/src/PhpImap/Mailbox.php | 2 +- .../phpunit/src/Util/PHP/eval-stdin.php | 3 - 153 files changed, 20711 insertions(+), 1727 deletions(-) create mode 100644 app/Http/Controllers/Admin/helpdesk/WorkflowController.php create mode 100644 app/Http/Controllers/Agent/helpdesk/TicketWorkflowController.php create mode 100644 app/Http/Controllers/Common/NotificationController.php create mode 100644 app/Http/Requests/helpdesk/WorkflowCreateRequest.php create mode 100644 app/Http/Requests/helpdesk/WorkflowUpdateRequest.php create mode 100644 app/Model/helpdesk/Notification/Notification.php create mode 100644 app/Model/helpdesk/Notification/NotificationType.php create mode 100644 app/Model/helpdesk/Notification/UserNotification.php create mode 100644 app/Model/helpdesk/Workflow/WorkflowAction.php create mode 100644 app/Model/helpdesk/Workflow/WorkflowName.php create mode 100644 app/Model/helpdesk/Workflow/WorkflowRules.php create mode 100644 database/migrations/2016_03_31_061239_create_notifications_table.php create mode 100644 database/migrations/2016_03_31_061534_create_notification_types_table.php create mode 100644 database/migrations/2016_03_31_061740_create_user_notification_table.php create mode 100644 database/migrations/2016_04_18_115852_create_workflow_name_table.php create mode 100644 database/migrations/2016_04_18_115900_create_workflow_rule_table.php create mode 100644 database/migrations/2016_04_18_115908_create_workflow_action_table.php create mode 100644 nbproject/project.properties create mode 100644 nbproject/project.xml create mode 100644 public/css/notification-style.css create mode 100644 public/lb-faveo/media/company/4477.faveo.png create mode 100644 public/lb-faveo/plugins/moment/moment.js delete mode 100644 public/photos/1/1/sada/56c160fbad635.jpg delete mode 100644 public/photos/1/1/sada/thumbs/56c160fbad635.jpg create mode 100644 release-notes.txt create mode 100644 resources/views/notifications-all.blade.php create mode 100644 resources/views/themes/default1/admin/helpdesk/manage/workflow/create.blade.php create mode 100644 resources/views/themes/default1/admin/helpdesk/manage/workflow/edit.blade.php create mode 100644 resources/views/themes/default1/admin/helpdesk/manage/workflow/index.blade.php create mode 100644 resources/views/themes/default1/admin/helpdesk/settings/crone.blade.php create mode 100644 vendor/composer/autoload_static.php delete mode 100644 vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php diff --git a/.env b/.env index 1034f2d82..832d947ee 100644 --- a/.env +++ b/.env @@ -4,7 +4,7 @@ APP_KEY=SomeRandomString DB_TYPE=mysql DB_HOST=localhost DB_PORT= -DB_DATABASE=faveo +DB_DATABASE=faveo-dev DB_USERNAME=root DB_PASSWORD= MAIL_DRIVER=smtp diff --git a/README.md b/README.md index b6b65ba5c..cba2aadbd 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -

About Faveo

+

About Faveo


   StyleCI  

Headquartered in Bangalore, Faveo HELPDESK provides Businesses with an automated Helpdesk system to manage customer support.

diff --git a/app/Exceptions/Handler.php b/app/Exceptions/Handler.php index 202e877e9..71bc33099 100644 --- a/app/Exceptions/Handler.php +++ b/app/Exceptions/Handler.php @@ -9,6 +9,8 @@ use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler; class Handler extends ExceptionHandler { + public $phpmailer; + /** * A list of the exception types that should not be reported. * @@ -18,18 +20,6 @@ class Handler extends ExceptionHandler 'Symfony\Component\HttpKernel\Exception\HttpException', ]; - /** - * Create a new controller instance. - * constructor to check - * 1. php mailer. - * - * @return void - */ - // public function __construct(PhpMailController $PhpMailController) - // { - // $this->PhpMailController = $PhpMailController; - // } - /** * Report or log an exception. * @@ -54,30 +44,34 @@ class Handler extends ExceptionHandler */ public function render($request, Exception $e) { - // $phpmail = new PhpMailController; -// if ($e instanceof \Tymon\JWTAuth\Exceptions\TokenExpiredException) { -// return response()->json(['message' => $e->getMessage(), 'code' => $e->getStatusCode()]); -// } elseif ($e instanceof \Tymon\JWTAuth\Exceptions\TokenInvalidException) { -// return response()->json(['message' => $e->getMessage(), 'code' => $e->getStatusCode()]); -// } -// // This is to check if the debug is true or false -// if (config('app.debug') == false) { -// // checking if the error is actually an error page or if its an system error page -// if ($this->isHttpException($e) && $e->getStatusCode() == 404) { -// return response()->view('errors.404', []); -// } else { -// // checking if the application is installed -// if (\Config::get('database.install') == 1) { -// // checking if the error log send to Ladybirdweb is enabled or not -// if (\Config::get('app.ErrorLog') == '1') { -// $this->phpmail->sendmail($from = $this->PhpMailController->mailfrom('1', '0'), $to = ['name' => 'faveo logger', 'email' => 'faveoerrorlogger@gmail.com'], $message = ['subject' => 'Faveo downloaded from github has occured error', 'scenario' => 'error-report'], $template_variables = ['e' => $e]); -// } -// } -// -// return response()->view('errors.500', []); -// } -// } -// // returns non oops error message + //dd($e); + $phpmail = new PhpMailController(); + $this->PhpMailController = $phpmail; + if ($e instanceof \Tymon\JWTAuth\Exceptions\TokenExpiredException) { + return response()->json(['message' => $e->getMessage(), 'code' => $e->getStatusCode()]); + } elseif ($e instanceof \Tymon\JWTAuth\Exceptions\TokenInvalidException) { + return response()->json(['message' => $e->getMessage(), 'code' => $e->getStatusCode()]); + } + // This is to check if the debug is true or false + if (config('app.debug') == false) { + // checking if the error is actually an error page or if its an system error page + if ($this->isHttpException($e) && $e->getStatusCode() == 404) { + return response()->view('errors.404', []); + } else { + // checking if the application is installed + if (\Config::get('database.install') == 1) { + // checking if the error log send to Ladybirdweb is enabled or not + if (\Config::get('app.ErrorLog') == '1') { + try { + $this->PhpMailController->sendmail($from = $this->PhpMailController->mailfrom('1', '0'), $to = ['name' => 'faveo logger', 'email' => 'faveoerrorlogger@gmail.com'], $message = ['subject' => 'Faveo downloaded from github has occured error', 'scenario' => 'error-report'], $template_variables = ['system_error' => "

 Message:".$e->getMessage().'
Code:'.$e->getCode().'
File:'.$e->getFile().'
Line:'.$e->getLine().'
']); + } catch (Exception $exx) { + } + } + } + return response()->view('errors.500', []); + } + } + // returns non oops error message return parent::render($request, $e); // checking if the error is related to http error i.e. page not found if ($this->isHttpException($e)) { diff --git a/app/Http/Controllers/Admin/helpdesk/AgentController.php b/app/Http/Controllers/Admin/helpdesk/AgentController.php index eb16521bf..202e83ecd 100644 --- a/app/Http/Controllers/Admin/helpdesk/AgentController.php +++ b/app/Http/Controllers/Admin/helpdesk/AgentController.php @@ -107,7 +107,8 @@ class AgentController extends Controller // fixing the user role to agent $user->fill($request->input())->save(); // generate password and has immediately to store - $user->password = Hash::make($this->generateRandomString()); + $password = $this->generateRandomString(); + $user->password = Hash::make($password); // fetching all the team details checked for this user $requests = $request->input('team_id'); // get user id of the inserted user detail @@ -127,7 +128,7 @@ class AgentController extends Controller $this->PhpMailController->sendmail($from = $this->PhpMailController->mailfrom('1', '0'), $to = ['name' => $name, 'email' => $email], $message = ['subject' => 'Password', 'scenario' => 'registration-notification'], $template_variables = ['user' => $name, 'email_address' => $email, 'user_password' => $password]); } catch (Exception $e) { // returns if try fails - return redirect('agents')->with('fails', 'Some error occured while sending mail to the agent. Please check email settings and try again'); + return redirect('agents')->with('fails', 'Some error occurred while sending mail to the agent. Please check email settings and try again'); } // returns for the success case return redirect('agents')->with('success', 'Agent Created sucessfully'); diff --git a/app/Http/Controllers/Admin/helpdesk/EmailsController.php b/app/Http/Controllers/Admin/helpdesk/EmailsController.php index c639b5388..c68bd7356 100644 --- a/app/Http/Controllers/Admin/helpdesk/EmailsController.php +++ b/app/Http/Controllers/Admin/helpdesk/EmailsController.php @@ -19,8 +19,6 @@ use Crypt; use Exception; use Illuminate\Http\Request; -//use PhpImap\Mailbox as ImapMailbox; - /** * ====================================== * EmailsController. @@ -120,9 +118,14 @@ class EmailsController extends Controller return $return_data; } + if ($request->validate == 'on') { + $validate = '/validate-cert'; + } else { + $validate = '/novalidate-cert'; + } if ($request->fetching_status == 'on') { - $imap_check = $this->getImapStream($request); - if ($imap_check == 0) { + $imap_check = $this->getImapStream($request, $validate); + if ($imap_check[0] == 0) { return 'Incoming email connection failed'; } $need_to_check_imap = 1; @@ -143,17 +146,17 @@ class EmailsController extends Controller if ($need_to_check_imap == 1 && $need_to_check_smtp == 1) { if ($imap_check != 0 && $smtp_check != 0) { - $this->store($request); + $this->store($request, $imap_check[1]); $return = 1; } } elseif ($need_to_check_imap == 1 && $need_to_check_smtp == 0) { if ($imap_check != 0 && $smtp_check == 0) { - $this->store($request); + $this->store($request, $imap_check[1]); $return = 1; } } elseif ($need_to_check_imap == 0 && $need_to_check_smtp == 1) { if ($imap_check == 0 && $smtp_check != 0) { - $this->store($request); + $this->store($request, null); $return = 1; } } elseif ($need_to_check_imap == 0 && $need_to_check_smtp == 0) { @@ -174,14 +177,14 @@ class EmailsController extends Controller * * @return type Redirect */ - public function store($request) + public function store($request, $imap_check) { // dd($request); $email = new Emails(); try { // getConnection($request->input('email_name'), $request->input('email_address'), $request->input('email_address')) // saving all the fields to the database - if ($email->fill($request->except('password', 'department', 'priority', 'help_topic', 'fetching_status', 'sending_status', 'auto_response'))->save() == true) { + if ($email->fill($request->except('password', 'department', 'priority', 'help_topic', 'fetching_status', 'fetching_encryption', 'sending_status', 'auto_response'))->save() == true) { if ($request->fetching_status == 'on') { $email->fetching_status = 1; } else { @@ -197,7 +200,12 @@ class EmailsController extends Controller } else { $email->auto_response = 0; } - // fetching department value + if ($imap_check !== null) { + $email->fetching_encryption = $imap_check; + } else { + $email->fetching_encryption = $request->fetching_encryption; + } + // fetching department value $email->department = $this->departmentValue($request->input('department')); // fetching priority value $email->priority = $this->priorityValue($request->input('priority')); @@ -289,8 +297,13 @@ class EmailsController extends Controller return $return_data; } // return $request; + if ($request->validate == 'on') { + $validate = '/validate-cert'; + } else { + $validate = '/novalidate-cert'; + } if ($request->fetching_status == 'on') { - $imap_check = $this->getImapStream($request); + $imap_check = $this->getImapStream($request, $validate); if ($imap_check == 0) { return 'Incoming email connection failed'; } @@ -425,7 +438,7 @@ class EmailsController extends Controller * * @return type int */ - public function getImapStream($request) + public function getImapStream($request, $validate) { $fetching_status = $request->input('fetching_status'); $username = $request->input('email_address'); @@ -433,13 +446,20 @@ class EmailsController extends Controller $protocol_id = $request->input('mailbox_protocol'); $fetching_protocol = '/'.$request->input('fetching_protocol'); $fetching_encryption = '/'.$request->input('fetching_encryption'); - if ($fetching_encryption == 'none') { - $fetching_encryption = 'novalidate-cert'; + if ($fetching_encryption == '/none') { + $fetching_encryption2 = '/novalidate-cert'; + $mailbox_protocol = $fetching_encryption2; + $host = $request->input('fetching_host'); + $port = $request->input('fetching_port'); + $mailbox = '{'.$host.':'.$port.$mailbox_protocol.'}INBOX'; + } else { + $mailbox_protocol = $fetching_protocol.$fetching_encryption; + $host = $request->input('fetching_host'); + $port = $request->input('fetching_port'); + $mailbox = '{'.$host.':'.$port.$mailbox_protocol.$validate.'}INBOX'; + $mailbox_protocol = $fetching_encryption.$validate; } - $mailbox_protocol = $fetching_protocol.$fetching_encryption; - $host = $request->input('fetching_host'); - $port = $request->input('fetching_port'); - $mailbox = '{'.$host.':'.$port.$mailbox_protocol.'}INBOX'; + try { $imap_stream = imap_open($mailbox, $username, $password); } catch (\Exception $ex) { @@ -447,9 +467,9 @@ class EmailsController extends Controller } $imap_stream = imap_open($mailbox, $username, $password); if ($imap_stream) { - $return = 1; + $return = [0 => 1, 1 => $mailbox_protocol]; } else { - $return = 0; + $return = [0 => 0]; } return $return; diff --git a/app/Http/Controllers/Admin/helpdesk/GroupController.php b/app/Http/Controllers/Admin/helpdesk/GroupController.php index 9e8392cc7..a89bc1cfb 100644 --- a/app/Http/Controllers/Admin/helpdesk/GroupController.php +++ b/app/Http/Controllers/Admin/helpdesk/GroupController.php @@ -139,9 +139,6 @@ class GroupController extends Controller //Updating can_assign_ticket field $assignTicket = $request->Input('can_assign_ticket'); $var->can_assign_ticket = $assignTicket; - //Updating can_trasfer_ticket field - $trasferTicket = $request->Input('can_trasfer_ticket'); - $var->can_trasfer_ticket = $trasferTicket; //Updating can_delete_ticket field $deleteTicket = $request->Input('can_delete_ticket'); $var->can_delete_ticket = $deleteTicket; diff --git a/app/Http/Controllers/Admin/helpdesk/SettingsController.php b/app/Http/Controllers/Admin/helpdesk/SettingsController.php index 33ccf9136..8402b6c4b 100644 --- a/app/Http/Controllers/Admin/helpdesk/SettingsController.php +++ b/app/Http/Controllers/Admin/helpdesk/SettingsController.php @@ -27,9 +27,11 @@ use App\Model\helpdesk\Utility\Date_time_format; use App\Model\helpdesk\Utility\Time_format; use App\Model\helpdesk\Utility\Timezones; // classes +use DB; use Exception; use Illuminate\Http\Request; use Input; +use Lang; /** * SettingsController. @@ -76,7 +78,7 @@ class SettingsController extends Controller /* Direct to Company Settings Page */ return view('themes.default1.admin.helpdesk.settings.company', compact('companys')); } catch (Exception $e) { - return redirect()->back()->with('fails', $e->errorInfo[2]); + return redirect()->back()->with('fails', $e->getMessage()); } } @@ -110,10 +112,31 @@ class SettingsController extends Controller return redirect('getcompany')->with('success', 'Company Updated Successfully'); } catch (Exception $e) { /* redirect to Index page with Fails Message */ - return redirect('getcompany')->with('fails', 'Company can not Updated'.'
  • '.$e->errorInfo[2].'
  • '); + return redirect('getcompany')->with('fails', 'Company can not Updated'.'
  • '.$e->getMessage().'
  • '); } } + /** + * function to delete system logo. + * + * @return type string + */ + public function deleteLogo() + { + $path = $_GET['data1']; //get file path of logo image + if (!unlink($path)) { + return 'false'; + } else { + $companys = Company::where('id', '=', 1)->first(); + $companys->logo = null; + $companys->use_logo = '0'; + $companys->save(); + + return 'true'; + } + // return $res; + } + /** * get the form for System setting page. * @@ -138,7 +161,7 @@ class SettingsController extends Controller /* Direct to System Settings Page */ return view('themes.default1.admin.helpdesk.settings.system', compact('systems', 'departments', 'timezones', 'time', 'date', 'date_time')); } catch (Exception $e) { - return redirect()->back()->with('fails', $e->errorInfo[2]); + return redirect()->back()->with('fails', $e->getMessage()); } } @@ -164,7 +187,7 @@ class SettingsController extends Controller return redirect('getsystem')->with('success', 'System Updated Successfully'); } catch (Exception $e) { /* redirect to Index page with Fails Message */ - return redirect('getsystem')->with('fails', 'System can not Updated'.'
  • '.$e->errorInfo[2].'
  • '); + return redirect('getsystem')->with('fails', 'System can not Updated'.'
  • '.$e->getMessage().'
  • '); } } @@ -190,7 +213,7 @@ class SettingsController extends Controller /* Direct to Ticket Settings Page */ return view('themes.default1.admin.helpdesk.settings.ticket', compact('tickets', 'slas', 'topics', 'priority')); } catch (Exception $e) { - return redirect()->back()->with('fails', $e->errorInfo[2]); + return redirect()->back()->with('fails', $e->getMessage()); } } @@ -225,7 +248,7 @@ class SettingsController extends Controller return redirect('getticket')->with('success', 'Ticket Updated Successfully'); } catch (Exception $e) { /* redirect to Index page with Fails Message */ - return redirect('getticket')->with('fails', 'Ticket can not Updated'.'
  • '.$e->errorInfo[2].'
  • '); + return redirect('getticket')->with('fails', 'Ticket can not Updated'.'
  • '.$e->getMessage().'
  • '); } } @@ -250,7 +273,7 @@ class SettingsController extends Controller /* Direct to Email Settings Page */ return view('themes.default1.admin.helpdesk.settings.email', compact('emails', 'templates', 'emails1')); } catch (Exception $e) { - return redirect()->back()->with('fails', $e->errorInfo[2]); + return redirect()->back()->with('fails', $e->getMessage()); } } @@ -271,8 +294,8 @@ class SettingsController extends Controller /* fill the values to email table */ $emails->fill($request->except('email_fetching', 'all_emails', 'email_collaborator', 'strip', 'attachment'))->save(); /* insert checkboxes to database */ - $emails->email_fetching = $request->input('email_fetching'); - $emails->notification_cron = $request->input('notification_cron'); + // $emails->email_fetching = $request->input('email_fetching'); + // $emails->notification_cron = $request->input('notification_cron'); $emails->all_emails = $request->input('all_emails'); $emails->email_collaborator = $request->input('email_collaborator'); $emails->strip = $request->input('strip'); @@ -283,7 +306,65 @@ class SettingsController extends Controller return redirect('getemail')->with('success', 'Email Updated Successfully'); } catch (Exception $e) { /* redirect to Index page with Fails Message */ - return redirect('getemail')->with('fails', 'Email can not Updated'.'
  • '.$e->errorInfo[2].'
  • '); + return redirect('getemail')->with('fails', 'Email can not Updated'.'
  • '.$e->getMessage().'
  • '); + } + } + + /** + * get the form for cron job setting page. + * + * @param type Email $email + * @param type Template $template + * @param type Emails $email1 + * + * @return type Response + */ + public function getSchedular(Email $email, Template $template, Emails $email1) + { + // try { + /* fetch the values of email from Email table */ + $emails = $email->whereId('1')->first(); + /* Fetch the values from Template table */ + $templates = $template->get(); + /* Fetch the values from Emails table */ + $emails1 = $email1->get(); + + return view('themes.default1.admin.helpdesk.settings.crone', compact('emails', 'templates', 'emails1')); + // } catch { + + // } + } + + /** + * Update the specified resource in storage for cron job. + * + * @param type Email $email + * @param type EmailRequest $request + * + * @return type Response + */ + public function postSchedular(Email $email, Template $template, Emails $email1, Request $request) + { + // dd($request); + try { + /* fetch the values of email request */ + $emails = $email->whereId('1')->first(); + if ($request->email_fetching) { + $emails->email_fetching = $request->email_fetching; + } else { + $emails->email_fetching = 0; + } + if ($request->notification_cron) { + $emails->notification_cron = $request->notification_cron; + } else { + $emails->notification_cron = 0; + } + $emails->save(); + /* redirect to Index page with Success Message */ + return redirect('job-scheduler')->with('success', Lang::get('lang.job-scheduler-success')); + } catch (Exception $e) { + /* redirect to Index page with Fails Message */ + return redirect('job-scheduler')->with('fails', Lang::get('lang.job-scheduler-error').'
  • '.$e->getMessage().'
  • '); } } @@ -353,7 +434,7 @@ class SettingsController extends Controller /* Direct to Responder Settings Page */ return view('themes.default1.admin.helpdesk.settings.responder', compact('responders')); } catch (Exception $e) { - return redirect()->back()->with('fails', $e->errorInfo[2]); + return redirect()->back()->with('fails', $e->getMessage()); } } @@ -383,7 +464,7 @@ class SettingsController extends Controller return redirect('getresponder')->with('success', 'Responder Updated Successfully'); } catch (Exception $e) { /* redirect to Index page with Fails Message */ - return redirect('getresponder')->with('fails', 'Responder can not Updated'.'
  • '.$e->errorInfo[2].'
  • '); + return redirect('getresponder')->with('fails', 'Responder can not Updated'.'
  • '.$e->getMessage().'
  • '); } } @@ -402,7 +483,7 @@ class SettingsController extends Controller /* Direct to Alert Settings Page */ return view('themes.default1.admin.helpdesk.settings.alert', compact('alerts')); } catch (Exception $e) { - return redirect()->back()->with('fails', $e->errorInfo[2]); + return redirect()->back()->with('fails', $e->getMessage()); } } @@ -471,7 +552,7 @@ class SettingsController extends Controller return redirect('getalert')->with('success', 'Alert Updated Successfully'); } catch (Exception $e) { /* redirect to Index page with Fails Message */ - return redirect('getalert')->with('fails', 'Alert can not Updated'.'
  • '.$e->errorInfo[2].'
  • '); + return redirect('getalert')->with('fails', 'Alert can not Updated'.'
  • '.$e->getMessage().'
  • '); } } diff --git a/app/Http/Controllers/Admin/helpdesk/TemplateController.php b/app/Http/Controllers/Admin/helpdesk/TemplateController.php index 050c1f76a..568dc84a0 100644 --- a/app/Http/Controllers/Admin/helpdesk/TemplateController.php +++ b/app/Http/Controllers/Admin/helpdesk/TemplateController.php @@ -324,7 +324,7 @@ class TemplateController extends Controller return redirect('getdiagno')->with('fails', 'Please provide E-mail address !'); } // sending mail via php mailer - $mail = $this->PhpMailController->sendmail($from = $this->PhpMailController->mailfrom('1', '0'), $to = ['email' => $email], $message = ['subject' => 'Checking the connection', 'scenario' => 'error-report', 'content' => 'Email Received Successfully'], $template_variables = ['system_error' => 'hello']); + $mail = $this->PhpMailController->sendmail($from = $this->PhpMailController->mailfrom('1', '0'), $to = ['email' => $email], $message = ['subject' => 'Checking the connection', 'scenario' => 'error-report', 'content' => 'Email Received Successfully'], $template_variables = ['system_error' => 'Email Received Successfully']); if ($mail == null) { return redirect('getdiagno')->with('fails', 'Please check your E-mail settings. Unable to send mails'); diff --git a/app/Http/Controllers/Admin/helpdesk/WorkflowController.php b/app/Http/Controllers/Admin/helpdesk/WorkflowController.php new file mode 100644 index 000000000..e83970caa --- /dev/null +++ b/app/Http/Controllers/Admin/helpdesk/WorkflowController.php @@ -0,0 +1,456 @@ + + */ +class WorkflowController extends Controller +{ + /** + * Create a new controller instance. + * constructor to check + * 1. authentication + * 2. user roles + * 3. roles must be agent. + * + * @return void + */ + public function __construct() + { + // checking authentication + $this->middleware('auth'); + // checking admin roles + $this->middleware('roles'); + } + + /** + * Display a listing of all the workflow. + * + * @return type + */ + public function index() + { + try { + return view('themes.default1.admin.helpdesk.manage.workflow.index'); + } catch (Exception $e) { + return view('404'); + } + } + + /** + * List of all the workflow in the system. + * + * @return type + */ + public function workFlowList() + { + // returns chumper datatable + return Datatable::collection(WorkflowName::All()) + /* searcable column name */ + ->searchColumns('name') + /* order column name and description */ + ->orderColumns('name') + /* add column name */ + ->addColumn('name', function ($model) { + return $model->name; + }) + /* add column status */ + ->addColumn('status', function ($model) { + if ($model->status == 1) { + return 'Active'; + } elseif ($model->status == 0) { + return 'Disabled'; + } + }) + /* add column order */ + ->addColumn('order', function ($model) { + return $model->order; + }) + /* add column rules */ + ->addColumn('rules', function ($model) { + $rules = WorkflowRules::where('workflow_id', '=', $model->id)->count(); + + return $rules; + }) + /* add column target */ + ->addColumn('target', function ($model) { + $target = $model->target; + $target1 = explode('-', $target); + if ($target1[0] == 'A') { + if ($target1[1] == 0) { + return 'Any'; + } elseif ($target1[1] == 1) { + return 'Web Forms'; + } elseif ($target1[1] == 2) { + return 'Email'; + } elseif ($target1[1] == 4) { + return 'API'; + } + } elseif ($target1[0] == 'E') { + $emails = Emails::where('id', '=', $target1[1])->first(); + + return $emails->email_address; + } + }) + /* add column created */ + ->addColumn('Created', function ($model) { + return TicketController::usertimezone($model->created_at); + }) + /* add column updated */ + ->addColumn('Updated', function ($model) { + return TicketController::usertimezone($model->updated_at); + }) + /* add column action */ + ->addColumn('Actions', function ($model) { + $confirmation = 'Are you sure?'; + + return "id)."'> Edit id)."'> Delete"; + }) + ->make(); + } + + /** + * Show the form for creating a new workflow. + * + * @return type Response + */ + public function create(Emails $emails) + { + // dd($emails); + foreach ($emails->lists('email_address', 'id') as $key => $email) { + $email_data["E-$key"] = $email; + } +// dd($email_data); +// dd($emails->lists('email_address' , 'id')); + $emails = $email_data; + try { + // $emails = $emails->get(); + return view('themes.default1.admin.helpdesk.manage.workflow.create', compact('emails')); + } catch (Exception $e) { + return view('404'); + } + } + + /** + * Store a new workflow in to the system. + * + * @param \App\Http\Requests\helpdesk\WorkflowCreateRequest $request + * + * @return type view + */ + public function store(WorkflowCreateRequest $request) + { + //dd($request); + try { + // store a new workflow credentials in to the system + $workflow_name = new WorkflowName(); + $workflow_name->name = $request->name; + $workflow_name->status = $request->status; + $workflow_name->order = $request->execution_order; + $workflow_name->target = $request->target_channel; + $workflow_name->internal_note = $request->internal_note; + $workflow_name->save(); + + $rules = $request->rule; + $actions = $request->action; + // store workflow rules into the system + foreach ($rules as $rule) { + $workflow_rule = new WorkflowRules(); + $workflow_rule->workflow_id = $workflow_name->id; + $workflow_rule->matching_scenario = $rule['a']; + $workflow_rule->matching_relation = $rule['b']; + $workflow_rule->matching_value = $rule['c']; + $workflow_rule->save(); + } + // store a new workflow action into the system + foreach ($actions as $action) { + $workflow_action = new WorkflowAction(); + $workflow_action->workflow_id = $workflow_name->id; + $workflow_action->condition = $action['a']; + $workflow_action->action = $action['b']; + $workflow_action->save(); + } + + return redirect('workflow')->with('success', 'Workflow Created Successfully'); + } catch (Exception $e) { + return redirect()->back()->with('fails', $e->getMessage()); + } + } + + /** + * Editing the details of the banned users. + * + * @param type $id + * @param User $ban + * + * @return type Response + */ + public function edit($id, WorkflowName $work_flow_name, Emails $emails, WorkflowRules $workflow_rule, WorkflowAction $workflow_action) + { + try { + $emails = $emails->get(); + $workflow = $work_flow_name->whereId($id)->first(); + $workflow_rules = $workflow_rule->whereWorkflow_id($id)->get(); + $workflow_actions = $workflow_action->whereWorkflow_id($id)->get(); + + return view('themes.default1.admin.helpdesk.manage.workflow.edit', compact('id', 'workflow', 'emails', 'workflow_rules', 'workflow_actions')); + } catch (Exception $e) { + return view('404'); + } + } + + /** + * Update ticket workflow. + * + * @param type $id + * @param \App\Http\Requests\helpdesk\WorkflowUpdateRequest $request + * + * @return type view + */ + public function update($id, WorkflowUpdateRequest $request) + { + try { + // store a new workflow credentials in to the system + $workflow_name = WorkflowName::whereId($id)->first(); + $workflow_name->name = $request->name; + $workflow_name->status = $request->status; + $workflow_name->order = $request->execution_order; + $workflow_name->target = $request->target_channel; + $workflow_name->internal_note = $request->internal_note; + $workflow_name->save(); + + $rules = $request->rule; + $actions = $request->action; + // removing old foreign values to insert an updated one + WorkflowAction::where('workflow_id', '=', $id)->delete(); + WorkflowRules::where('workflow_id', '=', $id)->delete(); + // update workflow rules into the system + foreach ($rules as $rule) { + $workflow_rule = new WorkflowRules(); + $workflow_rule->workflow_id = $workflow_name->id; + $workflow_rule->matching_scenario = $rule['a']; + $workflow_rule->matching_relation = $rule['b']; + $workflow_rule->matching_value = $rule['c']; + $workflow_rule->save(); + } + // update workflow action into the system + foreach ($actions as $action) { + $workflow_action = new WorkflowAction(); + $workflow_action->workflow_id = $workflow_name->id; + $workflow_action->condition = $action['a']; + $workflow_action->action = $action['b']; + $workflow_action->save(); + } + + return redirect('workflow')->with('success', 'Workflow Updated Successfully'); + } catch (Exception $e) { + return redirect()->back()->with('fails', $e->getMessage()); + } + } + + /** + * function to delete workflow. + * + * @param type $id + */ + public function destroy($id) + { + try { + // remove all the contents of workflow + $workflow_action = WorkflowAction::where('workflow_id', '=', $id)->delete(); + $workflow_rules = WorkflowRules::where('workflow_id', '=', $id)->delete(); + $workflow = WorkflowName::whereId($id)->delete(); + + return redirect('workflow')->with('success', 'Workflow Deleted Successfully'); + } catch (Exception $e) { + return redirect()->back()->with('fails', $e->getMessage()); + } + } + + /** + * function to select action. + * + * @param type $id + * @param \Illuminate\Http\Request $request + * + * @return type void + */ + public function selectAction($id, Request $request) + { + if ($request->option == 'reject') { + return $this->rejectTicket($id); + } elseif ($request->option == 'department') { + return $this->department($id); + } elseif ($request->option == 'priority') { + return $this->priority($id); + } elseif ($request->option == 'sla') { + return $this->slaPlan($id); + } elseif ($request->option == 'team') { + return $this->assignTeam($id); + } elseif ($request->option == 'agent') { + return $this->assignAgent($id); + } elseif ($request->option == 'helptopic') { + return $this->helptopic($id); + } elseif ($request->option == 'status') { + return $this->ticketStatus($id); + } + } + + /** + * function to reject ticket. + * + * @return string + */ + public function rejectTicket($id) + { + $var = 'Reject '; + + return $var; + } + + /** + * function to return deprtment select option. + * + * @return type string + */ + public function department($id) + { + $departments = Department::all(); + $var = "'; + + return $var; + } + + /** + * function to return the priority select option. + * + * @return type string + */ + public function priority($id) + { + $priorities = Ticket_Priority::all(); + $var = "'; + + return $var; + } + + /** + * function to return the slaplan select option. + * + * @return type string + */ + public function slaPlan($id) + { + $sla_plans = Sla_plan::where('status', '=', 1)->get(); + $var = "'; + + return $var; + } + + /** + * function to get system team select option. + * + * @return type string + */ + public function assignTeam($id) + { + $teams = Teams::where('status', '=', 1)->get(); + $var = "'; + + return $var; + } + + /** + * function to get system agents select option. + * + * @return type string + */ + public function assignAgent($id) + { + $users = User::where('role', '!=', 'user')->where('active', '=', 1)->get(); + $var = "'; + + return $var; + } + + /** + * function to get the helptopic select option. + * + * @return type string + */ + public function helptopic($id) + { + $help_topics = Help_topic::where('status', '=', 1)->get(); + $var = "'; + + return $var; + } + + /** + * function to get the select option to choose the ticket status. + * + * @return type string + */ + public function ticketStatus($id) + { + $ticket_status = Ticket_Status::all(); + $var = "'; + + return $var; + } +} diff --git a/app/Http/Controllers/Agent/helpdesk/MailController.php b/app/Http/Controllers/Agent/helpdesk/MailController.php index 56901b690..76c6f1ced 100644 --- a/app/Http/Controllers/Agent/helpdesk/MailController.php +++ b/app/Http/Controllers/Agent/helpdesk/MailController.php @@ -35,9 +35,9 @@ class MailController extends Controller * * @param type TicketController $TicketController */ - public function __construct(TicketController $TicketController) + public function __construct(TicketWorkflowController $TicketWorkflowController) { - $this->TicketController = $TicketController; + $this->TicketWorkflowController = $TicketWorkflowController; } /** @@ -76,6 +76,9 @@ class MailController extends Controller $protocol_value = $e_mail->mailbox_protocol; $get_mailboxprotocol = MailboxProtocol::where('id', '=', $protocol_value)->first(); $protocol = $get_mailboxprotocol->value; + } elseif ($e_mail->fetching_encryption == '/none') { + $fetching_encryption2 = '/novalidate-cert'; + $protocol = $fetching_encryption2; } else { if ($e_mail->fetching_protocol) { $fetching_protocol = '/'.$e_mail->fetching_protocol; @@ -83,7 +86,7 @@ class MailController extends Controller $fetching_protocol = ''; } if ($e_mail->fetching_encryption) { - $fetching_encryption = '/'.$e_mail->fetching_encryption; + $fetching_encryption = $e_mail->fetching_encryption; } else { $fetching_encryption = ''; } @@ -130,7 +133,9 @@ class MailController extends Controller $assign = $get_helptopic->auto_assign; $form_data = null; - $result = $this->TicketController->create_user($fromaddress, $fromname, $subject, $body, $phone, $helptopic, $sla, $priority, $source, $collaborator, $dept, $assign, $form_data, $auto_response); + $team_assign = null; + $ticket_status = null; + $result = $this->TicketWorkflowController->workflow($fromaddress, $fromname, $subject, $body, $phone, $helptopic, $sla, $priority, $source, $collaborator, $dept, $assign, $team_assign, $ticket_status, $form_data, $auto_response); // dd($result); if ($result[1] == true) { $ticket_table = Tickets::where('ticket_number', '=', $result[0])->first(); diff --git a/app/Http/Controllers/Agent/helpdesk/NotificationController.php b/app/Http/Controllers/Agent/helpdesk/NotificationController.php index 41c6c6b6b..3b6a4969b 100644 --- a/app/Http/Controllers/Agent/helpdesk/NotificationController.php +++ b/app/Http/Controllers/Agent/helpdesk/NotificationController.php @@ -76,6 +76,10 @@ class NotificationController extends Controller $view = View::make('emails.notifications.admin', ['company' => $company, 'name' => $user_name]); $contents = $view->render(); $this->PhpMailController->sendEmail($from = $this->PhpMailController->mailfrom('1', '0'), $to = ['name' => $user_name, 'email' => $email], $message = ['subject' => 'Daily Report', 'scenario' => null, 'body' => $contents]); + +// \Mail::send('emails.notifications.admin', ['company' => $company, 'name' => $user_name], function ($message) use ($email, $user_name, $company) { +// $message->to($email, $user_name)->subject($company.' Daily Report '); +// }); } } @@ -99,6 +103,10 @@ class NotificationController extends Controller $view = View::make('emails.notifications.manager', ['company' => $company, 'name' => $user_name]); $contents = $view->render(); $this->PhpMailController->sendEmail($from = $this->PhpMailController->mailfrom('1', '0'), $to = ['name' => $user_name, 'email' => $email], $message = ['subject' => 'Daily Report', 'scenario' => null, 'body' => $contents]); + +// \Mail::send('emails.notifications.manager', ['company' => $company, 'name' => $user_name, 'dept_id' => $dept->id, 'dept_name' => $dept->name], function ($message) use ($email, $user_name, $company, $dept_name) { +// $message->to($email, $user_name)->subject($company.' Daily Report for department manager of '.$dept_name.' department.'); +// }); } } } @@ -124,6 +132,10 @@ class NotificationController extends Controller $view = View::make('emails.notifications.lead', ['company' => $company, 'name' => $user_name]); $contents = $view->render(); $this->PhpMailController->sendEmail($from = $this->PhpMailController->mailfrom('1', '0'), $to = ['name' => $user_name, 'email' => $email], $message = ['subject' => 'Daily Report', 'scenario' => null, 'body' => $contents]); + +// \Mail::send('emails.notifications.lead', ['company' => $company, 'name' => $user_name, 'team_id' => $team->id], function ($message) use ($email, $user_name, $company, $team_name) { +// $message->to($email, $user_name)->subject($company.' Daily Report for Team Lead of team '.$team_name); +// }); } } } @@ -145,6 +157,10 @@ class NotificationController extends Controller $view = View::make('emails.notifications.agent', ['company' => $company, 'name' => $user_name, 'user_id' => $user->id]); $contents = $view->render(); $this->PhpMailController->sendEmail($from = $this->PhpMailController->mailfrom('1', '0'), $to = ['name' => $user_name, 'email' => $email], $message = ['subject' => 'Daily Report', 'scenario' => null, 'body' => $contents]); + +// \Mail::send('emails.notifications.agent', ['company' => $company, 'name' => $user_name, 'user_id' => 1], function ($message) use ($email, $user_name, $company) { +// $message->to($email, $user_name)->subject($company.' Daily Report for Agents'); +// }); } } @@ -166,4 +182,13 @@ class NotificationController extends Controller return $company; } + + // // testing + // public function test(){ + // $email = "sujit.prasad@ladybirdweb.com"; + // $user_name = "sujit prasad"; + // \Mail::send('emails.notifications.test', ['user_id' => 1], function ($message) use($email, $user_name) { + // $message->to($email, $user_name)->subject('testing reporting'); + // }); + // } } diff --git a/app/Http/Controllers/Agent/helpdesk/Ticket2Controller.php b/app/Http/Controllers/Agent/helpdesk/Ticket2Controller.php index d2db4a300..dccd27ac5 100644 --- a/app/Http/Controllers/Agent/helpdesk/Ticket2Controller.php +++ b/app/Http/Controllers/Agent/helpdesk/Ticket2Controller.php @@ -8,18 +8,11 @@ use App\Http\Controllers\Controller; // requests // models use App\Model\helpdesk\Agent\Department; -use App\Model\helpdesk\Ticket\Ticket_attachments; -use App\Model\helpdesk\Ticket\Ticket_Collaborator; -use App\Model\helpdesk\Ticket\Ticket_Priority; -use App\Model\helpdesk\Ticket\Ticket_Thread; use App\Model\helpdesk\Ticket\Tickets; use App\User; use Auth; -use DB; // classes -use Illuminate\support\Collection; -use Input; -use UTC; +use Ttable; /** * TicketController2. @@ -67,89 +60,7 @@ class Ticket2Controller extends Controller $tickets = Tickets::where('status', '=', 1)->where('isanswered', '=', 0)->where('dept_id', '=', $dept->id)->get(); } - return \Datatable::collection(new Collection($tickets)) - ->addColumn('id', function ($ticket) { - return ""; - }) - ->addColumn('subject', function ($ticket) { - $subject = DB::table('ticket_thread')->select('title')->where('ticket_id', '=', $ticket->id)->first(); - if (isset($subject->title)) { - $string = $subject->title; - if (strlen($string) > 20) { - $stringCut = substr($string, 0, 30); - $string = substr($stringCut, 0, strrpos($stringCut, ' ')).' ...'; - } - } else { - $string = '(no subject)'; - } - //collabrations - $collaborators = DB::table('ticket_collaborator')->where('ticket_id', '=', $ticket->id)->get(); - $collab = count($collaborators); - if ($collab > 0) { - $collabString = ' '; - } else { - $collabString = null; - } - $threads = Ticket_Thread::where('ticket_id', '=', $ticket->id)->first(); // - $count = Ticket_Thread::where('ticket_id', '=', $ticket->id)->count(); // - $attachment = Ticket_attachments::where('thread_id', '=', $threads->id)->get(); - $attachCount = count($attachment); - if ($attachCount > 0) { - $attachString = ' '; - } else { - $attachString = ''; - } - - return "id])."' title='".$subject->title."'>".$string." (".$count.")".$collabString.$attachString; - }) - ->addColumn('ticket_number', function ($ticket) { - return "id])."' title='".$ticket->ticket_number."'>#".$ticket->ticket_number.''; - }) - ->addColumn('priority', function ($ticket) { - $priority = DB::table('ticket_priority')->select('priority_desc', 'priority_color')->where('priority_id', '=', $ticket->priority_id)->first(); - - return ''.$priority->priority_desc.''; - }) - ->addColumn('from', function ($ticket) { - $from = DB::table('users')->select('user_name')->where('id', '=', $ticket->user_id)->first(); - - return "".$from->user_name.''; - }) - ->addColumn('Last Replier', function ($ticket) { - $TicketData = Ticket_Thread::where('ticket_id', '=', $ticket->id)->where('is_internal', '=', 0)->max('id'); - $TicketDatarow = Ticket_Thread::where('id', '=', $TicketData)->first(); - $LastResponse = User::where('id', '=', $TicketDatarow->user_id)->first(); - if ($LastResponse->role == 'user') { - $rep = '#F39C12'; - $username = $LastResponse->user_name; - } else { - $rep = '#000'; - $username = $LastResponse->first_name.' '.$LastResponse->last_name; - if ($LastResponse->first_name == null || $LastResponse->last_name == null) { - $username = $LastResponse->user_name; - } - } - - return "".$username.''; - }) - ->addColumn('assigned_to', function ($ticket) { - if ($ticket->assigned_to == null) { - return "Unassigned"; - } else { - $assign = DB::table('users')->where('id', '=', $ticket->assigned_to)->first(); - - return "".$assign->first_name.' '.$assign->last_name.''; - } - }) - ->addColumn('Last', function ($ticket) { - $TicketData = Ticket_Thread::where('ticket_id', '=', $ticket->id)->max('id'); - $TicketDatarow = Ticket_Thread::select('updated_at')->where('id', '=', $TicketData)->first(); - - return UTC::usertimezone($TicketDatarow->updated_at); - }) - ->searchColumns('subject', 'from', 'assigned_to', 'ticket_number', 'priority') - ->orderColumns('subject', 'from', 'assigned_to', 'Last Replier', 'ticket_number', 'priority', 'Last') - ->make(); + return Ttable::getTable($tickets); } /** @@ -180,89 +91,7 @@ class Ticket2Controller extends Controller $tickets = Tickets::where('status', '=', '2')->where('dept_id', '=', $dept->id)->get(); } - return \Datatable::collection(new Collection($tickets)) - ->addColumn('id', function ($ticket) { - return ""; - }) - ->addColumn('subject', function ($ticket) { - $subject = DB::table('ticket_thread')->select('title')->where('ticket_id', '=', $ticket->id)->first(); - if (isset($subject->title)) { - $string = $subject->title; - if (strlen($string) > 20) { - $stringCut = substr($string, 0, 30); - $string = substr($stringCut, 0, strrpos($stringCut, ' ')).' ...'; - } - } else { - $string = '(no subject)'; - } - //collabrations - $collaborators = DB::table('ticket_collaborator')->where('ticket_id', '=', $ticket->id)->get(); - $collab = count($collaborators); - if ($collab > 0) { - $collabString = ' '; - } else { - $collabString = null; - } - $threads = Ticket_Thread::where('ticket_id', '=', $ticket->id)->first(); - $count = Ticket_Thread::where('ticket_id', '=', $ticket->id)->count(); - $attachment = Ticket_attachments::where('thread_id', '=', $threads->id)->get(); - $attachCount = count($attachment); - if ($attachCount > 0) { - $attachString = ' '; - } else { - $attachString = ''; - } - - return "id])."' title='".$subject->title."'>".$string." (".$count.")".$collabString.$attachString; - }) - ->addColumn('ticket_number', function ($ticket) { - return "id])."' title='".$ticket->ticket_number."'>#".$ticket->ticket_number.''; - }) - ->addColumn('priority', function ($ticket) { - $priority = DB::table('ticket_priority')->select('priority_desc', 'priority_color')->where('priority_id', '=', $ticket->priority_id)->first(); - - return ''.$priority->priority_desc.''; - }) - ->addColumn('from', function ($ticket) { - $from = DB::table('users')->select('user_name')->where('id', '=', $ticket->user_id)->first(); - - return "".$from->user_name.''; - }) - ->addColumn('Last Replier', function ($ticket) { - $TicketData = Ticket_Thread::where('ticket_id', '=', $ticket->id)->where('is_internal', '!=', 1)->max('id'); - $TicketDatarow = Ticket_Thread::where('id', '=', $TicketData)->first(); - $LastResponse = User::where('id', '=', $TicketDatarow->user_id)->first(); - if ($LastResponse->role == 'user') { - $rep = '#F39C12'; - $username = $LastResponse->user_name; - } else { - $rep = '#000'; - $username = $LastResponse->first_name.' '.$LastResponse->last_name; - if ($LastResponse->first_name == null || $LastResponse->last_name == null) { - $username = $LastResponse->user_name; - } - } - - return "".$username.''; - }) - ->addColumn('assigned_to', function ($ticket) { - if ($ticket->assigned_to == null) { - return "Usernassigned"; - } else { - $assign = DB::table('users')->where('id', '=', $ticket->assigned_to)->first(); - - return "".$assign->first_name.' '.$assign->last_name.''; - } - }) - ->addColumn('Last', function ($ticket) { - $TicketData = Ticket_Thread::where('ticket_id', '=', $ticket->id)->max('id'); - $TicketDatarow = Ticket_Thread::select('updated_at')->where('id', '=', $TicketData)->first(); - - return UTC::usertimezone($TicketDatarow->updated_at); - }) - ->searchColumns('subject', 'from', 'assigned_to', 'ticket_number', 'priority') - ->orderColumns('subject', 'from', 'assigned_to', 'Last Replier', 'ticket_number', 'priority', 'Last') - ->make(); + return Ttable::getTable($tickets); } /** @@ -298,88 +127,6 @@ class Ticket2Controller extends Controller $tickets = Tickets::where('status', '=', '1')->where('assigned_to', '>', 0)->where('dept_id', '=', $dept->id)->get(); } - return \Datatable::collection(new Collection($tickets)) - ->addColumn('id', function ($ticket) { - return ""; - }) - ->addColumn('subject', function ($ticket) { - $subject = DB::table('ticket_thread')->select('title')->where('ticket_id', '=', $ticket->id)->first(); - if (isset($subject->title)) { - $string = $subject->title; - if (strlen($string) > 20) { - $stringCut = substr($string, 0, 30); - $string = substr($stringCut, 0, strrpos($stringCut, ' ')).' ...'; - } - } else { - $string = '(no subject)'; - } - //collabrations - $collaborators = DB::table('ticket_collaborator')->where('ticket_id', '=', $ticket->id)->get(); - $collab = count($collaborators); - if ($collab > 0) { - $collabString = ' '; - } else { - $collabString = null; - } - $threads = Ticket_Thread::where('ticket_id', '=', $ticket->id)->first(); - $count = Ticket_Thread::where('ticket_id', '=', $ticket->id)->count(); - $attachment = Ticket_attachments::where('thread_id', '=', $threads->id)->get(); - $attachCount = count($attachment); - if ($attachCount > 0) { - $attachString = ' '; - } else { - $attachString = ''; - } - - return "id])."' title='".$subject->title."'>".$string." (".$count.")".$collabString.$attachString; - }) - ->addColumn('ticket_number', function ($ticket) { - return "id])."' title='".$ticket->ticket_number."'>#".$ticket->ticket_number.''; - }) - ->addColumn('priority', function ($ticket) { - $priority = DB::table('ticket_priority')->select('priority_desc', 'priority_color')->where('priority_id', '=', $ticket->priority_id)->first(); - - return ''.$priority->priority_desc.''; - }) - ->addColumn('from', function ($ticket) { - $from = DB::table('users')->select('user_name')->where('id', '=', $ticket->user_id)->first(); - - return "".$from->user_name.''; - }) - ->addColumn('Last Replier', function ($ticket) { - $TicketData = Ticket_Thread::where('ticket_id', '=', $ticket->id)->where('is_internal', '!=', 1)->max('id'); - $TicketDatarow = Ticket_Thread::where('id', '=', $TicketData)->first(); - $LastResponse = User::where('id', '=', $TicketDatarow->user_id)->first(); - if ($LastResponse->role == 'user') { - $rep = '#F39C12'; - $username = $LastResponse->user_name; - } else { - $rep = '#000'; - $username = $LastResponse->first_name.' '.$LastResponse->last_name; - if ($LastResponse->first_name == null || $LastResponse->last_name == null) { - $username = $LastResponse->user_name; - } - } - - return "".$username.''; - }) - ->addColumn('assigned_to', function ($ticket) { - if ($ticket->assigned_to == null) { - return "Usernassigned"; - } else { - $assign = DB::table('users')->where('id', '=', $ticket->assigned_to)->first(); - - return "".$assign->first_name.' '.$assign->last_name.''; - } - }) - ->addColumn('Last', function ($ticket) { - $TicketData = Ticket_Thread::where('ticket_id', '=', $ticket->id)->max('id'); - $TicketDatarow = Ticket_Thread::select('updated_at')->where('id', '=', $TicketData)->first(); - - return UTC::usertimezone($TicketDatarow->updated_at); - }) - ->searchColumns('subject', 'from', 'assigned_to', 'ticket_number', 'priority') - ->orderColumns('subject', 'from', 'assigned_to', 'Last Replier', 'ticket_number', 'priority', 'Last') - ->make(); + return Ttable::getTable($tickets); } } diff --git a/app/Http/Controllers/Agent/helpdesk/TicketController.php b/app/Http/Controllers/Agent/helpdesk/TicketController.php index 41a13100b..dbf955604 100644 --- a/app/Http/Controllers/Agent/helpdesk/TicketController.php +++ b/app/Http/Controllers/Agent/helpdesk/TicketController.php @@ -3,6 +3,7 @@ namespace App\Http\Controllers\Agent\helpdesk; // controllers +use App\Http\Controllers\Common\NotificationController; use App\Http\Controllers\Common\PhpMailController; use App\Http\Controllers\Controller; // requests @@ -54,9 +55,10 @@ class TicketController extends Controller * * @return type response */ - public function __construct(PhpMailController $PhpMailController) + public function __construct(PhpMailController $PhpMailController, NotificationController $NotificationController) { $this->PhpMailController = $PhpMailController; + $this->NotificationController = $NotificationController; $this->middleware('auth'); } @@ -79,91 +81,7 @@ class TicketController extends Controller $tickets = Tickets::where('status', 1)->where('dept_id', '=', $dept->id)->get(); } - return \Datatable::collection(new Collection($tickets)) - ->addColumn('id', function ($ticket) { - return ""; - }) - ->addColumn('subject', function ($ticket) { - $subject = DB::table('ticket_thread')->select('title')->where('ticket_id', '=', $ticket->id)->first(); - if (isset($subject->title)) { - $string = $subject->title; - if (strlen($string) > 20) { - $stringCut = substr($string, 0, 30); - $string = substr($stringCut, 0, strrpos($stringCut, ' ')).' ...'; - } - } else { - $string = '(no subject)'; - } - //collabrations - $collaborators = DB::table('ticket_collaborator')->where('ticket_id', '=', $ticket->id)->get(); - $collab = count($collaborators); - if ($collab > 0) { - $collabString = ' '; - } else { - $collabString = null; - } - - $threads = Ticket_Thread::where('ticket_id', '=', $ticket->id)->first(); // - $count = Ticket_Thread::where('ticket_id', '=', $ticket->id)->count(); //Ticket_Thread::where('ticket_id', '=', $ticket->id)->get(); - - $attachment = Ticket_attachments::where('thread_id', '=', $threads->id)->get(); - $attachCount = count($attachment); - if ($attachCount > 0) { - $attachString = ' '; - } else { - $attachString = ''; - } - - return "id])."' title='".$subject->title."'>".$string." (".$count.")".$collabString.$attachString; - }) - ->addColumn('ticket_number', function ($ticket) { - return "id])."' title='".$ticket->ticket_number."'>#".$ticket->ticket_number.''; - }) - ->addColumn('priority', function ($ticket) { - $priority = DB::table('ticket_priority')->select('priority_desc', 'priority_color')->where('priority_id', '=', $ticket->priority_id)->first(); - - return ''.$priority->priority_desc.''; - }) - ->addColumn('from', function ($ticket) { - $from = DB::table('users')->select('user_name')->where('id', '=', $ticket->user_id)->first(); - - return "".$from->user_name.''; - }) - ->addColumn('Last Replier', function ($ticket) { - $TicketData = Ticket_Thread::where('ticket_id', '=', $ticket->id)->max('id'); - $TicketDatarow = Ticket_Thread::where('id', '=', $TicketData)->first(); - $LastResponse = User::where('id', '=', $TicketDatarow->user_id)->first(); - if ($LastResponse->role == 'user') { - $rep = '#F39C12'; - $username = $LastResponse->user_name; - } else { - $rep = '#000'; - $username = $LastResponse->first_name.' '.$LastResponse->last_name; - if ($LastResponse->first_name == null || $LastResponse->last_name == null) { - $username = $LastResponse->user_name; - } - } - - return "".$username.''; - }) - ->addColumn('assigned_to', function ($ticket) { - if ($ticket->assigned_to == null) { - return "Unassigned"; - } else { - $assign = DB::table('users')->where('id', '=', $ticket->assigned_to)->first(); - - return "".$assign->first_name.' '.$assign->last_name.''; - } - }) - ->addColumn('Last', function ($ticket) { - $TicketData = Ticket_Thread::where('ticket_id', '=', $ticket->id)->max('id'); - $TicketDatarow = Ticket_Thread::select('updated_at')->where('id', '=', $TicketData)->first(); - - return UTC::usertimezone($TicketDatarow->updated_at); - }) - ->searchColumns('subject', 'from', 'assigned_to', 'ticket_number', 'priority') - ->orderColumns('subject', 'from', 'assigned_to', 'Last Replier', 'ticket_number', 'priority', 'Last') - ->make(); + return $this->getTable($tickets); } /** @@ -185,89 +103,7 @@ class TicketController extends Controller $tickets = Tickets::where('status', '=', 1)->where('isanswered', '=', 0)->where('dept_id', '=', $dept->id)->get(); } - return \Datatable::collection(new Collection($tickets)) - ->addColumn('id', function ($ticket) { - return ""; - }) - ->addColumn('subject', function ($ticket) { - $subject = DB::table('ticket_thread')->select('title')->where('ticket_id', '=', $ticket->id)->first(); - if (isset($subject->title)) { - $string = $subject->title; - if (strlen($string) > 20) { - $stringCut = substr($string, 0, 30); - $string = substr($stringCut, 0, strrpos($stringCut, ' ')).' ...'; - } - } else { - $string = '(no subject)'; - } - //collabrations - $collaborators = DB::table('ticket_collaborator')->where('ticket_id', '=', $ticket->id)->get(); - $collab = count($collaborators); - if ($collab > 0) { - $collabString = ' '; - } else { - $collabString = null; - } - $threads = Ticket_Thread::where('ticket_id', '=', $ticket->id)->first(); // - $count = Ticket_Thread::where('ticket_id', '=', $ticket->id)->count(); // - $attachment = Ticket_attachments::where('thread_id', '=', $threads->id)->get(); - $attachCount = count($attachment); - if ($attachCount > 0) { - $attachString = ' '; - } else { - $attachString = ''; - } - - return "id])."' title='".$subject->title."'>".$string." (".$count.")".$collabString.$attachString; - }) - ->addColumn('ticket_number', function ($ticket) { - return "id])."' title='".$ticket->ticket_number."'>#".$ticket->ticket_number.''; - }) - ->addColumn('priority', function ($ticket) { - $priority = DB::table('ticket_priority')->select('priority_desc', 'priority_color')->where('priority_id', '=', $ticket->priority_id)->first(); - - return ''.$priority->priority_desc.''; - }) - ->addColumn('from', function ($ticket) { - $from = DB::table('users')->select('user_name')->where('id', '=', $ticket->user_id)->first(); - - return "".$from->user_name.''; - }) - ->addColumn('Last Replier', function ($ticket) { - $TicketData = Ticket_Thread::where('ticket_id', '=', $ticket->id)->where('is_internal', '=', 0)->max('id'); - $TicketDatarow = Ticket_Thread::where('id', '=', $TicketData)->first(); - $LastResponse = User::where('id', '=', $TicketDatarow->user_id)->first(); - if ($LastResponse->role == 'user') { - $rep = '#F39C12'; - $username = $LastResponse->user_name; - } else { - $rep = '#000'; - $username = $LastResponse->first_name.' '.$LastResponse->last_name; - if ($LastResponse->first_name == null || $LastResponse->last_name == null) { - $username = $LastResponse->user_name; - } - } - - return "".$username.''; - }) - ->addColumn('assigned_to', function ($ticket) { - if ($ticket->assigned_to == null) { - return "Unassigned"; - } else { - $assign = DB::table('users')->where('id', '=', $ticket->assigned_to)->first(); - - return "".$assign->first_name.' '.$assign->last_name.''; - } - }) - ->addColumn('Last', function ($ticket) { - $TicketData = Ticket_Thread::where('ticket_id', '=', $ticket->id)->max('id'); - $TicketDatarow = Ticket_Thread::select('updated_at')->where('id', '=', $TicketData)->first(); - - return UTC::usertimezone($TicketDatarow->updated_at); - }) - ->searchColumns('subject', 'from', 'assigned_to', 'ticket_number', 'priority') - ->orderColumns('subject', 'from', 'assigned_to', 'Last Replier', 'ticket_number', 'priority', 'Last') - ->make(); + return $this->getTable($tickets); } /** @@ -289,89 +125,7 @@ class TicketController extends Controller $tickets = Tickets::where('status', '=', 1)->where('isanswered', '=', 1)->where('dept_id', '=', $dept->id)->get(); } - return \Datatable::collection(new Collection($tickets)) - ->addColumn('id', function ($ticket) { - return ""; - }) - ->addColumn('subject', function ($ticket) { - $subject = DB::table('ticket_thread')->select('title')->where('ticket_id', '=', $ticket->id)->first(); - if (isset($subject->title)) { - $string = $subject->title; - if (strlen($string) > 20) { - $stringCut = substr($string, 0, 30); - $string = substr($stringCut, 0, strrpos($stringCut, ' ')).' ...'; - } - } else { - $string = '(no subject)'; - } - //collabrations - $collaborators = DB::table('ticket_collaborator')->where('ticket_id', '=', $ticket->id)->get(); - $collab = count($collaborators); - if ($collab > 0) { - $collabString = ' '; - } else { - $collabString = null; - } - $threads = Ticket_Thread::where('ticket_id', '=', $ticket->id)->first(); - $count = Ticket_Thread::where('ticket_id', '=', $ticket->id)->count(); - $attachment = Ticket_attachments::where('thread_id', '=', $threads->id)->get(); - $attachCount = count($attachment); - if ($attachCount > 0) { - $attachString = ' '; - } else { - $attachString = ''; - } - - return "id])."' title='".$subject->title."'>".$string." (".$count.")".$collabString.$attachString; - }) - ->addColumn('ticket_number', function ($ticket) { - return "id])."' title='".$ticket->ticket_number."'>#".$ticket->ticket_number.''; - }) - ->addColumn('priority', function ($ticket) { - $priority = DB::table('ticket_priority')->select('priority_desc', 'priority_color')->where('priority_id', '=', $ticket->priority_id)->first(); - - return ''.$priority->priority_desc.''; - }) - ->addColumn('from', function ($ticket) { - $from = DB::table('users')->select('user_name')->where('id', '=', $ticket->user_id)->first(); - - return "".$from->user_name.''; - }) - ->addColumn('Last Replier', function ($ticket) { - $TicketData = Ticket_Thread::where('ticket_id', '=', $ticket->id)->where('is_internal', '!=', 1)->max('id'); - $TicketDatarow = Ticket_Thread::where('id', '=', $TicketData)->first(); - $LastResponse = User::where('id', '=', $TicketDatarow->user_id)->first(); - if ($LastResponse->role == 'user') { - $rep = '#F39C12'; - $username = $LastResponse->user_name; - } else { - $rep = '#000'; - $username = $LastResponse->first_name.' '.$LastResponse->last_name; - if ($LastResponse->first_name == null || $LastResponse->last_name == null) { - $username = $LastResponse->user_name; - } - } - - return "".$username.''; - }) - ->addColumn('assigned_to', function ($ticket) { - if ($ticket->assigned_to == null) { - return "Usernassigned"; - } else { - $assign = DB::table('users')->where('id', '=', $ticket->assigned_to)->first(); - - return "".$assign->first_name.' '.$assign->last_name.''; - } - }) - ->addColumn('Last', function ($ticket) { - $TicketData = Ticket_Thread::where('ticket_id', '=', $ticket->id)->max('id'); - $TicketDatarow = Ticket_Thread::select('updated_at')->where('id', '=', $TicketData)->first(); - - return UTC::usertimezone($TicketDatarow->updated_at); - }) - ->searchColumns('subject', 'from', 'assigned_to', 'ticket_number', 'priority') - ->orderColumns('subject', 'from', 'assigned_to', 'Last Replier', 'ticket_number', 'priority', 'Last') - ->make(); + return $this->getTable($tickets); } /** @@ -393,89 +147,7 @@ class TicketController extends Controller $tickets = Tickets::where('status', '=', 1)->where('assigned_to', '=', Auth::user()->id)->get(); } - return \Datatable::collection(new Collection($tickets)) - ->addColumn('id', function ($ticket) { - return ""; - }) - ->addColumn('subject', function ($ticket) { - $subject = DB::table('ticket_thread')->select('title')->where('ticket_id', '=', $ticket->id)->first(); - if (isset($subject->title)) { - $string = $subject->title; - if (strlen($string) > 20) { - $stringCut = substr($string, 0, 30); - $string = substr($stringCut, 0, strrpos($stringCut, ' ')).' ...'; - } - } else { - $string = '(no subject)'; - } - //collabrations - $collaborators = DB::table('ticket_collaborator')->where('ticket_id', '=', $ticket->id)->get(); - $collab = count($collaborators); - if ($collab > 0) { - $collabString = ' '; - } else { - $collabString = null; - } - $threads = Ticket_Thread::where('ticket_id', '=', $ticket->id)->first(); - $count = Ticket_Thread::where('ticket_id', '=', $ticket->id)->count(); - $attachment = Ticket_attachments::where('thread_id', '=', $threads->id)->get(); - $attachCount = count($attachment); - if ($attachCount > 0) { - $attachString = ' '; - } else { - $attachString = ''; - } - - return "id])."' title='".$subject->title."'>".$string." (".$count.")".$collabString.$attachString; - }) - ->addColumn('ticket_number', function ($ticket) { - return "id])."' title='".$ticket->ticket_number."'>#".$ticket->ticket_number.''; - }) - ->addColumn('priority', function ($ticket) { - $priority = DB::table('ticket_priority')->select('priority_desc', 'priority_color')->where('priority_id', '=', $ticket->priority_id)->first(); - - return ''.$priority->priority_desc.''; - }) - ->addColumn('from', function ($ticket) { - $from = DB::table('users')->select('user_name')->where('id', '=', $ticket->user_id)->first(); - - return "".$from->user_name.''; - }) - ->addColumn('Last Replier', function ($ticket) { - $TicketData = Ticket_Thread::where('ticket_id', '=', $ticket->id)->where('is_internal', '!=', 1)->max('id'); - $TicketDatarow = Ticket_Thread::where('id', '=', $TicketData)->first(); - $LastResponse = User::where('id', '=', $TicketDatarow->user_id)->first(); - if ($LastResponse->role == 'user') { - $rep = '#F39C12'; - $username = $LastResponse->user_name; - } else { - $rep = '#000'; - $username = $LastResponse->first_name.' '.$LastResponse->last_name; - if ($LastResponse->first_name == null || $LastResponse->last_name == null) { - $username = $LastResponse->user_name; - } - } - - return "".$username.''; - }) - ->addColumn('assigned_to', function ($ticket) { - if ($ticket->assigned_to == null) { - return "Usernassigned"; - } else { - $assign = DB::table('users')->where('id', '=', $ticket->assigned_to)->first(); - - return "".$assign->first_name.' '.$assign->last_name.''; - } - }) - ->addColumn('Last', function ($ticket) { - $TicketData = Ticket_Thread::where('ticket_id', '=', $ticket->id)->max('id'); - $TicketDatarow = Ticket_Thread::select('updated_at')->where('id', '=', $TicketData)->first(); - - return UTC::usertimezone($TicketDatarow->updated_at); - }) - ->searchColumns('subject', 'from', 'assigned_to', 'ticket_number', 'priority') - ->orderColumns('subject', 'from', 'assigned_to', 'Last Replier', 'ticket_number', 'priority', 'Last') - ->make(); + return $this->getTable($tickets); } /** @@ -488,6 +160,39 @@ class TicketController extends Controller return view('themes.default1.agent.helpdesk.ticket.overdue'); } + public function getOverdueTickets() + { + if (Auth::user()->role == 'agent') { + $dept = Department::where('id', '=', Auth::user()->primary_dpt)->first(); + $overdues = Tickets::where('status', '=', 1)->where('isanswered', '=', 0)->where('dept_id', '=', $dept->id)->orderBy('id', 'DESC')->get(); + } else { + $overdues = Tickets::where('status', '=', 1)->where('isanswered', '=', 0)->orderBy('id', 'DESC')->get(); + } + if (count($overdues) == 0) { + $tickets = null; + } else { + $i = 0; + foreach ($overdues as $overdue) { + $sla_plan = Sla_plan::where('id', '=', $overdue->sla)->first(); + + $ovadate = $overdue->created_at; + $new_date = date_add($ovadate, date_interval_create_from_date_string($sla_plan->grace_period)).'

    '; + if (date('Y-m-d H:i:s') > $new_date) { + $i++; + $value[] = $overdue; + } + } + // dd(count($value)); + if ($i > 0) { + $tickets = new collection($value); + } else { + $tickets = null; + } + } + + return $this->getTable($tickets); + } + /** * Show the Closed ticket list page. * @@ -507,89 +212,7 @@ class TicketController extends Controller $tickets = Tickets::where('status', '>', 1)->where('dept_id', '=', $dept->id)->where('status', '<', 4)->get(); } - return \Datatable::collection(new Collection($tickets)) - ->addColumn('id', function ($ticket) { - return ""; - }) - ->addColumn('subject', function ($ticket) { - $subject = DB::table('ticket_thread')->select('title')->where('ticket_id', '=', $ticket->id)->first(); - if (isset($subject->title)) { - $string = $subject->title; - if (strlen($string) > 20) { - $stringCut = substr($string, 0, 30); - $string = substr($stringCut, 0, strrpos($stringCut, ' ')).' ...'; - } - } else { - $string = '(no subject)'; - } - //collabrations - $collaborators = DB::table('ticket_collaborator')->where('ticket_id', '=', $ticket->id)->get(); - $collab = count($collaborators); - if ($collab > 0) { - $collabString = ' '; - } else { - $collabString = null; - } - $threads = Ticket_Thread::where('ticket_id', '=', $ticket->id)->first(); - $count = Ticket_Thread::where('ticket_id', '=', $ticket->id)->count(); - $attachment = Ticket_attachments::where('thread_id', '=', $threads->id)->get(); - $attachCount = count($attachment); - if ($attachCount > 0) { - $attachString = ' '; - } else { - $attachString = ''; - } - - return "id])."' title='".$subject->title."'>".$string." (".$count.")".$collabString.$attachString; - }) - ->addColumn('ticket_number', function ($ticket) { - return "id])."' title='".$ticket->ticket_number."'>#".$ticket->ticket_number.''; - }) - ->addColumn('priority', function ($ticket) { - $priority = DB::table('ticket_priority')->select('priority_desc', 'priority_color')->where('priority_id', '=', $ticket->priority_id)->first(); - - return ''.$priority->priority_desc.''; - }) - ->addColumn('from', function ($ticket) { - $from = DB::table('users')->select('user_name')->where('id', '=', $ticket->user_id)->first(); - - return "".$from->user_name.''; - }) - ->addColumn('Last Replier', function ($ticket) { - $TicketData = Ticket_Thread::where('ticket_id', '=', $ticket->id)->where('is_internal', '!=', 1)->max('id'); - $TicketDatarow = Ticket_Thread::where('id', '=', $TicketData)->first(); - $LastResponse = User::where('id', '=', $TicketDatarow->user_id)->first(); - if ($LastResponse->role == 'user') { - $rep = '#F39C12'; - $username = $LastResponse->user_name; - } else { - $rep = '#000'; - $username = $LastResponse->first_name.' '.$LastResponse->last_name; - if ($LastResponse->first_name == null || $LastResponse->last_name == null) { - $username = $LastResponse->user_name; - } - } - - return "".$username.''; - }) - ->addColumn('assigned_to', function ($ticket) { - if ($ticket->assigned_to == null) { - return "Usernassigned"; - } else { - $assign = DB::table('users')->where('id', '=', $ticket->assigned_to)->first(); - - return "".$assign->first_name.' '.$assign->last_name.''; - } - }) - ->addColumn('Last', function ($ticket) { - $TicketData = Ticket_Thread::where('ticket_id', '=', $ticket->id)->max('id'); - $TicketDatarow = Ticket_Thread::select('updated_at')->where('id', '=', $TicketData)->first(); - - return UTC::usertimezone($TicketDatarow->updated_at); - }) - ->searchColumns('subject', 'from', 'assigned_to', 'ticket_number', 'priority') - ->orderColumns('subject', 'from', 'assigned_to', 'Last Replier', 'ticket_number', 'priority', 'Last') - ->make(); + return $this->getTable($tickets); } /** @@ -611,89 +234,7 @@ class TicketController extends Controller $tickets = Tickets::where('status', '=', 1)->where('assigned_to', '>', 0)->where('dept_id', '=', $dept->id)->get(); } - return \Datatable::collection(new Collection($tickets)) - ->addColumn('id', function ($ticket) { - return ""; - }) - ->addColumn('subject', function ($ticket) { - $subject = DB::table('ticket_thread')->select('title')->where('ticket_id', '=', $ticket->id)->first(); - if (isset($subject->title)) { - $string = $subject->title; - if (strlen($string) > 20) { - $stringCut = substr($string, 0, 30); - $string = substr($stringCut, 0, strrpos($stringCut, ' ')).' ...'; - } - } else { - $string = '(no subject)'; - } - //collabrations - $collaborators = DB::table('ticket_collaborator')->where('ticket_id', '=', $ticket->id)->get(); - $collab = count($collaborators); - if ($collab > 0) { - $collabString = ' '; - } else { - $collabString = null; - } - $threads = Ticket_Thread::where('ticket_id', '=', $ticket->id)->first(); - $count = Ticket_Thread::where('ticket_id', '=', $ticket->id)->count(); - $attachment = Ticket_attachments::where('thread_id', '=', $threads->id)->get(); - $attachCount = count($attachment); - if ($attachCount > 0) { - $attachString = ' '; - } else { - $attachString = ''; - } - - return "id])."' title='".$subject->title."'>".$string." (".$count.")".$collabString.$attachString; - }) - ->addColumn('ticket_number', function ($ticket) { - return "id])."' title='".$ticket->ticket_number."'>#".$ticket->ticket_number.''; - }) - ->addColumn('priority', function ($ticket) { - $priority = DB::table('ticket_priority')->select('priority_desc', 'priority_color')->where('priority_id', '=', $ticket->priority_id)->first(); - - return ''.$priority->priority_desc.''; - }) - ->addColumn('from', function ($ticket) { - $from = DB::table('users')->select('user_name')->where('id', '=', $ticket->user_id)->first(); - - return "".$from->user_name.''; - }) - ->addColumn('Last Replier', function ($ticket) { - $TicketData = Ticket_Thread::where('ticket_id', '=', $ticket->id)->where('is_internal', '!=', 1)->max('id'); - $TicketDatarow = Ticket_Thread::where('id', '=', $TicketData)->first(); - $LastResponse = User::where('id', '=', $TicketDatarow->user_id)->first(); - if ($LastResponse->role == 'user') { - $rep = '#F39C12'; - $username = $LastResponse->user_name; - } else { - $rep = '#000'; - $username = $LastResponse->first_name.' '.$LastResponse->last_name; - if ($LastResponse->first_name == null || $LastResponse->last_name == null) { - $username = $LastResponse->user_name; - } - } - - return "".$username.''; - }) - ->addColumn('assigned_to', function ($ticket) { - if ($ticket->assigned_to == null) { - return "Usernassigned"; - } else { - $assign = DB::table('users')->where('id', '=', $ticket->assigned_to)->first(); - - return "".$assign->first_name.' '.$assign->last_name.''; - } - }) - ->addColumn('Last', function ($ticket) { - $TicketData = Ticket_Thread::where('ticket_id', '=', $ticket->id)->max('id'); - $TicketDatarow = Ticket_Thread::select('updated_at')->where('id', '=', $TicketData)->first(); - - return UTC::usertimezone($TicketDatarow->updated_at); - }) - ->searchColumns('subject', 'from', 'assigned_to', 'ticket_number', 'priority') - ->orderColumns('subject', 'from', 'assigned_to', 'Last Replier', 'ticket_number', 'priority', 'Last') - ->make(); + return $this->getTable($tickets); } /** @@ -767,9 +308,12 @@ class TicketController extends Controller return redirect()->route('check_ticket', compact('ticket_id')); } + $avg = DB::table('ticket_thread')->where('ticket_id', '=', $id)->where('reply_rating', '!=', 0)->avg('reply_rating'); + $avg_rate = explode('.', $avg); + $avg_rating = $avg_rate[0]; $thread = Ticket_Thread::where('ticket_id', '=', $id)->first(); - return view('themes.default1.agent.helpdesk.ticket.timeline', compact('tickets'), compact('thread')); + return view('themes.default1.agent.helpdesk.ticket.timeline', compact('tickets'), compact('thread', 'avg_rating')); } /** @@ -874,6 +418,7 @@ class TicketController extends Controller $emails = Emails::where('department', '=', $tickets->dept_id)->first(); try { + $this->NotificationController->create($ticket_id, Auth::user()->id, '2'); $this->PhpMailController->sendmail( $from = $this->PhpMailController->mailfrom('0', $tickets->dept_id), $to = ['name' => $user_name, 'email' => $email, 'cc' => $collaborators], $message = ['subject' => $ticket_subject.'[#'.$ticket_number.']', 'body' => $request->input('reply_content'), 'scenario' => 'ticket-reply', 'attachments' => $attachment_files], $template_variables = ['ticket_number' => $ticket_number, 'user' => $username, 'agent_sign' => $agentsign] ); @@ -1003,7 +548,7 @@ class TicketController extends Controller * * @return type bool */ - public function create_user($emailadd, $username, $subject, $body, $phone, $helptopic, $sla, $priority, $source, $headers, $dept, $assignto, $from_data, $auto_response) + public function create_user($emailadd, $username, $subject, $body, $phone, $helptopic, $sla, $priority, $source, $headers, $dept, $assignto, $from_data, $auto_response, $status) { // define global variables $email; @@ -1044,7 +589,7 @@ class TicketController extends Controller $username = $checkemail->user_name; $user_id = $checkemail->id; } - $ticket_number = $this->check_ticket($user_id, $subject, $body, $helptopic, $sla, $priority, $source, $headers, $dept, $assignto, $from_data); + $ticket_number = $this->check_ticket($user_id, $subject, $body, $helptopic, $sla, $priority, $source, $headers, $dept, $assignto, $from_data, $status); $ticket_number2 = $ticket_number[0]; $ticketdata = Tickets::where('ticket_number', '=', $ticket_number2)->first(); $threaddata = Ticket_Thread::where('ticket_id', '=', $ticketdata->id)->first(); @@ -1175,7 +720,7 @@ class TicketController extends Controller * * @return type string */ - public function check_ticket($user_id, $subject, $body, $helptopic, $sla, $priority, $source, $headers, $dept, $assignto, $form_data) + public function check_ticket($user_id, $subject, $body, $helptopic, $sla, $priority, $source, $headers, $dept, $assignto, $form_data, $status) { $read_ticket_number = explode('[#', $subject); if (isset($read_ticket_number[1])) { @@ -1218,12 +763,12 @@ class TicketController extends Controller } } } else { - $ticket_number = $this->createTicket($user_id, $subject, $body, $helptopic, $sla, $priority, $source, $headers, $dept, $assignto, $form_data); + $ticket_number = $this->createTicket($user_id, $subject, $body, $helptopic, $sla, $priority, $source, $headers, $dept, $assignto, $form_data, $status); return [$ticket_number, 0]; } } else { - $ticket_number = $this->createTicket($user_id, $subject, $body, $helptopic, $sla, $priority, $source, $headers, $dept, $assignto, $form_data); + $ticket_number = $this->createTicket($user_id, $subject, $body, $helptopic, $sla, $priority, $source, $headers, $dept, $assignto, $form_data, $status); return [$ticket_number, 0]; } @@ -1241,7 +786,7 @@ class TicketController extends Controller * * @return type string */ - public function createTicket($user_id, $subject, $body, $helptopic, $sla, $priority, $source, $headers, $dept, $assignto, $form_data) + public function createTicket($user_id, $subject, $body, $helptopic, $sla, $priority, $source, $headers, $dept, $assignto, $form_data, $status) { $max_number = Tickets::whereRaw('id = (select max(`id`) from tickets)')->first(); if ($max_number == null) { @@ -1259,9 +804,14 @@ class TicketController extends Controller $ticket->help_topic_id = $helptopic; $ticket->sla = $sla; $ticket->assigned_to = $assignto; - $ticket->status = '1'; + $ticket->priority_id = $priority; $ticket->source = $source; + if ($status == null) { + $ticket->status = 1; + } else { + $ticket->status = $status; + } $ticket->save(); $sla_plan = Sla_plan::where('id', '=', $sla)->first(); @@ -1272,7 +822,7 @@ class TicketController extends Controller $ticket_number = $ticket->ticket_number; $id = $ticket->id; - + $this->NotificationController->create($id, $user_id, '3'); // store Form Data // Form Data comes from raising a ticket from client panel if ($form_data != null) { @@ -1407,7 +957,11 @@ class TicketController extends Controller $thread->ticket_id = $ticket_status->id; $thread->user_id = Auth::user()->id; $thread->is_internal = 1; - $thread->body = $ticket_status_message->message.' '.Auth::user()->first_name.' '.Auth::user()->last_name; + if (Auth::user()->first_name != null) { + $thread->body = $ticket_status_message->message.' '.Auth::user()->first_name.' '.Auth::user()->last_name; + } else { + $thread->body = $ticket_status_message->message.' '.Auth::user()->user_name; + } $thread->save(); return 'your ticket'.$ticket_status->ticket_number.' has been resolved'; @@ -1750,89 +1304,7 @@ class TicketController extends Controller $tickets = Tickets::where('status', '=', 5)->where('dept_id', '=', $dept->id)->get(); } - return \Datatable::collection(new Collection($tickets)) - ->addColumn('id', function ($ticket) { - return ""; - }) - ->addColumn('subject', function ($ticket) { - $subject = DB::table('ticket_thread')->select('title')->where('ticket_id', '=', $ticket->id)->first(); - if (isset($subject->title)) { - $string = $subject->title; - if (strlen($string) > 20) { - $stringCut = substr($string, 0, 30); - $string = substr($stringCut, 0, strrpos($stringCut, ' ')).' ...'; - } - } else { - $string = '(no subject)'; - } - //collabrations - $collaborators = DB::table('ticket_collaborator')->where('ticket_id', '=', $ticket->id)->get(); - $collab = count($collaborators); - if ($collab > 0) { - $collabString = ' '; - } else { - $collabString = null; - } - $threads = Ticket_Thread::where('ticket_id', '=', $ticket->id)->first(); - $count = Ticket_Thread::where('ticket_id', '=', $ticket->id)->count(); - $attachment = Ticket_attachments::where('thread_id', '=', $threads->id)->get(); - $attachCount = count($attachment); - if ($attachCount > 0) { - $attachString = ' '; - } else { - $attachString = ''; - } - - return "id])."' title='".$subject->title."'>".$string." (".$count.")".$collabString.$attachString; - }) - ->addColumn('ticket_number', function ($ticket) { - return "id])."' title='".$ticket->ticket_number."'>#".$ticket->ticket_number.''; - }) - ->addColumn('priority', function ($ticket) { - $priority = DB::table('ticket_priority')->select('priority_desc', 'priority_color')->where('priority_id', '=', $ticket->priority_id)->first(); - - return ''.$priority->priority_desc.''; - }) - ->addColumn('from', function ($ticket) { - $from = DB::table('users')->select('user_name')->where('id', '=', $ticket->user_id)->first(); - - return "".$from->user_name.''; - }) - ->addColumn('Last Replier', function ($ticket) { - $TicketData = Ticket_Thread::where('ticket_id', '=', $ticket->id)->where('is_internal', '!=', 1)->max('id'); - $TicketDatarow = Ticket_Thread::where('id', '=', $TicketData)->first(); - $LastResponse = User::where('id', '=', $TicketDatarow->user_id)->first(); - if ($LastResponse->role == 'user') { - $rep = '#F39C12'; - $username = $LastResponse->user_name; - } else { - $rep = '#000'; - $username = $LastResponse->first_name.' '.$LastResponse->last_name; - if ($LastResponse->first_name == null || $LastResponse->last_name == null) { - $username = $LastResponse->user_name; - } - } - - return "".$username.''; - }) - ->addColumn('assigned_to', function ($ticket) { - if ($ticket->assigned_to == null) { - return "Unassigned"; - } else { - $assign = DB::table('users')->where('id', '=', $ticket->assigned_to)->first(); - - return "".$assign->first_name.' '.$assign->last_name.''; - } - }) - ->addColumn('Last', function ($ticket) { - $TicketData = Ticket_Thread::where('ticket_id', '=', $ticket->id)->max('id'); - $TicketDatarow = Ticket_Thread::select('updated_at')->where('id', '=', $TicketData)->first(); - - return UTC::usertimezone($TicketDatarow->updated_at); - }) - ->searchColumns('subject', 'from', 'assigned_to', 'ticket_number', 'priority') - ->orderColumns('subject', 'from', 'assigned_to', 'Last Replier', 'ticket_number', 'priority', 'Last') - ->make(); + return $this->getTable($tickets); } /** @@ -1854,89 +1326,7 @@ class TicketController extends Controller $tickets = Tickets::where('assigned_to', '=', null)->where('dept_id', '=', $dept->id)->get(); } - return \Datatable::collection(new Collection($tickets)) - ->addColumn('id', function ($ticket) { - return ""; - }) - ->addColumn('subject', function ($ticket) { - $subject = DB::table('ticket_thread')->select('title')->where('ticket_id', '=', $ticket->id)->first(); - if (isset($subject->title)) { - $string = $subject->title; - if (strlen($string) > 20) { - $stringCut = substr($string, 0, 30); - $string = substr($stringCut, 0, strrpos($stringCut, ' ')).' ...'; - } - } else { - $string = '(no subject)'; - } - //collabrations - $collaborators = DB::table('ticket_collaborator')->where('ticket_id', '=', $ticket->id)->get(); - $collab = count($collaborators); - if ($collab > 0) { - $collabString = ' '; - } else { - $collabString = null; - } - $threads = Ticket_Thread::where('ticket_id', '=', $ticket->id)->first(); - $count = Ticket_Thread::where('ticket_id', '=', $ticket->id)->count(); - $attachment = Ticket_attachments::where('thread_id', '=', $threads->id)->get(); - $attachCount = count($attachment); - if ($attachCount > 0) { - $attachString = ' '; - } else { - $attachString = ''; - } - - return "id])."' title='".$subject->title."'>".$string." (".$count.")".$collabString.$attachString; - }) - ->addColumn('ticket_number', function ($ticket) { - return "id])."' title='".$ticket->ticket_number."'>#".$ticket->ticket_number.''; - }) - ->addColumn('priority', function ($ticket) { - $priority = DB::table('ticket_priority')->select('priority_desc', 'priority_color')->where('priority_id', '=', $ticket->priority_id)->first(); - - return ''.$priority->priority_desc.''; - }) - ->addColumn('from', function ($ticket) { - $from = DB::table('users')->select('user_name')->where('id', '=', $ticket->user_id)->first(); - - return "".$from->user_name.''; - }) - ->addColumn('Last Replier', function ($ticket) { - $TicketData = Ticket_Thread::where('ticket_id', '=', $ticket->id)->where('is_internal', '!=', 1)->max('id'); - $TicketDatarow = Ticket_Thread::where('id', '=', $TicketData)->first(); - $LastResponse = User::where('id', '=', $TicketDatarow->user_id)->first(); - if ($LastResponse->role == 'user') { - $rep = '#F39C12'; - $username = $LastResponse->user_name; - } else { - $rep = '#000'; - $username = $LastResponse->first_name.' '.$LastResponse->last_name; - if ($LastResponse->first_name == null || $LastResponse->last_name == null) { - $username = $LastResponse->user_name; - } - } - - return "".$username.''; - }) - ->addColumn('assigned_to', function ($ticket) { - if ($ticket->assigned_to == null) { - return "Unassigned"; - } else { - $assign = DB::table('users')->where('id', '=', $ticket->assigned_to)->first(); - - return "".$assign->first_name.' '.$assign->last_name.''; - } - }) - ->addColumn('Last', function ($ticket) { - $TicketData = Ticket_Thread::where('ticket_id', '=', $ticket->id)->max('id'); - $TicketDatarow = Ticket_Thread::select('updated_at')->where('id', '=', $TicketData)->first(); - - return UTC::usertimezone($TicketDatarow->updated_at); - }) - ->searchColumns('subject', 'from', 'assigned_to', 'ticket_number', 'priority') - ->orderColumns('subject', 'from', 'assigned_to', 'Last Replier', 'ticket_number', 'priority', 'Last') - ->make(); + return $this->getTable($tickets); } /** @@ -2015,9 +1405,9 @@ class TicketController extends Controller $ticket_collaborator->role = 'ccc'; $ticket_collaborator->save(); - return '

    Success!

    '.$data->user_name.'

    '.$data->email.'
    '; + return '

    Success!

    '.$data->user_name.'

    '.$data->email.'
    '; } else { - return '

    '.$data->user_name.'

    '.$data->email.'
    This user already Collaborated
    '; + return '

    '.$data->user_name.'

    '.$data->email.'
    This user already Collaborated
    '; } } @@ -2035,7 +1425,7 @@ class TicketController extends Controller $ticket_id = Input::get('ticket_id'); $user_search = User::where('email', '=', $email)->first(); if (isset($user_serach)) { - return '

    Alert!

    This user already Exists
    '; + return '

    Alert!

    This user already Exists
    '; } else { $company = $this->company(); $user = new User(); @@ -2057,7 +1447,7 @@ class TicketController extends Controller $ticket_collaborator->role = 'ccc'; $ticket_collaborator->save(); - return '

    '.$user->user_name.'

    '.$user->email.'
    '; + return '

    '.$user->user_name.'

    '.$user->email.'
    '; } } @@ -2100,8 +1490,34 @@ class TicketController extends Controller $ticket->reopened_at = date('Y-m-d H:i:s'); $ticket->closed = 0; $ticket->closed_at = null; - $ticket->save(); + } elseif ($value == 'Clean up') { + $thread = Ticket_Thread::where('ticket_id', '=', $ticket->id)->get(); + foreach ($thread as $th_id) { + // echo $th_id->id." "; + $attachment = Ticket_attachments::where('thread_id', '=', $th_id->id)->get(); + if (count($attachment)) { + foreach ($attachment as $a_id) { + echo $a_id->id.' '; + $attachment = Ticket_attachments::find($a_id->id); + $attachment->delete(); + } + // echo "
    "; + } + $thread = Ticket_Thread::find($th_id->id); +// dd($thread); + $thread->delete(); + } + $collaborators = Ticket_Collaborator::where('ticket_id', '=', $ticket->id)->get(); + if (count($collaborators)) { + foreach ($collaborators as $collab_id) { + echo $collab_id->id; + $collab = Ticket_Collaborator::find($collab_id->id); + $collab->delete(); + } + } + $tickets = Tickets::find($ticket->id); + $tickets->delete(); } } if ($value == 'Delete') { @@ -2110,6 +1526,8 @@ class TicketController extends Controller return redirect()->back()->with('success', 'Tickets has been Closed'); } elseif ($value == 'Open') { return redirect()->back()->with('success', 'Ticket has been Opened'); + } else { + return redirect()->back()->with('success', Lang::get('lang.hard-delete-success-message')); } } @@ -2137,6 +1555,34 @@ class TicketController extends Controller return $date; } + /** + *adding offset to updated_at time. + * + *@return date + */ + public static function timeOffset($utc) + { + $set = System::whereId('1')->first(); + $timezone = Timezones::whereId($set->time_zone)->first(); + $tz = $timezone->name; + date_default_timezone_set($tz); + $offset = date('Z', strtotime($utc)); + + return $offset; + } + + /** + * to get user date time format. + * + *@return string + */ + public static function getDateTimeFormat() + { + $set = System::select('date_time_format')->whereId('1')->first(); + + return $set->date_time_format; + } + /** * lock. * @@ -2228,8 +1674,15 @@ class TicketController extends Controller */ public function ratingReply($id, $rating) { - Tickets::where('id', $id)->update(['ratingreply' => $rating]); - + $thread = Ticket_Thread::whereId($id)->first(); +// $last_average = $thread->reply_rating; +//$total_numbers = $thread->rating_count; +//$new_number = $rating; +//$new_average = (($last_average * $total_numbers) + $new_number) / ($total_numbers + 1); +//$thread->rating_count += 1; +$thread->reply_rating = $rating; + $thread->save(); +// $thread->set('rating_count', 'rating_count+1', FALSE)->update(['ratingreply' => $new_average]); return redirect()->back()->with('Success', 'Thank you for your rating!'); } @@ -2489,7 +1942,7 @@ class TicketController extends Controller if (!empty(Input::get('reason'))) { $reason = Input::get('reason'); } else { - $reason = ''; + $reason = Lang::get('lang.no-reason'); } if (!empty(Input::get('title'))) { Ticket_thread::where('ticket_id', '=', $p_id)->first() @@ -2505,7 +1958,7 @@ class TicketController extends Controller $new_thread->title = $thread->title; $new_thread->body = Lang::get('lang.get_merge_message'). "  #".$parent_ticket->ticket_number.'
    '.$reason; + "'>#".$parent_ticket->ticket_number.'

    '.Lang::get('lang.merge-reason').''.$reason; $new_thread->format = $thread->format; $new_thread->ip_address = $thread->ip_address; @@ -2516,7 +1969,7 @@ class TicketController extends Controller $new_parent_thread->source = $parent_thread->source; $new_parent_thread->is_internal = 1; $new_parent_thread->title = $thread->title; - $new_parent_thread->body = Lang::get('lang.ticket')." #".$ticket->ticket_number.' '.Lang::get('lang.ticket_merged').'
    '.$reason; + $new_parent_thread->body = Lang::get('lang.ticket')." #".$ticket->ticket_number.' '.Lang::get('lang.ticket_merged').'

    '.Lang::get('lang.merge-reason').''.$reason; $new_parent_thread->format = $parent_thread->format; $new_parent_thread->ip_address = $parent_thread->ip_address; if ($new_thread->save() && $new_parent_thread->save()) { @@ -2539,4 +1992,111 @@ class TicketController extends Controller echo "'; } } + + /* + *chumper's function to return data to chumper datatable. + *@param Array-object $tickets + * + *@return Array-object + */ + public static function getTable($tickets) + { + return \Datatable::collection(new Collection($tickets)) + ->addColumn('id', function ($ticket) { + return ""; + }) + ->addColumn('subject', function ($ticket) { + $subject = DB::table('ticket_thread')->select('title')->where('ticket_id', '=', $ticket->id)->first(); + if (isset($subject->title)) { + $string = $subject->title; + if (strlen($string) > 20) { + $stringCut = substr($string, 0, 30); + $string = substr($stringCut, 0, strrpos($stringCut, ' ')).' ...'; + } + } else { + $string = '(no subject)'; + } + //collabrations + $collaborators = DB::table('ticket_collaborator')->where('ticket_id', '=', $ticket->id)->get(); + $collab = count($collaborators); + if ($collab > 0) { + $collabString = ' '; + } else { + $collabString = null; + } + $threads = Ticket_Thread::where('ticket_id', '=', $ticket->id)->first(); // + $count = Ticket_Thread::where('ticket_id', '=', $ticket->id)->count(); // + $attachment = Ticket_attachments::where('thread_id', '=', $threads->id)->get(); + $attachCount = count($attachment); + if ($attachCount > 0) { + $attachString = ' '; + } else { + $attachString = ''; + } + + return "id])."' title='".$subject->title."'>".ucfirst($string)." (".$count.")".$collabString.$attachString; + }) + ->addColumn('ticket_number', function ($ticket) { + return "id])."' title='".$ticket->ticket_number."'>#".$ticket->ticket_number.''; + }) + ->addColumn('priority', function ($ticket) { + $TicketData = Ticket_Thread::where('ticket_id', '=', $ticket->id)->where('is_internal', '=', 0)->max('id'); + $TicketDatarow = Ticket_Thread::where('id', '=', $TicketData)->first(); + $LastResponse = User::where('id', '=', $TicketDatarow->user_id)->first(); + if ($LastResponse->role == 'user') { + $rep = '#F39C12'; + $username = $LastResponse->user_name; + } else { + $rep = '#000'; + $username = $LastResponse->first_name.' '.$LastResponse->last_name; + if ($LastResponse->first_name == null || $LastResponse->last_name == null) { + $username = $LastResponse->user_name; + } + } + $priority = DB::table('ticket_priority')->select('priority_desc', 'priority_color')->where('priority_id', '=', $ticket->priority_id)->first(); + + return ''.ucfirst($priority->priority_desc).''; + }) + ->addColumn('from', function ($ticket) { + $from = DB::table('users')->select('user_name')->where('id', '=', $ticket->user_id)->first(); + + return "user_name).'''.Lang::get('lang.see-profile2')."'>".ucfirst($from->user_name).''; + }) + // ->addColumn('Last Replier', function ($ticket) { + // $TicketData = Ticket_Thread::where('ticket_id', '=', $ticket->id)->where('is_internal', '=', 0)->max('id'); + // $TicketDatarow = Ticket_Thread::where('id', '=', $TicketData)->first(); + // $LastResponse = User::where('id', '=', $TicketDatarow->user_id)->first(); + // if ($LastResponse->role == 'user') { + // $rep = '#F39C12'; + // $username = $LastResponse->user_name; + // } else { + // $rep = '#000'; + // $username = $LastResponse->first_name.' '.$LastResponse->last_name; + // if ($LastResponse->first_name == null || $LastResponse->last_name == null) { + // $username = $LastResponse->user_name; + // } + // } + + // return "".ucfirst($username).''; + // }) + ->addColumn('assigned_to', function ($ticket) { + if ($ticket->assigned_to == null) { + return "Unassigned"; + } else { + $assign = DB::table('users')->where('id', '=', $ticket->assigned_to)->first(); + + return "first_name).'''.Lang::get('lang.see-profile2')."'>".ucfirst($assign->first_name).' '.ucfirst($assign->last_name).''; + } + }) + ->addColumn('Last', function ($ticket) { + $TicketData = Ticket_Thread::where('ticket_id', '=', $ticket->id)->max('id'); + $TicketDatarow = Ticket_Thread::select('updated_at')->where('id', '=', $TicketData)->first(); + + // return UTC::usertimezone($TicketDatarow->updated_at); + return date('Y-m-d H:i:s', strtotime($TicketDatarow->updated_at) + UTC::timeOffset($TicketDatarow->updated_at)); + }) + ->searchColumns('subject', 'from', 'assigned_to', 'ticket_number', 'priority') + ->orderColumns('subject', 'from', 'assigned_to', 'Last Replier', 'ticket_number', 'priority', 'Last') + ->make(); + } } diff --git a/app/Http/Controllers/Agent/helpdesk/TicketWorkflowController.php b/app/Http/Controllers/Agent/helpdesk/TicketWorkflowController.php new file mode 100644 index 000000000..93ed3f1f1 --- /dev/null +++ b/app/Http/Controllers/Agent/helpdesk/TicketWorkflowController.php @@ -0,0 +1,510 @@ + + */ +class TicketWorkflowController extends Controller +{ + /** + * constructor + * Create a new controller instance. + * + * @param type TicketController $TicketController + */ + public function __construct(TicketController $TicketController) + { + $this->TicketController = $TicketController; + } + + /** + * This is the core function from where the workflow is applied. + * + * @return type response + */ + public function workflow($fromaddress, $fromname, $subject, $body, $phone, $helptopic, $sla, $priority, $source, $collaborator, $dept, $assign, $team_assign, $ticket_status, $form_data, $auto_response) + { + $contact_details = ['email' => $fromaddress, 'email_name' => $fromname, 'subject' => $subject, 'message' => $body]; + $ticket_settings_details = ['help_topic' => $helptopic, 'sla' => $sla, 'priority' => $priority, 'source' => $source, 'dept' => $dept, 'assign' => $assign, 'team' => $team_assign, 'status' => $ticket_status, 'reject' => false]; + // get all the workflow common to the entire system which includes any type of ticket creation where the execution order of the workflow should be starting with ascending order + $workflows = WorkflowName::where('target', '=', 'A-0')->where('status', '=', '1')->orderBy('order', 'asc')->get(); + foreach ($workflows as $workflow) { + // checking if any workflow defined in the system + if ($workflow) { + // get all the rules of workflow which has a foreign key of those workflow which are applied to creating any ticket from any source + $worklfow_rules = WorkflowRules::where('workflow_id', '=', $workflow->id)->get(); + foreach ($worklfow_rules as $worklfow_rule) { + // checking for the workflow rules to which workflow rule type it is + if ($worklfow_rule->matching_scenario == 'email') { + if ($rule_condition = $this->checkRuleCondition($contact_details['email'], $worklfow_rule->matching_relation, $worklfow_rule->matching_value) == true) { + $ticket_settings_details = $this->applyActionCondition($workflow->id, $ticket_settings_details); + } + } elseif ($worklfow_rule->matching_scenario == 'email_name') { + if ($rule_condition = $this->checkRuleCondition($contact_details['email_name'], $worklfow_rule->matching_relation, $worklfow_rule->matching_value) == true) { + $ticket_settings_details = $this->applyActionCondition($workflow->id, $ticket_settings_details); + } + } elseif ($worklfow_rule->matching_scenario == 'subject') { + if ($rule_condition = $this->checkRuleCondition($contact_details['subject'], $worklfow_rule->matching_relation, $worklfow_rule->matching_value) == true) { + $ticket_settings_details = $this->applyActionCondition($workflow->id, $ticket_settings_details); + } + } elseif ($worklfow_rule->matching_scenario == 'message') { + if ($rule_condition = $this->checkRuleCondition($contact_details['message'], $worklfow_rule->matching_relation, $worklfow_rule->matching_value) == true) { + $ticket_settings_details = $this->applyActionCondition($workflow->id, $ticket_settings_details); + } + } + } + } + } + if ($source == 1) { + // get all the workflow which are applied to ticket generated via webforms and in ascending order + $workflows_webs = WorkflowName::where('target', '=', 'A-1')->where('status', '=', '1')->orderBy('order', 'asc')->get(); + foreach ($workflows_webs as $workflows_web) { + if ($workflows_web) { + $worklfow_rules = WorkflowRules::where('workflow_id', '=', $workflows_web->id)->get(); + foreach ($worklfow_rules as $worklfow_rule) { + if ($worklfow_rule) { + // checking for the workflow rules to which workflow rule type it is + if ($worklfow_rule->matching_scenario == 'email') { + if ($this->checkRuleCondition($contact_details['email'], $worklfow_rule->matching_relation, $worklfow_rule->matching_value) == true) { + $ticket_settings_details = $this->applyActionCondition($workflows_web->id, $ticket_settings_details); + } + } elseif ($worklfow_rule->matching_scenario == 'email_name') { + if ($this->checkRuleCondition($contact_details['email_name'], $worklfow_rule->matching_relation, $worklfow_rule->matching_value) == true) { + $ticket_settings_details = $this->applyActionCondition($workflows_web->id, $ticket_settings_details); + } + } elseif ($worklfow_rule->matching_scenario == 'subject') { + if ($this->checkRuleCondition($contact_details['subject'], $worklfow_rule->matching_relation, $worklfow_rule->matching_value) == true) { + $ticket_settings_details = $this->applyActionCondition($workflows_web->id, $ticket_settings_details); + } + } elseif ($worklfow_rule->matching_scenario == 'message') { + if ($this->checkRuleCondition($contact_details['message'], $worklfow_rule->matching_relation, $worklfow_rule->matching_value) == true) { + $ticket_settings_details = $this->applyActionCondition($workflows_web->id, $ticket_settings_details); + } + } + } + } + } + } + } + if ($source == 2) { + // get all the workflow which are applied to ticket generated via emails and in ascending order + $workflows_emails = WorkflowName::where('target', '=', 'A-2')->where('status', '=', '1')->orderBy('order', 'asc')->get(); + foreach ($workflows_emails as $workflows_email) { + if ($workflows_email) { + $worklfow_rules = WorkflowRules::where('workflow_id', '=', $workflows_email->id)->get(); + foreach ($worklfow_rules as $worklfow_rule) { + if ($worklfow_rule) { + // checking for the workflow rules to which workflow rule type it is + if ($worklfow_rule->matching_scenario == 'email') { + if ($rule_condition = $this->checkRuleCondition($contact_details['email'], $worklfow_rule->matching_relation, $worklfow_rule->matching_value) == true) { + $ticket_settings_details = $this->applyActionCondition($workflows_email->id, $ticket_settings_details); + } + } elseif ($worklfow_rule->matching_scenario == 'email_name') { + if ($rule_condition = $this->checkRuleCondition($contact_details['email_name'], $worklfow_rule->matching_relation, $worklfow_rule->matching_value) == true) { + $ticket_settings_details = $this->applyActionCondition($workflows_email->id, $ticket_settings_details); + } + } elseif ($worklfow_rule->matching_scenario == 'subject') { + if ($rule_condition = $this->checkRuleCondition($contact_details['subject'], $worklfow_rule->matching_relation, $worklfow_rule->matching_value) == true) { + $ticket_settings_details = $this->applyActionCondition($workflows_email->id, $ticket_settings_details); + } + } elseif ($worklfow_rule->matching_scenario == 'message') { + if ($rule_condition = $this->checkRuleCondition($contact_details['message'], $worklfow_rule->matching_relation, $worklfow_rule->matching_value) == true) { + $ticket_settings_details = $this->applyActionCondition($workflows_email->id, $ticket_settings_details); + } + } + } + } + } + } + } + if ($source == 4) { + // get all the workflow which are applied to ticket generated via API and in ascending order + $workflows_apis = WorkflowName::where('target', '=', 'A-4')->where('status', '=', '1')->orderBy('order', 'asc')->get(); + foreach ($workflows_apis as $workflows_api) { + if ($workflows_api) { + $worklfow_rules = WorkflowRules::where('workflow_id', '=', $workflows_api->id)->get(); + foreach ($worklfow_rules as $worklfow_rule) { + if ($worklfow_rule) { + // checking for the workflow rules to which workflow rule type it is + if ($worklfow_rule->matching_scenario == 'email') { + if ($rule_condition = $this->checkRuleCondition($contact_details['email'], $worklfow_rule->matching_relation, $worklfow_rule->matching_value) == true) { + $ticket_settings_details = $this->applyActionCondition($workflows_api->id, $ticket_settings_details); + } + } elseif ($worklfow_rule->matching_scenario == 'email_name') { + if ($rule_condition = $this->checkRuleCondition($contact_details['email_name'], $worklfow_rule->matching_relation, $worklfow_rule->matching_value) == true) { + $ticket_settings_details = $this->applyActionCondition($workflows_api->id, $ticket_settings_details); + } + } elseif ($worklfow_rule->matching_scenario == 'subject') { + if ($rule_condition = $this->checkRuleCondition($contact_details['subject'], $worklfow_rule->matching_relation, $worklfow_rule->matching_value) == true) { + $ticket_settings_details = $this->applyActionCondition($workflows_api->id, $ticket_settings_details); + } + } elseif ($worklfow_rule->matching_scenario == 'message') { + if ($rule_condition = $this->checkRuleCondition($contact_details['message'], $worklfow_rule->matching_relation, $worklfow_rule->matching_value) == true) { + $ticket_settings_details = $this->applyActionCondition($workflows_api->id, $ticket_settings_details); + } + } + } + } + } + } + } + if ($ticket_settings_details['reject'] == true) { + return ['0' => false, '1' => false]; + } else { + $create_ticket = $this->TicketController->create_user($contact_details['email'], $contact_details['email_name'], $contact_details['subject'], $contact_details['message'], $phone, $ticket_settings_details['help_topic'], $ticket_settings_details['sla'], $ticket_settings_details['priority'], $source, $collaborator, $ticket_settings_details['dept'], $ticket_settings_details['assign'], $form_data, $auto_response, $ticket_settings_details['status']); + + return $create_ticket; + } + } + + /** + * function to check the rules applied to the ticket workflow. + * + * @param type $to_check + * @param type $condition + * @param type $statement + * + * @return type boolean + */ + public function checkRuleCondition($to_check, $condition, $statement) + { + if ($condition == 'equal') { + $return = $this->checkEqual($statement, $to_check); + } elseif ($condition == 'not_equal') { + $return = $this->checkNotEqual($statement, $to_check); + } elseif ($condition == 'contains') { + $return = $this->checkContains($statement, $to_check); + } elseif ($condition == 'dn_contain') { + $return = $this->checkDoNotContain($statement, $to_check); + } elseif ($condition == 'starts') { + $return = $this->checkStarts($statement, $to_check); + } elseif ($condition == 'ends') { + $return = $this->checkEnds($statement, $to_check); + } +// elseif($condition == 'match') { +// +// } elseif($condition == 'not_match') { +// +// } + return $return; + } + + /** + * function to check if the equal functions are applied. + * + * @param type $statement + * @param type $to_check + * + * @return bool + */ + public function checkEqual($statement, $to_check) + { + if ($statement == $to_check) { + return true; + } else { + return false; + } + } + + /** + * function to check if the not-equal functions are applied. + * + * @param type $statement + * @param type $to_check + * + * @return bool + */ + public function checkNotEqual($statement, $to_check) + { + if ($statement != $to_check) { + return true; + } else { + return false; + } + } + + /** + * function to check if the contains functions are applied. + * + * @param type $statement + * @param type $to_check + * + * @return bool + */ + public function checkContains($statement, $to_check) + { + if (strpos($to_check, $statement) !== false) { + return true; + } else { + return false; + } + } + + /** + * function to check if the do not contain functions are applied. + * + * @param type $statement + * @param type $to_check + * + * @return bool + */ + public function checkDoNotContain($statement, $to_check) + { + if (strpos($to_check, $statement) == false) { + return true; + } else { + return false; + } + } + + /** + * function to check if the start functions are applied. + * + * @param type $statement + * @param type $to_check + * + * @return bool + */ + public function checkStarts($statement, $to_check) + { + if (substr($to_check, 0, strlen($statement)) == $statement) { + return true; + } else { + return false; + } + } + + /** + * function to check if the ends functions are applied. + * + * @param type $statement + * @param type $to_check + * + * @return bool + */ + public function checkEnds($statement, $to_check) + { + $to_check = strip_tags($to_check); + if (substr($to_check, -strlen($statement)) == $statement) { + return true; + } else { + return false; + } + } + +// function startsWith($to_check, $statement) { +// // search backwards starting from haystack length characters from the end +// return $statement === "" || strrpos($to_check, $statement, -strlen($to_check)) !== false; +// } + +// function endsWith($to_check, $statement) { +// // search forward starting from end minus needle length characters +// return $statement === "" || (($temp = strlen($to_check) - strlen($statement)) >= 0 && strpos($to_check, $statement, $temp) !== false); +// } + + /** + * function to apply the action to a ticket. + * + * @param type $workflow_id + * @param type $ticket_settings_details + * + * @return type array + */ + public function applyActionCondition($workflow_id, $ticket_settings_details) + { + $workflow_actions = WorkflowAction::where('workflow_id', '=', $workflow_id)->get(); + foreach ($workflow_actions as $workflow_action) { + if ($workflow_action->condition == 'reject') { + $ticket_settings_details = $this->rejectTicket($ticket_settings_details); + } elseif ($workflow_action->condition == 'department') { + $ticket_settings_details = $this->changeDepartment($workflow_action, $ticket_settings_details); + } elseif ($workflow_action->condition == 'priority') { + $ticket_settings_details = $this->changePriority($workflow_action, $ticket_settings_details); + } elseif ($workflow_action->condition == 'sla') { + $ticket_settings_details = $this->changeSla($workflow_action, $ticket_settings_details); + } elseif ($workflow_action->condition == 'team') { + $ticket_settings_details = $this->changeTeam($workflow_action, $ticket_settings_details); + } elseif ($workflow_action->condition == 'agent') { + $ticket_settings_details = $this->changeAgent($workflow_action, $ticket_settings_details); + } elseif ($workflow_action->condition == 'helptopic') { + $ticket_settings_details = $this->changeHelptopic($workflow_action, $ticket_settings_details); + } elseif ($workflow_action->condition == 'status') { + $ticket_settings_details = $this->changeStatus($workflow_action, $ticket_settings_details); + } + } + + return $ticket_settings_details; + } + + /** + * function to reject ticket. + * + * @param array $ticket_settings_details + * + * @return type array + */ + public function rejectTicket($ticket_settings_details) + { + $ticket_settings_details['reject'] = true; + + return $ticket_settings_details; + } + + /** + * function to change the department of a ticket. + * + * @param type $workflow_action + * @param type $ticket_settings_details + * + * @return type array + */ + public function changeDepartment($workflow_action, $ticket_settings_details) + { + $dept = Department::where('id', '=', $workflow_action->action)->first(); + if ($dept == null) { + return $ticket_settings_details; + } else { + $ticket_settings_details['dept'] = $dept->id; + + return $ticket_settings_details; + } + } + + /** + * function to change the priority of a ticket. + * + * @param type $workflow_action + * @param type $ticket_settings_details + * + * @return type array + */ + public function changePriority($workflow_action, $ticket_settings_details) + { + $priority = Ticket_Priority::where('priority_id', '=', $workflow_action->action)->first(); + if ($priority == null) { + return $ticket_settings_details; + } else { + $ticket_settings_details['priority'] = $priority->priority_id; + + return $ticket_settings_details; + } + } + + /** + * function to change the SLA of a ticket. + * + * @param type $workflow_action + * @param type $ticket_settings_details + * + * @return type array + */ + public function changeSla($workflow_action, $ticket_settings_details) + { + $sla_plan = Sla_plan::where('id', '=', $workflow_action->action)->first(); + if ($sla_plan == null) { + return $ticket_settings_details; + } else { + $ticket_settings_details['sla'] = $sla_plan->id; + + return $ticket_settings_details; + } + } + + /** + * function to assign tean to a ticket. + * + * @param type $workflow_action + * @param type $ticket_settings_details + * + * @return type array + */ + public function changeTeam($workflow_action, $ticket_settings_details) + { + $team = Teams::where('id', '=', $workflow_action->action)->first(); + if ($team == null) { + return $ticket_settings_details; + } else { + $ticket_settings_details['team'] = $team->id; + + return $ticket_settings_details; + } + } + + /** + * function to assing a ticket to an agent. + * + * @param type $workflow_action + * @param type $ticket_settings_details + * + * @return type array + */ + public function changeAgent($workflow_action, $ticket_settings_details) + { + $agent = User::where('id', '=', $workflow_action->action)->where('role', '!=', 'user')->first(); + if ($agent == null) { + return $ticket_settings_details; + } else { + $ticket_settings_details['assign'] = $agent->id; + + return $ticket_settings_details; + } + } + + /** + * function to change the helptopic of a ticket. + * + * @param type $workflow_action + * @param type $ticket_settings_details + * + * @return type array + */ + public function changeHelptopic($workflow_action, $ticket_settings_details) + { + $help_topic = Help_topic::where('id', '=', $workflow_action->action)->first(); + if ($help_topic == null) { + return $ticket_settings_details; + } else { + $ticket_settings_details['help_topic'] = $help_topic->id; + + return $ticket_settings_details; + } + } + + /** + * function to change the status of a ticket. + * + * @param type $workflow_action + * @param type $ticket_settings_details + * + * @return type array + */ + public function changeStatus($workflow_action, $ticket_settings_details) + { + $status = Ticket_Status::where('id', '=', $workflow_action->action)->first(); + if ($status == null) { + return $ticket_settings_details; + } else { + $ticket_settings_details['status'] = $status->id; + + return $ticket_settings_details; + } + } +} diff --git a/app/Http/Controllers/Agent/kb/SettingsController.php b/app/Http/Controllers/Agent/kb/SettingsController.php index 95d689ee9..8764b2f15 100644 --- a/app/Http/Controllers/Agent/kb/SettingsController.php +++ b/app/Http/Controllers/Agent/kb/SettingsController.php @@ -2,7 +2,8 @@ namespace App\Http\Controllers\Agent\kb; -// Controllersuse App\Http\Controllers\Agent\helpdesk\TicketController; +// Controllers +use App\Http\Controllers\Agent\helpdesk\TicketController; use App\Http\Controllers\Controller; // Request use App\Http\Requests\kb\ProfilePassword; diff --git a/app/Http/Controllers/Api/v1/ApiController.php b/app/Http/Controllers/Api/v1/ApiController.php index 91dab4449..d14daaa17 100644 --- a/app/Http/Controllers/Api/v1/ApiController.php +++ b/app/Http/Controllers/Api/v1/ApiController.php @@ -60,9 +60,12 @@ class ApiController extends Controller $this->middleware('jwt.auth'); $this->middleware('api', ['except' => 'GenerateApiKey']); - - $user = \JWTAuth::parseToken()->authenticate(); - $this->user = $user; + try { + $user = \JWTAuth::parseToken()->authenticate(); + $this->user = $user; + } catch (\Tymon\JWTAuth\Exceptions\TokenExpiredException $e) { + } catch (\Tymon\JWTAuth\Exceptions\JWTException $e) { + } $ticket = new TicketController(); $this->ticket = $ticket; @@ -82,6 +85,9 @@ class ApiController extends Controller $faveoUser = new User(); $this->faveoUser = $faveoUser; + $faveoUser = new User(); + $this->user = $faveoUser; + $team = new Teams(); $this->team = $team; @@ -138,18 +144,23 @@ class ApiController extends Controller $helptopic = $this->request->input('helptopic'); $sla = $this->request->input('sla'); $priority = $this->request->input('priority'); - $headers = $this->request->input('headers'); + $header = $this->request->input('cc'); $dept = $this->request->input('dept'); $assignto = $this->request->input('assignto'); $form_data = $this->request->input('form_data'); $source = $this->request->input('source'); $attach = $this->request->input('attachments'); + $headers = []; + if ($header) { + $headers = explode(',', $header); + } + //return $headers; /* * return s ticket number */ $response = $this->ticket->createTicket($user_id, $subject, $body, $helptopic, $sla, $priority, $source, $headers, $dept, $assignto, $form_data, $attach); - + //return $response; /* * return ticket details */ @@ -166,7 +177,8 @@ class ApiController extends Controller } catch (\TokenExpiredException $e) { $error = $e->getMessage(); - return response()->json(compact('error')); + return response()->json(compact('error')) + ->header('Authenticate: xBasic realm', 'fake'); } } @@ -303,6 +315,7 @@ class ApiController extends Controller ->whereNotNull('title'); }) ->select('first_name', 'last_name', 'email', 'profile_pic', 'ticket_number', 'tickets.id', 'title', 'tickets.created_at', 'department.name as department_name', 'ticket_priority.priority as priotity_name', 'sla_plan.name as sla_plan_name', 'help_topic.topic as help_topic_name', 'ticket_status.name as ticket_status_name') + ->orderBy('ticket_thread.updated_at', 'desc') ->groupby('tickets.id') ->distinct() ->paginate(10) @@ -346,7 +359,8 @@ class ApiController extends Controller $join->on('tickets.id', '=', 'ticket_thread.ticket_id') ->whereNotNull('title'); }) - ->select('first_name', 'last_name', 'email', 'profile_pic', 'ticket_number', 'tickets.id', 'title', 'tickets.created_at', 'department.name as department_name', 'ticket_priority.priority as priotity_name', 'sla_plan.name as sla_plan_name', 'help_topic.topic as help_topic_name', 'ticket_status.name as ticket_status_name') + ->select('user_name', 'first_name', 'last_name', 'email', 'profile_pic', 'ticket_number', 'tickets.id', 'title', 'tickets.created_at', 'department.name as department_name', 'ticket_priority.priority as priotity_name', 'sla_plan.name as sla_plan_name', 'help_topic.topic as help_topic_name', 'ticket_status.name as ticket_status_name') + ->orderBy('ticket_thread.updated_at', 'desc') ->groupby('tickets.id') ->distinct() ->paginate(10) @@ -390,7 +404,8 @@ class ApiController extends Controller $join->on('tickets.id', '=', 'ticket_thread.ticket_id') ->whereNotNull('title'); }) - ->select('first_name', 'last_name', 'email', 'profile_pic', 'ticket_number', 'tickets.id', 'title', 'tickets.created_at', 'department.name as department_name', 'ticket_priority.priority as priotity_name', 'sla_plan.name as sla_plan_name', 'help_topic.topic as help_topic_name', 'ticket_status.name as ticket_status_name') + ->select('user_name', 'first_name', 'last_name', 'email', 'profile_pic', 'ticket_number', 'tickets.id', 'title', 'tickets.created_at', 'department.name as department_name', 'ticket_priority.priority as priotity_name', 'sla_plan.name as sla_plan_name', 'help_topic.topic as help_topic_name', 'ticket_status.name as ticket_status_name') + ->orderBy('ticket_thread.updated_at', 'desc') ->groupby('tickets.id') ->distinct() ->paginate(10) @@ -516,7 +531,8 @@ class ApiController extends Controller $search = $this->request->input('search'); $result = $this->faveoUser->where('first_name', 'like', '%'.$search.'%')->orWhere('last_name', 'like', '%'.$search.'%')->orWhere('user_name', 'like', '%'.$search.'%')->orWhere('email', 'like', '%'.$search.'%')->get(); - return response()->json(compact('result')); + return response()->json(compact('result')) + ->header('X-Header-One', 'Header Value'); } catch (Exception $e) { $error = $e->getMessage(); $line = $e->getLine(); @@ -526,7 +542,9 @@ class ApiController extends Controller } catch (\TokenExpiredException $e) { $error = $e->getMessage(); - return response()->json(compact('error')); + return response()->json(compact('error')) + + ->header('X-Header-One', 'Header Value'); } } @@ -538,26 +556,16 @@ class ApiController extends Controller public function getCustomersWith() { try { - $users = $this->faveoUser->select('id', 'user_name', 'first_name', 'last_name', 'email', 'phone_number', 'profile_pic')->where('role', 'user')->get(); - $result = []; - foreach ($users as $key => $user) { - $result[$key]['id'] = $user->id; - $result[$key]['user_name'] = $user->user_name; - $result[$key]['first_name'] = $user->first_name; - $result[$key]['last_name'] = $user->last_name; - $result[$key]['email'] = $user->email; - $result[$key]['phone_number'] = $user->phone_number; - if ($user->profile_pic) { - $path = 'lb-faveo/media/profilepic/'.$user->profile_pic; - } else { - $path = \Gravatar::src($user->email); - } - $result[$key]['picture'] = $path; - } - $result = $this->createPagination($result, 10); - //dd($result); - //$result->toJson(); - return $result->toJson(); + $users = $this->user + ->leftJoin('user_assign_organization', 'user_assign_organization.user_id', '=', 'users.id') + ->leftJoin('organization', 'organization.id', '=', 'user_assign_organization.org_id') + ->where('role', 'user') + ->select('users.id', 'user_name', 'first_name', 'last_name', 'email', 'phone_number', 'users.profile_pic', 'organization.name AS company', 'users.active') + ->paginate(10) + ->toJson(); + + //dd($users); + return $users; } catch (\Exception $e) { $error = $e->getMessage(); $line = $e->getLine(); @@ -567,7 +575,8 @@ class ApiController extends Controller } catch (\TokenExpiredException $e) { $error = $e->getMessage(); - return response()->json(compact('error')); + return response()->json(compact('error')) + ->header('Authenticate: xBasic realm', 'fake'); } } @@ -654,9 +663,14 @@ class ApiController extends Controller return response()->json(compact('error')); } $id = $this->request->input('id'); - $result = $this->thread->where('ticket_id', $id)->get(); + $result = $this->user + ->leftjoin('ticket_thread', 'ticket_thread.user_id', '=', 'users.id') + ->select('ticket_thread.id', 'ticket_id', 'user_id', 'poster', 'source', 'title', 'body', 'is_internal', 'format', 'ip_address', 'ticket_thread.created_at', 'ticket_thread.updated_at', 'users.first_name', 'users.last_name', 'users.user_name', 'users.email', 'users.profile_pic') + ->where('ticket_id', $id) + ->get() + ->toJson(); - return response()->json(compact('result')); + return $result; } catch (\Exception $e) { $error = $e->getMessage(); $line = $e->getLine(); @@ -689,6 +703,10 @@ class ApiController extends Controller } $url = $this->request->input('url'); + if (!str_is('*/', $url)) { + $url = str_finish($url, '/'); + } + $url = $url.'/api/v1/helpdesk/check-url?api_key='.$this->request->input('api_key').'&token='.\Config::get('app.token'); $result = $this->CallGetApi($url); //dd($result); @@ -903,7 +921,7 @@ class ApiController extends Controller public function getTickets() { try { - $tickets = $this->model->paginate(10); + $tickets = $this->model->orderBy('created_at', 'desc')->paginate(10); $tickets->toJson(); return $tickets; @@ -938,7 +956,8 @@ class ApiController extends Controller $join->on('tickets.id', '=', 'ticket_thread.ticket_id') ->whereNotNull('title'); }) - ->select('first_name', 'last_name', 'email', 'profile_pic', 'ticket_number', 'tickets.id', 'title', 'tickets.created_at', 'department.name as department_name', 'ticket_priority.priority as priotity_name', 'sla_plan.name as sla_plan_name', 'help_topic.topic as help_topic_name', 'ticket_status.name as ticket_status_name') + ->select('user_name', 'first_name', 'last_name', 'email', 'profile_pic', 'ticket_number', 'tickets.id', 'title', 'tickets.created_at', 'department.name as department_name', 'ticket_priority.priority as priotity_name', 'sla_plan.name as sla_plan_name', 'help_topic.topic as help_topic_name', 'ticket_status.name as ticket_status_name') + ->orderBy('ticket_thread.updated_at', 'desc') ->groupby('tickets.id') ->distinct() ->paginate(10) @@ -946,9 +965,9 @@ class ApiController extends Controller return $inbox; } catch (\Exception $ex) { - $error = $e->getMessage(); - $line = $e->getLine(); - $file = $e->getFile(); + $error = $ex->getMessage(); + $line = $ex->getLine(); + $file = $ex->getFile(); return response()->json(compact('error', 'file', 'line')); } catch (\TokenExpiredException $e) { @@ -1012,7 +1031,8 @@ class ApiController extends Controller $join->on('tickets.id', '=', 'ticket_thread.ticket_id') ->whereNotNull('title'); }) - ->select('first_name', 'last_name', 'email', 'profile_pic', 'ticket_number', 'tickets.id', 'title', 'tickets.created_at', 'department.name as department_name', 'ticket_priority.priority as priotity_name', 'sla_plan.name as sla_plan_name', 'help_topic.topic as help_topic_name', 'ticket_status.name as ticket_status_name') + ->select('user_name', 'first_name', 'last_name', 'email', 'profile_pic', 'ticket_number', 'tickets.id', 'title', 'tickets.created_at', 'department.name as department_name', 'ticket_priority.priority as priotity_name', 'sla_plan.name as sla_plan_name', 'help_topic.topic as help_topic_name', 'ticket_status.name as ticket_status_name') + ->orderBy('ticket_thread.updated_at', 'desc') ->groupby('tickets.id') ->distinct() ->paginate(10) @@ -1032,7 +1052,7 @@ class ApiController extends Controller } } - public function getMyTickets() + public function getMyTicketsAgent() { try { $v = \Validator::make($this->request->all(), [ @@ -1045,7 +1065,58 @@ class ApiController extends Controller } $id = $this->request->input('user_id'); if ($this->user->where('id', $id)->first()->role == 'user') { - $error = 'This user is not an Aget or Admin'; + $error = 'This user is not an Agent or Admin'; + + return response()->json(compact('error')); + } + $result = $this->user->join('tickets', function ($join) use ($id) { + $join->on('users.id', '=', 'tickets.assigned_to') + ->where('user_id', '=', $id); + }) + ->join('department', 'department.id', '=', 'tickets.dept_id') + ->join('ticket_priority', 'ticket_priority.priority_id', '=', 'tickets.priority_id') + ->join('sla_plan', 'sla_plan.id', '=', 'tickets.sla') + ->join('help_topic', 'help_topic.id', '=', 'tickets.help_topic_id') + ->join('ticket_status', 'ticket_status.id', '=', 'tickets.status') + ->join('ticket_thread', function ($join) { + $join->on('tickets.id', '=', 'ticket_thread.ticket_id') + ->whereNotNull('title'); + }) + ->select('user_name', 'first_name', 'last_name', 'email', 'profile_pic', 'ticket_number', 'tickets.id', 'title', 'tickets.created_at', 'department.name as department_name', 'ticket_priority.priority as priotity_name', 'sla_plan.name as sla_plan_name', 'help_topic.topic as help_topic_name', 'ticket_status.name as ticket_status_name') + ->orderBy('ticket_thread.updated_at', 'desc') + ->groupby('tickets.id') + ->distinct() + ->paginate(10) + ->toJson(); + + return $result; + } catch (\Exception $e) { + $error = $e->getMessage(); + $line = $e->getLine(); + $file = $e->getFile(); + + return response()->json(compact('error', 'file', 'line')); + } catch (\TokenExpiredException $e) { + $error = $e->getMessage(); + + return response()->json(compact('error')); + } + } + + public function getMyTicketsUser() + { + try { + $v = \Validator::make($this->request->all(), [ + 'user_id' => 'required|exists:users,id', + ]); + if ($v->fails()) { + $error = $v->errors(); + + return response()->json(compact('error')); + } + $id = $this->request->input('user_id'); + if ($this->user->where('id', $id)->first()->role == 'admin' || $this->user->where('id', $id)->first()->role == 'agent') { + $error = 'This is not a client'; return response()->json(compact('error')); } @@ -1062,10 +1133,12 @@ class ApiController extends Controller $join->on('tickets.id', '=', 'ticket_thread.ticket_id') ->whereNotNull('title'); }) - ->select('first_name', 'last_name', 'email', 'profile_pic', 'ticket_number', 'tickets.id', 'title', 'tickets.created_at', 'department.name as department_name', 'ticket_priority.priority as priotity_name', 'sla_plan.name as sla_plan_name', 'help_topic.topic as help_topic_name', 'ticket_status.name as ticket_status_name') + ->select('ticket_number', 'tickets.id', 'title', 'ticket_status.name as ticket_status_name') + ->orderBy('ticket_thread.updated_at', 'desc') ->groupby('tickets.id') ->distinct() - ->paginate(10) + ->get() + // ->paginate(10) ->toJson(); return $result; @@ -1143,4 +1216,160 @@ class ApiController extends Controller return response()->json(compact('error')); } } + + public function collaboratorSearch() + { + $this->validate($this->request, ['term' => 'required']); + try { + $emails = $this->ticket->autosearch(); + //return $emails; + $user = new User(); + if (count($emails) > 0) { + foreach ($emails as $key => $email) { + $user_model = $user->where('email', $email)->first(); + //return $user_model; + $users[$key]['name'] = $user_model->first_name.' '.$user_model->last_name; + $users[$key]['email'] = $email; + $users[$key]['avatar'] = $this->avatarUrl($email); + } + } + //return $users; + + return response()->json(compact('users')); + } catch (\Exception $e) { + $error = $e->getMessage(); + $line = $e->getLine(); + $file = $e->getFile(); + + return response()->json(compact('error', 'file', 'line')); + } + } + + public function avatarUrl($email) + { + try { + $user = new User(); + $user = $user->where('email', $email)->first(); + if ($user->profile_pic) { + $url = url('lb-faveo/media/profilepic/'.$user->profile_pic); + } else { + $url = \Gravatar::src($email); + } + + return $url; + } catch (\Exception $ex) { + //return $ex->getMessage(); + throw new \Exception($ex->getMessage()); + } + } + + public function addCollaboratorForTicket() + { + try { + $v = \Validator::make(\Input::get(), [ + 'email' => 'required|email|unique:users', + 'ticket_id' => 'required', + ] + ); + if ($v->fails()) { + $error = $v->messages(); + + return response()->json(compact('error')); + } + $collaborator = $this->ticket->useradd(); + + return response()->json(compact('collaborator')); + } catch (\Exception $e) { + $error = $e->getMessage(); + $line = $e->getLine(); + $file = $e->getFile(); + + return response()->json(compact('error', 'file', 'line')); + } catch (Tymon\JWTAuth\Exceptions\TokenExpiredException $ex) { + $error = $e->getMessage(); + $line = $e->getLine(); + $file = $e->getFile(); + + return response()->json(compact('error', 'file', 'line')); + } + } + + public function getCollaboratorForTicket() + { + try { + $v = \Validator::make(\Input::get(), [ + 'ticket_id' => 'required', + ] + ); + if ($v->fails()) { + $error = $v->messages(); + + return response()->json(compact('error')); + } + $collaborator = $this->ticket->getCollaboratorForTicket(); + + return response()->json(compact('collaborator')); + } catch (\Exception $e) { + $error = $e->getMessage(); + $line = $e->getLine(); + $file = $e->getFile(); + + return response()->json(compact('error', 'file', 'line')); + } catch (Tymon\JWTAuth\Exceptions\TokenExpiredException $ex) { + $error = $e->getMessage(); + $line = $e->getLine(); + $file = $e->getFile(); + + return response()->json(compact('error', 'file', 'line')); + } + } + + public function deleteCollaborator() + { + try { + $v = \Validator::make(\Input::get(), [ + 'ticketid' => 'required', + 'email' => 'required', + ] + ); + if ($v->fails()) { + $result = $v->messages(); + + return response()->json(compact('result')); + } + $collaborator = $this->ticket->userremove(); + + return response()->json(compact('collaborator')); + } catch (\Exception $ex) { + $error = $e->getMessage(); + $line = $e->getLine(); + $file = $e->getFile(); + + return response()->json(compact('error', 'file', 'line')); + } + } + + public function dependency() + { + try { + $department = $this->department->select('name', 'id')->get()->toArray(); + $sla = $this->slaPlan->select('name', 'id')->get()->toArray(); + $staff = $this->user->where('role', 'agent')->select('email', 'id')->get()->toArray(); + $team = $this->team->select('name', 'id')->get()->toArray(); + $priority = \DB::table('ticket_priority')->select('priority', 'priority_id')->get(); + $helptopic = $this->helptopic->select('topic', 'id')->get()->toArray(); + $status = \DB::table('ticket_status')->select('name', 'id')->get(); + $source = \DB::table('ticket_source')->select('name', 'id')->get(); + $result = ['departments' => $department, 'sla' => $sla, 'staffs' => $staff, 'teams' => $team, + 'priorities' => $priority, 'helptopics' => $helptopic, 'status' => $status, 'sources' => $source, ]; + + return response()->json(compact('result')); + } catch (\Exception $e) { + $error = $e->getMessage(); + $line = $e->getLine(); + $file = $e->getFile(); + + return response()->json(compact('error', 'file', 'line')); + } + } } diff --git a/app/Http/Controllers/Api/v1/ApiExceptAuthController.php b/app/Http/Controllers/Api/v1/ApiExceptAuthController.php index 9ade975b5..47a9b763f 100644 --- a/app/Http/Controllers/Api/v1/ApiExceptAuthController.php +++ b/app/Http/Controllers/Api/v1/ApiExceptAuthController.php @@ -12,7 +12,7 @@ class ApiExceptAuthController extends Controller public function __construct(Request $request) { $this->request = $request; - $this->middleware('api'); + //$this->middleware('api'); } /** @@ -34,7 +34,12 @@ class ApiExceptAuthController extends Controller } $url = $this->request->input('url'); - $url = $url.'/api/v1/helpdesk/check-url'; + if (!str_is('*/', $url)) { + $url = str_finish($url, '/'); + } + + $url = $url.'api/v1/helpdesk/check-url'; + //return $url; $result = $this->CallGetApi($url); // dd($result); return response()->json(compact('result')); diff --git a/app/Http/Controllers/Api/v1/TicketController.php b/app/Http/Controllers/Api/v1/TicketController.php index 079da83f7..67dbc8352 100644 --- a/app/Http/Controllers/Api/v1/TicketController.php +++ b/app/Http/Controllers/Api/v1/TicketController.php @@ -58,6 +58,7 @@ class TicketController extends Controller public function createTicket($user_id, $subject, $body, $helptopic, $sla, $priority, $source, $headers, $dept, $assignto, $form_data, $attach = '') { try { + //return $headers; $max_number = Tickets::whereRaw('id = (select max(`id`) from tickets)')->first(); //dd($max_number); if ($max_number == null) { @@ -97,7 +98,7 @@ class TicketController extends Controller } } } - + //return $headers; $this->storeCollaborators($headers, $id); $thread = $this->ticketThread($subject, $body, $id, $user_id); @@ -123,10 +124,11 @@ class TicketController extends Controller public function storeCollaborators($headers, $id) { try { + //return $headers; $company = $this->company(); if (isset($headers)) { - foreach ($headers as $email => $name) { - $name = $name; + foreach ($headers as $email) { + $name = $email; $email = $email; if ($this->checkEmail($email) == false) { $create_user = new User(); @@ -147,6 +149,7 @@ class TicketController extends Controller $user = $this->checkEmail($email); $user_id = $user->id; } + //return $user_id; $collaborator_store = new Ticket_Collaborator(); $collaborator_store->isactive = 1; $collaborator_store->ticket_id = $id; @@ -331,10 +334,10 @@ class TicketController extends Controller // // } // }, true); -try { - $this->PhpMailController->sendmail($from = $this->PhpMailController->mailfrom('0', $ticketdata->dept_id), $to = ['name' => $username, 'email' => $emailadd], $message = ['subject' => $updated_subject, 'scenario' => 'create-ticket-by-agent', 'body' => $body], $template_variables = ['agent_sign' => Auth::user()->agent_sign, 'ticket_number' => $ticket_number2]); -} catch (\Exception $e) { -} + try { + $this->PhpMailController->sendmail($from = $this->PhpMailController->mailfrom('0', $ticketdata->dept_id), $to = ['name' => $username, 'email' => $emailadd], $message = ['subject' => $updated_subject, 'scenario' => 'create-ticket-by-agent', 'body' => $body], $template_variables = ['agent_sign' => Auth::user()->agent_sign, 'ticket_number' => $ticket_number2]); + } catch (\Exception $e) { + } $collaborators = Ticket_Collaborator::where('ticket_id', '=', $ticket_id)->get(); foreach ($collaborators as $collaborator) { @@ -357,10 +360,10 @@ try { // // } // }, true); - try { - $this->PhpMailController->sendmail($from = $this->PhpMailController->mailfrom('0', $ticketdata->dept_id), $to = ['user' => $admin_user, 'email' => $admin_email], $message = ['subject' => $updated_subject, 'body' => $body, 'scenario' => $mail], $template_variables = ['ticket_agent_name' => $admin_user, 'ticket_client_name' => $username, 'ticket_client_email' => $emailadd, 'user' => $admin_user, 'ticket_number' => $ticket_number2, 'email_address' => $emailadd, 'name' => $ticket_creator]); - } catch (\Exception $e) { - } + try { + $this->PhpMailController->sendmail($from = $this->PhpMailController->mailfrom('0', $ticketdata->dept_id), $to = ['user' => $admin_user, 'email' => $admin_email], $message = ['subject' => $updated_subject, 'body' => $body, 'scenario' => $mail], $template_variables = ['ticket_agent_name' => $admin_user, 'ticket_client_name' => $username, 'ticket_client_email' => $emailadd, 'user' => $admin_user, 'ticket_number' => $ticket_number2, 'email_address' => $emailadd, 'name' => $ticket_creator]); + } catch (\Exception $e) { + } } return $thread; @@ -548,7 +551,7 @@ try { { try { $check = User::where('email', '=', $email)->first(); - if ($check == true) { + if ($check) { return $check; } else { return false; @@ -601,4 +604,123 @@ try { return $e->getMessage(); } } + + /** + * autosearch. + * + * @return type json + */ + public function autosearch() + { + $term = \Input::get('term'); + $user = \App\User::where('email', 'LIKE', '%'.$term.'%')->orWhere('first_name', 'LIKE', '%'.$term.'%')->orWhere('last_name', 'LIKE', '%'.$term.'%')->orWhere('user_name', 'LIKE', '%'.$term.'%')->lists('email'); + + return $user; + } + + /** + * useradd. + * + * @param type Image $image + * + * @return type json + */ + public function useradd() + { + $email = Input::get('email'); + $ticket_id = Input::get('ticket_id'); + $company = $this->company(); + $user = new User(); + $user->user_name = $email; + $user->email = $email; + $password = $this->generateRandomString(); + $user->password = \Hash::make($password); + $user->role = 'user'; + $user->active = 1; + if ($user->save()) { + $user_id = $user->id; + $php_mailer = new PhpMailController(); + $php_mailer->sendmail($from = $php_mailer->mailfrom('1', '0'), $to = ['name' => $email, 'email' => $email], $message = ['subject' => 'Password', 'scenario' => 'registration-notification'], $template_variables = ['user' => $email, 'email_address' => $email, 'user_password' => $password]); + } + $ticket_collaborator = new Ticket_Collaborator(); + $ticket_collaborator->isactive = 1; + $ticket_collaborator->ticket_id = $ticket_id; + $ticket_collaborator->user_id = $user->id; + $ticket_collaborator->role = 'ccc'; + $ticket_collaborator->save(); + + $result = [$user->user_name => $user->email]; + + return $result; + } + + /** + * user remove. + * + * @return type + */ + public function userremove() + { + $email = Input::get('email'); + $ticketid = Input::get('ticketid'); + $user = new User(); + $user = $user->where('email', $email)->first(); + $ticket_collaborator = Ticket_Collaborator::where('ticket_id', '=', $ticketid) + ->where('user_id', $user->id) + ->first(); + if ($ticket_collaborator) { + $ticket_collaborator->delete(); + + return 'deleted successfully'; + } else { + return 'not found'; + } + } + + public function getCollaboratorForTicket() + { + try { + $ticketid = Input::get('ticket_id'); + + $ticket_collaborator = \DB::table('users') + ->join('ticket_collaborator', function ($join) use ($ticketid) { + $join->on('users.id', '=', 'ticket_collaborator.user_id') + ->where('ticket_collaborator.ticket_id', '=', $ticketid); + }) + ->select('users.email', 'users.user_name') + ->get(); + if (count($ticket_collaborator) > 0) { + foreach ($ticket_collaborator as $key => $collaborator) { + $collab[$key]['email'] = $collaborator->email; + $collab[$key]['user_name'] = $collaborator->user_name; + $collab[$key]['avatar'] = $this->avatarUrl($collaborator->email); + } + } else { + $collab = $ticket_collaborator; + } + + return $collab; + } catch (\Exception $ex) { + return $ex->getMessage(); + throw new \Exception('get collaborator for ticket fails'); + } + } + + public function avatarUrl($email) + { + try { + $user = new User(); + $user = $user->where('email', $email)->first(); + if ($user->profile_pic) { + $url = url('lb-faveo/media/profilepic/'.$user->profile_pic); + } else { + $url = \Gravatar::src($email); + } + + return $url; + } catch (\Exception $ex) { + //return $ex->getMessage(); + throw new \Exception($ex->getMessage()); + } + } } diff --git a/app/Http/Controllers/Api/v1/TokenAuthController.php b/app/Http/Controllers/Api/v1/TokenAuthController.php index cf6fd00e6..d9bfe06cb 100644 --- a/app/Http/Controllers/Api/v1/TokenAuthController.php +++ b/app/Http/Controllers/Api/v1/TokenAuthController.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers\Api\v1; +use App\Http\Controllers\Common\PhpMailController; use App\Http\Controllers\Controller; use App\User; use Illuminate\Http\Request; @@ -23,9 +24,14 @@ use Tymon\JWTAuth\Exceptions\JWTException; */ class TokenAuthController extends Controller { + public $PhpMailController; + public function __construct() { $this->middleware('api'); + + $PhpMailController = new PhpMailController(); + $this->PhpMailController = $PhpMailController; } /** @@ -41,7 +47,7 @@ class TokenAuthController extends Controller $password = $request->input('password'); $field = filter_var($usernameinput, FILTER_VALIDATE_EMAIL) ? 'email' : 'user_name'; - //$credentials = $request->only('email', 'password'); +//$credentials = $request->only('email', 'password'); try { if (!$token = JWTAuth::attempt([$field => $usernameinput, 'password' => $password])) { @@ -56,7 +62,7 @@ class TokenAuthController extends Controller } $user_id = \Auth::user()->id; - // if no errors are encountered we can return a JWT +// if no errors are encountered we can return a JWT return response()->json(compact('token', 'user_id')); } @@ -72,18 +78,18 @@ class TokenAuthController extends Controller if (!$user = JWTAuth::parseToken()->authenticate()) { return response()->json(['user_not_found', 404]); } - } catch (\Tymon\JWTAuth\Exceptions\TokenExpiredException $e) { + } catch (Tymon\JWTAuth\Exceptions\TokenExpiredException $e) { return response()->json(['token_expired', $e->getStatusCode()]); - } catch (\Tymon\JWTAuth\Exceptions\TokenInvalidException $e) { + } catch (Tymon\JWTAuth\Exceptions\TokenInvalidException $e) { return response()->json(['token_invalid', $e->getStatusCode()]); - } catch (\Tymon\JWTAuth\Exceptions\JWTException $e) { + } catch (Tymon\JWTAuth\Exceptions\JWTException $e) { return response()->json(['token_absent', $e->getStatusCode()]); } catch (\Exception $e) { $error = $e->getMessage(); return response()->json(compact('error')); } - //dd($user); +//dd($user); return response()->json(compact('user')); } @@ -124,7 +130,7 @@ class TokenAuthController extends Controller * * @return type json */ - public function checkUrl() + public function checkUrl(Request $request) { try { $v = \Validator::make($request->all(), [ @@ -144,4 +150,43 @@ class TokenAuthController extends Controller return response()->json(compact('error')); } } + + public function forgotPassword(Request $request) + { + try { + $v = \Validator::make($request->all(), [ + 'email' => 'required|email|exists:users,email', + ]); + if ($v->fails()) { + $error = $v->errors(); + + return response()->json(compact('error')); + } + + $date = date('Y-m-d H:i:s'); + $user = User::where('email', '=', $request->only('email'))->first(); + if (isset($user)) { + $user1 = $user->email; + //gen new code and pass + $code = str_random(60); + $password_reset_table = \DB::table('password_resets')->where('email', '=', $user->email)->first(); + if (isset($password_reset_table)) { + $password_reset_table = \DB::table('password_resets')->where('email', '=', $user->email)->update(['token' => $code, 'created_at' => $date]); + // $password_reset_table->token = $code; + // $password_reset_table->update(['token' => $code]); + } else { + $create_password_reset = \DB::table('password_resets')->insert(['email' => $user->email, 'token' => $code, 'created_at' => $date]); + } + + $this->PhpMailController->sendmail($from = $this->PhpMailController->mailfrom('1', '0'), $to = ['name' => $user->user_name, 'email' => $user->email], $message = ['subject' => 'Your Password Reset Link', 'scenario' => 'reset-password'], $template_variables = ['user' => $user->user_name, 'email_address' => $user->email, 'password_reset_link' => url('password/reset/'.$code)]); + $result = 'We have e-mailed your password reset link!'; + + return response()->json(compact('result')); + } + } catch (Exception $ex) { + $error = $e->getMessage(); + + return response()->json(compact('error')); + } + } } diff --git a/app/Http/Controllers/Client/helpdesk/FormController.php b/app/Http/Controllers/Client/helpdesk/FormController.php index dd8c37a3b..544df7963 100644 --- a/app/Http/Controllers/Client/helpdesk/FormController.php +++ b/app/Http/Controllers/Client/helpdesk/FormController.php @@ -3,7 +3,7 @@ namespace App\Http\Controllers\Client\helpdesk; // controllers -use App\Http\Controllers\Agent\helpdesk\TicketController; +use App\Http\Controllers\Agent\helpdesk\TicketWorkflowController; use App\Http\Controllers\Common\SettingsController; use App\Http\Controllers\Controller; // requests @@ -14,6 +14,7 @@ use App\Model\helpdesk\Form\Fields; use App\Model\helpdesk\Manage\Help_topic; use App\Model\helpdesk\Settings\System; use App\Model\helpdesk\Settings\Ticket; +use App\Model\helpdesk\Ticket\Ticket_attachments; use App\Model\helpdesk\Ticket\Ticket_source; use App\Model\helpdesk\Ticket\Ticket_Thread; use App\Model\helpdesk\Ticket\Tickets; @@ -39,12 +40,12 @@ class FormController extends Controller * * @return void */ - public function __construct(TicketController $TicketController) + public function __construct(TicketWorkflowController $TicketWorkflowController) { // mail smtp settings - SettingsController::smtp(); +// SettingsController::smtp(); // creating a TicketController instance - $this->TicketController = $TicketController; + $this->TicketWorkflowController = $TicketWorkflowController; } /** @@ -129,7 +130,7 @@ class FormController extends Controller * @param type Request $request * @param type User $user */ - public function postedForm(User $user, ClientRequest $request, Ticket $ticket_settings, Ticket_source $ticket_source) + public function postedForm(User $user, ClientRequest $request, Ticket $ticket_settings, Ticket_source $ticket_source, Ticket_attachments $ta) { $form_extras = $request->except('Name', 'Phone', 'Email', 'Subject', 'Details', 'helptopic', '_wysihtml5_mode', '_token'); @@ -147,13 +148,33 @@ class FormController extends Controller $helptopic = $ticket_settings->first()->help_topic; $sla = $ticket_settings->first()->sla; $priority = $ticket_settings->first()->priority; - $source = $ticket_source->where('name', '=', 'web')->first(); + $source = $ticket_source->where('name', '=', 'web')->first()->id; + $attachments = $request->file('attachment'); $collaborator = null; $assignto = null; $auto_response = 0; - if ($this->TicketController->create_user($email, $name, $subject, $details, $phone, $helptopic, $sla, $priority, $source->id, $collaborator, $department, $assignto, $form_extras, $auto_response)) { - return Redirect::route('guest.getform')->with('success', 'Ticket Created Successfully'); + $team_assign = null; + + $result = $this->TicketWorkflowController->workflow($email, $name, $subject, $details, $phone, $helptopic, $sla, $priority, $source, $collaborator, $department, $assignto, $team_assign, $status, $form_extras, $auto_response); + + if ($result[1] == 1) { + $ticketId = Tickets::where('ticket_number', '=', $result[0])->first(); + $thread = Ticket_Thread::where('ticket_id', '=', $ticketId->id)->first(); + if ($attachments != null) { + foreach ($attachments as $attachment) { + if ($attachment != null) { + $name = $attachment->getClientOriginalName(); + $type = $attachment->getClientOriginalExtension(); + $size = $attachment->getSize(); + $data = file_get_contents($attachment->getRealPath()); + $attachPath = $attachment->getRealPath(); + $ta->create(['thread_id' => $thread->id, 'name' => $name, 'size' => $size, 'type' => $type, 'file' => $data, 'poster' => 'ATTACHMENT']); + } + } + } + + return Redirect::route('guest.getform')->with('success', 'Ticket has been created successfully, your ticket number is '.$result[0].' Please save this for future reference.'); } } diff --git a/app/Http/Controllers/Common/NotificationController.php b/app/Http/Controllers/Common/NotificationController.php new file mode 100644 index 000000000..14034e9d9 --- /dev/null +++ b/app/Http/Controllers/Common/NotificationController.php @@ -0,0 +1,83 @@ +user = $user; + } + + /** + * get the page to list the notifications. + * + * @return response + */ + public static function getNotifications() + { + $notifications = UserNotification::join('notifications', 'user_notification.notification_id', '=', 'notifications.id') + ->join('notification_types', 'notifications.type_id', '=', 'notification_types.id') + ->where('user_notification.is_read', '=', '0') + ->where('user_notification.user_id', '=', \Auth::user()->id) + ->get(); + + return $notifications; + } + + public function create($model_id, $userid_created, $type_id, $forwhome = []) + { + try { + if (empty($forwhome)) { + $forwhome = $this->user->where('role', '!=', 'user')->get()->toArray(); + } + //dd($forwhome); + //system notification + $notification = new Notification(); + $UN = new UserNotification(); + + $notify = $notification->create(['model_id' => $model_id, 'userid_created' => $userid_created, 'type_id' => $type_id]); + foreach ($forwhome as $agent) { + $user_notify = $UN->create(['notification_id' => $notify->id, 'user_id' => $agent['id'], 'is_read' => 0]); + } + } catch (\Exception $e) { + return redirect()->back()->with('fails', $e->getMessage()); + } + } + + public function markRead($id) + { + $markasread = UserNotification::where('notification_id', '=', $id)->where('user_id', '=', \Auth::user()->id)->where('is_read', '=', '0')->get(); + foreach ($markasread as $mark) { + $mark->is_read = '1'; + $mark->save(); + } + + return 1; + } + + public function show() + { + $notifications = $this->getNotifications(); + + return view('notifications-all', compact('notifications')); + } + + public function delete($id) + { + $markasread = UserNotification::where('notification_id', '=', $id)->where('user_id', '=', \Auth::user()->id)->get(); + foreach ($markasread as $mark) { + $mark->delete(); + } + + return 1; + } +} diff --git a/app/Http/Controllers/Common/SettingsController.php b/app/Http/Controllers/Common/SettingsController.php index a7206d3d4..266bcf1a7 100644 --- a/app/Http/Controllers/Common/SettingsController.php +++ b/app/Http/Controllers/Common/SettingsController.php @@ -414,7 +414,7 @@ class SettingsController extends Controller public function version_check() { $response_url = \URL::route('post-version-check'); - echo "
    "; + echo ""; echo ""; echo ""; echo ""; diff --git a/app/Http/Controllers/Installer/helpdesk/InstallController.php b/app/Http/Controllers/Installer/helpdesk/InstallController.php index cddca3257..6f7061991 100644 --- a/app/Http/Controllers/Installer/helpdesk/InstallController.php +++ b/app/Http/Controllers/Installer/helpdesk/InstallController.php @@ -298,7 +298,6 @@ class InstallController extends Controller // checking is the installation was done previously try { $check_for_pre_installation = System::all(); - dd($check_for_pre_installation); if ($check_for_pre_installation) { return redirect()->back()->with('fails', 'The data in database already exist. Please provide fresh database'); } diff --git a/app/Http/Requests/helpdesk/CompanyRequest.php b/app/Http/Requests/helpdesk/CompanyRequest.php index 21ce56665..a65751ee5 100644 --- a/app/Http/Requests/helpdesk/CompanyRequest.php +++ b/app/Http/Requests/helpdesk/CompanyRequest.php @@ -30,7 +30,7 @@ class CompanyRequest extends Request { return [ 'company_name' => 'required', - 'website' => 'url', + 'website' => 'active_url', 'phone' => 'numeric', 'logo' => 'image', ]; diff --git a/app/Http/Requests/helpdesk/OrganizationRequest.php b/app/Http/Requests/helpdesk/OrganizationRequest.php index ee74044ad..be88a915e 100644 --- a/app/Http/Requests/helpdesk/OrganizationRequest.php +++ b/app/Http/Requests/helpdesk/OrganizationRequest.php @@ -31,7 +31,7 @@ class OrganizationRequest extends Request return [ 'name' => 'required|unique:organization', - 'website' => 'url', + 'website' => 'active_url', // 'phone' => 'size:10', ]; } diff --git a/app/Http/Requests/helpdesk/OrganizationUpdate.php b/app/Http/Requests/helpdesk/OrganizationUpdate.php index 6d4ea4f12..4e5ef0a07 100644 --- a/app/Http/Requests/helpdesk/OrganizationUpdate.php +++ b/app/Http/Requests/helpdesk/OrganizationUpdate.php @@ -30,7 +30,7 @@ class OrganizationUpdate extends Request { return [ - 'website' => 'url', + 'website' => 'active_url', // 'phone' => 'size:10', ]; } diff --git a/app/Http/Requests/helpdesk/WorkflowCreateRequest.php b/app/Http/Requests/helpdesk/WorkflowCreateRequest.php new file mode 100644 index 000000000..a1ca0c207 --- /dev/null +++ b/app/Http/Requests/helpdesk/WorkflowCreateRequest.php @@ -0,0 +1,39 @@ + + */ +class WorkflowCreateRequest extends Request +{ + /** + * Determine if the user is authorized to make this request. + * + * @return bool + */ + public function authorize() + { + return true; + } + + /** + * Get the validation rules that apply to the request. + * + * @return array + */ + public function rules() + { + return [ + 'name' => 'required|unique:workflow_name,name', + 'execution_order' => 'required', + 'target_channel' => 'required', + 'rule' => 'required', + 'action' => 'required', + ]; + } +} diff --git a/app/Http/Requests/helpdesk/WorkflowUpdateRequest.php b/app/Http/Requests/helpdesk/WorkflowUpdateRequest.php new file mode 100644 index 000000000..f514e66e4 --- /dev/null +++ b/app/Http/Requests/helpdesk/WorkflowUpdateRequest.php @@ -0,0 +1,39 @@ + + */ +class WorkflowUpdateRequest extends Request +{ + /** + * Determine if the user is authorized to make this request. + * + * @return bool + */ + public function authorize() + { + return true; + } + + /** + * Get the validation rules that apply to the request. + * + * @return array + */ + public function rules() + { + return [ + 'name' => 'required', + 'execution_order' => 'required', + 'target_channel' => 'required', + 'rule' => 'required', + 'action' => 'required', + ]; + } +} diff --git a/app/Http/routes.php b/app/Http/routes.php index a44247b3a..36eeb2a9d 100644 --- a/app/Http/routes.php +++ b/app/Http/routes.php @@ -40,6 +40,14 @@ $router->get('getmail/{token}', 'Auth\AuthController@getMail'); | */ Route::group(['middleware' => 'roles', 'middleware' => 'auth'], function () { + + //Notification marking + Route::post('mark-read/{id}', 'Common\NotificationController@markRead'); + + Route::get('notifications-list', ['as' => 'notification.list', 'uses' => 'Common\NotificationController@show']); + + Route::post('notification-delete/{id}', ['as' => 'notification.delete', 'uses' => 'Common\NotificationController@delete']); + // resource is a function to process create,edit,read and delete Route::resource('groups', 'Admin\helpdesk\GroupController'); // for group module, for CRUD @@ -83,12 +91,18 @@ Route::group(['middleware' => 'roles', 'middleware' => 'auth'], function () { //$router->model('id','getcompany'); + Route::get('job-scheduler', ['as' => 'get.job.scheder', 'uses' => 'Admin\helpdesk\SettingsController@getSchedular']); //to get ob scheduler form page + + Route::patch('post-scheduler', ['as' => 'post.job.scheduler', 'uses' => 'Admin\helpdesk\SettingsController@postSchedular']); //to update job scheduler + Route::get('agent-profile-page/{id}', ['as' => 'agent.profile.page', 'uses' => 'Admin\helpdesk\AgentController@agent_profile']); Route::get('getcompany', 'Admin\helpdesk\SettingsController@getcompany'); // direct to company setting page Route::patch('postcompany/{id}', 'Admin\helpdesk\SettingsController@postcompany'); // Updating the Company table with requests + Route::get('delete-logo', ['as' => 'delete.logo', 'uses' => 'Admin\helpdesk\SettingsController@deleteLogo']); // deleting a logo + Route::get('getsystem', 'Admin\helpdesk\SettingsController@getsystem'); // direct to system setting page Route::patch('postsystem/{id}', 'Admin\helpdesk\SettingsController@postsystem'); // Updating the System table with requests @@ -183,6 +197,15 @@ Route::group(['middleware' => 'roles', 'middleware' => 'auth'], function () { Route::post('validating-email-settings', ['as' => 'validating.email.settings', 'uses' => 'Admin\helpdesk\EmailsController@validatingEmailSettings']); // route to check email input validation Route::post('validating-email-settings-on-update/{id}', ['as' => 'validating.email.settings.update', 'uses' => 'Admin\helpdesk\EmailsController@validatingEmailSettingsUpdate']); // route to check email input validation + + Route::get('workflow', ['as' => 'workflow', 'uses' => 'Admin\helpdesk\WorkflowController@index']); + Route::get('workflow-list', ['as' => 'workflow.list', 'uses' => 'Admin\helpdesk\WorkflowController@workFlowList']); + Route::get('workflow/create', ['as' => 'workflow.create', 'uses' => 'Admin\helpdesk\WorkflowController@create']); + Route::post('workflow/store', ['as' => 'workflow.store', 'uses' => 'Admin\helpdesk\WorkflowController@store']); + Route::get('workflow/edit/{id}', ['as' => 'workflow.edit', 'uses' => 'Admin\helpdesk\WorkflowController@edit']); + Route::post('workflow/update/{id}', ['as' => 'workflow.update', 'uses' => 'Admin\helpdesk\WorkflowController@update']); + Route::get('workflow/action-rule/{id}', ['as' => 'workflow.dept', 'uses' => 'Admin\helpdesk\WorkflowController@selectAction']); + Route::get('workflow/delete/{id}', ['as' => 'workflow.delete', 'uses' => 'Admin\helpdesk\WorkflowController@destroy']); }); /* @@ -257,6 +280,9 @@ Route::group(['middleware' => 'role.agent', 'middleware' => 'auth'], function () Route::get('/ticket/overdue', ['as' => 'overdue.ticket', 'uses' => 'Agent\helpdesk\TicketController@overdue_ticket_list']); /* Get Overdue Ticket */ + Route::get('/ticket/get-overdue', ['as' => 'get.overdue.ticket', + 'uses' => 'Agent\helpdesk\TicketController@getOverdueTickets', ]); + Route::get('/ticket/closed', ['as' => 'closed.ticket', 'uses' => 'Agent\helpdesk\TicketController@closed_ticket_list']); /* Get Closed Ticket */ Route::get('/ticket/get-closed', ['as' => 'get.closed.ticket', 'uses' => 'Agent\helpdesk\TicketController@get_closed']); /* Get tickets in datatable */ @@ -620,6 +646,7 @@ Route::get('/reportdata', 'HomeController@pushdata'); Route::group(['prefix' => 'api/v1'], function () { Route::post('register', 'Api\v1\TokenAuthController@register'); Route::post('authenticate', 'Api\v1\TokenAuthController@authenticate'); + Route::post('forgot', 'Api\v1\TokenAuthController@forgotPassword'); Route::get('authenticate/user', 'Api\v1\TokenAuthController@getAuthenticatedUser'); Route::get('/database-config', ['as' => 'database-config', 'uses' => 'Api\v1\InstallerApiController@config_database']); @@ -656,7 +683,7 @@ Route::group(['prefix' => 'api/v1'], function () { Route::get('ticket', 'Api\v1\ApiController@getTicketById'); Route::get('inbox', 'Api\v1\ApiController@inbox'); Route::get('trash', 'Api\v1\ApiController@getTrash'); - Route::get('my-tickets', 'Api\v1\ApiController@getMyTickets'); + Route::get('my-tickets-agent', 'Api\v1\ApiController@getMyTicketsAgent'); Route::post('internal-note', 'Api\v1\ApiController@internalNote'); /* @@ -664,6 +691,12 @@ Route::group(['prefix' => 'api/v1'], function () { */ Route::get('customers-custom', 'Api\v1\ApiController@getCustomersWith'); + Route::get('collaborator/search', 'Api\v1\ApiController@collaboratorSearch'); + Route::post('collaborator/create', 'Api\v1\ApiController@addCollaboratorForTicket'); + Route::post('collaborator/remove', 'Api\v1\ApiController@deleteCollaborator'); + Route::post('collaborator/get-ticket', 'Api\v1\ApiController@getCollaboratorForTicket'); + Route::get('my-tickets-user', 'Api\v1\ApiController@getMyTicketsUser'); + Route::get('dependency', 'Api\v1\ApiController@dependency'); }); /* diff --git a/app/Model/helpdesk/Agent/Groups.php b/app/Model/helpdesk/Agent/Groups.php index 086302e94..edcbaaecb 100644 --- a/app/Model/helpdesk/Agent/Groups.php +++ b/app/Model/helpdesk/Agent/Groups.php @@ -10,7 +10,7 @@ class Groups extends Model protected $fillable = [ 'name', 'group_status', 'can_create_ticket', 'can_edit_ticket', 'can_post_ticket', 'can_close_ticket', 'can_assign_ticket', - 'can_transfer_ticket', 'can_delete_ticket', 'can_ban_email', + 'can_delete_ticket', 'can_ban_email', 'can_manage_canned', 'can_manage_faq', 'can_view_agent_stats', 'department_access', 'admin_notes', ]; diff --git a/app/Model/helpdesk/Notification/Notification.php b/app/Model/helpdesk/Notification/Notification.php new file mode 100644 index 000000000..ba33bf5d4 --- /dev/null +++ b/app/Model/helpdesk/Notification/Notification.php @@ -0,0 +1,14 @@ +attach()->delete(); + $this->attach()->delete(); parent::delete(); } } diff --git a/app/Model/helpdesk/Workflow/WorkflowAction.php b/app/Model/helpdesk/Workflow/WorkflowAction.php new file mode 100644 index 000000000..2ad75f44b --- /dev/null +++ b/app/Model/helpdesk/Workflow/WorkflowAction.php @@ -0,0 +1,12 @@ +attributes['email']); + } else { + return asset('lb-faveo/media/profilepic/'.$value); + } + } } diff --git a/config/app.php b/config/app.php index ce6b22899..6b1a3d501 100644 --- a/config/app.php +++ b/config/app.php @@ -13,7 +13,7 @@ return [ | */ - 'debug' => true, + 'debug' => false, /* |-------------------------------------------------------------------------- @@ -38,7 +38,7 @@ return [ | */ - 'version' => 'Community 1.0.6.10', + 'version' => 'Community 1.0.7', /* |-------------------------------------------------------------------------- @@ -238,6 +238,7 @@ return [ 'PDF' => 'Vsmoraes\Pdf\PdfFacade', 'Gravatar' => 'Thomaswelton\LaravelGravatar\Facades\Gravatar', 'UTC' => 'App\Http\Controllers\Agent\helpdesk\TicketController', + 'Ttable' => 'App\Http\Controllers\Agent\helpdesk\TicketController', //to use getTable function. 'SMTPS' => 'App\Http\Controllers\HomeController', 'Datatable' => 'Chumper\Datatable\Facades\DatatableFacade', 'Zipper' => 'Chumper\Zipper\Zipper', diff --git a/config/lfm.php b/config/lfm.php index 6022fa66b..3e94eb37d 100644 --- a/config/lfm.php +++ b/config/lfm.php @@ -9,7 +9,7 @@ return [ 'shared_folder_name' => 'shares', 'thumb_folder_name' => 'thumbs', 'images_dir' => 'public/photos/', - 'images_url' => '%url%', //url('photos').'/', + 'images_url' => '%url%', 'files_dir' => 'public/files/', 'files_url' => '/files/', 'file_type_array' => [ diff --git a/database/migrations/2016_02_16_140450_create_ticket_thread_table.php b/database/migrations/2016_02_16_140450_create_ticket_thread_table.php index da7a53855..b7bf92e51 100644 --- a/database/migrations/2016_02_16_140450_create_ticket_thread_table.php +++ b/database/migrations/2016_02_16_140450_create_ticket_thread_table.php @@ -18,6 +18,8 @@ class CreateTicketThreadTable extends Migration $table->integer('user_id')->unsigned()->nullable()->index('user_id'); $table->string('poster'); $table->integer('source')->unsigned()->nullable()->index('source'); + $table->integer('reply_rating'); + $table->integer('rating_count'); $table->boolean('is_internal'); $table->string('title'); $table->text('body', 65535); diff --git a/database/migrations/2016_03_31_061239_create_notifications_table.php b/database/migrations/2016_03_31_061239_create_notifications_table.php new file mode 100644 index 000000000..0162b1211 --- /dev/null +++ b/database/migrations/2016_03_31_061239_create_notifications_table.php @@ -0,0 +1,33 @@ +increments('id'); + $table->integer('model_id'); + $table->integer('userid_created'); + $table->integer('type_id'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::drop('notifications'); + } +} diff --git a/database/migrations/2016_03_31_061534_create_notification_types_table.php b/database/migrations/2016_03_31_061534_create_notification_types_table.php new file mode 100644 index 000000000..8c5e1a08b --- /dev/null +++ b/database/migrations/2016_03_31_061534_create_notification_types_table.php @@ -0,0 +1,33 @@ +increments('id'); + $table->string('message'); + $table->string('type'); + $table->string('icon_class'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::drop('notification_types'); + } +} diff --git a/database/migrations/2016_03_31_061740_create_user_notification_table.php b/database/migrations/2016_03_31_061740_create_user_notification_table.php new file mode 100644 index 000000000..b61a14574 --- /dev/null +++ b/database/migrations/2016_03_31_061740_create_user_notification_table.php @@ -0,0 +1,33 @@ +increments('id'); + $table->integer('notification_id'); + $table->integer('user_id'); + $table->integer('is_read'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::drop('user_notification'); + } +} diff --git a/database/migrations/2016_04_18_115852_create_workflow_name_table.php b/database/migrations/2016_04_18_115852_create_workflow_name_table.php new file mode 100644 index 000000000..76a41fa2a --- /dev/null +++ b/database/migrations/2016_04_18_115852_create_workflow_name_table.php @@ -0,0 +1,35 @@ +increments('id'); + $table->string('name'); + $table->integer('status'); + $table->integer('order'); + $table->string('target'); + $table->text('internal_note'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::drop('workflow_name'); + } +} diff --git a/database/migrations/2016_04_18_115900_create_workflow_rule_table.php b/database/migrations/2016_04_18_115900_create_workflow_rule_table.php new file mode 100644 index 000000000..7f0ca57c4 --- /dev/null +++ b/database/migrations/2016_04_18_115900_create_workflow_rule_table.php @@ -0,0 +1,42 @@ +increments('id'); + $table->integer('workflow_id')->unsigned(); + $table->string('matching_criteria'); + $table->string('matching_scenario'); + $table->string('matching_relation'); + $table->text('matching_value'); + $table->timestamps(); + }); + + Schema::table('workflow_rules', function (Blueprint $table) { + $table->foreign('workflow_id', 'workflow_rules_1')->references('id')->on('workflow_name')->onUpdate('NO ACTION')->onDelete('RESTRICT'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('workflow_rules', function (Blueprint $table) { + $table->dropForeign('workflow_rules_1'); + }); + Schema::drop('workflow_rules'); + } +} diff --git a/database/migrations/2016_04_18_115908_create_workflow_action_table.php b/database/migrations/2016_04_18_115908_create_workflow_action_table.php new file mode 100644 index 000000000..e27d00ffd --- /dev/null +++ b/database/migrations/2016_04_18_115908_create_workflow_action_table.php @@ -0,0 +1,39 @@ +increments('id'); + $table->integer('workflow_id')->unsigned(); + $table->string('condition'); + $table->string('action'); + $table->timestamps(); + }); + Schema::table('workflow_action', function (Blueprint $table) { + $table->foreign('workflow_id', 'workflow_action_1')->references('id')->on('workflow_name')->onUpdate('NO ACTION')->onDelete('RESTRICT'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::drop('workflow_action'); + Schema::table('workflow_action', function (Blueprint $table) { + $table->dropForeign('workflow_action_idfk_1'); + }); + } +} diff --git a/database/seeds/DatabaseSeeder.php b/database/seeds/DatabaseSeeder.php index 46a0f5dc3..776579992 100644 --- a/database/seeds/DatabaseSeeder.php +++ b/database/seeds/DatabaseSeeder.php @@ -196,10 +196,10 @@ class DatabaseSeeder extends Seeder Ticket_status::create(['name' => 'Archived', 'state' => 'archived', 'mode' => '3', 'message' => 'Ticket have been Archived by', 'flags' => '0', 'sort' => '4', 'properties' => 'Tickets only adminstratively available but no longer accessible on ticket queues and client panel.']); Ticket_status::create(['name' => 'Deleted', 'state' => 'deleted', 'mode' => '3', 'message' => 'Ticket have been Deleted by', 'flags' => '0', 'sort' => '5', 'properties' => 'Tickets queued for deletion. Not accessible on ticket queues.']); /* Ticket priority */ - Ticket_priority::create(['priority' => 'low', 'priority_desc' => 'Low', 'priority_color' => 'info', 'priority_urgency' => '4', 'ispublic' => '1']); - Ticket_priority::create(['priority' => 'normal', 'priority_desc' => 'Normal', 'priority_color' => 'info', 'priority_urgency' => '3', 'ispublic' => '1']); - Ticket_priority::create(['priority' => 'high', 'priority_desc' => 'High', 'priority_color' => 'warning', 'priority_urgency' => '2', 'ispublic' => '1']); - Ticket_priority::create(['priority' => 'emergency', 'priority_desc' => 'Emergency', 'priority_color' => 'danger', 'priority_urgency' => '1', 'ispublic' => '1']); + Ticket_priority::create(['priority' => 'Low', 'priority_desc' => 'Low', 'priority_color' => 'info', 'priority_urgency' => '4', 'ispublic' => '1']); + Ticket_priority::create(['priority' => 'Normal', 'priority_desc' => 'Normal', 'priority_color' => 'info', 'priority_urgency' => '3', 'ispublic' => '1']); + Ticket_priority::create(['priority' => 'High', 'priority_desc' => 'High', 'priority_color' => 'warning', 'priority_urgency' => '2', 'ispublic' => '1']); + Ticket_priority::create(['priority' => 'Emergency', 'priority_desc' => 'Emergency', 'priority_color' => 'danger', 'priority_urgency' => '1', 'ispublic' => '1']); /* SLA Plans */ Sla_plan::create(['name' => 'Sla 1', 'grace_period' => '6 Hours', 'status' => '1']); Sla_plan::create(['name' => 'Sla 2', 'grace_period' => '12 Hours', 'status' => '1']); diff --git a/nbproject/project.properties b/nbproject/project.properties new file mode 100644 index 000000000..e69de29bb diff --git a/nbproject/project.xml b/nbproject/project.xml new file mode 100644 index 000000000..067bd4be4 --- /dev/null +++ b/nbproject/project.xml @@ -0,0 +1,12 @@ + + + org.netbeans.modules.php.project + + + laravel + + + endif + + + diff --git a/public/css/notification-style.css b/public/css/notification-style.css new file mode 100644 index 000000000..3596d38c5 --- /dev/null +++ b/public/css/notification-style.css @@ -0,0 +1,22 @@ +.textcontent{ + display: inline-block; + padding-left: 5px; + font-weight: 600; + font-size: 14px; + font-family: 'Source Sans Pro','Helvetica Neue',Helvetica,Arial,sans-serif; +} +.task{ + opacity: 0.4; +} + +.task h6{ + text-decoration: line-through; +} + +.marginzero{ + margin: 0px; +} + +.font700{ + font-weight: 700; +} \ No newline at end of file diff --git a/public/downloads/en.zip b/public/downloads/en.zip index b6d455ea5f81c290a380384928642105c47598d7..1bb3a7638b905413e3e0a19ddd261cd22e206413 100644 GIT binary patch literal 11795 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 literal 9494 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 J^or}<{{yL)r!oKl literal 0 HcmV?d00001 diff --git a/public/lb-faveo/plugins/moment/moment.js b/public/lb-faveo/plugins/moment/moment.js new file mode 100644 index 000000000..4124b5e09 --- /dev/null +++ b/public/lb-faveo/plugins/moment/moment.js @@ -0,0 +1,11412 @@ +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + global.moment = factory() +}(this, function () { 'use strict'; + + var hookCallback; + + function utils_hooks__hooks () { + return hookCallback.apply(null, arguments); + } + + // This is done to register the method called with moment() + // without creating circular dependencies. + function setHookCallback (callback) { + hookCallback = callback; + } + + function isArray(input) { + return input instanceof Array || Object.prototype.toString.call(input) === '[object Array]'; + } + + function isDate(input) { + return input instanceof Date || Object.prototype.toString.call(input) === '[object Date]'; + } + + function map(arr, fn) { + var res = [], i; + for (i = 0; i < arr.length; ++i) { + res.push(fn(arr[i], i)); + } + return res; + } + + function hasOwnProp(a, b) { + return Object.prototype.hasOwnProperty.call(a, b); + } + + function extend(a, b) { + for (var i in b) { + if (hasOwnProp(b, i)) { + a[i] = b[i]; + } + } + + if (hasOwnProp(b, 'toString')) { + a.toString = b.toString; + } + + if (hasOwnProp(b, 'valueOf')) { + a.valueOf = b.valueOf; + } + + return a; + } + + function create_utc__createUTC (input, format, locale, strict) { + return createLocalOrUTC(input, format, locale, strict, true).utc(); + } + + function defaultParsingFlags() { + // We need to deep clone this object. + return { + empty : false, + unusedTokens : [], + unusedInput : [], + overflow : -2, + charsLeftOver : 0, + nullInput : false, + invalidMonth : null, + invalidFormat : false, + userInvalidated : false, + iso : false + }; + } + + function getParsingFlags(m) { + if (m._pf == null) { + m._pf = defaultParsingFlags(); + } + return m._pf; + } + + function valid__isValid(m) { + if (m._isValid == null) { + var flags = getParsingFlags(m); + m._isValid = !isNaN(m._d.getTime()) && + flags.overflow < 0 && + !flags.empty && + !flags.invalidMonth && + !flags.invalidWeekday && + !flags.nullInput && + !flags.invalidFormat && + !flags.userInvalidated; + + if (m._strict) { + m._isValid = m._isValid && + flags.charsLeftOver === 0 && + flags.unusedTokens.length === 0 && + flags.bigHour === undefined; + } + } + return m._isValid; + } + + function valid__createInvalid (flags) { + var m = create_utc__createUTC(NaN); + if (flags != null) { + extend(getParsingFlags(m), flags); + } + else { + getParsingFlags(m).userInvalidated = true; + } + + return m; + } + + function isUndefined(input) { + return input === void 0; + } + + // Plugins that add properties should also add the key here (null value), + // so we can properly clone ourselves. + var momentProperties = utils_hooks__hooks.momentProperties = []; + + function copyConfig(to, from) { + var i, prop, val; + + if (!isUndefined(from._isAMomentObject)) { + to._isAMomentObject = from._isAMomentObject; + } + if (!isUndefined(from._i)) { + to._i = from._i; + } + if (!isUndefined(from._f)) { + to._f = from._f; + } + if (!isUndefined(from._l)) { + to._l = from._l; + } + if (!isUndefined(from._strict)) { + to._strict = from._strict; + } + if (!isUndefined(from._tzm)) { + to._tzm = from._tzm; + } + if (!isUndefined(from._isUTC)) { + to._isUTC = from._isUTC; + } + if (!isUndefined(from._offset)) { + to._offset = from._offset; + } + if (!isUndefined(from._pf)) { + to._pf = getParsingFlags(from); + } + if (!isUndefined(from._locale)) { + to._locale = from._locale; + } + + if (momentProperties.length > 0) { + for (i in momentProperties) { + prop = momentProperties[i]; + val = from[prop]; + if (!isUndefined(val)) { + to[prop] = val; + } + } + } + + return to; + } + + var updateInProgress = false; + + // Moment prototype object + function Moment(config) { + copyConfig(this, config); + this._d = new Date(config._d != null ? config._d.getTime() : NaN); + // Prevent infinite loop in case updateOffset creates new moment + // objects. + if (updateInProgress === false) { + updateInProgress = true; + utils_hooks__hooks.updateOffset(this); + updateInProgress = false; + } + } + + function isMoment (obj) { + return obj instanceof Moment || (obj != null && obj._isAMomentObject != null); + } + + function absFloor (number) { + if (number < 0) { + return Math.ceil(number); + } else { + return Math.floor(number); + } + } + + function toInt(argumentForCoercion) { + var coercedNumber = +argumentForCoercion, + value = 0; + + if (coercedNumber !== 0 && isFinite(coercedNumber)) { + value = absFloor(coercedNumber); + } + + return value; + } + + // compare two arrays, return the number of differences + function compareArrays(array1, array2, dontConvert) { + var len = Math.min(array1.length, array2.length), + lengthDiff = Math.abs(array1.length - array2.length), + diffs = 0, + i; + for (i = 0; i < len; i++) { + if ((dontConvert && array1[i] !== array2[i]) || + (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) { + diffs++; + } + } + return diffs + lengthDiff; + } + + function warn(msg) { + if (utils_hooks__hooks.suppressDeprecationWarnings === false && + (typeof console !== 'undefined') && console.warn) { + console.warn('Deprecation warning: ' + msg); + } + } + + function deprecate(msg, fn) { + var firstTime = true; + + return extend(function () { + if (firstTime) { + warn(msg + '\nArguments: ' + Array.prototype.slice.call(arguments).join(', ') + '\n' + (new Error()).stack); + firstTime = false; + } + return fn.apply(this, arguments); + }, fn); + } + + var deprecations = {}; + + function deprecateSimple(name, msg) { + if (!deprecations[name]) { + warn(msg); + deprecations[name] = true; + } + } + + utils_hooks__hooks.suppressDeprecationWarnings = false; + + function isFunction(input) { + return input instanceof Function || Object.prototype.toString.call(input) === '[object Function]'; + } + + function isObject(input) { + return Object.prototype.toString.call(input) === '[object Object]'; + } + + function locale_set__set (config) { + var prop, i; + for (i in config) { + prop = config[i]; + if (isFunction(prop)) { + this[i] = prop; + } else { + this['_' + i] = prop; + } + } + this._config = config; + // Lenient ordinal parsing accepts just a number in addition to + // number + (possibly) stuff coming from _ordinalParseLenient. + this._ordinalParseLenient = new RegExp(this._ordinalParse.source + '|' + (/\d{1,2}/).source); + } + + function mergeConfigs(parentConfig, childConfig) { + var res = extend({}, parentConfig), prop; + for (prop in childConfig) { + if (hasOwnProp(childConfig, prop)) { + if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) { + res[prop] = {}; + extend(res[prop], parentConfig[prop]); + extend(res[prop], childConfig[prop]); + } else if (childConfig[prop] != null) { + res[prop] = childConfig[prop]; + } else { + delete res[prop]; + } + } + } + return res; + } + + function Locale(config) { + if (config != null) { + this.set(config); + } + } + + // internal storage for locale config files + var locales = {}; + var globalLocale; + + function normalizeLocale(key) { + return key ? key.toLowerCase().replace('_', '-') : key; + } + + // pick the locale from the array + // try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each + // substring from most specific to least, but move to the next array item if it's a more specific variant than the current root + function chooseLocale(names) { + var i = 0, j, next, locale, split; + + while (i < names.length) { + split = normalizeLocale(names[i]).split('-'); + j = split.length; + next = normalizeLocale(names[i + 1]); + next = next ? next.split('-') : null; + while (j > 0) { + locale = loadLocale(split.slice(0, j).join('-')); + if (locale) { + return locale; + } + if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) { + //the next array item is better than a shallower substring of this one + break; + } + j--; + } + i++; + } + return null; + } + + function loadLocale(name) { + var oldLocale = null; + // TODO: Find a better way to register and load all the locales in Node + if (!locales[name] && (typeof module !== 'undefined') && + module && module.exports) { + try { + oldLocale = globalLocale._abbr; + require('./locale/' + name); + // because defineLocale currently also sets the global locale, we + // want to undo that for lazy loaded locales + locale_locales__getSetGlobalLocale(oldLocale); + } catch (e) { } + } + return locales[name]; + } + + // This function will load locale and then set the global locale. If + // no arguments are passed in, it will simply return the current global + // locale key. + function locale_locales__getSetGlobalLocale (key, values) { + var data; + if (key) { + if (isUndefined(values)) { + data = locale_locales__getLocale(key); + } + else { + data = defineLocale(key, values); + } + + if (data) { + // moment.duration._locale = moment._locale = data; + globalLocale = data; + } + } + + return globalLocale._abbr; + } + + function defineLocale (name, config) { + if (config !== null) { + config.abbr = name; + if (locales[name] != null) { + deprecateSimple('defineLocaleOverride', + 'use moment.updateLocale(localeName, config) to change ' + + 'an existing locale. moment.defineLocale(localeName, ' + + 'config) should only be used for creating a new locale'); + config = mergeConfigs(locales[name]._config, config); + } else if (config.parentLocale != null) { + if (locales[config.parentLocale] != null) { + config = mergeConfigs(locales[config.parentLocale]._config, config); + } else { + // treat as if there is no base config + deprecateSimple('parentLocaleUndefined', + 'specified parentLocale is not defined yet'); + } + } + locales[name] = new Locale(config); + + // backwards compat for now: also set the locale + locale_locales__getSetGlobalLocale(name); + + return locales[name]; + } else { + // useful for testing + delete locales[name]; + return null; + } + } + + function updateLocale(name, config) { + if (config != null) { + var locale; + if (locales[name] != null) { + config = mergeConfigs(locales[name]._config, config); + } + locale = new Locale(config); + locale.parentLocale = locales[name]; + locales[name] = locale; + + // backwards compat for now: also set the locale + locale_locales__getSetGlobalLocale(name); + } else { + // pass null for config to unupdate, useful for tests + if (locales[name] != null) { + if (locales[name].parentLocale != null) { + locales[name] = locales[name].parentLocale; + } else if (locales[name] != null) { + delete locales[name]; + } + } + } + return locales[name]; + } + + // returns locale data + function locale_locales__getLocale (key) { + var locale; + + if (key && key._locale && key._locale._abbr) { + key = key._locale._abbr; + } + + if (!key) { + return globalLocale; + } + + if (!isArray(key)) { + //short-circuit everything else + locale = loadLocale(key); + if (locale) { + return locale; + } + key = [key]; + } + + return chooseLocale(key); + } + + function locale_locales__listLocales() { + return Object.keys(locales); + } + + var aliases = {}; + + function addUnitAlias (unit, shorthand) { + var lowerCase = unit.toLowerCase(); + aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit; + } + + function normalizeUnits(units) { + return typeof units === 'string' ? aliases[units] || aliases[units.toLowerCase()] : undefined; + } + + function normalizeObjectUnits(inputObject) { + var normalizedInput = {}, + normalizedProp, + prop; + + for (prop in inputObject) { + if (hasOwnProp(inputObject, prop)) { + normalizedProp = normalizeUnits(prop); + if (normalizedProp) { + normalizedInput[normalizedProp] = inputObject[prop]; + } + } + } + + return normalizedInput; + } + + function makeGetSet (unit, keepTime) { + return function (value) { + if (value != null) { + get_set__set(this, unit, value); + utils_hooks__hooks.updateOffset(this, keepTime); + return this; + } else { + return get_set__get(this, unit); + } + }; + } + + function get_set__get (mom, unit) { + return mom.isValid() ? + mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]() : NaN; + } + + function get_set__set (mom, unit, value) { + if (mom.isValid()) { + mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value); + } + } + + // MOMENTS + + function getSet (units, value) { + var unit; + if (typeof units === 'object') { + for (unit in units) { + this.set(unit, units[unit]); + } + } else { + units = normalizeUnits(units); + if (isFunction(this[units])) { + return this[units](value); + } + } + return this; + } + + function zeroFill(number, targetLength, forceSign) { + var absNumber = '' + Math.abs(number), + zerosToFill = targetLength - absNumber.length, + sign = number >= 0; + return (sign ? (forceSign ? '+' : '') : '-') + + Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) + absNumber; + } + + var formattingTokens = /(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g; + + var localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g; + + var formatFunctions = {}; + + var formatTokenFunctions = {}; + + // token: 'M' + // padded: ['MM', 2] + // ordinal: 'Mo' + // callback: function () { this.month() + 1 } + function addFormatToken (token, padded, ordinal, callback) { + var func = callback; + if (typeof callback === 'string') { + func = function () { + return this[callback](); + }; + } + if (token) { + formatTokenFunctions[token] = func; + } + if (padded) { + formatTokenFunctions[padded[0]] = function () { + return zeroFill(func.apply(this, arguments), padded[1], padded[2]); + }; + } + if (ordinal) { + formatTokenFunctions[ordinal] = function () { + return this.localeData().ordinal(func.apply(this, arguments), token); + }; + } + } + + function removeFormattingTokens(input) { + if (input.match(/\[[\s\S]/)) { + return input.replace(/^\[|\]$/g, ''); + } + return input.replace(/\\/g, ''); + } + + function makeFormatFunction(format) { + var array = format.match(formattingTokens), i, length; + + for (i = 0, length = array.length; i < length; i++) { + if (formatTokenFunctions[array[i]]) { + array[i] = formatTokenFunctions[array[i]]; + } else { + array[i] = removeFormattingTokens(array[i]); + } + } + + return function (mom) { + var output = ''; + for (i = 0; i < length; i++) { + output += array[i] instanceof Function ? array[i].call(mom, format) : array[i]; + } + return output; + }; + } + + // format date using native date object + function formatMoment(m, format) { + if (!m.isValid()) { + return m.localeData().invalidDate(); + } + + format = expandFormat(format, m.localeData()); + formatFunctions[format] = formatFunctions[format] || makeFormatFunction(format); + + return formatFunctions[format](m); + } + + function expandFormat(format, locale) { + var i = 5; + + function replaceLongDateFormatTokens(input) { + return locale.longDateFormat(input) || input; + } + + localFormattingTokens.lastIndex = 0; + while (i >= 0 && localFormattingTokens.test(format)) { + format = format.replace(localFormattingTokens, replaceLongDateFormatTokens); + localFormattingTokens.lastIndex = 0; + i -= 1; + } + + return format; + } + + var match1 = /\d/; // 0 - 9 + var match2 = /\d\d/; // 00 - 99 + var match3 = /\d{3}/; // 000 - 999 + var match4 = /\d{4}/; // 0000 - 9999 + var match6 = /[+-]?\d{6}/; // -999999 - 999999 + var match1to2 = /\d\d?/; // 0 - 99 + var match3to4 = /\d\d\d\d?/; // 999 - 9999 + var match5to6 = /\d\d\d\d\d\d?/; // 99999 - 999999 + var match1to3 = /\d{1,3}/; // 0 - 999 + var match1to4 = /\d{1,4}/; // 0 - 9999 + var match1to6 = /[+-]?\d{1,6}/; // -999999 - 999999 + + var matchUnsigned = /\d+/; // 0 - inf + var matchSigned = /[+-]?\d+/; // -inf - inf + + var matchOffset = /Z|[+-]\d\d:?\d\d/gi; // +00:00 -00:00 +0000 -0000 or Z + var matchShortOffset = /Z|[+-]\d\d(?::?\d\d)?/gi; // +00 -00 +00:00 -00:00 +0000 -0000 or Z + + var matchTimestamp = /[+-]?\d+(\.\d{1,3})?/; // 123456789 123456789.123 + + // any word (or two) characters or numbers including two/three word month in arabic. + // includes scottish gaelic two word and hyphenated months + var matchWord = /[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i; + + + var regexes = {}; + + function addRegexToken (token, regex, strictRegex) { + regexes[token] = isFunction(regex) ? regex : function (isStrict, localeData) { + return (isStrict && strictRegex) ? strictRegex : regex; + }; + } + + function getParseRegexForToken (token, config) { + if (!hasOwnProp(regexes, token)) { + return new RegExp(unescapeFormat(token)); + } + + return regexes[token](config._strict, config._locale); + } + + // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript + function unescapeFormat(s) { + return regexEscape(s.replace('\\', '').replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (matched, p1, p2, p3, p4) { + return p1 || p2 || p3 || p4; + })); + } + + function regexEscape(s) { + return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); + } + + var tokens = {}; + + function addParseToken (token, callback) { + var i, func = callback; + if (typeof token === 'string') { + token = [token]; + } + if (typeof callback === 'number') { + func = function (input, array) { + array[callback] = toInt(input); + }; + } + for (i = 0; i < token.length; i++) { + tokens[token[i]] = func; + } + } + + function addWeekParseToken (token, callback) { + addParseToken(token, function (input, array, config, token) { + config._w = config._w || {}; + callback(input, config._w, config, token); + }); + } + + function addTimeToArrayFromToken(token, input, config) { + if (input != null && hasOwnProp(tokens, token)) { + tokens[token](input, config._a, config, token); + } + } + + var YEAR = 0; + var MONTH = 1; + var DATE = 2; + var HOUR = 3; + var MINUTE = 4; + var SECOND = 5; + var MILLISECOND = 6; + var WEEK = 7; + var WEEKDAY = 8; + + function daysInMonth(year, month) { + return new Date(Date.UTC(year, month + 1, 0)).getUTCDate(); + } + + // FORMATTING + + addFormatToken('M', ['MM', 2], 'Mo', function () { + return this.month() + 1; + }); + + addFormatToken('MMM', 0, 0, function (format) { + return this.localeData().monthsShort(this, format); + }); + + addFormatToken('MMMM', 0, 0, function (format) { + return this.localeData().months(this, format); + }); + + // ALIASES + + addUnitAlias('month', 'M'); + + // PARSING + + addRegexToken('M', match1to2); + addRegexToken('MM', match1to2, match2); + addRegexToken('MMM', function (isStrict, locale) { + return locale.monthsShortRegex(isStrict); + }); + addRegexToken('MMMM', function (isStrict, locale) { + return locale.monthsRegex(isStrict); + }); + + addParseToken(['M', 'MM'], function (input, array) { + array[MONTH] = toInt(input) - 1; + }); + + addParseToken(['MMM', 'MMMM'], function (input, array, config, token) { + var month = config._locale.monthsParse(input, token, config._strict); + // if we didn't find a month name, mark the date as invalid. + if (month != null) { + array[MONTH] = month; + } else { + getParsingFlags(config).invalidMonth = input; + } + }); + + // LOCALES + + var MONTHS_IN_FORMAT = /D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/; + var defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'); + function localeMonths (m, format) { + return isArray(this._months) ? this._months[m.month()] : + this._months[MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'][m.month()]; + } + + var defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'); + function localeMonthsShort (m, format) { + return isArray(this._monthsShort) ? this._monthsShort[m.month()] : + this._monthsShort[MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'][m.month()]; + } + + function localeMonthsParse (monthName, format, strict) { + var i, mom, regex; + + if (!this._monthsParse) { + this._monthsParse = []; + this._longMonthsParse = []; + this._shortMonthsParse = []; + } + + for (i = 0; i < 12; i++) { + // make the regex if we don't have it already + mom = create_utc__createUTC([2000, i]); + if (strict && !this._longMonthsParse[i]) { + this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i'); + this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i'); + } + if (!strict && !this._monthsParse[i]) { + regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, ''); + this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i'); + } + // test the regex + if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) { + return i; + } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) { + return i; + } else if (!strict && this._monthsParse[i].test(monthName)) { + return i; + } + } + } + + // MOMENTS + + function setMonth (mom, value) { + var dayOfMonth; + + if (!mom.isValid()) { + // No op + return mom; + } + + if (typeof value === 'string') { + if (/^\d+$/.test(value)) { + value = toInt(value); + } else { + value = mom.localeData().monthsParse(value); + // TODO: Another silent failure? + if (typeof value !== 'number') { + return mom; + } + } + } + + dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value)); + mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth); + return mom; + } + + function getSetMonth (value) { + if (value != null) { + setMonth(this, value); + utils_hooks__hooks.updateOffset(this, true); + return this; + } else { + return get_set__get(this, 'Month'); + } + } + + function getDaysInMonth () { + return daysInMonth(this.year(), this.month()); + } + + var defaultMonthsShortRegex = matchWord; + function monthsShortRegex (isStrict) { + if (this._monthsParseExact) { + if (!hasOwnProp(this, '_monthsRegex')) { + computeMonthsParse.call(this); + } + if (isStrict) { + return this._monthsShortStrictRegex; + } else { + return this._monthsShortRegex; + } + } else { + return this._monthsShortStrictRegex && isStrict ? + this._monthsShortStrictRegex : this._monthsShortRegex; + } + } + + var defaultMonthsRegex = matchWord; + function monthsRegex (isStrict) { + if (this._monthsParseExact) { + if (!hasOwnProp(this, '_monthsRegex')) { + computeMonthsParse.call(this); + } + if (isStrict) { + return this._monthsStrictRegex; + } else { + return this._monthsRegex; + } + } else { + return this._monthsStrictRegex && isStrict ? + this._monthsStrictRegex : this._monthsRegex; + } + } + + function computeMonthsParse () { + function cmpLenRev(a, b) { + return b.length - a.length; + } + + var shortPieces = [], longPieces = [], mixedPieces = [], + i, mom; + for (i = 0; i < 12; i++) { + // make the regex if we don't have it already + mom = create_utc__createUTC([2000, i]); + shortPieces.push(this.monthsShort(mom, '')); + longPieces.push(this.months(mom, '')); + mixedPieces.push(this.months(mom, '')); + mixedPieces.push(this.monthsShort(mom, '')); + } + // Sorting makes sure if one month (or abbr) is a prefix of another it + // will match the longer piece. + shortPieces.sort(cmpLenRev); + longPieces.sort(cmpLenRev); + mixedPieces.sort(cmpLenRev); + for (i = 0; i < 12; i++) { + shortPieces[i] = regexEscape(shortPieces[i]); + longPieces[i] = regexEscape(longPieces[i]); + mixedPieces[i] = regexEscape(mixedPieces[i]); + } + + this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i'); + this._monthsShortRegex = this._monthsRegex; + this._monthsStrictRegex = new RegExp('^(' + longPieces.join('|') + ')$', 'i'); + this._monthsShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')$', 'i'); + } + + function checkOverflow (m) { + var overflow; + var a = m._a; + + if (a && getParsingFlags(m).overflow === -2) { + overflow = + a[MONTH] < 0 || a[MONTH] > 11 ? MONTH : + a[DATE] < 1 || a[DATE] > daysInMonth(a[YEAR], a[MONTH]) ? DATE : + a[HOUR] < 0 || a[HOUR] > 24 || (a[HOUR] === 24 && (a[MINUTE] !== 0 || a[SECOND] !== 0 || a[MILLISECOND] !== 0)) ? HOUR : + a[MINUTE] < 0 || a[MINUTE] > 59 ? MINUTE : + a[SECOND] < 0 || a[SECOND] > 59 ? SECOND : + a[MILLISECOND] < 0 || a[MILLISECOND] > 999 ? MILLISECOND : + -1; + + if (getParsingFlags(m)._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) { + overflow = DATE; + } + if (getParsingFlags(m)._overflowWeeks && overflow === -1) { + overflow = WEEK; + } + if (getParsingFlags(m)._overflowWeekday && overflow === -1) { + overflow = WEEKDAY; + } + + getParsingFlags(m).overflow = overflow; + } + + return m; + } + + // iso 8601 regex + // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00) + var extendedIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?/; + var basicIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?/; + + var tzRegex = /Z|[+-]\d\d(?::?\d\d)?/; + + var isoDates = [ + ['YYYYYY-MM-DD', /[+-]\d{6}-\d\d-\d\d/], + ['YYYY-MM-DD', /\d{4}-\d\d-\d\d/], + ['GGGG-[W]WW-E', /\d{4}-W\d\d-\d/], + ['GGGG-[W]WW', /\d{4}-W\d\d/, false], + ['YYYY-DDD', /\d{4}-\d{3}/], + ['YYYY-MM', /\d{4}-\d\d/, false], + ['YYYYYYMMDD', /[+-]\d{10}/], + ['YYYYMMDD', /\d{8}/], + // YYYYMM is NOT allowed by the standard + ['GGGG[W]WWE', /\d{4}W\d{3}/], + ['GGGG[W]WW', /\d{4}W\d{2}/, false], + ['YYYYDDD', /\d{7}/] + ]; + + // iso time formats and regexes + var isoTimes = [ + ['HH:mm:ss.SSSS', /\d\d:\d\d:\d\d\.\d+/], + ['HH:mm:ss,SSSS', /\d\d:\d\d:\d\d,\d+/], + ['HH:mm:ss', /\d\d:\d\d:\d\d/], + ['HH:mm', /\d\d:\d\d/], + ['HHmmss.SSSS', /\d\d\d\d\d\d\.\d+/], + ['HHmmss,SSSS', /\d\d\d\d\d\d,\d+/], + ['HHmmss', /\d\d\d\d\d\d/], + ['HHmm', /\d\d\d\d/], + ['HH', /\d\d/] + ]; + + var aspNetJsonRegex = /^\/?Date\((\-?\d+)/i; + + // date from iso format + function configFromISO(config) { + var i, l, + string = config._i, + match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string), + allowTime, dateFormat, timeFormat, tzFormat; + + if (match) { + getParsingFlags(config).iso = true; + + for (i = 0, l = isoDates.length; i < l; i++) { + if (isoDates[i][1].exec(match[1])) { + dateFormat = isoDates[i][0]; + allowTime = isoDates[i][2] !== false; + break; + } + } + if (dateFormat == null) { + config._isValid = false; + return; + } + if (match[3]) { + for (i = 0, l = isoTimes.length; i < l; i++) { + if (isoTimes[i][1].exec(match[3])) { + // match[2] should be 'T' or space + timeFormat = (match[2] || ' ') + isoTimes[i][0]; + break; + } + } + if (timeFormat == null) { + config._isValid = false; + return; + } + } + if (!allowTime && timeFormat != null) { + config._isValid = false; + return; + } + if (match[4]) { + if (tzRegex.exec(match[4])) { + tzFormat = 'Z'; + } else { + config._isValid = false; + return; + } + } + config._f = dateFormat + (timeFormat || '') + (tzFormat || ''); + configFromStringAndFormat(config); + } else { + config._isValid = false; + } + } + + // date from iso format or fallback + function configFromString(config) { + var matched = aspNetJsonRegex.exec(config._i); + + if (matched !== null) { + config._d = new Date(+matched[1]); + return; + } + + configFromISO(config); + if (config._isValid === false) { + delete config._isValid; + utils_hooks__hooks.createFromInputFallback(config); + } + } + + utils_hooks__hooks.createFromInputFallback = deprecate( + 'moment construction falls back to js Date. This is ' + + 'discouraged and will be removed in upcoming major ' + + 'release. Please refer to ' + + 'https://github.com/moment/moment/issues/1407 for more info.', + function (config) { + config._d = new Date(config._i + (config._useUTC ? ' UTC' : '')); + } + ); + + function createDate (y, m, d, h, M, s, ms) { + //can't just apply() to create a date: + //http://stackoverflow.com/questions/181348/instantiating-a-javascript-object-by-calling-prototype-constructor-apply + var date = new Date(y, m, d, h, M, s, ms); + + //the date constructor remaps years 0-99 to 1900-1999 + if (y < 100 && y >= 0 && isFinite(date.getFullYear())) { + date.setFullYear(y); + } + return date; + } + + function createUTCDate (y) { + var date = new Date(Date.UTC.apply(null, arguments)); + + //the Date.UTC function remaps years 0-99 to 1900-1999 + if (y < 100 && y >= 0 && isFinite(date.getUTCFullYear())) { + date.setUTCFullYear(y); + } + return date; + } + + // FORMATTING + + addFormatToken('Y', 0, 0, function () { + var y = this.year(); + return y <= 9999 ? '' + y : '+' + y; + }); + + addFormatToken(0, ['YY', 2], 0, function () { + return this.year() % 100; + }); + + addFormatToken(0, ['YYYY', 4], 0, 'year'); + addFormatToken(0, ['YYYYY', 5], 0, 'year'); + addFormatToken(0, ['YYYYYY', 6, true], 0, 'year'); + + // ALIASES + + addUnitAlias('year', 'y'); + + // PARSING + + addRegexToken('Y', matchSigned); + addRegexToken('YY', match1to2, match2); + addRegexToken('YYYY', match1to4, match4); + addRegexToken('YYYYY', match1to6, match6); + addRegexToken('YYYYYY', match1to6, match6); + + addParseToken(['YYYYY', 'YYYYYY'], YEAR); + addParseToken('YYYY', function (input, array) { + array[YEAR] = input.length === 2 ? utils_hooks__hooks.parseTwoDigitYear(input) : toInt(input); + }); + addParseToken('YY', function (input, array) { + array[YEAR] = utils_hooks__hooks.parseTwoDigitYear(input); + }); + addParseToken('Y', function (input, array) { + array[YEAR] = parseInt(input, 10); + }); + + // HELPERS + + function daysInYear(year) { + return isLeapYear(year) ? 366 : 365; + } + + function isLeapYear(year) { + return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0; + } + + // HOOKS + + utils_hooks__hooks.parseTwoDigitYear = function (input) { + return toInt(input) + (toInt(input) > 68 ? 1900 : 2000); + }; + + // MOMENTS + + var getSetYear = makeGetSet('FullYear', false); + + function getIsLeapYear () { + return isLeapYear(this.year()); + } + + // start-of-first-week - start-of-year + function firstWeekOffset(year, dow, doy) { + var // first-week day -- which january is always in the first week (4 for iso, 1 for other) + fwd = 7 + dow - doy, + // first-week day local weekday -- which local weekday is fwd + fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7; + + return -fwdlw + fwd - 1; + } + + //http://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday + function dayOfYearFromWeeks(year, week, weekday, dow, doy) { + var localWeekday = (7 + weekday - dow) % 7, + weekOffset = firstWeekOffset(year, dow, doy), + dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset, + resYear, resDayOfYear; + + if (dayOfYear <= 0) { + resYear = year - 1; + resDayOfYear = daysInYear(resYear) + dayOfYear; + } else if (dayOfYear > daysInYear(year)) { + resYear = year + 1; + resDayOfYear = dayOfYear - daysInYear(year); + } else { + resYear = year; + resDayOfYear = dayOfYear; + } + + return { + year: resYear, + dayOfYear: resDayOfYear + }; + } + + function weekOfYear(mom, dow, doy) { + var weekOffset = firstWeekOffset(mom.year(), dow, doy), + week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1, + resWeek, resYear; + + if (week < 1) { + resYear = mom.year() - 1; + resWeek = week + weeksInYear(resYear, dow, doy); + } else if (week > weeksInYear(mom.year(), dow, doy)) { + resWeek = week - weeksInYear(mom.year(), dow, doy); + resYear = mom.year() + 1; + } else { + resYear = mom.year(); + resWeek = week; + } + + return { + week: resWeek, + year: resYear + }; + } + + function weeksInYear(year, dow, doy) { + var weekOffset = firstWeekOffset(year, dow, doy), + weekOffsetNext = firstWeekOffset(year + 1, dow, doy); + return (daysInYear(year) - weekOffset + weekOffsetNext) / 7; + } + + // Pick the first defined of two or three arguments. + function defaults(a, b, c) { + if (a != null) { + return a; + } + if (b != null) { + return b; + } + return c; + } + + function currentDateArray(config) { + // hooks is actually the exported moment object + var nowValue = new Date(utils_hooks__hooks.now()); + if (config._useUTC) { + return [nowValue.getUTCFullYear(), nowValue.getUTCMonth(), nowValue.getUTCDate()]; + } + return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()]; + } + + // convert an array to a date. + // the array should mirror the parameters below + // note: all values past the year are optional and will default to the lowest possible value. + // [year, month, day , hour, minute, second, millisecond] + function configFromArray (config) { + var i, date, input = [], currentDate, yearToUse; + + if (config._d) { + return; + } + + currentDate = currentDateArray(config); + + //compute day of the year from weeks and weekdays + if (config._w && config._a[DATE] == null && config._a[MONTH] == null) { + dayOfYearFromWeekInfo(config); + } + + //if the day of the year is set, figure out what it is + if (config._dayOfYear) { + yearToUse = defaults(config._a[YEAR], currentDate[YEAR]); + + if (config._dayOfYear > daysInYear(yearToUse)) { + getParsingFlags(config)._overflowDayOfYear = true; + } + + date = createUTCDate(yearToUse, 0, config._dayOfYear); + config._a[MONTH] = date.getUTCMonth(); + config._a[DATE] = date.getUTCDate(); + } + + // Default to current date. + // * if no year, month, day of month are given, default to today + // * if day of month is given, default month and year + // * if month is given, default only year + // * if year is given, don't default anything + for (i = 0; i < 3 && config._a[i] == null; ++i) { + config._a[i] = input[i] = currentDate[i]; + } + + // Zero out whatever was not defaulted, including time + for (; i < 7; i++) { + config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i]; + } + + // Check for 24:00:00.000 + if (config._a[HOUR] === 24 && + config._a[MINUTE] === 0 && + config._a[SECOND] === 0 && + config._a[MILLISECOND] === 0) { + config._nextDay = true; + config._a[HOUR] = 0; + } + + config._d = (config._useUTC ? createUTCDate : createDate).apply(null, input); + // Apply timezone offset from input. The actual utcOffset can be changed + // with parseZone. + if (config._tzm != null) { + config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm); + } + + if (config._nextDay) { + config._a[HOUR] = 24; + } + } + + function dayOfYearFromWeekInfo(config) { + var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow; + + w = config._w; + if (w.GG != null || w.W != null || w.E != null) { + dow = 1; + doy = 4; + + // TODO: We need to take the current isoWeekYear, but that depends on + // how we interpret now (local, utc, fixed offset). So create + // a now version of current config (take local/utc/offset flags, and + // create now). + weekYear = defaults(w.GG, config._a[YEAR], weekOfYear(local__createLocal(), 1, 4).year); + week = defaults(w.W, 1); + weekday = defaults(w.E, 1); + if (weekday < 1 || weekday > 7) { + weekdayOverflow = true; + } + } else { + dow = config._locale._week.dow; + doy = config._locale._week.doy; + + weekYear = defaults(w.gg, config._a[YEAR], weekOfYear(local__createLocal(), dow, doy).year); + week = defaults(w.w, 1); + + if (w.d != null) { + // weekday -- low day numbers are considered next week + weekday = w.d; + if (weekday < 0 || weekday > 6) { + weekdayOverflow = true; + } + } else if (w.e != null) { + // local weekday -- counting starts from begining of week + weekday = w.e + dow; + if (w.e < 0 || w.e > 6) { + weekdayOverflow = true; + } + } else { + // default to begining of week + weekday = dow; + } + } + if (week < 1 || week > weeksInYear(weekYear, dow, doy)) { + getParsingFlags(config)._overflowWeeks = true; + } else if (weekdayOverflow != null) { + getParsingFlags(config)._overflowWeekday = true; + } else { + temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy); + config._a[YEAR] = temp.year; + config._dayOfYear = temp.dayOfYear; + } + } + + // constant that refers to the ISO standard + utils_hooks__hooks.ISO_8601 = function () {}; + + // date from string and format string + function configFromStringAndFormat(config) { + // TODO: Move this to another part of the creation flow to prevent circular deps + if (config._f === utils_hooks__hooks.ISO_8601) { + configFromISO(config); + return; + } + + config._a = []; + getParsingFlags(config).empty = true; + + // This array is used to make a Date, either with `new Date` or `Date.UTC` + var string = '' + config._i, + i, parsedInput, tokens, token, skipped, + stringLength = string.length, + totalParsedInputLength = 0; + + tokens = expandFormat(config._f, config._locale).match(formattingTokens) || []; + + for (i = 0; i < tokens.length; i++) { + token = tokens[i]; + parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0]; + // console.log('token', token, 'parsedInput', parsedInput, + // 'regex', getParseRegexForToken(token, config)); + if (parsedInput) { + skipped = string.substr(0, string.indexOf(parsedInput)); + if (skipped.length > 0) { + getParsingFlags(config).unusedInput.push(skipped); + } + string = string.slice(string.indexOf(parsedInput) + parsedInput.length); + totalParsedInputLength += parsedInput.length; + } + // don't parse if it's not a known token + if (formatTokenFunctions[token]) { + if (parsedInput) { + getParsingFlags(config).empty = false; + } + else { + getParsingFlags(config).unusedTokens.push(token); + } + addTimeToArrayFromToken(token, parsedInput, config); + } + else if (config._strict && !parsedInput) { + getParsingFlags(config).unusedTokens.push(token); + } + } + + // add remaining unparsed input length to the string + getParsingFlags(config).charsLeftOver = stringLength - totalParsedInputLength; + if (string.length > 0) { + getParsingFlags(config).unusedInput.push(string); + } + + // clear _12h flag if hour is <= 12 + if (getParsingFlags(config).bigHour === true && + config._a[HOUR] <= 12 && + config._a[HOUR] > 0) { + getParsingFlags(config).bigHour = undefined; + } + // handle meridiem + config._a[HOUR] = meridiemFixWrap(config._locale, config._a[HOUR], config._meridiem); + + configFromArray(config); + checkOverflow(config); + } + + + function meridiemFixWrap (locale, hour, meridiem) { + var isPm; + + if (meridiem == null) { + // nothing to do + return hour; + } + if (locale.meridiemHour != null) { + return locale.meridiemHour(hour, meridiem); + } else if (locale.isPM != null) { + // Fallback + isPm = locale.isPM(meridiem); + if (isPm && hour < 12) { + hour += 12; + } + if (!isPm && hour === 12) { + hour = 0; + } + return hour; + } else { + // this is not supposed to happen + return hour; + } + } + + // date from string and array of format strings + function configFromStringAndArray(config) { + var tempConfig, + bestMoment, + + scoreToBeat, + i, + currentScore; + + if (config._f.length === 0) { + getParsingFlags(config).invalidFormat = true; + config._d = new Date(NaN); + return; + } + + for (i = 0; i < config._f.length; i++) { + currentScore = 0; + tempConfig = copyConfig({}, config); + if (config._useUTC != null) { + tempConfig._useUTC = config._useUTC; + } + tempConfig._f = config._f[i]; + configFromStringAndFormat(tempConfig); + + if (!valid__isValid(tempConfig)) { + continue; + } + + // if there is any input that was not parsed add a penalty for that format + currentScore += getParsingFlags(tempConfig).charsLeftOver; + + //or tokens + currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10; + + getParsingFlags(tempConfig).score = currentScore; + + if (scoreToBeat == null || currentScore < scoreToBeat) { + scoreToBeat = currentScore; + bestMoment = tempConfig; + } + } + + extend(config, bestMoment || tempConfig); + } + + function configFromObject(config) { + if (config._d) { + return; + } + + var i = normalizeObjectUnits(config._i); + config._a = map([i.year, i.month, i.day || i.date, i.hour, i.minute, i.second, i.millisecond], function (obj) { + return obj && parseInt(obj, 10); + }); + + configFromArray(config); + } + + function createFromConfig (config) { + var res = new Moment(checkOverflow(prepareConfig(config))); + if (res._nextDay) { + // Adding is smart enough around DST + res.add(1, 'd'); + res._nextDay = undefined; + } + + return res; + } + + function prepareConfig (config) { + var input = config._i, + format = config._f; + + config._locale = config._locale || locale_locales__getLocale(config._l); + + if (input === null || (format === undefined && input === '')) { + return valid__createInvalid({nullInput: true}); + } + + if (typeof input === 'string') { + config._i = input = config._locale.preparse(input); + } + + if (isMoment(input)) { + return new Moment(checkOverflow(input)); + } else if (isArray(format)) { + configFromStringAndArray(config); + } else if (format) { + configFromStringAndFormat(config); + } else if (isDate(input)) { + config._d = input; + } else { + configFromInput(config); + } + + if (!valid__isValid(config)) { + config._d = null; + } + + return config; + } + + function configFromInput(config) { + var input = config._i; + if (input === undefined) { + config._d = new Date(utils_hooks__hooks.now()); + } else if (isDate(input)) { + config._d = new Date(+input); + } else if (typeof input === 'string') { + configFromString(config); + } else if (isArray(input)) { + config._a = map(input.slice(0), function (obj) { + return parseInt(obj, 10); + }); + configFromArray(config); + } else if (typeof(input) === 'object') { + configFromObject(config); + } else if (typeof(input) === 'number') { + // from milliseconds + config._d = new Date(input); + } else { + utils_hooks__hooks.createFromInputFallback(config); + } + } + + function createLocalOrUTC (input, format, locale, strict, isUTC) { + var c = {}; + + if (typeof(locale) === 'boolean') { + strict = locale; + locale = undefined; + } + // object construction must be done this way. + // https://github.com/moment/moment/issues/1423 + c._isAMomentObject = true; + c._useUTC = c._isUTC = isUTC; + c._l = locale; + c._i = input; + c._f = format; + c._strict = strict; + + return createFromConfig(c); + } + + function local__createLocal (input, format, locale, strict) { + return createLocalOrUTC(input, format, locale, strict, false); + } + + var prototypeMin = deprecate( + 'moment().min is deprecated, use moment.max instead. https://github.com/moment/moment/issues/1548', + function () { + var other = local__createLocal.apply(null, arguments); + if (this.isValid() && other.isValid()) { + return other < this ? this : other; + } else { + return valid__createInvalid(); + } + } + ); + + var prototypeMax = deprecate( + 'moment().max is deprecated, use moment.min instead. https://github.com/moment/moment/issues/1548', + function () { + var other = local__createLocal.apply(null, arguments); + if (this.isValid() && other.isValid()) { + return other > this ? this : other; + } else { + return valid__createInvalid(); + } + } + ); + + // Pick a moment m from moments so that m[fn](other) is true for all + // other. This relies on the function fn to be transitive. + // + // moments should either be an array of moment objects or an array, whose + // first element is an array of moment objects. + function pickBy(fn, moments) { + var res, i; + if (moments.length === 1 && isArray(moments[0])) { + moments = moments[0]; + } + if (!moments.length) { + return local__createLocal(); + } + res = moments[0]; + for (i = 1; i < moments.length; ++i) { + if (!moments[i].isValid() || moments[i][fn](res)) { + res = moments[i]; + } + } + return res; + } + + // TODO: Use [].sort instead? + function min () { + var args = [].slice.call(arguments, 0); + + return pickBy('isBefore', args); + } + + function max () { + var args = [].slice.call(arguments, 0); + + return pickBy('isAfter', args); + } + + var now = function () { + return Date.now ? Date.now() : +(new Date()); + }; + + function Duration (duration) { + var normalizedInput = normalizeObjectUnits(duration), + years = normalizedInput.year || 0, + quarters = normalizedInput.quarter || 0, + months = normalizedInput.month || 0, + weeks = normalizedInput.week || 0, + days = normalizedInput.day || 0, + hours = normalizedInput.hour || 0, + minutes = normalizedInput.minute || 0, + seconds = normalizedInput.second || 0, + milliseconds = normalizedInput.millisecond || 0; + + // representation for dateAddRemove + this._milliseconds = +milliseconds + + seconds * 1e3 + // 1000 + minutes * 6e4 + // 1000 * 60 + hours * 36e5; // 1000 * 60 * 60 + // Because of dateAddRemove treats 24 hours as different from a + // day when working around DST, we need to store them separately + this._days = +days + + weeks * 7; + // It is impossible translate months into days without knowing + // which months you are are talking about, so we have to store + // it separately. + this._months = +months + + quarters * 3 + + years * 12; + + this._data = {}; + + this._locale = locale_locales__getLocale(); + + this._bubble(); + } + + function isDuration (obj) { + return obj instanceof Duration; + } + + // FORMATTING + + function offset (token, separator) { + addFormatToken(token, 0, 0, function () { + var offset = this.utcOffset(); + var sign = '+'; + if (offset < 0) { + offset = -offset; + sign = '-'; + } + return sign + zeroFill(~~(offset / 60), 2) + separator + zeroFill(~~(offset) % 60, 2); + }); + } + + offset('Z', ':'); + offset('ZZ', ''); + + // PARSING + + addRegexToken('Z', matchShortOffset); + addRegexToken('ZZ', matchShortOffset); + addParseToken(['Z', 'ZZ'], function (input, array, config) { + config._useUTC = true; + config._tzm = offsetFromString(matchShortOffset, input); + }); + + // HELPERS + + // timezone chunker + // '+10:00' > ['10', '00'] + // '-1530' > ['-15', '30'] + var chunkOffset = /([\+\-]|\d\d)/gi; + + function offsetFromString(matcher, string) { + var matches = ((string || '').match(matcher) || []); + var chunk = matches[matches.length - 1] || []; + var parts = (chunk + '').match(chunkOffset) || ['-', 0, 0]; + var minutes = +(parts[1] * 60) + toInt(parts[2]); + + return parts[0] === '+' ? minutes : -minutes; + } + + // Return a moment from input, that is local/utc/zone equivalent to model. + function cloneWithOffset(input, model) { + var res, diff; + if (model._isUTC) { + res = model.clone(); + diff = (isMoment(input) || isDate(input) ? +input : +local__createLocal(input)) - (+res); + // Use low-level api, because this fn is low-level api. + res._d.setTime(+res._d + diff); + utils_hooks__hooks.updateOffset(res, false); + return res; + } else { + return local__createLocal(input).local(); + } + } + + function getDateOffset (m) { + // On Firefox.24 Date#getTimezoneOffset returns a floating point. + // https://github.com/moment/moment/pull/1871 + return -Math.round(m._d.getTimezoneOffset() / 15) * 15; + } + + // HOOKS + + // This function will be called whenever a moment is mutated. + // It is intended to keep the offset in sync with the timezone. + utils_hooks__hooks.updateOffset = function () {}; + + // MOMENTS + + // keepLocalTime = true means only change the timezone, without + // affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]--> + // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset + // +0200, so we adjust the time as needed, to be valid. + // + // Keeping the time actually adds/subtracts (one hour) + // from the actual represented time. That is why we call updateOffset + // a second time. In case it wants us to change the offset again + // _changeInProgress == true case, then we have to adjust, because + // there is no such time in the given timezone. + function getSetOffset (input, keepLocalTime) { + var offset = this._offset || 0, + localAdjust; + if (!this.isValid()) { + return input != null ? this : NaN; + } + if (input != null) { + if (typeof input === 'string') { + input = offsetFromString(matchShortOffset, input); + } else if (Math.abs(input) < 16) { + input = input * 60; + } + if (!this._isUTC && keepLocalTime) { + localAdjust = getDateOffset(this); + } + this._offset = input; + this._isUTC = true; + if (localAdjust != null) { + this.add(localAdjust, 'm'); + } + if (offset !== input) { + if (!keepLocalTime || this._changeInProgress) { + add_subtract__addSubtract(this, create__createDuration(input - offset, 'm'), 1, false); + } else if (!this._changeInProgress) { + this._changeInProgress = true; + utils_hooks__hooks.updateOffset(this, true); + this._changeInProgress = null; + } + } + return this; + } else { + return this._isUTC ? offset : getDateOffset(this); + } + } + + function getSetZone (input, keepLocalTime) { + if (input != null) { + if (typeof input !== 'string') { + input = -input; + } + + this.utcOffset(input, keepLocalTime); + + return this; + } else { + return -this.utcOffset(); + } + } + + function setOffsetToUTC (keepLocalTime) { + return this.utcOffset(0, keepLocalTime); + } + + function setOffsetToLocal (keepLocalTime) { + if (this._isUTC) { + this.utcOffset(0, keepLocalTime); + this._isUTC = false; + + if (keepLocalTime) { + this.subtract(getDateOffset(this), 'm'); + } + } + return this; + } + + function setOffsetToParsedOffset () { + if (this._tzm) { + this.utcOffset(this._tzm); + } else if (typeof this._i === 'string') { + this.utcOffset(offsetFromString(matchOffset, this._i)); + } + return this; + } + + function hasAlignedHourOffset (input) { + if (!this.isValid()) { + return false; + } + input = input ? local__createLocal(input).utcOffset() : 0; + + return (this.utcOffset() - input) % 60 === 0; + } + + function isDaylightSavingTime () { + return ( + this.utcOffset() > this.clone().month(0).utcOffset() || + this.utcOffset() > this.clone().month(5).utcOffset() + ); + } + + function isDaylightSavingTimeShifted () { + if (!isUndefined(this._isDSTShifted)) { + return this._isDSTShifted; + } + + var c = {}; + + copyConfig(c, this); + c = prepareConfig(c); + + if (c._a) { + var other = c._isUTC ? create_utc__createUTC(c._a) : local__createLocal(c._a); + this._isDSTShifted = this.isValid() && + compareArrays(c._a, other.toArray()) > 0; + } else { + this._isDSTShifted = false; + } + + return this._isDSTShifted; + } + + function isLocal () { + return this.isValid() ? !this._isUTC : false; + } + + function isUtcOffset () { + return this.isValid() ? this._isUTC : false; + } + + function isUtc () { + return this.isValid() ? this._isUTC && this._offset === 0 : false; + } + + // ASP.NET json date format regex + var aspNetRegex = /^(\-)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)\.?(\d{3})?\d*)?$/; + + // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html + // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere + // and further modified to allow for strings containing both week and day + var isoRegex = /^(-)?P(?:([0-9,.]*)Y)?(?:([0-9,.]*)M)?(?:([0-9,.]*)W)?(?:([0-9,.]*)D)?(?:T(?:([0-9,.]*)H)?(?:([0-9,.]*)M)?(?:([0-9,.]*)S)?)?$/; + + function create__createDuration (input, key) { + var duration = input, + // matching against regexp is expensive, do it on demand + match = null, + sign, + ret, + diffRes; + + if (isDuration(input)) { + duration = { + ms : input._milliseconds, + d : input._days, + M : input._months + }; + } else if (typeof input === 'number') { + duration = {}; + if (key) { + duration[key] = input; + } else { + duration.milliseconds = input; + } + } else if (!!(match = aspNetRegex.exec(input))) { + sign = (match[1] === '-') ? -1 : 1; + duration = { + y : 0, + d : toInt(match[DATE]) * sign, + h : toInt(match[HOUR]) * sign, + m : toInt(match[MINUTE]) * sign, + s : toInt(match[SECOND]) * sign, + ms : toInt(match[MILLISECOND]) * sign + }; + } else if (!!(match = isoRegex.exec(input))) { + sign = (match[1] === '-') ? -1 : 1; + duration = { + y : parseIso(match[2], sign), + M : parseIso(match[3], sign), + w : parseIso(match[4], sign), + d : parseIso(match[5], sign), + h : parseIso(match[6], sign), + m : parseIso(match[7], sign), + s : parseIso(match[8], sign) + }; + } else if (duration == null) {// checks for null or undefined + duration = {}; + } else if (typeof duration === 'object' && ('from' in duration || 'to' in duration)) { + diffRes = momentsDifference(local__createLocal(duration.from), local__createLocal(duration.to)); + + duration = {}; + duration.ms = diffRes.milliseconds; + duration.M = diffRes.months; + } + + ret = new Duration(duration); + + if (isDuration(input) && hasOwnProp(input, '_locale')) { + ret._locale = input._locale; + } + + return ret; + } + + create__createDuration.fn = Duration.prototype; + + function parseIso (inp, sign) { + // We'd normally use ~~inp for this, but unfortunately it also + // converts floats to ints. + // inp may be undefined, so careful calling replace on it. + var res = inp && parseFloat(inp.replace(',', '.')); + // apply sign while we're at it + return (isNaN(res) ? 0 : res) * sign; + } + + function positiveMomentsDifference(base, other) { + var res = {milliseconds: 0, months: 0}; + + res.months = other.month() - base.month() + + (other.year() - base.year()) * 12; + if (base.clone().add(res.months, 'M').isAfter(other)) { + --res.months; + } + + res.milliseconds = +other - +(base.clone().add(res.months, 'M')); + + return res; + } + + function momentsDifference(base, other) { + var res; + if (!(base.isValid() && other.isValid())) { + return {milliseconds: 0, months: 0}; + } + + other = cloneWithOffset(other, base); + if (base.isBefore(other)) { + res = positiveMomentsDifference(base, other); + } else { + res = positiveMomentsDifference(other, base); + res.milliseconds = -res.milliseconds; + res.months = -res.months; + } + + return res; + } + + function absRound (number) { + if (number < 0) { + return Math.round(-1 * number) * -1; + } else { + return Math.round(number); + } + } + + // TODO: remove 'name' arg after deprecation is removed + function createAdder(direction, name) { + return function (val, period) { + var dur, tmp; + //invert the arguments, but complain about it + if (period !== null && !isNaN(+period)) { + deprecateSimple(name, 'moment().' + name + '(period, number) is deprecated. Please use moment().' + name + '(number, period).'); + tmp = val; val = period; period = tmp; + } + + val = typeof val === 'string' ? +val : val; + dur = create__createDuration(val, period); + add_subtract__addSubtract(this, dur, direction); + return this; + }; + } + + function add_subtract__addSubtract (mom, duration, isAdding, updateOffset) { + var milliseconds = duration._milliseconds, + days = absRound(duration._days), + months = absRound(duration._months); + + if (!mom.isValid()) { + // No op + return; + } + + updateOffset = updateOffset == null ? true : updateOffset; + + if (milliseconds) { + mom._d.setTime(+mom._d + milliseconds * isAdding); + } + if (days) { + get_set__set(mom, 'Date', get_set__get(mom, 'Date') + days * isAdding); + } + if (months) { + setMonth(mom, get_set__get(mom, 'Month') + months * isAdding); + } + if (updateOffset) { + utils_hooks__hooks.updateOffset(mom, days || months); + } + } + + var add_subtract__add = createAdder(1, 'add'); + var add_subtract__subtract = createAdder(-1, 'subtract'); + + function moment_calendar__calendar (time, formats) { + // We want to compare the start of today, vs this. + // Getting start-of-today depends on whether we're local/utc/offset or not. + var now = time || local__createLocal(), + sod = cloneWithOffset(now, this).startOf('day'), + diff = this.diff(sod, 'days', true), + format = diff < -6 ? 'sameElse' : + diff < -1 ? 'lastWeek' : + diff < 0 ? 'lastDay' : + diff < 1 ? 'sameDay' : + diff < 2 ? 'nextDay' : + diff < 7 ? 'nextWeek' : 'sameElse'; + + var output = formats && (isFunction(formats[format]) ? formats[format]() : formats[format]); + + return this.format(output || this.localeData().calendar(format, this, local__createLocal(now))); + } + + function clone () { + return new Moment(this); + } + + function isAfter (input, units) { + var localInput = isMoment(input) ? input : local__createLocal(input); + if (!(this.isValid() && localInput.isValid())) { + return false; + } + units = normalizeUnits(!isUndefined(units) ? units : 'millisecond'); + if (units === 'millisecond') { + return +this > +localInput; + } else { + return +localInput < +this.clone().startOf(units); + } + } + + function isBefore (input, units) { + var localInput = isMoment(input) ? input : local__createLocal(input); + if (!(this.isValid() && localInput.isValid())) { + return false; + } + units = normalizeUnits(!isUndefined(units) ? units : 'millisecond'); + if (units === 'millisecond') { + return +this < +localInput; + } else { + return +this.clone().endOf(units) < +localInput; + } + } + + function isBetween (from, to, units) { + return this.isAfter(from, units) && this.isBefore(to, units); + } + + function isSame (input, units) { + var localInput = isMoment(input) ? input : local__createLocal(input), + inputMs; + if (!(this.isValid() && localInput.isValid())) { + return false; + } + units = normalizeUnits(units || 'millisecond'); + if (units === 'millisecond') { + return +this === +localInput; + } else { + inputMs = +localInput; + return +(this.clone().startOf(units)) <= inputMs && inputMs <= +(this.clone().endOf(units)); + } + } + + function isSameOrAfter (input, units) { + return this.isSame(input, units) || this.isAfter(input,units); + } + + function isSameOrBefore (input, units) { + return this.isSame(input, units) || this.isBefore(input,units); + } + + function diff (input, units, asFloat) { + var that, + zoneDelta, + delta, output; + + if (!this.isValid()) { + return NaN; + } + + that = cloneWithOffset(input, this); + + if (!that.isValid()) { + return NaN; + } + + zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4; + + units = normalizeUnits(units); + + if (units === 'year' || units === 'month' || units === 'quarter') { + output = monthDiff(this, that); + if (units === 'quarter') { + output = output / 3; + } else if (units === 'year') { + output = output / 12; + } + } else { + delta = this - that; + output = units === 'second' ? delta / 1e3 : // 1000 + units === 'minute' ? delta / 6e4 : // 1000 * 60 + units === 'hour' ? delta / 36e5 : // 1000 * 60 * 60 + units === 'day' ? (delta - zoneDelta) / 864e5 : // 1000 * 60 * 60 * 24, negate dst + units === 'week' ? (delta - zoneDelta) / 6048e5 : // 1000 * 60 * 60 * 24 * 7, negate dst + delta; + } + return asFloat ? output : absFloor(output); + } + + function monthDiff (a, b) { + // difference in months + var wholeMonthDiff = ((b.year() - a.year()) * 12) + (b.month() - a.month()), + // b is in (anchor - 1 month, anchor + 1 month) + anchor = a.clone().add(wholeMonthDiff, 'months'), + anchor2, adjust; + + if (b - anchor < 0) { + anchor2 = a.clone().add(wholeMonthDiff - 1, 'months'); + // linear across the month + adjust = (b - anchor) / (anchor - anchor2); + } else { + anchor2 = a.clone().add(wholeMonthDiff + 1, 'months'); + // linear across the month + adjust = (b - anchor) / (anchor2 - anchor); + } + + return -(wholeMonthDiff + adjust); + } + + utils_hooks__hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ'; + + function toString () { + return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ'); + } + + function moment_format__toISOString () { + var m = this.clone().utc(); + if (0 < m.year() && m.year() <= 9999) { + if (isFunction(Date.prototype.toISOString)) { + // native implementation is ~50x faster, use it when we can + return this.toDate().toISOString(); + } else { + return formatMoment(m, 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]'); + } + } else { + return formatMoment(m, 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]'); + } + } + + function moment_format__format (inputString) { + var output = formatMoment(this, inputString || utils_hooks__hooks.defaultFormat); + return this.localeData().postformat(output); + } + + function from (time, withoutSuffix) { + if (this.isValid() && + ((isMoment(time) && time.isValid()) || + local__createLocal(time).isValid())) { + return create__createDuration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix); + } else { + return this.localeData().invalidDate(); + } + } + + function fromNow (withoutSuffix) { + return this.from(local__createLocal(), withoutSuffix); + } + + function to (time, withoutSuffix) { + if (this.isValid() && + ((isMoment(time) && time.isValid()) || + local__createLocal(time).isValid())) { + return create__createDuration({from: this, to: time}).locale(this.locale()).humanize(!withoutSuffix); + } else { + return this.localeData().invalidDate(); + } + } + + function toNow (withoutSuffix) { + return this.to(local__createLocal(), withoutSuffix); + } + + // If passed a locale key, it will set the locale for this + // instance. Otherwise, it will return the locale configuration + // variables for this instance. + function locale (key) { + var newLocaleData; + + if (key === undefined) { + return this._locale._abbr; + } else { + newLocaleData = locale_locales__getLocale(key); + if (newLocaleData != null) { + this._locale = newLocaleData; + } + return this; + } + } + + var lang = deprecate( + 'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.', + function (key) { + if (key === undefined) { + return this.localeData(); + } else { + return this.locale(key); + } + } + ); + + function localeData () { + return this._locale; + } + + function startOf (units) { + units = normalizeUnits(units); + // the following switch intentionally omits break keywords + // to utilize falling through the cases. + switch (units) { + case 'year': + this.month(0); + /* falls through */ + case 'quarter': + case 'month': + this.date(1); + /* falls through */ + case 'week': + case 'isoWeek': + case 'day': + this.hours(0); + /* falls through */ + case 'hour': + this.minutes(0); + /* falls through */ + case 'minute': + this.seconds(0); + /* falls through */ + case 'second': + this.milliseconds(0); + } + + // weeks are a special case + if (units === 'week') { + this.weekday(0); + } + if (units === 'isoWeek') { + this.isoWeekday(1); + } + + // quarters are also special + if (units === 'quarter') { + this.month(Math.floor(this.month() / 3) * 3); + } + + return this; + } + + function endOf (units) { + units = normalizeUnits(units); + if (units === undefined || units === 'millisecond') { + return this; + } + return this.startOf(units).add(1, (units === 'isoWeek' ? 'week' : units)).subtract(1, 'ms'); + } + + function to_type__valueOf () { + return +this._d - ((this._offset || 0) * 60000); + } + + function unix () { + return Math.floor(+this / 1000); + } + + function toDate () { + return this._offset ? new Date(+this) : this._d; + } + + function toArray () { + var m = this; + return [m.year(), m.month(), m.date(), m.hour(), m.minute(), m.second(), m.millisecond()]; + } + + function toObject () { + var m = this; + return { + years: m.year(), + months: m.month(), + date: m.date(), + hours: m.hours(), + minutes: m.minutes(), + seconds: m.seconds(), + milliseconds: m.milliseconds() + }; + } + + function toJSON () { + // new Date(NaN).toJSON() === null + return this.isValid() ? this.toISOString() : null; + } + + function moment_valid__isValid () { + return valid__isValid(this); + } + + function parsingFlags () { + return extend({}, getParsingFlags(this)); + } + + function invalidAt () { + return getParsingFlags(this).overflow; + } + + function creationData() { + return { + input: this._i, + format: this._f, + locale: this._locale, + isUTC: this._isUTC, + strict: this._strict + }; + } + + // FORMATTING + + addFormatToken(0, ['gg', 2], 0, function () { + return this.weekYear() % 100; + }); + + addFormatToken(0, ['GG', 2], 0, function () { + return this.isoWeekYear() % 100; + }); + + function addWeekYearFormatToken (token, getter) { + addFormatToken(0, [token, token.length], 0, getter); + } + + addWeekYearFormatToken('gggg', 'weekYear'); + addWeekYearFormatToken('ggggg', 'weekYear'); + addWeekYearFormatToken('GGGG', 'isoWeekYear'); + addWeekYearFormatToken('GGGGG', 'isoWeekYear'); + + // ALIASES + + addUnitAlias('weekYear', 'gg'); + addUnitAlias('isoWeekYear', 'GG'); + + // PARSING + + addRegexToken('G', matchSigned); + addRegexToken('g', matchSigned); + addRegexToken('GG', match1to2, match2); + addRegexToken('gg', match1to2, match2); + addRegexToken('GGGG', match1to4, match4); + addRegexToken('gggg', match1to4, match4); + addRegexToken('GGGGG', match1to6, match6); + addRegexToken('ggggg', match1to6, match6); + + addWeekParseToken(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function (input, week, config, token) { + week[token.substr(0, 2)] = toInt(input); + }); + + addWeekParseToken(['gg', 'GG'], function (input, week, config, token) { + week[token] = utils_hooks__hooks.parseTwoDigitYear(input); + }); + + // MOMENTS + + function getSetWeekYear (input) { + return getSetWeekYearHelper.call(this, + input, + this.week(), + this.weekday(), + this.localeData()._week.dow, + this.localeData()._week.doy); + } + + function getSetISOWeekYear (input) { + return getSetWeekYearHelper.call(this, + input, this.isoWeek(), this.isoWeekday(), 1, 4); + } + + function getISOWeeksInYear () { + return weeksInYear(this.year(), 1, 4); + } + + function getWeeksInYear () { + var weekInfo = this.localeData()._week; + return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy); + } + + function getSetWeekYearHelper(input, week, weekday, dow, doy) { + var weeksTarget; + if (input == null) { + return weekOfYear(this, dow, doy).year; + } else { + weeksTarget = weeksInYear(input, dow, doy); + if (week > weeksTarget) { + week = weeksTarget; + } + return setWeekAll.call(this, input, week, weekday, dow, doy); + } + } + + function setWeekAll(weekYear, week, weekday, dow, doy) { + var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy), + date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear); + + this.year(date.getUTCFullYear()); + this.month(date.getUTCMonth()); + this.date(date.getUTCDate()); + return this; + } + + // FORMATTING + + addFormatToken('Q', 0, 'Qo', 'quarter'); + + // ALIASES + + addUnitAlias('quarter', 'Q'); + + // PARSING + + addRegexToken('Q', match1); + addParseToken('Q', function (input, array) { + array[MONTH] = (toInt(input) - 1) * 3; + }); + + // MOMENTS + + function getSetQuarter (input) { + return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3); + } + + // FORMATTING + + addFormatToken('w', ['ww', 2], 'wo', 'week'); + addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek'); + + // ALIASES + + addUnitAlias('week', 'w'); + addUnitAlias('isoWeek', 'W'); + + // PARSING + + addRegexToken('w', match1to2); + addRegexToken('ww', match1to2, match2); + addRegexToken('W', match1to2); + addRegexToken('WW', match1to2, match2); + + addWeekParseToken(['w', 'ww', 'W', 'WW'], function (input, week, config, token) { + week[token.substr(0, 1)] = toInt(input); + }); + + // HELPERS + + // LOCALES + + function localeWeek (mom) { + return weekOfYear(mom, this._week.dow, this._week.doy).week; + } + + var defaultLocaleWeek = { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + }; + + function localeFirstDayOfWeek () { + return this._week.dow; + } + + function localeFirstDayOfYear () { + return this._week.doy; + } + + // MOMENTS + + function getSetWeek (input) { + var week = this.localeData().week(this); + return input == null ? week : this.add((input - week) * 7, 'd'); + } + + function getSetISOWeek (input) { + var week = weekOfYear(this, 1, 4).week; + return input == null ? week : this.add((input - week) * 7, 'd'); + } + + // FORMATTING + + addFormatToken('D', ['DD', 2], 'Do', 'date'); + + // ALIASES + + addUnitAlias('date', 'D'); + + // PARSING + + addRegexToken('D', match1to2); + addRegexToken('DD', match1to2, match2); + addRegexToken('Do', function (isStrict, locale) { + return isStrict ? locale._ordinalParse : locale._ordinalParseLenient; + }); + + addParseToken(['D', 'DD'], DATE); + addParseToken('Do', function (input, array) { + array[DATE] = toInt(input.match(match1to2)[0], 10); + }); + + // MOMENTS + + var getSetDayOfMonth = makeGetSet('Date', true); + + // FORMATTING + + addFormatToken('d', 0, 'do', 'day'); + + addFormatToken('dd', 0, 0, function (format) { + return this.localeData().weekdaysMin(this, format); + }); + + addFormatToken('ddd', 0, 0, function (format) { + return this.localeData().weekdaysShort(this, format); + }); + + addFormatToken('dddd', 0, 0, function (format) { + return this.localeData().weekdays(this, format); + }); + + addFormatToken('e', 0, 0, 'weekday'); + addFormatToken('E', 0, 0, 'isoWeekday'); + + // ALIASES + + addUnitAlias('day', 'd'); + addUnitAlias('weekday', 'e'); + addUnitAlias('isoWeekday', 'E'); + + // PARSING + + addRegexToken('d', match1to2); + addRegexToken('e', match1to2); + addRegexToken('E', match1to2); + addRegexToken('dd', matchWord); + addRegexToken('ddd', matchWord); + addRegexToken('dddd', matchWord); + + addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) { + var weekday = config._locale.weekdaysParse(input, token, config._strict); + // if we didn't get a weekday name, mark the date as invalid + if (weekday != null) { + week.d = weekday; + } else { + getParsingFlags(config).invalidWeekday = input; + } + }); + + addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) { + week[token] = toInt(input); + }); + + // HELPERS + + function parseWeekday(input, locale) { + if (typeof input !== 'string') { + return input; + } + + if (!isNaN(input)) { + return parseInt(input, 10); + } + + input = locale.weekdaysParse(input); + if (typeof input === 'number') { + return input; + } + + return null; + } + + // LOCALES + + var defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'); + function localeWeekdays (m, format) { + return isArray(this._weekdays) ? this._weekdays[m.day()] : + this._weekdays[this._weekdays.isFormat.test(format) ? 'format' : 'standalone'][m.day()]; + } + + var defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'); + function localeWeekdaysShort (m) { + return this._weekdaysShort[m.day()]; + } + + var defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'); + function localeWeekdaysMin (m) { + return this._weekdaysMin[m.day()]; + } + + function localeWeekdaysParse (weekdayName, format, strict) { + var i, mom, regex; + + if (!this._weekdaysParse) { + this._weekdaysParse = []; + this._minWeekdaysParse = []; + this._shortWeekdaysParse = []; + this._fullWeekdaysParse = []; + } + + for (i = 0; i < 7; i++) { + // make the regex if we don't have it already + + mom = local__createLocal([2000, 1]).day(i); + if (strict && !this._fullWeekdaysParse[i]) { + this._fullWeekdaysParse[i] = new RegExp('^' + this.weekdays(mom, '').replace('.', '\.?') + '$', 'i'); + this._shortWeekdaysParse[i] = new RegExp('^' + this.weekdaysShort(mom, '').replace('.', '\.?') + '$', 'i'); + this._minWeekdaysParse[i] = new RegExp('^' + this.weekdaysMin(mom, '').replace('.', '\.?') + '$', 'i'); + } + if (!this._weekdaysParse[i]) { + regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, ''); + this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i'); + } + // test the regex + if (strict && format === 'dddd' && this._fullWeekdaysParse[i].test(weekdayName)) { + return i; + } else if (strict && format === 'ddd' && this._shortWeekdaysParse[i].test(weekdayName)) { + return i; + } else if (strict && format === 'dd' && this._minWeekdaysParse[i].test(weekdayName)) { + return i; + } else if (!strict && this._weekdaysParse[i].test(weekdayName)) { + return i; + } + } + } + + // MOMENTS + + function getSetDayOfWeek (input) { + if (!this.isValid()) { + return input != null ? this : NaN; + } + var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay(); + if (input != null) { + input = parseWeekday(input, this.localeData()); + return this.add(input - day, 'd'); + } else { + return day; + } + } + + function getSetLocaleDayOfWeek (input) { + if (!this.isValid()) { + return input != null ? this : NaN; + } + var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7; + return input == null ? weekday : this.add(input - weekday, 'd'); + } + + function getSetISODayOfWeek (input) { + if (!this.isValid()) { + return input != null ? this : NaN; + } + // behaves the same as moment#day except + // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6) + // as a setter, sunday should belong to the previous week. + return input == null ? this.day() || 7 : this.day(this.day() % 7 ? input : input - 7); + } + + // FORMATTING + + addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear'); + + // ALIASES + + addUnitAlias('dayOfYear', 'DDD'); + + // PARSING + + addRegexToken('DDD', match1to3); + addRegexToken('DDDD', match3); + addParseToken(['DDD', 'DDDD'], function (input, array, config) { + config._dayOfYear = toInt(input); + }); + + // HELPERS + + // MOMENTS + + function getSetDayOfYear (input) { + var dayOfYear = Math.round((this.clone().startOf('day') - this.clone().startOf('year')) / 864e5) + 1; + return input == null ? dayOfYear : this.add((input - dayOfYear), 'd'); + } + + // FORMATTING + + function hFormat() { + return this.hours() % 12 || 12; + } + + addFormatToken('H', ['HH', 2], 0, 'hour'); + addFormatToken('h', ['hh', 2], 0, hFormat); + + addFormatToken('hmm', 0, 0, function () { + return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2); + }); + + addFormatToken('hmmss', 0, 0, function () { + return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2) + + zeroFill(this.seconds(), 2); + }); + + addFormatToken('Hmm', 0, 0, function () { + return '' + this.hours() + zeroFill(this.minutes(), 2); + }); + + addFormatToken('Hmmss', 0, 0, function () { + return '' + this.hours() + zeroFill(this.minutes(), 2) + + zeroFill(this.seconds(), 2); + }); + + function meridiem (token, lowercase) { + addFormatToken(token, 0, 0, function () { + return this.localeData().meridiem(this.hours(), this.minutes(), lowercase); + }); + } + + meridiem('a', true); + meridiem('A', false); + + // ALIASES + + addUnitAlias('hour', 'h'); + + // PARSING + + function matchMeridiem (isStrict, locale) { + return locale._meridiemParse; + } + + addRegexToken('a', matchMeridiem); + addRegexToken('A', matchMeridiem); + addRegexToken('H', match1to2); + addRegexToken('h', match1to2); + addRegexToken('HH', match1to2, match2); + addRegexToken('hh', match1to2, match2); + + addRegexToken('hmm', match3to4); + addRegexToken('hmmss', match5to6); + addRegexToken('Hmm', match3to4); + addRegexToken('Hmmss', match5to6); + + addParseToken(['H', 'HH'], HOUR); + addParseToken(['a', 'A'], function (input, array, config) { + config._isPm = config._locale.isPM(input); + config._meridiem = input; + }); + addParseToken(['h', 'hh'], function (input, array, config) { + array[HOUR] = toInt(input); + getParsingFlags(config).bigHour = true; + }); + addParseToken('hmm', function (input, array, config) { + var pos = input.length - 2; + array[HOUR] = toInt(input.substr(0, pos)); + array[MINUTE] = toInt(input.substr(pos)); + getParsingFlags(config).bigHour = true; + }); + addParseToken('hmmss', function (input, array, config) { + var pos1 = input.length - 4; + var pos2 = input.length - 2; + array[HOUR] = toInt(input.substr(0, pos1)); + array[MINUTE] = toInt(input.substr(pos1, 2)); + array[SECOND] = toInt(input.substr(pos2)); + getParsingFlags(config).bigHour = true; + }); + addParseToken('Hmm', function (input, array, config) { + var pos = input.length - 2; + array[HOUR] = toInt(input.substr(0, pos)); + array[MINUTE] = toInt(input.substr(pos)); + }); + addParseToken('Hmmss', function (input, array, config) { + var pos1 = input.length - 4; + var pos2 = input.length - 2; + array[HOUR] = toInt(input.substr(0, pos1)); + array[MINUTE] = toInt(input.substr(pos1, 2)); + array[SECOND] = toInt(input.substr(pos2)); + }); + + // LOCALES + + function localeIsPM (input) { + // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays + // Using charAt should be more compatible. + return ((input + '').toLowerCase().charAt(0) === 'p'); + } + + var defaultLocaleMeridiemParse = /[ap]\.?m?\.?/i; + function localeMeridiem (hours, minutes, isLower) { + if (hours > 11) { + return isLower ? 'pm' : 'PM'; + } else { + return isLower ? 'am' : 'AM'; + } + } + + + // MOMENTS + + // Setting the hour should keep the time, because the user explicitly + // specified which hour he wants. So trying to maintain the same hour (in + // a new timezone) makes sense. Adding/subtracting hours does not follow + // this rule. + var getSetHour = makeGetSet('Hours', true); + + // FORMATTING + + addFormatToken('m', ['mm', 2], 0, 'minute'); + + // ALIASES + + addUnitAlias('minute', 'm'); + + // PARSING + + addRegexToken('m', match1to2); + addRegexToken('mm', match1to2, match2); + addParseToken(['m', 'mm'], MINUTE); + + // MOMENTS + + var getSetMinute = makeGetSet('Minutes', false); + + // FORMATTING + + addFormatToken('s', ['ss', 2], 0, 'second'); + + // ALIASES + + addUnitAlias('second', 's'); + + // PARSING + + addRegexToken('s', match1to2); + addRegexToken('ss', match1to2, match2); + addParseToken(['s', 'ss'], SECOND); + + // MOMENTS + + var getSetSecond = makeGetSet('Seconds', false); + + // FORMATTING + + addFormatToken('S', 0, 0, function () { + return ~~(this.millisecond() / 100); + }); + + addFormatToken(0, ['SS', 2], 0, function () { + return ~~(this.millisecond() / 10); + }); + + addFormatToken(0, ['SSS', 3], 0, 'millisecond'); + addFormatToken(0, ['SSSS', 4], 0, function () { + return this.millisecond() * 10; + }); + addFormatToken(0, ['SSSSS', 5], 0, function () { + return this.millisecond() * 100; + }); + addFormatToken(0, ['SSSSSS', 6], 0, function () { + return this.millisecond() * 1000; + }); + addFormatToken(0, ['SSSSSSS', 7], 0, function () { + return this.millisecond() * 10000; + }); + addFormatToken(0, ['SSSSSSSS', 8], 0, function () { + return this.millisecond() * 100000; + }); + addFormatToken(0, ['SSSSSSSSS', 9], 0, function () { + return this.millisecond() * 1000000; + }); + + + // ALIASES + + addUnitAlias('millisecond', 'ms'); + + // PARSING + + addRegexToken('S', match1to3, match1); + addRegexToken('SS', match1to3, match2); + addRegexToken('SSS', match1to3, match3); + + var token; + for (token = 'SSSS'; token.length <= 9; token += 'S') { + addRegexToken(token, matchUnsigned); + } + + function parseMs(input, array) { + array[MILLISECOND] = toInt(('0.' + input) * 1000); + } + + for (token = 'S'; token.length <= 9; token += 'S') { + addParseToken(token, parseMs); + } + // MOMENTS + + var getSetMillisecond = makeGetSet('Milliseconds', false); + + // FORMATTING + + addFormatToken('z', 0, 0, 'zoneAbbr'); + addFormatToken('zz', 0, 0, 'zoneName'); + + // MOMENTS + + function getZoneAbbr () { + return this._isUTC ? 'UTC' : ''; + } + + function getZoneName () { + return this._isUTC ? 'Coordinated Universal Time' : ''; + } + + var momentPrototype__proto = Moment.prototype; + + momentPrototype__proto.add = add_subtract__add; + momentPrototype__proto.calendar = moment_calendar__calendar; + momentPrototype__proto.clone = clone; + momentPrototype__proto.diff = diff; + momentPrototype__proto.endOf = endOf; + momentPrototype__proto.format = moment_format__format; + momentPrototype__proto.from = from; + momentPrototype__proto.fromNow = fromNow; + momentPrototype__proto.to = to; + momentPrototype__proto.toNow = toNow; + momentPrototype__proto.get = getSet; + momentPrototype__proto.invalidAt = invalidAt; + momentPrototype__proto.isAfter = isAfter; + momentPrototype__proto.isBefore = isBefore; + momentPrototype__proto.isBetween = isBetween; + momentPrototype__proto.isSame = isSame; + momentPrototype__proto.isSameOrAfter = isSameOrAfter; + momentPrototype__proto.isSameOrBefore = isSameOrBefore; + momentPrototype__proto.isValid = moment_valid__isValid; + momentPrototype__proto.lang = lang; + momentPrototype__proto.locale = locale; + momentPrototype__proto.localeData = localeData; + momentPrototype__proto.max = prototypeMax; + momentPrototype__proto.min = prototypeMin; + momentPrototype__proto.parsingFlags = parsingFlags; + momentPrototype__proto.set = getSet; + momentPrototype__proto.startOf = startOf; + momentPrototype__proto.subtract = add_subtract__subtract; + momentPrototype__proto.toArray = toArray; + momentPrototype__proto.toObject = toObject; + momentPrototype__proto.toDate = toDate; + momentPrototype__proto.toISOString = moment_format__toISOString; + momentPrototype__proto.toJSON = toJSON; + momentPrototype__proto.toString = toString; + momentPrototype__proto.unix = unix; + momentPrototype__proto.valueOf = to_type__valueOf; + momentPrototype__proto.creationData = creationData; + + // Year + momentPrototype__proto.year = getSetYear; + momentPrototype__proto.isLeapYear = getIsLeapYear; + + // Week Year + momentPrototype__proto.weekYear = getSetWeekYear; + momentPrototype__proto.isoWeekYear = getSetISOWeekYear; + + // Quarter + momentPrototype__proto.quarter = momentPrototype__proto.quarters = getSetQuarter; + + // Month + momentPrototype__proto.month = getSetMonth; + momentPrototype__proto.daysInMonth = getDaysInMonth; + + // Week + momentPrototype__proto.week = momentPrototype__proto.weeks = getSetWeek; + momentPrototype__proto.isoWeek = momentPrototype__proto.isoWeeks = getSetISOWeek; + momentPrototype__proto.weeksInYear = getWeeksInYear; + momentPrototype__proto.isoWeeksInYear = getISOWeeksInYear; + + // Day + momentPrototype__proto.date = getSetDayOfMonth; + momentPrototype__proto.day = momentPrototype__proto.days = getSetDayOfWeek; + momentPrototype__proto.weekday = getSetLocaleDayOfWeek; + momentPrototype__proto.isoWeekday = getSetISODayOfWeek; + momentPrototype__proto.dayOfYear = getSetDayOfYear; + + // Hour + momentPrototype__proto.hour = momentPrototype__proto.hours = getSetHour; + + // Minute + momentPrototype__proto.minute = momentPrototype__proto.minutes = getSetMinute; + + // Second + momentPrototype__proto.second = momentPrototype__proto.seconds = getSetSecond; + + // Millisecond + momentPrototype__proto.millisecond = momentPrototype__proto.milliseconds = getSetMillisecond; + + // Offset + momentPrototype__proto.utcOffset = getSetOffset; + momentPrototype__proto.utc = setOffsetToUTC; + momentPrototype__proto.local = setOffsetToLocal; + momentPrototype__proto.parseZone = setOffsetToParsedOffset; + momentPrototype__proto.hasAlignedHourOffset = hasAlignedHourOffset; + momentPrototype__proto.isDST = isDaylightSavingTime; + momentPrototype__proto.isDSTShifted = isDaylightSavingTimeShifted; + momentPrototype__proto.isLocal = isLocal; + momentPrototype__proto.isUtcOffset = isUtcOffset; + momentPrototype__proto.isUtc = isUtc; + momentPrototype__proto.isUTC = isUtc; + + // Timezone + momentPrototype__proto.zoneAbbr = getZoneAbbr; + momentPrototype__proto.zoneName = getZoneName; + + // Deprecations + momentPrototype__proto.dates = deprecate('dates accessor is deprecated. Use date instead.', getSetDayOfMonth); + momentPrototype__proto.months = deprecate('months accessor is deprecated. Use month instead', getSetMonth); + momentPrototype__proto.years = deprecate('years accessor is deprecated. Use year instead', getSetYear); + momentPrototype__proto.zone = deprecate('moment().zone is deprecated, use moment().utcOffset instead. https://github.com/moment/moment/issues/1779', getSetZone); + + var momentPrototype = momentPrototype__proto; + + function moment_moment__createUnix (input) { + return local__createLocal(input * 1000); + } + + function moment_moment__createInZone () { + return local__createLocal.apply(null, arguments).parseZone(); + } + + var defaultCalendar = { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' + }; + + function locale_calendar__calendar (key, mom, now) { + var output = this._calendar[key]; + return isFunction(output) ? output.call(mom, now) : output; + } + + var defaultLongDateFormat = { + LTS : 'h:mm:ss A', + LT : 'h:mm A', + L : 'MM/DD/YYYY', + LL : 'MMMM D, YYYY', + LLL : 'MMMM D, YYYY h:mm A', + LLLL : 'dddd, MMMM D, YYYY h:mm A' + }; + + function longDateFormat (key) { + var format = this._longDateFormat[key], + formatUpper = this._longDateFormat[key.toUpperCase()]; + + if (format || !formatUpper) { + return format; + } + + this._longDateFormat[key] = formatUpper.replace(/MMMM|MM|DD|dddd/g, function (val) { + return val.slice(1); + }); + + return this._longDateFormat[key]; + } + + var defaultInvalidDate = 'Invalid date'; + + function invalidDate () { + return this._invalidDate; + } + + var defaultOrdinal = '%d'; + var defaultOrdinalParse = /\d{1,2}/; + + function ordinal (number) { + return this._ordinal.replace('%d', number); + } + + function preParsePostFormat (string) { + return string; + } + + var defaultRelativeTime = { + future : 'in %s', + past : '%s ago', + s : 'a few seconds', + m : 'a minute', + mm : '%d minutes', + h : 'an hour', + hh : '%d hours', + d : 'a day', + dd : '%d days', + M : 'a month', + MM : '%d months', + y : 'a year', + yy : '%d years' + }; + + function relative__relativeTime (number, withoutSuffix, string, isFuture) { + var output = this._relativeTime[string]; + return (isFunction(output)) ? + output(number, withoutSuffix, string, isFuture) : + output.replace(/%d/i, number); + } + + function pastFuture (diff, output) { + var format = this._relativeTime[diff > 0 ? 'future' : 'past']; + return isFunction(format) ? format(output) : format.replace(/%s/i, output); + } + + var prototype__proto = Locale.prototype; + + prototype__proto._calendar = defaultCalendar; + prototype__proto.calendar = locale_calendar__calendar; + prototype__proto._longDateFormat = defaultLongDateFormat; + prototype__proto.longDateFormat = longDateFormat; + prototype__proto._invalidDate = defaultInvalidDate; + prototype__proto.invalidDate = invalidDate; + prototype__proto._ordinal = defaultOrdinal; + prototype__proto.ordinal = ordinal; + prototype__proto._ordinalParse = defaultOrdinalParse; + prototype__proto.preparse = preParsePostFormat; + prototype__proto.postformat = preParsePostFormat; + prototype__proto._relativeTime = defaultRelativeTime; + prototype__proto.relativeTime = relative__relativeTime; + prototype__proto.pastFuture = pastFuture; + prototype__proto.set = locale_set__set; + + // Month + prototype__proto.months = localeMonths; + prototype__proto._months = defaultLocaleMonths; + prototype__proto.monthsShort = localeMonthsShort; + prototype__proto._monthsShort = defaultLocaleMonthsShort; + prototype__proto.monthsParse = localeMonthsParse; + prototype__proto._monthsRegex = defaultMonthsRegex; + prototype__proto.monthsRegex = monthsRegex; + prototype__proto._monthsShortRegex = defaultMonthsShortRegex; + prototype__proto.monthsShortRegex = monthsShortRegex; + + // Week + prototype__proto.week = localeWeek; + prototype__proto._week = defaultLocaleWeek; + prototype__proto.firstDayOfYear = localeFirstDayOfYear; + prototype__proto.firstDayOfWeek = localeFirstDayOfWeek; + + // Day of Week + prototype__proto.weekdays = localeWeekdays; + prototype__proto._weekdays = defaultLocaleWeekdays; + prototype__proto.weekdaysMin = localeWeekdaysMin; + prototype__proto._weekdaysMin = defaultLocaleWeekdaysMin; + prototype__proto.weekdaysShort = localeWeekdaysShort; + prototype__proto._weekdaysShort = defaultLocaleWeekdaysShort; + prototype__proto.weekdaysParse = localeWeekdaysParse; + + // Hours + prototype__proto.isPM = localeIsPM; + prototype__proto._meridiemParse = defaultLocaleMeridiemParse; + prototype__proto.meridiem = localeMeridiem; + + function lists__get (format, index, field, setter) { + var locale = locale_locales__getLocale(); + var utc = create_utc__createUTC().set(setter, index); + return locale[field](utc, format); + } + + function list (format, index, field, count, setter) { + if (typeof format === 'number') { + index = format; + format = undefined; + } + + format = format || ''; + + if (index != null) { + return lists__get(format, index, field, setter); + } + + var i; + var out = []; + for (i = 0; i < count; i++) { + out[i] = lists__get(format, i, field, setter); + } + return out; + } + + function lists__listMonths (format, index) { + return list(format, index, 'months', 12, 'month'); + } + + function lists__listMonthsShort (format, index) { + return list(format, index, 'monthsShort', 12, 'month'); + } + + function lists__listWeekdays (format, index) { + return list(format, index, 'weekdays', 7, 'day'); + } + + function lists__listWeekdaysShort (format, index) { + return list(format, index, 'weekdaysShort', 7, 'day'); + } + + function lists__listWeekdaysMin (format, index) { + return list(format, index, 'weekdaysMin', 7, 'day'); + } + + locale_locales__getSetGlobalLocale('en', { + ordinalParse: /\d{1,2}(th|st|nd|rd)/, + ordinal : function (number) { + var b = number % 10, + output = (toInt(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + } + }); + + // Side effect imports + utils_hooks__hooks.lang = deprecate('moment.lang is deprecated. Use moment.locale instead.', locale_locales__getSetGlobalLocale); + utils_hooks__hooks.langData = deprecate('moment.langData is deprecated. Use moment.localeData instead.', locale_locales__getLocale); + + var mathAbs = Math.abs; + + function duration_abs__abs () { + var data = this._data; + + this._milliseconds = mathAbs(this._milliseconds); + this._days = mathAbs(this._days); + this._months = mathAbs(this._months); + + data.milliseconds = mathAbs(data.milliseconds); + data.seconds = mathAbs(data.seconds); + data.minutes = mathAbs(data.minutes); + data.hours = mathAbs(data.hours); + data.months = mathAbs(data.months); + data.years = mathAbs(data.years); + + return this; + } + + function duration_add_subtract__addSubtract (duration, input, value, direction) { + var other = create__createDuration(input, value); + + duration._milliseconds += direction * other._milliseconds; + duration._days += direction * other._days; + duration._months += direction * other._months; + + return duration._bubble(); + } + + // supports only 2.0-style add(1, 's') or add(duration) + function duration_add_subtract__add (input, value) { + return duration_add_subtract__addSubtract(this, input, value, 1); + } + + // supports only 2.0-style subtract(1, 's') or subtract(duration) + function duration_add_subtract__subtract (input, value) { + return duration_add_subtract__addSubtract(this, input, value, -1); + } + + function absCeil (number) { + if (number < 0) { + return Math.floor(number); + } else { + return Math.ceil(number); + } + } + + function bubble () { + var milliseconds = this._milliseconds; + var days = this._days; + var months = this._months; + var data = this._data; + var seconds, minutes, hours, years, monthsFromDays; + + // if we have a mix of positive and negative values, bubble down first + // check: https://github.com/moment/moment/issues/2166 + if (!((milliseconds >= 0 && days >= 0 && months >= 0) || + (milliseconds <= 0 && days <= 0 && months <= 0))) { + milliseconds += absCeil(monthsToDays(months) + days) * 864e5; + days = 0; + months = 0; + } + + // The following code bubbles up values, see the tests for + // examples of what that means. + data.milliseconds = milliseconds % 1000; + + seconds = absFloor(milliseconds / 1000); + data.seconds = seconds % 60; + + minutes = absFloor(seconds / 60); + data.minutes = minutes % 60; + + hours = absFloor(minutes / 60); + data.hours = hours % 24; + + days += absFloor(hours / 24); + + // convert days to months + monthsFromDays = absFloor(daysToMonths(days)); + months += monthsFromDays; + days -= absCeil(monthsToDays(monthsFromDays)); + + // 12 months -> 1 year + years = absFloor(months / 12); + months %= 12; + + data.days = days; + data.months = months; + data.years = years; + + return this; + } + + function daysToMonths (days) { + // 400 years have 146097 days (taking into account leap year rules) + // 400 years have 12 months === 4800 + return days * 4800 / 146097; + } + + function monthsToDays (months) { + // the reverse of daysToMonths + return months * 146097 / 4800; + } + + function as (units) { + var days; + var months; + var milliseconds = this._milliseconds; + + units = normalizeUnits(units); + + if (units === 'month' || units === 'year') { + days = this._days + milliseconds / 864e5; + months = this._months + daysToMonths(days); + return units === 'month' ? months : months / 12; + } else { + // handle milliseconds separately because of floating point math errors (issue #1867) + days = this._days + Math.round(monthsToDays(this._months)); + switch (units) { + case 'week' : return days / 7 + milliseconds / 6048e5; + case 'day' : return days + milliseconds / 864e5; + case 'hour' : return days * 24 + milliseconds / 36e5; + case 'minute' : return days * 1440 + milliseconds / 6e4; + case 'second' : return days * 86400 + milliseconds / 1000; + // Math.floor prevents floating point math errors here + case 'millisecond': return Math.floor(days * 864e5) + milliseconds; + default: throw new Error('Unknown unit ' + units); + } + } + } + + // TODO: Use this.as('ms')? + function duration_as__valueOf () { + return ( + this._milliseconds + + this._days * 864e5 + + (this._months % 12) * 2592e6 + + toInt(this._months / 12) * 31536e6 + ); + } + + function makeAs (alias) { + return function () { + return this.as(alias); + }; + } + + var asMilliseconds = makeAs('ms'); + var asSeconds = makeAs('s'); + var asMinutes = makeAs('m'); + var asHours = makeAs('h'); + var asDays = makeAs('d'); + var asWeeks = makeAs('w'); + var asMonths = makeAs('M'); + var asYears = makeAs('y'); + + function duration_get__get (units) { + units = normalizeUnits(units); + return this[units + 's'](); + } + + function makeGetter(name) { + return function () { + return this._data[name]; + }; + } + + var milliseconds = makeGetter('milliseconds'); + var seconds = makeGetter('seconds'); + var minutes = makeGetter('minutes'); + var hours = makeGetter('hours'); + var days = makeGetter('days'); + var duration_get__months = makeGetter('months'); + var years = makeGetter('years'); + + function weeks () { + return absFloor(this.days() / 7); + } + + var round = Math.round; + var thresholds = { + s: 45, // seconds to minute + m: 45, // minutes to hour + h: 22, // hours to day + d: 26, // days to month + M: 11 // months to year + }; + + // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize + function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) { + return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture); + } + + function duration_humanize__relativeTime (posNegDuration, withoutSuffix, locale) { + var duration = create__createDuration(posNegDuration).abs(); + var seconds = round(duration.as('s')); + var minutes = round(duration.as('m')); + var hours = round(duration.as('h')); + var days = round(duration.as('d')); + var months = round(duration.as('M')); + var years = round(duration.as('y')); + + var a = seconds < thresholds.s && ['s', seconds] || + minutes <= 1 && ['m'] || + minutes < thresholds.m && ['mm', minutes] || + hours <= 1 && ['h'] || + hours < thresholds.h && ['hh', hours] || + days <= 1 && ['d'] || + days < thresholds.d && ['dd', days] || + months <= 1 && ['M'] || + months < thresholds.M && ['MM', months] || + years <= 1 && ['y'] || ['yy', years]; + + a[2] = withoutSuffix; + a[3] = +posNegDuration > 0; + a[4] = locale; + return substituteTimeAgo.apply(null, a); + } + + // This function allows you to set a threshold for relative time strings + function duration_humanize__getSetRelativeTimeThreshold (threshold, limit) { + if (thresholds[threshold] === undefined) { + return false; + } + if (limit === undefined) { + return thresholds[threshold]; + } + thresholds[threshold] = limit; + return true; + } + + function humanize (withSuffix) { + var locale = this.localeData(); + var output = duration_humanize__relativeTime(this, !withSuffix, locale); + + if (withSuffix) { + output = locale.pastFuture(+this, output); + } + + return locale.postformat(output); + } + + var iso_string__abs = Math.abs; + + function iso_string__toISOString() { + // for ISO strings we do not use the normal bubbling rules: + // * milliseconds bubble up until they become hours + // * days do not bubble at all + // * months bubble up until they become years + // This is because there is no context-free conversion between hours and days + // (think of clock changes) + // and also not between days and months (28-31 days per month) + var seconds = iso_string__abs(this._milliseconds) / 1000; + var days = iso_string__abs(this._days); + var months = iso_string__abs(this._months); + var minutes, hours, years; + + // 3600 seconds -> 60 minutes -> 1 hour + minutes = absFloor(seconds / 60); + hours = absFloor(minutes / 60); + seconds %= 60; + minutes %= 60; + + // 12 months -> 1 year + years = absFloor(months / 12); + months %= 12; + + + // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js + var Y = years; + var M = months; + var D = days; + var h = hours; + var m = minutes; + var s = seconds; + var total = this.asSeconds(); + + if (!total) { + // this is the same as C#'s (Noda) and python (isodate)... + // but not other JS (goog.date) + return 'P0D'; + } + + return (total < 0 ? '-' : '') + + 'P' + + (Y ? Y + 'Y' : '') + + (M ? M + 'M' : '') + + (D ? D + 'D' : '') + + ((h || m || s) ? 'T' : '') + + (h ? h + 'H' : '') + + (m ? m + 'M' : '') + + (s ? s + 'S' : ''); + } + + var duration_prototype__proto = Duration.prototype; + + duration_prototype__proto.abs = duration_abs__abs; + duration_prototype__proto.add = duration_add_subtract__add; + duration_prototype__proto.subtract = duration_add_subtract__subtract; + duration_prototype__proto.as = as; + duration_prototype__proto.asMilliseconds = asMilliseconds; + duration_prototype__proto.asSeconds = asSeconds; + duration_prototype__proto.asMinutes = asMinutes; + duration_prototype__proto.asHours = asHours; + duration_prototype__proto.asDays = asDays; + duration_prototype__proto.asWeeks = asWeeks; + duration_prototype__proto.asMonths = asMonths; + duration_prototype__proto.asYears = asYears; + duration_prototype__proto.valueOf = duration_as__valueOf; + duration_prototype__proto._bubble = bubble; + duration_prototype__proto.get = duration_get__get; + duration_prototype__proto.milliseconds = milliseconds; + duration_prototype__proto.seconds = seconds; + duration_prototype__proto.minutes = minutes; + duration_prototype__proto.hours = hours; + duration_prototype__proto.days = days; + duration_prototype__proto.weeks = weeks; + duration_prototype__proto.months = duration_get__months; + duration_prototype__proto.years = years; + duration_prototype__proto.humanize = humanize; + duration_prototype__proto.toISOString = iso_string__toISOString; + duration_prototype__proto.toString = iso_string__toISOString; + duration_prototype__proto.toJSON = iso_string__toISOString; + duration_prototype__proto.locale = locale; + duration_prototype__proto.localeData = localeData; + + // Deprecations + duration_prototype__proto.toIsoString = deprecate('toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)', iso_string__toISOString); + duration_prototype__proto.lang = lang; + + // Side effect imports + + // FORMATTING + + addFormatToken('X', 0, 0, 'unix'); + addFormatToken('x', 0, 0, 'valueOf'); + + // PARSING + + addRegexToken('x', matchSigned); + addRegexToken('X', matchTimestamp); + addParseToken('X', function (input, array, config) { + config._d = new Date(parseFloat(input, 10) * 1000); + }); + addParseToken('x', function (input, array, config) { + config._d = new Date(toInt(input)); + }); + + // Side effect imports + + ; + + //! moment.js + //! version : 2.12.0 + //! authors : Tim Wood, Iskren Chernev, Moment.js contributors + //! license : MIT + //! momentjs.com + + utils_hooks__hooks.version = '2.12.0'; + + setHookCallback(local__createLocal); + + utils_hooks__hooks.fn = momentPrototype; + utils_hooks__hooks.min = min; + utils_hooks__hooks.max = max; + utils_hooks__hooks.now = now; + utils_hooks__hooks.utc = create_utc__createUTC; + utils_hooks__hooks.unix = moment_moment__createUnix; + utils_hooks__hooks.months = lists__listMonths; + utils_hooks__hooks.isDate = isDate; + utils_hooks__hooks.locale = locale_locales__getSetGlobalLocale; + utils_hooks__hooks.invalid = valid__createInvalid; + utils_hooks__hooks.duration = create__createDuration; + utils_hooks__hooks.isMoment = isMoment; + utils_hooks__hooks.weekdays = lists__listWeekdays; + utils_hooks__hooks.parseZone = moment_moment__createInZone; + utils_hooks__hooks.localeData = locale_locales__getLocale; + utils_hooks__hooks.isDuration = isDuration; + utils_hooks__hooks.monthsShort = lists__listMonthsShort; + utils_hooks__hooks.weekdaysMin = lists__listWeekdaysMin; + utils_hooks__hooks.defineLocale = defineLocale; + utils_hooks__hooks.updateLocale = updateLocale; + utils_hooks__hooks.locales = locale_locales__listLocales; + utils_hooks__hooks.weekdaysShort = lists__listWeekdaysShort; + utils_hooks__hooks.normalizeUnits = normalizeUnits; + utils_hooks__hooks.relativeTimeThreshold = duration_humanize__getSetRelativeTimeThreshold; + utils_hooks__hooks.prototype = momentPrototype; + + var moment__default = utils_hooks__hooks; + + //! moment.js locale configuration + //! locale : afrikaans (af) + //! author : Werner Mollentze : https://github.com/wernerm + + var af = moment__default.defineLocale('af', { + months : 'Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des'.split('_'), + weekdays : 'Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag'.split('_'), + weekdaysShort : 'Son_Maa_Din_Woe_Don_Vry_Sat'.split('_'), + weekdaysMin : 'So_Ma_Di_Wo_Do_Vr_Sa'.split('_'), + meridiemParse: /vm|nm/i, + isPM : function (input) { + return /^nm$/i.test(input); + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 12) { + return isLower ? 'vm' : 'VM'; + } else { + return isLower ? 'nm' : 'NM'; + } + }, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd, D MMMM YYYY HH:mm' + }, + calendar : { + sameDay : '[Vandag om] LT', + nextDay : '[Môre om] LT', + nextWeek : 'dddd [om] LT', + lastDay : '[Gister om] LT', + lastWeek : '[Laas] dddd [om] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'oor %s', + past : '%s gelede', + s : '\'n paar sekondes', + m : '\'n minuut', + mm : '%d minute', + h : '\'n uur', + hh : '%d ure', + d : '\'n dag', + dd : '%d dae', + M : '\'n maand', + MM : '%d maande', + y : '\'n jaar', + yy : '%d jaar' + }, + ordinalParse: /\d{1,2}(ste|de)/, + ordinal : function (number) { + return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); // Thanks to Joris Röling : https://github.com/jjupiter + }, + week : { + dow : 1, // Maandag is die eerste dag van die week. + doy : 4 // Die week wat die 4de Januarie bevat is die eerste week van die jaar. + } + }); + + //! moment.js locale configuration + //! locale : Moroccan Arabic (ar-ma) + //! author : ElFadili Yassine : https://github.com/ElFadiliY + //! author : Abdel Said : https://github.com/abdelsaid + + var ar_ma = moment__default.defineLocale('ar-ma', { + months : 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'), + monthsShort : 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'), + weekdays : 'الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), + weekdaysShort : 'احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت'.split('_'), + weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd D MMMM YYYY HH:mm' + }, + calendar : { + sameDay: '[اليوم على الساعة] LT', + nextDay: '[غدا على الساعة] LT', + nextWeek: 'dddd [على الساعة] LT', + lastDay: '[أمس على الساعة] LT', + lastWeek: 'dddd [على الساعة] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'في %s', + past : 'منذ %s', + s : 'ثوان', + m : 'دقيقة', + mm : '%d دقائق', + h : 'ساعة', + hh : '%d ساعات', + d : 'يوم', + dd : '%d أيام', + M : 'شهر', + MM : '%d أشهر', + y : 'سنة', + yy : '%d سنوات' + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + //! locale : Arabic Saudi Arabia (ar-sa) + //! author : Suhail Alkowaileet : https://github.com/xsoh + + var ar_sa__symbolMap = { + '1': '١', + '2': '٢', + '3': '٣', + '4': '٤', + '5': '٥', + '6': '٦', + '7': '٧', + '8': '٨', + '9': '٩', + '0': '٠' + }, ar_sa__numberMap = { + '١': '1', + '٢': '2', + '٣': '3', + '٤': '4', + '٥': '5', + '٦': '6', + '٧': '7', + '٨': '8', + '٩': '9', + '٠': '0' + }; + + var ar_sa = moment__default.defineLocale('ar-sa', { + months : 'يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'), + monthsShort : 'يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'), + weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), + weekdaysShort : 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'), + weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd D MMMM YYYY HH:mm' + }, + meridiemParse: /ص|م/, + isPM : function (input) { + return 'م' === input; + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'ص'; + } else { + return 'م'; + } + }, + calendar : { + sameDay: '[اليوم على الساعة] LT', + nextDay: '[غدا على الساعة] LT', + nextWeek: 'dddd [على الساعة] LT', + lastDay: '[أمس على الساعة] LT', + lastWeek: 'dddd [على الساعة] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'في %s', + past : 'منذ %s', + s : 'ثوان', + m : 'دقيقة', + mm : '%d دقائق', + h : 'ساعة', + hh : '%d ساعات', + d : 'يوم', + dd : '%d أيام', + M : 'شهر', + MM : '%d أشهر', + y : 'سنة', + yy : '%d سنوات' + }, + preparse: function (string) { + return string.replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) { + return ar_sa__numberMap[match]; + }).replace(/،/g, ','); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return ar_sa__symbolMap[match]; + }).replace(/,/g, '،'); + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + //! locale : Tunisian Arabic (ar-tn) + + var ar_tn = moment__default.defineLocale('ar-tn', { + months: 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'), + monthsShort: 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'), + weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), + weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'), + weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'), + longDateFormat: { + LT: 'HH:mm', + LTS: 'HH:mm:ss', + L: 'DD/MM/YYYY', + LL: 'D MMMM YYYY', + LLL: 'D MMMM YYYY HH:mm', + LLLL: 'dddd D MMMM YYYY HH:mm' + }, + calendar: { + sameDay: '[اليوم على الساعة] LT', + nextDay: '[غدا على الساعة] LT', + nextWeek: 'dddd [على الساعة] LT', + lastDay: '[أمس على الساعة] LT', + lastWeek: 'dddd [على الساعة] LT', + sameElse: 'L' + }, + relativeTime: { + future: 'في %s', + past: 'منذ %s', + s: 'ثوان', + m: 'دقيقة', + mm: '%d دقائق', + h: 'ساعة', + hh: '%d ساعات', + d: 'يوم', + dd: '%d أيام', + M: 'شهر', + MM: '%d أشهر', + y: 'سنة', + yy: '%d سنوات' + }, + week: { + dow: 1, // Monday is the first day of the week. + doy: 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + //! moment.js locale configuration + //! Locale: Arabic (ar) + //! Author: Abdel Said: https://github.com/abdelsaid + //! Changes in months, weekdays: Ahmed Elkhatib + //! Native plural forms: forabi https://github.com/forabi + + var ar__symbolMap = { + '1': '١', + '2': '٢', + '3': '٣', + '4': '٤', + '5': '٥', + '6': '٦', + '7': '٧', + '8': '٨', + '9': '٩', + '0': '٠' + }, ar__numberMap = { + '١': '1', + '٢': '2', + '٣': '3', + '٤': '4', + '٥': '5', + '٦': '6', + '٧': '7', + '٨': '8', + '٩': '9', + '٠': '0' + }, pluralForm = function (n) { + return n === 0 ? 0 : n === 1 ? 1 : n === 2 ? 2 : n % 100 >= 3 && n % 100 <= 10 ? 3 : n % 100 >= 11 ? 4 : 5; + }, plurals = { + s : ['أقل من ثانية', 'ثانية واحدة', ['ثانيتان', 'ثانيتين'], '%d ثوان', '%d ثانية', '%d ثانية'], + m : ['أقل من دقيقة', 'دقيقة واحدة', ['دقيقتان', 'دقيقتين'], '%d دقائق', '%d دقيقة', '%d دقيقة'], + h : ['أقل من ساعة', 'ساعة واحدة', ['ساعتان', 'ساعتين'], '%d ساعات', '%d ساعة', '%d ساعة'], + d : ['أقل من يوم', 'يوم واحد', ['يومان', 'يومين'], '%d أيام', '%d يومًا', '%d يوم'], + M : ['أقل من شهر', 'شهر واحد', ['شهران', 'شهرين'], '%d أشهر', '%d شهرا', '%d شهر'], + y : ['أقل من عام', 'عام واحد', ['عامان', 'عامين'], '%d أعوام', '%d عامًا', '%d عام'] + }, pluralize = function (u) { + return function (number, withoutSuffix, string, isFuture) { + var f = pluralForm(number), + str = plurals[u][pluralForm(number)]; + if (f === 2) { + str = str[withoutSuffix ? 0 : 1]; + } + return str.replace(/%d/i, number); + }; + }, ar__months = [ + 'كانون الثاني يناير', + 'شباط فبراير', + 'آذار مارس', + 'نيسان أبريل', + 'أيار مايو', + 'حزيران يونيو', + 'تموز يوليو', + 'آب أغسطس', + 'أيلول سبتمبر', + 'تشرين الأول أكتوبر', + 'تشرين الثاني نوفمبر', + 'كانون الأول ديسمبر' + ]; + + var ar = moment__default.defineLocale('ar', { + months : ar__months, + monthsShort : ar__months, + weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), + weekdaysShort : 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'), + weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'D/\u200FM/\u200FYYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd D MMMM YYYY HH:mm' + }, + meridiemParse: /ص|م/, + isPM : function (input) { + return 'م' === input; + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'ص'; + } else { + return 'م'; + } + }, + calendar : { + sameDay: '[اليوم عند الساعة] LT', + nextDay: '[غدًا عند الساعة] LT', + nextWeek: 'dddd [عند الساعة] LT', + lastDay: '[أمس عند الساعة] LT', + lastWeek: 'dddd [عند الساعة] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'بعد %s', + past : 'منذ %s', + s : pluralize('s'), + m : pluralize('m'), + mm : pluralize('m'), + h : pluralize('h'), + hh : pluralize('h'), + d : pluralize('d'), + dd : pluralize('d'), + M : pluralize('M'), + MM : pluralize('M'), + y : pluralize('y'), + yy : pluralize('y') + }, + preparse: function (string) { + return string.replace(/\u200f/g, '').replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) { + return ar__numberMap[match]; + }).replace(/،/g, ','); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return ar__symbolMap[match]; + }).replace(/,/g, '،'); + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + //! locale : azerbaijani (az) + //! author : topchiyev : https://github.com/topchiyev + + var az__suffixes = { + 1: '-inci', + 5: '-inci', + 8: '-inci', + 70: '-inci', + 80: '-inci', + 2: '-nci', + 7: '-nci', + 20: '-nci', + 50: '-nci', + 3: '-üncü', + 4: '-üncü', + 100: '-üncü', + 6: '-ncı', + 9: '-uncu', + 10: '-uncu', + 30: '-uncu', + 60: '-ıncı', + 90: '-ıncı' + }; + + var az = moment__default.defineLocale('az', { + months : 'yanvar_fevral_mart_aprel_may_iyun_iyul_avqust_sentyabr_oktyabr_noyabr_dekabr'.split('_'), + monthsShort : 'yan_fev_mar_apr_may_iyn_iyl_avq_sen_okt_noy_dek'.split('_'), + weekdays : 'Bazar_Bazar ertəsi_Çərşənbə axşamı_Çərşənbə_Cümə axşamı_Cümə_Şənbə'.split('_'), + weekdaysShort : 'Baz_BzE_ÇAx_Çər_CAx_Cüm_Şən'.split('_'), + weekdaysMin : 'Bz_BE_ÇA_Çə_CA_Cü_Şə'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd, D MMMM YYYY HH:mm' + }, + calendar : { + sameDay : '[bugün saat] LT', + nextDay : '[sabah saat] LT', + nextWeek : '[gələn həftə] dddd [saat] LT', + lastDay : '[dünən] LT', + lastWeek : '[keçən həftə] dddd [saat] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s sonra', + past : '%s əvvəl', + s : 'birneçə saniyyə', + m : 'bir dəqiqə', + mm : '%d dəqiqə', + h : 'bir saat', + hh : '%d saat', + d : 'bir gün', + dd : '%d gün', + M : 'bir ay', + MM : '%d ay', + y : 'bir il', + yy : '%d il' + }, + meridiemParse: /gecə|səhər|gündüz|axşam/, + isPM : function (input) { + return /^(gündüz|axşam)$/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'gecə'; + } else if (hour < 12) { + return 'səhər'; + } else if (hour < 17) { + return 'gündüz'; + } else { + return 'axşam'; + } + }, + ordinalParse: /\d{1,2}-(ıncı|inci|nci|üncü|ncı|uncu)/, + ordinal : function (number) { + if (number === 0) { // special case for zero + return number + '-ıncı'; + } + var a = number % 10, + b = number % 100 - a, + c = number >= 100 ? 100 : null; + return number + (az__suffixes[a] || az__suffixes[b] || az__suffixes[c]); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + //! locale : belarusian (be) + //! author : Dmitry Demidov : https://github.com/demidov91 + //! author: Praleska: http://praleska.pro/ + //! Author : Menelion Elensúle : https://github.com/Oire + + function be__plural(word, num) { + var forms = word.split('_'); + return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]); + } + function be__relativeTimeWithPlural(number, withoutSuffix, key) { + var format = { + 'mm': withoutSuffix ? 'хвіліна_хвіліны_хвілін' : 'хвіліну_хвіліны_хвілін', + 'hh': withoutSuffix ? 'гадзіна_гадзіны_гадзін' : 'гадзіну_гадзіны_гадзін', + 'dd': 'дзень_дні_дзён', + 'MM': 'месяц_месяцы_месяцаў', + 'yy': 'год_гады_гадоў' + }; + if (key === 'm') { + return withoutSuffix ? 'хвіліна' : 'хвіліну'; + } + else if (key === 'h') { + return withoutSuffix ? 'гадзіна' : 'гадзіну'; + } + else { + return number + ' ' + be__plural(format[key], +number); + } + } + + var be = moment__default.defineLocale('be', { + months : { + format: 'студзеня_лютага_сакавіка_красавіка_траўня_чэрвеня_ліпеня_жніўня_верасня_кастрычніка_лістапада_снежня'.split('_'), + standalone: 'студзень_люты_сакавік_красавік_травень_чэрвень_ліпень_жнівень_верасень_кастрычнік_лістапад_снежань'.split('_') + }, + monthsShort : 'студ_лют_сак_крас_трав_чэрв_ліп_жнів_вер_каст_ліст_снеж'.split('_'), + weekdays : { + format: 'нядзелю_панядзелак_аўторак_сераду_чацвер_пятніцу_суботу'.split('_'), + standalone: 'нядзеля_панядзелак_аўторак_серада_чацвер_пятніца_субота'.split('_'), + isFormat: /\[ ?[Вв] ?(?:мінулую|наступную)? ?\] ?dddd/ + }, + weekdaysShort : 'нд_пн_ат_ср_чц_пт_сб'.split('_'), + weekdaysMin : 'нд_пн_ат_ср_чц_пт_сб'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY г.', + LLL : 'D MMMM YYYY г., HH:mm', + LLLL : 'dddd, D MMMM YYYY г., HH:mm' + }, + calendar : { + sameDay: '[Сёння ў] LT', + nextDay: '[Заўтра ў] LT', + lastDay: '[Учора ў] LT', + nextWeek: function () { + return '[У] dddd [ў] LT'; + }, + lastWeek: function () { + switch (this.day()) { + case 0: + case 3: + case 5: + case 6: + return '[У мінулую] dddd [ў] LT'; + case 1: + case 2: + case 4: + return '[У мінулы] dddd [ў] LT'; + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'праз %s', + past : '%s таму', + s : 'некалькі секунд', + m : be__relativeTimeWithPlural, + mm : be__relativeTimeWithPlural, + h : be__relativeTimeWithPlural, + hh : be__relativeTimeWithPlural, + d : 'дзень', + dd : be__relativeTimeWithPlural, + M : 'месяц', + MM : be__relativeTimeWithPlural, + y : 'год', + yy : be__relativeTimeWithPlural + }, + meridiemParse: /ночы|раніцы|дня|вечара/, + isPM : function (input) { + return /^(дня|вечара)$/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'ночы'; + } else if (hour < 12) { + return 'раніцы'; + } else if (hour < 17) { + return 'дня'; + } else { + return 'вечара'; + } + }, + ordinalParse: /\d{1,2}-(і|ы|га)/, + ordinal: function (number, period) { + switch (period) { + case 'M': + case 'd': + case 'DDD': + case 'w': + case 'W': + return (number % 10 === 2 || number % 10 === 3) && (number % 100 !== 12 && number % 100 !== 13) ? number + '-і' : number + '-ы'; + case 'D': + return number + '-га'; + default: + return number; + } + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + //! locale : bulgarian (bg) + //! author : Krasen Borisov : https://github.com/kraz + + var bg = moment__default.defineLocale('bg', { + months : 'януари_февруари_март_април_май_юни_юли_август_септември_октомври_ноември_декември'.split('_'), + monthsShort : 'янр_фев_мар_апр_май_юни_юли_авг_сеп_окт_ное_дек'.split('_'), + weekdays : 'неделя_понеделник_вторник_сряда_четвъртък_петък_събота'.split('_'), + weekdaysShort : 'нед_пон_вто_сря_чет_пет_съб'.split('_'), + weekdaysMin : 'нд_пн_вт_ср_чт_пт_сб'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'H:mm:ss', + L : 'D.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY H:mm', + LLLL : 'dddd, D MMMM YYYY H:mm' + }, + calendar : { + sameDay : '[Днес в] LT', + nextDay : '[Утре в] LT', + nextWeek : 'dddd [в] LT', + lastDay : '[Вчера в] LT', + lastWeek : function () { + switch (this.day()) { + case 0: + case 3: + case 6: + return '[В изминалата] dddd [в] LT'; + case 1: + case 2: + case 4: + case 5: + return '[В изминалия] dddd [в] LT'; + } + }, + sameElse : 'L' + }, + relativeTime : { + future : 'след %s', + past : 'преди %s', + s : 'няколко секунди', + m : 'минута', + mm : '%d минути', + h : 'час', + hh : '%d часа', + d : 'ден', + dd : '%d дни', + M : 'месец', + MM : '%d месеца', + y : 'година', + yy : '%d години' + }, + ordinalParse: /\d{1,2}-(ев|ен|ти|ви|ри|ми)/, + ordinal : function (number) { + var lastDigit = number % 10, + last2Digits = number % 100; + if (number === 0) { + return number + '-ев'; + } else if (last2Digits === 0) { + return number + '-ен'; + } else if (last2Digits > 10 && last2Digits < 20) { + return number + '-ти'; + } else if (lastDigit === 1) { + return number + '-ви'; + } else if (lastDigit === 2) { + return number + '-ри'; + } else if (lastDigit === 7 || lastDigit === 8) { + return number + '-ми'; + } else { + return number + '-ти'; + } + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + //! locale : Bengali (bn) + //! author : Kaushik Gandhi : https://github.com/kaushikgandhi + + var bn__symbolMap = { + '1': '১', + '2': '২', + '3': '৩', + '4': '৪', + '5': '৫', + '6': '৬', + '7': '৭', + '8': '৮', + '9': '৯', + '0': '০' + }, + bn__numberMap = { + '১': '1', + '২': '2', + '৩': '3', + '৪': '4', + '৫': '5', + '৬': '6', + '৭': '7', + '৮': '8', + '৯': '9', + '০': '0' + }; + + var bn = moment__default.defineLocale('bn', { + months : 'জানুয়ারী_ফেবুয়ারী_মার্চ_এপ্রিল_মে_জুন_জুলাই_অগাস্ট_সেপ্টেম্বর_অক্টোবর_নভেম্বর_ডিসেম্বর'.split('_'), + monthsShort : 'জানু_ফেব_মার্চ_এপর_মে_জুন_জুল_অগ_সেপ্ট_অক্টো_নভ_ডিসেম্'.split('_'), + weekdays : 'রবিবার_সোমবার_মঙ্গলবার_বুধবার_বৃহস্পত্তিবার_শুক্রবার_শনিবার'.split('_'), + weekdaysShort : 'রবি_সোম_মঙ্গল_বুধ_বৃহস্পত্তি_শুক্র_শনি'.split('_'), + weekdaysMin : 'রব_সম_মঙ্গ_বু_ব্রিহ_শু_শনি'.split('_'), + longDateFormat : { + LT : 'A h:mm সময়', + LTS : 'A h:mm:ss সময়', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, A h:mm সময়', + LLLL : 'dddd, D MMMM YYYY, A h:mm সময়' + }, + calendar : { + sameDay : '[আজ] LT', + nextDay : '[আগামীকাল] LT', + nextWeek : 'dddd, LT', + lastDay : '[গতকাল] LT', + lastWeek : '[গত] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s পরে', + past : '%s আগে', + s : 'কয়েক সেকেন্ড', + m : 'এক মিনিট', + mm : '%d মিনিট', + h : 'এক ঘন্টা', + hh : '%d ঘন্টা', + d : 'এক দিন', + dd : '%d দিন', + M : 'এক মাস', + MM : '%d মাস', + y : 'এক বছর', + yy : '%d বছর' + }, + preparse: function (string) { + return string.replace(/[১২৩৪৫৬৭৮৯০]/g, function (match) { + return bn__numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return bn__symbolMap[match]; + }); + }, + meridiemParse: /রাত|সকাল|দুপুর|বিকাল|রাত/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if ((meridiem === 'রাত' && hour >= 4) || + (meridiem === 'দুপুর' && hour < 5) || + meridiem === 'বিকাল') { + return hour + 12; + } else { + return hour; + } + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'রাত'; + } else if (hour < 10) { + return 'সকাল'; + } else if (hour < 17) { + return 'দুপুর'; + } else if (hour < 20) { + return 'বিকাল'; + } else { + return 'রাত'; + } + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + //! locale : tibetan (bo) + //! author : Thupten N. Chakrishar : https://github.com/vajradog + + var bo__symbolMap = { + '1': '༡', + '2': '༢', + '3': '༣', + '4': '༤', + '5': '༥', + '6': '༦', + '7': '༧', + '8': '༨', + '9': '༩', + '0': '༠' + }, + bo__numberMap = { + '༡': '1', + '༢': '2', + '༣': '3', + '༤': '4', + '༥': '5', + '༦': '6', + '༧': '7', + '༨': '8', + '༩': '9', + '༠': '0' + }; + + var bo = moment__default.defineLocale('bo', { + months : 'ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ'.split('_'), + monthsShort : 'ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ'.split('_'), + weekdays : 'གཟའ་ཉི་མ་_གཟའ་ཟླ་བ་_གཟའ་མིག་དམར་_གཟའ་ལྷག་པ་_གཟའ་ཕུར་བུ_གཟའ་པ་སངས་_གཟའ་སྤེན་པ་'.split('_'), + weekdaysShort : 'ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་'.split('_'), + weekdaysMin : 'ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་'.split('_'), + longDateFormat : { + LT : 'A h:mm', + LTS : 'A h:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, A h:mm', + LLLL : 'dddd, D MMMM YYYY, A h:mm' + }, + calendar : { + sameDay : '[དི་རིང] LT', + nextDay : '[སང་ཉིན] LT', + nextWeek : '[བདུན་ཕྲག་རྗེས་མ], LT', + lastDay : '[ཁ་སང] LT', + lastWeek : '[བདུན་ཕྲག་མཐའ་མ] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s ལ་', + past : '%s སྔན་ལ', + s : 'ལམ་སང', + m : 'སྐར་མ་གཅིག', + mm : '%d སྐར་མ', + h : 'ཆུ་ཚོད་གཅིག', + hh : '%d ཆུ་ཚོད', + d : 'ཉིན་གཅིག', + dd : '%d ཉིན་', + M : 'ཟླ་བ་གཅིག', + MM : '%d ཟླ་བ', + y : 'ལོ་གཅིག', + yy : '%d ལོ' + }, + preparse: function (string) { + return string.replace(/[༡༢༣༤༥༦༧༨༩༠]/g, function (match) { + return bo__numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return bo__symbolMap[match]; + }); + }, + meridiemParse: /མཚན་མོ|ཞོགས་ཀས|ཉིན་གུང|དགོང་དག|མཚན་མོ/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if ((meridiem === 'མཚན་མོ' && hour >= 4) || + (meridiem === 'ཉིན་གུང' && hour < 5) || + meridiem === 'དགོང་དག') { + return hour + 12; + } else { + return hour; + } + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'མཚན་མོ'; + } else if (hour < 10) { + return 'ཞོགས་ཀས'; + } else if (hour < 17) { + return 'ཉིན་གུང'; + } else if (hour < 20) { + return 'དགོང་དག'; + } else { + return 'མཚན་མོ'; + } + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + //! locale : breton (br) + //! author : Jean-Baptiste Le Duigou : https://github.com/jbleduigou + + function relativeTimeWithMutation(number, withoutSuffix, key) { + var format = { + 'mm': 'munutenn', + 'MM': 'miz', + 'dd': 'devezh' + }; + return number + ' ' + mutation(format[key], number); + } + function specialMutationForYears(number) { + switch (lastNumber(number)) { + case 1: + case 3: + case 4: + case 5: + case 9: + return number + ' bloaz'; + default: + return number + ' vloaz'; + } + } + function lastNumber(number) { + if (number > 9) { + return lastNumber(number % 10); + } + return number; + } + function mutation(text, number) { + if (number === 2) { + return softMutation(text); + } + return text; + } + function softMutation(text) { + var mutationTable = { + 'm': 'v', + 'b': 'v', + 'd': 'z' + }; + if (mutationTable[text.charAt(0)] === undefined) { + return text; + } + return mutationTable[text.charAt(0)] + text.substring(1); + } + + var br = moment__default.defineLocale('br', { + months : 'Genver_C\'hwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu'.split('_'), + monthsShort : 'Gen_C\'hwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker'.split('_'), + weekdays : 'Sul_Lun_Meurzh_Merc\'her_Yaou_Gwener_Sadorn'.split('_'), + weekdaysShort : 'Sul_Lun_Meu_Mer_Yao_Gwe_Sad'.split('_'), + weekdaysMin : 'Su_Lu_Me_Mer_Ya_Gw_Sa'.split('_'), + longDateFormat : { + LT : 'h[e]mm A', + LTS : 'h[e]mm:ss A', + L : 'DD/MM/YYYY', + LL : 'D [a viz] MMMM YYYY', + LLL : 'D [a viz] MMMM YYYY h[e]mm A', + LLLL : 'dddd, D [a viz] MMMM YYYY h[e]mm A' + }, + calendar : { + sameDay : '[Hiziv da] LT', + nextDay : '[Warc\'hoazh da] LT', + nextWeek : 'dddd [da] LT', + lastDay : '[Dec\'h da] LT', + lastWeek : 'dddd [paset da] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'a-benn %s', + past : '%s \'zo', + s : 'un nebeud segondennoù', + m : 'ur vunutenn', + mm : relativeTimeWithMutation, + h : 'un eur', + hh : '%d eur', + d : 'un devezh', + dd : relativeTimeWithMutation, + M : 'ur miz', + MM : relativeTimeWithMutation, + y : 'ur bloaz', + yy : specialMutationForYears + }, + ordinalParse: /\d{1,2}(añ|vet)/, + ordinal : function (number) { + var output = (number === 1) ? 'añ' : 'vet'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + //! moment.js locale configuration + //! locale : bosnian (bs) + //! author : Nedim Cholich : https://github.com/frontyard + //! based on (hr) translation by Bojan Marković + + function bs__translate(number, withoutSuffix, key) { + var result = number + ' '; + switch (key) { + case 'm': + return withoutSuffix ? 'jedna minuta' : 'jedne minute'; + case 'mm': + if (number === 1) { + result += 'minuta'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'minute'; + } else { + result += 'minuta'; + } + return result; + case 'h': + return withoutSuffix ? 'jedan sat' : 'jednog sata'; + case 'hh': + if (number === 1) { + result += 'sat'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'sata'; + } else { + result += 'sati'; + } + return result; + case 'dd': + if (number === 1) { + result += 'dan'; + } else { + result += 'dana'; + } + return result; + case 'MM': + if (number === 1) { + result += 'mjesec'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'mjeseca'; + } else { + result += 'mjeseci'; + } + return result; + case 'yy': + if (number === 1) { + result += 'godina'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'godine'; + } else { + result += 'godina'; + } + return result; + } + } + + var bs = moment__default.defineLocale('bs', { + months : 'januar_februar_mart_april_maj_juni_juli_august_septembar_oktobar_novembar_decembar'.split('_'), + monthsShort : 'jan._feb._mar._apr._maj._jun._jul._aug._sep._okt._nov._dec.'.split('_'), + weekdays : 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split('_'), + weekdaysShort : 'ned._pon._uto._sri._čet._pet._sub.'.split('_'), + weekdaysMin : 'ne_po_ut_sr_če_pe_su'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'H:mm:ss', + L : 'DD. MM. YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY H:mm', + LLLL : 'dddd, D. MMMM YYYY H:mm' + }, + calendar : { + sameDay : '[danas u] LT', + nextDay : '[sutra u] LT', + nextWeek : function () { + switch (this.day()) { + case 0: + return '[u] [nedjelju] [u] LT'; + case 3: + return '[u] [srijedu] [u] LT'; + case 6: + return '[u] [subotu] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[u] dddd [u] LT'; + } + }, + lastDay : '[jučer u] LT', + lastWeek : function () { + switch (this.day()) { + case 0: + case 3: + return '[prošlu] dddd [u] LT'; + case 6: + return '[prošle] [subote] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[prošli] dddd [u] LT'; + } + }, + sameElse : 'L' + }, + relativeTime : { + future : 'za %s', + past : 'prije %s', + s : 'par sekundi', + m : bs__translate, + mm : bs__translate, + h : bs__translate, + hh : bs__translate, + d : 'dan', + dd : bs__translate, + M : 'mjesec', + MM : bs__translate, + y : 'godinu', + yy : bs__translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + //! locale : catalan (ca) + //! author : Juan G. Hurtado : https://github.com/juanghurtado + + var ca = moment__default.defineLocale('ca', { + months : 'gener_febrer_març_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre'.split('_'), + monthsShort : 'gen._febr._mar._abr._mai._jun._jul._ag._set._oct._nov._des.'.split('_'), + weekdays : 'diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte'.split('_'), + weekdaysShort : 'dg._dl._dt._dc._dj._dv._ds.'.split('_'), + weekdaysMin : 'Dg_Dl_Dt_Dc_Dj_Dv_Ds'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'H:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY H:mm', + LLLL : 'dddd D MMMM YYYY H:mm' + }, + calendar : { + sameDay : function () { + return '[avui a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + nextDay : function () { + return '[demà a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + nextWeek : function () { + return 'dddd [a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + lastDay : function () { + return '[ahir a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + lastWeek : function () { + return '[el] dddd [passat a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + sameElse : 'L' + }, + relativeTime : { + future : 'en %s', + past : 'fa %s', + s : 'uns segons', + m : 'un minut', + mm : '%d minuts', + h : 'una hora', + hh : '%d hores', + d : 'un dia', + dd : '%d dies', + M : 'un mes', + MM : '%d mesos', + y : 'un any', + yy : '%d anys' + }, + ordinalParse: /\d{1,2}(r|n|t|è|a)/, + ordinal : function (number, period) { + var output = (number === 1) ? 'r' : + (number === 2) ? 'n' : + (number === 3) ? 'r' : + (number === 4) ? 't' : 'è'; + if (period === 'w' || period === 'W') { + output = 'a'; + } + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + //! moment.js locale configuration + //! locale : czech (cs) + //! author : petrbela : https://github.com/petrbela + + var cs__months = 'leden_únor_březen_duben_květen_červen_červenec_srpen_září_říjen_listopad_prosinec'.split('_'), + cs__monthsShort = 'led_úno_bře_dub_kvě_čvn_čvc_srp_zář_říj_lis_pro'.split('_'); + function cs__plural(n) { + return (n > 1) && (n < 5) && (~~(n / 10) !== 1); + } + function cs__translate(number, withoutSuffix, key, isFuture) { + var result = number + ' '; + switch (key) { + case 's': // a few seconds / in a few seconds / a few seconds ago + return (withoutSuffix || isFuture) ? 'pár sekund' : 'pár sekundami'; + case 'm': // a minute / in a minute / a minute ago + return withoutSuffix ? 'minuta' : (isFuture ? 'minutu' : 'minutou'); + case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago + if (withoutSuffix || isFuture) { + return result + (cs__plural(number) ? 'minuty' : 'minut'); + } else { + return result + 'minutami'; + } + break; + case 'h': // an hour / in an hour / an hour ago + return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou'); + case 'hh': // 9 hours / in 9 hours / 9 hours ago + if (withoutSuffix || isFuture) { + return result + (cs__plural(number) ? 'hodiny' : 'hodin'); + } else { + return result + 'hodinami'; + } + break; + case 'd': // a day / in a day / a day ago + return (withoutSuffix || isFuture) ? 'den' : 'dnem'; + case 'dd': // 9 days / in 9 days / 9 days ago + if (withoutSuffix || isFuture) { + return result + (cs__plural(number) ? 'dny' : 'dní'); + } else { + return result + 'dny'; + } + break; + case 'M': // a month / in a month / a month ago + return (withoutSuffix || isFuture) ? 'měsíc' : 'měsícem'; + case 'MM': // 9 months / in 9 months / 9 months ago + if (withoutSuffix || isFuture) { + return result + (cs__plural(number) ? 'měsíce' : 'měsíců'); + } else { + return result + 'měsíci'; + } + break; + case 'y': // a year / in a year / a year ago + return (withoutSuffix || isFuture) ? 'rok' : 'rokem'; + case 'yy': // 9 years / in 9 years / 9 years ago + if (withoutSuffix || isFuture) { + return result + (cs__plural(number) ? 'roky' : 'let'); + } else { + return result + 'lety'; + } + break; + } + } + + var cs = moment__default.defineLocale('cs', { + months : cs__months, + monthsShort : cs__monthsShort, + monthsParse : (function (months, monthsShort) { + var i, _monthsParse = []; + for (i = 0; i < 12; i++) { + // use custom parser to solve problem with July (červenec) + _monthsParse[i] = new RegExp('^' + months[i] + '$|^' + monthsShort[i] + '$', 'i'); + } + return _monthsParse; + }(cs__months, cs__monthsShort)), + shortMonthsParse : (function (monthsShort) { + var i, _shortMonthsParse = []; + for (i = 0; i < 12; i++) { + _shortMonthsParse[i] = new RegExp('^' + monthsShort[i] + '$', 'i'); + } + return _shortMonthsParse; + }(cs__monthsShort)), + longMonthsParse : (function (months) { + var i, _longMonthsParse = []; + for (i = 0; i < 12; i++) { + _longMonthsParse[i] = new RegExp('^' + months[i] + '$', 'i'); + } + return _longMonthsParse; + }(cs__months)), + weekdays : 'neděle_pondělí_úterý_středa_čtvrtek_pátek_sobota'.split('_'), + weekdaysShort : 'ne_po_út_st_čt_pá_so'.split('_'), + weekdaysMin : 'ne_po_út_st_čt_pá_so'.split('_'), + longDateFormat : { + LT: 'H:mm', + LTS : 'H:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY H:mm', + LLLL : 'dddd D. MMMM YYYY H:mm' + }, + calendar : { + sameDay: '[dnes v] LT', + nextDay: '[zítra v] LT', + nextWeek: function () { + switch (this.day()) { + case 0: + return '[v neděli v] LT'; + case 1: + case 2: + return '[v] dddd [v] LT'; + case 3: + return '[ve středu v] LT'; + case 4: + return '[ve čtvrtek v] LT'; + case 5: + return '[v pátek v] LT'; + case 6: + return '[v sobotu v] LT'; + } + }, + lastDay: '[včera v] LT', + lastWeek: function () { + switch (this.day()) { + case 0: + return '[minulou neděli v] LT'; + case 1: + case 2: + return '[minulé] dddd [v] LT'; + case 3: + return '[minulou středu v] LT'; + case 4: + case 5: + return '[minulý] dddd [v] LT'; + case 6: + return '[minulou sobotu v] LT'; + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'za %s', + past : 'před %s', + s : cs__translate, + m : cs__translate, + mm : cs__translate, + h : cs__translate, + hh : cs__translate, + d : cs__translate, + dd : cs__translate, + M : cs__translate, + MM : cs__translate, + y : cs__translate, + yy : cs__translate + }, + ordinalParse : /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + //! moment.js locale configuration + //! locale : chuvash (cv) + //! author : Anatoly Mironov : https://github.com/mirontoli + + var cv = moment__default.defineLocale('cv', { + months : 'кӑрлач_нарӑс_пуш_ака_май_ҫӗртме_утӑ_ҫурла_авӑн_юпа_чӳк_раштав'.split('_'), + monthsShort : 'кӑр_нар_пуш_ака_май_ҫӗр_утӑ_ҫур_авн_юпа_чӳк_раш'.split('_'), + weekdays : 'вырсарникун_тунтикун_ытларикун_юнкун_кӗҫнерникун_эрнекун_шӑматкун'.split('_'), + weekdaysShort : 'выр_тун_ытл_юн_кӗҫ_эрн_шӑм'.split('_'), + weekdaysMin : 'вр_тн_ыт_юн_кҫ_эр_шм'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD-MM-YYYY', + LL : 'YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ]', + LLL : 'YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ], HH:mm', + LLLL : 'dddd, YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ], HH:mm' + }, + calendar : { + sameDay: '[Паян] LT [сехетре]', + nextDay: '[Ыран] LT [сехетре]', + lastDay: '[Ӗнер] LT [сехетре]', + nextWeek: '[Ҫитес] dddd LT [сехетре]', + lastWeek: '[Иртнӗ] dddd LT [сехетре]', + sameElse: 'L' + }, + relativeTime : { + future : function (output) { + var affix = /сехет$/i.exec(output) ? 'рен' : /ҫул$/i.exec(output) ? 'тан' : 'ран'; + return output + affix; + }, + past : '%s каялла', + s : 'пӗр-ик ҫеккунт', + m : 'пӗр минут', + mm : '%d минут', + h : 'пӗр сехет', + hh : '%d сехет', + d : 'пӗр кун', + dd : '%d кун', + M : 'пӗр уйӑх', + MM : '%d уйӑх', + y : 'пӗр ҫул', + yy : '%d ҫул' + }, + ordinalParse: /\d{1,2}-мӗш/, + ordinal : '%d-мӗш', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + //! locale : Welsh (cy) + //! author : Robert Allen + + var cy = moment__default.defineLocale('cy', { + months: 'Ionawr_Chwefror_Mawrth_Ebrill_Mai_Mehefin_Gorffennaf_Awst_Medi_Hydref_Tachwedd_Rhagfyr'.split('_'), + monthsShort: 'Ion_Chwe_Maw_Ebr_Mai_Meh_Gor_Aws_Med_Hyd_Tach_Rhag'.split('_'), + weekdays: 'Dydd Sul_Dydd Llun_Dydd Mawrth_Dydd Mercher_Dydd Iau_Dydd Gwener_Dydd Sadwrn'.split('_'), + weekdaysShort: 'Sul_Llun_Maw_Mer_Iau_Gwe_Sad'.split('_'), + weekdaysMin: 'Su_Ll_Ma_Me_Ia_Gw_Sa'.split('_'), + // time formats are the same as en-gb + longDateFormat: { + LT: 'HH:mm', + LTS : 'HH:mm:ss', + L: 'DD/MM/YYYY', + LL: 'D MMMM YYYY', + LLL: 'D MMMM YYYY HH:mm', + LLLL: 'dddd, D MMMM YYYY HH:mm' + }, + calendar: { + sameDay: '[Heddiw am] LT', + nextDay: '[Yfory am] LT', + nextWeek: 'dddd [am] LT', + lastDay: '[Ddoe am] LT', + lastWeek: 'dddd [diwethaf am] LT', + sameElse: 'L' + }, + relativeTime: { + future: 'mewn %s', + past: '%s yn ôl', + s: 'ychydig eiliadau', + m: 'munud', + mm: '%d munud', + h: 'awr', + hh: '%d awr', + d: 'diwrnod', + dd: '%d diwrnod', + M: 'mis', + MM: '%d mis', + y: 'blwyddyn', + yy: '%d flynedd' + }, + ordinalParse: /\d{1,2}(fed|ain|af|il|ydd|ed|eg)/, + // traditional ordinal numbers above 31 are not commonly used in colloquial Welsh + ordinal: function (number) { + var b = number, + output = '', + lookup = [ + '', 'af', 'il', 'ydd', 'ydd', 'ed', 'ed', 'ed', 'fed', 'fed', 'fed', // 1af to 10fed + 'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'fed' // 11eg to 20fed + ]; + if (b > 20) { + if (b === 40 || b === 50 || b === 60 || b === 80 || b === 100) { + output = 'fed'; // not 30ain, 70ain or 90ain + } else { + output = 'ain'; + } + } else if (b > 0) { + output = lookup[b]; + } + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + //! moment.js locale configuration + //! locale : danish (da) + //! author : Ulrik Nielsen : https://github.com/mrbase + + var da = moment__default.defineLocale('da', { + months : 'januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december'.split('_'), + monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'), + weekdays : 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'), + weekdaysShort : 'søn_man_tir_ons_tor_fre_lør'.split('_'), + weekdaysMin : 'sø_ma_ti_on_to_fr_lø'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY HH:mm', + LLLL : 'dddd [d.] D. MMMM YYYY HH:mm' + }, + calendar : { + sameDay : '[I dag kl.] LT', + nextDay : '[I morgen kl.] LT', + nextWeek : 'dddd [kl.] LT', + lastDay : '[I går kl.] LT', + lastWeek : '[sidste] dddd [kl] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'om %s', + past : '%s siden', + s : 'få sekunder', + m : 'et minut', + mm : '%d minutter', + h : 'en time', + hh : '%d timer', + d : 'en dag', + dd : '%d dage', + M : 'en måned', + MM : '%d måneder', + y : 'et år', + yy : '%d år' + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + //! moment.js locale configuration + //! locale : austrian german (de-at) + //! author : lluchs : https://github.com/lluchs + //! author: Menelion Elensúle: https://github.com/Oire + //! author : Martin Groller : https://github.com/MadMG + //! author : Mikolaj Dadela : https://github.com/mik01aj + + function de_at__processRelativeTime(number, withoutSuffix, key, isFuture) { + var format = { + 'm': ['eine Minute', 'einer Minute'], + 'h': ['eine Stunde', 'einer Stunde'], + 'd': ['ein Tag', 'einem Tag'], + 'dd': [number + ' Tage', number + ' Tagen'], + 'M': ['ein Monat', 'einem Monat'], + 'MM': [number + ' Monate', number + ' Monaten'], + 'y': ['ein Jahr', 'einem Jahr'], + 'yy': [number + ' Jahre', number + ' Jahren'] + }; + return withoutSuffix ? format[key][0] : format[key][1]; + } + + var de_at = moment__default.defineLocale('de-at', { + months : 'Jänner_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'), + monthsShort : 'Jän._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'), + weekdays : 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'), + weekdaysShort : 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'), + weekdaysMin : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'), + longDateFormat : { + LT: 'HH:mm', + LTS: 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY HH:mm', + LLLL : 'dddd, D. MMMM YYYY HH:mm' + }, + calendar : { + sameDay: '[heute um] LT [Uhr]', + sameElse: 'L', + nextDay: '[morgen um] LT [Uhr]', + nextWeek: 'dddd [um] LT [Uhr]', + lastDay: '[gestern um] LT [Uhr]', + lastWeek: '[letzten] dddd [um] LT [Uhr]' + }, + relativeTime : { + future : 'in %s', + past : 'vor %s', + s : 'ein paar Sekunden', + m : de_at__processRelativeTime, + mm : '%d Minuten', + h : de_at__processRelativeTime, + hh : '%d Stunden', + d : de_at__processRelativeTime, + dd : de_at__processRelativeTime, + M : de_at__processRelativeTime, + MM : de_at__processRelativeTime, + y : de_at__processRelativeTime, + yy : de_at__processRelativeTime + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + //! moment.js locale configuration + //! locale : german (de) + //! author : lluchs : https://github.com/lluchs + //! author: Menelion Elensúle: https://github.com/Oire + //! author : Mikolaj Dadela : https://github.com/mik01aj + + function de__processRelativeTime(number, withoutSuffix, key, isFuture) { + var format = { + 'm': ['eine Minute', 'einer Minute'], + 'h': ['eine Stunde', 'einer Stunde'], + 'd': ['ein Tag', 'einem Tag'], + 'dd': [number + ' Tage', number + ' Tagen'], + 'M': ['ein Monat', 'einem Monat'], + 'MM': [number + ' Monate', number + ' Monaten'], + 'y': ['ein Jahr', 'einem Jahr'], + 'yy': [number + ' Jahre', number + ' Jahren'] + }; + return withoutSuffix ? format[key][0] : format[key][1]; + } + + var de = moment__default.defineLocale('de', { + months : 'Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'), + monthsShort : 'Jan._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'), + weekdays : 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'), + weekdaysShort : 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'), + weekdaysMin : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'), + longDateFormat : { + LT: 'HH:mm', + LTS: 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY HH:mm', + LLLL : 'dddd, D. MMMM YYYY HH:mm' + }, + calendar : { + sameDay: '[heute um] LT [Uhr]', + sameElse: 'L', + nextDay: '[morgen um] LT [Uhr]', + nextWeek: 'dddd [um] LT [Uhr]', + lastDay: '[gestern um] LT [Uhr]', + lastWeek: '[letzten] dddd [um] LT [Uhr]' + }, + relativeTime : { + future : 'in %s', + past : 'vor %s', + s : 'ein paar Sekunden', + m : de__processRelativeTime, + mm : '%d Minuten', + h : de__processRelativeTime, + hh : '%d Stunden', + d : de__processRelativeTime, + dd : de__processRelativeTime, + M : de__processRelativeTime, + MM : de__processRelativeTime, + y : de__processRelativeTime, + yy : de__processRelativeTime + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + //! moment.js locale configuration + //! locale : dhivehi (dv) + //! author : Jawish Hameed : https://github.com/jawish + + var dv__months = [ + 'ޖެނުއަރީ', + 'ފެބްރުއަރީ', + 'މާރިޗު', + 'އޭޕްރީލު', + 'މޭ', + 'ޖޫން', + 'ޖުލައި', + 'އޯގަސްޓު', + 'ސެޕްޓެމްބަރު', + 'އޮކްޓޯބަރު', + 'ނޮވެމްބަރު', + 'ޑިސެމްބަރު' + ], dv__weekdays = [ + 'އާދިއްތަ', + 'ހޯމަ', + 'އަންގާރަ', + 'ބުދަ', + 'ބުރާސްފަތި', + 'ހުކުރު', + 'ހޮނިހިރު' + ]; + + var dv = moment__default.defineLocale('dv', { + months : dv__months, + monthsShort : dv__months, + weekdays : dv__weekdays, + weekdaysShort : dv__weekdays, + weekdaysMin : 'އާދި_ހޯމަ_އަން_ބުދަ_ބުރާ_ހުކު_ހޮނި'.split('_'), + longDateFormat : { + + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'D/M/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd D MMMM YYYY HH:mm' + }, + meridiemParse: /މކ|މފ/, + isPM : function (input) { + return 'މފ' === input; + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'މކ'; + } else { + return 'މފ'; + } + }, + calendar : { + sameDay : '[މިއަދު] LT', + nextDay : '[މާދަމާ] LT', + nextWeek : 'dddd LT', + lastDay : '[އިއްޔެ] LT', + lastWeek : '[ފާއިތުވި] dddd LT', + sameElse : 'L' + }, + relativeTime : { + future : 'ތެރޭގައި %s', + past : 'ކުރިން %s', + s : 'ސިކުންތުކޮޅެއް', + m : 'މިނިޓެއް', + mm : 'މިނިޓު %d', + h : 'ގަޑިއިރެއް', + hh : 'ގަޑިއިރު %d', + d : 'ދުވަހެއް', + dd : 'ދުވަސް %d', + M : 'މަހެއް', + MM : 'މަސް %d', + y : 'އަހަރެއް', + yy : 'އަހަރު %d' + }, + preparse: function (string) { + return string.replace(/،/g, ','); + }, + postformat: function (string) { + return string.replace(/,/g, '،'); + }, + week : { + dow : 7, // Sunday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + //! locale : modern greek (el) + //! author : Aggelos Karalias : https://github.com/mehiel + + var el = moment__default.defineLocale('el', { + monthsNominativeEl : 'Ιανουάριος_Φεβρουάριος_Μάρτιος_Απρίλιος_Μάιος_Ιούνιος_Ιούλιος_Αύγουστος_Σεπτέμβριος_Οκτώβριος_Νοέμβριος_Δεκέμβριος'.split('_'), + monthsGenitiveEl : 'Ιανουαρίου_Φεβρουαρίου_Μαρτίου_Απριλίου_Μαΐου_Ιουνίου_Ιουλίου_Αυγούστου_Σεπτεμβρίου_Οκτωβρίου_Νοεμβρίου_Δεκεμβρίου'.split('_'), + months : function (momentToFormat, format) { + if (/D/.test(format.substring(0, format.indexOf('MMMM')))) { // if there is a day number before 'MMMM' + return this._monthsGenitiveEl[momentToFormat.month()]; + } else { + return this._monthsNominativeEl[momentToFormat.month()]; + } + }, + monthsShort : 'Ιαν_Φεβ_Μαρ_Απρ_Μαϊ_Ιουν_Ιουλ_Αυγ_Σεπ_Οκτ_Νοε_Δεκ'.split('_'), + weekdays : 'Κυριακή_Δευτέρα_Τρίτη_Τετάρτη_Πέμπτη_Παρασκευή_Σάββατο'.split('_'), + weekdaysShort : 'Κυρ_Δευ_Τρι_Τετ_Πεμ_Παρ_Σαβ'.split('_'), + weekdaysMin : 'Κυ_Δε_Τρ_Τε_Πε_Πα_Σα'.split('_'), + meridiem : function (hours, minutes, isLower) { + if (hours > 11) { + return isLower ? 'μμ' : 'ΜΜ'; + } else { + return isLower ? 'πμ' : 'ΠΜ'; + } + }, + isPM : function (input) { + return ((input + '').toLowerCase()[0] === 'μ'); + }, + meridiemParse : /[ΠΜ]\.?Μ?\.?/i, + longDateFormat : { + LT : 'h:mm A', + LTS : 'h:mm:ss A', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY h:mm A', + LLLL : 'dddd, D MMMM YYYY h:mm A' + }, + calendarEl : { + sameDay : '[Σήμερα {}] LT', + nextDay : '[Αύριο {}] LT', + nextWeek : 'dddd [{}] LT', + lastDay : '[Χθες {}] LT', + lastWeek : function () { + switch (this.day()) { + case 6: + return '[το προηγούμενο] dddd [{}] LT'; + default: + return '[την προηγούμενη] dddd [{}] LT'; + } + }, + sameElse : 'L' + }, + calendar : function (key, mom) { + var output = this._calendarEl[key], + hours = mom && mom.hours(); + if (isFunction(output)) { + output = output.apply(mom); + } + return output.replace('{}', (hours % 12 === 1 ? 'στη' : 'στις')); + }, + relativeTime : { + future : 'σε %s', + past : '%s πριν', + s : 'λίγα δευτερόλεπτα', + m : 'ένα λεπτό', + mm : '%d λεπτά', + h : 'μία ώρα', + hh : '%d ώρες', + d : 'μία μέρα', + dd : '%d μέρες', + M : 'ένας μήνας', + MM : '%d μήνες', + y : 'ένας χρόνος', + yy : '%d χρόνια' + }, + ordinalParse: /\d{1,2}η/, + ordinal: '%dη', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4st is the first week of the year. + } + }); + + //! moment.js locale configuration + //! locale : australian english (en-au) + + var en_au = moment__default.defineLocale('en-au', { + months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), + weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), + weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), + weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), + longDateFormat : { + LT : 'h:mm A', + LTS : 'h:mm:ss A', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY h:mm A', + LLLL : 'dddd, D MMMM YYYY h:mm A' + }, + calendar : { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'in %s', + past : '%s ago', + s : 'a few seconds', + m : 'a minute', + mm : '%d minutes', + h : 'an hour', + hh : '%d hours', + d : 'a day', + dd : '%d days', + M : 'a month', + MM : '%d months', + y : 'a year', + yy : '%d years' + }, + ordinalParse: /\d{1,2}(st|nd|rd|th)/, + ordinal : function (number) { + var b = number % 10, + output = (~~(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + //! moment.js locale configuration + //! locale : canadian english (en-ca) + //! author : Jonathan Abourbih : https://github.com/jonbca + + var en_ca = moment__default.defineLocale('en-ca', { + months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), + weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), + weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), + weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), + longDateFormat : { + LT : 'h:mm A', + LTS : 'h:mm:ss A', + L : 'YYYY-MM-DD', + LL : 'MMMM D, YYYY', + LLL : 'MMMM D, YYYY h:mm A', + LLLL : 'dddd, MMMM D, YYYY h:mm A' + }, + calendar : { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'in %s', + past : '%s ago', + s : 'a few seconds', + m : 'a minute', + mm : '%d minutes', + h : 'an hour', + hh : '%d hours', + d : 'a day', + dd : '%d days', + M : 'a month', + MM : '%d months', + y : 'a year', + yy : '%d years' + }, + ordinalParse: /\d{1,2}(st|nd|rd|th)/, + ordinal : function (number) { + var b = number % 10, + output = (~~(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + } + }); + + //! moment.js locale configuration + //! locale : great britain english (en-gb) + //! author : Chris Gedrim : https://github.com/chrisgedrim + + var en_gb = moment__default.defineLocale('en-gb', { + months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), + weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), + weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), + weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd, D MMMM YYYY HH:mm' + }, + calendar : { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'in %s', + past : '%s ago', + s : 'a few seconds', + m : 'a minute', + mm : '%d minutes', + h : 'an hour', + hh : '%d hours', + d : 'a day', + dd : '%d days', + M : 'a month', + MM : '%d months', + y : 'a year', + yy : '%d years' + }, + ordinalParse: /\d{1,2}(st|nd|rd|th)/, + ordinal : function (number) { + var b = number % 10, + output = (~~(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + //! moment.js locale configuration + //! locale : Irish english (en-ie) + //! author : Chris Cartlidge : https://github.com/chriscartlidge + + var en_ie = moment__default.defineLocale('en-ie', { + months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), + weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), + weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), + weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD-MM-YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd D MMMM YYYY HH:mm' + }, + calendar : { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'in %s', + past : '%s ago', + s : 'a few seconds', + m : 'a minute', + mm : '%d minutes', + h : 'an hour', + hh : '%d hours', + d : 'a day', + dd : '%d days', + M : 'a month', + MM : '%d months', + y : 'a year', + yy : '%d years' + }, + ordinalParse: /\d{1,2}(st|nd|rd|th)/, + ordinal : function (number) { + var b = number % 10, + output = (~~(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + //! moment.js locale configuration + //! locale : New Zealand english (en-nz) + + var en_nz = moment__default.defineLocale('en-nz', { + months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), + weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), + weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), + weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), + longDateFormat : { + LT : 'h:mm A', + LTS : 'h:mm:ss A', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY h:mm A', + LLLL : 'dddd, D MMMM YYYY h:mm A' + }, + calendar : { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'in %s', + past : '%s ago', + s : 'a few seconds', + m : 'a minute', + mm : '%d minutes', + h : 'an hour', + hh : '%d hours', + d : 'a day', + dd : '%d days', + M : 'a month', + MM : '%d months', + y : 'a year', + yy : '%d years' + }, + ordinalParse: /\d{1,2}(st|nd|rd|th)/, + ordinal : function (number) { + var b = number % 10, + output = (~~(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + //! moment.js locale configuration + //! locale : esperanto (eo) + //! author : Colin Dean : https://github.com/colindean + //! komento: Mi estas malcerta se mi korekte traktis akuzativojn en tiu traduko. + //! Se ne, bonvolu korekti kaj avizi min por ke mi povas lerni! + + var eo = moment__default.defineLocale('eo', { + months : 'januaro_februaro_marto_aprilo_majo_junio_julio_aŭgusto_septembro_oktobro_novembro_decembro'.split('_'), + monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aŭg_sep_okt_nov_dec'.split('_'), + weekdays : 'Dimanĉo_Lundo_Mardo_Merkredo_Ĵaŭdo_Vendredo_Sabato'.split('_'), + weekdaysShort : 'Dim_Lun_Mard_Merk_Ĵaŭ_Ven_Sab'.split('_'), + weekdaysMin : 'Di_Lu_Ma_Me_Ĵa_Ve_Sa'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'YYYY-MM-DD', + LL : 'D[-an de] MMMM, YYYY', + LLL : 'D[-an de] MMMM, YYYY HH:mm', + LLLL : 'dddd, [la] D[-an de] MMMM, YYYY HH:mm' + }, + meridiemParse: /[ap]\.t\.m/i, + isPM: function (input) { + return input.charAt(0).toLowerCase() === 'p'; + }, + meridiem : function (hours, minutes, isLower) { + if (hours > 11) { + return isLower ? 'p.t.m.' : 'P.T.M.'; + } else { + return isLower ? 'a.t.m.' : 'A.T.M.'; + } + }, + calendar : { + sameDay : '[Hodiaŭ je] LT', + nextDay : '[Morgaŭ je] LT', + nextWeek : 'dddd [je] LT', + lastDay : '[Hieraŭ je] LT', + lastWeek : '[pasinta] dddd [je] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'je %s', + past : 'antaŭ %s', + s : 'sekundoj', + m : 'minuto', + mm : '%d minutoj', + h : 'horo', + hh : '%d horoj', + d : 'tago',//ne 'diurno', ĉar estas uzita por proksimumo + dd : '%d tagoj', + M : 'monato', + MM : '%d monatoj', + y : 'jaro', + yy : '%d jaroj' + }, + ordinalParse: /\d{1,2}a/, + ordinal : '%da', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + //! locale : spanish (es) + //! author : Julio Napurí : https://github.com/julionc + + var monthsShortDot = 'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split('_'), + es__monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'); + + var es = moment__default.defineLocale('es', { + months : 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split('_'), + monthsShort : function (m, format) { + if (/-MMM-/.test(format)) { + return es__monthsShort[m.month()]; + } else { + return monthsShortDot[m.month()]; + } + }, + weekdays : 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'), + weekdaysShort : 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'), + weekdaysMin : 'do_lu_ma_mi_ju_vi_sá'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'H:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D [de] MMMM [de] YYYY', + LLL : 'D [de] MMMM [de] YYYY H:mm', + LLLL : 'dddd, D [de] MMMM [de] YYYY H:mm' + }, + calendar : { + sameDay : function () { + return '[hoy a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + nextDay : function () { + return '[mañana a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + nextWeek : function () { + return 'dddd [a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + lastDay : function () { + return '[ayer a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + lastWeek : function () { + return '[el] dddd [pasado a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + sameElse : 'L' + }, + relativeTime : { + future : 'en %s', + past : 'hace %s', + s : 'unos segundos', + m : 'un minuto', + mm : '%d minutos', + h : 'una hora', + hh : '%d horas', + d : 'un día', + dd : '%d días', + M : 'un mes', + MM : '%d meses', + y : 'un año', + yy : '%d años' + }, + ordinalParse : /\d{1,2}º/, + ordinal : '%dº', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + //! moment.js locale configuration + //! locale : estonian (et) + //! author : Henry Kehlmann : https://github.com/madhenry + //! improvements : Illimar Tambek : https://github.com/ragulka + + function et__processRelativeTime(number, withoutSuffix, key, isFuture) { + var format = { + 's' : ['mõne sekundi', 'mõni sekund', 'paar sekundit'], + 'm' : ['ühe minuti', 'üks minut'], + 'mm': [number + ' minuti', number + ' minutit'], + 'h' : ['ühe tunni', 'tund aega', 'üks tund'], + 'hh': [number + ' tunni', number + ' tundi'], + 'd' : ['ühe päeva', 'üks päev'], + 'M' : ['kuu aja', 'kuu aega', 'üks kuu'], + 'MM': [number + ' kuu', number + ' kuud'], + 'y' : ['ühe aasta', 'aasta', 'üks aasta'], + 'yy': [number + ' aasta', number + ' aastat'] + }; + if (withoutSuffix) { + return format[key][2] ? format[key][2] : format[key][1]; + } + return isFuture ? format[key][0] : format[key][1]; + } + + var et = moment__default.defineLocale('et', { + months : 'jaanuar_veebruar_märts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember'.split('_'), + monthsShort : 'jaan_veebr_märts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets'.split('_'), + weekdays : 'pühapäev_esmaspäev_teisipäev_kolmapäev_neljapäev_reede_laupäev'.split('_'), + weekdaysShort : 'P_E_T_K_N_R_L'.split('_'), + weekdaysMin : 'P_E_T_K_N_R_L'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'H:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY H:mm', + LLLL : 'dddd, D. MMMM YYYY H:mm' + }, + calendar : { + sameDay : '[Täna,] LT', + nextDay : '[Homme,] LT', + nextWeek : '[Järgmine] dddd LT', + lastDay : '[Eile,] LT', + lastWeek : '[Eelmine] dddd LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s pärast', + past : '%s tagasi', + s : et__processRelativeTime, + m : et__processRelativeTime, + mm : et__processRelativeTime, + h : et__processRelativeTime, + hh : et__processRelativeTime, + d : et__processRelativeTime, + dd : '%d päeva', + M : et__processRelativeTime, + MM : et__processRelativeTime, + y : et__processRelativeTime, + yy : et__processRelativeTime + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + //! moment.js locale configuration + //! locale : euskara (eu) + //! author : Eneko Illarramendi : https://github.com/eillarra + + var eu = moment__default.defineLocale('eu', { + months : 'urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua'.split('_'), + monthsShort : 'urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.'.split('_'), + weekdays : 'igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata'.split('_'), + weekdaysShort : 'ig._al._ar._az._og._ol._lr.'.split('_'), + weekdaysMin : 'ig_al_ar_az_og_ol_lr'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'YYYY-MM-DD', + LL : 'YYYY[ko] MMMM[ren] D[a]', + LLL : 'YYYY[ko] MMMM[ren] D[a] HH:mm', + LLLL : 'dddd, YYYY[ko] MMMM[ren] D[a] HH:mm', + l : 'YYYY-M-D', + ll : 'YYYY[ko] MMM D[a]', + lll : 'YYYY[ko] MMM D[a] HH:mm', + llll : 'ddd, YYYY[ko] MMM D[a] HH:mm' + }, + calendar : { + sameDay : '[gaur] LT[etan]', + nextDay : '[bihar] LT[etan]', + nextWeek : 'dddd LT[etan]', + lastDay : '[atzo] LT[etan]', + lastWeek : '[aurreko] dddd LT[etan]', + sameElse : 'L' + }, + relativeTime : { + future : '%s barru', + past : 'duela %s', + s : 'segundo batzuk', + m : 'minutu bat', + mm : '%d minutu', + h : 'ordu bat', + hh : '%d ordu', + d : 'egun bat', + dd : '%d egun', + M : 'hilabete bat', + MM : '%d hilabete', + y : 'urte bat', + yy : '%d urte' + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + //! locale : Persian (fa) + //! author : Ebrahim Byagowi : https://github.com/ebraminio + + var fa__symbolMap = { + '1': '۱', + '2': '۲', + '3': '۳', + '4': '۴', + '5': '۵', + '6': '۶', + '7': '۷', + '8': '۸', + '9': '۹', + '0': '۰' + }, fa__numberMap = { + '۱': '1', + '۲': '2', + '۳': '3', + '۴': '4', + '۵': '5', + '۶': '6', + '۷': '7', + '۸': '8', + '۹': '9', + '۰': '0' + }; + + var fa = moment__default.defineLocale('fa', { + months : 'ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'), + monthsShort : 'ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'), + weekdays : 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split('_'), + weekdaysShort : 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split('_'), + weekdaysMin : 'ی_د_س_چ_پ_ج_ش'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd, D MMMM YYYY HH:mm' + }, + meridiemParse: /قبل از ظهر|بعد از ظهر/, + isPM: function (input) { + return /بعد از ظهر/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'قبل از ظهر'; + } else { + return 'بعد از ظهر'; + } + }, + calendar : { + sameDay : '[امروز ساعت] LT', + nextDay : '[فردا ساعت] LT', + nextWeek : 'dddd [ساعت] LT', + lastDay : '[دیروز ساعت] LT', + lastWeek : 'dddd [پیش] [ساعت] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'در %s', + past : '%s پیش', + s : 'چندین ثانیه', + m : 'یک دقیقه', + mm : '%d دقیقه', + h : 'یک ساعت', + hh : '%d ساعت', + d : 'یک روز', + dd : '%d روز', + M : 'یک ماه', + MM : '%d ماه', + y : 'یک سال', + yy : '%d سال' + }, + preparse: function (string) { + return string.replace(/[۰-۹]/g, function (match) { + return fa__numberMap[match]; + }).replace(/،/g, ','); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return fa__symbolMap[match]; + }).replace(/,/g, '،'); + }, + ordinalParse: /\d{1,2}م/, + ordinal : '%dم', + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + //! locale : finnish (fi) + //! author : Tarmo Aidantausta : https://github.com/bleadof + + var numbersPast = 'nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän'.split(' '), + numbersFuture = [ + 'nolla', 'yhden', 'kahden', 'kolmen', 'neljän', 'viiden', 'kuuden', + numbersPast[7], numbersPast[8], numbersPast[9] + ]; + function fi__translate(number, withoutSuffix, key, isFuture) { + var result = ''; + switch (key) { + case 's': + return isFuture ? 'muutaman sekunnin' : 'muutama sekunti'; + case 'm': + return isFuture ? 'minuutin' : 'minuutti'; + case 'mm': + result = isFuture ? 'minuutin' : 'minuuttia'; + break; + case 'h': + return isFuture ? 'tunnin' : 'tunti'; + case 'hh': + result = isFuture ? 'tunnin' : 'tuntia'; + break; + case 'd': + return isFuture ? 'päivän' : 'päivä'; + case 'dd': + result = isFuture ? 'päivän' : 'päivää'; + break; + case 'M': + return isFuture ? 'kuukauden' : 'kuukausi'; + case 'MM': + result = isFuture ? 'kuukauden' : 'kuukautta'; + break; + case 'y': + return isFuture ? 'vuoden' : 'vuosi'; + case 'yy': + result = isFuture ? 'vuoden' : 'vuotta'; + break; + } + result = verbalNumber(number, isFuture) + ' ' + result; + return result; + } + function verbalNumber(number, isFuture) { + return number < 10 ? (isFuture ? numbersFuture[number] : numbersPast[number]) : number; + } + + var fi = moment__default.defineLocale('fi', { + months : 'tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu'.split('_'), + monthsShort : 'tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu'.split('_'), + weekdays : 'sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai'.split('_'), + weekdaysShort : 'su_ma_ti_ke_to_pe_la'.split('_'), + weekdaysMin : 'su_ma_ti_ke_to_pe_la'.split('_'), + longDateFormat : { + LT : 'HH.mm', + LTS : 'HH.mm.ss', + L : 'DD.MM.YYYY', + LL : 'Do MMMM[ta] YYYY', + LLL : 'Do MMMM[ta] YYYY, [klo] HH.mm', + LLLL : 'dddd, Do MMMM[ta] YYYY, [klo] HH.mm', + l : 'D.M.YYYY', + ll : 'Do MMM YYYY', + lll : 'Do MMM YYYY, [klo] HH.mm', + llll : 'ddd, Do MMM YYYY, [klo] HH.mm' + }, + calendar : { + sameDay : '[tänään] [klo] LT', + nextDay : '[huomenna] [klo] LT', + nextWeek : 'dddd [klo] LT', + lastDay : '[eilen] [klo] LT', + lastWeek : '[viime] dddd[na] [klo] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s päästä', + past : '%s sitten', + s : fi__translate, + m : fi__translate, + mm : fi__translate, + h : fi__translate, + hh : fi__translate, + d : fi__translate, + dd : fi__translate, + M : fi__translate, + MM : fi__translate, + y : fi__translate, + yy : fi__translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + //! moment.js locale configuration + //! locale : faroese (fo) + //! author : Ragnar Johannesen : https://github.com/ragnar123 + + var fo = moment__default.defineLocale('fo', { + months : 'januar_februar_mars_apríl_mai_juni_juli_august_september_oktober_november_desember'.split('_'), + monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'), + weekdays : 'sunnudagur_mánadagur_týsdagur_mikudagur_hósdagur_fríggjadagur_leygardagur'.split('_'), + weekdaysShort : 'sun_mán_týs_mik_hós_frí_ley'.split('_'), + weekdaysMin : 'su_má_tý_mi_hó_fr_le'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd D. MMMM, YYYY HH:mm' + }, + calendar : { + sameDay : '[Í dag kl.] LT', + nextDay : '[Í morgin kl.] LT', + nextWeek : 'dddd [kl.] LT', + lastDay : '[Í gjár kl.] LT', + lastWeek : '[síðstu] dddd [kl] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'um %s', + past : '%s síðani', + s : 'fá sekund', + m : 'ein minutt', + mm : '%d minuttir', + h : 'ein tími', + hh : '%d tímar', + d : 'ein dagur', + dd : '%d dagar', + M : 'ein mánaði', + MM : '%d mánaðir', + y : 'eitt ár', + yy : '%d ár' + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + //! moment.js locale configuration + //! locale : canadian french (fr-ca) + //! author : Jonathan Abourbih : https://github.com/jonbca + + var fr_ca = moment__default.defineLocale('fr-ca', { + months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'), + monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'), + weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'), + weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'), + weekdaysMin : 'Di_Lu_Ma_Me_Je_Ve_Sa'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'YYYY-MM-DD', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd D MMMM YYYY HH:mm' + }, + calendar : { + sameDay: '[Aujourd\'hui à] LT', + nextDay: '[Demain à] LT', + nextWeek: 'dddd [à] LT', + lastDay: '[Hier à] LT', + lastWeek: 'dddd [dernier à] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'dans %s', + past : 'il y a %s', + s : 'quelques secondes', + m : 'une minute', + mm : '%d minutes', + h : 'une heure', + hh : '%d heures', + d : 'un jour', + dd : '%d jours', + M : 'un mois', + MM : '%d mois', + y : 'un an', + yy : '%d ans' + }, + ordinalParse: /\d{1,2}(er|e)/, + ordinal : function (number) { + return number + (number === 1 ? 'er' : 'e'); + } + }); + + //! moment.js locale configuration + //! locale : swiss french (fr) + //! author : Gaspard Bucher : https://github.com/gaspard + + var fr_ch = moment__default.defineLocale('fr-ch', { + months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'), + monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'), + weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'), + weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'), + weekdaysMin : 'Di_Lu_Ma_Me_Je_Ve_Sa'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd D MMMM YYYY HH:mm' + }, + calendar : { + sameDay: '[Aujourd\'hui à] LT', + nextDay: '[Demain à] LT', + nextWeek: 'dddd [à] LT', + lastDay: '[Hier à] LT', + lastWeek: 'dddd [dernier à] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'dans %s', + past : 'il y a %s', + s : 'quelques secondes', + m : 'une minute', + mm : '%d minutes', + h : 'une heure', + hh : '%d heures', + d : 'un jour', + dd : '%d jours', + M : 'un mois', + MM : '%d mois', + y : 'un an', + yy : '%d ans' + }, + ordinalParse: /\d{1,2}(er|e)/, + ordinal : function (number) { + return number + (number === 1 ? 'er' : 'e'); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + //! moment.js locale configuration + //! locale : french (fr) + //! author : John Fischer : https://github.com/jfroffice + + var fr = moment__default.defineLocale('fr', { + months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'), + monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'), + weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'), + weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'), + weekdaysMin : 'Di_Lu_Ma_Me_Je_Ve_Sa'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd D MMMM YYYY HH:mm' + }, + calendar : { + sameDay: '[Aujourd\'hui à] LT', + nextDay: '[Demain à] LT', + nextWeek: 'dddd [à] LT', + lastDay: '[Hier à] LT', + lastWeek: 'dddd [dernier à] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'dans %s', + past : 'il y a %s', + s : 'quelques secondes', + m : 'une minute', + mm : '%d minutes', + h : 'une heure', + hh : '%d heures', + d : 'un jour', + dd : '%d jours', + M : 'un mois', + MM : '%d mois', + y : 'un an', + yy : '%d ans' + }, + ordinalParse: /\d{1,2}(er|)/, + ordinal : function (number) { + return number + (number === 1 ? 'er' : ''); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + //! moment.js locale configuration + //! locale : frisian (fy) + //! author : Robin van der Vliet : https://github.com/robin0van0der0v + + var fy__monthsShortWithDots = 'jan._feb._mrt._apr._mai_jun._jul._aug._sep._okt._nov._des.'.split('_'), + fy__monthsShortWithoutDots = 'jan_feb_mrt_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'); + + var fy = moment__default.defineLocale('fy', { + months : 'jannewaris_febrewaris_maart_april_maaie_juny_july_augustus_septimber_oktober_novimber_desimber'.split('_'), + monthsShort : function (m, format) { + if (/-MMM-/.test(format)) { + return fy__monthsShortWithoutDots[m.month()]; + } else { + return fy__monthsShortWithDots[m.month()]; + } + }, + weekdays : 'snein_moandei_tiisdei_woansdei_tongersdei_freed_sneon'.split('_'), + weekdaysShort : 'si._mo._ti._wo._to._fr._so.'.split('_'), + weekdaysMin : 'Si_Mo_Ti_Wo_To_Fr_So'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD-MM-YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd D MMMM YYYY HH:mm' + }, + calendar : { + sameDay: '[hjoed om] LT', + nextDay: '[moarn om] LT', + nextWeek: 'dddd [om] LT', + lastDay: '[juster om] LT', + lastWeek: '[ôfrûne] dddd [om] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'oer %s', + past : '%s lyn', + s : 'in pear sekonden', + m : 'ien minút', + mm : '%d minuten', + h : 'ien oere', + hh : '%d oeren', + d : 'ien dei', + dd : '%d dagen', + M : 'ien moanne', + MM : '%d moannen', + y : 'ien jier', + yy : '%d jierren' + }, + ordinalParse: /\d{1,2}(ste|de)/, + ordinal : function (number) { + return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + //! moment.js locale configuration + //! locale : great britain scottish gealic (gd) + //! author : Jon Ashdown : https://github.com/jonashdown + + var gd__months = [ + 'Am Faoilleach', 'An Gearran', 'Am Màrt', 'An Giblean', 'An Cèitean', 'An t-Ògmhios', 'An t-Iuchar', 'An Lùnastal', 'An t-Sultain', 'An Dàmhair', 'An t-Samhain', 'An Dùbhlachd' + ]; + + var gd__monthsShort = ['Faoi', 'Gear', 'Màrt', 'Gibl', 'Cèit', 'Ògmh', 'Iuch', 'Lùn', 'Sult', 'Dàmh', 'Samh', 'Dùbh']; + + var gd__weekdays = ['Didòmhnaich', 'Diluain', 'Dimàirt', 'Diciadain', 'Diardaoin', 'Dihaoine', 'Disathairne']; + + var weekdaysShort = ['Did', 'Dil', 'Dim', 'Dic', 'Dia', 'Dih', 'Dis']; + + var weekdaysMin = ['Dò', 'Lu', 'Mà', 'Ci', 'Ar', 'Ha', 'Sa']; + + var gd = moment__default.defineLocale('gd', { + months : gd__months, + monthsShort : gd__monthsShort, + monthsParseExact : true, + weekdays : gd__weekdays, + weekdaysShort : weekdaysShort, + weekdaysMin : weekdaysMin, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd, D MMMM YYYY HH:mm' + }, + calendar : { + sameDay : '[An-diugh aig] LT', + nextDay : '[A-màireach aig] LT', + nextWeek : 'dddd [aig] LT', + lastDay : '[An-dè aig] LT', + lastWeek : 'dddd [seo chaidh] [aig] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'ann an %s', + past : 'bho chionn %s', + s : 'beagan diogan', + m : 'mionaid', + mm : '%d mionaidean', + h : 'uair', + hh : '%d uairean', + d : 'latha', + dd : '%d latha', + M : 'mìos', + MM : '%d mìosan', + y : 'bliadhna', + yy : '%d bliadhna' + }, + ordinalParse : /\d{1,2}(d|na|mh)/, + ordinal : function (number) { + var output = number === 1 ? 'd' : number % 10 === 2 ? 'na' : 'mh'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + //! moment.js locale configuration + //! locale : galician (gl) + //! author : Juan G. Hurtado : https://github.com/juanghurtado + + var gl = moment__default.defineLocale('gl', { + months : 'Xaneiro_Febreiro_Marzo_Abril_Maio_Xuño_Xullo_Agosto_Setembro_Outubro_Novembro_Decembro'.split('_'), + monthsShort : 'Xan._Feb._Mar._Abr._Mai._Xuñ._Xul._Ago._Set._Out._Nov._Dec.'.split('_'), + weekdays : 'Domingo_Luns_Martes_Mércores_Xoves_Venres_Sábado'.split('_'), + weekdaysShort : 'Dom._Lun._Mar._Mér._Xov._Ven._Sáb.'.split('_'), + weekdaysMin : 'Do_Lu_Ma_Mé_Xo_Ve_Sá'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'H:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY H:mm', + LLLL : 'dddd D MMMM YYYY H:mm' + }, + calendar : { + sameDay : function () { + return '[hoxe ' + ((this.hours() !== 1) ? 'ás' : 'á') + '] LT'; + }, + nextDay : function () { + return '[mañá ' + ((this.hours() !== 1) ? 'ás' : 'á') + '] LT'; + }, + nextWeek : function () { + return 'dddd [' + ((this.hours() !== 1) ? 'ás' : 'a') + '] LT'; + }, + lastDay : function () { + return '[onte ' + ((this.hours() !== 1) ? 'á' : 'a') + '] LT'; + }, + lastWeek : function () { + return '[o] dddd [pasado ' + ((this.hours() !== 1) ? 'ás' : 'a') + '] LT'; + }, + sameElse : 'L' + }, + relativeTime : { + future : function (str) { + if (str === 'uns segundos') { + return 'nuns segundos'; + } + return 'en ' + str; + }, + past : 'hai %s', + s : 'uns segundos', + m : 'un minuto', + mm : '%d minutos', + h : 'unha hora', + hh : '%d horas', + d : 'un día', + dd : '%d días', + M : 'un mes', + MM : '%d meses', + y : 'un ano', + yy : '%d anos' + }, + ordinalParse : /\d{1,2}º/, + ordinal : '%dº', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + //! locale : Hebrew (he) + //! author : Tomer Cohen : https://github.com/tomer + //! author : Moshe Simantov : https://github.com/DevelopmentIL + //! author : Tal Ater : https://github.com/TalAter + + var he = moment__default.defineLocale('he', { + months : 'ינואר_פברואר_מרץ_אפריל_מאי_יוני_יולי_אוגוסט_ספטמבר_אוקטובר_נובמבר_דצמבר'.split('_'), + monthsShort : 'ינו׳_פבר׳_מרץ_אפר׳_מאי_יוני_יולי_אוג׳_ספט׳_אוק׳_נוב׳_דצמ׳'.split('_'), + weekdays : 'ראשון_שני_שלישי_רביעי_חמישי_שישי_שבת'.split('_'), + weekdaysShort : 'א׳_ב׳_ג׳_ד׳_ה׳_ו׳_ש׳'.split('_'), + weekdaysMin : 'א_ב_ג_ד_ה_ו_ש'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D [ב]MMMM YYYY', + LLL : 'D [ב]MMMM YYYY HH:mm', + LLLL : 'dddd, D [ב]MMMM YYYY HH:mm', + l : 'D/M/YYYY', + ll : 'D MMM YYYY', + lll : 'D MMM YYYY HH:mm', + llll : 'ddd, D MMM YYYY HH:mm' + }, + calendar : { + sameDay : '[היום ב־]LT', + nextDay : '[מחר ב־]LT', + nextWeek : 'dddd [בשעה] LT', + lastDay : '[אתמול ב־]LT', + lastWeek : '[ביום] dddd [האחרון בשעה] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'בעוד %s', + past : 'לפני %s', + s : 'מספר שניות', + m : 'דקה', + mm : '%d דקות', + h : 'שעה', + hh : function (number) { + if (number === 2) { + return 'שעתיים'; + } + return number + ' שעות'; + }, + d : 'יום', + dd : function (number) { + if (number === 2) { + return 'יומיים'; + } + return number + ' ימים'; + }, + M : 'חודש', + MM : function (number) { + if (number === 2) { + return 'חודשיים'; + } + return number + ' חודשים'; + }, + y : 'שנה', + yy : function (number) { + if (number === 2) { + return 'שנתיים'; + } else if (number % 10 === 0 && number !== 10) { + return number + ' שנה'; + } + return number + ' שנים'; + } + }, + meridiemParse: /אחה"צ|לפנה"צ|אחרי הצהריים|לפני הצהריים|לפנות בוקר|בבוקר|בערב/i, + isPM : function (input) { + return /^(אחה"צ|אחרי הצהריים|בערב)$/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 5) { + return 'לפנות בוקר'; + } else if (hour < 10) { + return 'בבוקר'; + } else if (hour < 12) { + return isLower ? 'לפנה"צ' : 'לפני הצהריים'; + } else if (hour < 18) { + return isLower ? 'אחה"צ' : 'אחרי הצהריים'; + } else { + return 'בערב'; + } + } + }); + + //! moment.js locale configuration + //! locale : hindi (hi) + //! author : Mayank Singhal : https://github.com/mayanksinghal + + var hi__symbolMap = { + '1': '१', + '2': '२', + '3': '३', + '4': '४', + '5': '५', + '6': '६', + '7': '७', + '8': '८', + '9': '९', + '0': '०' + }, + hi__numberMap = { + '१': '1', + '२': '2', + '३': '3', + '४': '4', + '५': '5', + '६': '6', + '७': '7', + '८': '8', + '९': '9', + '०': '0' + }; + + var hi = moment__default.defineLocale('hi', { + months : 'जनवरी_फ़रवरी_मार्च_अप्रैल_मई_जून_जुलाई_अगस्त_सितम्बर_अक्टूबर_नवम्बर_दिसम्बर'.split('_'), + monthsShort : 'जन._फ़र._मार्च_अप्रै._मई_जून_जुल._अग._सित._अक्टू._नव._दिस.'.split('_'), + weekdays : 'रविवार_सोमवार_मंगलवार_बुधवार_गुरूवार_शुक्रवार_शनिवार'.split('_'), + weekdaysShort : 'रवि_सोम_मंगल_बुध_गुरू_शुक्र_शनि'.split('_'), + weekdaysMin : 'र_सो_मं_बु_गु_शु_श'.split('_'), + longDateFormat : { + LT : 'A h:mm बजे', + LTS : 'A h:mm:ss बजे', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, A h:mm बजे', + LLLL : 'dddd, D MMMM YYYY, A h:mm बजे' + }, + calendar : { + sameDay : '[आज] LT', + nextDay : '[कल] LT', + nextWeek : 'dddd, LT', + lastDay : '[कल] LT', + lastWeek : '[पिछले] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s में', + past : '%s पहले', + s : 'कुछ ही क्षण', + m : 'एक मिनट', + mm : '%d मिनट', + h : 'एक घंटा', + hh : '%d घंटे', + d : 'एक दिन', + dd : '%d दिन', + M : 'एक महीने', + MM : '%d महीने', + y : 'एक वर्ष', + yy : '%d वर्ष' + }, + preparse: function (string) { + return string.replace(/[१२३४५६७८९०]/g, function (match) { + return hi__numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return hi__symbolMap[match]; + }); + }, + // Hindi notation for meridiems are quite fuzzy in practice. While there exists + // a rigid notion of a 'Pahar' it is not used as rigidly in modern Hindi. + meridiemParse: /रात|सुबह|दोपहर|शाम/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'रात') { + return hour < 4 ? hour : hour + 12; + } else if (meridiem === 'सुबह') { + return hour; + } else if (meridiem === 'दोपहर') { + return hour >= 10 ? hour : hour + 12; + } else if (meridiem === 'शाम') { + return hour + 12; + } + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'रात'; + } else if (hour < 10) { + return 'सुबह'; + } else if (hour < 17) { + return 'दोपहर'; + } else if (hour < 20) { + return 'शाम'; + } else { + return 'रात'; + } + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + //! locale : hrvatski (hr) + //! author : Bojan Marković : https://github.com/bmarkovic + + function hr__translate(number, withoutSuffix, key) { + var result = number + ' '; + switch (key) { + case 'm': + return withoutSuffix ? 'jedna minuta' : 'jedne minute'; + case 'mm': + if (number === 1) { + result += 'minuta'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'minute'; + } else { + result += 'minuta'; + } + return result; + case 'h': + return withoutSuffix ? 'jedan sat' : 'jednog sata'; + case 'hh': + if (number === 1) { + result += 'sat'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'sata'; + } else { + result += 'sati'; + } + return result; + case 'dd': + if (number === 1) { + result += 'dan'; + } else { + result += 'dana'; + } + return result; + case 'MM': + if (number === 1) { + result += 'mjesec'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'mjeseca'; + } else { + result += 'mjeseci'; + } + return result; + case 'yy': + if (number === 1) { + result += 'godina'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'godine'; + } else { + result += 'godina'; + } + return result; + } + } + + var hr = moment__default.defineLocale('hr', { + months : { + format: 'siječnja_veljače_ožujka_travnja_svibnja_lipnja_srpnja_kolovoza_rujna_listopada_studenoga_prosinca'.split('_'), + standalone: 'siječanj_veljača_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac'.split('_') + }, + monthsShort : 'sij._velj._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.'.split('_'), + weekdays : 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split('_'), + weekdaysShort : 'ned._pon._uto._sri._čet._pet._sub.'.split('_'), + weekdaysMin : 'ne_po_ut_sr_če_pe_su'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'H:mm:ss', + L : 'DD. MM. YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY H:mm', + LLLL : 'dddd, D. MMMM YYYY H:mm' + }, + calendar : { + sameDay : '[danas u] LT', + nextDay : '[sutra u] LT', + nextWeek : function () { + switch (this.day()) { + case 0: + return '[u] [nedjelju] [u] LT'; + case 3: + return '[u] [srijedu] [u] LT'; + case 6: + return '[u] [subotu] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[u] dddd [u] LT'; + } + }, + lastDay : '[jučer u] LT', + lastWeek : function () { + switch (this.day()) { + case 0: + case 3: + return '[prošlu] dddd [u] LT'; + case 6: + return '[prošle] [subote] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[prošli] dddd [u] LT'; + } + }, + sameElse : 'L' + }, + relativeTime : { + future : 'za %s', + past : 'prije %s', + s : 'par sekundi', + m : hr__translate, + mm : hr__translate, + h : hr__translate, + hh : hr__translate, + d : 'dan', + dd : hr__translate, + M : 'mjesec', + MM : hr__translate, + y : 'godinu', + yy : hr__translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + //! locale : hungarian (hu) + //! author : Adam Brunner : https://github.com/adambrunner + + var weekEndings = 'vasárnap hétfőn kedden szerdán csütörtökön pénteken szombaton'.split(' '); + function hu__translate(number, withoutSuffix, key, isFuture) { + var num = number, + suffix; + switch (key) { + case 's': + return (isFuture || withoutSuffix) ? 'néhány másodperc' : 'néhány másodperce'; + case 'm': + return 'egy' + (isFuture || withoutSuffix ? ' perc' : ' perce'); + case 'mm': + return num + (isFuture || withoutSuffix ? ' perc' : ' perce'); + case 'h': + return 'egy' + (isFuture || withoutSuffix ? ' óra' : ' órája'); + case 'hh': + return num + (isFuture || withoutSuffix ? ' óra' : ' órája'); + case 'd': + return 'egy' + (isFuture || withoutSuffix ? ' nap' : ' napja'); + case 'dd': + return num + (isFuture || withoutSuffix ? ' nap' : ' napja'); + case 'M': + return 'egy' + (isFuture || withoutSuffix ? ' hónap' : ' hónapja'); + case 'MM': + return num + (isFuture || withoutSuffix ? ' hónap' : ' hónapja'); + case 'y': + return 'egy' + (isFuture || withoutSuffix ? ' év' : ' éve'); + case 'yy': + return num + (isFuture || withoutSuffix ? ' év' : ' éve'); + } + return ''; + } + function week(isFuture) { + return (isFuture ? '' : '[múlt] ') + '[' + weekEndings[this.day()] + '] LT[-kor]'; + } + + var hu = moment__default.defineLocale('hu', { + months : 'január_február_március_április_május_június_július_augusztus_szeptember_október_november_december'.split('_'), + monthsShort : 'jan_feb_márc_ápr_máj_jún_júl_aug_szept_okt_nov_dec'.split('_'), + weekdays : 'vasárnap_hétfő_kedd_szerda_csütörtök_péntek_szombat'.split('_'), + weekdaysShort : 'vas_hét_kedd_sze_csüt_pén_szo'.split('_'), + weekdaysMin : 'v_h_k_sze_cs_p_szo'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'H:mm:ss', + L : 'YYYY.MM.DD.', + LL : 'YYYY. MMMM D.', + LLL : 'YYYY. MMMM D. H:mm', + LLLL : 'YYYY. MMMM D., dddd H:mm' + }, + meridiemParse: /de|du/i, + isPM: function (input) { + return input.charAt(1).toLowerCase() === 'u'; + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 12) { + return isLower === true ? 'de' : 'DE'; + } else { + return isLower === true ? 'du' : 'DU'; + } + }, + calendar : { + sameDay : '[ma] LT[-kor]', + nextDay : '[holnap] LT[-kor]', + nextWeek : function () { + return week.call(this, true); + }, + lastDay : '[tegnap] LT[-kor]', + lastWeek : function () { + return week.call(this, false); + }, + sameElse : 'L' + }, + relativeTime : { + future : '%s múlva', + past : '%s', + s : hu__translate, + m : hu__translate, + mm : hu__translate, + h : hu__translate, + hh : hu__translate, + d : hu__translate, + dd : hu__translate, + M : hu__translate, + MM : hu__translate, + y : hu__translate, + yy : hu__translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + //! locale : Armenian (hy-am) + //! author : Armendarabyan : https://github.com/armendarabyan + + var hy_am = moment__default.defineLocale('hy-am', { + months : { + format: 'հունվարի_փետրվարի_մարտի_ապրիլի_մայիսի_հունիսի_հուլիսի_օգոստոսի_սեպտեմբերի_հոկտեմբերի_նոյեմբերի_դեկտեմբերի'.split('_'), + standalone: 'հունվար_փետրվար_մարտ_ապրիլ_մայիս_հունիս_հուլիս_օգոստոս_սեպտեմբեր_հոկտեմբեր_նոյեմբեր_դեկտեմբեր'.split('_') + }, + monthsShort : 'հնվ_փտր_մրտ_ապր_մյս_հնս_հլս_օգս_սպտ_հկտ_նմբ_դկտ'.split('_'), + weekdays : 'կիրակի_երկուշաբթի_երեքշաբթի_չորեքշաբթի_հինգշաբթի_ուրբաթ_շաբաթ'.split('_'), + weekdaysShort : 'կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ'.split('_'), + weekdaysMin : 'կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY թ.', + LLL : 'D MMMM YYYY թ., HH:mm', + LLLL : 'dddd, D MMMM YYYY թ., HH:mm' + }, + calendar : { + sameDay: '[այսօր] LT', + nextDay: '[վաղը] LT', + lastDay: '[երեկ] LT', + nextWeek: function () { + return 'dddd [օրը ժամը] LT'; + }, + lastWeek: function () { + return '[անցած] dddd [օրը ժամը] LT'; + }, + sameElse: 'L' + }, + relativeTime : { + future : '%s հետո', + past : '%s առաջ', + s : 'մի քանի վայրկյան', + m : 'րոպե', + mm : '%d րոպե', + h : 'ժամ', + hh : '%d ժամ', + d : 'օր', + dd : '%d օր', + M : 'ամիս', + MM : '%d ամիս', + y : 'տարի', + yy : '%d տարի' + }, + meridiemParse: /գիշերվա|առավոտվա|ցերեկվա|երեկոյան/, + isPM: function (input) { + return /^(ցերեկվա|երեկոյան)$/.test(input); + }, + meridiem : function (hour) { + if (hour < 4) { + return 'գիշերվա'; + } else if (hour < 12) { + return 'առավոտվա'; + } else if (hour < 17) { + return 'ցերեկվա'; + } else { + return 'երեկոյան'; + } + }, + ordinalParse: /\d{1,2}|\d{1,2}-(ին|րդ)/, + ordinal: function (number, period) { + switch (period) { + case 'DDD': + case 'w': + case 'W': + case 'DDDo': + if (number === 1) { + return number + '-ին'; + } + return number + '-րդ'; + default: + return number; + } + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + //! locale : Bahasa Indonesia (id) + //! author : Mohammad Satrio Utomo : https://github.com/tyok + //! reference: http://id.wikisource.org/wiki/Pedoman_Umum_Ejaan_Bahasa_Indonesia_yang_Disempurnakan + + var id = moment__default.defineLocale('id', { + months : 'Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nov_Des'.split('_'), + weekdays : 'Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu'.split('_'), + weekdaysShort : 'Min_Sen_Sel_Rab_Kam_Jum_Sab'.split('_'), + weekdaysMin : 'Mg_Sn_Sl_Rb_Km_Jm_Sb'.split('_'), + longDateFormat : { + LT : 'HH.mm', + LTS : 'HH.mm.ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY [pukul] HH.mm', + LLLL : 'dddd, D MMMM YYYY [pukul] HH.mm' + }, + meridiemParse: /pagi|siang|sore|malam/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'pagi') { + return hour; + } else if (meridiem === 'siang') { + return hour >= 11 ? hour : hour + 12; + } else if (meridiem === 'sore' || meridiem === 'malam') { + return hour + 12; + } + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 11) { + return 'pagi'; + } else if (hours < 15) { + return 'siang'; + } else if (hours < 19) { + return 'sore'; + } else { + return 'malam'; + } + }, + calendar : { + sameDay : '[Hari ini pukul] LT', + nextDay : '[Besok pukul] LT', + nextWeek : 'dddd [pukul] LT', + lastDay : '[Kemarin pukul] LT', + lastWeek : 'dddd [lalu pukul] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'dalam %s', + past : '%s yang lalu', + s : 'beberapa detik', + m : 'semenit', + mm : '%d menit', + h : 'sejam', + hh : '%d jam', + d : 'sehari', + dd : '%d hari', + M : 'sebulan', + MM : '%d bulan', + y : 'setahun', + yy : '%d tahun' + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + //! locale : icelandic (is) + //! author : Hinrik Örn Sigurðsson : https://github.com/hinrik + + function is__plural(n) { + if (n % 100 === 11) { + return true; + } else if (n % 10 === 1) { + return false; + } + return true; + } + function is__translate(number, withoutSuffix, key, isFuture) { + var result = number + ' '; + switch (key) { + case 's': + return withoutSuffix || isFuture ? 'nokkrar sekúndur' : 'nokkrum sekúndum'; + case 'm': + return withoutSuffix ? 'mínúta' : 'mínútu'; + case 'mm': + if (is__plural(number)) { + return result + (withoutSuffix || isFuture ? 'mínútur' : 'mínútum'); + } else if (withoutSuffix) { + return result + 'mínúta'; + } + return result + 'mínútu'; + case 'hh': + if (is__plural(number)) { + return result + (withoutSuffix || isFuture ? 'klukkustundir' : 'klukkustundum'); + } + return result + 'klukkustund'; + case 'd': + if (withoutSuffix) { + return 'dagur'; + } + return isFuture ? 'dag' : 'degi'; + case 'dd': + if (is__plural(number)) { + if (withoutSuffix) { + return result + 'dagar'; + } + return result + (isFuture ? 'daga' : 'dögum'); + } else if (withoutSuffix) { + return result + 'dagur'; + } + return result + (isFuture ? 'dag' : 'degi'); + case 'M': + if (withoutSuffix) { + return 'mánuður'; + } + return isFuture ? 'mánuð' : 'mánuði'; + case 'MM': + if (is__plural(number)) { + if (withoutSuffix) { + return result + 'mánuðir'; + } + return result + (isFuture ? 'mánuði' : 'mánuðum'); + } else if (withoutSuffix) { + return result + 'mánuður'; + } + return result + (isFuture ? 'mánuð' : 'mánuði'); + case 'y': + return withoutSuffix || isFuture ? 'ár' : 'ári'; + case 'yy': + if (is__plural(number)) { + return result + (withoutSuffix || isFuture ? 'ár' : 'árum'); + } + return result + (withoutSuffix || isFuture ? 'ár' : 'ári'); + } + } + + var is = moment__default.defineLocale('is', { + months : 'janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember'.split('_'), + monthsShort : 'jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des'.split('_'), + weekdays : 'sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur'.split('_'), + weekdaysShort : 'sun_mán_þri_mið_fim_fös_lau'.split('_'), + weekdaysMin : 'Su_Má_Þr_Mi_Fi_Fö_La'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'H:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY [kl.] H:mm', + LLLL : 'dddd, D. MMMM YYYY [kl.] H:mm' + }, + calendar : { + sameDay : '[í dag kl.] LT', + nextDay : '[á morgun kl.] LT', + nextWeek : 'dddd [kl.] LT', + lastDay : '[í gær kl.] LT', + lastWeek : '[síðasta] dddd [kl.] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'eftir %s', + past : 'fyrir %s síðan', + s : is__translate, + m : is__translate, + mm : is__translate, + h : 'klukkustund', + hh : is__translate, + d : is__translate, + dd : is__translate, + M : is__translate, + MM : is__translate, + y : is__translate, + yy : is__translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + //! moment.js locale configuration + //! locale : italian (it) + //! author : Lorenzo : https://github.com/aliem + //! author: Mattia Larentis: https://github.com/nostalgiaz + + var it = moment__default.defineLocale('it', { + months : 'gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre'.split('_'), + monthsShort : 'gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic'.split('_'), + weekdays : 'Domenica_Lunedì_Martedì_Mercoledì_Giovedì_Venerdì_Sabato'.split('_'), + weekdaysShort : 'Dom_Lun_Mar_Mer_Gio_Ven_Sab'.split('_'), + weekdaysMin : 'Do_Lu_Ma_Me_Gi_Ve_Sa'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd, D MMMM YYYY HH:mm' + }, + calendar : { + sameDay: '[Oggi alle] LT', + nextDay: '[Domani alle] LT', + nextWeek: 'dddd [alle] LT', + lastDay: '[Ieri alle] LT', + lastWeek: function () { + switch (this.day()) { + case 0: + return '[la scorsa] dddd [alle] LT'; + default: + return '[lo scorso] dddd [alle] LT'; + } + }, + sameElse: 'L' + }, + relativeTime : { + future : function (s) { + return ((/^[0-9].+$/).test(s) ? 'tra' : 'in') + ' ' + s; + }, + past : '%s fa', + s : 'alcuni secondi', + m : 'un minuto', + mm : '%d minuti', + h : 'un\'ora', + hh : '%d ore', + d : 'un giorno', + dd : '%d giorni', + M : 'un mese', + MM : '%d mesi', + y : 'un anno', + yy : '%d anni' + }, + ordinalParse : /\d{1,2}º/, + ordinal: '%dº', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + //! moment.js locale configuration + //! locale : japanese (ja) + //! author : LI Long : https://github.com/baryon + + var ja = moment__default.defineLocale('ja', { + months : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), + monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), + weekdays : '日曜日_月曜日_火曜日_水曜日_木曜日_金曜日_土曜日'.split('_'), + weekdaysShort : '日_月_火_水_木_金_土'.split('_'), + weekdaysMin : '日_月_火_水_木_金_土'.split('_'), + longDateFormat : { + LT : 'Ah時m分', + LTS : 'Ah時m分s秒', + L : 'YYYY/MM/DD', + LL : 'YYYY年M月D日', + LLL : 'YYYY年M月D日Ah時m分', + LLLL : 'YYYY年M月D日Ah時m分 dddd' + }, + meridiemParse: /午前|午後/i, + isPM : function (input) { + return input === '午後'; + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return '午前'; + } else { + return '午後'; + } + }, + calendar : { + sameDay : '[今日] LT', + nextDay : '[明日] LT', + nextWeek : '[来週]dddd LT', + lastDay : '[昨日] LT', + lastWeek : '[前週]dddd LT', + sameElse : 'L' + }, + ordinalParse : /\d{1,2}日/, + ordinal : function (number, period) { + switch (period) { + case 'd': + case 'D': + case 'DDD': + return number + '日'; + default: + return number; + } + }, + relativeTime : { + future : '%s後', + past : '%s前', + s : '数秒', + m : '1分', + mm : '%d分', + h : '1時間', + hh : '%d時間', + d : '1日', + dd : '%d日', + M : '1ヶ月', + MM : '%dヶ月', + y : '1年', + yy : '%d年' + } + }); + + //! moment.js locale configuration + //! locale : Boso Jowo (jv) + //! author : Rony Lantip : https://github.com/lantip + //! reference: http://jv.wikipedia.org/wiki/Basa_Jawa + + var jv = moment__default.defineLocale('jv', { + months : 'Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_Nopember_Desember'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nop_Des'.split('_'), + weekdays : 'Minggu_Senen_Seloso_Rebu_Kemis_Jemuwah_Septu'.split('_'), + weekdaysShort : 'Min_Sen_Sel_Reb_Kem_Jem_Sep'.split('_'), + weekdaysMin : 'Mg_Sn_Sl_Rb_Km_Jm_Sp'.split('_'), + longDateFormat : { + LT : 'HH.mm', + LTS : 'HH.mm.ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY [pukul] HH.mm', + LLLL : 'dddd, D MMMM YYYY [pukul] HH.mm' + }, + meridiemParse: /enjing|siyang|sonten|ndalu/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'enjing') { + return hour; + } else if (meridiem === 'siyang') { + return hour >= 11 ? hour : hour + 12; + } else if (meridiem === 'sonten' || meridiem === 'ndalu') { + return hour + 12; + } + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 11) { + return 'enjing'; + } else if (hours < 15) { + return 'siyang'; + } else if (hours < 19) { + return 'sonten'; + } else { + return 'ndalu'; + } + }, + calendar : { + sameDay : '[Dinten puniko pukul] LT', + nextDay : '[Mbenjang pukul] LT', + nextWeek : 'dddd [pukul] LT', + lastDay : '[Kala wingi pukul] LT', + lastWeek : 'dddd [kepengker pukul] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'wonten ing %s', + past : '%s ingkang kepengker', + s : 'sawetawis detik', + m : 'setunggal menit', + mm : '%d menit', + h : 'setunggal jam', + hh : '%d jam', + d : 'sedinten', + dd : '%d dinten', + M : 'sewulan', + MM : '%d wulan', + y : 'setaun', + yy : '%d taun' + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + //! locale : Georgian (ka) + //! author : Irakli Janiashvili : https://github.com/irakli-janiashvili + + var ka = moment__default.defineLocale('ka', { + months : { + standalone: 'იანვარი_თებერვალი_მარტი_აპრილი_მაისი_ივნისი_ივლისი_აგვისტო_სექტემბერი_ოქტომბერი_ნოემბერი_დეკემბერი'.split('_'), + format: 'იანვარს_თებერვალს_მარტს_აპრილის_მაისს_ივნისს_ივლისს_აგვისტს_სექტემბერს_ოქტომბერს_ნოემბერს_დეკემბერს'.split('_') + }, + monthsShort : 'იან_თებ_მარ_აპრ_მაი_ივნ_ივლ_აგვ_სექ_ოქტ_ნოე_დეკ'.split('_'), + weekdays : { + standalone: 'კვირა_ორშაბათი_სამშაბათი_ოთხშაბათი_ხუთშაბათი_პარასკევი_შაბათი'.split('_'), + format: 'კვირას_ორშაბათს_სამშაბათს_ოთხშაბათს_ხუთშაბათს_პარასკევს_შაბათს'.split('_'), + isFormat: /(წინა|შემდეგ)/ + }, + weekdaysShort : 'კვი_ორშ_სამ_ოთხ_ხუთ_პარ_შაბ'.split('_'), + weekdaysMin : 'კვ_ორ_სა_ოთ_ხუ_პა_შა'.split('_'), + longDateFormat : { + LT : 'h:mm A', + LTS : 'h:mm:ss A', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY h:mm A', + LLLL : 'dddd, D MMMM YYYY h:mm A' + }, + calendar : { + sameDay : '[დღეს] LT[-ზე]', + nextDay : '[ხვალ] LT[-ზე]', + lastDay : '[გუშინ] LT[-ზე]', + nextWeek : '[შემდეგ] dddd LT[-ზე]', + lastWeek : '[წინა] dddd LT-ზე', + sameElse : 'L' + }, + relativeTime : { + future : function (s) { + return (/(წამი|წუთი|საათი|წელი)/).test(s) ? + s.replace(/ი$/, 'ში') : + s + 'ში'; + }, + past : function (s) { + if ((/(წამი|წუთი|საათი|დღე|თვე)/).test(s)) { + return s.replace(/(ი|ე)$/, 'ის წინ'); + } + if ((/წელი/).test(s)) { + return s.replace(/წელი$/, 'წლის წინ'); + } + }, + s : 'რამდენიმე წამი', + m : 'წუთი', + mm : '%d წუთი', + h : 'საათი', + hh : '%d საათი', + d : 'დღე', + dd : '%d დღე', + M : 'თვე', + MM : '%d თვე', + y : 'წელი', + yy : '%d წელი' + }, + ordinalParse: /0|1-ლი|მე-\d{1,2}|\d{1,2}-ე/, + ordinal : function (number) { + if (number === 0) { + return number; + } + if (number === 1) { + return number + '-ლი'; + } + if ((number < 20) || (number <= 100 && (number % 20 === 0)) || (number % 100 === 0)) { + return 'მე-' + number; + } + return number + '-ე'; + }, + week : { + dow : 1, + doy : 7 + } + }); + + //! moment.js locale configuration + //! locale : kazakh (kk) + //! authors : Nurlan Rakhimzhanov : https://github.com/nurlan + + var kk__suffixes = { + 0: '-ші', + 1: '-ші', + 2: '-ші', + 3: '-ші', + 4: '-ші', + 5: '-ші', + 6: '-шы', + 7: '-ші', + 8: '-ші', + 9: '-шы', + 10: '-шы', + 20: '-шы', + 30: '-шы', + 40: '-шы', + 50: '-ші', + 60: '-шы', + 70: '-ші', + 80: '-ші', + 90: '-шы', + 100: '-ші' + }; + + var kk = moment__default.defineLocale('kk', { + months : 'Қаңтар_Ақпан_Наурыз_Сәуір_Мамыр_Маусым_Шілде_Тамыз_Қыркүйек_Қазан_Қараша_Желтоқсан'.split('_'), + monthsShort : 'Қаң_Ақп_Нау_Сәу_Мам_Мау_Шіл_Там_Қыр_Қаз_Қар_Жел'.split('_'), + weekdays : 'Жексенбі_Дүйсенбі_Сейсенбі_Сәрсенбі_Бейсенбі_Жұма_Сенбі'.split('_'), + weekdaysShort : 'Жек_Дүй_Сей_Сәр_Бей_Жұм_Сен'.split('_'), + weekdaysMin : 'Жк_Дй_Сй_Ср_Бй_Жм_Сн'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd, D MMMM YYYY HH:mm' + }, + calendar : { + sameDay : '[Бүгін сағат] LT', + nextDay : '[Ертең сағат] LT', + nextWeek : 'dddd [сағат] LT', + lastDay : '[Кеше сағат] LT', + lastWeek : '[Өткен аптаның] dddd [сағат] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s ішінде', + past : '%s бұрын', + s : 'бірнеше секунд', + m : 'бір минут', + mm : '%d минут', + h : 'бір сағат', + hh : '%d сағат', + d : 'бір күн', + dd : '%d күн', + M : 'бір ай', + MM : '%d ай', + y : 'бір жыл', + yy : '%d жыл' + }, + ordinalParse: /\d{1,2}-(ші|шы)/, + ordinal : function (number) { + var a = number % 10, + b = number >= 100 ? 100 : null; + return number + (kk__suffixes[number] || kk__suffixes[a] || kk__suffixes[b]); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + //! locale : khmer (km) + //! author : Kruy Vanna : https://github.com/kruyvanna + + var km = moment__default.defineLocale('km', { + months: 'មករា_កុម្ភៈ_មិនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ'.split('_'), + monthsShort: 'មករា_កុម្ភៈ_មិនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ'.split('_'), + weekdays: 'អាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍'.split('_'), + weekdaysShort: 'អាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍'.split('_'), + weekdaysMin: 'អាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍'.split('_'), + longDateFormat: { + LT: 'HH:mm', + LTS : 'HH:mm:ss', + L: 'DD/MM/YYYY', + LL: 'D MMMM YYYY', + LLL: 'D MMMM YYYY HH:mm', + LLLL: 'dddd, D MMMM YYYY HH:mm' + }, + calendar: { + sameDay: '[ថ្ងៃនេះ ម៉ោង] LT', + nextDay: '[ស្អែក ម៉ោង] LT', + nextWeek: 'dddd [ម៉ោង] LT', + lastDay: '[ម្សិលមិញ ម៉ោង] LT', + lastWeek: 'dddd [សប្តាហ៍មុន] [ម៉ោង] LT', + sameElse: 'L' + }, + relativeTime: { + future: '%sទៀត', + past: '%sមុន', + s: 'ប៉ុន្មានវិនាទី', + m: 'មួយនាទី', + mm: '%d នាទី', + h: 'មួយម៉ោង', + hh: '%d ម៉ោង', + d: 'មួយថ្ងៃ', + dd: '%d ថ្ងៃ', + M: 'មួយខែ', + MM: '%d ខែ', + y: 'មួយឆ្នាំ', + yy: '%d ឆ្នាំ' + }, + week: { + dow: 1, // Monday is the first day of the week. + doy: 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + //! moment.js locale configuration + //! locale : korean (ko) + //! + //! authors + //! + //! - Kyungwook, Park : https://github.com/kyungw00k + //! - Jeeeyul Lee + + var ko = moment__default.defineLocale('ko', { + months : '1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월'.split('_'), + monthsShort : '1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월'.split('_'), + weekdays : '일요일_월요일_화요일_수요일_목요일_금요일_토요일'.split('_'), + weekdaysShort : '일_월_화_수_목_금_토'.split('_'), + weekdaysMin : '일_월_화_수_목_금_토'.split('_'), + longDateFormat : { + LT : 'A h시 m분', + LTS : 'A h시 m분 s초', + L : 'YYYY.MM.DD', + LL : 'YYYY년 MMMM D일', + LLL : 'YYYY년 MMMM D일 A h시 m분', + LLLL : 'YYYY년 MMMM D일 dddd A h시 m분' + }, + calendar : { + sameDay : '오늘 LT', + nextDay : '내일 LT', + nextWeek : 'dddd LT', + lastDay : '어제 LT', + lastWeek : '지난주 dddd LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s 후', + past : '%s 전', + s : '몇초', + ss : '%d초', + m : '일분', + mm : '%d분', + h : '한시간', + hh : '%d시간', + d : '하루', + dd : '%d일', + M : '한달', + MM : '%d달', + y : '일년', + yy : '%d년' + }, + ordinalParse : /\d{1,2}일/, + ordinal : '%d일', + meridiemParse : /오전|오후/, + isPM : function (token) { + return token === '오후'; + }, + meridiem : function (hour, minute, isUpper) { + return hour < 12 ? '오전' : '오후'; + } + }); + + //! moment.js locale configuration + //! locale : Luxembourgish (lb) + //! author : mweimerskirch : https://github.com/mweimerskirch, David Raison : https://github.com/kwisatz + + function lb__processRelativeTime(number, withoutSuffix, key, isFuture) { + var format = { + 'm': ['eng Minutt', 'enger Minutt'], + 'h': ['eng Stonn', 'enger Stonn'], + 'd': ['een Dag', 'engem Dag'], + 'M': ['ee Mount', 'engem Mount'], + 'y': ['ee Joer', 'engem Joer'] + }; + return withoutSuffix ? format[key][0] : format[key][1]; + } + function processFutureTime(string) { + var number = string.substr(0, string.indexOf(' ')); + if (eifelerRegelAppliesToNumber(number)) { + return 'a ' + string; + } + return 'an ' + string; + } + function processPastTime(string) { + var number = string.substr(0, string.indexOf(' ')); + if (eifelerRegelAppliesToNumber(number)) { + return 'viru ' + string; + } + return 'virun ' + string; + } + /** + * Returns true if the word before the given number loses the '-n' ending. + * e.g. 'an 10 Deeg' but 'a 5 Deeg' + * + * @param number {integer} + * @returns {boolean} + */ + function eifelerRegelAppliesToNumber(number) { + number = parseInt(number, 10); + if (isNaN(number)) { + return false; + } + if (number < 0) { + // Negative Number --> always true + return true; + } else if (number < 10) { + // Only 1 digit + if (4 <= number && number <= 7) { + return true; + } + return false; + } else if (number < 100) { + // 2 digits + var lastDigit = number % 10, firstDigit = number / 10; + if (lastDigit === 0) { + return eifelerRegelAppliesToNumber(firstDigit); + } + return eifelerRegelAppliesToNumber(lastDigit); + } else if (number < 10000) { + // 3 or 4 digits --> recursively check first digit + while (number >= 10) { + number = number / 10; + } + return eifelerRegelAppliesToNumber(number); + } else { + // Anything larger than 4 digits: recursively check first n-3 digits + number = number / 1000; + return eifelerRegelAppliesToNumber(number); + } + } + + var lb = moment__default.defineLocale('lb', { + months: 'Januar_Februar_Mäerz_Abrëll_Mee_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'), + monthsShort: 'Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'), + weekdays: 'Sonndeg_Méindeg_Dënschdeg_Mëttwoch_Donneschdeg_Freideg_Samschdeg'.split('_'), + weekdaysShort: 'So._Mé._Dë._Më._Do._Fr._Sa.'.split('_'), + weekdaysMin: 'So_Mé_Dë_Më_Do_Fr_Sa'.split('_'), + longDateFormat: { + LT: 'H:mm [Auer]', + LTS: 'H:mm:ss [Auer]', + L: 'DD.MM.YYYY', + LL: 'D. MMMM YYYY', + LLL: 'D. MMMM YYYY H:mm [Auer]', + LLLL: 'dddd, D. MMMM YYYY H:mm [Auer]' + }, + calendar: { + sameDay: '[Haut um] LT', + sameElse: 'L', + nextDay: '[Muer um] LT', + nextWeek: 'dddd [um] LT', + lastDay: '[Gëschter um] LT', + lastWeek: function () { + // Different date string for 'Dënschdeg' (Tuesday) and 'Donneschdeg' (Thursday) due to phonological rule + switch (this.day()) { + case 2: + case 4: + return '[Leschten] dddd [um] LT'; + default: + return '[Leschte] dddd [um] LT'; + } + } + }, + relativeTime : { + future : processFutureTime, + past : processPastTime, + s : 'e puer Sekonnen', + m : lb__processRelativeTime, + mm : '%d Minutten', + h : lb__processRelativeTime, + hh : '%d Stonnen', + d : lb__processRelativeTime, + dd : '%d Deeg', + M : lb__processRelativeTime, + MM : '%d Méint', + y : lb__processRelativeTime, + yy : '%d Joer' + }, + ordinalParse: /\d{1,2}\./, + ordinal: '%d.', + week: { + dow: 1, // Monday is the first day of the week. + doy: 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + //! moment.js locale configuration + //! locale : lao (lo) + //! author : Ryan Hart : https://github.com/ryanhart2 + + var lo = moment__default.defineLocale('lo', { + months : 'ມັງກອນ_ກຸມພາ_ມີນາ_ເມສາ_ພຶດສະພາ_ມິຖຸນາ_ກໍລະກົດ_ສິງຫາ_ກັນຍາ_ຕຸລາ_ພະຈິກ_ທັນວາ'.split('_'), + monthsShort : 'ມັງກອນ_ກຸມພາ_ມີນາ_ເມສາ_ພຶດສະພາ_ມິຖຸນາ_ກໍລະກົດ_ສິງຫາ_ກັນຍາ_ຕຸລາ_ພະຈິກ_ທັນວາ'.split('_'), + weekdays : 'ອາທິດ_ຈັນ_ອັງຄານ_ພຸດ_ພະຫັດ_ສຸກ_ເສົາ'.split('_'), + weekdaysShort : 'ທິດ_ຈັນ_ອັງຄານ_ພຸດ_ພະຫັດ_ສຸກ_ເສົາ'.split('_'), + weekdaysMin : 'ທ_ຈ_ອຄ_ພ_ພຫ_ສກ_ສ'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'ວັນdddd D MMMM YYYY HH:mm' + }, + meridiemParse: /ຕອນເຊົ້າ|ຕອນແລງ/, + isPM: function (input) { + return input === 'ຕອນແລງ'; + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'ຕອນເຊົ້າ'; + } else { + return 'ຕອນແລງ'; + } + }, + calendar : { + sameDay : '[ມື້ນີ້ເວລາ] LT', + nextDay : '[ມື້ອື່ນເວລາ] LT', + nextWeek : '[ວັນ]dddd[ໜ້າເວລາ] LT', + lastDay : '[ມື້ວານນີ້ເວລາ] LT', + lastWeek : '[ວັນ]dddd[ແລ້ວນີ້ເວລາ] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'ອີກ %s', + past : '%sຜ່ານມາ', + s : 'ບໍ່ເທົ່າໃດວິນາທີ', + m : '1 ນາທີ', + mm : '%d ນາທີ', + h : '1 ຊົ່ວໂມງ', + hh : '%d ຊົ່ວໂມງ', + d : '1 ມື້', + dd : '%d ມື້', + M : '1 ເດືອນ', + MM : '%d ເດືອນ', + y : '1 ປີ', + yy : '%d ປີ' + }, + ordinalParse: /(ທີ່)\d{1,2}/, + ordinal : function (number) { + return 'ທີ່' + number; + } + }); + + //! moment.js locale configuration + //! locale : Lithuanian (lt) + //! author : Mindaugas Mozūras : https://github.com/mmozuras + + var lt__units = { + 'm' : 'minutė_minutės_minutę', + 'mm': 'minutės_minučių_minutes', + 'h' : 'valanda_valandos_valandą', + 'hh': 'valandos_valandų_valandas', + 'd' : 'diena_dienos_dieną', + 'dd': 'dienos_dienų_dienas', + 'M' : 'mėnuo_mėnesio_mėnesį', + 'MM': 'mėnesiai_mėnesių_mėnesius', + 'y' : 'metai_metų_metus', + 'yy': 'metai_metų_metus' + }; + function translateSeconds(number, withoutSuffix, key, isFuture) { + if (withoutSuffix) { + return 'kelios sekundės'; + } else { + return isFuture ? 'kelių sekundžių' : 'kelias sekundes'; + } + } + function translateSingular(number, withoutSuffix, key, isFuture) { + return withoutSuffix ? forms(key)[0] : (isFuture ? forms(key)[1] : forms(key)[2]); + } + function special(number) { + return number % 10 === 0 || (number > 10 && number < 20); + } + function forms(key) { + return lt__units[key].split('_'); + } + function lt__translate(number, withoutSuffix, key, isFuture) { + var result = number + ' '; + if (number === 1) { + return result + translateSingular(number, withoutSuffix, key[0], isFuture); + } else if (withoutSuffix) { + return result + (special(number) ? forms(key)[1] : forms(key)[0]); + } else { + if (isFuture) { + return result + forms(key)[1]; + } else { + return result + (special(number) ? forms(key)[1] : forms(key)[2]); + } + } + } + var lt = moment__default.defineLocale('lt', { + months : { + format: 'sausio_vasario_kovo_balandžio_gegužės_birželio_liepos_rugpjūčio_rugsėjo_spalio_lapkričio_gruodžio'.split('_'), + standalone: 'sausis_vasaris_kovas_balandis_gegužė_birželis_liepa_rugpjūtis_rugsėjis_spalis_lapkritis_gruodis'.split('_') + }, + monthsShort : 'sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd'.split('_'), + weekdays : { + format: 'sekmadienį_pirmadienį_antradienį_trečiadienį_ketvirtadienį_penktadienį_šeštadienį'.split('_'), + standalone: 'sekmadienis_pirmadienis_antradienis_trečiadienis_ketvirtadienis_penktadienis_šeštadienis'.split('_'), + isFormat: /dddd HH:mm/ + }, + weekdaysShort : 'Sek_Pir_Ant_Tre_Ket_Pen_Šeš'.split('_'), + weekdaysMin : 'S_P_A_T_K_Pn_Š'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'YYYY-MM-DD', + LL : 'YYYY [m.] MMMM D [d.]', + LLL : 'YYYY [m.] MMMM D [d.], HH:mm [val.]', + LLLL : 'YYYY [m.] MMMM D [d.], dddd, HH:mm [val.]', + l : 'YYYY-MM-DD', + ll : 'YYYY [m.] MMMM D [d.]', + lll : 'YYYY [m.] MMMM D [d.], HH:mm [val.]', + llll : 'YYYY [m.] MMMM D [d.], ddd, HH:mm [val.]' + }, + calendar : { + sameDay : '[Šiandien] LT', + nextDay : '[Rytoj] LT', + nextWeek : 'dddd LT', + lastDay : '[Vakar] LT', + lastWeek : '[Praėjusį] dddd LT', + sameElse : 'L' + }, + relativeTime : { + future : 'po %s', + past : 'prieš %s', + s : translateSeconds, + m : translateSingular, + mm : lt__translate, + h : translateSingular, + hh : lt__translate, + d : translateSingular, + dd : lt__translate, + M : translateSingular, + MM : lt__translate, + y : translateSingular, + yy : lt__translate + }, + ordinalParse: /\d{1,2}-oji/, + ordinal : function (number) { + return number + '-oji'; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + //! moment.js locale configuration + //! locale : latvian (lv) + //! author : Kristaps Karlsons : https://github.com/skakri + //! author : Jānis Elmeris : https://github.com/JanisE + + var lv__units = { + 'm': 'minūtes_minūtēm_minūte_minūtes'.split('_'), + 'mm': 'minūtes_minūtēm_minūte_minūtes'.split('_'), + 'h': 'stundas_stundām_stunda_stundas'.split('_'), + 'hh': 'stundas_stundām_stunda_stundas'.split('_'), + 'd': 'dienas_dienām_diena_dienas'.split('_'), + 'dd': 'dienas_dienām_diena_dienas'.split('_'), + 'M': 'mēneša_mēnešiem_mēnesis_mēneši'.split('_'), + 'MM': 'mēneša_mēnešiem_mēnesis_mēneši'.split('_'), + 'y': 'gada_gadiem_gads_gadi'.split('_'), + 'yy': 'gada_gadiem_gads_gadi'.split('_') + }; + /** + * @param withoutSuffix boolean true = a length of time; false = before/after a period of time. + */ + function lv__format(forms, number, withoutSuffix) { + if (withoutSuffix) { + // E.g. "21 minūte", "3 minūtes". + return number % 10 === 1 && number !== 11 ? forms[2] : forms[3]; + } else { + // E.g. "21 minūtes" as in "pēc 21 minūtes". + // E.g. "3 minūtēm" as in "pēc 3 minūtēm". + return number % 10 === 1 && number !== 11 ? forms[0] : forms[1]; + } + } + function lv__relativeTimeWithPlural(number, withoutSuffix, key) { + return number + ' ' + lv__format(lv__units[key], number, withoutSuffix); + } + function relativeTimeWithSingular(number, withoutSuffix, key) { + return lv__format(lv__units[key], number, withoutSuffix); + } + function relativeSeconds(number, withoutSuffix) { + return withoutSuffix ? 'dažas sekundes' : 'dažām sekundēm'; + } + + var lv = moment__default.defineLocale('lv', { + months : 'janvāris_februāris_marts_aprīlis_maijs_jūnijs_jūlijs_augusts_septembris_oktobris_novembris_decembris'.split('_'), + monthsShort : 'jan_feb_mar_apr_mai_jūn_jūl_aug_sep_okt_nov_dec'.split('_'), + weekdays : 'svētdiena_pirmdiena_otrdiena_trešdiena_ceturtdiena_piektdiena_sestdiena'.split('_'), + weekdaysShort : 'Sv_P_O_T_C_Pk_S'.split('_'), + weekdaysMin : 'Sv_P_O_T_C_Pk_S'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD.MM.YYYY.', + LL : 'YYYY. [gada] D. MMMM', + LLL : 'YYYY. [gada] D. MMMM, HH:mm', + LLLL : 'YYYY. [gada] D. MMMM, dddd, HH:mm' + }, + calendar : { + sameDay : '[Šodien pulksten] LT', + nextDay : '[Rīt pulksten] LT', + nextWeek : 'dddd [pulksten] LT', + lastDay : '[Vakar pulksten] LT', + lastWeek : '[Pagājušā] dddd [pulksten] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'pēc %s', + past : 'pirms %s', + s : relativeSeconds, + m : relativeTimeWithSingular, + mm : lv__relativeTimeWithPlural, + h : relativeTimeWithSingular, + hh : lv__relativeTimeWithPlural, + d : relativeTimeWithSingular, + dd : lv__relativeTimeWithPlural, + M : relativeTimeWithSingular, + MM : lv__relativeTimeWithPlural, + y : relativeTimeWithSingular, + yy : lv__relativeTimeWithPlural + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + //! moment.js locale configuration + //! locale : Montenegrin (me) + //! author : Miodrag Nikač : https://github.com/miodragnikac + + var me__translator = { + words: { //Different grammatical cases + m: ['jedan minut', 'jednog minuta'], + mm: ['minut', 'minuta', 'minuta'], + h: ['jedan sat', 'jednog sata'], + hh: ['sat', 'sata', 'sati'], + dd: ['dan', 'dana', 'dana'], + MM: ['mjesec', 'mjeseca', 'mjeseci'], + yy: ['godina', 'godine', 'godina'] + }, + correctGrammaticalCase: function (number, wordKey) { + return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]); + }, + translate: function (number, withoutSuffix, key) { + var wordKey = me__translator.words[key]; + if (key.length === 1) { + return withoutSuffix ? wordKey[0] : wordKey[1]; + } else { + return number + ' ' + me__translator.correctGrammaticalCase(number, wordKey); + } + } + }; + + var me = moment__default.defineLocale('me', { + months: ['januar', 'februar', 'mart', 'april', 'maj', 'jun', 'jul', 'avgust', 'septembar', 'oktobar', 'novembar', 'decembar'], + monthsShort: ['jan.', 'feb.', 'mar.', 'apr.', 'maj', 'jun', 'jul', 'avg.', 'sep.', 'okt.', 'nov.', 'dec.'], + weekdays: ['nedjelja', 'ponedjeljak', 'utorak', 'srijeda', 'četvrtak', 'petak', 'subota'], + weekdaysShort: ['ned.', 'pon.', 'uto.', 'sri.', 'čet.', 'pet.', 'sub.'], + weekdaysMin: ['ne', 'po', 'ut', 'sr', 'če', 'pe', 'su'], + longDateFormat: { + LT: 'H:mm', + LTS : 'H:mm:ss', + L: 'DD. MM. YYYY', + LL: 'D. MMMM YYYY', + LLL: 'D. MMMM YYYY H:mm', + LLLL: 'dddd, D. MMMM YYYY H:mm' + }, + calendar: { + sameDay: '[danas u] LT', + nextDay: '[sjutra u] LT', + + nextWeek: function () { + switch (this.day()) { + case 0: + return '[u] [nedjelju] [u] LT'; + case 3: + return '[u] [srijedu] [u] LT'; + case 6: + return '[u] [subotu] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[u] dddd [u] LT'; + } + }, + lastDay : '[juče u] LT', + lastWeek : function () { + var lastWeekDays = [ + '[prošle] [nedjelje] [u] LT', + '[prošlog] [ponedjeljka] [u] LT', + '[prošlog] [utorka] [u] LT', + '[prošle] [srijede] [u] LT', + '[prošlog] [četvrtka] [u] LT', + '[prošlog] [petka] [u] LT', + '[prošle] [subote] [u] LT' + ]; + return lastWeekDays[this.day()]; + }, + sameElse : 'L' + }, + relativeTime : { + future : 'za %s', + past : 'prije %s', + s : 'nekoliko sekundi', + m : me__translator.translate, + mm : me__translator.translate, + h : me__translator.translate, + hh : me__translator.translate, + d : 'dan', + dd : me__translator.translate, + M : 'mjesec', + MM : me__translator.translate, + y : 'godinu', + yy : me__translator.translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + //! locale : macedonian (mk) + //! author : Borislav Mickov : https://github.com/B0k0 + + var mk = moment__default.defineLocale('mk', { + months : 'јануари_февруари_март_април_мај_јуни_јули_август_септември_октомври_ноември_декември'.split('_'), + monthsShort : 'јан_фев_мар_апр_мај_јун_јул_авг_сеп_окт_ное_дек'.split('_'), + weekdays : 'недела_понеделник_вторник_среда_четврток_петок_сабота'.split('_'), + weekdaysShort : 'нед_пон_вто_сре_чет_пет_саб'.split('_'), + weekdaysMin : 'нe_пo_вт_ср_че_пе_сa'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'H:mm:ss', + L : 'D.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY H:mm', + LLLL : 'dddd, D MMMM YYYY H:mm' + }, + calendar : { + sameDay : '[Денес во] LT', + nextDay : '[Утре во] LT', + nextWeek : '[Во] dddd [во] LT', + lastDay : '[Вчера во] LT', + lastWeek : function () { + switch (this.day()) { + case 0: + case 3: + case 6: + return '[Изминатата] dddd [во] LT'; + case 1: + case 2: + case 4: + case 5: + return '[Изминатиот] dddd [во] LT'; + } + }, + sameElse : 'L' + }, + relativeTime : { + future : 'после %s', + past : 'пред %s', + s : 'неколку секунди', + m : 'минута', + mm : '%d минути', + h : 'час', + hh : '%d часа', + d : 'ден', + dd : '%d дена', + M : 'месец', + MM : '%d месеци', + y : 'година', + yy : '%d години' + }, + ordinalParse: /\d{1,2}-(ев|ен|ти|ви|ри|ми)/, + ordinal : function (number) { + var lastDigit = number % 10, + last2Digits = number % 100; + if (number === 0) { + return number + '-ев'; + } else if (last2Digits === 0) { + return number + '-ен'; + } else if (last2Digits > 10 && last2Digits < 20) { + return number + '-ти'; + } else if (lastDigit === 1) { + return number + '-ви'; + } else if (lastDigit === 2) { + return number + '-ри'; + } else if (lastDigit === 7 || lastDigit === 8) { + return number + '-ми'; + } else { + return number + '-ти'; + } + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + //! locale : malayalam (ml) + //! author : Floyd Pink : https://github.com/floydpink + + var ml = moment__default.defineLocale('ml', { + months : 'ജനുവരി_ഫെബ്രുവരി_മാർച്ച്_ഏപ്രിൽ_മേയ്_ജൂൺ_ജൂലൈ_ഓഗസ്റ്റ്_സെപ്റ്റംബർ_ഒക്ടോബർ_നവംബർ_ഡിസംബർ'.split('_'), + monthsShort : 'ജനു._ഫെബ്രു._മാർ._ഏപ്രി._മേയ്_ജൂൺ_ജൂലൈ._ഓഗ._സെപ്റ്റ._ഒക്ടോ._നവം._ഡിസം.'.split('_'), + weekdays : 'ഞായറാഴ്ച_തിങ്കളാഴ്ച_ചൊവ്വാഴ്ച_ബുധനാഴ്ച_വ്യാഴാഴ്ച_വെള്ളിയാഴ്ച_ശനിയാഴ്ച'.split('_'), + weekdaysShort : 'ഞായർ_തിങ്കൾ_ചൊവ്വ_ബുധൻ_വ്യാഴം_വെള്ളി_ശനി'.split('_'), + weekdaysMin : 'ഞാ_തി_ചൊ_ബു_വ്യാ_വെ_ശ'.split('_'), + longDateFormat : { + LT : 'A h:mm -നു', + LTS : 'A h:mm:ss -നു', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, A h:mm -നു', + LLLL : 'dddd, D MMMM YYYY, A h:mm -നു' + }, + calendar : { + sameDay : '[ഇന്ന്] LT', + nextDay : '[നാളെ] LT', + nextWeek : 'dddd, LT', + lastDay : '[ഇന്നലെ] LT', + lastWeek : '[കഴിഞ്ഞ] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s കഴിഞ്ഞ്', + past : '%s മുൻപ്', + s : 'അൽപ നിമിഷങ്ങൾ', + m : 'ഒരു മിനിറ്റ്', + mm : '%d മിനിറ്റ്', + h : 'ഒരു മണിക്കൂർ', + hh : '%d മണിക്കൂർ', + d : 'ഒരു ദിവസം', + dd : '%d ദിവസം', + M : 'ഒരു മാസം', + MM : '%d മാസം', + y : 'ഒരു വർഷം', + yy : '%d വർഷം' + }, + meridiemParse: /രാത്രി|രാവിലെ|ഉച്ച കഴിഞ്ഞ്|വൈകുന്നേരം|രാത്രി/i, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if ((meridiem === 'രാത്രി' && hour >= 4) || + meridiem === 'ഉച്ച കഴിഞ്ഞ്' || + meridiem === 'വൈകുന്നേരം') { + return hour + 12; + } else { + return hour; + } + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'രാത്രി'; + } else if (hour < 12) { + return 'രാവിലെ'; + } else if (hour < 17) { + return 'ഉച്ച കഴിഞ്ഞ്'; + } else if (hour < 20) { + return 'വൈകുന്നേരം'; + } else { + return 'രാത്രി'; + } + } + }); + + //! moment.js locale configuration + //! locale : Marathi (mr) + //! author : Harshad Kale : https://github.com/kalehv + //! author : Vivek Athalye : https://github.com/vnathalye + + var mr__symbolMap = { + '1': '१', + '2': '२', + '3': '३', + '4': '४', + '5': '५', + '6': '६', + '7': '७', + '8': '८', + '9': '९', + '0': '०' + }, + mr__numberMap = { + '१': '1', + '२': '2', + '३': '3', + '४': '4', + '५': '5', + '६': '6', + '७': '7', + '८': '8', + '९': '9', + '०': '0' + }; + + function relativeTimeMr(number, withoutSuffix, string, isFuture) + { + var output = ''; + if (withoutSuffix) { + switch (string) { + case 's': output = 'काही सेकंद'; break; + case 'm': output = 'एक मिनिट'; break; + case 'mm': output = '%d मिनिटे'; break; + case 'h': output = 'एक तास'; break; + case 'hh': output = '%d तास'; break; + case 'd': output = 'एक दिवस'; break; + case 'dd': output = '%d दिवस'; break; + case 'M': output = 'एक महिना'; break; + case 'MM': output = '%d महिने'; break; + case 'y': output = 'एक वर्ष'; break; + case 'yy': output = '%d वर्षे'; break; + } + } + else { + switch (string) { + case 's': output = 'काही सेकंदां'; break; + case 'm': output = 'एका मिनिटा'; break; + case 'mm': output = '%d मिनिटां'; break; + case 'h': output = 'एका तासा'; break; + case 'hh': output = '%d तासां'; break; + case 'd': output = 'एका दिवसा'; break; + case 'dd': output = '%d दिवसां'; break; + case 'M': output = 'एका महिन्या'; break; + case 'MM': output = '%d महिन्यां'; break; + case 'y': output = 'एका वर्षा'; break; + case 'yy': output = '%d वर्षां'; break; + } + } + return output.replace(/%d/i, number); + } + + var mr = moment__default.defineLocale('mr', { + months : 'जानेवारी_फेब्रुवारी_मार्च_एप्रिल_मे_जून_जुलै_ऑगस्ट_सप्टेंबर_ऑक्टोबर_नोव्हेंबर_डिसेंबर'.split('_'), + monthsShort: 'जाने._फेब्रु._मार्च._एप्रि._मे._जून._जुलै._ऑग._सप्टें._ऑक्टो._नोव्हें._डिसें.'.split('_'), + weekdays : 'रविवार_सोमवार_मंगळवार_बुधवार_गुरूवार_शुक्रवार_शनिवार'.split('_'), + weekdaysShort : 'रवि_सोम_मंगळ_बुध_गुरू_शुक्र_शनि'.split('_'), + weekdaysMin : 'र_सो_मं_बु_गु_शु_श'.split('_'), + longDateFormat : { + LT : 'A h:mm वाजता', + LTS : 'A h:mm:ss वाजता', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, A h:mm वाजता', + LLLL : 'dddd, D MMMM YYYY, A h:mm वाजता' + }, + calendar : { + sameDay : '[आज] LT', + nextDay : '[उद्या] LT', + nextWeek : 'dddd, LT', + lastDay : '[काल] LT', + lastWeek: '[मागील] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future: '%sमध्ये', + past: '%sपूर्वी', + s: relativeTimeMr, + m: relativeTimeMr, + mm: relativeTimeMr, + h: relativeTimeMr, + hh: relativeTimeMr, + d: relativeTimeMr, + dd: relativeTimeMr, + M: relativeTimeMr, + MM: relativeTimeMr, + y: relativeTimeMr, + yy: relativeTimeMr + }, + preparse: function (string) { + return string.replace(/[१२३४५६७८९०]/g, function (match) { + return mr__numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return mr__symbolMap[match]; + }); + }, + meridiemParse: /रात्री|सकाळी|दुपारी|सायंकाळी/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'रात्री') { + return hour < 4 ? hour : hour + 12; + } else if (meridiem === 'सकाळी') { + return hour; + } else if (meridiem === 'दुपारी') { + return hour >= 10 ? hour : hour + 12; + } else if (meridiem === 'सायंकाळी') { + return hour + 12; + } + }, + meridiem: function (hour, minute, isLower) { + if (hour < 4) { + return 'रात्री'; + } else if (hour < 10) { + return 'सकाळी'; + } else if (hour < 17) { + return 'दुपारी'; + } else if (hour < 20) { + return 'सायंकाळी'; + } else { + return 'रात्री'; + } + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + //! locale : Bahasa Malaysia (ms-MY) + //! author : Weldan Jamili : https://github.com/weldan + + var ms_my = moment__default.defineLocale('ms-my', { + months : 'Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember'.split('_'), + monthsShort : 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis'.split('_'), + weekdays : 'Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu'.split('_'), + weekdaysShort : 'Ahd_Isn_Sel_Rab_Kha_Jum_Sab'.split('_'), + weekdaysMin : 'Ah_Is_Sl_Rb_Km_Jm_Sb'.split('_'), + longDateFormat : { + LT : 'HH.mm', + LTS : 'HH.mm.ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY [pukul] HH.mm', + LLLL : 'dddd, D MMMM YYYY [pukul] HH.mm' + }, + meridiemParse: /pagi|tengahari|petang|malam/, + meridiemHour: function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'pagi') { + return hour; + } else if (meridiem === 'tengahari') { + return hour >= 11 ? hour : hour + 12; + } else if (meridiem === 'petang' || meridiem === 'malam') { + return hour + 12; + } + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 11) { + return 'pagi'; + } else if (hours < 15) { + return 'tengahari'; + } else if (hours < 19) { + return 'petang'; + } else { + return 'malam'; + } + }, + calendar : { + sameDay : '[Hari ini pukul] LT', + nextDay : '[Esok pukul] LT', + nextWeek : 'dddd [pukul] LT', + lastDay : '[Kelmarin pukul] LT', + lastWeek : 'dddd [lepas pukul] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'dalam %s', + past : '%s yang lepas', + s : 'beberapa saat', + m : 'seminit', + mm : '%d minit', + h : 'sejam', + hh : '%d jam', + d : 'sehari', + dd : '%d hari', + M : 'sebulan', + MM : '%d bulan', + y : 'setahun', + yy : '%d tahun' + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + //! locale : Bahasa Malaysia (ms-MY) + //! author : Weldan Jamili : https://github.com/weldan + + var locale_ms = moment__default.defineLocale('ms', { + months : 'Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember'.split('_'), + monthsShort : 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis'.split('_'), + weekdays : 'Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu'.split('_'), + weekdaysShort : 'Ahd_Isn_Sel_Rab_Kha_Jum_Sab'.split('_'), + weekdaysMin : 'Ah_Is_Sl_Rb_Km_Jm_Sb'.split('_'), + longDateFormat : { + LT : 'HH.mm', + LTS : 'HH.mm.ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY [pukul] HH.mm', + LLLL : 'dddd, D MMMM YYYY [pukul] HH.mm' + }, + meridiemParse: /pagi|tengahari|petang|malam/, + meridiemHour: function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'pagi') { + return hour; + } else if (meridiem === 'tengahari') { + return hour >= 11 ? hour : hour + 12; + } else if (meridiem === 'petang' || meridiem === 'malam') { + return hour + 12; + } + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 11) { + return 'pagi'; + } else if (hours < 15) { + return 'tengahari'; + } else if (hours < 19) { + return 'petang'; + } else { + return 'malam'; + } + }, + calendar : { + sameDay : '[Hari ini pukul] LT', + nextDay : '[Esok pukul] LT', + nextWeek : 'dddd [pukul] LT', + lastDay : '[Kelmarin pukul] LT', + lastWeek : 'dddd [lepas pukul] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'dalam %s', + past : '%s yang lepas', + s : 'beberapa saat', + m : 'seminit', + mm : '%d minit', + h : 'sejam', + hh : '%d jam', + d : 'sehari', + dd : '%d hari', + M : 'sebulan', + MM : '%d bulan', + y : 'setahun', + yy : '%d tahun' + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + //! locale : Burmese (my) + //! author : Squar team, mysquar.com + + var my__symbolMap = { + '1': '၁', + '2': '၂', + '3': '၃', + '4': '၄', + '5': '၅', + '6': '၆', + '7': '၇', + '8': '၈', + '9': '၉', + '0': '၀' + }, my__numberMap = { + '၁': '1', + '၂': '2', + '၃': '3', + '၄': '4', + '၅': '5', + '၆': '6', + '၇': '7', + '၈': '8', + '၉': '9', + '၀': '0' + }; + + var my = moment__default.defineLocale('my', { + months: 'ဇန်နဝါရီ_ဖေဖော်ဝါရီ_မတ်_ဧပြီ_မေ_ဇွန်_ဇူလိုင်_သြဂုတ်_စက်တင်ဘာ_အောက်တိုဘာ_နိုဝင်ဘာ_ဒီဇင်ဘာ'.split('_'), + monthsShort: 'ဇန်_ဖေ_မတ်_ပြီ_မေ_ဇွန်_လိုင်_သြ_စက်_အောက်_နို_ဒီ'.split('_'), + weekdays: 'တနင်္ဂနွေ_တနင်္လာ_အင်္ဂါ_ဗုဒ္ဓဟူး_ကြာသပတေး_သောကြာ_စနေ'.split('_'), + weekdaysShort: 'နွေ_လာ_ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'), + weekdaysMin: 'နွေ_လာ_ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'), + + longDateFormat: { + LT: 'HH:mm', + LTS: 'HH:mm:ss', + L: 'DD/MM/YYYY', + LL: 'D MMMM YYYY', + LLL: 'D MMMM YYYY HH:mm', + LLLL: 'dddd D MMMM YYYY HH:mm' + }, + calendar: { + sameDay: '[ယနေ.] LT [မှာ]', + nextDay: '[မနက်ဖြန်] LT [မှာ]', + nextWeek: 'dddd LT [မှာ]', + lastDay: '[မနေ.က] LT [မှာ]', + lastWeek: '[ပြီးခဲ့သော] dddd LT [မှာ]', + sameElse: 'L' + }, + relativeTime: { + future: 'လာမည့် %s မှာ', + past: 'လွန်ခဲ့သော %s က', + s: 'စက္ကန်.အနည်းငယ်', + m: 'တစ်မိနစ်', + mm: '%d မိနစ်', + h: 'တစ်နာရီ', + hh: '%d နာရီ', + d: 'တစ်ရက်', + dd: '%d ရက်', + M: 'တစ်လ', + MM: '%d လ', + y: 'တစ်နှစ်', + yy: '%d နှစ်' + }, + preparse: function (string) { + return string.replace(/[၁၂၃၄၅၆၇၈၉၀]/g, function (match) { + return my__numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return my__symbolMap[match]; + }); + }, + week: { + dow: 1, // Monday is the first day of the week. + doy: 4 // The week that contains Jan 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + //! locale : norwegian bokmål (nb) + //! authors : Espen Hovlandsdal : https://github.com/rexxars + //! Sigurd Gartmann : https://github.com/sigurdga + + var nb = moment__default.defineLocale('nb', { + months : 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split('_'), + monthsShort : 'jan._feb._mars_april_mai_juni_juli_aug._sep._okt._nov._des.'.split('_'), + weekdays : 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'), + weekdaysShort : 'sø._ma._ti._on._to._fr._lø.'.split('_'), + weekdaysMin : 'sø_ma_ti_on_to_fr_lø'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY [kl.] HH:mm', + LLLL : 'dddd D. MMMM YYYY [kl.] HH:mm' + }, + calendar : { + sameDay: '[i dag kl.] LT', + nextDay: '[i morgen kl.] LT', + nextWeek: 'dddd [kl.] LT', + lastDay: '[i går kl.] LT', + lastWeek: '[forrige] dddd [kl.] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'om %s', + past : 'for %s siden', + s : 'noen sekunder', + m : 'ett minutt', + mm : '%d minutter', + h : 'en time', + hh : '%d timer', + d : 'en dag', + dd : '%d dager', + M : 'en måned', + MM : '%d måneder', + y : 'ett år', + yy : '%d år' + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + //! moment.js locale configuration + //! locale : nepali/nepalese + //! author : suvash : https://github.com/suvash + + var ne__symbolMap = { + '1': '१', + '2': '२', + '3': '३', + '4': '४', + '5': '५', + '6': '६', + '7': '७', + '8': '८', + '9': '९', + '0': '०' + }, + ne__numberMap = { + '१': '1', + '२': '2', + '३': '3', + '४': '4', + '५': '5', + '६': '6', + '७': '7', + '८': '8', + '९': '9', + '०': '0' + }; + + var ne = moment__default.defineLocale('ne', { + months : 'जनवरी_फेब्रुवरी_मार्च_अप्रिल_मई_जुन_जुलाई_अगष्ट_सेप्टेम्बर_अक्टोबर_नोभेम्बर_डिसेम्बर'.split('_'), + monthsShort : 'जन._फेब्रु._मार्च_अप्रि._मई_जुन_जुलाई._अग._सेप्ट._अक्टो._नोभे._डिसे.'.split('_'), + weekdays : 'आइतबार_सोमबार_मङ्गलबार_बुधबार_बिहिबार_शुक्रबार_शनिबार'.split('_'), + weekdaysShort : 'आइत._सोम._मङ्गल._बुध._बिहि._शुक्र._शनि.'.split('_'), + weekdaysMin : 'आ._सो._मं._बु._बि._शु._श.'.split('_'), + longDateFormat : { + LT : 'Aको h:mm बजे', + LTS : 'Aको h:mm:ss बजे', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, Aको h:mm बजे', + LLLL : 'dddd, D MMMM YYYY, Aको h:mm बजे' + }, + preparse: function (string) { + return string.replace(/[१२३४५६७८९०]/g, function (match) { + return ne__numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return ne__symbolMap[match]; + }); + }, + meridiemParse: /राति|बिहान|दिउँसो|साँझ/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'राति') { + return hour < 4 ? hour : hour + 12; + } else if (meridiem === 'बिहान') { + return hour; + } else if (meridiem === 'दिउँसो') { + return hour >= 10 ? hour : hour + 12; + } else if (meridiem === 'साँझ') { + return hour + 12; + } + }, + meridiem : function (hour, minute, isLower) { + if (hour < 3) { + return 'राति'; + } else if (hour < 12) { + return 'बिहान'; + } else if (hour < 16) { + return 'दिउँसो'; + } else if (hour < 20) { + return 'साँझ'; + } else { + return 'राति'; + } + }, + calendar : { + sameDay : '[आज] LT', + nextDay : '[भोलि] LT', + nextWeek : '[आउँदो] dddd[,] LT', + lastDay : '[हिजो] LT', + lastWeek : '[गएको] dddd[,] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%sमा', + past : '%s अगाडि', + s : 'केही क्षण', + m : 'एक मिनेट', + mm : '%d मिनेट', + h : 'एक घण्टा', + hh : '%d घण्टा', + d : 'एक दिन', + dd : '%d दिन', + M : 'एक महिना', + MM : '%d महिना', + y : 'एक बर्ष', + yy : '%d बर्ष' + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + //! locale : dutch (nl) + //! author : Joris Röling : https://github.com/jjupiter + + var nl__monthsShortWithDots = 'jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.'.split('_'), + nl__monthsShortWithoutDots = 'jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec'.split('_'); + + var nl = moment__default.defineLocale('nl', { + months : 'januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december'.split('_'), + monthsShort : function (m, format) { + if (/-MMM-/.test(format)) { + return nl__monthsShortWithoutDots[m.month()]; + } else { + return nl__monthsShortWithDots[m.month()]; + } + }, + weekdays : 'zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag'.split('_'), + weekdaysShort : 'zo._ma._di._wo._do._vr._za.'.split('_'), + weekdaysMin : 'Zo_Ma_Di_Wo_Do_Vr_Za'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD-MM-YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd D MMMM YYYY HH:mm' + }, + calendar : { + sameDay: '[vandaag om] LT', + nextDay: '[morgen om] LT', + nextWeek: 'dddd [om] LT', + lastDay: '[gisteren om] LT', + lastWeek: '[afgelopen] dddd [om] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'over %s', + past : '%s geleden', + s : 'een paar seconden', + m : 'één minuut', + mm : '%d minuten', + h : 'één uur', + hh : '%d uur', + d : 'één dag', + dd : '%d dagen', + M : 'één maand', + MM : '%d maanden', + y : 'één jaar', + yy : '%d jaar' + }, + ordinalParse: /\d{1,2}(ste|de)/, + ordinal : function (number) { + return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + //! moment.js locale configuration + //! locale : norwegian nynorsk (nn) + //! author : https://github.com/mechuwind + + var nn = moment__default.defineLocale('nn', { + months : 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split('_'), + monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'), + weekdays : 'sundag_måndag_tysdag_onsdag_torsdag_fredag_laurdag'.split('_'), + weekdaysShort : 'sun_mån_tys_ons_tor_fre_lau'.split('_'), + weekdaysMin : 'su_må_ty_on_to_fr_lø'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY [kl.] H:mm', + LLLL : 'dddd D. MMMM YYYY [kl.] HH:mm' + }, + calendar : { + sameDay: '[I dag klokka] LT', + nextDay: '[I morgon klokka] LT', + nextWeek: 'dddd [klokka] LT', + lastDay: '[I går klokka] LT', + lastWeek: '[Føregåande] dddd [klokka] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'om %s', + past : 'for %s sidan', + s : 'nokre sekund', + m : 'eit minutt', + mm : '%d minutt', + h : 'ein time', + hh : '%d timar', + d : 'ein dag', + dd : '%d dagar', + M : 'ein månad', + MM : '%d månader', + y : 'eit år', + yy : '%d år' + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + //! moment.js locale configuration + //! locale : punjabi india (pa-in) + //! author : Harpreet Singh : https://github.com/harpreetkhalsagtbit + + var pa_in__symbolMap = { + '1': '੧', + '2': '੨', + '3': '੩', + '4': '੪', + '5': '੫', + '6': '੬', + '7': '੭', + '8': '੮', + '9': '੯', + '0': '੦' + }, + pa_in__numberMap = { + '੧': '1', + '੨': '2', + '੩': '3', + '੪': '4', + '੫': '5', + '੬': '6', + '੭': '7', + '੮': '8', + '੯': '9', + '੦': '0' + }; + + var pa_in = moment__default.defineLocale('pa-in', { + // There are months name as per Nanakshahi Calender but they are not used as rigidly in modern Punjabi. + months : 'ਜਨਵਰੀ_ਫ਼ਰਵਰੀ_ਮਾਰਚ_ਅਪ੍ਰੈਲ_ਮਈ_ਜੂਨ_ਜੁਲਾਈ_ਅਗਸਤ_ਸਤੰਬਰ_ਅਕਤੂਬਰ_ਨਵੰਬਰ_ਦਸੰਬਰ'.split('_'), + monthsShort : 'ਜਨਵਰੀ_ਫ਼ਰਵਰੀ_ਮਾਰਚ_ਅਪ੍ਰੈਲ_ਮਈ_ਜੂਨ_ਜੁਲਾਈ_ਅਗਸਤ_ਸਤੰਬਰ_ਅਕਤੂਬਰ_ਨਵੰਬਰ_ਦਸੰਬਰ'.split('_'), + weekdays : 'ਐਤਵਾਰ_ਸੋਮਵਾਰ_ਮੰਗਲਵਾਰ_ਬੁਧਵਾਰ_ਵੀਰਵਾਰ_ਸ਼ੁੱਕਰਵਾਰ_ਸ਼ਨੀਚਰਵਾਰ'.split('_'), + weekdaysShort : 'ਐਤ_ਸੋਮ_ਮੰਗਲ_ਬੁਧ_ਵੀਰ_ਸ਼ੁਕਰ_ਸ਼ਨੀ'.split('_'), + weekdaysMin : 'ਐਤ_ਸੋਮ_ਮੰਗਲ_ਬੁਧ_ਵੀਰ_ਸ਼ੁਕਰ_ਸ਼ਨੀ'.split('_'), + longDateFormat : { + LT : 'A h:mm ਵਜੇ', + LTS : 'A h:mm:ss ਵਜੇ', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, A h:mm ਵਜੇ', + LLLL : 'dddd, D MMMM YYYY, A h:mm ਵਜੇ' + }, + calendar : { + sameDay : '[ਅਜ] LT', + nextDay : '[ਕਲ] LT', + nextWeek : 'dddd, LT', + lastDay : '[ਕਲ] LT', + lastWeek : '[ਪਿਛਲੇ] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s ਵਿੱਚ', + past : '%s ਪਿਛਲੇ', + s : 'ਕੁਝ ਸਕਿੰਟ', + m : 'ਇਕ ਮਿੰਟ', + mm : '%d ਮਿੰਟ', + h : 'ਇੱਕ ਘੰਟਾ', + hh : '%d ਘੰਟੇ', + d : 'ਇੱਕ ਦਿਨ', + dd : '%d ਦਿਨ', + M : 'ਇੱਕ ਮਹੀਨਾ', + MM : '%d ਮਹੀਨੇ', + y : 'ਇੱਕ ਸਾਲ', + yy : '%d ਸਾਲ' + }, + preparse: function (string) { + return string.replace(/[੧੨੩੪੫੬੭੮੯੦]/g, function (match) { + return pa_in__numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return pa_in__symbolMap[match]; + }); + }, + // Punjabi notation for meridiems are quite fuzzy in practice. While there exists + // a rigid notion of a 'Pahar' it is not used as rigidly in modern Punjabi. + meridiemParse: /ਰਾਤ|ਸਵੇਰ|ਦੁਪਹਿਰ|ਸ਼ਾਮ/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'ਰਾਤ') { + return hour < 4 ? hour : hour + 12; + } else if (meridiem === 'ਸਵੇਰ') { + return hour; + } else if (meridiem === 'ਦੁਪਹਿਰ') { + return hour >= 10 ? hour : hour + 12; + } else if (meridiem === 'ਸ਼ਾਮ') { + return hour + 12; + } + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'ਰਾਤ'; + } else if (hour < 10) { + return 'ਸਵੇਰ'; + } else if (hour < 17) { + return 'ਦੁਪਹਿਰ'; + } else if (hour < 20) { + return 'ਸ਼ਾਮ'; + } else { + return 'ਰਾਤ'; + } + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + //! locale : polish (pl) + //! author : Rafal Hirsz : https://github.com/evoL + + var monthsNominative = 'styczeń_luty_marzec_kwiecień_maj_czerwiec_lipiec_sierpień_wrzesień_październik_listopad_grudzień'.split('_'), + monthsSubjective = 'stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_września_października_listopada_grudnia'.split('_'); + function pl__plural(n) { + return (n % 10 < 5) && (n % 10 > 1) && ((~~(n / 10) % 10) !== 1); + } + function pl__translate(number, withoutSuffix, key) { + var result = number + ' '; + switch (key) { + case 'm': + return withoutSuffix ? 'minuta' : 'minutę'; + case 'mm': + return result + (pl__plural(number) ? 'minuty' : 'minut'); + case 'h': + return withoutSuffix ? 'godzina' : 'godzinę'; + case 'hh': + return result + (pl__plural(number) ? 'godziny' : 'godzin'); + case 'MM': + return result + (pl__plural(number) ? 'miesiące' : 'miesięcy'); + case 'yy': + return result + (pl__plural(number) ? 'lata' : 'lat'); + } + } + + var pl = moment__default.defineLocale('pl', { + months : function (momentToFormat, format) { + if (format === '') { + // Hack: if format empty we know this is used to generate + // RegExp by moment. Give then back both valid forms of months + // in RegExp ready format. + return '(' + monthsSubjective[momentToFormat.month()] + '|' + monthsNominative[momentToFormat.month()] + ')'; + } else if (/D MMMM/.test(format)) { + return monthsSubjective[momentToFormat.month()]; + } else { + return monthsNominative[momentToFormat.month()]; + } + }, + monthsShort : 'sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru'.split('_'), + weekdays : 'niedziela_poniedziałek_wtorek_środa_czwartek_piątek_sobota'.split('_'), + weekdaysShort : 'nie_pon_wt_śr_czw_pt_sb'.split('_'), + weekdaysMin : 'Nd_Pn_Wt_Śr_Cz_Pt_So'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd, D MMMM YYYY HH:mm' + }, + calendar : { + sameDay: '[Dziś o] LT', + nextDay: '[Jutro o] LT', + nextWeek: '[W] dddd [o] LT', + lastDay: '[Wczoraj o] LT', + lastWeek: function () { + switch (this.day()) { + case 0: + return '[W zeszłą niedzielę o] LT'; + case 3: + return '[W zeszłą środę o] LT'; + case 6: + return '[W zeszłą sobotę o] LT'; + default: + return '[W zeszły] dddd [o] LT'; + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'za %s', + past : '%s temu', + s : 'kilka sekund', + m : pl__translate, + mm : pl__translate, + h : pl__translate, + hh : pl__translate, + d : '1 dzień', + dd : '%d dni', + M : 'miesiąc', + MM : pl__translate, + y : 'rok', + yy : pl__translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + //! moment.js locale configuration + //! locale : brazilian portuguese (pt-br) + //! author : Caio Ribeiro Pereira : https://github.com/caio-ribeiro-pereira + + var pt_br = moment__default.defineLocale('pt-br', { + months : 'Janeiro_Fevereiro_Março_Abril_Maio_Junho_Julho_Agosto_Setembro_Outubro_Novembro_Dezembro'.split('_'), + monthsShort : 'Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez'.split('_'), + weekdays : 'Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado'.split('_'), + weekdaysShort : 'Dom_Seg_Ter_Qua_Qui_Sex_Sáb'.split('_'), + weekdaysMin : 'Dom_2ª_3ª_4ª_5ª_6ª_Sáb'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D [de] MMMM [de] YYYY', + LLL : 'D [de] MMMM [de] YYYY [às] HH:mm', + LLLL : 'dddd, D [de] MMMM [de] YYYY [às] HH:mm' + }, + calendar : { + sameDay: '[Hoje às] LT', + nextDay: '[Amanhã às] LT', + nextWeek: 'dddd [às] LT', + lastDay: '[Ontem às] LT', + lastWeek: function () { + return (this.day() === 0 || this.day() === 6) ? + '[Último] dddd [às] LT' : // Saturday + Sunday + '[Última] dddd [às] LT'; // Monday - Friday + }, + sameElse: 'L' + }, + relativeTime : { + future : 'em %s', + past : '%s atrás', + s : 'poucos segundos', + m : 'um minuto', + mm : '%d minutos', + h : 'uma hora', + hh : '%d horas', + d : 'um dia', + dd : '%d dias', + M : 'um mês', + MM : '%d meses', + y : 'um ano', + yy : '%d anos' + }, + ordinalParse: /\d{1,2}º/, + ordinal : '%dº' + }); + + //! moment.js locale configuration + //! locale : portuguese (pt) + //! author : Jefferson : https://github.com/jalex79 + + var pt = moment__default.defineLocale('pt', { + months : 'Janeiro_Fevereiro_Março_Abril_Maio_Junho_Julho_Agosto_Setembro_Outubro_Novembro_Dezembro'.split('_'), + monthsShort : 'Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez'.split('_'), + weekdays : 'Domingo_Segunda-Feira_Terça-Feira_Quarta-Feira_Quinta-Feira_Sexta-Feira_Sábado'.split('_'), + weekdaysShort : 'Dom_Seg_Ter_Qua_Qui_Sex_Sáb'.split('_'), + weekdaysMin : 'Dom_2ª_3ª_4ª_5ª_6ª_Sáb'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D [de] MMMM [de] YYYY', + LLL : 'D [de] MMMM [de] YYYY HH:mm', + LLLL : 'dddd, D [de] MMMM [de] YYYY HH:mm' + }, + calendar : { + sameDay: '[Hoje às] LT', + nextDay: '[Amanhã às] LT', + nextWeek: 'dddd [às] LT', + lastDay: '[Ontem às] LT', + lastWeek: function () { + return (this.day() === 0 || this.day() === 6) ? + '[Último] dddd [às] LT' : // Saturday + Sunday + '[Última] dddd [às] LT'; // Monday - Friday + }, + sameElse: 'L' + }, + relativeTime : { + future : 'em %s', + past : 'há %s', + s : 'segundos', + m : 'um minuto', + mm : '%d minutos', + h : 'uma hora', + hh : '%d horas', + d : 'um dia', + dd : '%d dias', + M : 'um mês', + MM : '%d meses', + y : 'um ano', + yy : '%d anos' + }, + ordinalParse: /\d{1,2}º/, + ordinal : '%dº', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + //! moment.js locale configuration + //! locale : romanian (ro) + //! author : Vlad Gurdiga : https://github.com/gurdiga + //! author : Valentin Agachi : https://github.com/avaly + + function ro__relativeTimeWithPlural(number, withoutSuffix, key) { + var format = { + 'mm': 'minute', + 'hh': 'ore', + 'dd': 'zile', + 'MM': 'luni', + 'yy': 'ani' + }, + separator = ' '; + if (number % 100 >= 20 || (number >= 100 && number % 100 === 0)) { + separator = ' de '; + } + return number + separator + format[key]; + } + + var ro = moment__default.defineLocale('ro', { + months : 'ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie'.split('_'), + monthsShort : 'ian._febr._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.'.split('_'), + weekdays : 'duminică_luni_marți_miercuri_joi_vineri_sâmbătă'.split('_'), + weekdaysShort : 'Dum_Lun_Mar_Mie_Joi_Vin_Sâm'.split('_'), + weekdaysMin : 'Du_Lu_Ma_Mi_Jo_Vi_Sâ'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'H:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY H:mm', + LLLL : 'dddd, D MMMM YYYY H:mm' + }, + calendar : { + sameDay: '[azi la] LT', + nextDay: '[mâine la] LT', + nextWeek: 'dddd [la] LT', + lastDay: '[ieri la] LT', + lastWeek: '[fosta] dddd [la] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'peste %s', + past : '%s în urmă', + s : 'câteva secunde', + m : 'un minut', + mm : ro__relativeTimeWithPlural, + h : 'o oră', + hh : ro__relativeTimeWithPlural, + d : 'o zi', + dd : ro__relativeTimeWithPlural, + M : 'o lună', + MM : ro__relativeTimeWithPlural, + y : 'un an', + yy : ro__relativeTimeWithPlural + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + //! locale : russian (ru) + //! author : Viktorminator : https://github.com/Viktorminator + //! Author : Menelion Elensúle : https://github.com/Oire + //! author : Коренберг Марк : https://github.com/socketpair + + function ru__plural(word, num) { + var forms = word.split('_'); + return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]); + } + function ru__relativeTimeWithPlural(number, withoutSuffix, key) { + var format = { + 'mm': withoutSuffix ? 'минута_минуты_минут' : 'минуту_минуты_минут', + 'hh': 'час_часа_часов', + 'dd': 'день_дня_дней', + 'MM': 'месяц_месяца_месяцев', + 'yy': 'год_года_лет' + }; + if (key === 'm') { + return withoutSuffix ? 'минута' : 'минуту'; + } + else { + return number + ' ' + ru__plural(format[key], +number); + } + } + var monthsParse = [/^янв/i, /^фев/i, /^мар/i, /^апр/i, /^ма[й|я]/i, /^июн/i, /^июл/i, /^авг/i, /^сен/i, /^окт/i, /^ноя/i, /^дек/i]; + + // http://new.gramota.ru/spravka/rules/139-prop : § 103 + var ru = moment__default.defineLocale('ru', { + months : { + format: 'января_февраля_марта_апреля_мая_июня_июля_августа_сентября_октября_ноября_декабря'.split('_'), + standalone: 'январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь'.split('_') + }, + monthsShort : { + format: 'янв_фев_мар_апр_мая_июня_июля_авг_сен_окт_ноя_дек'.split('_'), + standalone: 'янв_фев_март_апр_май_июнь_июль_авг_сен_окт_ноя_дек'.split('_') + }, + weekdays : { + standalone: 'воскресенье_понедельник_вторник_среда_четверг_пятница_суббота'.split('_'), + format: 'воскресенье_понедельник_вторник_среду_четверг_пятницу_субботу'.split('_'), + isFormat: /\[ ?[Вв] ?(?:прошлую|следующую|эту)? ?\] ?dddd/ + }, + weekdaysShort : 'вс_пн_вт_ср_чт_пт_сб'.split('_'), + weekdaysMin : 'вс_пн_вт_ср_чт_пт_сб'.split('_'), + monthsParse : monthsParse, + longMonthsParse : monthsParse, + shortMonthsParse : monthsParse, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY г.', + LLL : 'D MMMM YYYY г., HH:mm', + LLLL : 'dddd, D MMMM YYYY г., HH:mm' + }, + calendar : { + sameDay: '[Сегодня в] LT', + nextDay: '[Завтра в] LT', + lastDay: '[Вчера в] LT', + nextWeek: function (now) { + if (now.week() !== this.week()) { + switch (this.day()) { + case 0: + return '[В следующее] dddd [в] LT'; + case 1: + case 2: + case 4: + return '[В следующий] dddd [в] LT'; + case 3: + case 5: + case 6: + return '[В следующую] dddd [в] LT'; + } + } else { + if (this.day() === 2) { + return '[Во] dddd [в] LT'; + } else { + return '[В] dddd [в] LT'; + } + } + }, + lastWeek: function (now) { + if (now.week() !== this.week()) { + switch (this.day()) { + case 0: + return '[В прошлое] dddd [в] LT'; + case 1: + case 2: + case 4: + return '[В прошлый] dddd [в] LT'; + case 3: + case 5: + case 6: + return '[В прошлую] dddd [в] LT'; + } + } else { + if (this.day() === 2) { + return '[Во] dddd [в] LT'; + } else { + return '[В] dddd [в] LT'; + } + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'через %s', + past : '%s назад', + s : 'несколько секунд', + m : ru__relativeTimeWithPlural, + mm : ru__relativeTimeWithPlural, + h : 'час', + hh : ru__relativeTimeWithPlural, + d : 'день', + dd : ru__relativeTimeWithPlural, + M : 'месяц', + MM : ru__relativeTimeWithPlural, + y : 'год', + yy : ru__relativeTimeWithPlural + }, + meridiemParse: /ночи|утра|дня|вечера/i, + isPM : function (input) { + return /^(дня|вечера)$/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'ночи'; + } else if (hour < 12) { + return 'утра'; + } else if (hour < 17) { + return 'дня'; + } else { + return 'вечера'; + } + }, + ordinalParse: /\d{1,2}-(й|го|я)/, + ordinal: function (number, period) { + switch (period) { + case 'M': + case 'd': + case 'DDD': + return number + '-й'; + case 'D': + return number + '-го'; + case 'w': + case 'W': + return number + '-я'; + default: + return number; + } + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + //! locale : Northern Sami (se) + //! authors : Bård Rolstad Henriksen : https://github.com/karamell + + + var se = moment__default.defineLocale('se', { + months : 'ođđajagemánnu_guovvamánnu_njukčamánnu_cuoŋománnu_miessemánnu_geassemánnu_suoidnemánnu_borgemánnu_čakčamánnu_golggotmánnu_skábmamánnu_juovlamánnu'.split('_'), + monthsShort : 'ođđj_guov_njuk_cuo_mies_geas_suoi_borg_čakč_golg_skáb_juov'.split('_'), + weekdays : 'sotnabeaivi_vuossárga_maŋŋebárga_gaskavahkku_duorastat_bearjadat_lávvardat'.split('_'), + weekdaysShort : 'sotn_vuos_maŋ_gask_duor_bear_láv'.split('_'), + weekdaysMin : 's_v_m_g_d_b_L'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'MMMM D. [b.] YYYY', + LLL : 'MMMM D. [b.] YYYY [ti.] HH:mm', + LLLL : 'dddd, MMMM D. [b.] YYYY [ti.] HH:mm' + }, + calendar : { + sameDay: '[otne ti] LT', + nextDay: '[ihttin ti] LT', + nextWeek: 'dddd [ti] LT', + lastDay: '[ikte ti] LT', + lastWeek: '[ovddit] dddd [ti] LT', + sameElse: 'L' + }, + relativeTime : { + future : '%s geažes', + past : 'maŋit %s', + s : 'moadde sekunddat', + m : 'okta minuhta', + mm : '%d minuhtat', + h : 'okta diimmu', + hh : '%d diimmut', + d : 'okta beaivi', + dd : '%d beaivvit', + M : 'okta mánnu', + MM : '%d mánut', + y : 'okta jahki', + yy : '%d jagit' + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + //! moment.js locale configuration + //! locale : Sinhalese (si) + //! author : Sampath Sitinamaluwa : https://github.com/sampathsris + + /*jshint -W100*/ + var si = moment__default.defineLocale('si', { + months : 'ජනවාරි_පෙබරවාරි_මාර්තු_අප්‍රේල්_මැයි_ජූනි_ජූලි_අගෝස්තු_සැප්තැම්බර්_ඔක්තෝබර්_නොවැම්බර්_දෙසැම්බර්'.split('_'), + monthsShort : 'ජන_පෙබ_මාර්_අප්_මැයි_ජූනි_ජූලි_අගෝ_සැප්_ඔක්_නොවැ_දෙසැ'.split('_'), + weekdays : 'ඉරිදා_සඳුදා_අඟහරුවාදා_බදාදා_බ්‍රහස්පතින්දා_සිකුරාදා_සෙනසුරාදා'.split('_'), + weekdaysShort : 'ඉරි_සඳු_අඟ_බදා_බ්‍රහ_සිකු_සෙන'.split('_'), + weekdaysMin : 'ඉ_ස_අ_බ_බ්‍ර_සි_සෙ'.split('_'), + longDateFormat : { + LT : 'a h:mm', + LTS : 'a h:mm:ss', + L : 'YYYY/MM/DD', + LL : 'YYYY MMMM D', + LLL : 'YYYY MMMM D, a h:mm', + LLLL : 'YYYY MMMM D [වැනි] dddd, a h:mm:ss' + }, + calendar : { + sameDay : '[අද] LT[ට]', + nextDay : '[හෙට] LT[ට]', + nextWeek : 'dddd LT[ට]', + lastDay : '[ඊයේ] LT[ට]', + lastWeek : '[පසුගිය] dddd LT[ට]', + sameElse : 'L' + }, + relativeTime : { + future : '%sකින්', + past : '%sකට පෙර', + s : 'තත්පර කිහිපය', + m : 'මිනිත්තුව', + mm : 'මිනිත්තු %d', + h : 'පැය', + hh : 'පැය %d', + d : 'දිනය', + dd : 'දින %d', + M : 'මාසය', + MM : 'මාස %d', + y : 'වසර', + yy : 'වසර %d' + }, + ordinalParse: /\d{1,2} වැනි/, + ordinal : function (number) { + return number + ' වැනි'; + }, + meridiemParse : /පෙර වරු|පස් වරු|පෙ.ව|ප.ව./, + isPM : function (input) { + return input === 'ප.ව.' || input === 'පස් වරු'; + }, + meridiem : function (hours, minutes, isLower) { + if (hours > 11) { + return isLower ? 'ප.ව.' : 'පස් වරු'; + } else { + return isLower ? 'පෙ.ව.' : 'පෙර වරු'; + } + } + }); + + //! moment.js locale configuration + //! locale : slovak (sk) + //! author : Martin Minka : https://github.com/k2s + //! based on work of petrbela : https://github.com/petrbela + + var sk__months = 'január_február_marec_apríl_máj_jún_júl_august_september_október_november_december'.split('_'), + sk__monthsShort = 'jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec'.split('_'); + function sk__plural(n) { + return (n > 1) && (n < 5); + } + function sk__translate(number, withoutSuffix, key, isFuture) { + var result = number + ' '; + switch (key) { + case 's': // a few seconds / in a few seconds / a few seconds ago + return (withoutSuffix || isFuture) ? 'pár sekúnd' : 'pár sekundami'; + case 'm': // a minute / in a minute / a minute ago + return withoutSuffix ? 'minúta' : (isFuture ? 'minútu' : 'minútou'); + case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago + if (withoutSuffix || isFuture) { + return result + (sk__plural(number) ? 'minúty' : 'minút'); + } else { + return result + 'minútami'; + } + break; + case 'h': // an hour / in an hour / an hour ago + return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou'); + case 'hh': // 9 hours / in 9 hours / 9 hours ago + if (withoutSuffix || isFuture) { + return result + (sk__plural(number) ? 'hodiny' : 'hodín'); + } else { + return result + 'hodinami'; + } + break; + case 'd': // a day / in a day / a day ago + return (withoutSuffix || isFuture) ? 'deň' : 'dňom'; + case 'dd': // 9 days / in 9 days / 9 days ago + if (withoutSuffix || isFuture) { + return result + (sk__plural(number) ? 'dni' : 'dní'); + } else { + return result + 'dňami'; + } + break; + case 'M': // a month / in a month / a month ago + return (withoutSuffix || isFuture) ? 'mesiac' : 'mesiacom'; + case 'MM': // 9 months / in 9 months / 9 months ago + if (withoutSuffix || isFuture) { + return result + (sk__plural(number) ? 'mesiace' : 'mesiacov'); + } else { + return result + 'mesiacmi'; + } + break; + case 'y': // a year / in a year / a year ago + return (withoutSuffix || isFuture) ? 'rok' : 'rokom'; + case 'yy': // 9 years / in 9 years / 9 years ago + if (withoutSuffix || isFuture) { + return result + (sk__plural(number) ? 'roky' : 'rokov'); + } else { + return result + 'rokmi'; + } + break; + } + } + + var sk = moment__default.defineLocale('sk', { + months : sk__months, + monthsShort : sk__monthsShort, + weekdays : 'nedeľa_pondelok_utorok_streda_štvrtok_piatok_sobota'.split('_'), + weekdaysShort : 'ne_po_ut_st_št_pi_so'.split('_'), + weekdaysMin : 'ne_po_ut_st_št_pi_so'.split('_'), + longDateFormat : { + LT: 'H:mm', + LTS : 'H:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY H:mm', + LLLL : 'dddd D. MMMM YYYY H:mm' + }, + calendar : { + sameDay: '[dnes o] LT', + nextDay: '[zajtra o] LT', + nextWeek: function () { + switch (this.day()) { + case 0: + return '[v nedeľu o] LT'; + case 1: + case 2: + return '[v] dddd [o] LT'; + case 3: + return '[v stredu o] LT'; + case 4: + return '[vo štvrtok o] LT'; + case 5: + return '[v piatok o] LT'; + case 6: + return '[v sobotu o] LT'; + } + }, + lastDay: '[včera o] LT', + lastWeek: function () { + switch (this.day()) { + case 0: + return '[minulú nedeľu o] LT'; + case 1: + case 2: + return '[minulý] dddd [o] LT'; + case 3: + return '[minulú stredu o] LT'; + case 4: + case 5: + return '[minulý] dddd [o] LT'; + case 6: + return '[minulú sobotu o] LT'; + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'za %s', + past : 'pred %s', + s : sk__translate, + m : sk__translate, + mm : sk__translate, + h : sk__translate, + hh : sk__translate, + d : sk__translate, + dd : sk__translate, + M : sk__translate, + MM : sk__translate, + y : sk__translate, + yy : sk__translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + //! moment.js locale configuration + //! locale : slovenian (sl) + //! author : Robert Sedovšek : https://github.com/sedovsek + + function sl__processRelativeTime(number, withoutSuffix, key, isFuture) { + var result = number + ' '; + switch (key) { + case 's': + return withoutSuffix || isFuture ? 'nekaj sekund' : 'nekaj sekundami'; + case 'm': + return withoutSuffix ? 'ena minuta' : 'eno minuto'; + case 'mm': + if (number === 1) { + result += withoutSuffix ? 'minuta' : 'minuto'; + } else if (number === 2) { + result += withoutSuffix || isFuture ? 'minuti' : 'minutama'; + } else if (number < 5) { + result += withoutSuffix || isFuture ? 'minute' : 'minutami'; + } else { + result += withoutSuffix || isFuture ? 'minut' : 'minutami'; + } + return result; + case 'h': + return withoutSuffix ? 'ena ura' : 'eno uro'; + case 'hh': + if (number === 1) { + result += withoutSuffix ? 'ura' : 'uro'; + } else if (number === 2) { + result += withoutSuffix || isFuture ? 'uri' : 'urama'; + } else if (number < 5) { + result += withoutSuffix || isFuture ? 'ure' : 'urami'; + } else { + result += withoutSuffix || isFuture ? 'ur' : 'urami'; + } + return result; + case 'd': + return withoutSuffix || isFuture ? 'en dan' : 'enim dnem'; + case 'dd': + if (number === 1) { + result += withoutSuffix || isFuture ? 'dan' : 'dnem'; + } else if (number === 2) { + result += withoutSuffix || isFuture ? 'dni' : 'dnevoma'; + } else { + result += withoutSuffix || isFuture ? 'dni' : 'dnevi'; + } + return result; + case 'M': + return withoutSuffix || isFuture ? 'en mesec' : 'enim mesecem'; + case 'MM': + if (number === 1) { + result += withoutSuffix || isFuture ? 'mesec' : 'mesecem'; + } else if (number === 2) { + result += withoutSuffix || isFuture ? 'meseca' : 'mesecema'; + } else if (number < 5) { + result += withoutSuffix || isFuture ? 'mesece' : 'meseci'; + } else { + result += withoutSuffix || isFuture ? 'mesecev' : 'meseci'; + } + return result; + case 'y': + return withoutSuffix || isFuture ? 'eno leto' : 'enim letom'; + case 'yy': + if (number === 1) { + result += withoutSuffix || isFuture ? 'leto' : 'letom'; + } else if (number === 2) { + result += withoutSuffix || isFuture ? 'leti' : 'letoma'; + } else if (number < 5) { + result += withoutSuffix || isFuture ? 'leta' : 'leti'; + } else { + result += withoutSuffix || isFuture ? 'let' : 'leti'; + } + return result; + } + } + + var sl = moment__default.defineLocale('sl', { + months : 'januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december'.split('_'), + monthsShort : 'jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.'.split('_'), + weekdays : 'nedelja_ponedeljek_torek_sreda_četrtek_petek_sobota'.split('_'), + weekdaysShort : 'ned._pon._tor._sre._čet._pet._sob.'.split('_'), + weekdaysMin : 'ne_po_to_sr_če_pe_so'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'H:mm:ss', + L : 'DD. MM. YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY H:mm', + LLLL : 'dddd, D. MMMM YYYY H:mm' + }, + calendar : { + sameDay : '[danes ob] LT', + nextDay : '[jutri ob] LT', + + nextWeek : function () { + switch (this.day()) { + case 0: + return '[v] [nedeljo] [ob] LT'; + case 3: + return '[v] [sredo] [ob] LT'; + case 6: + return '[v] [soboto] [ob] LT'; + case 1: + case 2: + case 4: + case 5: + return '[v] dddd [ob] LT'; + } + }, + lastDay : '[včeraj ob] LT', + lastWeek : function () { + switch (this.day()) { + case 0: + return '[prejšnjo] [nedeljo] [ob] LT'; + case 3: + return '[prejšnjo] [sredo] [ob] LT'; + case 6: + return '[prejšnjo] [soboto] [ob] LT'; + case 1: + case 2: + case 4: + case 5: + return '[prejšnji] dddd [ob] LT'; + } + }, + sameElse : 'L' + }, + relativeTime : { + future : 'čez %s', + past : 'pred %s', + s : sl__processRelativeTime, + m : sl__processRelativeTime, + mm : sl__processRelativeTime, + h : sl__processRelativeTime, + hh : sl__processRelativeTime, + d : sl__processRelativeTime, + dd : sl__processRelativeTime, + M : sl__processRelativeTime, + MM : sl__processRelativeTime, + y : sl__processRelativeTime, + yy : sl__processRelativeTime + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + //! locale : Albanian (sq) + //! author : Flakërim Ismani : https://github.com/flakerimi + //! author: Menelion Elensúle: https://github.com/Oire (tests) + //! author : Oerd Cukalla : https://github.com/oerd (fixes) + + var sq = moment__default.defineLocale('sq', { + months : 'Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_Nëntor_Dhjetor'.split('_'), + monthsShort : 'Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_Nën_Dhj'.split('_'), + weekdays : 'E Diel_E Hënë_E Martë_E Mërkurë_E Enjte_E Premte_E Shtunë'.split('_'), + weekdaysShort : 'Die_Hën_Mar_Mër_Enj_Pre_Sht'.split('_'), + weekdaysMin : 'D_H_Ma_Më_E_P_Sh'.split('_'), + meridiemParse: /PD|MD/, + isPM: function (input) { + return input.charAt(0) === 'M'; + }, + meridiem : function (hours, minutes, isLower) { + return hours < 12 ? 'PD' : 'MD'; + }, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd, D MMMM YYYY HH:mm' + }, + calendar : { + sameDay : '[Sot në] LT', + nextDay : '[Nesër në] LT', + nextWeek : 'dddd [në] LT', + lastDay : '[Dje në] LT', + lastWeek : 'dddd [e kaluar në] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'në %s', + past : '%s më parë', + s : 'disa sekonda', + m : 'një minutë', + mm : '%d minuta', + h : 'një orë', + hh : '%d orë', + d : 'një ditë', + dd : '%d ditë', + M : 'një muaj', + MM : '%d muaj', + y : 'një vit', + yy : '%d vite' + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + //! moment.js locale configuration + //! locale : Serbian-cyrillic (sr-cyrl) + //! author : Milan Janačković : https://github.com/milan-j + + var sr_cyrl__translator = { + words: { //Different grammatical cases + m: ['један минут', 'једне минуте'], + mm: ['минут', 'минуте', 'минута'], + h: ['један сат', 'једног сата'], + hh: ['сат', 'сата', 'сати'], + dd: ['дан', 'дана', 'дана'], + MM: ['месец', 'месеца', 'месеци'], + yy: ['година', 'године', 'година'] + }, + correctGrammaticalCase: function (number, wordKey) { + return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]); + }, + translate: function (number, withoutSuffix, key) { + var wordKey = sr_cyrl__translator.words[key]; + if (key.length === 1) { + return withoutSuffix ? wordKey[0] : wordKey[1]; + } else { + return number + ' ' + sr_cyrl__translator.correctGrammaticalCase(number, wordKey); + } + } + }; + + var sr_cyrl = moment__default.defineLocale('sr-cyrl', { + months: ['јануар', 'фебруар', 'март', 'април', 'мај', 'јун', 'јул', 'август', 'септембар', 'октобар', 'новембар', 'децембар'], + monthsShort: ['јан.', 'феб.', 'мар.', 'апр.', 'мај', 'јун', 'јул', 'авг.', 'сеп.', 'окт.', 'нов.', 'дец.'], + weekdays: ['недеља', 'понедељак', 'уторак', 'среда', 'четвртак', 'петак', 'субота'], + weekdaysShort: ['нед.', 'пон.', 'уто.', 'сре.', 'чет.', 'пет.', 'суб.'], + weekdaysMin: ['не', 'по', 'ут', 'ср', 'че', 'пе', 'су'], + longDateFormat: { + LT: 'H:mm', + LTS : 'H:mm:ss', + L: 'DD. MM. YYYY', + LL: 'D. MMMM YYYY', + LLL: 'D. MMMM YYYY H:mm', + LLLL: 'dddd, D. MMMM YYYY H:mm' + }, + calendar: { + sameDay: '[данас у] LT', + nextDay: '[сутра у] LT', + nextWeek: function () { + switch (this.day()) { + case 0: + return '[у] [недељу] [у] LT'; + case 3: + return '[у] [среду] [у] LT'; + case 6: + return '[у] [суботу] [у] LT'; + case 1: + case 2: + case 4: + case 5: + return '[у] dddd [у] LT'; + } + }, + lastDay : '[јуче у] LT', + lastWeek : function () { + var lastWeekDays = [ + '[прошле] [недеље] [у] LT', + '[прошлог] [понедељка] [у] LT', + '[прошлог] [уторка] [у] LT', + '[прошле] [среде] [у] LT', + '[прошлог] [четвртка] [у] LT', + '[прошлог] [петка] [у] LT', + '[прошле] [суботе] [у] LT' + ]; + return lastWeekDays[this.day()]; + }, + sameElse : 'L' + }, + relativeTime : { + future : 'за %s', + past : 'пре %s', + s : 'неколико секунди', + m : sr_cyrl__translator.translate, + mm : sr_cyrl__translator.translate, + h : sr_cyrl__translator.translate, + hh : sr_cyrl__translator.translate, + d : 'дан', + dd : sr_cyrl__translator.translate, + M : 'месец', + MM : sr_cyrl__translator.translate, + y : 'годину', + yy : sr_cyrl__translator.translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + //! locale : Serbian-latin (sr) + //! author : Milan Janačković : https://github.com/milan-j + + var sr__translator = { + words: { //Different grammatical cases + m: ['jedan minut', 'jedne minute'], + mm: ['minut', 'minute', 'minuta'], + h: ['jedan sat', 'jednog sata'], + hh: ['sat', 'sata', 'sati'], + dd: ['dan', 'dana', 'dana'], + MM: ['mesec', 'meseca', 'meseci'], + yy: ['godina', 'godine', 'godina'] + }, + correctGrammaticalCase: function (number, wordKey) { + return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]); + }, + translate: function (number, withoutSuffix, key) { + var wordKey = sr__translator.words[key]; + if (key.length === 1) { + return withoutSuffix ? wordKey[0] : wordKey[1]; + } else { + return number + ' ' + sr__translator.correctGrammaticalCase(number, wordKey); + } + } + }; + + var sr = moment__default.defineLocale('sr', { + months: ['januar', 'februar', 'mart', 'april', 'maj', 'jun', 'jul', 'avgust', 'septembar', 'oktobar', 'novembar', 'decembar'], + monthsShort: ['jan.', 'feb.', 'mar.', 'apr.', 'maj', 'jun', 'jul', 'avg.', 'sep.', 'okt.', 'nov.', 'dec.'], + weekdays: ['nedelja', 'ponedeljak', 'utorak', 'sreda', 'četvrtak', 'petak', 'subota'], + weekdaysShort: ['ned.', 'pon.', 'uto.', 'sre.', 'čet.', 'pet.', 'sub.'], + weekdaysMin: ['ne', 'po', 'ut', 'sr', 'če', 'pe', 'su'], + longDateFormat: { + LT: 'H:mm', + LTS : 'H:mm:ss', + L: 'DD. MM. YYYY', + LL: 'D. MMMM YYYY', + LLL: 'D. MMMM YYYY H:mm', + LLLL: 'dddd, D. MMMM YYYY H:mm' + }, + calendar: { + sameDay: '[danas u] LT', + nextDay: '[sutra u] LT', + nextWeek: function () { + switch (this.day()) { + case 0: + return '[u] [nedelju] [u] LT'; + case 3: + return '[u] [sredu] [u] LT'; + case 6: + return '[u] [subotu] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[u] dddd [u] LT'; + } + }, + lastDay : '[juče u] LT', + lastWeek : function () { + var lastWeekDays = [ + '[prošle] [nedelje] [u] LT', + '[prošlog] [ponedeljka] [u] LT', + '[prošlog] [utorka] [u] LT', + '[prošle] [srede] [u] LT', + '[prošlog] [četvrtka] [u] LT', + '[prošlog] [petka] [u] LT', + '[prošle] [subote] [u] LT' + ]; + return lastWeekDays[this.day()]; + }, + sameElse : 'L' + }, + relativeTime : { + future : 'za %s', + past : 'pre %s', + s : 'nekoliko sekundi', + m : sr__translator.translate, + mm : sr__translator.translate, + h : sr__translator.translate, + hh : sr__translator.translate, + d : 'dan', + dd : sr__translator.translate, + M : 'mesec', + MM : sr__translator.translate, + y : 'godinu', + yy : sr__translator.translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + //! locale : swedish (sv) + //! author : Jens Alm : https://github.com/ulmus + + var sv = moment__default.defineLocale('sv', { + months : 'januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december'.split('_'), + monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'), + weekdays : 'söndag_måndag_tisdag_onsdag_torsdag_fredag_lördag'.split('_'), + weekdaysShort : 'sön_mån_tis_ons_tor_fre_lör'.split('_'), + weekdaysMin : 'sö_må_ti_on_to_fr_lö'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'YYYY-MM-DD', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd D MMMM YYYY HH:mm' + }, + calendar : { + sameDay: '[Idag] LT', + nextDay: '[Imorgon] LT', + lastDay: '[Igår] LT', + nextWeek: '[På] dddd LT', + lastWeek: '[I] dddd[s] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'om %s', + past : 'för %s sedan', + s : 'några sekunder', + m : 'en minut', + mm : '%d minuter', + h : 'en timme', + hh : '%d timmar', + d : 'en dag', + dd : '%d dagar', + M : 'en månad', + MM : '%d månader', + y : 'ett år', + yy : '%d år' + }, + ordinalParse: /\d{1,2}(e|a)/, + ordinal : function (number) { + var b = number % 10, + output = (~~(number % 100 / 10) === 1) ? 'e' : + (b === 1) ? 'a' : + (b === 2) ? 'a' : + (b === 3) ? 'e' : 'e'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + //! moment.js locale configuration + //! locale : swahili (sw) + //! author : Fahad Kassim : https://github.com/fadsel + + var sw = moment__default.defineLocale('sw', { + months : 'Januari_Februari_Machi_Aprili_Mei_Juni_Julai_Agosti_Septemba_Oktoba_Novemba_Desemba'.split('_'), + monthsShort : 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ago_Sep_Okt_Nov_Des'.split('_'), + weekdays : 'Jumapili_Jumatatu_Jumanne_Jumatano_Alhamisi_Ijumaa_Jumamosi'.split('_'), + weekdaysShort : 'Jpl_Jtat_Jnne_Jtan_Alh_Ijm_Jmos'.split('_'), + weekdaysMin : 'J2_J3_J4_J5_Al_Ij_J1'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd, D MMMM YYYY HH:mm' + }, + calendar : { + sameDay : '[leo saa] LT', + nextDay : '[kesho saa] LT', + nextWeek : '[wiki ijayo] dddd [saat] LT', + lastDay : '[jana] LT', + lastWeek : '[wiki iliyopita] dddd [saat] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s baadaye', + past : 'tokea %s', + s : 'hivi punde', + m : 'dakika moja', + mm : 'dakika %d', + h : 'saa limoja', + hh : 'masaa %d', + d : 'siku moja', + dd : 'masiku %d', + M : 'mwezi mmoja', + MM : 'miezi %d', + y : 'mwaka mmoja', + yy : 'miaka %d' + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + //! locale : tamil (ta) + //! author : Arjunkumar Krishnamoorthy : https://github.com/tk120404 + + var ta__symbolMap = { + '1': '௧', + '2': '௨', + '3': '௩', + '4': '௪', + '5': '௫', + '6': '௬', + '7': '௭', + '8': '௮', + '9': '௯', + '0': '௦' + }, ta__numberMap = { + '௧': '1', + '௨': '2', + '௩': '3', + '௪': '4', + '௫': '5', + '௬': '6', + '௭': '7', + '௮': '8', + '௯': '9', + '௦': '0' + }; + + var ta = moment__default.defineLocale('ta', { + months : 'ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்'.split('_'), + monthsShort : 'ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்'.split('_'), + weekdays : 'ஞாயிற்றுக்கிழமை_திங்கட்கிழமை_செவ்வாய்கிழமை_புதன்கிழமை_வியாழக்கிழமை_வெள்ளிக்கிழமை_சனிக்கிழமை'.split('_'), + weekdaysShort : 'ஞாயிறு_திங்கள்_செவ்வாய்_புதன்_வியாழன்_வெள்ளி_சனி'.split('_'), + weekdaysMin : 'ஞா_தி_செ_பு_வி_வெ_ச'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, HH:mm', + LLLL : 'dddd, D MMMM YYYY, HH:mm' + }, + calendar : { + sameDay : '[இன்று] LT', + nextDay : '[நாளை] LT', + nextWeek : 'dddd, LT', + lastDay : '[நேற்று] LT', + lastWeek : '[கடந்த வாரம்] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s இல்', + past : '%s முன்', + s : 'ஒரு சில விநாடிகள்', + m : 'ஒரு நிமிடம்', + mm : '%d நிமிடங்கள்', + h : 'ஒரு மணி நேரம்', + hh : '%d மணி நேரம்', + d : 'ஒரு நாள்', + dd : '%d நாட்கள்', + M : 'ஒரு மாதம்', + MM : '%d மாதங்கள்', + y : 'ஒரு வருடம்', + yy : '%d ஆண்டுகள்' + }, + ordinalParse: /\d{1,2}வது/, + ordinal : function (number) { + return number + 'வது'; + }, + preparse: function (string) { + return string.replace(/[௧௨௩௪௫௬௭௮௯௦]/g, function (match) { + return ta__numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return ta__symbolMap[match]; + }); + }, + // refer http://ta.wikipedia.org/s/1er1 + meridiemParse: /யாமம்|வைகறை|காலை|நண்பகல்|எற்பாடு|மாலை/, + meridiem : function (hour, minute, isLower) { + if (hour < 2) { + return ' யாமம்'; + } else if (hour < 6) { + return ' வைகறை'; // வைகறை + } else if (hour < 10) { + return ' காலை'; // காலை + } else if (hour < 14) { + return ' நண்பகல்'; // நண்பகல் + } else if (hour < 18) { + return ' எற்பாடு'; // எற்பாடு + } else if (hour < 22) { + return ' மாலை'; // மாலை + } else { + return ' யாமம்'; + } + }, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'யாமம்') { + return hour < 2 ? hour : hour + 12; + } else if (meridiem === 'வைகறை' || meridiem === 'காலை') { + return hour; + } else if (meridiem === 'நண்பகல்') { + return hour >= 10 ? hour : hour + 12; + } else { + return hour + 12; + } + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + //! locale : telugu (te) + //! author : Krishna Chaitanya Thota : https://github.com/kcthota + + var te = moment__default.defineLocale('te', { + months : 'జనవరి_ఫిబ్రవరి_మార్చి_ఏప్రిల్_మే_జూన్_జూలై_ఆగస్టు_సెప్టెంబర్_అక్టోబర్_నవంబర్_డిసెంబర్'.split('_'), + monthsShort : 'జన._ఫిబ్ర._మార్చి_ఏప్రి._మే_జూన్_జూలై_ఆగ._సెప్._అక్టో._నవ._డిసె.'.split('_'), + weekdays : 'ఆదివారం_సోమవారం_మంగళవారం_బుధవారం_గురువారం_శుక్రవారం_శనివారం'.split('_'), + weekdaysShort : 'ఆది_సోమ_మంగళ_బుధ_గురు_శుక్ర_శని'.split('_'), + weekdaysMin : 'ఆ_సో_మం_బు_గు_శు_శ'.split('_'), + longDateFormat : { + LT : 'A h:mm', + LTS : 'A h:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, A h:mm', + LLLL : 'dddd, D MMMM YYYY, A h:mm' + }, + calendar : { + sameDay : '[నేడు] LT', + nextDay : '[రేపు] LT', + nextWeek : 'dddd, LT', + lastDay : '[నిన్న] LT', + lastWeek : '[గత] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s లో', + past : '%s క్రితం', + s : 'కొన్ని క్షణాలు', + m : 'ఒక నిమిషం', + mm : '%d నిమిషాలు', + h : 'ఒక గంట', + hh : '%d గంటలు', + d : 'ఒక రోజు', + dd : '%d రోజులు', + M : 'ఒక నెల', + MM : '%d నెలలు', + y : 'ఒక సంవత్సరం', + yy : '%d సంవత్సరాలు' + }, + ordinalParse : /\d{1,2}వ/, + ordinal : '%dవ', + meridiemParse: /రాత్రి|ఉదయం|మధ్యాహ్నం|సాయంత్రం/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'రాత్రి') { + return hour < 4 ? hour : hour + 12; + } else if (meridiem === 'ఉదయం') { + return hour; + } else if (meridiem === 'మధ్యాహ్నం') { + return hour >= 10 ? hour : hour + 12; + } else if (meridiem === 'సాయంత్రం') { + return hour + 12; + } + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'రాత్రి'; + } else if (hour < 10) { + return 'ఉదయం'; + } else if (hour < 17) { + return 'మధ్యాహ్నం'; + } else if (hour < 20) { + return 'సాయంత్రం'; + } else { + return 'రాత్రి'; + } + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + //! locale : thai (th) + //! author : Kridsada Thanabulpong : https://github.com/sirn + + var th = moment__default.defineLocale('th', { + months : 'มกราคม_กุมภาพันธ์_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_กรกฎาคม_สิงหาคม_กันยายน_ตุลาคม_พฤศจิกายน_ธันวาคม'.split('_'), + monthsShort : 'มกรา_กุมภา_มีนา_เมษา_พฤษภา_มิถุนา_กรกฎา_สิงหา_กันยา_ตุลา_พฤศจิกา_ธันวา'.split('_'), + weekdays : 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุกร์_เสาร์'.split('_'), + weekdaysShort : 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุกร์_เสาร์'.split('_'), // yes, three characters difference + weekdaysMin : 'อา._จ._อ._พ._พฤ._ศ._ส.'.split('_'), + longDateFormat : { + LT : 'H นาฬิกา m นาที', + LTS : 'H นาฬิกา m นาที s วินาที', + L : 'YYYY/MM/DD', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY เวลา H นาฬิกา m นาที', + LLLL : 'วันddddที่ D MMMM YYYY เวลา H นาฬิกา m นาที' + }, + meridiemParse: /ก่อนเที่ยง|หลังเที่ยง/, + isPM: function (input) { + return input === 'หลังเที่ยง'; + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'ก่อนเที่ยง'; + } else { + return 'หลังเที่ยง'; + } + }, + calendar : { + sameDay : '[วันนี้ เวลา] LT', + nextDay : '[พรุ่งนี้ เวลา] LT', + nextWeek : 'dddd[หน้า เวลา] LT', + lastDay : '[เมื่อวานนี้ เวลา] LT', + lastWeek : '[วัน]dddd[ที่แล้ว เวลา] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'อีก %s', + past : '%sที่แล้ว', + s : 'ไม่กี่วินาที', + m : '1 นาที', + mm : '%d นาที', + h : '1 ชั่วโมง', + hh : '%d ชั่วโมง', + d : '1 วัน', + dd : '%d วัน', + M : '1 เดือน', + MM : '%d เดือน', + y : '1 ปี', + yy : '%d ปี' + } + }); + + //! moment.js locale configuration + //! locale : Tagalog/Filipino (tl-ph) + //! author : Dan Hagman + + var tl_ph = moment__default.defineLocale('tl-ph', { + months : 'Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre'.split('_'), + monthsShort : 'Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis'.split('_'), + weekdays : 'Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado'.split('_'), + weekdaysShort : 'Lin_Lun_Mar_Miy_Huw_Biy_Sab'.split('_'), + weekdaysMin : 'Li_Lu_Ma_Mi_Hu_Bi_Sab'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'MM/D/YYYY', + LL : 'MMMM D, YYYY', + LLL : 'MMMM D, YYYY HH:mm', + LLLL : 'dddd, MMMM DD, YYYY HH:mm' + }, + calendar : { + sameDay: '[Ngayon sa] LT', + nextDay: '[Bukas sa] LT', + nextWeek: 'dddd [sa] LT', + lastDay: '[Kahapon sa] LT', + lastWeek: 'dddd [huling linggo] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'sa loob ng %s', + past : '%s ang nakalipas', + s : 'ilang segundo', + m : 'isang minuto', + mm : '%d minuto', + h : 'isang oras', + hh : '%d oras', + d : 'isang araw', + dd : '%d araw', + M : 'isang buwan', + MM : '%d buwan', + y : 'isang taon', + yy : '%d taon' + }, + ordinalParse: /\d{1,2}/, + ordinal : function (number) { + return number; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + //! moment.js locale configuration + //! locale : Klingon (tlh) + //! author : Dominika Kruk : https://github.com/amaranthrose + + var numbersNouns = 'pagh_wa’_cha’_wej_loS_vagh_jav_Soch_chorgh_Hut'.split('_'); + + function translateFuture(output) { + var time = output; + time = (output.indexOf('jaj') !== -1) ? + time.slice(0, -3) + 'leS' : + (output.indexOf('jar') !== -1) ? + time.slice(0, -3) + 'waQ' : + (output.indexOf('DIS') !== -1) ? + time.slice(0, -3) + 'nem' : + time + ' pIq'; + return time; + } + + function translatePast(output) { + var time = output; + time = (output.indexOf('jaj') !== -1) ? + time.slice(0, -3) + 'Hu’' : + (output.indexOf('jar') !== -1) ? + time.slice(0, -3) + 'wen' : + (output.indexOf('DIS') !== -1) ? + time.slice(0, -3) + 'ben' : + time + ' ret'; + return time; + } + + function tlh__translate(number, withoutSuffix, string, isFuture) { + var numberNoun = numberAsNoun(number); + switch (string) { + case 'mm': + return numberNoun + ' tup'; + case 'hh': + return numberNoun + ' rep'; + case 'dd': + return numberNoun + ' jaj'; + case 'MM': + return numberNoun + ' jar'; + case 'yy': + return numberNoun + ' DIS'; + } + } + + function numberAsNoun(number) { + var hundred = Math.floor((number % 1000) / 100), + ten = Math.floor((number % 100) / 10), + one = number % 10, + word = ''; + if (hundred > 0) { + word += numbersNouns[hundred] + 'vatlh'; + } + if (ten > 0) { + word += ((word !== '') ? ' ' : '') + numbersNouns[ten] + 'maH'; + } + if (one > 0) { + word += ((word !== '') ? ' ' : '') + numbersNouns[one]; + } + return (word === '') ? 'pagh' : word; + } + + var tlh = moment__default.defineLocale('tlh', { + months : 'tera’ jar wa’_tera’ jar cha’_tera’ jar wej_tera’ jar loS_tera’ jar vagh_tera’ jar jav_tera’ jar Soch_tera’ jar chorgh_tera’ jar Hut_tera’ jar wa’maH_tera’ jar wa’maH wa’_tera’ jar wa’maH cha’'.split('_'), + monthsShort : 'jar wa’_jar cha’_jar wej_jar loS_jar vagh_jar jav_jar Soch_jar chorgh_jar Hut_jar wa’maH_jar wa’maH wa’_jar wa’maH cha’'.split('_'), + weekdays : 'lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj'.split('_'), + weekdaysShort : 'lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj'.split('_'), + weekdaysMin : 'lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd, D MMMM YYYY HH:mm' + }, + calendar : { + sameDay: '[DaHjaj] LT', + nextDay: '[wa’leS] LT', + nextWeek: 'LLL', + lastDay: '[wa’Hu’] LT', + lastWeek: 'LLL', + sameElse: 'L' + }, + relativeTime : { + future : translateFuture, + past : translatePast, + s : 'puS lup', + m : 'wa’ tup', + mm : tlh__translate, + h : 'wa’ rep', + hh : tlh__translate, + d : 'wa’ jaj', + dd : tlh__translate, + M : 'wa’ jar', + MM : tlh__translate, + y : 'wa’ DIS', + yy : tlh__translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + //! moment.js locale configuration + //! locale : turkish (tr) + //! authors : Erhan Gundogan : https://github.com/erhangundogan, + //! Burak Yiğit Kaya: https://github.com/BYK + + var tr__suffixes = { + 1: '\'inci', + 5: '\'inci', + 8: '\'inci', + 70: '\'inci', + 80: '\'inci', + 2: '\'nci', + 7: '\'nci', + 20: '\'nci', + 50: '\'nci', + 3: '\'üncü', + 4: '\'üncü', + 100: '\'üncü', + 6: '\'ncı', + 9: '\'uncu', + 10: '\'uncu', + 30: '\'uncu', + 60: '\'ıncı', + 90: '\'ıncı' + }; + + var tr = moment__default.defineLocale('tr', { + months : 'Ocak_Şubat_Mart_Nisan_Mayıs_Haziran_Temmuz_Ağustos_Eylül_Ekim_Kasım_Aralık'.split('_'), + monthsShort : 'Oca_Şub_Mar_Nis_May_Haz_Tem_Ağu_Eyl_Eki_Kas_Ara'.split('_'), + weekdays : 'Pazar_Pazartesi_Salı_Çarşamba_Perşembe_Cuma_Cumartesi'.split('_'), + weekdaysShort : 'Paz_Pts_Sal_Çar_Per_Cum_Cts'.split('_'), + weekdaysMin : 'Pz_Pt_Sa_Ça_Pe_Cu_Ct'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd, D MMMM YYYY HH:mm' + }, + calendar : { + sameDay : '[bugün saat] LT', + nextDay : '[yarın saat] LT', + nextWeek : '[haftaya] dddd [saat] LT', + lastDay : '[dün] LT', + lastWeek : '[geçen hafta] dddd [saat] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s sonra', + past : '%s önce', + s : 'birkaç saniye', + m : 'bir dakika', + mm : '%d dakika', + h : 'bir saat', + hh : '%d saat', + d : 'bir gün', + dd : '%d gün', + M : 'bir ay', + MM : '%d ay', + y : 'bir yıl', + yy : '%d yıl' + }, + ordinalParse: /\d{1,2}'(inci|nci|üncü|ncı|uncu|ıncı)/, + ordinal : function (number) { + if (number === 0) { // special case for zero + return number + '\'ıncı'; + } + var a = number % 10, + b = number % 100 - a, + c = number >= 100 ? 100 : null; + return number + (tr__suffixes[a] || tr__suffixes[b] || tr__suffixes[c]); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + //! locale : talossan (tzl) + //! author : Robin van der Vliet : https://github.com/robin0van0der0v with the help of Iustì Canun + + + // After the year there should be a slash and the amount of years since December 26, 1979 in Roman numerals. + // This is currently too difficult (maybe even impossible) to add. + var tzl = moment__default.defineLocale('tzl', { + months : 'Januar_Fevraglh_Març_Avrïu_Mai_Gün_Julia_Guscht_Setemvar_Listopäts_Noemvar_Zecemvar'.split('_'), + monthsShort : 'Jan_Fev_Mar_Avr_Mai_Gün_Jul_Gus_Set_Lis_Noe_Zec'.split('_'), + weekdays : 'Súladi_Lúneçi_Maitzi_Márcuri_Xhúadi_Viénerçi_Sáturi'.split('_'), + weekdaysShort : 'Súl_Lún_Mai_Már_Xhú_Vié_Sát'.split('_'), + weekdaysMin : 'Sú_Lú_Ma_Má_Xh_Vi_Sá'.split('_'), + longDateFormat : { + LT : 'HH.mm', + LTS : 'HH.mm.ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM [dallas] YYYY', + LLL : 'D. MMMM [dallas] YYYY HH.mm', + LLLL : 'dddd, [li] D. MMMM [dallas] YYYY HH.mm' + }, + meridiemParse: /d\'o|d\'a/i, + isPM : function (input) { + return 'd\'o' === input.toLowerCase(); + }, + meridiem : function (hours, minutes, isLower) { + if (hours > 11) { + return isLower ? 'd\'o' : 'D\'O'; + } else { + return isLower ? 'd\'a' : 'D\'A'; + } + }, + calendar : { + sameDay : '[oxhi à] LT', + nextDay : '[demà à] LT', + nextWeek : 'dddd [à] LT', + lastDay : '[ieiri à] LT', + lastWeek : '[sür el] dddd [lasteu à] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'osprei %s', + past : 'ja%s', + s : tzl__processRelativeTime, + m : tzl__processRelativeTime, + mm : tzl__processRelativeTime, + h : tzl__processRelativeTime, + hh : tzl__processRelativeTime, + d : tzl__processRelativeTime, + dd : tzl__processRelativeTime, + M : tzl__processRelativeTime, + MM : tzl__processRelativeTime, + y : tzl__processRelativeTime, + yy : tzl__processRelativeTime + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + function tzl__processRelativeTime(number, withoutSuffix, key, isFuture) { + var format = { + 's': ['viensas secunds', '\'iensas secunds'], + 'm': ['\'n míut', '\'iens míut'], + 'mm': [number + ' míuts', '' + number + ' míuts'], + 'h': ['\'n þora', '\'iensa þora'], + 'hh': [number + ' þoras', '' + number + ' þoras'], + 'd': ['\'n ziua', '\'iensa ziua'], + 'dd': [number + ' ziuas', '' + number + ' ziuas'], + 'M': ['\'n mes', '\'iens mes'], + 'MM': [number + ' mesen', '' + number + ' mesen'], + 'y': ['\'n ar', '\'iens ar'], + 'yy': [number + ' ars', '' + number + ' ars'] + }; + return isFuture ? format[key][0] : (withoutSuffix ? format[key][0] : format[key][1]); + } + + //! moment.js locale configuration + //! locale : Morocco Central Atlas Tamaziɣt in Latin (tzm-latn) + //! author : Abdel Said : https://github.com/abdelsaid + + var tzm_latn = moment__default.defineLocale('tzm-latn', { + months : 'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split('_'), + monthsShort : 'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split('_'), + weekdays : 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'), + weekdaysShort : 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'), + weekdaysMin : 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd D MMMM YYYY HH:mm' + }, + calendar : { + sameDay: '[asdkh g] LT', + nextDay: '[aska g] LT', + nextWeek: 'dddd [g] LT', + lastDay: '[assant g] LT', + lastWeek: 'dddd [g] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'dadkh s yan %s', + past : 'yan %s', + s : 'imik', + m : 'minuḍ', + mm : '%d minuḍ', + h : 'saɛa', + hh : '%d tassaɛin', + d : 'ass', + dd : '%d ossan', + M : 'ayowr', + MM : '%d iyyirn', + y : 'asgas', + yy : '%d isgasn' + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + //! locale : Morocco Central Atlas Tamaziɣt (tzm) + //! author : Abdel Said : https://github.com/abdelsaid + + var tzm = moment__default.defineLocale('tzm', { + months : 'ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ'.split('_'), + monthsShort : 'ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ'.split('_'), + weekdays : 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'), + weekdaysShort : 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'), + weekdaysMin : 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS: 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd D MMMM YYYY HH:mm' + }, + calendar : { + sameDay: '[ⴰⵙⴷⵅ ⴴ] LT', + nextDay: '[ⴰⵙⴽⴰ ⴴ] LT', + nextWeek: 'dddd [ⴴ] LT', + lastDay: '[ⴰⵚⴰⵏⵜ ⴴ] LT', + lastWeek: 'dddd [ⴴ] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'ⴷⴰⴷⵅ ⵙ ⵢⴰⵏ %s', + past : 'ⵢⴰⵏ %s', + s : 'ⵉⵎⵉⴽ', + m : 'ⵎⵉⵏⵓⴺ', + mm : '%d ⵎⵉⵏⵓⴺ', + h : 'ⵙⴰⵄⴰ', + hh : '%d ⵜⴰⵙⵙⴰⵄⵉⵏ', + d : 'ⴰⵙⵙ', + dd : '%d oⵙⵙⴰⵏ', + M : 'ⴰⵢoⵓⵔ', + MM : '%d ⵉⵢⵢⵉⵔⵏ', + y : 'ⴰⵙⴳⴰⵙ', + yy : '%d ⵉⵙⴳⴰⵙⵏ' + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + //! locale : ukrainian (uk) + //! author : zemlanin : https://github.com/zemlanin + //! Author : Menelion Elensúle : https://github.com/Oire + + function uk__plural(word, num) { + var forms = word.split('_'); + return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]); + } + function uk__relativeTimeWithPlural(number, withoutSuffix, key) { + var format = { + 'mm': withoutSuffix ? 'хвилина_хвилини_хвилин' : 'хвилину_хвилини_хвилин', + 'hh': withoutSuffix ? 'година_години_годин' : 'годину_години_годин', + 'dd': 'день_дні_днів', + 'MM': 'місяць_місяці_місяців', + 'yy': 'рік_роки_років' + }; + if (key === 'm') { + return withoutSuffix ? 'хвилина' : 'хвилину'; + } + else if (key === 'h') { + return withoutSuffix ? 'година' : 'годину'; + } + else { + return number + ' ' + uk__plural(format[key], +number); + } + } + function weekdaysCaseReplace(m, format) { + var weekdays = { + 'nominative': 'неділя_понеділок_вівторок_середа_четвер_п’ятниця_субота'.split('_'), + 'accusative': 'неділю_понеділок_вівторок_середу_четвер_п’ятницю_суботу'.split('_'), + 'genitive': 'неділі_понеділка_вівторка_середи_четверга_п’ятниці_суботи'.split('_') + }, + nounCase = (/(\[[ВвУу]\]) ?dddd/).test(format) ? + 'accusative' : + ((/\[?(?:минулої|наступної)? ?\] ?dddd/).test(format) ? + 'genitive' : + 'nominative'); + return weekdays[nounCase][m.day()]; + } + function processHoursFunction(str) { + return function () { + return str + 'о' + (this.hours() === 11 ? 'б' : '') + '] LT'; + }; + } + + var uk = moment__default.defineLocale('uk', { + months : { + 'format': 'січня_лютого_березня_квітня_травня_червня_липня_серпня_вересня_жовтня_листопада_грудня'.split('_'), + 'standalone': 'січень_лютий_березень_квітень_травень_червень_липень_серпень_вересень_жовтень_листопад_грудень'.split('_') + }, + monthsShort : 'січ_лют_бер_квіт_трав_черв_лип_серп_вер_жовт_лист_груд'.split('_'), + weekdays : weekdaysCaseReplace, + weekdaysShort : 'нд_пн_вт_ср_чт_пт_сб'.split('_'), + weekdaysMin : 'нд_пн_вт_ср_чт_пт_сб'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY р.', + LLL : 'D MMMM YYYY р., HH:mm', + LLLL : 'dddd, D MMMM YYYY р., HH:mm' + }, + calendar : { + sameDay: processHoursFunction('[Сьогодні '), + nextDay: processHoursFunction('[Завтра '), + lastDay: processHoursFunction('[Вчора '), + nextWeek: processHoursFunction('[У] dddd ['), + lastWeek: function () { + switch (this.day()) { + case 0: + case 3: + case 5: + case 6: + return processHoursFunction('[Минулої] dddd [').call(this); + case 1: + case 2: + case 4: + return processHoursFunction('[Минулого] dddd [').call(this); + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'за %s', + past : '%s тому', + s : 'декілька секунд', + m : uk__relativeTimeWithPlural, + mm : uk__relativeTimeWithPlural, + h : 'годину', + hh : uk__relativeTimeWithPlural, + d : 'день', + dd : uk__relativeTimeWithPlural, + M : 'місяць', + MM : uk__relativeTimeWithPlural, + y : 'рік', + yy : uk__relativeTimeWithPlural + }, + // M. E.: those two are virtually unused but a user might want to implement them for his/her website for some reason + meridiemParse: /ночі|ранку|дня|вечора/, + isPM: function (input) { + return /^(дня|вечора)$/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'ночі'; + } else if (hour < 12) { + return 'ранку'; + } else if (hour < 17) { + return 'дня'; + } else { + return 'вечора'; + } + }, + ordinalParse: /\d{1,2}-(й|го)/, + ordinal: function (number, period) { + switch (period) { + case 'M': + case 'd': + case 'DDD': + case 'w': + case 'W': + return number + '-й'; + case 'D': + return number + '-го'; + default: + return number; + } + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + //! locale : uzbek (uz) + //! author : Sardor Muminov : https://github.com/muminoff + + var uz = moment__default.defineLocale('uz', { + months : 'январ_феврал_март_апрел_май_июн_июл_август_сентябр_октябр_ноябр_декабр'.split('_'), + monthsShort : 'янв_фев_мар_апр_май_июн_июл_авг_сен_окт_ноя_дек'.split('_'), + weekdays : 'Якшанба_Душанба_Сешанба_Чоршанба_Пайшанба_Жума_Шанба'.split('_'), + weekdaysShort : 'Якш_Душ_Сеш_Чор_Пай_Жум_Шан'.split('_'), + weekdaysMin : 'Як_Ду_Се_Чо_Па_Жу_Ша'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'D MMMM YYYY, dddd HH:mm' + }, + calendar : { + sameDay : '[Бугун соат] LT [да]', + nextDay : '[Эртага] LT [да]', + nextWeek : 'dddd [куни соат] LT [да]', + lastDay : '[Кеча соат] LT [да]', + lastWeek : '[Утган] dddd [куни соат] LT [да]', + sameElse : 'L' + }, + relativeTime : { + future : 'Якин %s ичида', + past : 'Бир неча %s олдин', + s : 'фурсат', + m : 'бир дакика', + mm : '%d дакика', + h : 'бир соат', + hh : '%d соат', + d : 'бир кун', + dd : '%d кун', + M : 'бир ой', + MM : '%d ой', + y : 'бир йил', + yy : '%d йил' + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 4th is the first week of the year. + } + }); + + //! moment.js locale configuration + //! locale : vietnamese (vi) + //! author : Bang Nguyen : https://github.com/bangnk + + var vi = moment__default.defineLocale('vi', { + months : 'tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12'.split('_'), + monthsShort : 'Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12'.split('_'), + weekdays : 'chủ nhật_thứ hai_thứ ba_thứ tư_thứ năm_thứ sáu_thứ bảy'.split('_'), + weekdaysShort : 'CN_T2_T3_T4_T5_T6_T7'.split('_'), + weekdaysMin : 'CN_T2_T3_T4_T5_T6_T7'.split('_'), + meridiemParse: /sa|ch/i, + isPM : function (input) { + return /^ch$/i.test(input); + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 12) { + return isLower ? 'sa' : 'SA'; + } else { + return isLower ? 'ch' : 'CH'; + } + }, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM [năm] YYYY', + LLL : 'D MMMM [năm] YYYY HH:mm', + LLLL : 'dddd, D MMMM [năm] YYYY HH:mm', + l : 'DD/M/YYYY', + ll : 'D MMM YYYY', + lll : 'D MMM YYYY HH:mm', + llll : 'ddd, D MMM YYYY HH:mm' + }, + calendar : { + sameDay: '[Hôm nay lúc] LT', + nextDay: '[Ngày mai lúc] LT', + nextWeek: 'dddd [tuần tới lúc] LT', + lastDay: '[Hôm qua lúc] LT', + lastWeek: 'dddd [tuần rồi lúc] LT', + sameElse: 'L' + }, + relativeTime : { + future : '%s tới', + past : '%s trước', + s : 'vài giây', + m : 'một phút', + mm : '%d phút', + h : 'một giờ', + hh : '%d giờ', + d : 'một ngày', + dd : '%d ngày', + M : 'một tháng', + MM : '%d tháng', + y : 'một năm', + yy : '%d năm' + }, + ordinalParse: /\d{1,2}/, + ordinal : function (number) { + return number; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + //! moment.js locale configuration + //! locale : chinese (zh-cn) + //! author : suupic : https://github.com/suupic + //! author : Zeno Zeng : https://github.com/zenozeng + + var zh_cn = moment__default.defineLocale('zh-cn', { + months : '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'), + monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), + weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'), + weekdaysShort : '周日_周一_周二_周三_周四_周五_周六'.split('_'), + weekdaysMin : '日_一_二_三_四_五_六'.split('_'), + longDateFormat : { + LT : 'Ah点mm分', + LTS : 'Ah点m分s秒', + L : 'YYYY-MM-DD', + LL : 'YYYY年MMMD日', + LLL : 'YYYY年MMMD日Ah点mm分', + LLLL : 'YYYY年MMMD日ddddAh点mm分', + l : 'YYYY-MM-DD', + ll : 'YYYY年MMMD日', + lll : 'YYYY年MMMD日Ah点mm分', + llll : 'YYYY年MMMD日ddddAh点mm分' + }, + meridiemParse: /凌晨|早上|上午|中午|下午|晚上/, + meridiemHour: function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === '凌晨' || meridiem === '早上' || + meridiem === '上午') { + return hour; + } else if (meridiem === '下午' || meridiem === '晚上') { + return hour + 12; + } else { + // '中午' + return hour >= 11 ? hour : hour + 12; + } + }, + meridiem : function (hour, minute, isLower) { + var hm = hour * 100 + minute; + if (hm < 600) { + return '凌晨'; + } else if (hm < 900) { + return '早上'; + } else if (hm < 1130) { + return '上午'; + } else if (hm < 1230) { + return '中午'; + } else if (hm < 1800) { + return '下午'; + } else { + return '晚上'; + } + }, + calendar : { + sameDay : function () { + return this.minutes() === 0 ? '[今天]Ah[点整]' : '[今天]LT'; + }, + nextDay : function () { + return this.minutes() === 0 ? '[明天]Ah[点整]' : '[明天]LT'; + }, + lastDay : function () { + return this.minutes() === 0 ? '[昨天]Ah[点整]' : '[昨天]LT'; + }, + nextWeek : function () { + var startOfWeek, prefix; + startOfWeek = moment__default().startOf('week'); + prefix = this.unix() - startOfWeek.unix() >= 7 * 24 * 3600 ? '[下]' : '[本]'; + return this.minutes() === 0 ? prefix + 'dddAh点整' : prefix + 'dddAh点mm'; + }, + lastWeek : function () { + var startOfWeek, prefix; + startOfWeek = moment__default().startOf('week'); + prefix = this.unix() < startOfWeek.unix() ? '[上]' : '[本]'; + return this.minutes() === 0 ? prefix + 'dddAh点整' : prefix + 'dddAh点mm'; + }, + sameElse : 'LL' + }, + ordinalParse: /\d{1,2}(日|月|周)/, + ordinal : function (number, period) { + switch (period) { + case 'd': + case 'D': + case 'DDD': + return number + '日'; + case 'M': + return number + '月'; + case 'w': + case 'W': + return number + '周'; + default: + return number; + } + }, + relativeTime : { + future : '%s内', + past : '%s前', + s : '几秒', + m : '1 分钟', + mm : '%d 分钟', + h : '1 小时', + hh : '%d 小时', + d : '1 天', + dd : '%d 天', + M : '1 个月', + MM : '%d 个月', + y : '1 年', + yy : '%d 年' + }, + week : { + // GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效 + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + //! moment.js locale configuration + //! locale : traditional chinese (zh-tw) + //! author : Ben : https://github.com/ben-lin + + var zh_tw = moment__default.defineLocale('zh-tw', { + months : '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'), + monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), + weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'), + weekdaysShort : '週日_週一_週二_週三_週四_週五_週六'.split('_'), + weekdaysMin : '日_一_二_三_四_五_六'.split('_'), + longDateFormat : { + LT : 'Ah點mm分', + LTS : 'Ah點m分s秒', + L : 'YYYY年MMMD日', + LL : 'YYYY年MMMD日', + LLL : 'YYYY年MMMD日Ah點mm分', + LLLL : 'YYYY年MMMD日ddddAh點mm分', + l : 'YYYY年MMMD日', + ll : 'YYYY年MMMD日', + lll : 'YYYY年MMMD日Ah點mm分', + llll : 'YYYY年MMMD日ddddAh點mm分' + }, + meridiemParse: /早上|上午|中午|下午|晚上/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === '早上' || meridiem === '上午') { + return hour; + } else if (meridiem === '中午') { + return hour >= 11 ? hour : hour + 12; + } else if (meridiem === '下午' || meridiem === '晚上') { + return hour + 12; + } + }, + meridiem : function (hour, minute, isLower) { + var hm = hour * 100 + minute; + if (hm < 900) { + return '早上'; + } else if (hm < 1130) { + return '上午'; + } else if (hm < 1230) { + return '中午'; + } else if (hm < 1800) { + return '下午'; + } else { + return '晚上'; + } + }, + calendar : { + sameDay : '[今天]LT', + nextDay : '[明天]LT', + nextWeek : '[下]ddddLT', + lastDay : '[昨天]LT', + lastWeek : '[上]ddddLT', + sameElse : 'L' + }, + ordinalParse: /\d{1,2}(日|月|週)/, + ordinal : function (number, period) { + switch (period) { + case 'd' : + case 'D' : + case 'DDD' : + return number + '日'; + case 'M' : + return number + '月'; + case 'w' : + case 'W' : + return number + '週'; + default : + return number; + } + }, + relativeTime : { + future : '%s內', + past : '%s前', + s : '幾秒', + m : '一分鐘', + mm : '%d分鐘', + h : '一小時', + hh : '%d小時', + d : '一天', + dd : '%d天', + M : '一個月', + MM : '%d個月', + y : '一年', + yy : '%d年' + } + }); + + var moment_with_locales = moment__default; + moment_with_locales.locale('en'); + + return moment_with_locales; + +})); \ No newline at end of file diff --git a/public/photos/1/1/sada/56c160fbad635.jpg b/public/photos/1/1/sada/56c160fbad635.jpg deleted file mode 100644 index 160ea37c81d2ce31933bc14e06034d8882533aa3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 172655 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

    1C2X@CXN(}m8Agn-&3b|#+crg7s8ue-c4e$w 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 z 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 z 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

    fqLmbNiRa%VUBvqio%T+c(-W8iB=}t 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 JH!TA*|JhdZws8Oe diff --git a/public/photos/1/1/sada/thumbs/56c160fbad635.jpg b/public/photos/1/1/sada/thumbs/56c160fbad635.jpg deleted file mode 100644 index 992c993a94846cc0ab907e2e7b2bb05e1ef4d942..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8629 zcmbW5byO6<+wYe~Lb_uSP+*bnTtI4C%yTsZth1cf&Bn0RDp{!1*r${-)!(4-Xd~?>|xh^A7#j55T7)pnfEx zOh}_|N5ttvD;klUPt2uK(@AIW`+!@_-Z%0A2|WWN6Z7LIJiL4$aS2H&X&KpPs%q*Q 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 Zse17v#NgKjvG$H->#@AWz7+R={s)WOza#(v diff --git a/release-notes.txt b/release-notes.txt new file mode 100644 index 000000000..69e497763 --- /dev/null +++ b/release-notes.txt @@ -0,0 +1,2671 @@ +activeCollab 3.3.0 [2013/03/26] +================================================================================ + +First beta release. Major new features: + + 1. Auto-upgrade + 2. Numerious invoicing improvements + 3. Projects on a timeline + 4. Workload report + 5. Improved main menu and navigation + 6. Invite People dialog + 7. Disk Utility + +activeCollab 3.2.12 [2013/03/18] +================================================================================ + +Enhancements: + + 1. More prominent warning that SVN communication via command line is + deprecated and will be removed in activeCollab 4 + 2. Simplified source settings dialogs + 3. Installation and upgrade scripts can detect Suhosin patch and extension + 4. Improved signature and quote cleaning when importing email + 5. Links added to visual editor can be forced to open in new browser window + 6. Added warning to New Incoming Mailbox for that clarifies what might + happen if users use personal addresses with activeCollab's incoming mail + feature + +Bug Fixes: + + 1. Fixed assignment filter print when filter is showing tracked time data + 2. Fixed issue when users and companies that already had an account but were + deleted, are imported from vCard + 3. Fixed issue where incoming mail would crash when invalid language + instance was provided + 4. Fixed activeCollab 2.3 project upgrade. Paused and canceled projects are + properly labeled now + 5. Page tabs at client invoicing section are properly localised now + 6. Mobile view of task page now shows related tasks + 7. Fixed issue that stopped users from loading more than 100 repositories in + Administration > Source Settings section + 8. System no longer allows users to send a quote to owner company + 9. Fixed issue when quote issued to owner company could not be deleted + 10. Fixed issue where some items could be duplicated in Outline view + 11. Fixed multi-byte issue when timeline background images are generated + 12. Improved the way system handles BCC-ed incoming mail + 13. "Set new password" button text can now be localised + 14. IAssigneesImplementation::getAllAssigneeIds() method now works properly + 15. Installer no longer uses persistent MySQL connections + 16. Fixed error where textarea was not displayed in some cases to users who + turned off visual editor + 17. Increased font size of group headers in printed reports + 18. boolval() function is defined if not present (PHP 5.5 introduces this + function while older versions of PHP don't have it) + 19. Fixed issue where private comment content could be lost upon recurring + profile update + 20. Fixed invoice PDF problem when project name had & in its name + 21. Invoice notes are listed alphabetically in WebKit powered browsers + +activeCollab 3.2.11 [2013/02/25] +================================================================================ + +Enhancements: + + 1. Compatibility update - this release can load upgrade information from + versions of activeCollab that use PHAR packages + +Bug Fixes: + + 1. Fixed compiled routes and templates routine + +activeCollab 3.2.10 [2013/02/21] +================================================================================ + +Enhancements: + + 1. Added option to select multiple time records and expenses and mass-change + their billable status + 2. Added quick view for completed objects displayed in Day Overview + home-screen widget + 3. Link to Item can be limited to search only in current project + 4. Added progress field to project's and milestone's detailed API response + that shows percent done, total number of tasks and number of open tasks + 5. Improved /info/roles API response + +Bug Fixes: + + 1. Fixed crash when incoming mail filter is being deleted in a new tab + 2. Fixed the way email notification are displayed on iPad + 3. Multiple localisation tweaks and fixes + 4. Fixed a bug where incoming mail could import an empty body when message + charset was not specified + 5. Fixed width of message field in Maintenance Mode dialog + 6. When project is created from a template, custom template settings are + applied to the new project as well + 7. Module icons are shown for disabled modules as well + 8. Fixed issue when one or more items gets added to objects list to + previously not visible group, and the group remained collapsed instead of + appearing expanded + 9. Fixed URL for attachments that are displayed at public pages + 10. Fixed issue with left list padding in content block + 11. Different number style for different levels of ordered lists + 12. Home screen will skip widgets and tabs that are not available if parent + module gets disabled + 13. Generic "This page is not available on mobile device" page is displayed + when visitor tries to open a page that does not have a mobile version + 14. Fixed issue with public tasks form on mobile devices + 15. Code that checks whether InnoDB support is available has been improved + (MySQL 5.6 compatibility tweak) + 16. When deleting quotes, automatically reset based on values for projects + 17. Made sure that long project names do not break Related Tasks dialog + 18. When task is copied, its most recent estimate is copied as well (this + functionality is used when projects are created from templates, too) + 19. Module clean-up on uninstallation improvements + 20. Fixed SVN over HTTPS error + 21. Projects are properly sorted in Add to Projects dialog + 22. Fixed issue when subtasks did not get rescheduled when their parent does + not have a due date set + 23. Fixed crash that could happen when user was removed from a project + 24. When time is tracked from a timesheet page, system uses proper default + visibility status (configured globally or per project) + 25. Long object type in recent activities widget no longer wraps + 26. Fixed project listing in mobile interface (it used to list only active + projects) + 27. SVN properly works when repository is actually a subfolder, nor root + folder of the repository + 28. Fixed milestone progress calculation for situations when big milestone + is close to completion, but not completed yet + 29. Fixed quick view navigation error + 30. Improved email cleaner for messages received from GMail + 31. Fixed a small vCard import error + 32. When temporal attachments are removed, object contexts are properly + cleaned up + +activeCollab 3.2.9 [2013/01/30] +================================================================================ + +Enhancements: + + 1. HTML root element uses language code based on user's language + 2. Link in email notifications for downloading PDF version of a quote + doesn't require login + 3. Improved performance of People page for users who have a lot of accounts + defined in their system + 4. When milestone is moved from one project to another, system will also + move archived tasks, discussions and files that belong to that milestone + 5. Email notifications for tasks now show task's due date (if set) + 6. Big email replies are imported as attachments + 7. Improved instructions for Scheduled Tasks setup on Windows + +Bug Fixes: + + 1. When user is removed from a project (or replaced), reminders that belong + to that user are cleaned up as well + 2. Fixed multiple translation issues + 3. Fixed styling on project budget page + 4. Outline properly displays task category when Edit form is opened + 5. Fixed issue that caused double activity log entries when file was + uploaded via API + 6. Fixed issue with commit path in Source module + 7. Fixed creation date display for recurring profiles + 8. Fixed issue with Recent Activities page in mobile interface + 9. Removed navigation block and Complete option from trashed objects in + mobile interface + 10. Fixed a minor problem with invoice issuing form + 11. Fixed issue with project template not being imported after a project + based on quote or project request is created + 12. Fixed issue where Notify People box in forms in Documents section also + listed archived users + 13. Fixed error during project creating step when quote items had to be + converted into project milestones + 14. Fixed minor issue with discussion details loading + 15. Fixed crash report when tracking report was executed, but there was no + tasks module installed + 16. Improved email notifications so they display properly in vast majority of + email clients + 17. Fixed time zone issue in Day Overview widget + +activeCollab 3.2.8 [2013/01/10] +================================================================================ + +Enhancements: + + 1. If user is visiting activeCollab with unsupported version of Internet + Explorer, or IE running in Compatibility mode, they will be warned + 2. Force HTML powered file uploads in Internet Explorer + 3. Project name added to project request notifications + +Bug Fixes: + + 1. Properly handle Esc when closing dialogs + 2. Fixed permissions issue when subtasks assignees could not complete + subtasks unless they were assigned to the parent task + 3. Fixed Internet Explorer issue where you had to click twice to open a + project tab + 4. Fixed links in notifications sent to users that don't have an account in + the system + 5. Fixed issue where Outline would stop working if Tracking module was + missing + 6. Covered one more SVN error condition + 7. Fixed issue where users were not redirected to new project after they + moved a project object + 8. Fixed invoice logo URL issue when system is using clean URL-s + 9. Fixed issue that forced default project visibility on new objects + +activeCollab 3.2.7 [2012/12/26] +================================================================================ + +Enhancements: + + 1. Tweaked subject of reassignment email notification + 2. Payment notifications are configurable now. On top of notifying all + financial managers, you can select to notify just specific manager or + turn off this notification + 3. Turn on or off email notification that are sent to clients when invoice + is fully paid + 4. Turn on or off email notification that are sent to clients when invoice + is canceled + 5. Added API commands for listing recent activities. This option is + available globally, per project and per user + 6. Information about task creation can be posted via API call + 7. Quick View added to Day Overview widget + 8. Quotes that are Sent, Won or Lost can be deleted + +Bug Fixes: + + 1. Remove Manage Project People link that was displayed to client company + managers (even though the could not use the tool) + 2. Fixed "Minuts" option in Who is Online home screen widget + 3. Various Internet Explorer fixes + +activeCollab 3.2.6 [2012/12/14] +================================================================================ + +Enhancements: + + 1. Added branching support to Source module + +Bug Fixes: + + 1. Fixed disk space calculation on 32-bit version of PHP + 2. Fixed start date display in recurring profiles + 3. Tweaked file, bookmark and YouTube video shared pages in mobile interface + 4. If project request text is not provided, request text box is not + displayed in mobile interface + +activeCollab 3.2.5 [2012/12/13] +================================================================================ + +Enhancements: + + 1. Separated modules that ship with activeCollab and custom modules on + Administration > Modules page + 2. Added option to disable all custom modules with a single click + +Bug Fixes: + + 1. Hiding project budget in Small Biz (does not have budgeting features) + 2. When object is created via API, use default project visibility instead of + private visibility + 3. Fixed issue when project is created from template and there was a source + repository associated with template project + 4. Trashed and deleted milestones are no longer displayed on calendars + 5. Quote details page can be viewed using mobile device + 6. Fixed issue where documents module would print full documents list + instead of a single document + 7. Fixed problem where edit project form would not load custom field values + 8. Fixed public page link issue on quite details page + 9. Fixed user display issue in source module (printed HTML instead of links) + 10. Fixed minor filtering issue in Invoices section + 11. Fixed check that determine whether image can be previewed or not (some + images were missed by existing method) + 12. Fixed bug when attachments could not be attached to comments using the + main interface + 13. Fixed issue when Microsoft Excel treated assignment filter export as + symbolic links because they started with ID string + 14. Fixed problem where project did not pick up custom field values when it + was created + 15. Fixed error when invoice due date settings (configured in Administration + panel) were always forced + 16. Fixed potential crash in tracking reports where conditions are so strict + that there is no project that meets them + 17. Improved email details dialog layout in Admin > Email section + +activeCollab 3.2.4 [2012/11/26] +================================================================================ + +Bug Fixes: + + 1. Fixed code snippets error + 2. Shared notebooks can be accessed via mobile device + 3. Added icon for PPTX documents + 4. Fixed issue when expense category was not properly saved when tracking + report was saved + 5. Fixed issue where Tasks module could not be installed unless it is + installed during system installation or upgrade + +activeCollab 3.2.3 [2012/11/20] +================================================================================ + +Bug Fixes: + + 1. Fixed issue with upgrade script + 2. Fixed numerous PHP notices (due to static calls to methods that are not + declared as static in generated model classes) + 3. Fixed issue with thumbnail and CAPTCHA generation + 4. Improved text cleanup on email import + +activeCollab 3.2.2 [2012/11/16] +================================================================================ + +Enhancements: + + 1. Assignment filters now also take into account task's position when they + are displaying data (works when tasks are not or grouped, or when they + are grouped by due date) + 2. Improved contrast of drag handle icon and changed cursor to move when + hovering over drag handle on Incoming Mail Filters page + 3. Added mobile views for public pages of objects that are shared + +Bug Fixes: + + 1. Fixed issue with upgrade script and default tax rate + +activeCollab 3.2.1 [2012/11/14] +================================================================================ + +Enhancements: + + 1. Tweaked wording for creation entries in activity logs + 2. Browse archive link instead of a button in sections where there are + archives (projects, tasks etc) + 3. Easily unsubscribe from future notifications about particular object + directly from within email notification that user received + 4. Added option to configure default tax rate + 5. System will warn users if they try to navigate away from the page where + they have inserted a comment, but haven't submitted it + 6. Added keyboard shortcuts to Quick Jump and Quick Add tools (Ctrl+Shift+J + for Quick Jump and Ctrl+Shift+Q for Quick Add) + 7. Quick Jump and Quick Add can be navigated with keyboard + 8. Time & Expenses Report: Added billable filter that returns billable, + pending payment and paid records + 9. Archive related tasks are displayed as well, not just active ones + 10. Project requests are displayed as tab on client company page + +Bug Fixes: + + 1. Fixed issue where creation of category from select box would break + categories that were already in the select box + 2. Fixed issue where permanently deleted global documents were still visible + in recent activities + 3. Clean up routing cache when module is uninstalled, to cover cases where + module was overriding routes used by activeCollab + 4. Fixed Quick Add Project button + 5. Date picker on New Time Record form for task now uses date in user's + time zone, instead of GMT date + 6. Fixed issue where system allowed Add People form to be submitted even + when there is no users selected + 7. Fixed issue where brief project info could not be loaded if project was + created based on a quote or project request + 8. Notify users list in Global Document section checks for access + permissions when listing users + 9. Add Client to People option removed form public quote page + 10. System properly updates file list on milestone page when multiple files + are uploaded + 11. Fixed issue when installed activeCollab version was ahead of latest + stable version (like beta releases) + +activeCollab 3.2.0 [2012/11/06] +================================================================================ + +First activeCollab 3.2 beta build. Major new features and improvements: + + 1. Quick View enables easy preview and management of application objects + 2. Quick View for Attachments + 3. Related Tasks provides quick and easy way to connect related tasks + 4. Custom Fields for Tasks and Projects + 5. HTML5 based upload (instead of Flash powered implementation) + +activeCollab 3.1.18 [2012/11/02] +================================================================================ + +Enhancements: + + 1. After successful password reset, user is automatically logged in and + taken to the home screen + 2. System generates longer, more secure random passwords (20 letters, mixed + letter case, including numbers and symbols included) + 3. On successful login automatically rehash password using PBKDF2 if we have + SHA1 hashed value in the database + 4. New User form tweaked to look like other forms in the system and better + explain behaviour of options that are turned off by default + +Bug Fixes: + + 1. When user tries to create a new mailbox with reserved email address, + Email Reply to Comment tool will report a proper message + 2. Fixed issue where anonymous users would receive notifications about + comments that they post + 3. Fixed reset password issue in IE8 and IE9 + 4. Fixed issue where system would ignore users' time zone when sending + scheduled reminders + 5. Mobile Interface: Fixed issue where post comment form was visible even + when comments were locked + 6. Mobile Interface: fixed notebooks page on milestone level + 7. Mobile Interface: fixed files page on milestone level + 8. Fixed issue with latest version number checking + 9. Upgrade Script: fixed issue where text_document_versions and + file_versions tables were created even when files module was not + installed + 10. Fixed issue with estimates report (it used to query permanently deleted + and trashed time records) + 11. Fixed issue where project progress was displayed even to people who don't + have access to tasks and to do lists on the project + +activeCollab 3.1.17 [2012/08/26] +================================================================================ + +Enhancements: + + 1. System uses PBKDF2 to hash passwords instead of SHA1 + 2. Notification sent to new assignee includes full tasks/milestone + description and attachments + 3. Added option to reorder milestones that start on the same date + 4. Improved quote and signature stripping for replies sent using Windows + Live Mail and iPad Mail + 5. Control Tower now shows if there's a new version of activeCollab + available for download + 6. Links in imported email messages are automatically made clickable + 7. Different icons for different log types in email log + 8. Assignment filter are aware of subtask due dates when they are grouping + data by due date + 9. Assignment filter will automatically set additional fields when user + decides to include time data + 10. When draft invoice has number set, system will treat it as pro-forma + invoice + option to specify how pro-forma invoices are called + 11. Added tile icons used by Windows 8 + 12. Added /info/job-types API command + +Bug Fixes: + + 1. /info properly returns read only flag + 2. Use "Sale" instead of "Authorisation" when processing card with PayPal + 3. Fixed bug where Insert Link tool in visual editor would strip white space + around selected text + 4. Fixed issue where activeCollab would ignore recipients's language + settings and sent email notifications in default language + 5. Fixed copy phrase problem for long phrases in translation tool + 6. Fixed collision between "Reopen on New Comments" option and completion of + parent objects using a comment form + 7. Fixed long body line display issue in IE9 + 8. Fixed issue when Insert Image tool would always add image at the + beginning of text block in IE9 + 9. License and new version check properly checks for branding removal + 10. Job types API response includes is_default flag + 11. Fixed GIT update silent failing when URL path is changed + 12. Fixed big logo issue in invoice PDF + 13. Fixed GIT update issue when GIT repository is empty + +activeCollab 3.1.16 [2012/08/17] +================================================================================ + +Enhancements: + + 1. Improved and documented API commands and responses + 2. When translating long phrases, system offers text area instead of single + line text input + 3. Added priority and label to non-completed objects in Day Overview + 4. Incoming mailbox auto-disable feature is now configurable + 5. Added option not to print footer in invoice and quote PDF-s + +Bug Fixes: + + 1. Fixed issue where archived projects would not display any data on + Time & Expenses page + 2. Colors for YouTube Videos and Bookmarks in Recent Activities + 3. Fixed display of client address in quote PDF + 4. Fixed date display on Milestones printout + 5. Fixed showing raw HTML in quote's description when it is created from a + project request + 6. Fixed aggregate tasks report crash on long milestone names + 7. Improved height and width calculation when company logo is being added to + invoice PDF-s + 8. Fixed outline issue when milestone, task or subtask had " in the name + 9. Fixed conflicts count label + 10. Fixed Load More link issue in advanced search + 11. HTML::toPlainText() no longer prepends each paragraph with a tab (\t) + 12. Anonymous subscribers' permissions are not evaluated any more upon + copying or moving an object to another project + 13. Log Time and Log Expense dialogs are aware of user's time zone when + pre-selecting date + 14. Fixed bug that sometimes appeared upon populating client data when a + quote is created from a project request + 15. Fixed issue with checking public quote's status + 16. Moving an object now moves anonymous subscriptions as well + 17. Fixed issue with printing in Internet Explorer + 18. Fixed issue when GIT repositories are checked via scheduled tasks + +activeCollab 3.1.15 [2012/08/11] +================================================================================ + +Enhancements: + + 1. Added option to resend sent and won quotes + 2. Added project archive on company and user profile pages + +Bug Fixes: + + 1. Fixed CSS error that could result in some stylesheets not being applied + 2. Fixed error when default hourly rate for a job type was updated + +activeCollab 3.1.14 [2012/08/09] +================================================================================ + +Enhancements: + + 1. Control Tower helps administrators spot problems early on + 2. Email notifications when milestones, tasks and subtasks are reassigned + 3. Source module will recognise .info, .install and .module files as text + files (based on Drupal naming convention) + 4. Existing language can be updated with translation file + 5. Images will open inline in a new browser tab or window, instead of always + being downloaded to disk + 6. Project overview printout improved + 7. Project specific task ID is now in a separate column in CSV export + 8. Assignment filters can load estimated and tracked time + 9. Added option to turn off result number limit when time & expenses log is + requested via API + 10. Estimated vs Tracked time report added + 11. Day Overview now displays object priority + 12. Less CSS and JavaScript files (less files to upload means faster upgrade) + +Bug Fixes: + + 1. License key is sent to JavaScript only in administration section + 2. Logs are not kept when system is in production mode + 3. Fixed counting unread messages in IMAP/POP3 mailbox + 4. Favourites listing will not show permanently deleted items + 5. Fixed problem that prevented custom date option for Issue Invoice dialog + 6. Fixed a bug where text documents, files, you tube vides and bookmarks + could not be copied to another project + 7. Fixed issue with incorrectly displayed user in Day Overview widget + 8. Fixed issue with incorrect sum of total time logged by selected user in + Day Overview widget + 9. Fixed bug when number of users on a project was not displayed correctly + at 'project brief' page + 10. NaN.NaN in tracked time and expenses widgets fixed + 11. Fixed issue with being able to archive your own company, or a company + where the last administrator is in + 12. Fixed bug when filenames in Files module have been appended with counters + even if the old files were permanently deleted + +activeCollab 3.1.13 [2012/09/26] +================================================================================ + +Enhancements: + + 1. Task time and expenses widget now shows task estimate as well + 2. Reply to Comment checklist makes configuration and troubleshooting of + that feature much easier + 3. Default due date can be pre-configured on recurring profile level + 4. Default billable flag value can be set globally and per project + 5. Improved select project permissions widget + 6. Simplified and improved Add People dialog + 7. Users can be replaced with a user that's already on a project + 8. Current day is highlighted on project timeline + 9. Notifications for incoming mail conflicts have beed added + 10. Better options for removing incoming mail conflicts + 11. Project exporter now also exports text documents, bookmarks and YouTube + videos from project's Files section + 12. System will not allow for milestone to start on a day off or weekend + 13. Versions of text documents can be compered now + 14. Text document can be revered to one of the older versions + 15. Simplified project listings in company and user pages + 16. Sending an email notification to client is now optional if project + request is created from Projects > Project Requests section + 17. Upon creating a new project request, user that is selected to be in + charge for that request is automatically subscribed to it + 18. Links in subtasks are automatically made clickable + 19. TCPDF now supports characters from Chinese, Japanese etc languages + 20. Included link to user assignments project page when user is replacing + someone on a project + 21. Reminders widget added to the default set of widgets that are created + when activeCollab is installed + 22. Information on whether recipient is responsible or assigned is included + in task and milestone notifications + +Bug Fixes: + + 1. Fixed bug where public submit form offered only projects that + administrator is directly involved with, instead of listing all available + projects + 2. My Discussions widget looks through all projects for administrators and + project managers, instead of including only projects that they are + directly involved with + 3. Fixed NaN total in time reports + 4. Fixed double HTML cleaning in status messages + 5. Fixed issue when Resend Invoice would say that email was sent even in + situations where there was no email notification + 6. Fixed a problem that could stop new objects from being saved when + Documents, Source or Tracking modules were uninstalled + 7. Fixed issue where project threw and error when tasks are being exported + and tracking module was not installed + 8. Fixed some SVN over executable bugs on Windows + 9. Long quote name is broken into multiple lines of text + 10. Get visible user ID-s and get visible company ID-s checks included + permanently deleted projects by mistake + 11. Fixed issue where source repositories could not be deleted from + Administration panel + 12. Formatting in public task forms is preserved + 13. When user is removed as responsible party from an assignment, all other + assignees are dropped and unsubscribed as well + 14. Fixed issue with object context rebuild for project objects + 15. Fixed issue when deleted time records and expenses were included in a new + invoice when invoice is based on a milestone + 16. Fixed bug when client for the quote created within activeCollab was not + subscribed automatically + 17. Project name is included as prefix of subject line for discussion related + notifications + 18. Line item quantity in recurring profiles does not need to be a whole + number any longer + 19. Milestone information is now hidden at view/add/edit pages when + Milestones tab is not used within a project + 20. Fixed issue when late and/or due milestones were visible at project's + index page without checking for appropriate permissions + 21. Removed /e modifier and made activeCollab works well when Suhohsin is + configured to disable eval in preg_match + 22. Extra radio button in Make a Payment dialog removed + 23. Fixed issue with "Reply Above This Line" stripping when reply was sent + from Yahoo! Mail + 24. Fixed "Reply Above This Line" stripping when that phrase is translated + and notification is not in English + 25. Fixed search result listing problem + 26. Fixed initial group checkbox values in select assignees helper + 27. Fixed bug in wrong pre-selected user at the 'edit quote' form + 28. Moving an object from one project to another now checks for + assignee/subscriber's permissions + +activeCollab 3.1.12 [2012/09/06] +================================================================================ + +Enhancements: + + 1. activeCollab can check for new version + 2. System can list both open and completed projects, as well as open or + completed only + 3. "Add as Comment" resolution option for incoming mail conflicts added + 4. Improved transliteration support + 5. Group by file name in Documents and Files sections are smarter when + working with non-latin names + 6. Project exporter now exports files + 7. Added note to a freshly submitted project request to let user know they + can bookmark the public page + 8. Added from/to labels to milestone filters + 9. Added company note field, with an appropriate permission in system role + 10. Invoices can be issued with due upon receipt, NET 10, NET 15, NET 30 and + NET 60 due date options + 11. Discussions are visually marked as read as soon as they are loaded + 12. Tasks use global {TASK/ID} identifier in email notifications + 13. Modules have default uninstall message, which includes the name of the + module + 14. Confirmations for uninstalling a module are using module's defined + message (or falling back to default if it's not defined) + 15. System shows "Loading" bar instead of black screen while loading backend + scripts and stylesheets + 16. "Help us Improve activeCollab" is configurable (Admin > General Settings) + +Bug Fixes: + + 1. Fixed php config to int conversion function + 2. Fixed template so proper person is listed as version author in New + Notebook Page Version email notification + 3. Fixed missing $context in 'forgot_password' email notification + 4. Fixed sorting in jump to tool, object lists and assignment filters + 5. Fixed issue with month not being displayed correctly in date range picker + 6. Financial managers see "Go to Invoice" instead of "Pay Online Now" link + in email notifications for issued invoices + 7. Fixed issues with week boundaries calculation in assignment and tracking + reports + 8. Exporter module will not try to create /work/export folder if that folder + already exists + 9. Fixed project assets URL (uses slug instead of project ID) + 10. Fixed issue with Files project tab initialisation + 11. Fixed saving 'based on' information for projects created from requests or + quotes + 12. New invoice created from a quote which has a project, now pre-selects + that project + 13. Setting system default options for invoice that's based on a report or a + quote + 14. Fixed invoice comment height so it does not overlap company info block + 15. Schedule task update checks if the connection to repository is valid + 16. Don't show Next Trigger On for archived recurring profiles + 17. Private invoice comment is saved when invoice is created from a tracking + report + 18. Upgrade script moves uncategorized pages to "Uncategorized Pages" + notebook instead of skipping them + 19. Delegated tasks widget now properly shows tasks delegated by selected + user + 20. Removed "not assigned tasks" options from Delegated tasks widget + (unassigned tasks aren't delegated - filter result is always empty) + 21. Fixed cleaning up HTML in text documents that caused all line breaks to + be lost after editing + 22. Fixed code styles in pages exported with Project Exporter tool + 23. Fixed issue when reassigning a task via comment to 'nobody' + 24. Fix for redirect loop in some environments which report working on port + 80 while they actually work at 443 ($_SERVER['HTTP_X_REAL_PORT']) + 25. Fix for frequently task being crashed when log about incoming mail has + invalid "from" email + 26. Reminders are cleared when parent object is deleted + 27. Fixed default billable status filter in time and expense widgets + 28. "Notify sender about task being created" option is forced for CC-ed + recipients as well + +activeCollab 3.1.11 [2012/08/21] +================================================================================ + +Enhancements: + + 1. Added "To Email" criterion to incoming mail filters + 2. Added support to login to the application using a third-party login form + 3. System will send messages that are set to be sent instantly but something + went wrong and they were not sent + 4. Logo URL in email notifications now includes timestamp to avoid caching + problems with some email clients + 5. Improved the way quotes handle existing and non-existing clients + 6. Project exports are grouped per project in /work/export folder + 7. Documents can be printed (in Documents section) + 8. Added .htaccess to /git and /hg folders with "Deny for all" + 9. Added repository type icons + 10. Completed tasks at project time log are now crossed-over + 11. Added user, day and billable status filters to time and expense widgets + 12. Added support to mark saved assignment filters as private (can be used + only by users who created them) + 13. Added option to unsubscribe unregistered users when sharing is turned off + for particular object + 14. Archived objects are now included into project's progress + 15. Budget report on project level now shows hourly rate, as well as number + of billable hours + 16. Owner company is listed above other companies in Add People dialog + 17. activeCollab now checks memory limit on installation + 18. Reminder comment is now listed in "Manage Reminders" dialog + +Bug Fixes: + + 1. Fixed bug when clearing the entire cache + 2. Fixed bug which prevented custom frontend layout to be used + 3. Fixed issue with assignment labels cache + 4. Changed getenv($env) to $_SERVER[$env] (getenv does not work in some IIS + servers) + 5. Fixed problem where mail log info was escaped twice + 6. Fixed application URL in email notifications + 7. Fixed issue in upgrade script's JS which was incorrectly guessing the URL + and failing to execute upgrade steps on rare occasions + 8. Fixed incorrect casting of 'no' value in yes_no_default helper + 9. Fixed a bug that could prevent the system from uploading an attachment + 10. Fixed a problem where status updates are cloned when one of the buttons + are clicked + 11. Visual editor macros fixed to work in Google Chrome + 12. Fixed mass mailer message template + 13. Logout simply shows login form if user is already logged out (from a + different window or by session expiry) + 14. Case insensitive checks if user is already subscribed (by email) + 15. Category is no longer a dead link in email notifications + 16. Images in description fields are properly resized to fit max email + notification width + 17. Code snippets in email notifications are properly formatted + 18. Some elements that could not be translated in 3.1.10 are covered now + 19. Checking for active session, reset password and forgot password actions + are now checking for user's status + 20. Quoting strings during CSV export now properly takes care about custom + CSV field separator + 21. Added styling for date range picker + 22. Fixed showing error dump instead of error message upon validation failure + at 'add user' dialog + 23. Project name is updated at project tabs without need for refreshing the + page + 24. New task is loaded after a task is copied to another project + 25. When task is rescheduled, subtasks are properly rescheduled as well + 26. Expense records are properly marked as paid, when invoice is paid + 27. When notebook is copied, system also copies archived notebook pages + 28. Invoice due on update is properly saved and displayed + 29. Fixed bug in quotes with setting recipient for quote edit + 30. Fixed incorrect linking to permanently deleted users/companies in Quotes + & Project requests + 31. Fixed an issue when source repository is deleted from admin page + 32. Fixed returning permanently deleted company by default, in case that + company is being looked up by name + 33. Fixed issues in Documents module for users that have permission to manage + documents + 34. Fixed potential issue with viewing Document objects by users who don't + have proper permissions + 35. Milestone is properly updated when object is moved from selected + milestone to a different milestone + 36. Project exporter will not create dead links on milestone details page + for objects that are not being exported + 37. Fixed error that caused Project Exporter to skip time and expense records + from export + 38. Fixed issue that stopped "users map" from opening to non-admin users + 39. Reloading job types after default one is changed so permissions of the + existing ones get properly updated + 40. Fixed issue with caching user's display name in project people list + 41. Fixed issue with loading permanently deleted company + 42. Fixed fatal error at public object's page when submitting a comment which + has validation errors + 43. Fixed error when trying to release time & expenses from an invoice when + its status is issued or paid + 44. Fixed access permission checks for Reports section + 45. Mitigated potential performance issue when copying many objects or + creating projects from a template + 46. Assignment filter's results exported to CSV now show labels properly + 47. Error message for min. password length now makes more sense + 48. Fixed a bug when the interface was not refreshing after uploading new + file version + 49. To Do lists now support subscribers + 50. Fixed notifications for assignees and subscribers of subtasks added to + tasks + 51. Notifications for subtask assignee in To Do list now work + 52. Fixed inconsistency at discussions add/edit form (one/two sidebars view) + 53. If user does not have permissions to track time, they will not be able to + set or update task estimate + 54. Fixed vCard import crash ($str needs to be scalar value) + 55. Due to various Opera bugs, version of page optimise for print opens a new + window instead of being printed in the background + 56. Upgrade script properly handles uncategorized pages + 57. Added server-side check for deleting the last home screen tab + 58. Fixed bug with upgrade script reporting too low memory limit in case that + it's set to -1 (unlimited) + 59. Fixed condition that finds recurring profiles that should be sent today + +activeCollab 3.1.10 [2012/07/12] +================================================================================ + +Enhancements: + + 1. Added ability to specify how invoices are called (so you can easily cover + situations where your country requires that invoices are displayed as + "Tax Invoice" for example) + 2. Files tab added to milestone details page + 3. Added options to sum time records and expenses when invoice is created + based on a result of a tracking report + +Bug Fixes: + + 1. Better clean up of home screen widgets and tabs on module uninstallation + 2. Sample Theme is automatically uninstalled by the upgrade script + 3. Fixed API error when file has versions + 4. Invoice related email notifications show note, not comment + 5. Task assignee is subscribed and notified + 6. Fixed issue with assignment filters and filtering by selected milestone + and / or category + 7. Milestone is preserved when project is created from a template + 8. Subtasks are properly rescheduled when milestone is rescheduled + 9. Fixed problem where New Subtask notification displayed person that + created parent task or to do list as subtask author + 10. Internet Explorer 8 slow script error covered + 11. Trash popup properly updates when one of the notebook pages that has + sub-pages is restored + 12. Interface does not break if user tries to log in after log out without + refreshing the page + 13. Fixed an error that shifted milestones one day back on timeline tab and + milestone details page + 14. Sample theme is automatically removed by the upgrade script + 15. User is redirected to Repositories page when source repository is removed + from a project + 16. Estimate can be updated in project outline + 17. Failed to load class 'EstimateInspectorProperty' error fixed on task + print page + +activeCollab 3.1.9 [2012/07/09] +================================================================================ + +Enhancements: + + 1. Email notifications: simplified templates + 2. Email notifications: improved readability on small screens + 3. Forms now wait for attachments to upload + 4. One click change label for subtasks + 5. Labels are displayed in object list for projects and tasks + 6. If object is private, little icon is displayed in the object list + 7. Comments widget now displays comment number + 8. System no longer sends four notifications when invoice is marked as paid + (it sends two now: one to payee, and one to financial managers) + 9. Added dd/mm/yy and dd/mm/yyyy date formats + 10. From, To, and Created on cells in e-mail log will no longer break into + more lines + 11. Inline images now support links + 12. Minor tweaks with sharing and non-registered users + 13. Tasks show task ID in title + 14. Page title is now in "Page Title - Site Name" format + 15. Design of redesigned reminder tightened up + 16. Project name included in comment, subtask and reminder notifications + 17. System will notify administrators when mailbox is auto-disabled + 18. activeCollab loads 30 instead of 50 recent activity entries + 19. Financial manager see all people (but can't manage their accounts) + 20. It's clear that project is archived when viewing Project at a Glance page + 21. Mobile Interface: Show only active tasks on My Assignments page + 22. Added Files tab to project milestone page + 23. Show/hide Add User button when company is trashed + 24. Parent information included in printed detailed tracking report + 25. Improved grouping of summarised tracking reports + 26. Tasks displayed at home screen widgets grouped by completion or creation + date are now sorted from newest to oldest date, respectively + 27. Saving client from quote will now update all existing quotes with same + (non-existing) client + 28. PDF that's attached to invoice related notifications always uses + "invoice.pdf" filename + 29. Duplicate quote + +Bug Fixes: + + 1. Email notifications: fixed escaped characters in email subjects + 2. Trash is properly update when last object in a group is removed + 3. Chrome specific: fixed issue were Jump To and Quick Add would not open + after Status Updates has been opened + 4. Fixed issue that occurred when Notebook is being moved to trash + 5. Updated CURL command to include -L switch (follow redirections) + 6. Updated checking isSubscribed method in case that subscriber is anonymous + user + 7. Fixed issue upon using select_assignees helper to manage subscriptions as + well (not all subscribers were properly pre-selected during Edit action) + 8. Assignee set via comment now gets subscribed to object as well + 9. Fixed deleted label appearing within the system after it's been deleted + (caching issue) + 10. Notification context code is included in the subject ONLY if context + object is commendable (user and invoices are not) + 11. Internal: MySQL connection throws an exception on invalid escape value + 12. Fixed bug on "Nudge" page in mobile interface + 13. Fix for incoming mail when filename of body part is forwarded as a + disposition parameter, and not as inline parameter + 14. Fixed issue where label name could break in two lines + 15. Fixed URL validator (it marked URL as invalid in case when they have & + character) + 16. Email subject is no longer HTML escaped + 17. Internal: Email validator now uses PHP's filter extension + 18. Internal: Shut-up for get_magic_quotes_gpc() (to remove deprecated + warnings from error logs) + 19. Internal: Ability to specify attachment's name has been added to + application mailer + 21. If "Notify sender" is not checked, don't notify sender + 22. Fixed wrong info for object author, creation date and completed status + upon copying the object to another project + 23. Fixed "forbidden" error for project manager / admin while trying to + subscribe to objects in projects that they aren't members of + 24. Fixed potential problem with day off update + 25. Fixed copy feature for archived objects + 26. Trashed objects now cannot be copied/moved + 27. Copying an object now removes relation to milestone + 28. Fixed issue that disabled Safe feature for tracking reports + 29. To do list category is properly updated when To Do list is edited + 30. Fixed error when non-submitted Project::add() API request ended up + loading template (instead of serving Bad Request error) + 31. Improved vCard importer and fixed some import related bugs + 32. Internet Explorer compatibility fixes + 33. Skip trying to subscribe public task creator if the same user is set to + be automatically subscribed in public task's settings + 34. Fixed links to different invoicing sections depending on user's company + (owner or not) + 35. Fixed issues where last payment was not marking Invoice as paid + 36. Better propagation of state changes when project is archived or trashed + (and restored from archive or trash) + 37. Upgrade script fixes issues with empty object texts + 38. Fixed visual bug after editing a quote (client-side fail) + 39. File is properly loaded when users visits it from email notification, but + needs to authenticate first + 40. Fixed bug when project manager or admin had to be added to projects in + order to see other user's tasks via home screen widgets + 41. Fixed bug when tasks grouped by completion date were showing only open + tasks + 42. Fixed inability to choose default language in user's profile after some + other language has been set as default + 43. Fixed saving theme config option for user (disabled until new support for + themes is introduced) + 44. Fixed issue where calendar duplicated events in last couple of days of + previous month, and appropriate days of current month + 45. Fixed validation issue during creation of a new quote + 46. Fixed issue that resulted in "Failed to Load" error when user tried to + open Recent Activities tab on user's profile + 47. Prevent user from submitting form for adding user to projects if there + are no more projects that user can be added to + 48. Fixed data integrity issue that could result in project object being + imported from multiple project instead of just from the template + 49. When user is replaced, assignments are properly moved to the new user + 50. Fixed issue where users who are automatically added to new projects all + start with no permissions + 51. Fixed "Send Welcome Message" dialog style + 52. Fixed "Notify Users About this Change" feature when user is being + replaced on a project + 53. In recurring profiles, company managers from owner company are excluded + from notifications if they don't have financial management permissions + 54. RSS feed is no longer empty + 55. Cache is cleared when project tabs are re-arranged on Administration > + Project Settings page + +activeCollab 3.1.8 [2012/06/18] +================================================================================ + +Enhancements: + + 1. History API patch is applied only to Internet Explorer + 2. Assignment delegation settings are available on project level + 3. More informative user login error messages + 4. Maintenance module re-introduced + 5. Invoice counter can have fixed string length (prefixed with zeros) + 6. Module management actions now refresh the entire page + 7. Default button color changed to green + 8. Improved design of flyout dialogs + +Bug Fixes: + + 1. Slow script bug fix for browsers that implement History API natively + 2. Fixed issue where Save As and Delete options for filters were displayed + even to users who can't use these actions + 3. Compiled templates are cleared when module is installed or uninstalled. + They are also cleared after each upgrade + 4. Fixed error when user tries to save a new notebook page version + +activeCollab 3.1.7 [2012/06/16] +================================================================================ + +Enhancements: + + 1. Force check that notifications are sent only to active users + +Bug Fixes: + + 1. When invoice notification is sent to a client, PDF version of the invoice + is included as an attachment + 2. Fixed Day Overview widget issue that resulted with query error + 3. Improved handling of notebook pages when notebooks and pages are moved to + trash and restored from trash + +activeCollab 3.1.6 [2012/06/15] +================================================================================ + +Enhancements: + + 1. New client side events: content_loaded and single_content_loaded + 2. Incoming mail will notify administrators if it fails to check mailbox + because of a validation error + 3. Client see person who issued an invoice, not a person who created it + 4. Activity logs are much faster now, and consume less resources + 5. Browser history manipulation improved on the AJAX load for the Projects + index page + 6. Day off name no longer needs to be unique + 7. Added archive for documents + 8. Invoice form: Add From Template option will overwrite default invoice item + if it is empty + 9. Quick search now can search for documents as well + 10. SVN can trust server certificate (added --trust-server-certificate to svn + executable call) + 11. My Discussions widget optionally displays discussions from completed + projects (off by default) + 12. Tracking reports display parent info for time records and expenses that + are tracked for a task + 13. Estimates use hour notation + 14. Defined default home screen for people managers (same as for project + managers for now) + 15. Quotes: saving client now optionally sends a welcome e-mail + + +Bug Fixes: + + 1. Rebuild localisation bug fixed + 2. Collectors show file path only when app is in debug or development mode + 3. Permanently deleted objects can't be accessed + 4. App.isValidEmail() is no longer case sensitive + 5. Situation when server_name is not properly set will no longer break the + system + 6. Break lines are no longer cleaned from paragraphs by HTML sanitizer + 7. activeCollab will obey Return-Path and Auto-Submitted email headers + 8. If someone adds an address of defined incoming mailbox to CC, that + address will not be automatically subscribed + 9. Quick search is more reliable + 10. Fixed message analyzer in source module + 11. Source module search index related bug has been covered + 12. Fixed repository upgrade issue + 13. Trashed users are not displayed on project people pages + 14. Show only visible repository project objects in source admin section + 15. Project progress refreshes when we change objects milestone or when we + move it to the trash + 16. Fixed print in invoices section that clients use + 17. Quick search: fixed bug where quick search would return objects that are + already deleted + 18. Quick search: fixed bug where users can't be found after their accounts + have been update + 19. Advanced search: fixed bug where advanced search would return objects + that are already deleted + 20. Tracking reports will display records for all selected users, not just + for the first one + 21. Trashed projects are no longer listed in tracking reports + 22. Upload files from shared task pages works now + 23. Error that happens when reminder is dismissed has been covered + 24. Fixed an error that happens when milestone is restored from trash + 25. Subtasks are properly showing in Day Overview widget + 26. Issue that caused recent activities blocks to be empty for clients has + been covered + 27. Delegated Tasks widget now properly displayed Delegation Settings on edit + 28. Add and edit company dialogs have the same width + 29. Fixed calculation issue that could leave an invoice open even after last + payment has been made + 30. Covered a rare issue that caused some of the objects not to be copied + from a template to the new project + + +activeCollab 3.1.5 [2012/06/08] +================================================================================ + +Enhancements: + + 1. My discussions widget now displays only active, non-archived projects. + Completed, non-archived projects can be optionally included + 2. File preview is download link for images and types that don't have inline + preview option + 3. FORCE_ROOT_URL is On by default + 4. Record parent displayed in Time & Expenses log + 5. Added option to Project Settings that lets administrator configure + whether clients can delegate tasks to all project members or just to + members of their own company that are on a project + 6. Completed objects are crossed over on project assignments page and in + assignment filter results + 7. After creating a new project from quote, user is redirected to that + project + 8. Outline: Faux milestone in outline view is now called 'Unclassified + Tasks and Todo Lists' not 'Unknown Milestone' + 9. Outline: New milestones are added before faux one, but after all existing + 10. Max upload size displayed in New File Version form + 11. Upgrade from 2.x should drop records from subscriptions that refer to + non-existing entries in users table + 12. System automatically scrolls down to the bottom of invoice items list + when there are many items in the list + +Bug Fixes: + + 1. Fixed missing method error when public task form is updated + 2. More complete localisation dictionary + 3. JavaScript error on assignments filter page in IE8 has been covered + 4. Attachments are listed for notebook pages in mobile interface + 5. Covered issue with home screen and non-ASCII characters in widget titles + 6. Fixed issue where deleted financial managers kept receiving email + notifications even after they were deleted + 7. Email address can be re-used after original account is deleted + 8. Company name can be re-used after original company is deleted + 9. Billable status is properly displayed when time & expenses report is + printed (used to show all records as Non Billable) + 10. Object that don't implement IState could display deleted comments + 11. Project managers can assign tasks to all project members, not just to + members of their own company + 12. Source code properly displays file content + 13. Added attachments to notebook pages in mobile interface + 14. Fixed WebKit specific issue with Day Overview widget and user names that + contain non-ASCII characters + 15. Related time and expenses are dropped when item is removed from an + invoice via Edit Invoice form + 16. Fixed getting visible company ID-s + 17. activeCollab will check if email address is reserved by incoming mail + when new user is being created + 18. Improved Google Calendar compatibility + 19. Project Exporter stability is improved + 20. Completed milestones that have no open tasks are displayed as 100% done + 21. List of to do lists is properly updated when new to do list is created + 22. Max length of file in Documents section increased to 150 characters + 23. Exceptions in incoming mail will not choke frequently task, but log the + error and allow for task to be completed + 24. vCard importer is no longer case sensitive when it imports companies + 25. Notebook pages list is refreshed when pages are reordered + 26. Patched FileVersion class so it uses IRoutingContext + 27. IDownloadImplemention will not fail with a fatal error if parent object + does not implement IRoutingContext + 28. Fixed potential fatal error in incoming mail class + +activeCollab 3.1.4 [2012/06/03] +================================================================================ + +Enhancements: + + 1. FORCE_ROOT_URL introduced (experimental) + 2. Improved the way incoming mail picks up message parts + 3. Added download button to shared files page + 4. Plain Text used by default in code snippet tool + 5. When categories in projects are deleted, objects that belong to that + category are now unlinked, not deleted + 6. Added Nudge and Reminder options to To Do Lists + 7. Move to Notebook has current notebook pre-selected + 8. activeCollab opens non-persistent MySQL connections by default + +Bug Fixes: + + 1. file_is_writable() is aware whether file exists or not + 2. Smarty reconfigured to be in auto-clean mode + 3. Fixed issue with invoice creation after upgrade from activeCollab 2.3.x + 4. Code snippets now properly display type icons + 5. Corrected date in comments on shared pages + 6. Fixed issue with Add to Projects tool + 7. System displays Recent Activities to user who is viewing his own profile + or to a project manager on user's profile page + 8. Fixed spelling error in recurring profiles + 9. Fixed invoice edit/add issue in case there is no defined Tax rates + 10. Archived and trashed users can't log in any more + 11. Members can track time and expenses on task level + 12. Calendar properly displays user assignments + 13. Corrected links for upgrading license in admin section + 14. Fixed issue with select company picker in quotes for users who are not + financial managers + 15. Save client visibility in quotes for users who are not people managers + 16. Select company picker takes care of companies that are visible to user + 17. SQL error triggered by Tasks model has been covered + 18. Due date was off by one day in some situations in subtasks section + 19. Dependency on Horde_String removed + 20. Link popup properly picks up selection when it has brackets + 21. Fixed download for PHP setups that automatically use GZIPed buffer + 22. Improved the way "Minor Revision" picker looks like in mobile interface + 23. Password reset fixed in mobile interface + 24. Corrected URL for PayPal Express production mode + 25. Custom payment fix for 1000 amounts + 26. Email address can contain capitalised letters + 27. Numerous tweaks to HTML sanitizer + 28. Corrected invoice creation when there are no tax rates defined + 29. Fixed Internet Explorer 8 bug on Roles & Permissions page + 30. Long project names go over icons on project overview page + 31. Notebooks page in Mobile Interface has been patched + 32. Enhanced basic file uploads to work properly in Chrome + 33. Active projects can be trashed + 34. Quotes are properly sent now + 35. Documents preserves file name when file is downloaded + 36. Fixed breaking home screen when user in day overview widget has + apostrophe or double quotes in name + 37. Fixed showing client company managers to people who are not allowed to + see those users + 38. Fixed routing error display in production mode + +activeCollab 3.1.3 [2012/05/26] +================================================================================ + +Bug Fixes: + + 1. Fixed upgrade issue that affects activeCollab 3.1.1 users + 2. Fixed allow_payments field type in invoices table + +activeCollab 3.1.2 [2012/05/25] +================================================================================ + +Bug Fixes: + + 1. Fixed an error in daily task caused by mailing log clean-up + 2. float_to_time() fix for integer input values + 3. Fixed PayPal Express payment for client company managers + 4. "Notebook" prefix removed from notebook titles + 5. Removed option to create new objects from archived milestones + 6. Fixed situations when invoices were not always connected with projects + that they are based on + 7. Fixed invoice draft deletion issue + 8. Built-in (en_UTF-8) is not editable via administration + 9. Fixed permanent project deletion + 10. Fixed issue with new file version upload + 11. Day and month names can be translated now + 12. Fixed issue when milestone could not be created if tracking module was + not installed + 13. Less agressive HTML cleaner + 14. Fixed problems where in some cases project slugs ended up with non-ASCII + characters + 15. Fixed error on Quotes page + 16. Issue with upgrade script 17 covered (it used to end the upgrade) + 17. Fixed issue with can_use_api permission upgrade + +Enhancements: + + 1. activeCollab forces IE to run in standard mode + 2. People on Project People page sorted by their name + 3. Link To does not replace selected text with target name + 4. Label added to project's details page + +activeCollab 3.1.1 [2012/05/21] +================================================================================ + +Bug Fixes: + + 1. Option to create new tasks, discussions etc removed from details page of + archived milestones + 2. Fixed issue with subscribe / unsubscribe options on archived objects + 3. "$invoker not defined" JavaScript error fixed + 4. Scroll bar for invoices that have more than 7 items + 5. Fixed task counter and progress calculator for milestones + 6. Fixed issue with project icon change + 7. Fixed to do list filtering + 8. Notebook page preview fixed + 9. Option name for Pin option in Global Documents section + 10. HTML cleaner improved + 11. Installer and upgrade script now check whether config/version.php is + writable + 12. Subscription tweak for objects created with an email + 13. Admin Tools are displayed to administrators even when system is not in + development mode + 14. Completed On filter issue fixed in assignments filter + +Enhancements: + + 1. Fixed title for login page + 2. Client details added to Project at a Glance page + 3. Download option highlighted for Global Documents + 4. Completed items are crossed over in calendar view + 5. Various sharing improvements + 6. New icon for Rebuild Indexes administration tool + + +activeCollab 3.1.0 [2012/05/18] +================================================================================ + +Final stable activeCollab 3 release. Major new features and improvements: + + * All new interface brings faster navigation, less clutter and powerful + tools (navigate without refresh, object lists, great visual editor etc) + * activeCollab looks and works great on modern phones + * Outline and timeline view make project management much easier + * Tickets are renamed to tasks, checklists to to do lists and tasks to + subtasks + * Pages module renamed to Notebooks and significantly improved + * Configurable home screens with support for extension via modules + * Workweek and holiday configuration with smart assignment rescheduling + * Invoicing module now features invoice designer, quotes and payments + * Time tracking module has been extended with estimates and expense tracking + * Specify job type when tracking time. Each job type has its own hourly rate + * Set project budgets and see how project resources are spent, in real time + * Labels for projects and tasks enable easier status tracking and sorting + * Email integration offers email queue, email log and all new templates + * Incoming mail now supports definition of message filters + * Mail cleaner will remove quotes and signatures from replies + * Share project data with people who don't have an account in the system + * Powerful assignment filters and tracking reports + * GIT and Mercurial support added on top of SVN support to Source module + +... and much more. There's not a single section in activeCollab that haven't +been improved with this release, at least a bit! + +Enjoy! +activeCollab Team + +activeCollab 2.3.10 [2012/05/10] +================================================================================ + +Security: + + 1. Fixed SQL injection issue in project object class + 2. Fixed XSS issues with select users and select projects widgets + 3. Upgrade script steps can't be triggered without logging in as + administrator + + Thanks to http://www.stratsec.net/ for the report. + +Bug Fixes: + + 1. Project filter and group options could not be applied both at the same + time + 2. In project exporter corrected ticket ID numbers, links to tasks, added + time records from tasks to tickets and checklists + 3. Fixed missing project grouping options for some users having admin role + +Enhancements: + + 1. Backup restore instructions switched from a PHP file with a comment to a + text file + 2. Updated the list of file types whose source can be displayed + +activeCollab 2.3.9 [2012/03/21] +================================================================================ + +Security: + + 1. Fixed XSS problem with theme names (high) + 2. Added CSRF vulnerability check for editing password and company/role (medium) + 3. Secure flag is set to On for cookies when activeCollab uses HTTPS (medium) + 4. Login form does not re-print user password after failed authentication (medium) + + Thanks to Nokia and Nixu.com for the reports + +Enhancements: + + 1. Options menu can be toggled on click (was toggled on hover only) + +Bug Fixes: + + 1. Quick-fix for issue in TinyMCE when using backspace/delete in first item in an list + +activeCollab 2.3.8 [2012/02/09] +================================================================================ + +Licensing: + + 1. License agreement updated: http://www.activecollab.com/docs/manuals/licensing/license-agreement + +Enhancements: + + 1. Shipping latest stable TinyMCE release (v3.4.8), which now enables rich- + text editor to devices using iOS5 + 2. PHP 5.4 compatibility + +Bug Fixes: + + 1. Fixed problem with BenchmarkTimer class in CronController when system is + not in DEBUG mode + 2. Company invoices are listed on pages + 3. Only administrators can change role of another administrator + 4. Fixed error reports by Backup module + 5. Fixed issue with rich-text editor when activeCollab is used via mobile + interface + 6. Upgrade script does not enforce persistent connection + 7. Fixed JS "return false;" issue with IE 7 & 8 + 8. Output redirection bug fixed in Source admin section + 9. Missing 3rd parameter in Category::canAdd + 10. Fixed setting a project as favorite using drag & drop + +activeCollab 3.0.0 [2011/12/29] +================================================================================ + +First public activeCollab 3 beta release + +activeCollab 2.3.7 [2011/11/30] +================================================================================ + +Enhancements: + + 1. Users from archived companies are now excluded from the dialog for + adding users to a project + +Bug Fixes: + + 1. Escaped repository password + 2. Nested lists in visual editor are properly saved + 3. jQuery UI upgrade and IE drag and drop compatibility + 4. Fixed deleting project's icon + 5. Fixed few issues with print preview + 6. Fixed default date and time format issue for Windows + 7. If there is only one admin role, it's system or admin access cannot be + turned off + 8. Fixed the bug in the assignment filters, when pointing "completed on" + to a specific date and setting status "both active and open" actually + showed completed objects only + +activeCollab 2.3.6 [2011/11/01] +================================================================================ + +Enhancements: + + 1. Improved thumb.php + 2. People with manage permissions in specific section (discussions, files, + pages, tickets) can also manage categories in that section + 3. Removed extra database lock while emptying the trash + 4. If there are too many trashed objects, they will be deleted in chunks + (not all at once) + 5. Status updates now can be deleted + 6. Basecamp data importer included in Corporate and Small Biz builds + +Bug Fixes: + + 1. Fixed subscriptions page problem when project is empty + 2. Fixed permission checking for tasks assigned to a user who can't edit + parent ticket, checklist or a page + 3. Fixed favicon URL for login screen, as well as error page + 4. Fixed issue when assignments filter was including comments in the results + in some cases + 5. Fixed issue when trash was reporting to be empty and it wasn't + 6. Fixed bug where admins and project managers were being able to perform + search only across projects that they were added to + 7. Fixed PHP compatibility message for Incoming Mail and Importer modules + 8. Master categories at Admin page are now sorted in the same way as + they are sorted within projects + +activeCollab 2.3.5 [2011/09/16] +================================================================================ + +Bug Fixes: + + 1. Fixed PHP4 compatibility error in Subscriptions class + 2. Fixed Google Chrome issue with print preview stylesheets + +activeCollab 2.3.4 [2011/08/12] +================================================================================ + +Enhancements: + + 1. Favicon updated + 2. Directories having invalid name are excluded from modules list + 3. Objects can also be completed by using "completes" keyword in commit + messages + 4. Text excerpt adds white-space between paragraphs instead of "glueing" + them together + 5. Email notifications about new comments now include links attachments + (if any), and don't include parent object information block any more + 6. Admins and project managers can see all projects at projects list while + adding/editing an invoice + 7. Invoice number generator counters can now be manually set in admin panel + 8. Added character counter for status update message and blocking input when + the limit exceeded + 9. Ticket IDs are preserved upon creating a project from a template + 10. Tickets and tasks now use VEVENT instead of VTODO when exported in ICS + file type + 11. Improved recognition of Droid and Palm devices + 12. Improved Assignments by adding more options to filters + 13. Added "Reset password" to mobile interface + 14. Comments are now displayed as newest first; comment form moved above the + comments + 15. Added more recent activities on Dashboard and Project Overview + 16. Added "Subscriptions" link to user options and "My Subscriptions" to + project overview for easy subscription management + 17. Edit option for comments is locked one hour after the comment is posted + 18. No more "free for taking" tasks + + +Bug Fixes: + + 1. Fixed bug when eval() function throws an error while exporting projects + 2. Fixed bug with invoices where there was typo in one of the parameters in + Invoices class (condition instead of conditions) + 3. Fixed deadlock MySql issue - try 3 times before throwing an error + 4. Fixed warning message at parsing commit messages + 5. Fixed regex which was failing to validate URLs containing query string + (e.g. custom logout URL) + 6. Fixed editing "Issued on" value for invoices + 7. Fixed downloading files issue - ob_end_clean() + 8. Fixed subscribing project leader to tickets added via Quick Add + 9. Fixed pagination at company invoices page + 10. Checking for more error strings in Svn response + 11. Fixed selecting target project at resolving mail conflict + 12. Fixed viewing objects moved to other project via objects' old links. + 13. Fixed disappearing of assignment filters added to the group named "Other" + 14. Fixed setting wrong user and time for previous page version + 15. Fixed SVN issue when, on some systems, SVN repository always returns one + log even if there are no new ones + 16. Fixed calculating first day of the week that wasn't working as expected + in some cases + 17. Fixed error at mailbox add/edit page when neither Tickets nor Discussions + module are installed + 18. Fixed issue at checklists page when no tasks could be added + 19. Fixed displaying company users via API + 20. Some phrases were not available in the translation tool + 21. Fixed double status message posting + 22. Fixed default "Late" assignment filter showing completed objects + 23. Fixed issue when tasks rescheduled by a milestone were diplaying old due + dates + 24. Fixed issue when user with ability to manage an object couldn't manage + its subtasks + 25. Administrators and project managers can see all projects via mobile + interface now (before only projects assigned to) + 26. Fixed displaying 'Object' instead of selected date and date range in some + environments at assignment filter's details block + 27. Fixed showing all assignments instead of none, when selected company has + no users or no visible users + 28. Fixed print preview failing to load stylesheets in Safari 5.1 + 29. Fixed fatal error in setups using persistent connections but not having + them enabled on system level + + + +activeCollab 2.3.3 [2011/05/16] +================================================================================ + +Bug Fixes: + + 1. Fixed logo uploading in Company identity section of activeCollab + administration + 2. Email notifications when adding Documents + 3. Time reports now displays time records for anonymous users + 4. Fixed Go button on arhived ticket page + 5. Fixed problem with Page Version delete permissions + 6. Fixed importing language from xml issues when there's a translation for + one module only / translation for module has a single translation entry + 7. Fixed filemtime() PHP warnings when logo and avatar URL-s are returned + 8. Fixed PHP warning in ProjectPeopleController class + 9. Fixed bug with invoice unit price value while another language is chosen + where point (.) was interpreted as comma (,) thus preventing company + address to be rendered correctly + 10. Fixed bug for showing compare differences between revisions + 11. Fixed bug for time entries of deleted users when using project exporter + 12. Fixed bug to use "Use error output redirection" in Source Settings by + default + 13. Improved Internet Explorer 9 compatibility + +activeCollab 2.3.2 [2010/07/16] +================================================================================ + +Enhancements: + + 1. Only administrator can change password of another administrator + 2. TinyMCE upgraded + +Bug Fixes: + + 1. Fixed Source module bug (browse repository link error) + 2. Fixed Source module bug (update repository JS problem in IE) + 3. Change commits visibility on repository visibility changes + 4. Fixed MIME type issue with documents and attachments + 5. Ticket priority is properly set when ticket is created by incoming mail + 6. Fixed fatal error on status page when there are no status messages in the + database + 7. Fixed issue with task complete / reopen action in mobile interface + 8. Attachments can be deleted only by people who can edit parent object + 9. Only people who can see an object can subsctibe to it + 10. Fixed long URL problem with projects select widget when there's a lot of + projects to be excluded + 11. Fixed problem when system failed to connect time records with invoices + based on time reports + 12. Fixed problem with Styles menu in visual editor + +activeCollab 2.3.1 [2010/06/18] +================================================================================ + +Enhancements: + + 1. Added information on when the reminder was sent + 2. Added list of available modules to the welcome message + 3. Welcome message on the Dashboard is displayed only to Administrators + 4. Replies have been added to status module + 5. Copying/moving milestones to another project now allows copying/moving + all related objects (tickets, checklists, files, discussions) + 6. STDERR to STDOUT redirection (2>&1) in Source module's SVN commands is + now optional + 7. Added config option for limiting number of subscribers that are printed + on each page that lists them + 8. Source module can be accessed trough mobile interface + 9. Added message when a user who does not participate in any active projects + tries to download the .ics file + 10. Added --trust-server-cert option to Source module + 11. Added support for custom number of decimal spaces used in invoices, use + INVOICE_PRECISION in config.php to determine how many decimal spaces you + need. Maximum number of decimals supported by system is 3 + 12. Tax rate now can have 3 decimals + 13. Users on project's People tab are ordered by name + 14. Copy / Move to Projects lists all available projects to project managers + and administrators + 15. System sets Return-Path for outgoing messages + 16. Better canUnsubscribe() permission check for project objects + 17. Administrators, project managers and people managers can add people from + any company to projects + 18. Status updates module now supports replies to individual messages + 19. User has an option to avoid sending notification to company specified on + an invoice when adding last invoice payment + 20. Now the following fileds can be set through the API for project objects: + created_on, created_by_id, created_by_name, created_by_email + +Bug Fixes: + + 1. Source module is translatable + 2. Fixed problem with formatting of time data + 3. Fixed "With Selected ..." button style + 4. Improved edit time record form + 5. Fixed problem with pagination not remembering selected category in + Documents module + 6. Fixed problem with relation between milestones and checklists being lost + when project is created from a template + 7. Fixed bug with callback functions of modal dialogs + 8. Fixed issue with converting uppercase hyperlinks + 9. Fixed incorrect date for "last comment on" for discussions copied from + other projects + 10. Fixed bug that was crashing invoicing module when there is invoice which + is issued to the company which is deleted + 11. Fixed bug with invoicing module in which two or more invoices can share + same timerecords attached to them. From now on, when you assign + timerecord to one invoice, it can't be assigned to invoices created + afterwards + 12. Fixed diff/compare/history issue that affected some files in Source + module + 13. Fixed bug with number rounding in invoicing module + 14. Fixed bug with corrupted archives while using project exporter on some + installations + 15. Fixes for uploaded files permission and for cache file permission. File + permission can be overridden now with simple config option + 16. Fixed incorrect hidden input value when editing documents + 17. Fixed problem with long MIME type strings + 18. Warsaw moved into a correct time zone + 19. Fixed issue when long user agent string could cause query error when + MySQL is in strict SQL mode + 20. Improved PHP 5.3 compatibility + 21. All projects are listed in projects archive to administrators and project + managers when viewed by client + 22. Fixed missing argument warning in on_project_overview_sidebars handler + 23. Correct page version author is displayed on Pages tab + 24. Mobile interface now displays login error messages + 25. Fixed bug, when visitor receives 'Page not found' error when visiting + assignments page after deleting default assignments filter + 26. Fixed issue with logo resizing in invoicing administration + 27. Single quote (') is now allowed in email addresses + 28. Fixed issues with tr_TR locale + 29. Fixed issue with visual editor when caret gets moved to the beginning of + the editor after pasting text + 30. Removed completed objects from the project calendar iCal feed + 31. Visual editor disabled for mobile browsers (most of them do not support + content editable, or iframe design mode) + 32. Company name is 'cached' in invoice in case that company gets deleted + 33. Fixed issue where on some activeCollab setups if you try to download + PDF version of invoice, you receive fatal error message. + 34. Pinned projects list only projects that user is member of + 35. System does not allow last system administrator to change his system role + to a role which does not have administrator permissions + 36. Fixed issue with archive and RSS icons in status updates dialog + 37. Listing files in /work folder with browser is now disabled + 38. Installer sets COOKIE_DOMAIN to empty value in case of localhost + 39. Fixed problem when "Upload Now" on Files tab could not be translated + 40. Added stripos() for PHP4 compatibility + +Security: + + 1. Fixed potential XSS problem in SVN commit messages + 2. Fixed module, action and controller variable validation + (problem reported by Jose Carlos de Arriba) + +API Changes: + + 1. Status messages now return the URL of the user's avatar + 2. Added 'system_edition' field to /info command + 3. Added /projects/:project_id/files/categories call + 4. Added /projects/:project_id/discussions/categories call + 5. Added /projects/:project_id/tickets/categories call + 6. Added /projects/:project_id/pages/categories call + 7. Category filtering for tickets, pages, discussions and files + +activeCollab 2.3 [2009/10/09] +================================================================================ + +Enhancements: + + 1. Better option names on export project page + 2. Email address that is already in use by an user account can't be used for + incoming mailbox + 3. Clicking user's name in the list of commits in the Source module leads to + the list of commits made by that user + 4. Manage invoices permission management added to Invoice module page + +Bug Fixes: + + 1. Fixed problem when thumbnails are not loaded when warnings are on in + PHP 5.3.0 + 2. Stripped style comment from text when text is pasted from Microsoft Office + application (Word, Outlook etc) + 3. Time reports do not ignore time from deleted users any more + 4. Link to user profile from Source module now follows the way all other + URLs are formed + 5. Fixed issues when project icons, client logos and user avatars smaller + than 40x40px ended up with black background when resized + 6. Fixed issue with mobile interface on pages with categories and project + groups on setups with PATH_INFO_THROUGH_QUERY_STRING turned on + 7. Fixed print preview crashes in Internet Explorer + 8. admin_access and project_management permissions now override + can_see_private_objects permission + 9. New Company option removed from client picker on New Invoice form + 10. Fixed problem with number formatting + 11. Fixed bug when milestones got wrong dates on exported project + +activeCollab 2.2.2 beta [2009/09/29] +================================================================================ + +Enhancements: + + 1. Source module has the ability to set custom 'config-dir' for Subversion + +Bug Fixes: + + 1. Fixed PHP4 compatibility problem in PdfSettingsAdminController class + 2. Fixed 'duplicate entry for key...' in Source module + 3. Fixed bug on page with invoices listing where instead total price with + tax, price without tax is shown + 4. Fixed number rounding issue on 'Add Payment' page of Invoicing module + 5. Issued invoice now can be edited + 6. When creating invoice based on ticket and project time report, project + field on invoice form is preselected + +activeCollab 2.1.4 [2009/09/28] +================================================================================ + +Enhancements: + + 1. When an assignment is re-assigned, new assignees are automatically + subscribed to it + 2. All project template categories are copied to a new project + 3. Milestone information is included in email notifications + 4. DST setting now supports "-- System Default --" value on user profiles + 5. Emails sent from people who don't have access to certain incoming + mailbox, now can be manually imported while preserving original author + 6. PCRE (Perl-Compatible Regular Expressions) is required extension + 7. Added GMT -4:30 time zone + 8. XML extension has been added to optional, but recommended extensions list + 9. System will not throw a warning if PHP works in safe mode when it tries + to set default timezone to GMT + 10. Added option to filter archived projects by status + 11. When email is imported it updates last activity time in profile of the + user who created it + 12. Fixed PHP5.3.0 preg_quote() compatibility issue + +Bug Fixes: + + 1. Section labels used in select project permissions block now can be + translated + 2. Fixed problem where Quick Add time record form could not processed time + in 3:30 format + 3. Fixed problem where related tasks were not properly rescheduled when + parent milestone was rescheduled + 4. HTML entities are not double escaped in ticket titles + 5. Fixed issue with image visibility in Documents for non-admin users + 6. Fixed bug in mobile interface when using pagination on some installations + 7. Android based mobile devices now use interface made for iPhone devices + 8. System "system_access" permission can't be removed any more from the last + admin role + 9. Title of dialog window for changing avatars/logos/icons is now using + distinct text, instead of "Change icon" for all three of them + 10. After switching the language in user settings, confirmation message is + no longer displayed in previous language + 11. Fixed localization issue with New Task activity log entries + 12. Fixed problem with Unicode tags + 13. Download file links force download + 14. User can set due on date when creating ticket via quick add dialog + 15. Fixed who can see private document message + + +activeCollab 2.2.1 beta [2009/07/20] +================================================================================ + +Enhancements: + + 1. Added default logo for PDF invoices generated by invoicing module + 2. Improved the way activeCollab works with user sessions + 3. Cookie domain is configurable (if needed) + +Bug Fixes: + + 1. Fixed broken 'New Invoice Form' in IE6 and IE7 + 2. Tax Rate names in invoicing are not unique anymore + 3. Invoice can be issued only to company managers + 4. Predefined item template is not truncated anymore + 5. Source module notification e-mails include commit details (if there are + 10 or less commits in an update) + 6. Fixed bug in Source module when trying to view objects that were removed + from a repository + 7. Repositories from non-active projects are excluded from updating + 8. Fixed switching revisions in Source module + 9. "SVN executable not found" replaced with message that is being returned + from svn/command line + 10. Fixed PHP5.3.0 preg_quote() compatibility issue + +activeCollab 2.1.3 [2009/07/16] +================================================================================ + +Enhancements: + + 1. Added auto-reconnect for situations when MySQL closes connection in the + middle of the request + 2. Added new config options for better controlling the way mailing is + working (native mailer and marking messages as bulk options) + 3. System permission 'manage_trash' has been added + 4. Administrators and project managers see all objects that are in the Trash + 5. GZIP compression for assets (js, css and print collector files) can be + turned off by setting COMPRESS_ASSET_REQUESTS option to false in + config.php file + 6. {title} accepts language parameters just like {lang} does + +Bug Fixes: + + 1. Fixed fread() problem in collector files + 2. HTML Purifier now uses /cache folder to cache definitions + 3. Styles in visual editor are translatable + 4. Time records API returns same records as web interface + 5. Fixed notice in DashboardController + 6. Many localization fixes and tweaks (thanks to Frederik Sauer) + 7. Welcome message after user login is now in user's language + 8. Fixed problem when, in some rare cases, task parent form was loaded when + tasks was created with AJAX request + 9. Aligment of 'Complete ticket with this comment' checkbox fixed + 10. Empty Return-Path turned off by default + 11. Uppercase letters can be used in email addresses + 12. Fixed infinite visual editor explanding in Google Chrome + 13. Fixed issue where on some installations, incoming mail was treating first + empty line in the imported email, as beginning of hidden email history + +API Changes: + + 1. Comments now return list of files attached to them + 2. Fixed problem with Pages category not listing pages in API response + +activeCollab 2.2 beta [2009/06/25] +================================================================================ + +Enhancements: + + 1. Introducing Invoicing module in Corporate version (beta!) + 2. Introducing Source module in Corporate version (beta!) + +Bug Fixes: + + 1. Fixed fread() problem in collector files + 2. HTML Purifier now uses /cache folder to cache definitions + 3. Styles in visual editor are translatable + 4. Time records API returns same records as web interface + 5. Fixed issue with visual editor auto-expaner in Google Chrome + +activeCollab 2.1.2 [2009/06/13] +================================================================================ + +Enhancements: + + 1. Archive link in Projects is now aware of selected client and group + 2. HTML Purifier upgraded to version 2.1.5 (last PHP4 compatible version) + 3. Only people with manage permissions in Time section will see mass edit + checkboxes and controls + 4. Scheduled Tasks page now includes instructions for executing scheduled + tasks using PHP command line interface + 5. Billable status is automatically set to Yes in quick add dialog + 6. Added links to upgrades in Administration > System Information block + 7. People now see companies that are set as clients for a project even when + members of that company are not involved in a project + 8. Task notifications include link to parent object (ticket, checklist etc) + 9. Status module page with easy to access permissions added + +Bug Fixes: + + 1. Fixed buggy quick add dialog behavior + 2. Language importer is now more careful when importing languages from + broken xml + 3. Backup module on some installations was sorting previous backups by + their modification time instead of creation time + 4. Long links in Page diffs could make the diff block too wide and break the + layout in Safari + 5. Fixed issue with date filter for assignment filters + 6. Fixed project icon caching issue when project client is changed + 7. Fixed problem where projects with owner company set as a client are not + considered internal + 8. Fixed project exporter chrashing on some servers with PHP installed as + ISAPI on IIS + 9. Fixed time record creation / upgrade problem on some installations + 10. The last administrator in the system cannot disable "admin_access" + permission for his role + 11. Add links on milestone details page are aware of permissions now + 12. Fixed project exporter issue where attachments to pages and discussions + were not exported + 13. Fixed time reports that in some cases did not properly calcualte total + time if there was 1000 or more hours logged + 14. Email address validation now supports something+something@something.com + addresses + 15. Fixed iCalendar feed generation on PHP 5.0.x versions + 16. When user tries to delete a document from Documents section he will be + asked to confirm the action + 17. Bugfix for Safari 4 which was causing textarea to be stretched vertically + on page scroll + 18. Fixed automatic URL conversion bug that was introduced in v2.1.1 + 19. Object can't be restored if its parent is still in Trash + 20. Fixed issue with client tabs when projects are grouped by client + 21. Upgrade script did not properly update parent type for some attachments + 22. Fixed issue with deleting company logos, project icons, and user avatars + in dedicated pages + 23. Fixed problem with mass edit of time records in IE8 + 24. Fixed layout issues with popup dialogs in IE6 + +activeCollab 2.1.1 [2009/05/19] +================================================================================ + +Enhancements: + + 1. Increased number of comments per page to 25 + +Security: + + 1. Fixed XSS problem when error dump is displayed + 2. Fixed possible path exposure in error dumps + +Bug Fixes: + + 1. Object types in quick add module now are properly translated + 2. Fixed scrolling in quick add popup + 3. Covered some phrases that were not available for translation + 4. Added option in incoming mailbox add/editing form, to accept emails from + registered activeCollab users which are not added to project specified + in that incoming mailbox + 5. Fixed issue with restoring backups, when some users were having "Access + Forbidden" issues + 6. Fixed project description bug in mobile interface + 7. Fixed issues with incoming mail MIME encoding problem + 8. Fixed issue with quick add dialog, when it breaks apart when there is + more than ~10 projects + 9. Title of new company dialog was not properly named + 10. Fixed link auto discovery when link is at the beginning of the sentence + 11. Status updates in RSS now have valid permalinks + 12. Fixed ordering of backups in administration + 13. Incoming Mail is configured not to accept auto-responder emails + 14. Task priority is visible now + 15. Fixed password issue when new user is created with API command + 16. Fixed error display when DEBUG level is not set for development + 17. Fixed pre_var_dump function to properly clean variable dumps + 18. Fixed All Attachments permissions problem + +activeCollab 1.1.6 [2009/05/19] +================================================================================ + +Enhancements: + + 1. RSS feeds validate + 2. When clicking on New Ticket button while in ticket category, that category + will be preselected in Category drop-down on New Ticket form. + 3. Added description below project template picker which explains who will + be automatically added to the new project. When project is created from a + template, users will be imported from a template. If no template is + selected, users will be added based on auto-assignment settings. + 4. Anyone assignment filter returns task by ignoring assignment data. Now it + really returns tasks assigned to anyone. + 5. Not assigned assignment filter return tasks that do not have people + assigned to them. + 6. Status filter lets you define if you wish to have all, only active or only + completed tasks listed. + 7. Next page link at the bottom of Assignments page added. + +Security: + + 1. Fixed XSS problem when error dump is displayed. + 2. Fixed possible path exposure in error dumps. + +Bug Fixes: + + 1. Fixed pubdate bug in RSS generation. This cause problems with some RSS + readers because correct name of element is pubDate. + 2. Fixed problem with calendar popup in date picker being cut off in some + cases on 1024x768 resolutions or smaller. + 3. Fixed Internet Explorer print style switcher issue which caused problems + when print stylesheet was loaded for the second time. + 4. Removed Image Browser tab in Insert image tool. This feature was never + implemented and the tab caused a lot of confusion. + 5. Fixed error when edit time record form was submitted with validation error. + 6. Fixed bug with avatar / logo / project icon upload on some systems which + return false when we use is_file() for uploaded files. + 7. Fixed problem with Select Users dialog when there was a lot of users on + Internet Explorer 6. + +API Changes: + + 1. Fixed issue where discussion request did not return discussion comments. + +activeCollab 2.1 [2009/04/29] +================================================================================ + +Final stable activeCollab 2 release. Major new features and improvements: + +New Module - Incoming mail + + 1. activeCollab can check and import email. New messages are imported as + tickets or discussions, while replies to notifications are posted as + comments. Email attachments are imported as well + 2. Define any number of POP3 / IMAP servers to receive emails + 3. Detailed activity log to spot and resolve errors and conflicts + +New Module - Documents + + 1. Global documents section is perfect for common company documents, + operation manuals etc + 2. Post text or upload files + 3. Just like tickets, discussions or files, documents can be marked as + private and visible just to a specific group of people, while invisible to + other users + +Pages Module Overhaul + + 1. Page categories for better organization + 2. Compare version tool outlines changes between two versions of the page + 3. Easy reordering and regrouping of pages + 4. Page can be reverted to any version at any time + 5. Pages tab shows recently updated documents grouped by date when last + change was made + +Improved tasks and checklists + + 1. Drag and Drop reordering for tasks in checklists, pages and tickets + 2. Drag and Drop reordering of checklists + 3. Checklist page lists all checklists and their tasks. No need to go to + checklist details page to manage tasks + 4. Improved task creation workflow + +Improved Dashboard and Project Overview + + 1. New and improved activity log + 2. List of active projects shows all of your active projects + 3. Block that shows who was active in the last 15 minutes + 4. Project Overview now shows people involved with that project + +Improved people section + + 1. Friendlier interface makes navigation and management of people much easier + 2. User can be added to multiple project at once + 3. Improved New User form. By default it asks only for data it requires, but + you can execute advanced actions if needed + 4. Welcome messages can be sent to users at any time + 5. Client companies you no longer work with can be archived. Members of + client companies are no aware that their company is archive even if they + visit the system + +Other system improvements + + 1. Subscribing and notifying people is more obvious because picker is listed + right on the form instead in the popup + 2. Notifications sent by the system are more readable and contain more + information + 3. Easier management of categories, project groups and document groups + 4. Easier subscription management + 5. New version and better integration of visual editor. Images can be + uploaded directly from the editor + 6. Easier change of avatars, logos and project icons + 7. Test connection tool for mailing settings for easier troubleshooting + 8. Better module installation process + 9. Maintenance mode + 10. Easier translation management with XML import and export of language files + 11. Default assignment filter can be specified both globally and per user + +and many, many more changes. + +activeCollab 2.0 [2009/02/06] +================================================================================ + +First activeCollab 2 beta release (for complete feature set, check 2.1 release) + +activeCollab 1.1.5 [2008/12/01] +================================================================================ + +Enhancements: + + 1. People can be moved from one company to another. + 2. Added confirmation dialog when permanently removing objects from trash. + 3. Max upload size is displayed on upload files form. + 4. Time reports can be created from Reports section inside of projects. + 5. People manager cannot promote person into administrator. Only + administrators can do that. + 6. User's role cannot be changed if he or she is the last administrator in + the system. + 7. Added visibility indicator to Pages module. + 8. When JavaScript is disabled, system will display error message alerting + the user about it. This warning can be turned off by setting + WARN_WHEN_JAVASCRIPT_IS_DISABLED to false in config/config.php. + 9. Added a page that provides instructions how to enable JavaScript in + Microsoft Internet Explorer, Mozilla Firefox and Apple Safari. + 10. iCalendar feed added on user Schedule pages. Only project managers can use + these feeds. + 11. Pending Payment status added to Time Records. There is no interface for + this status, but it can be used by modules which control time record + status (Invoicing tools for example). + +Bug Fixes: + + 1. Fixed the issue where Select Users popup is not working on New / Edit + Assignment Filter and New / Edit Time Filter forms. + 2. Fixed the issue where successive milestones are extracted based on updated + due date instead of original value. + 3. Long file names are trimmed to 40 characters on Files tab. Extremely long + file names could break interface previously. + 4. Fixed problem where Project Starts On is sometimes off by one day due to + time-zone miscalculation. + 5. If a user assignees only himself to an object, project leader now will + also be subscribed to that object, automatically. + 6. Milestone moved to another project was preserving the relations to its + child objects in the project that it has been moved from. + 7. No error/success messages were displayed after turning the cache off. + 8. If a user had only last name entered in his profile, his e-mail address + was used in assignees block. + 9. Links were not automatically converted to be clickable in ticket body, + milestone description and project overview. + 10. Fixed 'Can't copy image to work path' error upon pressing Submit with no + file selected at edit project icon, edit avatar and edit company logo + pages. + 11. Fixed problem where objects couldn't be associated with milestones in + activeCollab setups with large amount of data. + 12. Corrected the problem with displaying "unknown project" in ticket history + after moving a ticket to another project. + 13. Fixed bug where, in some cases, ago modifier returned Yesterday for + actions that happened the day before Yesterday.. + 14. Date selected by default in time popup now properly calculates user's + time-zone. + +API Changes: + + 1. In time management calls, billable_status was added. is_billable and + is_billed are left for compatibility reasons, but are consireder + deprecated. + + +activeCollab 1.1.4 [2008/10/06] +================================================================================ + +Enhancements: + + 1. Object can be copied in parent project. + 2. Ticket time shows total time logged for ticket and all of its tasks. + 3. Improved time popup. + 4. Notify Assignees checkbox removed. Assignees will always be notified. + 5. Person creating a ticket, milestone, tasks, file, discussion or page will + be automatically subscribed to it. + 6. Project section included when visiting comment, tasks, attachment and + subscription pages. + 7. When tasks / ticket / milestone is re-assigned, notification is send to + all old and new assignees except the person who did the update even if + that person is one of the assignees. + 8. When user posts a comment he or she is automatically subscribed to object + that was commented. + 9. Project leader is automatically subscribed to tickets created with Public + Submit module. + 10. In New Task form priority and due date fields are hidden by default. + 11. User's project role is displayed on People project tab. + 12. If there are no assignees / subscribers selected when object is created, + project leader will be automatically subscribed and notified. + 13. Scheduled tasks administration page shows time when was the last time + scheduled tasks were executed (if ever). + 14. Comments on tickets, discussions, pages and files can be locked. + 15. Discussions can be pinned to the top of discussions list. + 16. Added support for servers that do not properly handle path info (some + versions of IIS for example). + 17. Improved underlying Status module code. + 18. System and license information displayed on administration start page. + 19. Upload files form now returns more descriptive error messages. + 20. Project Exporter uses built in notifications instead of custom div-s. + 21. Daily, hourly and frequently tasks executed through command line do not + display output unless there are errors to be displayed. + +Bug fixes: + + 1. Security fix! Instructions for restoring backup are stored in PHP file + instead of plain text file. + 2. When object is copied in another project milestone ID is reseted if no + milestone map is present. + 3. When ticket is copied it will use next available ticket ID in destination + project instead of keeping ID from original project. + 4. Duplicate subscriptions bug resulted by incomplete cleanup routine fixed. + 5. Fixed subscription caching issues when subscribe_users() method is called. + 6. Fixed problem with HTTP status code not being properly passed when error + page is displayed. + 7. Module info loading bug fixed. + 8. Master Categories will not let you define category names shorter than 3 + letters. + 9. Fixed problem where duplicate notifications are sent to users when + reminder was sent to people involved in a discussion. + 10. Fixed caching issue when module is uninstalled. + 11. Project Exporter exports completed milestones. + 12. Fixed issue where links to modules that user selected not to export are + still present in navigation. + +API improvements: + + 1. /roles/system - List all system roles (permissions included). If user is + not system administrator or people manager only default role ID is + returned! + 2. /roles/project - List all project roles (permissions included). No + permission checking is done. + 3. /role/:role_id - Show details of any role. No permission checking is done. + 4. Implemented support for work with project groups through API. + 5. New user fields: is_administrator, is_project_manager and + is_people_manager. + 6. Project people request (/projects/:project_id/people) returns more + information including users role and permissions for every project user. + 7. /projects/:project_id request now includes logged_user_permissions field + with role of currently logged user and his or hers permissions on a + selected project (similar to project people permission information). + 8. Assignee information is included in Ticket, Task and Milestone details. + 9. API for Status message - /status for listing and /status/add for + submitting messages. + 10. avatar_url property added for User details request. + 11. logo_url property added for Company details request. + 12. icon_url property added for Project details request. + 13. Permissions array added to every project object details response with + following permission values: can_edit, can_delete, can_change_visibility, + can_movecan_copy and can_change_complete_status. + + +activeCollab 1.1.3 [2008/08/12] +================================================================================ + +Enhancements: + + 1. Objects can be moved / copied only by administrators, project managers and + project leaders. + 2. Next page link on Projects, People, Files, Tickets, Discussions, Time, + Dashboard and Status archive pages. + 3. Improved notification message for private objects. + 4. If attachment is private it is indicated with red dot on Files tab (as for + Files). + 5. Calendar subscription link added to Project Calendar page. + 6. File description included in list of files on Files tab. + 7. Mass change ticket visibility added to tickets page. + 8. Links are recognized in text and automatically made clickable in comments. + 9. When time record is submitted through Quick add dialog Project and Is + billable values are preserved. + 10. Caching for project icon URL-s. + 11. System notifies user if he is viewing trashed object. + 12. Prettier notifications for private and trashed objects. + 13. HTMLPurifier can be turned off by adding define('PURIFY_HTML', false); to + config/config.php file. + 14. On New User form Password field is automatically focused when user selects + to specify password. + +Bug fixes: + + 1. Last file revision is not required to be instance of User class in order + to be returned. It can also be an AnonymousUser. + 2. First field on reset password form is password field instead of text + field. + 3. Completed, canceled or paused projects that project manager or + administrator is not directly involved with are now visible in project + archives. + 4. Fixed problem where milestone start and due dates can be one day of in + some cases. + 5. Fixed problem with users last activity time logging and display. + 6. Helper that shows which action was done by whom now uses a timezone + settings of logged in user to display proper time. + 7. Due helper ignores timezone settings when displaying due date tooltip + (correct behavior). + 8. JavaScript confirm dialog for Remove User option on role details page. + 9. Is billable is set to Yes by default in Quick Add dialog. + 10. Fixed problem with tickets archive no remembering selected category for + pagination. + 11. Fixed bug where pagination does not remember parent object when listing + time records attached to task or a ticket. + 12. One day shift for milestones fixed. Calendar applications do not include + DTEND day so it needs to be set to the day after due date. + 13. Fixed problem where not billable records are not counted correctly in time + reports. + 14. Parent page select box does not list page that is being updated and its + sub-pages. + 15. Fixed problem where attachments always inherit author from parent object + instead of using logged user. + 16. Fixed problem where not all assignees are properly moved into a project + created from template. + 17. Fixed broken image link to logo in error layout and on login / forgot + password pages in mobile interface. + 18. Fix for project icon not being displayed in Jump to Project dialog if it + was inherited from client. + +AP I improvements: + + 1. Added read_only flag to /info. Value of this flag will be 0 if API + supports both read and write requests and 1 if it supports only read + requests. + + +activeCollab 1.1.2 [2008/06/07] +================================================================================ + +Enhancements: + + 1. Removed Date time format field from profile. Instead of being a separate + configuration option it is now made out of date and time options + 2. Text input is automatically focused when status update dialog is displayed + 3. People who do not have can_see_private_objects permissions but can create + projects now do not have ability to select default visibility (Private + value will be set automatically) + 4. Object visibility indicator for tickets, discussions and checklists with + popup that explains who can see private objects + 5. Session ID is not force refreshed on every request + 6. Checkbox icons next to tasks user cannot complete are not clickable any + more + 7. If user does not have permissions to create tasks under a specific object + (ticket, page, checklist) New Task link is not displayed in Tasks section + header + 8. When breaking recent activities per day system now checks users timezone + instead of just using GMT value + 9. Ago helper now displays number of hours instead of Few hours ago + 10. Better localization coverage + 11. Backup module enhancements. It does not require specific MySQL + configuration any more but uses PHP to generate / restore SQL files + 12. Site logo and favicon graphics are now in septate folder so cannot + override them by accident when updating content of /assets folder + +Bug fixes: + + 1. Fixed problem with filtering time reports for a specific day + 2. Fixed some RSS / iCal feed links that were broken + 3. Fixed :project problem in select visibility control + 4. Script will die when CSV export is served + 5. Checklist tasks are available on assignments page + 6. Only people who can edit specific tickets can attach tasks to them + 7. Only people from a specific project can be reminded using Send Reminder + tool + 8. Fixed CSS/JS caching issues with Safari. + 9. Fixed upload issue for Windows host where slashes from uploaded file path + were stripped out + 10. Today / Late counter fixed + 11. Administrators, project managers and project leaders have edit / delete + object permissions no matter what. + 12. Fixed issue when time record is shown in project history even though user + does not have permissions to access time (access permission is by mistake + inherited from parent object) + 13. Fixed date format issues on Windows servers + 14. New discussion form does not lose message field when title is too short + and needs to be revised + 15. Fixed problem where attachment cannot be delete even though user has + permissions to edit parent object + 16. Fixed problem with first screen that needs point you to the installer, but + fails to do that on Windows + 17. Permissions cache is cleaned when role is updated or deleted + 18. Assignments cache is completely cleared when assignments of any particular + object are changed. + +API improvements: + + 1. Added logged user URL in /info call so you can see who the logged person + is for API key you are using + 2. Added type to all project objects in the system. This is especially + important when you list objects of mixed type + 3. Added /project/#project_id/user-tasks call that lists all tasks currently + logged user can work on in a particular project + +activeCollab 1.1.1 [2008/05/29] +================================================================================ + +Enhancements: + + 1. Projects are ordered by name in Quick add dialog + 2. More company fields included in API result for company request + 3. System will not allow you to submit an empty status message + 4. More descriptive select_visibility helper + 5. Turn on / off thumbnail creation for images (on by default) + 6. Limit max image size when thumbnail is created (default is 500kb) + +Bug fixes: + + 1. API is working properly with .htaccess hack for clean URL-s + 2. Send Reminders properly filters out people + 3. Dictionary does not exist error when create a new translation file has + been fixed + 4. Starred items from Trash are not counted on Dashboard + 5. Fixed problem with read / unread discussions + 6. When module is removed all reminders for old objects are also removed + 7. Time filtering by date range fixed + 8. Problem with Project Exporter module and open_basedir restriction has been + fixed + 9. Problem with filtering billable, but not billed hours fixed + 10. When project is created from template number of open / completed tasks and + project progress are refreshed + 11. Fixed problem when time record is added from time page for a particular + object + 12. HTTP errors for status update count asynchronous request fixed + 13. Fixed problem when user did not receive email notification in prefered + language + 14. Problem with members not being able to see their assignments fixed + + +activeCollab 1.1 [2008/05/19] +================================================================================ + +New modules: + + 1. Mobile access - Interface created just for mobile devices. iPhone support + included - you can finally touch activeCollab! + 2. Backup - automatically back up your database and files. + 3. Project Exporter - Export project data in series of static, HTML files + that does not require activeCollab to be displayed. Burn it on a CD, + upload to your website or send it to your clients. + 4. Public Submit - Let people submit tickets without logging into + activeCollab. CAPTCHA protection included. + 5. Status - Simple, Twitter like notifications system built right into + activeCollab. + +Time tracking improvements: + + 1. Reusable reports that work both globally and on project level. Reports can + list all time records or calculate how much time every user reported. + 2. Ability to mark billable time record as billed and filter it out in + reports. + 3. Time tracking for subtasks. + 4. New time widget makes it super easy to track time. + +Improved assignments page: + + 1. Powerful assignments filter that let you select not just your tasks but + tasks assigned to any company or group of people. + 2. RSS for any assignment filter. + 3. Ability to mark filter as private so only you can use it. + 4. Ability to mark task as completed directly on assignment page. + 5. Ability to subscribe to every task and receive email notification on + status change directly on assignments page. + 6. Track time for every ticket or subtask directly on assignments page. + +Calendar improvements: + + 1. Tickets and tasks are listed in calendar. + 2. Tasks, tickets and milestones can be marked as completed directly on + calendar page. + 3. Improved performance of calendar pages. + +Improved search: + + 1. Search for users. + 2. Search for project or inside of projects. + 3. Quick search dialog is really handy. It will show top 5 results directly + in the quick search dialog and give you link if you need more. + +Localization support: + + 1. Translate the interface in as many languages you want. + 2. Per user language settings. + 3. Email translates also support translations and are aware of user language + preferences. Every user will be notified in their preferred language. + 4. Per user date and time formatting settings. + 5. Administration tools for language management and translation. + +New permissions and roles: + + 1. Every user can have a system role now, not just members of owner company. + 2. Project roles are reusable sets of project permissions. Users can have + different roles in different projects. + 3. Per module access permissions. + 4. New system permissions - can add project, can see private objects and more + +File module improvements: + + 1. Attachments are listed in files listing. + 2. Thumbnails are created for images. + 3. Tool that lets you upload multiple files at once has been added. + 4. Improved workflow. + +API improvements: + + 1. Write support for API is added. + 2. API methods are documented. + 3. Configuration option that controls whether API is enabled or disabled. + This configuration option also lets you set up API to work in read only or + in read / write mode. + +Reminders: + + 1. Send reminders regarding a ticket, discussion or file to assignees, + subscribers, specific person or people who commented on it. + 2. Reminders include email notification and entry in �Things that require + your attention� block that is shown on dashboard. + 3. Read more about reminders in Developer Blog... + +Other changes: + + 1. Any project can be used as a template for new project. + 2. Auto-assignments system has been redone. + 3. Modules that are not required for system to work properly can be + uninstalled. + 4. Checklists module is not installed in Corporate version by default. You + can install it if you really need it. + 5. User password are not readable in database any more. + 6. System that detemines witch objects are new since your last visit is more + reliable now. + 7. When list of assignees is changed everyone is notified about the changes + (old and new assignees with complete list of changes). + 8. Links for creating new objects on milestone details page. + 9. Users last visit time is displayed on profile page. + 10. A simple tool for managing file, discussion and ticket categories that + are created when new project is created. + +Plus many, many more bug fixes and improvements! + +activeCollab 1.0.6 [2008/02/19] +================================================================================ + +Enhancements: + + 1. Improved role creation process + +Bug fixes: + + 1. Fixed project group duplication on projects page when logged in user is a + member of client company + 2. Fixed build script bug that resulted in empty names for initial set of + roles + +activeCollab 1.0.5 [2008/01/31] +================================================================================ + + 1. Problem with redirection on the project people page when there are no users + assigned to a project + 2. Files are sorted so the latest ones are on top + 3. Support for passing path_info through query string (for compatibility with + hosts such as Dreamhost) + 4. Assignments page is now displayed properly even when there are no projects + in the database + 5. When ticket is moved, the system will make sure to assign it an ID which is + not used in destination folder + 6. When ticket is moved, associated time records are also moved + 7. On the Projects page, only project groups where user has projects are + available + 8. Problem with email encoding + 9. Line breaks are preserved in discussion related email notifications + +activeCollab 1.0.4 [2007/10/30] +================================================================================ + +Features and Improvements: + + 1. Milestones start and end date can be the same day + 2. Members of client companies can track time (if they have proper + permissions) + 3. Added relation between files and milestones + 4. Added Manage Attachments button to comment options group (right to authors + name) + 5. Added Manage / Add links to Attachment and Subscription headers on object + details page + 6. Improved usability of comment options + 7. Added attachment field to New Discussion form + 8. activeCollab will keep connection alive by refreshing user session every 5 + minutes for as long as any activeCollab page is open + 9. When theme is updated in Administration it will be updated for all the + users + 10. When extracting task name system will use first 15 words instead of 5 + 11. Debug backtrace is saved only for fatal errors - saves some time on PHP4 + 12. Removed timezone information from date pickers + +Bug fixes: + + 1. Fixed issue where email notifications get cut off when containing + multibyte characters on some systems + 2. Fixed pagination on project page when browsing projects by company or by + group + 3. Proper project leader is selected on edit project page + 4. Fixes JavaScript and CSS issue for servers with zlib.output_compression + set to On + 5. Comments, Attachments and Tasks will properly inherit parents visibility + 6. Fixed issue with due display and calculation + 7. Fixed problem with HTML entities being escaped two times in the activity + logs + 8. Fixed problem when user cannot be subscribed to the object if he or she + was already a subscriber + 9. File backend cache uses PHP files instead of plain text files + 10. .htaccess that restricts direct access to files in /cache, /import, /logs, + /thumbnails and /upload folders added + 11. Multibyte operations are forcing UTF-8 encoding + 12. White is used instead of black when resizing images with transparent areas + 13. Fixed select_user helper so it does not break the script when data is out + of sync in database + 14. Pagination helper will render first page even when there are no items to + show (information that there are no items is displayed in that case) + 15. JavaScript error when selecting user or assignee fixed + 16. Better data cleanup on project deletion + +activeCollab 1.0.3 [2007/10/17] +================================================================================ + +Bug fixes: + + 1. Fixed the problem with time tracking module being too restrictive about + who can and who can't add time records + +activeCollab 1.0.2 [2007/10/16] +================================================================================ + +Features and Improvements: + + 1. Improved compatibility with Safari 2 + 2. Improved search results page + 3. Trash added to the Main Menu + 4. When project is created, user is redirected to Add People page + automatically + 5. Tasks without due date are not listed on Assignments page when ordered by + due date + 6. At Assignments page, due date is displayed next to the task creator + 7. When assignments are ordered by creation time, new column with creation + time is displayed + +Bug fixes: + + 1. Fixed problem with query string generation on PHP5 versions lower than + PHP 5.1.2 + 2. Fixed syntax error in HTML Purifier when trying to use DOMLex on latest + PHP 4 version, even though it is supported only in PHP5 + 3. Fixed Not Found issue with servers that do not provide good PATH_INFO + value + 4. Administrators and Project Managers can see all of the projects in P + rojects section + 5. No permission to remove / update user permissions on some systems + 6. No permission to remove / delete category + 7. Calendar displaying all tasks / tickets to the people not assigned to any + projects + 8. Add Timerecord permission enforced + 9. Files do not get attached to objects in PHP4 + 10. Mass mailer not sending emails + 11. JavaScript initialization after AJAX request on Trash / Starred page + +activeCollab 1.0 [2007/10/05] +================================================================================ + +Initial release \ No newline at end of file diff --git a/resources/lang/en/lang.php b/resources/lang/en/lang.php index 7adc58319..73252faf2 100644 --- a/resources/lang/en/lang.php +++ b/resources/lang/en/lang.php @@ -184,15 +184,17 @@ return [ | Company Settings Page |-------------------------------------- */ - 'company' => 'Company', - 'website' => 'Website', - 'phone' => 'Phone', - 'address' => 'Address', - 'landing' => 'Landing Page', - 'offline' => 'Offline Page', - 'thank' => 'Thank Page', - 'logo' => 'Logo', - 'save' => 'Save', + 'company' => 'Company', + 'website' => 'Website', + 'phone' => 'Phone', + 'address' => 'Address', + 'landing' => 'Landing Page', + 'offline' => 'Offline Page', + 'thank' => 'Thank Page', + 'logo' => 'Logo', + 'save' => 'Save', + 'delete-logo' => 'Delete logo', + 'click-delete' => 'Click here to delete', /* |-------------------------------------- | System Settings Page @@ -243,6 +245,15 @@ return [ 'attachments' => 'Attachments', 'email_attahment_user' => 'Email attachments to the user', 'cron_notification' => 'Enable Notification cron', + 'cron' => 'Job Scheduler', + 'crone-url-message' => "These are Faveo's Job Scheduler(cron job) url for your system.", + 'clipboard-copy-message' => 'Copied to clipboard.', + 'click' => 'Click here', + 'check-cron-set' => 'to check how to set cron jobs on your server.', + 'notification-email' => 'Email notifications', + 'click-url-copy' => 'Click here to copy URL', + 'job-scheduler-error' => 'Job scheduler can not be updated.', + 'job-scheduler-success' => 'Job scheduler updated successfully.', /* |-------------------------------------- | Ticket Settings Page @@ -280,6 +291,10 @@ return [ 'registration_method' => 'Registration Method', 'user_session_timeout' => 'User Session Timeout', 'client_quick_access' => 'Client Quick Access', + 'cron' => 'Cron', + 'system-settings' => 'System Settings', + 'settings-2' => 'Settings', + /* |-------------------------------------- | Auto-Response Settings Page @@ -405,6 +420,28 @@ return [ */ 'transient' => 'Transient', 'ticket_overdue_alert' => 'Ticket Overdue Alerts', + + /* + |-------------------------------------- + | Work Flow + |-------------------------------------- + */ + 'workflow' => 'Workflow', + 'ticket_workflow' => 'Ticket Workflow', + 'create_workflow' => 'Create Workflow', + 'edit_workflow' => 'Edit Workflow', + 'updated' => 'Updated', + 'target' => 'Target', + 'target_channel' => 'Target Channel', + 'exceution_order' => 'Exceution Order', + 'target_channel' => 'Target Channel', + 'workflow_rules' => 'Workflow Rules', + 'workflow_action' => 'Workflow Action', + 'rules' => 'Rules', + 'order' => 'Order', + 'condition' => 'Condition', + 'statement' => 'Statement', + /* |-------------------------------------- | Form Create Page @@ -754,6 +791,10 @@ return [ 'merge-error2' => 'Please select ticket to merge.', 'select-tickets-to merge' => 'select two or more tickets to merge.', 'different-users' => 'Ticktes from different users', + 'clean-up' => 'Clean up', + 'hard-delete-success-message' => 'Tickets have been deleted permanently.', + 'overdue' => 'Overdue', + 'change_owner_for_ticket' => 'Change Owner for Ticket', /* |------------------------------------------------ diff --git a/resources/views/notifications-all.blade.php b/resources/views/notifications-all.blade.php new file mode 100644 index 000000000..bff4bbb5a --- /dev/null +++ b/resources/views/notifications-all.blade.php @@ -0,0 +1,215 @@ +@extends('themes.default1.agent.layout.agent') + + +@section('Users') +class="active" +@stop +@section('HeadInclude') + +@stop +@section('user-bar') +active +@stop + +@section('user') +class="active" +@stop + + + +@section('content') +

    + @if(Session::has('success')) +
    + + Alert! Success. + + {{Session::get('success')}} +
    + @endif + + @if(Session::has('fails')) +
    + + Alert! Failed. + + {{Session::get('fails')}} +
    + @endif + +
    +
    + + +@stop \ No newline at end of file diff --git a/resources/views/themes/default1/admin/helpdesk/agent/agents/agent-profile.blade.php b/resources/views/themes/default1/admin/helpdesk/agent/agents/agent-profile.blade.php index eda78e5b8..025562f92 100644 --- a/resources/views/themes/default1/admin/helpdesk/agent/agents/agent-profile.blade.php +++ b/resources/views/themes/default1/admin/helpdesk/agent/agents/agent-profile.blade.php @@ -1,14 +1,14 @@ @extends('themes.default1.admin.layout.admin') @section('Staffs') -class="active" +active @stop @section('staffs-bar') active @stop -@section('staffs') +@section('agents') class="active" @stop diff --git a/resources/views/themes/default1/admin/helpdesk/agent/agents/create.blade.php b/resources/views/themes/default1/admin/helpdesk/agent/agents/create.blade.php index 4d64ec717..ababe4dd0 100644 --- a/resources/views/themes/default1/admin/helpdesk/agent/agents/create.blade.php +++ b/resources/views/themes/default1/admin/helpdesk/agent/agents/create.blade.php @@ -1,14 +1,14 @@ @extends('themes.default1.admin.layout.admin') @section('Staffs') -class="active" +active @stop @section('staffs-bar') active @stop -@section('staffs') +@section('agents') class="active" @stop diff --git a/resources/views/themes/default1/admin/helpdesk/agent/agents/edit.blade.php b/resources/views/themes/default1/admin/helpdesk/agent/agents/edit.blade.php index 0b8d0e518..4bebb36dc 100644 --- a/resources/views/themes/default1/admin/helpdesk/agent/agents/edit.blade.php +++ b/resources/views/themes/default1/admin/helpdesk/agent/agents/edit.blade.php @@ -1,14 +1,14 @@ @extends('themes.default1.admin.layout.admin') @section('Staffs') -class="active" +active @stop @section('staffs-bar') active @stop -@section('staffs') +@section('agents') class="active" @stop diff --git a/resources/views/themes/default1/admin/helpdesk/agent/agents/index.blade.php b/resources/views/themes/default1/admin/helpdesk/agent/agents/index.blade.php index 1eb51e93c..ff1944044 100644 --- a/resources/views/themes/default1/admin/helpdesk/agent/agents/index.blade.php +++ b/resources/views/themes/default1/admin/helpdesk/agent/agents/index.blade.php @@ -1,14 +1,14 @@ @extends('themes.default1.admin.layout.admin') @section('Staffs') -class="active" +active @stop @section('staffs-bar') active @stop -@section('staffs') +@section('agents') class="active" @stop diff --git a/resources/views/themes/default1/admin/helpdesk/agent/departments/create.blade.php b/resources/views/themes/default1/admin/helpdesk/agent/departments/create.blade.php index c2b1b3449..a9c379bef 100644 --- a/resources/views/themes/default1/admin/helpdesk/agent/departments/create.blade.php +++ b/resources/views/themes/default1/admin/helpdesk/agent/departments/create.blade.php @@ -1,7 +1,7 @@ @extends('themes.default1.admin.layout.admin') @section('Staffs') -class="active" +active @stop @section('staffs-bar') diff --git a/resources/views/themes/default1/admin/helpdesk/agent/departments/edit.blade.php b/resources/views/themes/default1/admin/helpdesk/agent/departments/edit.blade.php index cfaed9684..9440fc0ef 100644 --- a/resources/views/themes/default1/admin/helpdesk/agent/departments/edit.blade.php +++ b/resources/views/themes/default1/admin/helpdesk/agent/departments/edit.blade.php @@ -1,7 +1,7 @@ @extends('themes.default1.admin.layout.admin') @section('Staffs') -class="active" +active @stop @section('staffs-bar') diff --git a/resources/views/themes/default1/admin/helpdesk/agent/departments/index.blade.php b/resources/views/themes/default1/admin/helpdesk/agent/departments/index.blade.php index d4741c5a3..f911461c3 100644 --- a/resources/views/themes/default1/admin/helpdesk/agent/departments/index.blade.php +++ b/resources/views/themes/default1/admin/helpdesk/agent/departments/index.blade.php @@ -1,7 +1,7 @@ @extends('themes.default1.admin.layout.admin') @section('Staffs') -class="active" +active @stop @section('staffs-bar') diff --git a/resources/views/themes/default1/admin/helpdesk/agent/groups/create.blade.php b/resources/views/themes/default1/admin/helpdesk/agent/groups/create.blade.php index ad6237a66..b165d6e2a 100644 --- a/resources/views/themes/default1/admin/helpdesk/agent/groups/create.blade.php +++ b/resources/views/themes/default1/admin/helpdesk/agent/groups/create.blade.php @@ -1,7 +1,7 @@ @extends('themes.default1.admin.layout.admin') @section('Staffs') -class="active" +active @stop @section('staffs-bar') @@ -58,10 +58,10 @@ class="active" {!! $errors->first('group_status', ':message') !!}
    - {!! Form::radio('group_status','1',true) !!} {{Lang::get('lang.enable')}} + {!! Form::radio('group_status','1',true) !!} {{Lang::get('lang.active')}}
    - {!! Form::radio('group_status','0',null) !!} {{Lang::get('lang.disabled')}} + {!! Form::radio('group_status','0',null) !!} {{Lang::get('lang.inactive')}}
    diff --git a/resources/views/themes/default1/admin/helpdesk/agent/groups/edit.blade.php b/resources/views/themes/default1/admin/helpdesk/agent/groups/edit.blade.php index b60d907d0..26813e345 100644 --- a/resources/views/themes/default1/admin/helpdesk/agent/groups/edit.blade.php +++ b/resources/views/themes/default1/admin/helpdesk/agent/groups/edit.blade.php @@ -1,7 +1,7 @@ @extends('themes.default1.admin.layout.admin') @section('Staffs') -class="active" +active @stop @section('staffs-bar') @@ -60,10 +60,10 @@ class="active" {!! $errors->first('group_status', ':message') !!}
    - {!! Form::radio('group_status','1',true) !!} {{Lang::get('lang.enable')}} + {!! Form::radio('group_status','1',true) !!} {{Lang::get('lang.active')}}
    - {!! Form::radio('group_status','0',null) !!} {{Lang::get('lang.disabled')}} + {!! Form::radio('group_status','0',null) !!} {{Lang::get('lang.inactive')}}
    diff --git a/resources/views/themes/default1/admin/helpdesk/agent/groups/index.blade.php b/resources/views/themes/default1/admin/helpdesk/agent/groups/index.blade.php index 1b8679264..e34c3565a 100644 --- a/resources/views/themes/default1/admin/helpdesk/agent/groups/index.blade.php +++ b/resources/views/themes/default1/admin/helpdesk/agent/groups/index.blade.php @@ -1,7 +1,7 @@ @extends('themes.default1.admin.layout.admin') @section('Staffs') -class="active" +active @stop @section('staffs-bar') diff --git a/resources/views/themes/default1/admin/helpdesk/agent/teams/create.blade.php b/resources/views/themes/default1/admin/helpdesk/agent/teams/create.blade.php index 925301542..2425b30f0 100644 --- a/resources/views/themes/default1/admin/helpdesk/agent/teams/create.blade.php +++ b/resources/views/themes/default1/admin/helpdesk/agent/teams/create.blade.php @@ -1,7 +1,7 @@ @extends('themes.default1.admin.layout.admin') @section('Staffs') -class="active" +active @stop @section('staffs-bar') diff --git a/resources/views/themes/default1/admin/helpdesk/agent/teams/edit.blade.php b/resources/views/themes/default1/admin/helpdesk/agent/teams/edit.blade.php index d1495682d..ca768fbc3 100644 --- a/resources/views/themes/default1/admin/helpdesk/agent/teams/edit.blade.php +++ b/resources/views/themes/default1/admin/helpdesk/agent/teams/edit.blade.php @@ -1,7 +1,7 @@ @extends('themes.default1.admin.layout.admin') @section('Staffs') -class="active" +active @stop @section('staffs-bar') diff --git a/resources/views/themes/default1/admin/helpdesk/agent/teams/index.blade.php b/resources/views/themes/default1/admin/helpdesk/agent/teams/index.blade.php index e291a6197..a9b73cd28 100644 --- a/resources/views/themes/default1/admin/helpdesk/agent/teams/index.blade.php +++ b/resources/views/themes/default1/admin/helpdesk/agent/teams/index.blade.php @@ -1,7 +1,7 @@ @extends('themes.default1.admin.layout.admin') @section('Staffs') -class="active" +active @stop @section('staffs-bar') diff --git a/resources/views/themes/default1/admin/helpdesk/emails/banlist/create.blade.php b/resources/views/themes/default1/admin/helpdesk/emails/banlist/create.blade.php index 3580ef09a..32f6a2514 100644 --- a/resources/views/themes/default1/admin/helpdesk/emails/banlist/create.blade.php +++ b/resources/views/themes/default1/admin/helpdesk/emails/banlist/create.blade.php @@ -2,7 +2,7 @@ @section('Emails') -class="active" +active @stop @section('emails-bar') @@ -69,7 +69,7 @@ class="active" {!! Form::radio('ban',1) !!} {{Lang::get('lang.active')}}
    - {!! Form::radio('ban',0) !!} {{Lang::get('lang.disabled')}} + {!! Form::radio('ban',0) !!} {{Lang::get('lang.inactive')}}
    diff --git a/resources/views/themes/default1/admin/helpdesk/emails/banlist/edit.blade.php b/resources/views/themes/default1/admin/helpdesk/emails/banlist/edit.blade.php index 2e9849e50..cdcefe86e 100644 --- a/resources/views/themes/default1/admin/helpdesk/emails/banlist/edit.blade.php +++ b/resources/views/themes/default1/admin/helpdesk/emails/banlist/edit.blade.php @@ -1,7 +1,7 @@ @extends('themes.default1.admin.layout.admin') @section('Emails') -class="active" +active @stop @section('emails-bar') @@ -49,7 +49,7 @@ class="active" {!! Form::radio('ban',1) !!} {{Lang::get('lang.active')}}
    - {!! Form::radio('ban',0) !!} {{Lang::get('lang.disabled')}} + {!! Form::radio('ban',0) !!} {{Lang::get('lang.inactive')}}
    diff --git a/resources/views/themes/default1/admin/helpdesk/emails/banlist/index.blade.php b/resources/views/themes/default1/admin/helpdesk/emails/banlist/index.blade.php index dec00a3a9..b87f15ea4 100644 --- a/resources/views/themes/default1/admin/helpdesk/emails/banlist/index.blade.php +++ b/resources/views/themes/default1/admin/helpdesk/emails/banlist/index.blade.php @@ -1,7 +1,7 @@ @extends('themes.default1.admin.layout.admin') @section('Emails') -class="active" +active @stop @section('emails-bar') diff --git a/resources/views/themes/default1/admin/helpdesk/emails/emails/create.blade.php b/resources/views/themes/default1/admin/helpdesk/emails/emails/create.blade.php index 896de35a7..7463576bd 100644 --- a/resources/views/themes/default1/admin/helpdesk/emails/emails/create.blade.php +++ b/resources/views/themes/default1/admin/helpdesk/emails/emails/create.blade.php @@ -1,7 +1,7 @@ @extends('themes.default1.admin.layout.admin') @section('Emails') -class="active" +active @stop @section('emails-bar') @@ -26,8 +26,7 @@ class="active" @stop -@section('content') - +@section('content')
    @@ -117,25 +116,30 @@ class="active"
    -
    +
    {!! Form::label('fetching_protocol',Lang::get('lang.fetching_protocol')) !!} {!! $errors->first('fetching_protocol', ':message') !!} {!!Form::select('fetching_protocol',['imap' => 'IMAP'],null,['class' => 'form-control select', 'id' => 'fetching_protocol']) !!}
    -
    +
    {!! Form::label('fetching_host',Lang::get('lang.host_name')) !!} {!! $errors->first('fetching_host', ':message') !!} {!! Form::text('fetching_host',null,['class' => 'form-control', 'id' => 'fetching_host']) !!}
    -
    +
    {!! Form::label('fetching_port',Lang::get('lang.port_number')) !!} {!! $errors->first('fetching_port', ':message') !!} {!! Form::text('fetching_port',null,['class' => 'form-control', 'id' => 'fetching_port']) !!}
    -
    +
    {!! Form::label('fetching_encryption',Lang::get('lang.encryption')) !!} {!! $errors->first('fetching_encryption', ':message') !!} - {!!Form::select('fetching_encryption',['none' => 'None', 'ssl' => 'SSL', 'tls' => 'TLS', 'ssl/novalidate-cert' => 'SSL (Accept all certificates)', 'tls/novalidate-cert' => 'TLS (Accept all certificates)'],null,['class' => 'form-control select', 'id' => 'fetching_encryption']) !!} + {!!Form::select('fetching_encryption',['none' => 'None', 'ssl' => 'SSL', 'tls' => 'TLS'],null,['class' => 'form-control select', 'id' => 'fetching_encryption']) !!} +
    +
    +
    If this checkbox is not checked SSL certificates will not be validated
    +

    +   Validate certificates from TLS/SSL server
    @@ -240,7 +244,7 @@ class="active" var sending_host = document.getElementById('sending_host').value; var sending_port = document.getElementById('sending_port').value; var sending_encryption = document.getElementById('sending_encryption').value; - + var validate = $('input#validate[type="checkbox"]:checked', this).val(); var filter_number = /^([0-9])/; var error_list = []; diff --git a/resources/views/themes/default1/admin/helpdesk/emails/emails/edit.blade.php b/resources/views/themes/default1/admin/helpdesk/emails/emails/edit.blade.php index a98c6b4f5..e38914a6f 100644 --- a/resources/views/themes/default1/admin/helpdesk/emails/emails/edit.blade.php +++ b/resources/views/themes/default1/admin/helpdesk/emails/emails/edit.blade.php @@ -1,7 +1,7 @@ @extends('themes.default1.admin.layout.admin') @section('Emails') -class="active" +active @stop @section('emails-bar') @@ -29,7 +29,6 @@ class="active" @section('content') - {!!Form::model($emails,['url'=>'','id'=>'form'])!!} @@ -49,11 +48,9 @@ class="active"
    - {!! Form::label('email_address',Lang::get('lang.email_address')) !!} {!! $errors->first('email_address', ':message') !!} {!! Form::text('email_address',null,['class' => 'form-control']) !!} -
    @@ -76,38 +73,33 @@ class="active"
    - {!! Form::label('department',Lang::get('lang.department')) !!} {!! $errors->first('department', ':message') !!} {!!Form::select('department', [''=>'--System Default--','departments'=>$departments->lists('name','id')],null,['class' => 'form-control select']) !!} -
    - {!! Form::label('priority',Lang::get('lang.priority')) !!} {!! $errors->first('priority', ':message') !!} {!!Form::select('priority', [''=>'--System Default--','Priorities'=>$priority->lists('priority_desc','priority_id')],null,['class' => 'form-control select']) !!} -
    - {!! Form::label('help_topic',Lang::get('lang.help_topic')) !!} {!! $errors->first('help_topic', ':message') !!} {!!Form::select('help_topic', [''=>'--System Default--','Help Topics'=>$helps->lists('topic','id')],null,['class' => 'form-control select']) !!}
    -
    {!! Form::label('auto_response', Lang::get('lang.auto_response')) !!}
    - auto_response == 1) { - echo "checked='checked'"; -} ?>> {!!Lang::get('lang.disable_for_this_email_address')!!} + auto_response == 1) { + echo "checked='checked'"; + } + ?>> {!!Lang::get('lang.disable_for_this_email_address')!!}
    -
    @@ -122,9 +114,11 @@ class="active"
    - fetching_status == 1) { - echo "checked='checked'"; -} ?>> {{Lang::get('lang.enable')}} + fetching_status == 1) { + echo "checked='checked'"; + } + ?>> {{Lang::get('lang.enable')}}
    @@ -132,25 +126,30 @@ class="active"
    -
    +
    {!! Form::label('fetching_protocol',Lang::get('lang.fetching_protocol')) !!} {!! $errors->first('fetching_protocol', ':message') !!} {!!Form::select('fetching_protocol',['imap' => 'IMAP'],null,['class' => 'form-control select', 'id' => 'fetching_protocol']) !!}
    -
    +
    {!! Form::label('fetching_host',Lang::get('lang.host_name')) !!} {!! $errors->first('fetching_host', ':message') !!} {!! Form::text('fetching_host',null,['class' => 'form-control', 'id' => 'fetching_host']) !!}
    -
    +
    {!! Form::label('fetching_port',Lang::get('lang.port_number')) !!} {!! $errors->first('fetching_port', ':message') !!} {!! Form::text('fetching_port',null,['class' => 'form-control', 'id' => 'fetching_port']) !!}
    -
    +
    {!! Form::label('fetching_encryption',Lang::get('lang.encryption')) !!} {!! $errors->first('fetching_encryption', ':message') !!} - {!!Form::select('fetching_encryption',['none' => 'None', 'ssl' => 'SSL', 'tls' => 'TLS', 'ssl/novalidate-cert' => 'SSL (Accept all certificates)', 'tls/novalidate-cert' => 'TLS (Accept all certificates)'],null,['class' => 'form-control select', 'id' => 'fetching_encryption']) !!} + {!!Form::select('fetching_encryption',['none' => 'None', 'ssl' => 'SSL', 'tls' => 'TLS'],null,['class' => 'form-control select', 'id' => 'fetching_encryption']) !!} +
    +
    +
    If this checkbox is not checked SSL certificates will not be validated
    +

    +   Validate certificates from TLS/SSL server
    @@ -165,9 +164,11 @@ class="active" {!! Form::label('sending_status',Lang::get('lang.status')) !!}
    - sending_status == 1) { - echo "checked='checked'"; -} ?>> {!! Lang::get('lang.enable') !!} + sending_status == 1) { + echo "checked='checked'"; + } + ?>> {!! Lang::get('lang.enable') !!}
    @@ -208,12 +209,9 @@ class="active"
    {!!Form::close()!!} - - - - @stop diff --git a/resources/views/themes/default1/admin/helpdesk/emails/emails/index.blade.php b/resources/views/themes/default1/admin/helpdesk/emails/emails/index.blade.php index aa165bd71..4cc64e454 100644 --- a/resources/views/themes/default1/admin/helpdesk/emails/emails/index.blade.php +++ b/resources/views/themes/default1/admin/helpdesk/emails/emails/index.blade.php @@ -1,7 +1,7 @@ @extends('themes.default1.admin.layout.admin') @section('Emails') -class="active" +active @stop @section('emails-bar') diff --git a/resources/views/themes/default1/admin/helpdesk/emails/template/create.blade.php b/resources/views/themes/default1/admin/helpdesk/emails/template/create.blade.php index 4c9a4c5cb..ad6a4e35b 100644 --- a/resources/views/themes/default1/admin/helpdesk/emails/template/create.blade.php +++ b/resources/views/themes/default1/admin/helpdesk/emails/template/create.blade.php @@ -1,7 +1,7 @@ @extends('themes.default1.admin.layout.admin') @section('Emails') -class="active" +active @stop @section('emails-bar') diff --git a/resources/views/themes/default1/admin/helpdesk/emails/template/edit.blade.php b/resources/views/themes/default1/admin/helpdesk/emails/template/edit.blade.php index aecadebb1..cf00f5c08 100644 --- a/resources/views/themes/default1/admin/helpdesk/emails/template/edit.blade.php +++ b/resources/views/themes/default1/admin/helpdesk/emails/template/edit.blade.php @@ -1,7 +1,7 @@ @extends('themes.default1.admin.layout.admin') @section('Emails') -class="active" +active @stop @section('emails-bar') diff --git a/resources/views/themes/default1/admin/helpdesk/emails/template/formDiagno.blade.php b/resources/views/themes/default1/admin/helpdesk/emails/template/formDiagno.blade.php index 3875f402d..8101b2f43 100644 --- a/resources/views/themes/default1/admin/helpdesk/emails/template/formDiagno.blade.php +++ b/resources/views/themes/default1/admin/helpdesk/emails/template/formDiagno.blade.php @@ -1,14 +1,14 @@ @extends('themes.default1.admin.layout.admin') @section('Emails') -class="active" +active @stop @section('emails-bar') active @stop -@section('diagno') +@section('diagnostics') class="active" @stop diff --git a/resources/views/themes/default1/admin/helpdesk/emails/template/index.blade.php b/resources/views/themes/default1/admin/helpdesk/emails/template/index.blade.php index 572603421..de6cdd917 100644 --- a/resources/views/themes/default1/admin/helpdesk/emails/template/index.blade.php +++ b/resources/views/themes/default1/admin/helpdesk/emails/template/index.blade.php @@ -1,7 +1,7 @@ @extends('themes.default1.admin.layout.admin') @section('Emails') -class="active" +active @stop @section('emails-bar') diff --git a/resources/views/themes/default1/admin/helpdesk/emails/template/listdirectories.blade.php b/resources/views/themes/default1/admin/helpdesk/emails/template/listdirectories.blade.php index fb92caca1..3c5b55d2b 100644 --- a/resources/views/themes/default1/admin/helpdesk/emails/template/listdirectories.blade.php +++ b/resources/views/themes/default1/admin/helpdesk/emails/template/listdirectories.blade.php @@ -1,7 +1,7 @@ @extends('themes.default1.admin.layout.admin') @section('Emails') -class="active" +active @stop @section('emails-bar') diff --git a/resources/views/themes/default1/admin/helpdesk/emails/template/listtemplates.blade.php b/resources/views/themes/default1/admin/helpdesk/emails/template/listtemplates.blade.php index d2a28028a..fe2e9aea3 100644 --- a/resources/views/themes/default1/admin/helpdesk/emails/template/listtemplates.blade.php +++ b/resources/views/themes/default1/admin/helpdesk/emails/template/listtemplates.blade.php @@ -1,7 +1,7 @@ @extends('themes.default1.admin.layout.admin') @section('Emails') -class="active" +active @stop @section('emails-bar') diff --git a/resources/views/themes/default1/admin/helpdesk/emails/template/readtemplates.blade.php b/resources/views/themes/default1/admin/helpdesk/emails/template/readtemplates.blade.php index 5fc17123d..429757caa 100644 --- a/resources/views/themes/default1/admin/helpdesk/emails/template/readtemplates.blade.php +++ b/resources/views/themes/default1/admin/helpdesk/emails/template/readtemplates.blade.php @@ -1,7 +1,7 @@ @extends('themes.default1.admin.layout.admin') @section('Emails') -class="active" +active @stop @section('emails-bar') diff --git a/resources/views/themes/default1/admin/helpdesk/language/create.blade.php b/resources/views/themes/default1/admin/helpdesk/language/create.blade.php index deef40748..86f1989e3 100644 --- a/resources/views/themes/default1/admin/helpdesk/language/create.blade.php +++ b/resources/views/themes/default1/admin/helpdesk/language/create.blade.php @@ -1,7 +1,7 @@ @extends('themes.default1.admin.layout.admin') @section('Settings') -class="active" +active @stop @section('settings-bar') diff --git a/resources/views/themes/default1/admin/helpdesk/language/index.blade.php b/resources/views/themes/default1/admin/helpdesk/language/index.blade.php index d010a919e..3f6d68ed5 100644 --- a/resources/views/themes/default1/admin/helpdesk/language/index.blade.php +++ b/resources/views/themes/default1/admin/helpdesk/language/index.blade.php @@ -1,7 +1,7 @@ @extends('themes.default1.admin.layout.admin') @section('Settings') -class="active" +active @stop @section('settings-bar') diff --git a/resources/views/themes/default1/admin/helpdesk/manage/form/create.blade.php b/resources/views/themes/default1/admin/helpdesk/manage/form/create.blade.php index 98aeafa20..11b8ca408 100644 --- a/resources/views/themes/default1/admin/helpdesk/manage/form/create.blade.php +++ b/resources/views/themes/default1/admin/helpdesk/manage/form/create.blade.php @@ -1,14 +1,14 @@ @extends('themes.default1.admin.layout.admin') @section('Manage') -class="active" +active @stop @section('manage-bar') active @stop -@section('form') +@section('forms') class="active" @stop diff --git a/resources/views/themes/default1/admin/helpdesk/manage/form/edit.blade.php b/resources/views/themes/default1/admin/helpdesk/manage/form/edit.blade.php index c4ebb7ac9..09f8146fc 100644 --- a/resources/views/themes/default1/admin/helpdesk/manage/form/edit.blade.php +++ b/resources/views/themes/default1/admin/helpdesk/manage/form/edit.blade.php @@ -1,7 +1,7 @@ @extends('themes.default1.admin.layout.admin') @section('Manage') -class="active" +active @stop @section('manage-bar') diff --git a/resources/views/themes/default1/admin/helpdesk/manage/form/form.blade.php b/resources/views/themes/default1/admin/helpdesk/manage/form/form.blade.php index 4db9207cf..ce37916b9 100644 --- a/resources/views/themes/default1/admin/helpdesk/manage/form/form.blade.php +++ b/resources/views/themes/default1/admin/helpdesk/manage/form/form.blade.php @@ -1,7 +1,7 @@ @extends('themes.default1.admin.layout.admin') @section('Manage') -class="active" +active @stop @section('manage-bar') diff --git a/resources/views/themes/default1/admin/helpdesk/manage/form/index.blade.php b/resources/views/themes/default1/admin/helpdesk/manage/form/index.blade.php index 6164211f6..b288044ea 100644 --- a/resources/views/themes/default1/admin/helpdesk/manage/form/index.blade.php +++ b/resources/views/themes/default1/admin/helpdesk/manage/form/index.blade.php @@ -1,7 +1,7 @@ @extends('themes.default1.admin.layout.admin') @section('Manage') -class="active" +active @stop @section('manage-bar') diff --git a/resources/views/themes/default1/admin/helpdesk/manage/form/preview.blade.php b/resources/views/themes/default1/admin/helpdesk/manage/form/preview.blade.php index 3298ab2bb..eb348f778 100644 --- a/resources/views/themes/default1/admin/helpdesk/manage/form/preview.blade.php +++ b/resources/views/themes/default1/admin/helpdesk/manage/form/preview.blade.php @@ -1,7 +1,7 @@ @extends('themes.default1.admin.layout.admin') @section('Manage') -class="active" +active @stop @section('manage-bar') diff --git a/resources/views/themes/default1/admin/helpdesk/manage/helptopic/create.blade.php b/resources/views/themes/default1/admin/helpdesk/manage/helptopic/create.blade.php index 5b05e5603..16a63a03b 100644 --- a/resources/views/themes/default1/admin/helpdesk/manage/helptopic/create.blade.php +++ b/resources/views/themes/default1/admin/helpdesk/manage/helptopic/create.blade.php @@ -1,7 +1,7 @@ @extends('themes.default1.admin.layout.admin') @section('Manage') -class="active" +active @stop @section('manage-bar') @@ -52,9 +52,9 @@ class="active"
    {!! Form::label('ticket_status',Lang::get('lang.status')) !!}   - {!! $errors->first('ticket_status', ':message') !!} - {!! Form::radio('ticket_status','1',true) !!} {{Lang::get('lang.active')}}    - {!! Form::radio('ticket_status','0') !!} {{Lang::get('lang.disabled')}} + {!! $errors->first('status', ':message') !!} + {!! Form::radio('status','1',true) !!} {{Lang::get('lang.active')}}    + {!! Form::radio('status','0') !!} {{Lang::get('lang.inactive')}}
    @@ -92,7 +92,7 @@ class="active"
    - {!! Form::label('custom_form',Lang::get('lang.custom')) !!} + {!! Form::label('custom_form',Lang::get('lang.Custom_form')) !!} {!! $errors->first('custom_form', ':message') !!} {!!Form::select('custom_form', [''=>'Select a Form','Custom Forms'=>$forms->lists('formname','id')],1,['class' => 'form-control']) !!}
    @@ -139,7 +139,7 @@ class="active" {!! Form::label('auto_assign',Lang::get('lang.auto_assign')) !!} {!! $errors->first('auto_assign', ':message') !!} - {!!Form::select('auto_assign', [''=>'Select an Agent','Agents'=>$agents->lists('user_name','id')],null,['class' => 'form-control']) !!} + {!!Form::select('auto_assign', [''=>'Select an Agent','Agents'=>$agents->lists('first_name','id')],null,['class' => 'form-control']) !!}
    diff --git a/resources/views/themes/default1/admin/helpdesk/manage/helptopic/edit.blade.php b/resources/views/themes/default1/admin/helpdesk/manage/helptopic/edit.blade.php index 6a24b4b6d..38004ae6f 100644 --- a/resources/views/themes/default1/admin/helpdesk/manage/helptopic/edit.blade.php +++ b/resources/views/themes/default1/admin/helpdesk/manage/helptopic/edit.blade.php @@ -1,7 +1,7 @@ @extends('themes.default1.admin.layout.admin') @section('Manage') -class="active" +active @stop @section('manage-bar') @@ -46,9 +46,9 @@ class="active"
    {!! Form::label('ticket_status',Lang::get('lang.status')) !!}   - {!! $errors->first('ticket_status', ':message') !!} - {!! Form::radio('ticket_status','1',true) !!} {{Lang::get('lang.active')}}    - {!! Form::radio('ticket_status','0') !!} {{Lang::get('lang.disabled')}} + {!! $errors->first('status', ':message') !!} + {!! Form::radio('status','1',true) !!} {{Lang::get('lang.active')}}    + {!! Form::radio('status','0') !!} {{Lang::get('lang.inactive')}}
    @@ -68,7 +68,7 @@ class="active" {!! Form::label('topic',Lang::get('lang.topic')) !!} {!! $errors->first('topic', ':message') !!} - {!! Form::text('topic',null,['disabled'=>'disabled','class' => 'form-control']) !!} + {!! Form::text('topic',null,['class' => 'form-control']) !!} @@ -85,7 +85,7 @@ class="active"
    - {!! Form::label('custom_form',Lang::get('lang.custom')) !!} + {!! Form::label('custom_form',Lang::get('lang.Custom_form')) !!} {!! $errors->first('custom_form', ':message') !!} {!!Form::select('custom_form', [''=>'Select a Form','Custom Forms'=>$forms->lists('formname','id')],null,['class' => 'form-control']) !!}
    @@ -106,8 +106,8 @@ class="active"
    {!! Form::label('priority',Lang::get('lang.priority')) !!} - {!! $errors->first('priority', ':message') !!} {!!Form::select('priority', [''=>'Select a Proirity','Priorities'=>$priority->lists('priority_desc','priority_id')],null,['class' => 'form-control']) !!} + {!! $errors->first('priority', ':message') !!}
    @@ -115,8 +115,9 @@ class="active"
    {!! Form::label('sla_plan',Lang::get('lang.SLA_plan')) !!} - {!! $errors->first('sla_plan', ':message') !!} + {!!Form::select('sla_plan', [''=>'Select a SLA Plan','SLA Plans'=>$slas->lists('name','id')],null,['class' => 'form-control']) !!} + {!! $errors->first('sla_plan', ':message') !!}
    @@ -127,7 +128,7 @@ class="active" {!! Form::label('auto_assign',Lang::get('lang.auto_assign')) !!} {!! $errors->first('auto_assign', ':message') !!} - {!!Form::select('auto_assign', [''=>'Select an Agent','Agents'=>$agents->lists('user_name','id')],null,['class' => 'form-control']) !!} + {!!Form::select('auto_assign', [''=>'Select an Agent','Agents'=>$agents->lists('first_name','id')],null,['class' => 'form-control']) !!} diff --git a/resources/views/themes/default1/admin/helpdesk/manage/helptopic/index.blade.php b/resources/views/themes/default1/admin/helpdesk/manage/helptopic/index.blade.php index 48b28bd33..4c0a90688 100644 --- a/resources/views/themes/default1/admin/helpdesk/manage/helptopic/index.blade.php +++ b/resources/views/themes/default1/admin/helpdesk/manage/helptopic/index.blade.php @@ -1,7 +1,7 @@ @extends('themes.default1.admin.layout.admin') @section('Manage') -class="active" +active @stop @section('manage-bar') @@ -93,7 +93,7 @@ class="active" - @if($topic->ticket_status=='1') + @if($topic->status=='1') Active @else Disable diff --git a/resources/views/themes/default1/admin/helpdesk/manage/sla/create.blade.php b/resources/views/themes/default1/admin/helpdesk/manage/sla/create.blade.php index f35529382..7e0a7dee9 100644 --- a/resources/views/themes/default1/admin/helpdesk/manage/sla/create.blade.php +++ b/resources/views/themes/default1/admin/helpdesk/manage/sla/create.blade.php @@ -1,7 +1,7 @@ @extends('themes.default1.admin.layout.admin') @section('Manage') -class="active" +active @stop @section('manage-bar') @@ -73,7 +73,7 @@ class="active" {!! Form::label('status',Lang::get('lang.status')) !!}  {!! $errors->first('status', ':message') !!} {!! Form::radio('status','1',true) !!} {{Lang::get('lang.active')}}   - {!! Form::radio('status','0') !!} {{Lang::get('lang.disabled')}} + {!! Form::radio('status','0') !!} {{Lang::get('lang.inactive')}} diff --git a/resources/views/themes/default1/admin/helpdesk/manage/sla/edit.blade.php b/resources/views/themes/default1/admin/helpdesk/manage/sla/edit.blade.php index 5cc7cd13d..a6e7a3b1b 100644 --- a/resources/views/themes/default1/admin/helpdesk/manage/sla/edit.blade.php +++ b/resources/views/themes/default1/admin/helpdesk/manage/sla/edit.blade.php @@ -1,7 +1,7 @@ @extends('themes.default1.admin.layout.admin') @section('Manage') -class="active" +active @stop @section('manage-bar') @@ -71,9 +71,9 @@ class="active"
    {!! Form::label('status',Lang::get('lang.status')) !!}  - {!! $errors->first('status', ':message') !!} - {!! Form::radio('status','1',true) !!} {{Lang::get('lang.active')}}   - {!! Form::radio('status','0') !!} {{Lang::get('lang.disabled')}} + {!! $errors->first('status', ':message') !!}   + {!! Form::radio('status','1',true) !!}   {{Lang::get('lang.active')}}      + {!! Form::radio('status','0') !!}   {{Lang::get('lang.inactive')}}
    diff --git a/resources/views/themes/default1/admin/helpdesk/manage/sla/index.blade.php b/resources/views/themes/default1/admin/helpdesk/manage/sla/index.blade.php index ae637d6ac..d4d93fd78 100644 --- a/resources/views/themes/default1/admin/helpdesk/manage/sla/index.blade.php +++ b/resources/views/themes/default1/admin/helpdesk/manage/sla/index.blade.php @@ -1,7 +1,7 @@ @extends('themes.default1.admin.layout.admin') @section('Manage') -class="active" +active @stop @section('manage-bar') diff --git a/resources/views/themes/default1/admin/helpdesk/manage/workflow/create.blade.php b/resources/views/themes/default1/admin/helpdesk/manage/workflow/create.blade.php new file mode 100644 index 000000000..ae5784d73 --- /dev/null +++ b/resources/views/themes/default1/admin/helpdesk/manage/workflow/create.blade.php @@ -0,0 +1,381 @@ +@extends('themes.default1.admin.layout.admin') + +@section('Manage') +active +@stop + +@section('manage-bar') +active +@stop + +@section('workflow') +class="active" +@stop + +@section('HeadInclude') +@stop + + +@section('PageHeader') +

    {!! Lang::get('lang.create_workflow') !!}

    +@stop + + +@section('breadcrumbs') + +@stop + + +@section('content') + +
    + +
    + + @if(Session::has('success')) +
    + + Success + + {!! Session::get('success') !!} +
    + @endif + + @if(Session::has('fails')) +
    + + Fail! + + {!! Session::get('fails') !!} +
    + @endif + @if(Session::has('errors')) +
    + + Alert! + +
    + @if($errors->first('name')) +
  • {!! $errors->first('name', ':message') !!}
  • + @endif + @if($errors->first('execution_order')) +
  • {!! $errors->first('execution_order', ':message') !!}
  • + @endif + @if($errors->first('target_channel')) +
  • {!! $errors->first('target_channel', ':message') !!}
  • + @endif + @if($errors->first('rule')) +
  • {!! $errors->first('rule', ':message') !!}
  • + @endif + @if($errors->first('action')) +
  • {!! $errors->first('action', ':message') !!}
  • + @endif +
    + @endif +
    + +
    + {!! Form::text('name',null,['class' => 'form-control', 'placeholder' => 'Name', 'id' => 'name']) !!} +
    +
    +
    + +
    +      +      +
    +
    +
    +
    + +
    + {!! Form::input('number', 'execution_order',null,['class' => 'form-control', 'placeholder' => 'Exceution Order', 'id' => 'execution_order', 'min' => '0']) !!} +
    +
    +
    +
    + +
    + {!! Form::select('target_channel', [''=> '-- Select a Channel --', 'A-0' => 'Any', 'A-1' => 'Web Forms', 'A-4' => 'API Calls', 'A-2' => 'Emails'], null,['class' => 'form-control', 'id' => 'execution_order']) !!} +
    +
    +
    +
    + +
    +
    + + +
    + +
    + + + + + +@stop diff --git a/resources/views/themes/default1/admin/helpdesk/manage/workflow/edit.blade.php b/resources/views/themes/default1/admin/helpdesk/manage/workflow/edit.blade.php new file mode 100644 index 000000000..f73a89737 --- /dev/null +++ b/resources/views/themes/default1/admin/helpdesk/manage/workflow/edit.blade.php @@ -0,0 +1,520 @@ +@extends('themes.default1.admin.layout.admin') + +@section('Manage') +active +@stop + +@section('manage-bar') +active +@stop + +@section('workflow') +class="active" +@stop + +@section('HeadInclude') +@stop + + +@section('PageHeader') +

    {!! Lang::get('lang.edit_workflow') !!}

    +@stop + + +@section('breadcrumbs') + +@stop + + +@section('content') +
    +
    + +
    + + @if(Session::has('success')) +
    + + Success + + {{Session::get('success')}} +
    + @endif + + @if(Session::has('fails')) +
    + + Fail! + + {{Session::get('fails')}} +
    + @endif + @if(Session::has('errors')) +
    + + Alert! + +
    + @if($errors->first('name')) +
  • {!! $errors->first('name', ':message') !!}
  • + @endif + @if($errors->first('execution_order')) +
  • {!! $errors->first('execution_order', ':message') !!}
  • + @endif + @if($errors->first('target_channel')) +
  • {!! $errors->first('target_channel', ':message') !!}
  • + @endif + @if($errors->first('rule')) +
  • {!! $errors->first('rule', ':message') !!}
  • + @endif + @if($errors->first('action')) +
  • {!! $errors->first('action', ':message') !!}
  • + @endif +
    + @endif +
    + +
    + +
    +
    +
    + +
    + status == 1) { echo "checked"; } ?> >     + status == 0) { echo "checked"; } ?> >     +
    +
    +
    +
    + +
    + +
    +
    +
    +
    + + +
    + + +
    +
    + +
    +
    + + +
    +
    + + +
    + +
    + +
    + + + +@stop diff --git a/resources/views/themes/default1/admin/helpdesk/manage/workflow/index.blade.php b/resources/views/themes/default1/admin/helpdesk/manage/workflow/index.blade.php new file mode 100644 index 000000000..f6dd65e74 --- /dev/null +++ b/resources/views/themes/default1/admin/helpdesk/manage/workflow/index.blade.php @@ -0,0 +1,90 @@ +@extends('themes.default1.admin.layout.admin') + +@section('Manage') +active +@stop + +@section('manage-bar') +active +@stop + +@section('workflow') +class="active" +@stop + +@section('HeadInclude') +@stop + +@section('PageHeader') +@stop + + +@section('breadcrumbs') + +@stop + + +@section('content') +
    +
    +
    +
    +

    {!! Lang::get('lang.ticket_workflow') !!}

    + {!! Lang::get('lang.create') !!} +
    + +
    + + @if(Session::has('success')) +
    + + Success + + {!! Session::get('success') !!} +
    + @endif + + @if(Session::has('fails')) +
    + + Fail! + + {!! Session::get('fails') !!} +
    + @endif + {!! Datatable::table() + ->addColumn(Lang::get('lang.name'), + Lang::get('lang.status'), + Lang::get('lang.order'), + Lang::get('lang.rules'), + Lang::get('lang.target_channel'), + Lang::get('lang.created'), + Lang::get('lang.updated'), + Lang::get('lang.action')) // these are the column headings to be shown + ->setUrl(route('workflow.list')) // this is the route where data will be retrieved + ->render() !!} +
    + + + + +
    + +
    + +
    + + +@stop diff --git a/resources/views/themes/default1/admin/helpdesk/setting.blade.php b/resources/views/themes/default1/admin/helpdesk/setting.blade.php index 3c0858989..051c579c3 100644 --- a/resources/views/themes/default1/admin/helpdesk/setting.blade.php +++ b/resources/views/themes/default1/admin/helpdesk/setting.blade.php @@ -202,6 +202,19 @@ + +
    +
    + +
    {!! Lang::get('lang.workflow') !!}
    +
    +
    + @@ -314,6 +327,18 @@ +
    +
    + +
    {!! Lang::get('lang.cron') !!}
    +
    +
    + diff --git a/resources/views/themes/default1/admin/helpdesk/settings/alert.blade.php b/resources/views/themes/default1/admin/helpdesk/settings/alert.blade.php index fe8b4b73d..df588d970 100644 --- a/resources/views/themes/default1/admin/helpdesk/settings/alert.blade.php +++ b/resources/views/themes/default1/admin/helpdesk/settings/alert.blade.php @@ -1,7 +1,7 @@ @extends('themes.default1.admin.layout.admin') @section('Settings') -class="active" +active @stop @section('settings-bar') diff --git a/resources/views/themes/default1/admin/helpdesk/settings/checkupdate.blade.php b/resources/views/themes/default1/admin/helpdesk/settings/checkupdate.blade.php index 7c64f1da2..c9b93fceb 100644 --- a/resources/views/themes/default1/admin/helpdesk/settings/checkupdate.blade.php +++ b/resources/views/themes/default1/admin/helpdesk/settings/checkupdate.blade.php @@ -1,5 +1,7 @@ @extends('themes.default1.admin.layout.admin') - +@section('update') +class="active" +@stop @section('content')
    diff --git a/resources/views/themes/default1/admin/helpdesk/settings/company.blade.php b/resources/views/themes/default1/admin/helpdesk/settings/company.blade.php index e69e60b8f..4a15444fc 100644 --- a/resources/views/themes/default1/admin/helpdesk/settings/company.blade.php +++ b/resources/views/themes/default1/admin/helpdesk/settings/company.blade.php @@ -1,7 +1,7 @@ @extends('themes.default1.admin.layout.admin') - + @section('Settings') -class="active" +active @stop @section('settings-bar') @@ -70,8 +70,8 @@ class="active"
    {!! Form::label('company_name',Lang::get('lang.name')) !!} - {!! $errors->first('company_name', ':message') !!} {!! Form::text('company_name',$companys->company_name,['class' => 'form-control']) !!} + {!! $errors->first('company_name', ':message') !!}
    @@ -82,8 +82,9 @@ class="active"
    {!! Form::label('website',Lang::get('lang.website')) !!} - {!! $errors->first('website', ':message') !!} {!! Form::url('website',$companys->website,['class' => 'form-control']) !!} + {!! $errors->first('website', ':message') !!} +
    @@ -93,8 +94,8 @@ class="active"
    {!! Form::label('phone',Lang::get('lang.phone')) !!} - {!! $errors->first('phone', ':message') !!} {!! Form::text('phone',$companys->phone,['class' => 'form-control']) !!} + {!! $errors->first('phone', ':message') !!}
    @@ -149,6 +150,7 @@ class="active" +
    @if($companys->logo != null)
    {!! Form::checkbox('use_logo') !!} @@ -158,12 +160,69 @@ class="active" first(); ?> @if($companys->logo != null) -
    - User Image +
    +
    @endif +
    + + + + @stop \ No newline at end of file diff --git a/resources/views/themes/default1/admin/helpdesk/settings/crone.blade.php b/resources/views/themes/default1/admin/helpdesk/settings/crone.blade.php new file mode 100644 index 000000000..0f141848e --- /dev/null +++ b/resources/views/themes/default1/admin/helpdesk/settings/crone.blade.php @@ -0,0 +1,135 @@ +@extends('themes.default1.admin.layout.admin') + +@section('Settings') +active +@stop + +@section('settings-bar') +active +@stop + +@section('cron') +class="active" +@stop + +@section('HeadInclude') +@stop + +@section('PageHeader') +@stop + + +@section('breadcrumbs') + +@stop + + +@section('content') + + +{!! Form::model($emails,['url' => 'post-scheduler', 'method' => 'PATCH']) !!} +
    +
    +
    +
    +

    {{Lang::get('lang.cron')}}

    + {!! Form::submit(Lang::get('lang.save'),['class'=>'btn btn-primary'])!!} +
    +
    + + @if(Session::has('success')) +
    + + Success! + + {!!Session::get('success')!!} +
    + @endif + + @if(Session::has('fails')) +
    + + Fail! + + {!!Session::get('fails')!!} +
    + @endif +
    +
    +  {!!Lang::get('lang.crone-url-message')!!} + {!!Lang::get('lang.click')!!} {!!Lang::get('lang.check-cron-set')!!} + +
    +
    +
    + + +
    + +
    +
    + {!! Form::label('email_fetching',Lang::get('lang.email_fetch')) !!}
    + {!! Form::checkbox('email_fetching',1,true) !!} {{Lang::get('lang.fetch_auto-corn')}} +
    +
    +
    + + +
    + + + + +
    +
    +
    +
    +
    + + +
    + +
    +
    + {!! Form::label('email_fetching',Lang::get('lang.notification-email')) !!}
    + {!! Form::checkbox('notification_cron',1,true) !!} {{Lang::get('lang.cron_notification')}} +
    +
    +
    + + +
    + + + + +
    +
    + +
    +
    +
    +
    +
    + +@stop diff --git a/resources/views/themes/default1/admin/helpdesk/settings/email.blade.php b/resources/views/themes/default1/admin/helpdesk/settings/email.blade.php index d35b73870..f69632a5b 100644 --- a/resources/views/themes/default1/admin/helpdesk/settings/email.blade.php +++ b/resources/views/themes/default1/admin/helpdesk/settings/email.blade.php @@ -1,7 +1,7 @@ @extends('themes.default1.admin.layout.admin') @section('Settings') -class="active" +active @stop @section('settings-bar') @@ -68,20 +68,9 @@ class="active" - -
    -
    - {!! Form::label('email_fetching',Lang::get('lang.email_fetch')) !!}
    - {!! Form::checkbox('email_fetching',1,true) !!} {{Lang::get('lang.fetch_auto-corn')}} -
    -
    +
    -
    -
    - {!! Form::checkbox('notification_cron',1,true) !!} {{Lang::get('lang.cron_notification')}} -
    -
    diff --git a/resources/views/themes/default1/admin/helpdesk/settings/plugins.blade.php b/resources/views/themes/default1/admin/helpdesk/settings/plugins.blade.php index 4b65129f0..10da52862 100644 --- a/resources/views/themes/default1/admin/helpdesk/settings/plugins.blade.php +++ b/resources/views/themes/default1/admin/helpdesk/settings/plugins.blade.php @@ -1,7 +1,7 @@ @extends('themes.default1.admin.layout.admin') -@section('Settings') -class="active" +@section('Plugins') +active @stop @section('settings-bar') diff --git a/resources/views/themes/default1/admin/helpdesk/settings/responder.blade.php b/resources/views/themes/default1/admin/helpdesk/settings/responder.blade.php index b1c23083a..a2b4de507 100644 --- a/resources/views/themes/default1/admin/helpdesk/settings/responder.blade.php +++ b/resources/views/themes/default1/admin/helpdesk/settings/responder.blade.php @@ -1,7 +1,7 @@ @extends('themes.default1.admin.layout.admin') @section('Settings') -class="active" +active @stop @section('settings-bar') diff --git a/resources/views/themes/default1/admin/helpdesk/settings/system.blade.php b/resources/views/themes/default1/admin/helpdesk/settings/system.blade.php index dfe7fad38..a2f099e7c 100644 --- a/resources/views/themes/default1/admin/helpdesk/settings/system.blade.php +++ b/resources/views/themes/default1/admin/helpdesk/settings/system.blade.php @@ -1,7 +1,7 @@ @extends('themes.default1.admin.layout.admin') @section('Settings') -class="active" +active @stop @section('settings-bar') diff --git a/resources/views/themes/default1/admin/helpdesk/settings/ticket.blade.php b/resources/views/themes/default1/admin/helpdesk/settings/ticket.blade.php index 45082b666..82ef9ba1a 100644 --- a/resources/views/themes/default1/admin/helpdesk/settings/ticket.blade.php +++ b/resources/views/themes/default1/admin/helpdesk/settings/ticket.blade.php @@ -1,7 +1,7 @@ @extends('themes.default1.admin.layout.admin') @section('Settings') -class="active" +active @stop @section('settings-bar') diff --git a/resources/views/themes/default1/admin/helpdesk/theme/social.blade.php b/resources/views/themes/default1/admin/helpdesk/theme/social.blade.php index 0bd121f26..0f2f8397d 100644 --- a/resources/views/themes/default1/admin/helpdesk/theme/social.blade.php +++ b/resources/views/themes/default1/admin/helpdesk/theme/social.blade.php @@ -1,14 +1,14 @@ @extends('themes.default1.admin.layout.admin') @section('Themes') -class="active" +active @stop @section('theme-bar') active @stop -@section('footer') +@section('socail') class="active" @stop diff --git a/resources/views/themes/default1/admin/helpdesk/theme/widgets.blade.php b/resources/views/themes/default1/admin/helpdesk/theme/widgets.blade.php index 1fd8e1b8c..6579751c0 100644 --- a/resources/views/themes/default1/admin/helpdesk/theme/widgets.blade.php +++ b/resources/views/themes/default1/admin/helpdesk/theme/widgets.blade.php @@ -1,14 +1,14 @@ @extends('themes.default1.admin.layout.admin') @section('Themes') -class="active" +active @stop @section('theme-bar') active @stop -@section('footer') +@section('widget') class="active" @stop diff --git a/resources/views/themes/default1/admin/layout/admin.blade.php b/resources/views/themes/default1/admin/layout/admin.blade.php index 1d1e60146..ed2e601ee 100644 --- a/resources/views/themes/default1/admin/layout/admin.blade.php +++ b/resources/views/themes/default1/admin/layout/admin.blade.php @@ -24,6 +24,7 @@ + @@ -53,23 +54,50 @@ + +
    @@ -141,53 +163,98 @@ + @@ -231,7 +299,7 @@ $i = count($tickets); first(); ?> - {!! Lang::get('lang.copyright') !!} © {!! date('Y') !!} {!! $company->company_name !!}. {!! Lang::get('lang.all_rights_reserved') !!}. {!! Lang::get('lang.powered_by') !!} Faveo + {!! Lang::get('lang.copyright') !!} © {!! date('Y') !!} {!! $company->company_name !!}. {!! Lang::get('lang.all_rights_reserved') !!}. {!! Lang::get('lang.powered_by') !!} Faveo diff --git a/resources/views/themes/default1/agent/helpdesk/dept-ticket/closed.blade.php b/resources/views/themes/default1/agent/helpdesk/dept-ticket/closed.blade.php index d109c2ea3..a15ff7fd0 100644 --- a/resources/views/themes/default1/agent/helpdesk/dept-ticket/closed.blade.php +++ b/resources/views/themes/default1/agent/helpdesk/dept-ticket/closed.blade.php @@ -14,6 +14,7 @@ class="active" @section('content') first(); if(Auth::user()->role == 'agent') { @@ -56,8 +57,8 @@ $dept = App\Model\helpdesk\Agent\Department::where('name','=',$id)->first(); - - +
    @@ -68,12 +69,62 @@ $dept = App\Model\helpdesk\Agent\Department::where('name','=',$id)->first(); Lang::get('lang.ticket_id'), Lang::get('lang.priority'), Lang::get('lang.from'), - Lang::get('lang.last_replier'), Lang::get('lang.assigned_to'), Lang::get('lang.last_activity')) - ->setUrl(route('get.dept.close', $dept->id)) - ->setOrder(array(7=>'desc')) - ->setClass('table table-hover table-bordered table-striped') + ->setUrl(route('get.dept.close', $dept->id)) + ->setOptions('aoColumnDefs',array( + array( + 'render' => "function ( data, type, row ) { + var t = row[6].split(/[- :,/ :,. /]/); + var d = new Date(t[0], t[1]-1, t[2], t[3], t[4], t[5]); + + var dtf= '$date_time_format'; + if(dtf==1) { + dtf = 'D/MMM/YYYY hh:mm:ss A'; + } else if(dtf==2) { + dtf = 'D MMM, YYYY hh:mm:ss A'; + } else if(dtf==3) { + dtf = 'D-MMM-YYYY hh:mm:ss A'; + } else if(dtf==4) { + dtf = 'MMM/D/YYYY hh:mm:ss A'; + } else if(dtf==5) { + dtf = 'MMM D, YYYY hh:mm:ss A'; + } else if(dtf==6) { + dtf = 'MMM-D-YYYY hh:mm:ss A'; + } else if(dtf==7) { + dtf = 'YYYY/MMM/D hh:mm:ss A'; + } else if(dtf==8) { + dtf = 'YYYY, MMM D hh:mm:ss A'; + } else if(dtf==9) { + dtf = 'YYYY-MMM-D hh:mm:ss A'; + } + return moment(d).format(dtf); + + }", + 'aTargets' => array(6)) + )) + ->setOrder(array(6=>'desc')) + ->setClass('table table-hover table-bordered table-striped') + ->setCallbacks("fnRowCallback",'function( nRow, aData, iDisplayIndex, iDisplayIndexFull ) { + var str = aData[3]; + if(str.search("#000") == -1) { + $("td", nRow).css({"background-color":"#F3F3F3", "font-weight":"600", "border-bottom":"solid 0.5px #ddd", "border-right":"solid 0.5px #F3F3F3"}); + $("td", nRow).mouseenter(function(){ + $("td", nRow).css({"background-color":"#DEDFE0", "font-weight":"600", "border":"none"}); + }); + $("td", nRow).mouseleave(function(){ + $("td", nRow).css({"background-color":"#F3F3F3", "font-weight":"600", "border-bottom":"solid 0.5px #ddd","border-right":"solid 0.5px #F3F3F3"}); + }); + } else { + $("td", nRow).css({"background-color":"white", "border-bottom":"solid 0.5px #ddd", "border-right":"solid 0.5px white"}); + $("td", nRow).mouseenter(function(){ + $("td", nRow).css({"background-color":"#DEDFE0", "border":"none"}); + }); + $("td", nRow).mouseleave(function(){ + $("td", nRow).css({"background-color":"white", "border-bottom":"solid 0.5px #ddd", "border-right":"solid 0.5px white"}); + }); + } + }') ->render();!!}
    diff --git a/resources/views/themes/default1/agent/helpdesk/dept-ticket/inprogress.blade.php b/resources/views/themes/default1/agent/helpdesk/dept-ticket/inprogress.blade.php index a581e073e..fe5846240 100644 --- a/resources/views/themes/default1/agent/helpdesk/dept-ticket/inprogress.blade.php +++ b/resources/views/themes/default1/agent/helpdesk/dept-ticket/inprogress.blade.php @@ -15,6 +15,7 @@ class="active" @section('content') first(); if (Auth::user()->role == 'agent') { @@ -69,12 +70,62 @@ if (Auth::user()->role == 'agent') { Lang::get('lang.ticket_id'), Lang::get('lang.priority'), Lang::get('lang.from'), - Lang::get('lang.last_replier'), Lang::get('lang.assigned_to'), Lang::get('lang.last_activity')) - ->setUrl(route('get.dept.inprocess', $dept->id)) - ->setOrder(array(7=>'desc')) - ->setClass('table table-hover table-bordered table-striped') + ->setUrl(route('get.dept.inprocess', $dept->id)) + ->setOptions('aoColumnDefs',array( + array( + 'render' => "function ( data, type, row ) { + var t = row[6].split(/[- :,/ :,. /]/); + var d = new Date(t[0], t[1]-1, t[2], t[3], t[4], t[5]); + + var dtf= '$date_time_format'; + if(dtf==1) { + dtf = 'D/MMM/YYYY hh:mm:ss A'; + } else if(dtf==2) { + dtf = 'D MMM, YYYY hh:mm:ss A'; + } else if(dtf==3) { + dtf = 'D-MMM-YYYY hh:mm:ss A'; + } else if(dtf==4) { + dtf = 'MMM/D/YYYY hh:mm:ss A'; + } else if(dtf==5) { + dtf = 'MMM D, YYYY hh:mm:ss A'; + } else if(dtf==6) { + dtf = 'MMM-D-YYYY hh:mm:ss A'; + } else if(dtf==7) { + dtf = 'YYYY/MMM/D hh:mm:ss A'; + } else if(dtf==8) { + dtf = 'YYYY, MMM D hh:mm:ss A'; + } else if(dtf==9) { + dtf = 'YYYY-MMM-D hh:mm:ss A'; + } + return moment(d).format(dtf); + + }", + 'aTargets' => array(6)) + )) + ->setOrder(array(6=>'desc')) + ->setClass('table table-hover table-bordered table-striped') + ->setCallbacks("fnRowCallback",'function( nRow, aData, iDisplayIndex, iDisplayIndexFull ) { + var str = aData[3]; + if(str.search("#000") == -1) { + $("td", nRow).css({"background-color":"#F3F3F3", "font-weight":"600", "border-bottom":"solid 0.5px #ddd", "border-right":"solid 0.5px #F3F3F3"}); + $("td", nRow).mouseenter(function(){ + $("td", nRow).css({"background-color":"#DEDFE0", "font-weight":"600", "border":"none"}); + }); + $("td", nRow).mouseleave(function(){ + $("td", nRow).css({"background-color":"#F3F3F3", "font-weight":"600", "border-bottom":"solid 0.5px #ddd","border-right":"solid 0.5px #F3F3F3"}); + }); + } else { + $("td", nRow).css({"background-color":"white", "border-bottom":"solid 0.5px #ddd", "border-right":"solid 0.5px white"}); + $("td", nRow).mouseenter(function(){ + $("td", nRow).css({"background-color":"#DEDFE0", "border":"none"}); + }); + $("td", nRow).mouseleave(function(){ + $("td", nRow).css({"background-color":"white", "border-bottom":"solid 0.5px #ddd", "border-right":"solid 0.5px white"}); + }); + } + }') ->render();!!} diff --git a/resources/views/themes/default1/agent/helpdesk/dept-ticket/open.blade.php b/resources/views/themes/default1/agent/helpdesk/dept-ticket/open.blade.php index e996a4f7c..22f01fcbf 100644 --- a/resources/views/themes/default1/agent/helpdesk/dept-ticket/open.blade.php +++ b/resources/views/themes/default1/agent/helpdesk/dept-ticket/open.blade.php @@ -13,7 +13,8 @@ class="active" @stop @section('content') -first(); if(Auth::user()->role == 'agent') { $tickets = App\Model\helpdesk\Ticket\Tickets::where('status','=','1')->where('isanswered','=', 0)->where('dept_id','=',$dept->id)->orderBy('id', 'DESC')->paginate(20); @@ -67,12 +68,62 @@ $dept = App\Model\helpdesk\Agent\Department::where('name','=',$id)->first(); Lang::get('lang.ticket_id'), Lang::get('lang.priority'), Lang::get('lang.from'), - Lang::get('lang.last_replier'), Lang::get('lang.assigned_to'), Lang::get('lang.last_activity')) - ->setUrl(route('get.dept.open', $dept->id)) - ->setOrder(array(7=>'desc')) - ->setClass('table table-hover table-bordered table-striped') + ->setUrl(route('get.dept.open', $dept->id)) + ->setOptions('aoColumnDefs',array( + array( + 'render' => "function ( data, type, row ) { + var t = row[6].split(/[- :,/ :,. /]/); + var d = new Date(t[0], t[1]-1, t[2], t[3], t[4], t[5]); + + var dtf= '$date_time_format'; + if(dtf==1) { + dtf = 'D/MMM/YYYY hh:mm:ss A'; + } else if(dtf==2) { + dtf = 'D MMM, YYYY hh:mm:ss A'; + } else if(dtf==3) { + dtf = 'D-MMM-YYYY hh:mm:ss A'; + } else if(dtf==4) { + dtf = 'MMM/D/YYYY hh:mm:ss A'; + } else if(dtf==5) { + dtf = 'MMM D, YYYY hh:mm:ss A'; + } else if(dtf==6) { + dtf = 'MMM-D-YYYY hh:mm:ss A'; + } else if(dtf==7) { + dtf = 'YYYY/MMM/D hh:mm:ss A'; + } else if(dtf==8) { + dtf = 'YYYY, MMM D hh:mm:ss A'; + } else if(dtf==9) { + dtf = 'YYYY-MMM-D hh:mm:ss A'; + } + return moment(d).format(dtf); + + }", + 'aTargets' => array(6)) + )) + ->setOrder(array(6=>'desc')) + ->setClass('table table-hover table-bordered table-striped') + ->setCallbacks("fnRowCallback",'function( nRow, aData, iDisplayIndex, iDisplayIndexFull ) { + var str = aData[3]; + if(str.search("#000") == -1) { + $("td", nRow).css({"background-color":"#F3F3F3", "font-weight":"600", "border-bottom":"solid 0.5px #ddd", "border-right":"solid 0.5px #F3F3F3"}); + $("td", nRow).mouseenter(function(){ + $("td", nRow).css({"background-color":"#DEDFE0", "font-weight":"600", "border":"none"}); + }); + $("td", nRow).mouseleave(function(){ + $("td", nRow).css({"background-color":"#F3F3F3", "font-weight":"600", "border-bottom":"solid 0.5px #ddd","border-right":"solid 0.5px #F3F3F3"}); + }); + } else { + $("td", nRow).css({"background-color":"white", "border-bottom":"solid 0.5px #ddd", "border-right":"solid 0.5px white"}); + $("td", nRow).mouseenter(function(){ + $("td", nRow).css({"background-color":"#DEDFE0", "border":"none"}); + }); + $("td", nRow).mouseleave(function(){ + $("td", nRow).css({"background-color":"white", "border-bottom":"solid 0.5px #ddd", "border-right":"solid 0.5px white"}); + }); + } + }') ->render();!!} diff --git a/resources/views/themes/default1/agent/helpdesk/organization/create.blade.php b/resources/views/themes/default1/agent/helpdesk/organization/create.blade.php index 957c3cf19..da804fa3f 100644 --- a/resources/views/themes/default1/agent/helpdesk/organization/create.blade.php +++ b/resources/views/themes/default1/agent/helpdesk/organization/create.blade.php @@ -43,20 +43,20 @@ class="active"
    {!! Form::label('name',Lang::get('lang.name')) !!} - {!! $errors->first('name', ':message') !!} {!! Form::text('name',null,['class' => 'form-control']) !!} + {!! $errors->first('name', ':message') !!}
    {!! Form::label('phone',Lang::get('lang.phone')) !!} - {!! $errors->first('phone', ':message') !!} {!! Form::text('phone',null,['class' => 'form-control']) !!} + {!! $errors->first('phone', ':message') !!}
    {!! Form::label('website',Lang::get('lang.website')) !!} - {!! $errors->first('website', ':message') !!} {!! Form::text('website',null,['class' => 'form-control']) !!} + {!! $errors->first('website', ':message') !!}
    diff --git a/resources/views/themes/default1/agent/helpdesk/organization/edit.blade.php b/resources/views/themes/default1/agent/helpdesk/organization/edit.blade.php index 5ca573969..d4182852c 100644 --- a/resources/views/themes/default1/agent/helpdesk/organization/edit.blade.php +++ b/resources/views/themes/default1/agent/helpdesk/organization/edit.blade.php @@ -42,20 +42,20 @@ class="active"
    {!! Form::label('name',Lang::get('lang.name')) !!} - {!! $errors->first('name', ':message') !!} {!! Form::text('name',null,['class' => 'form-control']) !!} + {!! $errors->first('name', ':message') !!}
    {!! Form::label('phone',Lang::get('lang.phone')) !!} - {!! $errors->first('phone', ':message') !!} {!! Form::text('phone',null,['class' => 'form-control']) !!} + {!! $errors->first('phone', ':message') !!}
    {!! Form::label('website',Lang::get('lang.website')) !!} - {!! $errors->first('website', ':message') !!} {!! Form::text('website',null,['class' => 'form-control']) !!} + {!! $errors->first('website', ':message') !!}
    diff --git a/resources/views/themes/default1/agent/helpdesk/ticket/answered.blade.php b/resources/views/themes/default1/agent/helpdesk/ticket/answered.blade.php index 3bf63a2a1..5e0153bd2 100644 --- a/resources/views/themes/default1/agent/helpdesk/ticket/answered.blade.php +++ b/resources/views/themes/default1/agent/helpdesk/ticket/answered.blade.php @@ -13,7 +13,8 @@ class="active" @stop @section('content') -role == 'agent') { $dept = App\Model\helpdesk\Agent\Department::where('id','=',Auth::user()->primary_dpt)->first(); @@ -70,12 +71,62 @@ class="active" Lang::get('lang.ticket_id'), Lang::get('lang.priority'), Lang::get('lang.from'), - Lang::get('lang.last_replier'), Lang::get('lang.assigned_to'), Lang::get('lang.last_activity')) - ->setUrl(route('get.answered.ticket')) - ->setOrder(array(7=>'desc')) - ->setClass('table table-hover table-bordered table-striped') + ->setUrl(route('get.answered.ticket')) + ->setOptions('aoColumnDefs',array( + array( + 'render' => "function ( data, type, row ) { + var t = row[6].split(/[- :,/ :,. /]/); + var d = new Date(t[0], t[1]-1, t[2], t[3], t[4], t[5]); + + var dtf= '$date_time_format'; + if(dtf==1) { + dtf = 'D/MMM/YYYY hh:mm:ss A'; + } else if(dtf==2) { + dtf = 'D MMM, YYYY hh:mm:ss A'; + } else if(dtf==3) { + dtf = 'D-MMM-YYYY hh:mm:ss A'; + } else if(dtf==4) { + dtf = 'MMM/D/YYYY hh:mm:ss A'; + } else if(dtf==5) { + dtf = 'MMM D, YYYY hh:mm:ss A'; + } else if(dtf==6) { + dtf = 'MMM-D-YYYY hh:mm:ss A'; + } else if(dtf==7) { + dtf = 'YYYY/MMM/D hh:mm:ss A'; + } else if(dtf==8) { + dtf = 'YYYY, MMM D hh:mm:ss A'; + } else if(dtf==9) { + dtf = 'YYYY-MMM-D hh:mm:ss A'; + } + return moment(d).format(dtf); + + }", + 'aTargets' => array(6)) + )) + ->setOrder(array(6=>'desc')) + ->setClass('table table-hover table-bordered table-striped') + ->setCallbacks("fnRowCallback",'function( nRow, aData, iDisplayIndex, iDisplayIndexFull ) { + var str = aData[3]; + if(str.search("#000") == -1) { + $("td", nRow).css({"background-color":"#F3F3F3", "font-weight":"600", "border-bottom":"solid 0.5px #ddd", "border-right":"solid 0.5px #F3F3F3"}); + $("td", nRow).mouseenter(function(){ + $("td", nRow).css({"background-color":"#DEDFE0", "font-weight":"600", "border":"none"}); + }); + $("td", nRow).mouseleave(function(){ + $("td", nRow).css({"background-color":"#F3F3F3", "font-weight":"600", "border-bottom":"solid 0.5px #ddd","border-right":"solid 0.5px #F3F3F3"}); + }); + } else { + $("td", nRow).css({"background-color":"white", "border-bottom":"solid 0.5px #ddd", "border-right":"solid 0.5px white"}); + $("td", nRow).mouseenter(function(){ + $("td", nRow).css({"background-color":"#DEDFE0", "border":"none"}); + }); + $("td", nRow).mouseleave(function(){ + $("td", nRow).css({"background-color":"white", "border-bottom":"solid 0.5px #ddd", "border-right":"solid 0.5px white"}); + }); + } + }') ->render();!!} diff --git a/resources/views/themes/default1/agent/helpdesk/ticket/assigned.blade.php b/resources/views/themes/default1/agent/helpdesk/ticket/assigned.blade.php index 1d6f9516b..9a76ba74f 100644 --- a/resources/views/themes/default1/agent/helpdesk/ticket/assigned.blade.php +++ b/resources/views/themes/default1/agent/helpdesk/ticket/assigned.blade.php @@ -13,7 +13,8 @@ class="active" @stop @section('content') -role == 'agent') { $dept = App\Model\helpdesk\Agent\Department::where('id','=',Auth::user()->primary_dpt)->first(); $tickets = App\Model\helpdesk\Ticket\Tickets::where('status', '=', 1)->where('assigned_to', '>', 0)->where('dept_id','=',$dept->id)->orderBy('id', 'DESC')->paginate(20); @@ -62,12 +63,62 @@ class="active" Lang::get('lang.ticket_id'), Lang::get('lang.priority'), Lang::get('lang.from'), - Lang::get('lang.last_replier'), Lang::get('lang.assigned_to'), Lang::get('lang.last_activity')) - ->setUrl(route('get.assigned.ticket')) - ->setOrder(array(7=>'desc')) - ->setClass('table table-hover table-bordered table-striped') + ->setUrl(route('get.assigned.ticket')) + ->setOptions('aoColumnDefs',array( + array( + 'render' => "function ( data, type, row ) { + var t = row[6].split(/[- :,/ :,. /]/); + var d = new Date(t[0], t[1]-1, t[2], t[3], t[4], t[5]); + + var dtf= '$date_time_format'; + if(dtf==1) { + dtf = 'D/MMM/YYYY hh:mm:ss A'; + } else if(dtf==2) { + dtf = 'D MMM, YYYY hh:mm:ss A'; + } else if(dtf==3) { + dtf = 'D-MMM-YYYY hh:mm:ss A'; + } else if(dtf==4) { + dtf = 'MMM/D/YYYY hh:mm:ss A'; + } else if(dtf==5) { + dtf = 'MMM D, YYYY hh:mm:ss A'; + } else if(dtf==6) { + dtf = 'MMM-D-YYYY hh:mm:ss A'; + } else if(dtf==7) { + dtf = 'YYYY/MMM/D hh:mm:ss A'; + } else if(dtf==8) { + dtf = 'YYYY, MMM D hh:mm:ss A'; + } else if(dtf==9) { + dtf = 'YYYY-MMM-D hh:mm:ss A'; + } + return moment(d).format(dtf); + + }", + 'aTargets' => array(6)) + )) + ->setOrder(array(6=>'desc')) + ->setClass('table table-hover table-bordered table-striped') + ->setCallbacks("fnRowCallback",'function( nRow, aData, iDisplayIndex, iDisplayIndexFull ) { + var str = aData[3]; + if(str.search("#000") == -1) { + $("td", nRow).css({"background-color":"#F3F3F3", "font-weight":"600", "border-bottom":"solid 0.5px #ddd", "border-right":"solid 0.5px #F3F3F3"}); + $("td", nRow).mouseenter(function(){ + $("td", nRow).css({"background-color":"#DEDFE0", "font-weight":"600", "border":"none"}); + }); + $("td", nRow).mouseleave(function(){ + $("td", nRow).css({"background-color":"#F3F3F3", "font-weight":"600", "border-bottom":"solid 0.5px #ddd","border-right":"solid 0.5px #F3F3F3"}); + }); + } else { + $("td", nRow).css({"background-color":"white", "border-bottom":"solid 0.5px #ddd", "border-right":"solid 0.5px white"}); + $("td", nRow).mouseenter(function(){ + $("td", nRow).css({"background-color":"#DEDFE0", "border":"none"}); + }); + $("td", nRow).mouseleave(function(){ + $("td", nRow).css({"background-color":"white", "border-bottom":"solid 0.5px #ddd", "border-right":"solid 0.5px white"}); + }); + } + }') ->render();!!} {!! Form::close() !!} diff --git a/resources/views/themes/default1/agent/helpdesk/ticket/closed.blade.php b/resources/views/themes/default1/agent/helpdesk/ticket/closed.blade.php index 11cd867f4..647671202 100644 --- a/resources/views/themes/default1/agent/helpdesk/ticket/closed.blade.php +++ b/resources/views/themes/default1/agent/helpdesk/ticket/closed.blade.php @@ -14,6 +14,7 @@ class="active" @section('content') role == 'agent') { $dept = App\Model\helpdesk\Agent\Department::where('id','=',Auth::user()->primary_dpt)->first(); $tickets = App\Model\helpdesk\Ticket\Tickets::where('status', '>', 1)->where('dept_id','=',$dept->id)->where('status', '<', 4)->orderBy('id', 'DESC')->paginate(20); @@ -62,12 +63,62 @@ class="active" Lang::get('lang.ticket_id'), Lang::get('lang.priority'), Lang::get('lang.from'), - Lang::get('lang.last_replier'), Lang::get('lang.assigned_to'), Lang::get('lang.last_activity')) - ->setUrl(route('get.closed.ticket')) - ->setOrder(array(7=>'desc')) - ->setClass('table table-hover table-bordered table-striped') + ->setUrl(route('get.closed.ticket')) + ->setOptions('aoColumnDefs',array( + array( + 'render' => "function ( data, type, row ) { + var t = row[6].split(/[- :,/ :,. /]/); + var d = new Date(t[0], t[1]-1, t[2], t[3], t[4], t[5]); + + var dtf= '$date_time_format'; + if(dtf==1) { + dtf = 'D/MMM/YYYY hh:mm:ss A'; + } else if(dtf==2) { + dtf = 'D MMM, YYYY hh:mm:ss A'; + } else if(dtf==3) { + dtf = 'D-MMM-YYYY hh:mm:ss A'; + } else if(dtf==4) { + dtf = 'MMM/D/YYYY hh:mm:ss A'; + } else if(dtf==5) { + dtf = 'MMM D, YYYY hh:mm:ss A'; + } else if(dtf==6) { + dtf = 'MMM-D-YYYY hh:mm:ss A'; + } else if(dtf==7) { + dtf = 'YYYY/MMM/D hh:mm:ss A'; + } else if(dtf==8) { + dtf = 'YYYY, MMM D hh:mm:ss A'; + } else if(dtf==9) { + dtf = 'YYYY-MMM-D hh:mm:ss A'; + } + return moment(d).format(dtf); + + }", + 'aTargets' => array(6)) + )) + ->setOrder(array(6=>'desc')) + ->setClass('table table-hover table-bordered table-striped') + ->setCallbacks("fnRowCallback",'function( nRow, aData, iDisplayIndex, iDisplayIndexFull ) { + var str = aData[3]; + if(str.search("#000") == -1) { + $("td", nRow).css({"background-color":"#F3F3F3", "font-weight":"600", "border-bottom":"solid 0.5px #ddd", "border-right":"solid 0.5px #F3F3F3"}); + $("td", nRow).mouseenter(function(){ + $("td", nRow).css({"background-color":"#DEDFE0", "font-weight":"600", "border":"none"}); + }); + $("td", nRow).mouseleave(function(){ + $("td", nRow).css({"background-color":"#F3F3F3", "font-weight":"600", "border-bottom":"solid 0.5px #ddd","border-right":"solid 0.5px #F3F3F3"}); + }); + } else { + $("td", nRow).css({"background-color":"white", "border-bottom":"solid 0.5px #ddd", "border-right":"solid 0.5px white"}); + $("td", nRow).mouseenter(function(){ + $("td", nRow).css({"background-color":"#DEDFE0", "border":"none"}); + }); + $("td", nRow).mouseleave(function(){ + $("td", nRow).css({"background-color":"white", "border-bottom":"solid 0.5px #ddd", "border-right":"solid 0.5px white"}); + }); + } + }') ->render();!!} diff --git a/resources/views/themes/default1/agent/helpdesk/ticket/inbox.blade.php b/resources/views/themes/default1/agent/helpdesk/ticket/inbox.blade.php index 6b47ceb4f..9c22363a0 100644 --- a/resources/views/themes/default1/agent/helpdesk/ticket/inbox.blade.php +++ b/resources/views/themes/default1/agent/helpdesk/ticket/inbox.blade.php @@ -13,7 +13,8 @@ class="active" @stop @section('content') -role == 'agent') { $dept = App\Model\helpdesk\Agent\Department::where('id','=',Auth::user()->primary_dpt)->first(); $tickets = App\Model\helpdesk\Ticket\Tickets::where('status', '=', 1)->where('dept_id','=',$dept->id)->orderBy('id', 'DESC')->paginate(20); @@ -61,12 +62,62 @@ class="active" Lang::get('lang.ticket_id'), Lang::get('lang.priority'), Lang::get('lang.from'), - Lang::get('lang.last_replier'), Lang::get('lang.assigned_to'), Lang::get('lang.last_activity')) - ->setUrl(route('get.inbox.ticket')) - ->setOrder(array(7=>'desc')) - ->setClass('table table-hover table-bordered table-striped') + ->setUrl(route('get.inbox.ticket')) + ->setOptions('aoColumnDefs',array( + array( + 'render' => "function ( data, type, row ) { + var t = row[6].split(/[- :,/ :,. /]/); + var d = new Date(t[0], t[1]-1, t[2], t[3], t[4], t[5]); + + var dtf= '$date_time_format'; + if(dtf==1) { + dtf = 'D/MMM/YYYY hh:mm:ss A'; + } else if(dtf==2) { + dtf = 'D MMM, YYYY hh:mm:ss A'; + } else if(dtf==3) { + dtf = 'D-MMM-YYYY hh:mm:ss A'; + } else if(dtf==4) { + dtf = 'MMM/D/YYYY hh:mm:ss A'; + } else if(dtf==5) { + dtf = 'MMM D, YYYY hh:mm:ss A'; + } else if(dtf==6) { + dtf = 'MMM-D-YYYY hh:mm:ss A'; + } else if(dtf==7) { + dtf = 'YYYY/MMM/D hh:mm:ss A'; + } else if(dtf==8) { + dtf = 'YYYY, MMM D hh:mm:ss A'; + } else if(dtf==9) { + dtf = 'YYYY-MMM-D hh:mm:ss A'; + } + return moment(d).format(dtf); + + }", + 'aTargets' => array(6)) + )) + ->setOrder(array(6=>'desc')) + ->setClass('table table-hover table-bordered table-striped') + ->setCallbacks("fnCreatedRow", 'function( nRow, aData, iDataIndex ) { + var str = aData[3]; + if(str.search("#000") == -1) { + $("td", nRow).css({"background-color":"#F3F3F3", "font-weight":"600", "border-bottom":"solid 0.5px #ddd", "border-right":"solid 0.5px #F3F3F3"}); + $("td", nRow).mouseenter(function(){ + $("td", nRow).css({"background-color":"#DEDFE0", "font-weight":"600", "border":"none"}); + }); + $("td", nRow).mouseleave(function(){ + $("td", nRow).css({"background-color":"#F3F3F3", "font-weight":"600", "border-bottom":"solid 0.5px #ddd","border-right":"solid 0.5px #F3F3F3"}); + }); + } else { + $("td", nRow).css({"background-color":"white", "border-bottom":"solid 0.5px #ddd", "border-right":"solid 0.5px white"}); + $("td", nRow).mouseenter(function(){ + $("td", nRow).css({"background-color":"#DEDFE0", "border":"none"}); + }); + $("td", nRow).mouseleave(function(){ + $("td", nRow).css({"background-color":"white", "border-bottom":"solid 0.5px #ddd", "border-right":"solid 0.5px white"}); + }); + } + }') ->render();!!} diff --git a/resources/views/themes/default1/agent/helpdesk/ticket/myticket.blade.php b/resources/views/themes/default1/agent/helpdesk/ticket/myticket.blade.php index 571ae0527..0d923fb31 100644 --- a/resources/views/themes/default1/agent/helpdesk/ticket/myticket.blade.php +++ b/resources/views/themes/default1/agent/helpdesk/ticket/myticket.blade.php @@ -13,7 +13,8 @@ class="active" @stop @section('content') -role == 'agent') { $dept = App\Model\helpdesk\Agent\Department::where('id','=',Auth::user()->primary_dpt)->first(); $tickets = App\Model\helpdesk\Ticket\Tickets::where('status', '=', 1)->where('assigned_to', '=', Auth::user()->id)->orderBy('id', 'ASC')->paginate(20); @@ -62,12 +63,62 @@ class="active" Lang::get('lang.ticket_id'), Lang::get('lang.priority'), Lang::get('lang.from'), - Lang::get('lang.last_replier'), Lang::get('lang.assigned_to'), Lang::get('lang.last_activity')) - ->setUrl(route('get.myticket.ticket')) - ->setOrder(array(7=>'desc')) - ->setClass('table table-hover table-bordered table-striped') + ->setUrl(route('get.myticket.ticket')) + ->setOptions('aoColumnDefs',array( + array( + 'render' => "function ( data, type, row ) { + var t = row[6].split(/[- :,/ :,. /]/); + var d = new Date(t[0], t[1]-1, t[2], t[3], t[4], t[5]); + + var dtf= '$date_time_format'; + if(dtf==1) { + dtf = 'D/MMM/YYYY hh:mm:ss A'; + } else if(dtf==2) { + dtf = 'D MMM, YYYY hh:mm:ss A'; + } else if(dtf==3) { + dtf = 'D-MMM-YYYY hh:mm:ss A'; + } else if(dtf==4) { + dtf = 'MMM/D/YYYY hh:mm:ss A'; + } else if(dtf==5) { + dtf = 'MMM D, YYYY hh:mm:ss A'; + } else if(dtf==6) { + dtf = 'MMM-D-YYYY hh:mm:ss A'; + } else if(dtf==7) { + dtf = 'YYYY/MMM/D hh:mm:ss A'; + } else if(dtf==8) { + dtf = 'YYYY, MMM D hh:mm:ss A'; + } else if(dtf==9) { + dtf = 'YYYY-MMM-D hh:mm:ss A'; + } + return moment(d).format(dtf); + + }", + 'aTargets' => array(6)) + )) + ->setOrder(array(6=>'desc')) + ->setClass('table table-hover table-bordered table-striped') + ->setCallbacks("fnRowCallback",'function( nRow, aData, iDisplayIndex, iDisplayIndexFull ) { + var str = aData[3]; + if(str.search("#000") == -1) { + $("td", nRow).css({"background-color":"#F3F3F3", "font-weight":"600", "border-bottom":"solid 0.5px #ddd", "border-right":"solid 0.5px #F3F3F3"}); + $("td", nRow).mouseenter(function(){ + $("td", nRow).css({"background-color":"#DEDFE0", "font-weight":"600", "border":"none"}); + }); + $("td", nRow).mouseleave(function(){ + $("td", nRow).css({"background-color":"#F3F3F3", "font-weight":"600", "border-bottom":"solid 0.5px #ddd","border-right":"solid 0.5px #F3F3F3"}); + }); + } else { + $("td", nRow).css({"background-color":"white", "border-bottom":"solid 0.5px #ddd", "border-right":"solid 0.5px white"}); + $("td", nRow).mouseenter(function(){ + $("td", nRow).css({"background-color":"#DEDFE0", "border":"none"}); + }); + $("td", nRow).mouseleave(function(){ + $("td", nRow).css({"background-color":"white", "border-bottom":"solid 0.5px #ddd", "border-right":"solid 0.5px white"}); + }); + } + }') ->render();!!} diff --git a/resources/views/themes/default1/agent/helpdesk/ticket/open.blade.php b/resources/views/themes/default1/agent/helpdesk/ticket/open.blade.php index 75ee082b1..fe8207a59 100644 --- a/resources/views/themes/default1/agent/helpdesk/ticket/open.blade.php +++ b/resources/views/themes/default1/agent/helpdesk/ticket/open.blade.php @@ -14,6 +14,7 @@ class="active" @section('content') role == 'agent') { $dept = App\Model\helpdesk\Agent\Department::where('id','=',Auth::user()->primary_dpt)->first(); $tickets = App\Model\helpdesk\Ticket\Tickets::where('status', '=', 1)->where('isanswered', '=', 0)->where('dept_id','=',$dept->id)->orderBy('id', 'DESC')->paginate(20); @@ -67,12 +68,62 @@ class="active" Lang::get('lang.ticket_id'), Lang::get('lang.priority'), Lang::get('lang.from'), - Lang::get('lang.last_replier'), Lang::get('lang.assigned_to'), Lang::get('lang.last_activity')) - ->setUrl(route('get.open.ticket')) - ->setOrder(array(7=>'desc')) - ->setClass('table table-hover table-bordered table-striped') + ->setUrl(route('get.open.ticket')) + ->setOptions('aoColumnDefs',array( + array( + 'render' => "function ( data, type, row ) { + var t = row[6].split(/[- :,/ :,. /]/); + var d = new Date(t[0], t[1]-1, t[2], t[3], t[4], t[5]); + + var dtf= '$date_time_format'; + if(dtf==1) { + dtf = 'D/MMM/YYYY hh:mm:ss A'; + } else if(dtf==2) { + dtf = 'D MMM, YYYY hh:mm:ss A'; + } else if(dtf==3) { + dtf = 'D-MMM-YYYY hh:mm:ss A'; + } else if(dtf==4) { + dtf = 'MMM/D/YYYY hh:mm:ss A'; + } else if(dtf==5) { + dtf = 'MMM D, YYYY hh:mm:ss A'; + } else if(dtf==6) { + dtf = 'MMM-D-YYYY hh:mm:ss A'; + } else if(dtf==7) { + dtf = 'YYYY/MMM/D hh:mm:ss A'; + } else if(dtf==8) { + dtf = 'YYYY, MMM D hh:mm:ss A'; + } else if(dtf==9) { + dtf = 'YYYY-MMM-D hh:mm:ss A'; + } + return moment(d).format(dtf); + + }", + 'aTargets' => array(6)) + )) + ->setOrder(array(6=>'desc')) + ->setClass('table table-hover table-bordered table-striped') + ->setCallbacks("fnRowCallback",'function( nRow, aData, iDisplayIndex, iDisplayIndexFull ) { + var str = aData[3]; + if(str.search("#000") == -1) { + $("td", nRow).css({"background-color":"#F3F3F3", "font-weight":"600", "border-bottom":"solid 0.5px #ddd", "border-right":"solid 0.5px #F3F3F3"}); + $("td", nRow).mouseenter(function(){ + $("td", nRow).css({"background-color":"#DEDFE0", "font-weight":"600", "border":"none"}); + }); + $("td", nRow).mouseleave(function(){ + $("td", nRow).css({"background-color":"#F3F3F3", "font-weight":"600", "border-bottom":"solid 0.5px #ddd","border-right":"solid 0.5px #F3F3F3"}); + }); + } else { + $("td", nRow).css({"background-color":"white", "border-bottom":"solid 0.5px #ddd", "border-right":"solid 0.5px white"}); + $("td", nRow).mouseenter(function(){ + $("td", nRow).css({"background-color":"#DEDFE0", "border":"none"}); + }); + $("td", nRow).mouseleave(function(){ + $("td", nRow).css({"background-color":"white", "border-bottom":"solid 0.5px #ddd", "border-right":"solid 0.5px white"}); + }); + } + }') ->render();!!} diff --git a/resources/views/themes/default1/agent/helpdesk/ticket/overdue.blade.php b/resources/views/themes/default1/agent/helpdesk/ticket/overdue.blade.php index 7929f32f9..037f2e0d4 100644 --- a/resources/views/themes/default1/agent/helpdesk/ticket/overdue.blade.php +++ b/resources/views/themes/default1/agent/helpdesk/ticket/overdue.blade.php @@ -14,22 +14,44 @@ class="active" @section('content') role == 'agent') { - $dept = App\Model\helpdesk\Agent\Department::where('id','=',Auth::user()->primary_dpt)->first(); - $tickets = App\Model\helpdesk\Ticket\Tickets::where('status', '=', 1)->where('dept_id','=',$dept->id)->orderBy('id', 'DESC')->paginate(20); - } else { - $tickets = App\Model\helpdesk\Ticket\Tickets::where('status', '=', 1)->orderBy('id', 'DESC')->paginate(20); - } + $date_time_format = UTC::getDateTimeFormat(); +if (Auth::user()->role == 'agent') { + $dept = Department::where('id', '=', Auth::user()->primary_dpt)->first(); + $overdues = App\Model\helpdesk\Ticket\Tickets::where('status', '=', 1)->where('isanswered', '=', 0)->where('dept_id', '=', $dept->id)->orderBy('id', 'DESC')->get(); + } else { + $overdues = App\Model\helpdesk\Ticket\Tickets::where('status', '=', 1)->where('isanswered', '=', 0)->orderBy('id', 'DESC')->get(); + } +$i = count($overdues); +if ($i == 0) { + $overdue_ticket = 0; + } else { + $j = 0; + foreach ($overdues as $overdue) { + $sla_plan = App\Model\helpdesk\Manage\Sla_plan::where('id', '=', $overdue->sla)->first(); + + $ovadate = $overdue->created_at; + $new_date = date_add($ovadate, date_interval_create_from_date_string($sla_plan->grace_period)).'

    '; + if (date('Y-m-d H:i:s') > $new_date) { + $j++; + //$value[] = $overdue; + } + } + // dd(count($value)); + if ($j > 0) { + $overdue_ticket = $j; + } else { + $overdue_ticket = 0; + } + } ?>
    -
    -

    Overdue

    {!! $tickets->total() !!} tickets +
    +

    {!! Lang::get('lang.overdue') !!}

    {!! $overdue_ticket !!} {!! Lang::get('lang.tickets') !!}
    @if(Session::has('success'))
    - - Success + Success {{Session::get('success')}}
    @@ -37,165 +59,437 @@ class="active" @if(Session::has('fails'))
    - - Fail! + Fail! {{Session::get('fails')}}
    @endif -
    - - {!! Form::open(['route'=>'select_all','method'=>'post']) !!} - +
    + {!! Form::open(['id'=>'modalpopup', 'route'=>'select_all','method'=>'post']) !!}
    -

    {!! $tickets->count().'-'.$tickets->total(); !!}

    - - - + {{-- --}} + + + +
    -
    - - - - - - - - - - - - - - - - @foreach ($tickets as $ticket ) - seen_by == null) {?> style="color:green;" sla; - $SlaPlan = App\Model\helpdesk\Manage\Sla_plan::where('id', '=', $sla)->first(); - - $time = $ticket->created_at; - $time = date_create($time); - date_add($time, date_interval_create_from_date_string($SlaPlan->grace_period)); - echo date_format($time, 'd/m/Y H:i:s'); - -?> > - - id)->get(); - $collab = count($collaborators); - // title - $title = App\Model\helpdesk\Ticket\Ticket_Thread::where('ticket_id', '=', $ticket->id)->first(); - $string = strip_tags($title->title); - // check atatchments - $attachments = App\Model\helpdesk\Ticket\Ticket_attachments::where('thread_id','=',$title->id)->first(); - $attach = count($attachments); - - if (strlen($string) > 40) { - $stringCut = substr($string, 0, 40); - $string = substr($stringCut, 0, strrpos($stringCut, ' ')).' ...'; - } - $TicketData = App\Model\helpdesk\Ticket\Ticket_Thread::where('ticket_id', '=', $ticket->id)->max('id'); - $TicketDatarow = App\Model\helpdesk\Ticket\Ticket_Thread::where('id', '=', $TicketData)->first(); - $LastResponse = App\User::where('id', '=', $TicketDatarow->user_id)->first(); - if($LastResponse->role == "user") { - $rep = "#F39C12"; - $username = $LastResponse->user_name; - } else { $rep = "#000"; $username = $LastResponse->first_name ." ". $LastResponse->last_name; - if($LastResponse->first_name==null || $LastResponse->last_name==null) { - $username = $LastResponse->user_name; - }} - $titles = App\Model\helpdesk\Ticket\Ticket_Thread::where('ticket_id', '=', $ticket->id)->get(); - $count = count($titles); - foreach($titles as $title) - { - $title = $title; - } - $assigned_to = App\User::where('id','=',$ticket->assigned_to)->first(); - if($assigned_to == null) - { - $assigned = "Unassigned"; - } - else - { - $assigned = $assigned_to->first_name ." ". $assigned_to->last_name; - } - ?> - - - priority_id)->first();?> - - user_id)->first(); ?> - @if($from->role == "user") - - @else - - @endif - - - - - @endforeach - -
    SubjectTicket IDPriorityFromLast ReplierAssigned ToLast Activity
    {{$string}} ({!! $count!!}) - @if($collab > 0) @endif - @if($attach > 0) @endif#{!! $ticket->ticket_number !!}{{$priority->priority_desc}}{!! $from->user_name !!}{!! $from->first_name." ".$from->last_name !!}{!! $username !!}{!! $assigned !!}{!! UTC::usertimezone($title->updated_at) !!}
    -
    - setPath(url('/ticket/overdue'))->render();?>  -
    +
    + + {!! Datatable::table() + ->addColumn( + "", + Lang::get('lang.subject'), + Lang::get('lang.ticket_id'), + Lang::get('lang.priority'), + Lang::get('lang.from'), + Lang::get('lang.assigned_to'), + Lang::get('lang.last_activity')) + ->setUrl(route('get.overdue.ticket')) + ->setOptions('aoColumnDefs',array( + array( + 'render' => "function ( data, type, row ) { + var t = row[6].split(/[- :,/ :,. /]/); + var d = new Date(t[0], t[1]-1, t[2], t[3], t[4], t[5]); + + var dtf= '$date_time_format'; + if(dtf==1) { + dtf = 'D/MMM/YYYY hh:mm:ss A'; + } else if(dtf==2) { + dtf = 'D MMM, YYYY hh:mm:ss A'; + } else if(dtf==3) { + dtf = 'D-MMM-YYYY hh:mm:ss A'; + } else if(dtf==4) { + dtf = 'MMM/D/YYYY hh:mm:ss A'; + } else if(dtf==5) { + dtf = 'MMM D, YYYY hh:mm:ss A'; + } else if(dtf==6) { + dtf = 'MMM-D-YYYY hh:mm:ss A'; + } else if(dtf==7) { + dtf = 'YYYY/MMM/D hh:mm:ss A'; + } else if(dtf==8) { + dtf = 'YYYY, MMM D hh:mm:ss A'; + } else if(dtf==9) { + dtf = 'YYYY-MMM-D hh:mm:ss A'; + } + return moment(d).format(dtf); + + }", + 'aTargets' => array(6)) + )) + ->setOrder(array(6=>'desc')) + ->setClass('table table-hover table-bordered table-striped') + ->setCallbacks("fnRowCallback",'function( nRow, aData, iDisplayIndex, iDisplayIndexFull ) { + var str = aData[3]; + if(str.search("#000") == -1) { + $("td", nRow).css({"background-color":"#F3F3F3", "font-weight":"600", "border-bottom":"solid 0.5px #ddd", "border-right":"solid 0.5px #F3F3F3"}); + $("td", nRow).mouseenter(function(){ + $("td", nRow).css({"background-color":"#DEDFE0", "font-weight":"600", "border":"none"}); + }); + $("td", nRow).mouseleave(function(){ + $("td", nRow).css({"background-color":"#F3F3F3", "font-weight":"600", "border-bottom":"solid 0.5px #ddd","border-right":"solid 0.5px #F3F3F3"}); + }); + } else { + $("td", nRow).css({"background-color":"white", "border-bottom":"solid 0.5px #ddd", "border-right":"solid 0.5px white"}); + $("td", nRow).mouseenter(function(){ + $("td", nRow).css({"background-color":"#DEDFE0", "border":"none"}); + }); + $("td", nRow).mouseleave(function(){ + $("td", nRow).css({"background-color":"white", "border-bottom":"solid 0.5px #ddd", "border-right":"solid 0.5px white"}); + }); + } + }') + ->render();!!} +
    {!! Form::close() !!}
    + + + + + + @stop \ No newline at end of file diff --git a/resources/views/themes/default1/agent/helpdesk/ticket/timeline.blade.php b/resources/views/themes/default1/agent/helpdesk/ticket/timeline.blade.php index dc5205057..be3f939e7 100644 --- a/resources/views/themes/default1/agent/helpdesk/ticket/timeline.blade.php +++ b/resources/views/themes/default1/agent/helpdesk/ticket/timeline.blade.php @@ -61,11 +61,12 @@ active
  • Reply Rating: - ratingreply=='1')?'checked':'' ?> /> - ratingreply=='2')?'checked':'' ?> /> - ratingreply=='3')?'checked':'' ?> /> - ratingreply=='4')?'checked':'' ?> /> - ratingreply=='5')?'checked':'' ?> /> + + /> + /> + /> + /> + />
  • @@ -107,13 +108,15 @@ active
    can_delete_ticket == 1 || $group->can_ban_email == 1) {?> -
    +
    -