+
+
+
+
+
+
+ items)) : ?>
+
+
+
+
+
+
+
+ |
+
+ |
+
+
+ |
+
+
+ |
+
+
+ |
+ |
+
+
+ |
+
+
+
+
+ |
+ pagination->getListFooter(); ?>
+ |
+
+
+
+ items as $i => $item) : ?>
+
+ |
+ published, $i, 'modules.', false, 'cb', $item->publish_up, $item->publish_down); ?>
+ |
+
+ authorise('core.edit', 'com_modules.module.' . $item->id) && $user->authorise('core.manage', 'com_modules')) : ?>
+
+ escape($item->title); ?>
+
+ escape($item->title); ?>
+
+ |
+
+ position)) : ?>
+ escape($item->position); ?>
+
+ ---
+
+ |
+
+ deadline === true) : ?>
+
+ deadline)) : ?>
+
+
+ deadline)->toSql(); ?>
+
+ |
+
+
+ |
+
+ id; ?>
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/deployed/smartcountdown3/administrator/components/com_smartcountdown3/views/modules/tmpl/index.html b/deployed/smartcountdown3/administrator/components/com_smartcountdown3/views/modules/tmpl/index.html
new file mode 100644
index 00000000..2efb97f3
--- /dev/null
+++ b/deployed/smartcountdown3/administrator/components/com_smartcountdown3/views/modules/tmpl/index.html
@@ -0,0 +1 @@
+
diff --git a/deployed/smartcountdown3/administrator/components/com_smartcountdown3/views/modules/view.html.php b/deployed/smartcountdown3/administrator/components/com_smartcountdown3/views/modules/view.html.php
new file mode 100644
index 00000000..8faf8de8
--- /dev/null
+++ b/deployed/smartcountdown3/administrator/components/com_smartcountdown3/views/modules/view.html.php
@@ -0,0 +1,66 @@
+items = $this->get('Items');
+ $this->pagination = $this->get('Pagination');
+ $this->state = $this->get('State');
+
+ // Check for errors.
+ if (count($errors = $this->get('Errors')))
+ {
+ JError::raiseError(500, implode("\n", $errors));
+
+ return false;
+ }
+
+ smartCountdown3Helper::addSubmenu('modules');
+
+ $this->addToolbar();
+ $this->sidebar = JHtmlSidebar::render();
+ parent::display($tpl);
+ }
+
+ protected function addToolbar()
+ {
+ $state = $this->get('State');
+ $canDo = JHelperContent::getActions('com_smartcountdown3');
+
+ JToolbarHelper::title(JText::_('COM_SMARTCOUNTDOWN3_MANAGER_MODULES'), 'scd-manager-moduels');
+
+ if ($canDo->get('core.admin'))
+ {
+ JToolbarHelper::preferences('com_smartcountdown3');
+ }
+
+ JHtmlSidebar::setAction('index.php?option=com_smartcountdown3&view=modules');
+
+ JHtmlSidebar::addFilter(
+ JText::_('JOPTION_SELECT_PUBLISHED'),
+ 'filter_state',
+ JHtml::_('select.options', JHtml::_('jgrid.publishedOptions', array("archived" => 0, "all" => 0)), 'value', 'text', $this->state->get('filter.state'), true)
+ );
+
+ }
+
+ protected function getSortFields()
+ {
+ return array(
+ 'a.id' => JText::_('JGRID_HEADING_ID'),
+ 'a.published' => JText::_('JSTATUS'),
+ 'a.title' => JText::_('JGLOBAL_TITLE'),
+ 'a.position' => JText::_('COM_SMARTCOUNTDOWN3_MODULES_SORT_POSITION')
+ );
+ }
+}
diff --git a/deployed/smartcountdown3/administrator/components/com_smartcountdown3/views/render/index.html b/deployed/smartcountdown3/administrator/components/com_smartcountdown3/views/render/index.html
new file mode 100644
index 00000000..2efb97f3
--- /dev/null
+++ b/deployed/smartcountdown3/administrator/components/com_smartcountdown3/views/render/index.html
@@ -0,0 +1 @@
+
diff --git a/deployed/smartcountdown3/administrator/components/com_smartcountdown3/views/render/tmpl/default.php b/deployed/smartcountdown3/administrator/components/com_smartcountdown3/views/render/tmpl/default.php
new file mode 100644
index 00000000..df0cf19b
--- /dev/null
+++ b/deployed/smartcountdown3/administrator/components/com_smartcountdown3/views/render/tmpl/default.php
@@ -0,0 +1,39 @@
+
+
+
+module))
+{
+ echo JText::_('COM_SMARTCOUNTDOWN3_MODULES_PREVIEW_ERROR');
+}
+else
+{
+ $params = new JRegistry;
+ $params->loadString($this->module->params);
+
+ // disable automatic redirection related options (they will not work in admin preview)
+ $params->set('counter_clickable', 0);
+ $params->set('event_goto_menu', 0);
+ $params->set('event_goto_url', '');
+
+ $module = $this->module;
+ $path = JPATH_SITE . '/modules/mod_smartcountdown3/mod_smartcountdown3.php';
+ $is_admin_preview = true;
+ include $path;
+}
+?>
diff --git a/deployed/smartcountdown3/administrator/components/com_smartcountdown3/views/render/tmpl/index.html b/deployed/smartcountdown3/administrator/components/com_smartcountdown3/views/render/tmpl/index.html
new file mode 100644
index 00000000..2efb97f3
--- /dev/null
+++ b/deployed/smartcountdown3/administrator/components/com_smartcountdown3/views/render/tmpl/index.html
@@ -0,0 +1 @@
+
diff --git a/deployed/smartcountdown3/administrator/components/com_smartcountdown3/views/render/view.html.php b/deployed/smartcountdown3/administrator/components/com_smartcountdown3/views/render/view.html.php
new file mode 100644
index 00000000..9b61be14
--- /dev/null
+++ b/deployed/smartcountdown3/administrator/components/com_smartcountdown3/views/render/view.html.php
@@ -0,0 +1,29 @@
+load('mod_smartcountdown3', JPATH_SITE . '/modules/mod_smartcountdown3');
+
+ $app = JFactory::getApplication();
+
+ $id = $app->input->getInt('id', 0);
+
+ $db = JFactory::getDbo();
+ $db->setQuery('SELECT a.* FROM #__modules AS a WHERE a.id = ' . $id);
+ $this->module = $db->loadObject();
+
+ /* Looks that we do not need this
+ $this->module->publish_up = $this->module->publish_down = $db->getNullDate();
+ $this->module->published = 1;
+ $this->module->access = 1;
+ */
+
+ parent::display($tpl);
+ }
+}
\ No newline at end of file
diff --git a/deployed/smartcountdown3/components/com_smartcountdown3/controllers/event.json.php b/deployed/smartcountdown3/components/com_smartcountdown3/controllers/event.json.php
new file mode 100644
index 00000000..f819492a
--- /dev/null
+++ b/deployed/smartcountdown3/components/com_smartcountdown3/controllers/event.json.php
@@ -0,0 +1,442 @@
+input->getInt ( 'scd_module_id', 0 );
+
+ // get requested module data
+ $db = JFactory::getDbo ();
+ $db->setQuery ( 'SELECT a.* FROM #__modules AS a WHERE a.id = ' . $module_id );
+ try {
+ $module = $db->loadObject ();
+ } catch ( RuntimeException $e ) {
+ self::sendResponse ( null, 500, $e->getMessage () );
+ return;
+ }
+ // check that the module exists
+ $params_raw = @$module->params;
+ if (empty ( $params_raw )) {
+ self::sendResponse ( null, 100, 'Module not found' );
+ return;
+ }
+
+ $params = new JRegistry ();
+ $params->loadString ( $params_raw );
+
+ // look for events import plugins
+ $dispatcher = JDispatcher::getInstance ();
+ JPluginHelper::importPlugin ( 'system' );
+ $result = $dispatcher->trigger ( 'onCountdownGetEventsQueue', array (
+ 'mod_smartcountdown3',
+ $params
+ ) );
+
+ if (in_array ( false, $result, true )) {
+ // this is a json controller and plugins cannot display error messages directly.
+ // plugins can add messages to application queue (in debug mode, e.g.) and we can
+ // extract them here and send in error response
+ $messages = $app->getMessageQueue ();
+ if (! empty ( $messages )) {
+ $message = array ();
+ foreach ( $messages as $m ) {
+ $message [] = $m ['message'];
+ }
+ $message = implode ( ', ', $message );
+ } else {
+ $message = 'Error processing event import plugin';
+ }
+ // Do not change error code below - it is required for
+ // event import plugins debugging mode
+ self::sendResponse ( null, 101, $message );
+ return;
+ }
+
+ // filter out empty result elements (plugin returned true)
+ $result = array_filter ( $result, function ($v) {
+ return $v !== true;
+ } );
+
+ $now_micro_ts = microtime ( true );
+ $now_ts_millis = round ( $now_micro_ts, 3 ) * 1000;
+ $now_ts = round ( $now_micro_ts );
+
+ // get counter display modes from options. Here we are interested in
+ // "countup limit" only.
+ $modes = explode ( ':', $params->get ( 'counter_modes', '-1:-1' ) );
+
+ if (empty ( $result )) {
+ // plugins not enabled for this module instance or system-wide
+ // get internal counter
+ $deadline = JDate::getInstance ( $params->get ( 'deadline', 'now' ) );
+
+ // for internal counter "countdown to end" mode (-2) has no sense
+ $countup_limit = $modes [1] < 0 ? - 1 : $modes [1];
+
+ if ($countup_limit >= 0 && $deadline->getTimestamp () + $countup_limit <= $now_ts) {
+ $deadline = '';
+ } else {
+ $deadline = $deadline->format ( 'c' );
+ }
+
+ $options = array (
+ 'deadline' => $deadline,
+ 'countup_limit' => $countup_limit,
+ 'countdown_query_limit' => -1,
+ 'now' => $now_ts_millis
+ );
+ } else {
+ // process imported events
+ $countup_limit = $modes [1];
+
+ $current_event = self::processImportedEvents ( $result, $countup_limit, $now_ts );
+ if (empty ( $current_event )) {
+ $options = array (
+ 'deadline' => '',
+ 'countup_limit' => '',
+ 'imported_title' => '',
+ 'now' => $now_ts_millis
+ );
+ } else {
+ $options = array (
+ 'deadline' => $current_event ['deadline'],
+ 'countup_limit' => $current_event ['countup_limit'],
+ 'countdown_query_limit' => $current_event ['countdown_query_limit'],
+ 'imported_title_down' => $current_event ['imported_title_down'],
+ 'imported_title_up' => $current_event ['imported_title_up'],
+ 'is_countdown_to_end' => $current_event ['is_countdown_to_end'],
+ 'now' => $now_ts_millis
+ );
+ // Only add redirect URLs to response if they are defined by event import plugin
+ // (when not defined in response, those set in module options will be used)
+ if (isset ( $current_event ['click_url'] )) {
+ $options ['click_url'] = $current_event ['click_url'];
+ }
+ if (isset ( $current_event ['redirect_url'] )) {
+ $options ['redirect_url'] = $current_event ['redirect_url'];
+ }
+ }
+ }
+ self::sendResponse ( $options );
+ }
+ private static function processImportedEvents($result, $countup_limit, $now_ts) {
+ if (empty ( $result )) {
+ return false;
+ }
+
+ // Plain events arrays
+ $current_events = array ();
+ $future_events = array ();
+
+ // merge events from all providers. For now there is no difference which
+ // import plugin events comes from
+ foreach ( $result as $group ) {
+ foreach ( $group as $i => $event ) {
+ // ===== old import modules handle "countdown to end mode" creating two events with
+ // duration zero, setting 'is_countdown_to_end' flag for the second event and
+ // its deadline as first event deadline + first event imported duration.
+ // For each group such events always go one after another in unsorted timeline,
+ // so we can detect CTE simutation events pair
+ if(isset($group[$i + 1]) && !empty($group[$i + 1]['is_countdown_to_end'])) {
+ // if we have next event and it is CTE, modify current event setting its
+ // 'is_countdown_to_end' flag and correct duration (recover it from difference
+ // in deadlines)
+ $event['is_countdown_to_end'] = 1;
+ $event['duration'] = $group[$i + 1]['deadline'] - $group[$i]['deadline'];
+ // mark next event as processed - it shouldn't be added to timeline
+ $group[$i + 1]['skip_event'] = 1;
+ }
+ if(!empty($group[$i]['skip_event'])) {
+ // this event was already processed, discard it
+ continue;
+ }
+ // end old plugins compatibility code =====
+
+ // separate and filter events
+ if ($event ['deadline'] <= $now_ts) {
+ // event already started
+ if ($event ['duration'] >= 0) {
+ $duration_filter = $countup_limit >= 0 ? min ( $countup_limit, $event ['duration'] ) : $event ['duration'];
+ if ($event ['deadline'] + $duration_filter > $now_ts) {
+ $current_events [] = $event;
+ }
+ } else {
+ // we are interested in all started events which have no end date
+ $current_events [] = $event;
+ }
+ } elseif ($event ['deadline'] > $now_ts) {
+ // we are interested in all future events
+ $future_events [] = $event;
+ }
+ // finished events are discarded
+ }
+ }
+
+ $is_countdown_to_end = $countup_limit == - 2;
+
+ // Structured events. Each deadline will be an array of events, keyed and sorted
+ // by their end time (normal) or start time (CTE)
+
+ $current_events = self::groupEvents ( $current_events, 'current', $is_countdown_to_end );
+ $future_events = self::groupEvents ( $future_events, 'future', false );
+
+ $max_countup_limit = 0;
+
+ if ($is_countdown_to_end) {
+ // CTE (countdown-to-end) mode
+ if (! empty ( $current_events )) {
+ // closest event(s) end time is the deadline
+ $event_end_times = array_keys ( $current_events );
+ $deadline_ts = $event_end_times [0];
+
+ // get events group (for overlapping events)
+ $events = reset ( $current_events );
+ $event_start_times = array_keys ( $events );
+
+ // if there are future events we need the closest event start to
+ // set countdown limit - when this limit is reached we must repeat event query
+ $countdown_query_limit = 0;
+ if (! empty ( $future_events )) {
+ // future events are always grouped by start dates
+ $event_start_times = array_keys ( $future_events );
+ $countdown_query_limit = $deadline_ts - $event_start_times [0];
+ if ($countdown_query_limit < 0) {
+ // if the closest future event start after the current events finish
+ // we ignore the difference
+ $countdown_query_limit = 0;
+ }
+ }
+ $countdown_to_end = 1;
+ } elseif (! empty ( $future_events )) {
+ $event_start_times = array_keys ( $future_events );
+ $deadline_ts = $event_start_times [0];
+
+ $events = reset ( $future_events );
+ $event_end_times = array_keys ( $events );
+
+ // we have only future events. In CTE mode we must repeat event query once
+ // the deadline is reached
+ $countdown_query_limit = 0;
+ $countdown_to_end = 0;
+ }
+ } else {
+ $current_event_start_times = array_keys ( $current_events );
+ $future_event_start_times = array_keys ( $future_events );
+
+ // normal mode
+ if (! empty ( $current_events )) {
+ // most recently started event(s) start time is the deadline
+ $deadline_ts = $current_event_start_times [0];
+
+ // get events group (for overlapping events)
+ $events = reset ( $current_events );
+ $event_end_times = array_keys ( $events );
+
+ if (! empty ( $future_events )) {
+ // limit countup to next event start and event duration
+ $max_countup_limit = min ( $future_event_start_times [0], $event_end_times [0] ) - $deadline_ts;
+ } else {
+ // no more events - limit countup to event duration only
+ $max_countup_limit = $event_end_times [0] - $deadline_ts;
+ }
+ } elseif (! empty ( $future_events )) {
+ // we have only future events
+ // the closest future event(s) start time is the deadline
+ $deadline_ts = $future_event_start_times [0];
+
+ $events = reset ( $future_events );
+ $event_end_times = array_keys ( $events );
+
+ if (isset ( $future_event_start_times [1] )) {
+ // limit countup to next event start and event duration
+ $max_countup_limit = min ( $future_event_start_times [1], $event_end_times [0] ) - $deadline_ts;
+ } else {
+ // no more events - limit countup to event duration only
+ $max_countup_limit = $event_end_times [0] - $deadline_ts;
+ }
+ }
+
+ // adjust countup_limit
+ if ($countup_limit >= 0) {
+ $countup_limit = min ( $countup_limit, $max_countup_limit );
+ } else {
+ $countup_limit = $max_countup_limit;
+ }
+ // no CTE in normal mode
+ $countdown_to_end = 0;
+ $countdown_query_limit = - 1;
+ }
+
+ // normally event import plugins will fetch only valid events,
+ // just in case the timeline is empty, we simulate "no events found"
+ if (empty ( $events )) {
+ return false;
+ }
+
+ // event import plugins can be set up to import event titles:
+ // common titles - should be displayed both before event and when event has started
+ // per-mode titles - one for countdown mode and the other for count up or countdown-to-end
+
+ // we maintain 2 array for all simultaneos events. If an event imported has per-mode
+ // titles set we add each title to the corresponding concatenation array,
+ // otherwise (common titles) event title will be added to both concat arrays.
+ $concat_title_down = array ();
+ $concat_title_up = array ();
+
+ $redirect_url = null;
+ $click_url = null;
+
+ // iterate through events - construct title proposal and detect
+ // countdown_to_end events
+ foreach ( $events as &$event ) {
+ // update concatenation arrays
+ self::concatTitles ( $concat_title_down, $concat_title_up, $event );
+
+ // if there are more than 1 current evetns, each one can define its own
+ // redirection URL. We must resolve this conflict for both auto-redirect and click:
+ // the first event in list must win. Links in event titles will work OK even if
+ // multiple events are listed.
+ if (empty ( $redirect_url ) && ! empty ( $event ['redirect_url'] )) {
+ $redirect_url = $event ['redirect_url'];
+ }
+ if (empty ( $click_url ) && ! empty ( $event ['click_url'] )) {
+ $click_url = $event ['click_url'];
+ }
+ }
+
+ // start clean data structure
+ $event = array ();
+
+ // join titles to a string (may be empty string if no titles found)
+ $concat_title_down = implode ( ', ', $concat_title_down );
+ $event ['imported_title_down'] = $concat_title_down;
+ $concat_title_up = implode ( ', ', $concat_title_up );
+ $event ['imported_title_up'] = $concat_title_up;
+
+ $deadline = new DateTime ();
+ $deadline->setTimestamp ( $deadline_ts );
+ $event ['deadline'] = $deadline->format ( 'c' );
+ $event ['is_countdown_to_end'] = $countdown_to_end;
+ if (! empty ( $redirect_url )) {
+ $event ['redirect_url'] = $redirect_url;
+ }
+ if (! empty ( $click_url )) {
+ $event ['click_url'] = $click_url;
+ }
+ $event ['countup_limit'] = $countup_limit;
+ $event ['countdown_query_limit'] = $countdown_query_limit;
+
+ return $event;
+ }
+ private static function groupEvents($unsorted, $events_type, $is_countdown_to_end = false) {
+ $timeline = array ();
+ foreach ( $unsorted as $event ) {
+ if ($is_countdown_to_end && $event ['duration'] == - 1) {
+ // no countdown-to-end for events with no end date
+ continue;
+ }
+
+ $event_start_ts = $event ['deadline'];
+ if ($event ['duration'] >= 0) {
+ $event_end_ts = $event ['deadline'] + $event ['duration'];
+ } else {
+ $event_end_ts = PHP_INT_MAX;
+ }
+
+ if ($is_countdown_to_end) {
+ // for countdown-to-end mode group events by end date
+ if (! isset ( $timeline [$event_end_ts] )) {
+ $timeline [$event_end_ts] = array ();
+ }
+ // make sure we have unique $event_start_ts key: otherwise if there are fully overlapping
+ // events the last event data will overwrite the previous one(s) which will be lost
+ while ( isset ( $timeline [$event_end_ts] [$event_start_ts] ) ) {
+ $event_start_ts = '0' . $event_start_ts;
+ }
+ // add event to timeline
+ $timeline [$event_end_ts] [$event_start_ts] = $event;
+ } else {
+ // for normal mode group events by start date
+ if (! isset ( $timeline [$event_start_ts] )) {
+ $timeline [$event_start_ts] = array ();
+ }
+ // make sure we have unique $event_end_ts key: otherwise if there are fully overlapping
+ // events the last event data will overwrite the previous one(s) which will be lost
+ while ( isset ( $timeline [$event_start_ts] [$event_end_ts] ) ) {
+ $event_end_ts = '0' . $event_end_ts;
+ }
+ // add event to timeline
+ $timeline [$event_start_ts] [$event_end_ts] = $event;
+ }
+ }
+
+ if ($is_countdown_to_end) {
+ $events = self::sortEvents ( $timeline, 'asc'/*, 'asc'*/ );
+ } else {
+ $events = self::sortEvents ( $timeline, $events_type == 'future' ? 'asc' : 'desc' );
+ }
+
+ return $events;
+ }
+ private static function sortEvents($timeline, $sort = 'asc') {
+ // Sort each group
+
+ // user-defined sort function: for numerically distinct values
+ // we compare numerically, for zero-padded trick values we compare string length -
+ // very easy but effective - the only difference is the number of zeros prepended
+ // to the value, so this simple will do the trick - the shortest (i.e. added first)
+ // will come first.
+ foreach ( $timeline as &$group ) {
+ uksort ( $group, function ($a, $b) {
+ if (intval ( $a ) == intval ( $b )) {
+ return strlen ( $a ) > strlen ( $b ) ? 1 : (strlen ( $a ) < strlen ( $b ) ? - 1 : 0);
+ } else {
+ return intval ( $a ) > intval ( $b ) ? 1 : (intval ( $a ) < intval ( $b ) ? - 1 : 0);
+ }
+ } );
+ }
+
+ // Sort groups
+ ksort ( $timeline, SORT_NUMERIC );
+ if ($sort == 'desc') {
+ // revert order for 'desc' sort
+ $timeline = array_reverse ( $timeline, true );
+ }
+
+ return $timeline;
+ }
+ private static function concatTitles(&$concat_title_down, &$concat_title_up, $event) {
+ // implicitly reduce full duplicates
+ if (isset ( $event ['title_down'] ) && trim ( $event ['title_down'] ) != '') {
+ $concat_title_down [$event ['title_down']] = $event ['title_down'];
+ } elseif (isset ( $event ['title'] ) && trim ( $event ['title'] ) != '') {
+ $concat_title_down [$event ['title']] = $event ['title'];
+ }
+ if (isset ( $event ['title_up'] ) && trim ( $event ['title_up'] ) != '') {
+ $concat_title_up [$event ['title_up']] = $event ['title_up'];
+ } elseif (isset ( $event ['title'] ) && trim ( $event ['title'] ) != '') {
+ $concat_title_up [$event ['title']] = $event ['title'];
+ }
+ }
+ private static function sendResponse($options = array('deadline' => ''), $err_code = 0, $err_msg = '') {
+ $response = array (
+ 'err_code' => $err_code,
+ 'err_msg' => $err_msg,
+ 'options' => $options
+ );
+
+ // clear output buffer to suppress warning and notices
+ while ( ob_get_clean () )
+ ;
+
+ echo json_encode ( $response );
+ JFactory::getApplication ()->close ();
+ }
+}
\ No newline at end of file
diff --git a/deployed/smartcountdown3/components/com_smartcountdown3/controllers/index.html b/deployed/smartcountdown3/components/com_smartcountdown3/controllers/index.html
new file mode 100644
index 00000000..2efb97f3
--- /dev/null
+++ b/deployed/smartcountdown3/components/com_smartcountdown3/controllers/index.html
@@ -0,0 +1 @@
+
diff --git a/deployed/smartcountdown3/components/com_smartcountdown3/index.html b/deployed/smartcountdown3/components/com_smartcountdown3/index.html
new file mode 100644
index 00000000..2efb97f3
--- /dev/null
+++ b/deployed/smartcountdown3/components/com_smartcountdown3/index.html
@@ -0,0 +1 @@
+
diff --git a/deployed/smartcountdown3/components/com_smartcountdown3/smartcountdown3.php b/deployed/smartcountdown3/components/com_smartcountdown3/smartcountdown3.php
new file mode 100644
index 00000000..f58cd9ff
--- /dev/null
+++ b/deployed/smartcountdown3/components/com_smartcountdown3/smartcountdown3.php
@@ -0,0 +1,15 @@
+execute('getevent' /*JFactory::getApplication()->input->get('task')*/);
+// we have only 1 controller for AJAX, the line below will never be hit
+//$controller->redirect();
diff --git a/deployed/smartcountdown3/modules/mod_smartcountdown3/css/collapse-style.css b/deployed/smartcountdown3/modules/mod_smartcountdown3/css/collapse-style.css
new file mode 100644
index 00000000..01f626e5
--- /dev/null
+++ b/deployed/smartcountdown3/modules/mod_smartcountdown3/css/collapse-style.css
@@ -0,0 +1,56 @@
+.collapseomatic {
+ background-image: url(images/arrow-down.png);
+ background-repeat: no-repeat;
+ padding: 0 0 10px 16px;
+ cursor: pointer;
+}
+.arrowright {
+ background-position: top right;
+ padding: 0 16px 10px 0;
+}
+.colomat-hover {
+ text-decoration: underline;
+}
+.colomat-close {
+ background-image: url(images/arrow-up.png);
+}
+.collapseomatic_excerpt, .collapseomatic_content {
+ margin-top: 0px;
+ margin-left: 16px;
+ padding: 0px;
+}
+.collapseall, .expandall {
+ cursor: pointer;
+}
+.collapseall:hover, .expandall:hover {
+ text-decoration: underline;
+}
+
+/* css for timepicker */
+.ui-timepicker-div .ui-widget-header { margin-bottom: 8px; }
+.ui-timepicker-div dl { text-align: left; }
+.ui-timepicker-div dl dt { float: left; clear:left; padding: 0 0 0 5px; }
+.ui-timepicker-div dl dd { margin: 0 10px 10px 40%; }
+.ui-timepicker-div td { font-size: 90%; }
+.ui-tpicker-grid-label { background: none; border: none; margin: 0; padding: 0; }
+.ui-timepicker-div .ui_tpicker_unit_hide{ display: none; }
+
+.ui-timepicker-rtl{ direction: rtl; }
+.ui-timepicker-rtl dl { text-align: right; padding: 0 5px 0 0; }
+.ui-timepicker-rtl dl dt{ float: right; clear: right; }
+.ui-timepicker-rtl dl dd { margin: 0 40% 10px 10px; }
+
+/* Shortened version style */
+.ui-timepicker-div.ui-timepicker-oneLine { padding-right: 2px; }
+.ui-timepicker-div.ui-timepicker-oneLine .ui_tpicker_time,
+.ui-timepicker-div.ui-timepicker-oneLine dt { display: none; }
+.ui-timepicker-div.ui-timepicker-oneLine .ui_tpicker_time_label { display: block; padding-top: 2px; }
+.ui-timepicker-div.ui-timepicker-oneLine dl { text-align: right; }
+.ui-timepicker-div.ui-timepicker-oneLine dl dd,
+.ui-timepicker-div.ui-timepicker-oneLine dl dd > div { display:inline-block; margin:0; }
+.ui-timepicker-div.ui-timepicker-oneLine dl dd.ui_tpicker_minute:before,
+.ui-timepicker-div.ui-timepicker-oneLine dl dd.ui_tpicker_second:before { content:':'; display:inline-block; }
+.ui-timepicker-div.ui-timepicker-oneLine dl dd.ui_tpicker_millisec:before,
+.ui-timepicker-div.ui-timepicker-oneLine dl dd.ui_tpicker_microsec:before { content:'.'; display:inline-block; }
+.ui-timepicker-div.ui-timepicker-oneLine .ui_tpicker_unit_hide,
+.ui-timepicker-div.ui-timepicker-oneLine .ui_tpicker_unit_hide:before{ display: none; }
diff --git a/deployed/smartcountdown3/modules/mod_smartcountdown3/css/index.html b/deployed/smartcountdown3/modules/mod_smartcountdown3/css/index.html
new file mode 100644
index 00000000..2efb97f3
--- /dev/null
+++ b/deployed/smartcountdown3/modules/mod_smartcountdown3/css/index.html
@@ -0,0 +1 @@
+
diff --git a/deployed/smartcountdown3/modules/mod_smartcountdown3/css/jquery-ui.css b/deployed/smartcountdown3/modules/mod_smartcountdown3/css/jquery-ui.css
new file mode 100644
index 00000000..95ce5f5b
--- /dev/null
+++ b/deployed/smartcountdown3/modules/mod_smartcountdown3/css/jquery-ui.css
@@ -0,0 +1,1225 @@
+/*! jQuery UI - v1.11.1 - 2014-08-13
+* http://jqueryui.com
+* Includes: core.css, accordion.css, autocomplete.css, button.css, datepicker.css, dialog.css, draggable.css, menu.css, progressbar.css, resizable.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css
+* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana%2CArial%2Csans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=highlight_soft&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=flat&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=glass&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=glass&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=glass&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=glass&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px
+* Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */
+
+/* Layout helpers
+----------------------------------*/
+.ui-helper-hidden {
+ display: none;
+}
+.ui-helper-hidden-accessible {
+ border: 0;
+ clip: rect(0 0 0 0);
+ height: 1px;
+ margin: -1px;
+ overflow: hidden;
+ padding: 0;
+ position: absolute;
+ width: 1px;
+}
+.ui-helper-reset {
+ margin: 0;
+ padding: 0;
+ border: 0;
+ outline: 0;
+ line-height: 1.3;
+ text-decoration: none;
+ font-size: 100%;
+ list-style: none;
+}
+.ui-helper-clearfix:before,
+.ui-helper-clearfix:after {
+ content: "";
+ display: table;
+ border-collapse: collapse;
+}
+.ui-helper-clearfix:after {
+ clear: both;
+}
+.ui-helper-clearfix {
+ min-height: 0; /* support: IE7 */
+}
+.ui-helper-zfix {
+ width: 100%;
+ height: 100%;
+ top: 0;
+ left: 0;
+ position: absolute;
+ opacity: 0;
+ filter:Alpha(Opacity=0); /* support: IE8 */
+}
+
+.ui-front {
+ z-index: 100;
+}
+
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-disabled {
+ cursor: default !important;
+}
+
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon {
+ display: block;
+ text-indent: -99999px;
+ overflow: hidden;
+ background-repeat: no-repeat;
+}
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Overlays */
+.ui-widget-overlay {
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+}
+.ui-accordion .ui-accordion-header {
+ display: block;
+ cursor: pointer;
+ position: relative;
+ margin: 2px 0 0 0;
+ padding: .5em .5em .5em .7em;
+ min-height: 0; /* support: IE7 */
+ font-size: 100%;
+}
+.ui-accordion .ui-accordion-icons {
+ padding-left: 2.2em;
+}
+.ui-accordion .ui-accordion-icons .ui-accordion-icons {
+ padding-left: 2.2em;
+}
+.ui-accordion .ui-accordion-header .ui-accordion-header-icon {
+ position: absolute;
+ left: .5em;
+ top: 50%;
+ margin-top: -8px;
+}
+.ui-accordion .ui-accordion-content {
+ padding: 1em 2.2em;
+ border-top: 0;
+ overflow: auto;
+}
+.ui-autocomplete {
+ position: absolute;
+ top: 0;
+ left: 0;
+ cursor: default;
+}
+.ui-button {
+ display: inline-block;
+ position: relative;
+ padding: 0;
+ line-height: normal;
+ margin-right: .1em;
+ cursor: pointer;
+ vertical-align: middle;
+ text-align: center;
+ overflow: visible; /* removes extra width in IE */
+}
+.ui-button,
+.ui-button:link,
+.ui-button:visited,
+.ui-button:hover,
+.ui-button:active {
+ text-decoration: none;
+}
+/* to make room for the icon, a width needs to be set here */
+.ui-button-icon-only {
+ width: 2.2em;
+}
+/* button elements seem to need a little more width */
+button.ui-button-icon-only {
+ width: 2.4em;
+}
+.ui-button-icons-only {
+ width: 3.4em;
+}
+button.ui-button-icons-only {
+ width: 3.7em;
+}
+
+/* button text element */
+.ui-button .ui-button-text {
+ display: block;
+ line-height: normal;
+}
+.ui-button-text-only .ui-button-text {
+ padding: .4em 1em;
+}
+.ui-button-icon-only .ui-button-text,
+.ui-button-icons-only .ui-button-text {
+ padding: .4em;
+ text-indent: -9999999px;
+}
+.ui-button-text-icon-primary .ui-button-text,
+.ui-button-text-icons .ui-button-text {
+ padding: .4em 1em .4em 2.1em;
+}
+.ui-button-text-icon-secondary .ui-button-text,
+.ui-button-text-icons .ui-button-text {
+ padding: .4em 2.1em .4em 1em;
+}
+.ui-button-text-icons .ui-button-text {
+ padding-left: 2.1em;
+ padding-right: 2.1em;
+}
+/* no icon support for input elements, provide padding by default */
+input.ui-button {
+ padding: .4em 1em;
+}
+
+/* button icon element(s) */
+.ui-button-icon-only .ui-icon,
+.ui-button-text-icon-primary .ui-icon,
+.ui-button-text-icon-secondary .ui-icon,
+.ui-button-text-icons .ui-icon,
+.ui-button-icons-only .ui-icon {
+ position: absolute;
+ top: 50%;
+ margin-top: -8px;
+}
+.ui-button-icon-only .ui-icon {
+ left: 50%;
+ margin-left: -8px;
+}
+.ui-button-text-icon-primary .ui-button-icon-primary,
+.ui-button-text-icons .ui-button-icon-primary,
+.ui-button-icons-only .ui-button-icon-primary {
+ left: .5em;
+}
+.ui-button-text-icon-secondary .ui-button-icon-secondary,
+.ui-button-text-icons .ui-button-icon-secondary,
+.ui-button-icons-only .ui-button-icon-secondary {
+ right: .5em;
+}
+
+/* button sets */
+.ui-buttonset {
+ margin-right: 7px;
+}
+.ui-buttonset .ui-button {
+ margin-left: 0;
+ margin-right: -.3em;
+}
+
+/* workarounds */
+/* reset extra padding in Firefox, see h5bp.com/l */
+input.ui-button::-moz-focus-inner,
+button.ui-button::-moz-focus-inner {
+ border: 0;
+ padding: 0;
+}
+.ui-datepicker {
+ width: 17em;
+ padding: .2em .2em 0;
+ display: none;
+}
+.ui-datepicker .ui-datepicker-header {
+ position: relative;
+ padding: .2em 0;
+}
+.ui-datepicker .ui-datepicker-prev,
+.ui-datepicker .ui-datepicker-next {
+ position: absolute;
+ top: 2px;
+ width: 1.8em;
+ height: 1.8em;
+}
+.ui-datepicker .ui-datepicker-prev-hover,
+.ui-datepicker .ui-datepicker-next-hover {
+ top: 1px;
+}
+.ui-datepicker .ui-datepicker-prev {
+ left: 2px;
+}
+.ui-datepicker .ui-datepicker-next {
+ right: 2px;
+}
+.ui-datepicker .ui-datepicker-prev-hover {
+ left: 1px;
+}
+.ui-datepicker .ui-datepicker-next-hover {
+ right: 1px;
+}
+.ui-datepicker .ui-datepicker-prev span,
+.ui-datepicker .ui-datepicker-next span {
+ display: block;
+ position: absolute;
+ left: 50%;
+ margin-left: -8px;
+ top: 50%;
+ margin-top: -8px;
+}
+.ui-datepicker .ui-datepicker-title {
+ margin: 0 2.3em;
+ line-height: 1.8em;
+ text-align: center;
+}
+.ui-datepicker .ui-datepicker-title select {
+ font-size: 1em;
+ margin: 1px 0;
+}
+.ui-datepicker select.ui-datepicker-month,
+.ui-datepicker select.ui-datepicker-year {
+ width: 45%;
+}
+.ui-datepicker table {
+ width: 100%;
+ font-size: .9em;
+ border-collapse: collapse;
+ margin: 0 0 .4em;
+}
+.ui-datepicker th {
+ padding: .7em .3em;
+ text-align: center;
+ font-weight: bold;
+ border: 0;
+}
+.ui-datepicker td {
+ border: 0;
+ padding: 1px;
+}
+.ui-datepicker td span,
+.ui-datepicker td a {
+ display: block;
+ padding: .2em;
+ text-align: right;
+ text-decoration: none;
+}
+.ui-datepicker .ui-datepicker-buttonpane {
+ background-image: none;
+ margin: .7em 0 0 0;
+ padding: 0 .2em;
+ border-left: 0;
+ border-right: 0;
+ border-bottom: 0;
+}
+.ui-datepicker .ui-datepicker-buttonpane button {
+ float: right;
+ margin: .5em .2em .4em;
+ cursor: pointer;
+ padding: .2em .6em .3em .6em;
+ width: auto;
+ overflow: visible;
+}
+.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {
+ float: left;
+}
+
+/* with multiple calendars */
+.ui-datepicker.ui-datepicker-multi {
+ width: auto;
+}
+.ui-datepicker-multi .ui-datepicker-group {
+ float: left;
+}
+.ui-datepicker-multi .ui-datepicker-group table {
+ width: 95%;
+ margin: 0 auto .4em;
+}
+.ui-datepicker-multi-2 .ui-datepicker-group {
+ width: 50%;
+}
+.ui-datepicker-multi-3 .ui-datepicker-group {
+ width: 33.3%;
+}
+.ui-datepicker-multi-4 .ui-datepicker-group {
+ width: 25%;
+}
+.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,
+.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {
+ border-left-width: 0;
+}
+.ui-datepicker-multi .ui-datepicker-buttonpane {
+ clear: left;
+}
+.ui-datepicker-row-break {
+ clear: both;
+ width: 100%;
+ font-size: 0;
+}
+
+/* RTL support */
+.ui-datepicker-rtl {
+ direction: rtl;
+}
+.ui-datepicker-rtl .ui-datepicker-prev {
+ right: 2px;
+ left: auto;
+}
+.ui-datepicker-rtl .ui-datepicker-next {
+ left: 2px;
+ right: auto;
+}
+.ui-datepicker-rtl .ui-datepicker-prev:hover {
+ right: 1px;
+ left: auto;
+}
+.ui-datepicker-rtl .ui-datepicker-next:hover {
+ left: 1px;
+ right: auto;
+}
+.ui-datepicker-rtl .ui-datepicker-buttonpane {
+ clear: right;
+}
+.ui-datepicker-rtl .ui-datepicker-buttonpane button {
+ float: left;
+}
+.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,
+.ui-datepicker-rtl .ui-datepicker-group {
+ float: right;
+}
+.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,
+.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {
+ border-right-width: 0;
+ border-left-width: 1px;
+}
+.ui-dialog {
+ overflow: hidden;
+ position: absolute;
+ top: 0;
+ left: 0;
+ padding: .2em;
+ outline: 0;
+}
+.ui-dialog .ui-dialog-titlebar {
+ padding: .4em 1em;
+ position: relative;
+}
+.ui-dialog .ui-dialog-title {
+ float: left;
+ margin: .1em 0;
+ white-space: nowrap;
+ width: 90%;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+.ui-dialog .ui-dialog-titlebar-close {
+ position: absolute;
+ right: .3em;
+ top: 50%;
+ width: 20px;
+ margin: -10px 0 0 0;
+ padding: 1px;
+ height: 20px;
+}
+.ui-dialog .ui-dialog-content {
+ position: relative;
+ border: 0;
+ padding: .5em 1em;
+ background: none;
+ overflow: auto;
+}
+.ui-dialog .ui-dialog-buttonpane {
+ text-align: left;
+ border-width: 1px 0 0 0;
+ background-image: none;
+ margin-top: .5em;
+ padding: .3em 1em .5em .4em;
+}
+.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
+ float: right;
+}
+.ui-dialog .ui-dialog-buttonpane button {
+ margin: .5em .4em .5em 0;
+ cursor: pointer;
+}
+.ui-dialog .ui-resizable-se {
+ width: 12px;
+ height: 12px;
+ right: -5px;
+ bottom: -5px;
+ background-position: 16px 16px;
+}
+.ui-draggable .ui-dialog-titlebar {
+ cursor: move;
+}
+.ui-draggable-handle {
+ -ms-touch-action: none;
+ touch-action: none;
+}
+.ui-menu {
+ list-style: none;
+ padding: 0;
+ margin: 0;
+ display: block;
+ outline: none;
+}
+.ui-menu .ui-menu {
+ position: absolute;
+}
+.ui-menu .ui-menu-item {
+ position: relative;
+ margin: 0;
+ padding: 3px 1em 3px .4em;
+ cursor: pointer;
+ min-height: 0; /* support: IE7 */
+ /* support: IE10, see #8844 */
+ list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");
+}
+.ui-menu .ui-menu-divider {
+ margin: 5px 0;
+ height: 0;
+ font-size: 0;
+ line-height: 0;
+ border-width: 1px 0 0 0;
+}
+.ui-menu .ui-state-focus,
+.ui-menu .ui-state-active {
+ margin: -1px;
+}
+
+/* icon support */
+.ui-menu-icons {
+ position: relative;
+}
+.ui-menu-icons .ui-menu-item {
+ padding-left: 2em;
+}
+
+/* left-aligned */
+.ui-menu .ui-icon {
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ left: .2em;
+ margin: auto 0;
+}
+
+/* right-aligned */
+.ui-menu .ui-menu-icon {
+ left: auto;
+ right: 0;
+}
+.ui-progressbar {
+ height: 2em;
+ text-align: left;
+ overflow: hidden;
+}
+.ui-progressbar .ui-progressbar-value {
+ margin: -1px;
+ height: 100%;
+}
+.ui-progressbar .ui-progressbar-overlay {
+ background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");
+ height: 100%;
+ filter: alpha(opacity=25); /* support: IE8 */
+ opacity: 0.25;
+}
+.ui-progressbar-indeterminate .ui-progressbar-value {
+ background-image: none;
+}
+.ui-resizable {
+ position: relative;
+}
+.ui-resizable-handle {
+ position: absolute;
+ font-size: 0.1px;
+ display: block;
+ -ms-touch-action: none;
+ touch-action: none;
+}
+.ui-resizable-disabled .ui-resizable-handle,
+.ui-resizable-autohide .ui-resizable-handle {
+ display: none;
+}
+.ui-resizable-n {
+ cursor: n-resize;
+ height: 7px;
+ width: 100%;
+ top: -5px;
+ left: 0;
+}
+.ui-resizable-s {
+ cursor: s-resize;
+ height: 7px;
+ width: 100%;
+ bottom: -5px;
+ left: 0;
+}
+.ui-resizable-e {
+ cursor: e-resize;
+ width: 7px;
+ right: -5px;
+ top: 0;
+ height: 100%;
+}
+.ui-resizable-w {
+ cursor: w-resize;
+ width: 7px;
+ left: -5px;
+ top: 0;
+ height: 100%;
+}
+.ui-resizable-se {
+ cursor: se-resize;
+ width: 12px;
+ height: 12px;
+ right: 1px;
+ bottom: 1px;
+}
+.ui-resizable-sw {
+ cursor: sw-resize;
+ width: 9px;
+ height: 9px;
+ left: -5px;
+ bottom: -5px;
+}
+.ui-resizable-nw {
+ cursor: nw-resize;
+ width: 9px;
+ height: 9px;
+ left: -5px;
+ top: -5px;
+}
+.ui-resizable-ne {
+ cursor: ne-resize;
+ width: 9px;
+ height: 9px;
+ right: -5px;
+ top: -5px;
+}
+.ui-selectable {
+ -ms-touch-action: none;
+ touch-action: none;
+}
+.ui-selectable-helper {
+ position: absolute;
+ z-index: 100;
+ border: 1px dotted black;
+}
+.ui-selectmenu-menu {
+ padding: 0;
+ margin: 0;
+ position: absolute;
+ top: 0;
+ left: 0;
+ display: none;
+}
+.ui-selectmenu-menu .ui-menu {
+ overflow: auto;
+ /* Support: IE7 */
+ overflow-x: hidden;
+ padding-bottom: 1px;
+}
+.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup {
+ font-size: 1em;
+ font-weight: bold;
+ line-height: 1.5;
+ padding: 2px 0.4em;
+ margin: 0.5em 0 0 0;
+ height: auto;
+ border: 0;
+}
+.ui-selectmenu-open {
+ display: block;
+}
+.ui-selectmenu-button {
+ display: inline-block;
+ overflow: hidden;
+ position: relative;
+ text-decoration: none;
+ cursor: pointer;
+}
+.ui-selectmenu-button span.ui-icon {
+ right: 0.5em;
+ left: auto;
+ margin-top: -8px;
+ position: absolute;
+ top: 50%;
+}
+.ui-selectmenu-button span.ui-selectmenu-text {
+ text-align: left;
+ padding: 0.4em 2.1em 0.4em 1em;
+ display: block;
+ line-height: 1.4;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+.ui-slider {
+ position: relative;
+ text-align: left;
+}
+.ui-slider .ui-slider-handle {
+ position: absolute;
+ z-index: 2;
+ width: 1.2em;
+ height: 1.2em;
+ cursor: default;
+ -ms-touch-action: none;
+ touch-action: none;
+}
+.ui-slider .ui-slider-range {
+ position: absolute;
+ z-index: 1;
+ font-size: .7em;
+ display: block;
+ border: 0;
+ background-position: 0 0;
+}
+
+/* support: IE8 - See #6727 */
+.ui-slider.ui-state-disabled .ui-slider-handle,
+.ui-slider.ui-state-disabled .ui-slider-range {
+ filter: inherit;
+}
+
+.ui-slider-horizontal {
+ height: .8em;
+}
+.ui-slider-horizontal .ui-slider-handle {
+ top: -.3em;
+ margin-left: -.6em;
+}
+.ui-slider-horizontal .ui-slider-range {
+ top: 0;
+ height: 100%;
+}
+.ui-slider-horizontal .ui-slider-range-min {
+ left: 0;
+}
+.ui-slider-horizontal .ui-slider-range-max {
+ right: 0;
+}
+
+.ui-slider-vertical {
+ width: .8em;
+ height: 100px;
+}
+.ui-slider-vertical .ui-slider-handle {
+ left: -.3em;
+ margin-left: 0;
+ margin-bottom: -.6em;
+}
+.ui-slider-vertical .ui-slider-range {
+ left: 0;
+ width: 100%;
+}
+.ui-slider-vertical .ui-slider-range-min {
+ bottom: 0;
+}
+.ui-slider-vertical .ui-slider-range-max {
+ top: 0;
+}
+.ui-sortable-handle {
+ -ms-touch-action: none;
+ touch-action: none;
+}
+.ui-spinner {
+ position: relative;
+ display: inline-block;
+ overflow: hidden;
+ padding: 0;
+ vertical-align: middle;
+}
+.ui-spinner-input {
+ border: none;
+ background: none;
+ color: inherit;
+ padding: 0;
+ margin: .2em 0;
+ vertical-align: middle;
+ margin-left: .4em;
+ margin-right: 22px;
+}
+.ui-spinner-button {
+ width: 16px;
+ height: 50%;
+ font-size: .5em;
+ padding: 0;
+ margin: 0;
+ text-align: center;
+ position: absolute;
+ cursor: default;
+ display: block;
+ overflow: hidden;
+ right: 0;
+}
+/* more specificity required here to override default borders */
+.ui-spinner a.ui-spinner-button {
+ border-top: none;
+ border-bottom: none;
+ border-right: none;
+}
+/* vertically center icon */
+.ui-spinner .ui-icon {
+ position: absolute;
+ margin-top: -8px;
+ top: 50%;
+ left: 0;
+}
+.ui-spinner-up {
+ top: 0;
+}
+.ui-spinner-down {
+ bottom: 0;
+}
+
+/* TR overrides */
+.ui-spinner .ui-icon-triangle-1-s {
+ /* need to fix icons sprite */
+ background-position: -65px -16px;
+}
+.ui-tabs {
+ position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
+ padding: .2em;
+}
+.ui-tabs .ui-tabs-nav {
+ margin: 0;
+ padding: .2em .2em 0;
+}
+.ui-tabs .ui-tabs-nav li {
+ list-style: none;
+ float: left;
+ position: relative;
+ top: 0;
+ margin: 1px .2em 0 0;
+ border-bottom-width: 0;
+ padding: 0;
+ white-space: nowrap;
+}
+.ui-tabs .ui-tabs-nav .ui-tabs-anchor {
+ float: left;
+ padding: .5em 1em;
+ text-decoration: none;
+}
+.ui-tabs .ui-tabs-nav li.ui-tabs-active {
+ margin-bottom: -1px;
+ padding-bottom: 1px;
+}
+.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,
+.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,
+.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor {
+ cursor: text;
+}
+.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor {
+ cursor: pointer;
+}
+.ui-tabs .ui-tabs-panel {
+ display: block;
+ border-width: 0;
+ padding: 1em 1.4em;
+ background: none;
+}
+.ui-tooltip {
+ padding: 8px;
+ position: absolute;
+ z-index: 9999;
+ max-width: 300px;
+ -webkit-box-shadow: 0 0 5px #aaa;
+ box-shadow: 0 0 5px #aaa;
+}
+body .ui-tooltip {
+ border-width: 2px;
+}
+
+/* Component containers
+----------------------------------*/
+.ui-widget {
+ font-family: Verdana,Arial,sans-serif;
+ font-size: 1.1em;
+}
+.ui-widget .ui-widget {
+ font-size: 1em;
+}
+.ui-widget input,
+.ui-widget select,
+.ui-widget textarea,
+.ui-widget button {
+ font-family: Verdana,Arial,sans-serif;
+ font-size: 1em;
+}
+.ui-widget-content {
+ border: 1px solid #aaaaaa;
+ background: #ffffff url("images/ui-bg_flat_75_ffffff_40x100.png") 50% 50% repeat-x;
+ color: #222222;
+}
+.ui-widget-content a {
+ color: #222222;
+}
+.ui-widget-header {
+ border: 1px solid #aaaaaa;
+ background: #cccccc url("images/ui-bg_highlight-soft_75_cccccc_1x100.png") 50% 50% repeat-x;
+ color: #222222;
+ font-weight: bold;
+}
+.ui-widget-header a {
+ color: #222222;
+}
+
+/* Interaction states
+----------------------------------*/
+.ui-state-default,
+.ui-widget-content .ui-state-default,
+.ui-widget-header .ui-state-default {
+ border: 1px solid #d3d3d3;
+ background: #e6e6e6 url("images/ui-bg_glass_75_e6e6e6_1x400.png") 50% 50% repeat-x;
+ font-weight: normal;
+ color: #555555;
+}
+.ui-state-default a,
+.ui-state-default a:link,
+.ui-state-default a:visited {
+ color: #555555;
+ text-decoration: none;
+}
+.ui-state-hover,
+.ui-widget-content .ui-state-hover,
+.ui-widget-header .ui-state-hover,
+.ui-state-focus,
+.ui-widget-content .ui-state-focus,
+.ui-widget-header .ui-state-focus {
+ border: 1px solid #999999;
+ background: #dadada url("images/ui-bg_glass_75_dadada_1x400.png") 50% 50% repeat-x;
+ font-weight: normal;
+ color: #212121;
+}
+.ui-state-hover a,
+.ui-state-hover a:hover,
+.ui-state-hover a:link,
+.ui-state-hover a:visited,
+.ui-state-focus a,
+.ui-state-focus a:hover,
+.ui-state-focus a:link,
+.ui-state-focus a:visited {
+ color: #212121;
+ text-decoration: none;
+}
+.ui-state-active,
+.ui-widget-content .ui-state-active,
+.ui-widget-header .ui-state-active {
+ border: 1px solid #aaaaaa;
+ background: #ffffff url("images/ui-bg_glass_65_ffffff_1x400.png") 50% 50% repeat-x;
+ font-weight: normal;
+ color: #212121;
+}
+.ui-state-active a,
+.ui-state-active a:link,
+.ui-state-active a:visited {
+ color: #212121;
+ text-decoration: none;
+}
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-highlight,
+.ui-widget-content .ui-state-highlight,
+.ui-widget-header .ui-state-highlight {
+ border: 1px solid #fcefa1;
+ background: #fbf9ee url("images/ui-bg_glass_55_fbf9ee_1x400.png") 50% 50% repeat-x;
+ color: #363636;
+}
+.ui-state-highlight a,
+.ui-widget-content .ui-state-highlight a,
+.ui-widget-header .ui-state-highlight a {
+ color: #363636;
+}
+.ui-state-error,
+.ui-widget-content .ui-state-error,
+.ui-widget-header .ui-state-error {
+ border: 1px solid #cd0a0a;
+ background: #fef1ec url("images/ui-bg_glass_95_fef1ec_1x400.png") 50% 50% repeat-x;
+ color: #cd0a0a;
+}
+.ui-state-error a,
+.ui-widget-content .ui-state-error a,
+.ui-widget-header .ui-state-error a {
+ color: #cd0a0a;
+}
+.ui-state-error-text,
+.ui-widget-content .ui-state-error-text,
+.ui-widget-header .ui-state-error-text {
+ color: #cd0a0a;
+}
+.ui-priority-primary,
+.ui-widget-content .ui-priority-primary,
+.ui-widget-header .ui-priority-primary {
+ font-weight: bold;
+}
+.ui-priority-secondary,
+.ui-widget-content .ui-priority-secondary,
+.ui-widget-header .ui-priority-secondary {
+ opacity: .7;
+ filter:Alpha(Opacity=70); /* support: IE8 */
+ font-weight: normal;
+}
+.ui-state-disabled,
+.ui-widget-content .ui-state-disabled,
+.ui-widget-header .ui-state-disabled {
+ opacity: .35;
+ filter:Alpha(Opacity=35); /* support: IE8 */
+ background-image: none;
+}
+.ui-state-disabled .ui-icon {
+ filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
+}
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon {
+ width: 16px;
+ height: 16px;
+}
+.ui-icon,
+.ui-widget-content .ui-icon {
+ background-image: url("images/ui-icons_222222_256x240.png");
+}
+.ui-widget-header .ui-icon {
+ background-image: url("images/ui-icons_222222_256x240.png");
+}
+.ui-state-default .ui-icon {
+ background-image: url("images/ui-icons_888888_256x240.png");
+}
+.ui-state-hover .ui-icon,
+.ui-state-focus .ui-icon {
+ background-image: url("images/ui-icons_454545_256x240.png");
+}
+.ui-state-active .ui-icon {
+ background-image: url("images/ui-icons_454545_256x240.png");
+}
+.ui-state-highlight .ui-icon {
+ background-image: url("images/ui-icons_2e83ff_256x240.png");
+}
+.ui-state-error .ui-icon,
+.ui-state-error-text .ui-icon {
+ background-image: url("images/ui-icons_cd0a0a_256x240.png");
+}
+
+/* positioning */
+.ui-icon-blank { background-position: 16px 16px; }
+.ui-icon-carat-1-n { background-position: 0 0; }
+.ui-icon-carat-1-ne { background-position: -16px 0; }
+.ui-icon-carat-1-e { background-position: -32px 0; }
+.ui-icon-carat-1-se { background-position: -48px 0; }
+.ui-icon-carat-1-s { background-position: -64px 0; }
+.ui-icon-carat-1-sw { background-position: -80px 0; }
+.ui-icon-carat-1-w { background-position: -96px 0; }
+.ui-icon-carat-1-nw { background-position: -112px 0; }
+.ui-icon-carat-2-n-s { background-position: -128px 0; }
+.ui-icon-carat-2-e-w { background-position: -144px 0; }
+.ui-icon-triangle-1-n { background-position: 0 -16px; }
+.ui-icon-triangle-1-ne { background-position: -16px -16px; }
+.ui-icon-triangle-1-e { background-position: -32px -16px; }
+.ui-icon-triangle-1-se { background-position: -48px -16px; }
+.ui-icon-triangle-1-s { background-position: -64px -16px; }
+.ui-icon-triangle-1-sw { background-position: -80px -16px; }
+.ui-icon-triangle-1-w { background-position: -96px -16px; }
+.ui-icon-triangle-1-nw { background-position: -112px -16px; }
+.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
+.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
+.ui-icon-arrow-1-n { background-position: 0 -32px; }
+.ui-icon-arrow-1-ne { background-position: -16px -32px; }
+.ui-icon-arrow-1-e { background-position: -32px -32px; }
+.ui-icon-arrow-1-se { background-position: -48px -32px; }
+.ui-icon-arrow-1-s { background-position: -64px -32px; }
+.ui-icon-arrow-1-sw { background-position: -80px -32px; }
+.ui-icon-arrow-1-w { background-position: -96px -32px; }
+.ui-icon-arrow-1-nw { background-position: -112px -32px; }
+.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
+.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
+.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
+.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
+.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
+.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
+.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
+.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
+.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
+.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
+.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
+.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
+.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
+.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
+.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
+.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
+.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
+.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
+.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
+.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
+.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
+.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
+.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
+.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
+.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
+.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
+.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
+.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
+.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
+.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
+.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
+.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
+.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
+.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
+.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
+.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
+.ui-icon-arrow-4 { background-position: 0 -80px; }
+.ui-icon-arrow-4-diag { background-position: -16px -80px; }
+.ui-icon-extlink { background-position: -32px -80px; }
+.ui-icon-newwin { background-position: -48px -80px; }
+.ui-icon-refresh { background-position: -64px -80px; }
+.ui-icon-shuffle { background-position: -80px -80px; }
+.ui-icon-transfer-e-w { background-position: -96px -80px; }
+.ui-icon-transferthick-e-w { background-position: -112px -80px; }
+.ui-icon-folder-collapsed { background-position: 0 -96px; }
+.ui-icon-folder-open { background-position: -16px -96px; }
+.ui-icon-document { background-position: -32px -96px; }
+.ui-icon-document-b { background-position: -48px -96px; }
+.ui-icon-note { background-position: -64px -96px; }
+.ui-icon-mail-closed { background-position: -80px -96px; }
+.ui-icon-mail-open { background-position: -96px -96px; }
+.ui-icon-suitcase { background-position: -112px -96px; }
+.ui-icon-comment { background-position: -128px -96px; }
+.ui-icon-person { background-position: -144px -96px; }
+.ui-icon-print { background-position: -160px -96px; }
+.ui-icon-trash { background-position: -176px -96px; }
+.ui-icon-locked { background-position: -192px -96px; }
+.ui-icon-unlocked { background-position: -208px -96px; }
+.ui-icon-bookmark { background-position: -224px -96px; }
+.ui-icon-tag { background-position: -240px -96px; }
+.ui-icon-home { background-position: 0 -112px; }
+.ui-icon-flag { background-position: -16px -112px; }
+.ui-icon-calendar { background-position: -32px -112px; }
+.ui-icon-cart { background-position: -48px -112px; }
+.ui-icon-pencil { background-position: -64px -112px; }
+.ui-icon-clock { background-position: -80px -112px; }
+.ui-icon-disk { background-position: -96px -112px; }
+.ui-icon-calculator { background-position: -112px -112px; }
+.ui-icon-zoomin { background-position: -128px -112px; }
+.ui-icon-zoomout { background-position: -144px -112px; }
+.ui-icon-search { background-position: -160px -112px; }
+.ui-icon-wrench { background-position: -176px -112px; }
+.ui-icon-gear { background-position: -192px -112px; }
+.ui-icon-heart { background-position: -208px -112px; }
+.ui-icon-star { background-position: -224px -112px; }
+.ui-icon-link { background-position: -240px -112px; }
+.ui-icon-cancel { background-position: 0 -128px; }
+.ui-icon-plus { background-position: -16px -128px; }
+.ui-icon-plusthick { background-position: -32px -128px; }
+.ui-icon-minus { background-position: -48px -128px; }
+.ui-icon-minusthick { background-position: -64px -128px; }
+.ui-icon-close { background-position: -80px -128px; }
+.ui-icon-closethick { background-position: -96px -128px; }
+.ui-icon-key { background-position: -112px -128px; }
+.ui-icon-lightbulb { background-position: -128px -128px; }
+.ui-icon-scissors { background-position: -144px -128px; }
+.ui-icon-clipboard { background-position: -160px -128px; }
+.ui-icon-copy { background-position: -176px -128px; }
+.ui-icon-contact { background-position: -192px -128px; }
+.ui-icon-image { background-position: -208px -128px; }
+.ui-icon-video { background-position: -224px -128px; }
+.ui-icon-script { background-position: -240px -128px; }
+.ui-icon-alert { background-position: 0 -144px; }
+.ui-icon-info { background-position: -16px -144px; }
+.ui-icon-notice { background-position: -32px -144px; }
+.ui-icon-help { background-position: -48px -144px; }
+.ui-icon-check { background-position: -64px -144px; }
+.ui-icon-bullet { background-position: -80px -144px; }
+.ui-icon-radio-on { background-position: -96px -144px; }
+.ui-icon-radio-off { background-position: -112px -144px; }
+.ui-icon-pin-w { background-position: -128px -144px; }
+.ui-icon-pin-s { background-position: -144px -144px; }
+.ui-icon-play { background-position: 0 -160px; }
+.ui-icon-pause { background-position: -16px -160px; }
+.ui-icon-seek-next { background-position: -32px -160px; }
+.ui-icon-seek-prev { background-position: -48px -160px; }
+.ui-icon-seek-end { background-position: -64px -160px; }
+.ui-icon-seek-start { background-position: -80px -160px; }
+/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
+.ui-icon-seek-first { background-position: -80px -160px; }
+.ui-icon-stop { background-position: -96px -160px; }
+.ui-icon-eject { background-position: -112px -160px; }
+.ui-icon-volume-off { background-position: -128px -160px; }
+.ui-icon-volume-on { background-position: -144px -160px; }
+.ui-icon-power { background-position: 0 -176px; }
+.ui-icon-signal-diag { background-position: -16px -176px; }
+.ui-icon-signal { background-position: -32px -176px; }
+.ui-icon-battery-0 { background-position: -48px -176px; }
+.ui-icon-battery-1 { background-position: -64px -176px; }
+.ui-icon-battery-2 { background-position: -80px -176px; }
+.ui-icon-battery-3 { background-position: -96px -176px; }
+.ui-icon-circle-plus { background-position: 0 -192px; }
+.ui-icon-circle-minus { background-position: -16px -192px; }
+.ui-icon-circle-close { background-position: -32px -192px; }
+.ui-icon-circle-triangle-e { background-position: -48px -192px; }
+.ui-icon-circle-triangle-s { background-position: -64px -192px; }
+.ui-icon-circle-triangle-w { background-position: -80px -192px; }
+.ui-icon-circle-triangle-n { background-position: -96px -192px; }
+.ui-icon-circle-arrow-e { background-position: -112px -192px; }
+.ui-icon-circle-arrow-s { background-position: -128px -192px; }
+.ui-icon-circle-arrow-w { background-position: -144px -192px; }
+.ui-icon-circle-arrow-n { background-position: -160px -192px; }
+.ui-icon-circle-zoomin { background-position: -176px -192px; }
+.ui-icon-circle-zoomout { background-position: -192px -192px; }
+.ui-icon-circle-check { background-position: -208px -192px; }
+.ui-icon-circlesmall-plus { background-position: 0 -208px; }
+.ui-icon-circlesmall-minus { background-position: -16px -208px; }
+.ui-icon-circlesmall-close { background-position: -32px -208px; }
+.ui-icon-squaresmall-plus { background-position: -48px -208px; }
+.ui-icon-squaresmall-minus { background-position: -64px -208px; }
+.ui-icon-squaresmall-close { background-position: -80px -208px; }
+.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
+.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
+.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
+.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
+.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
+.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Corner radius */
+.ui-corner-all,
+.ui-corner-top,
+.ui-corner-left,
+.ui-corner-tl {
+ border-top-left-radius: 4px;
+}
+.ui-corner-all,
+.ui-corner-top,
+.ui-corner-right,
+.ui-corner-tr {
+ border-top-right-radius: 4px;
+}
+.ui-corner-all,
+.ui-corner-bottom,
+.ui-corner-left,
+.ui-corner-bl {
+ border-bottom-left-radius: 4px;
+}
+.ui-corner-all,
+.ui-corner-bottom,
+.ui-corner-right,
+.ui-corner-br {
+ border-bottom-right-radius: 4px;
+}
+
+/* Overlays */
+.ui-widget-overlay {
+ background: #aaaaaa url("images/ui-bg_flat_0_aaaaaa_40x100.png") 50% 50% repeat-x;
+ opacity: .3;
+ filter: Alpha(Opacity=30); /* support: IE8 */
+}
+.ui-widget-shadow {
+ margin: -8px 0 0 -8px;
+ padding: 8px;
+ background: #aaaaaa url("images/ui-bg_flat_0_aaaaaa_40x100.png") 50% 50% repeat-x;
+ opacity: .3;
+ filter: Alpha(Opacity=30); /* support: IE8 */
+ border-radius: 8px;
+}
\ No newline at end of file
diff --git a/deployed/smartcountdown3/modules/mod_smartcountdown3/css/smartcountdown.css b/deployed/smartcountdown3/modules/mod_smartcountdown3/css/smartcountdown.css
new file mode 100644
index 00000000..d25e5da0
--- /dev/null
+++ b/deployed/smartcountdown3/modules/mod_smartcountdown3/css/smartcountdown.css
@@ -0,0 +1,87 @@
+.smartcountdown {
+ font-size: 12px /* Important: has to be equal to SCD_BASE_FONT_SIZE */
+}
+.scd-all-wrapper {
+ width: 100%;
+ font-size: inherit;
+}
+/* some templates define line-height for elements, have to reset it for countdown */
+.scd-title-col, .scd-title-row, .scd-digits {
+ line-height: 1.2em;
+}
+.scd-title-col {
+ clear: both;
+ margin: 0.5em 0;
+}
+.scd-title-row {
+ float: left;
+ margin: 0 0.5em;
+}
+.scd-counter-col {
+ display: inline-block; /* required to center counter block, we have removed !important because it confilicted with hide_countup_counter $$$ check in other templates */
+ clear: both;
+}
+.scd-counter-row {
+ float: left;
+ margin: 0 0.5em;
+}
+.scd-unit-vert {
+ clear: both;
+ /*margin: 0.5em 0; moved to module options*/
+}
+.scd-unit-horz {
+ float: left;
+ /*margin: 0 1.0em; moved to module options*/
+}
+.scd-digits-col {
+ clear: both;
+ text-align: center;
+}
+.scd-digits-row {
+ float: left;
+ text-align: right;
+}
+.scd-label-col {
+ clear: both;
+ text-align: center;
+ margin: 0.3em 0;
+}
+.scd-label-row {
+ float: left;
+ text-align: left;
+ margin: 0 0.3em;
+}
+.scd-digit {
+ display: inline-block;
+ position: relative;
+ overflow: hidden; /* we should remove this rule when we update all affected animations profile: "sliding text" and "text rotation bounce" */
+}
+.scd-digit div, .scd-digit img {
+ position: absolute;
+ display: block;
+}
+.scd-digit img {
+ margin: 0!important;
+ padding: 0!important;
+ display: block!important;
+}
+.scd-digit div {
+ font-size: inherit;
+}
+
+.spinner {
+ /* background url added dynamically in helper script */
+ background-size: 16px 16px;
+ display: none;
+ /* float: right; */
+ opacity: .7;
+ filter: alpha(opacity=70);
+ width: 16px;
+ height: 16px;
+ margin: 5px 5px 0;
+}
+.spinner {
+ background:
+ url('../images/wpspin_light.gif')
+ no-repeat;
+}
diff --git a/deployed/smartcountdown3/modules/mod_smartcountdown3/css/smartcountdown_rtl.css b/deployed/smartcountdown3/modules/mod_smartcountdown3/css/smartcountdown_rtl.css
new file mode 100644
index 00000000..f168decc
--- /dev/null
+++ b/deployed/smartcountdown3/modules/mod_smartcountdown3/css/smartcountdown_rtl.css
@@ -0,0 +1,27 @@
+/*
+Overload some styles for RTL (see smartcountdown.css for common styles)
+*/
+/* Make sure that digits are not messed up in numbers */
+.scd-digits {
+ direction: ltr;
+}
+/* "Titles inline" layout fix */
+.scd-title-row {
+ float: right;
+}
+.scd-counter-row {
+ float: right;
+}
+/* Time units order fix */
+.scd-unit-horz {
+ float: right;
+}
+/* Labels position fix */
+.scd-digits-row {
+ float: right; /* digits are always LTR, so we always right-adjust them */
+}
+.scd-label-row {
+ float: right;
+ /*text-align: left;*/ /* table-like view */
+ text-align: right; /* more natural view */
+}
\ No newline at end of file
diff --git a/deployed/smartcountdown3/modules/mod_smartcountdown3/fields/configfile.php b/deployed/smartcountdown3/modules/mod_smartcountdown3/fields/configfile.php
new file mode 100644
index 00000000..2538aa06
--- /dev/null
+++ b/deployed/smartcountdown3/modules/mod_smartcountdown3/fields/configfile.php
@@ -0,0 +1,42 @@
+element['context'];
+ $dir = $context == 'layout' ? '/layouts' : '/fx';
+ $configs_dir = JPATH_SITE.'/modules/mod_smartcountdown3' . $dir;
+
+ $items = JFolder::files($configs_dir, '\.xml$', true, false);
+
+ // Build the field options.
+ if (!empty($items))
+ {
+ foreach ($items as $item)
+ {
+ $options[] = JHtml::_('select.option', $item, ucfirst(str_replace('_', ' ', substr($item, 0, -4))));
+ }
+ }
+
+ // Merge any additional options in the XML definition.
+ $options = array_merge(parent::getOptions(), $options);
+
+ return $options;
+ }
+}
diff --git a/deployed/smartcountdown3/modules/mod_smartcountdown3/fields/index.html b/deployed/smartcountdown3/modules/mod_smartcountdown3/fields/index.html
new file mode 100644
index 00000000..2efb97f3
--- /dev/null
+++ b/deployed/smartcountdown3/modules/mod_smartcountdown3/fields/index.html
@@ -0,0 +1 @@
+
diff --git a/deployed/smartcountdown3/modules/mod_smartcountdown3/fields/preview.php b/deployed/smartcountdown3/modules/mod_smartcountdown3/fields/preview.php
new file mode 100644
index 00000000..d02b2b79
--- /dev/null
+++ b/deployed/smartcountdown3/modules/mod_smartcountdown3/fields/preview.php
@@ -0,0 +1,29 @@
+form->getValue('id', 0);
+ if($id) {
+ ob_start();
+?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+ 0
+ 0 auto
+ center
+
+
+
+
+
+
+
+
+
+
+
+ 0
+ 0
+ 0 auto
+ center
+
+
+
+
+
+
+
+
+
diff --git a/deployed/smartcountdown3/modules/mod_smartcountdown3/fx/Sliding_images.xml b/deployed/smartcountdown3/modules/mod_smartcountdown3/fx/Sliding_images.xml
new file mode 100644
index 00000000..b6736282
--- /dev/null
+++ b/deployed/smartcountdown3/modules/mod_smartcountdown3/fx/Sliding_images.xml
@@ -0,0 +1,93 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 100%
+
+ 0
+ -30%
+
+
+ 30,100
+ -30, 0
+
+
+
+
+
+ 100%
+
+ 100%
+ 0
+
+
+ 100,30
+ 0,-30
+
+
+
+
+
+
+
+
+
+ 100%
+ 20%
+ -30%
+
+
+ -30,0
+ 30,100
+
+
+
+
+
+ 100%
+ 100%
+
+
+ 0,-30
+ 100,30
+
+
+
+
+
+
+
diff --git a/deployed/smartcountdown3/modules/mod_smartcountdown3/fx/Sliding_text.xml b/deployed/smartcountdown3/modules/mod_smartcountdown3/fx/Sliding_text.xml
new file mode 100644
index 00000000..e2267b0b
--- /dev/null
+++ b/deployed/smartcountdown3/modules/mod_smartcountdown3/fx/Sliding_text.xml
@@ -0,0 +1,94 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 100%
+ 100%
+ 0
+ 0
+ 0 auto
+ center
+
+
+ 100,0
+
+
+
+
+
+ 100%
+ 0
+ 0
+ 0
+ 0 auto
+ center
+
+
+ 0,-100
+
+
+
+
+
+
+
+
+
+ 100%
+ -100%
+ 0
+ 0
+ 0 auto
+ center
+
+
+ -100,0
+
+
+
+
+
+ 100%
+ 0
+ 0
+ 0
+ 0 auto
+ center
+
+
+ 0,100
+
+
+
+
+
+
+
diff --git a/deployed/smartcountdown3/modules/mod_smartcountdown3/fx/Text_opacity.xml b/deployed/smartcountdown3/modules/mod_smartcountdown3/fx/Text_opacity.xml
new file mode 100644
index 00000000..262ef4cf
--- /dev/null
+++ b/deployed/smartcountdown3/modules/mod_smartcountdown3/fx/Text_opacity.xml
@@ -0,0 +1,90 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+ 0
+ 0 auto
+ center
+
+
+ 1,0
+
+
+
+
+
+ 0
+ -10000px
+ 0
+ 0
+ 0 auto
+ center
+
+
+ 0,1
+ 0,0
+
+
+
+
+
+
+
+
+
+ 0
+ 0
+ 0 auto
+ center
+
+
+ 1,0
+
+
+
+
+
+ 0
+ -10000px
+ 0
+ 0
+ 0 auto
+ center
+
+
+ 0,1
+ 0,0
+
+
+
+
+
+
+
diff --git a/deployed/smartcountdown3/modules/mod_smartcountdown3/fx/index.html b/deployed/smartcountdown3/modules/mod_smartcountdown3/fx/index.html
new file mode 100644
index 00000000..2efb97f3
--- /dev/null
+++ b/deployed/smartcountdown3/modules/mod_smartcountdown3/fx/index.html
@@ -0,0 +1 @@
+
diff --git a/deployed/smartcountdown3/modules/mod_smartcountdown3/helpers/helper.php b/deployed/smartcountdown3/modules/mod_smartcountdown3/helpers/helper.php
new file mode 100644
index 00000000..3813d4e1
--- /dev/null
+++ b/deployed/smartcountdown3/modules/mod_smartcountdown3/helpers/helper.php
@@ -0,0 +1,658 @@
+ array (
+ 'row' => array (
+ array (
+ 'selector' => '.scd-label',
+ 'remove' => 'scd-label-col scd-label-row',
+ 'add' => 'scd-label-row'
+ ),
+ array (
+ 'selector' => '.scd-digits',
+ 'remove' => 'scd-digits-col scd-digits-row',
+ 'add' => 'scd-digits-row'
+ )
+ ),
+ 'col' => array (
+ array (
+ 'selector' => '.scd-label',
+ 'remove' => 'scd-label-col scd-label-row',
+ 'add' => 'scd-label-col'
+ ),
+ array (
+ 'selector' => '.scd-digits',
+ 'remove' => 'scd-digits-col scd-digits-row',
+ 'add' => 'scd-digits-col'
+ )
+ )
+ ),
+ 'layout' => array (
+ 'vert' => array (
+ 'selector' => '.scd-unit',
+ 'remove' => 'scd-unit-vert scd-unit-horz',
+ 'add' => 'scd-unit-vert clearfix'
+ ),
+ 'horz' => array (
+ 'selector' => '.scd-unit',
+ 'remove' => 'scd-unit-vert scd-unit-horz clearfix',
+ 'add' => 'scd-unit-horz'
+ )
+ ),
+ 'event_text_pos' => array (
+ 'vert' => array (
+ array (
+ 'selector' => '.scd-title',
+ 'remove' => 'scd-title-col scd-title-row clearfix',
+ 'add' => 'scd-title-col clearfix'
+ ),
+ array (
+ 'selector' => '.scd-counter',
+ 'remove' => 'scd-counter-col scd-counter-row clearfix',
+ 'add' => 'scd-counter-col clearfix'
+ )
+ ),
+ 'horz' => array (
+ array (
+ 'selector' => '.scd-title',
+ 'remove' => 'scd-title-col scd-title-row clearfix',
+ 'add' => 'scd-title-row'
+ ),
+ array (
+ 'selector' => '.scd-counter',
+ 'remove' => 'scd-counter-col scd-counter-row clearfix',
+ 'add' => 'scd-counter-row'
+ )
+ )
+ )
+ );
+ public static function parseCounterOptions( $params ) {
+ // read layout options
+ $file_name = JPATH_SITE . '/modules/mod_smartcountdown3/layouts/' . $params->get( 'layout_preset', 'auto.xml' );
+ if ( file_exists( $file_name ) ) {
+ $xml = file_get_contents( $file_name );
+ }
+ if ( empty( $xml ) ) {
+ // usually means a missing layout preset file
+ // this is a fatal error, module will raise 500 error
+ return false;
+ }
+
+ // now XML document should be valid
+ libxml_use_internal_errors( true );
+
+ $xml = simplexml_load_string( $xml );
+
+ foreach ( libxml_get_errors() as $error ) {
+ // log errors here...
+ }
+
+ // counter units padding settings
+ $paddings = array ();
+ foreach ( $xml->paddings->children() as $padding ) {
+ $padding = $padding->getName();
+ $paddings[$padding] = ( int ) $xml->paddings->$padding;
+ }
+ $params->set( 'paddings', $paddings );
+
+ // process overridable layout settings
+ if( $params->get( 'counter_layout' ) == '' ) {
+ $params->set( 'counter_layout', ( string ) $xml->layout );
+ }
+ if( $params->get( 'event_text_pos' ) == '' ) {
+ $params->set( 'event_text_pos', ( string ) $xml->event_text_pos );
+ }
+ if( $params->get( 'labels_pos' ) == '' ) {
+ $params->set( 'labels_pos', ( string ) $xml->labels_pos );
+ }
+ if( $params->get( 'labels_vert_align' ) == '' ) {
+ $params->set( 'labels_vert_align', ( string ) $xml->labels_vert_align );
+ }
+ if( $params->get( 'hide_highest_zeros' ) == '' ) {
+ $params->set( 'hide_highest_zeros', ( string ) $xml->hide_highest_zeros );
+ }
+ if( $params->get( 'allow_all_zeros' ) == '' ) {
+ $params->set( 'allow_all_zeros', ( string ) $xml->allow_all_zeros );
+ }
+
+ $responsive = array ();
+ $is_responsive = $xml->responsive->attributes();
+
+ // check if responsive behavior was disabled in layout overrides
+ if( $params->get( 'disable_responsive' ) == 1 ) {
+ $is_responsive = false;
+ } else {
+ $is_responsive = ( int ) $is_responsive['value'];
+ }
+
+ if ( $is_responsive ) {
+ // screen sizes
+ foreach ( $xml->responsive->children() as $scale ) {
+
+ $attrs = array ();
+ foreach ( $scale->attributes() as $k => $v ) {
+ $attrs[$k] = ( string ) $v;
+ }
+
+ $classes = array ();
+ foreach ( $scale->children() as $layout ) {
+ $name = $layout->getName();
+ $value = ( string ) $layout;
+
+ if ( isset( self::$layout_tpls[$name] ) && isset( self::$layout_tpls[$name][$value] ) ) {
+ $classes[] = self::$layout_tpls[$name][$value];
+ }
+ }
+
+ $responsive[] = array (
+ 'scale' => $attrs['value'],
+ 'alt_classes' => $classes
+ );
+ }
+
+ // add default scale 1.0 setting
+ $classes = array ();
+ $classes[] = self::$layout_tpls['layout'][$params->get( 'counter_layout', 'horz' )];
+ $labels_pos = $params->get( 'labels_pos', 'right' );
+ $labels_pos = $labels_pos == 'right' || $labels_pos == 'left' ? 'row' : 'col';
+ $classes[] = self::$layout_tpls['labels_pos'][$labels_pos];
+ $classes[] = self::$layout_tpls['event_text_pos'][$params->get( 'event_text_pos', 'vert' )];
+
+ $responsive[] = array (
+ 'scale' => 1.0,
+ 'alt_classes' => $classes
+ );
+ }
+
+ $params->set( 'responsive', $responsive );
+ $params->set( 'base_font_size', SCD_BASE_FONT_SIZE );
+
+ // configure displayed units
+ $all_units = array (
+ 'years' => 0,
+ 'months' => 0,
+ 'weeks' => 0,
+ 'days' => 0,
+ 'hours' => 0,
+ 'minutes' => 0,
+ 'seconds' => 0
+ );
+ $units = $params->get( 'units', array () );
+ foreach ( $units as $unit ) {
+ $all_units[$unit] = 1;
+ }
+
+ $hide_lower_units = array ();
+ if ( $params->get( 'allow_all_zeros', 0 ) == 0 ) {
+ foreach ( array_reverse( $all_units, true ) as $asset => $display ) {
+ if ( $display == 0 ) {
+ $hide_lower_units[] = $asset;
+ $all_units[$asset] = 1;
+ } else {
+ // first unit set as displayed, break the loop
+ break;
+ }
+ }
+ }
+ $params->set( 'hide_lower_units', $hide_lower_units );
+ $params->set( 'units', $all_units );
+
+ $counter_modes = $params->get( 'counter_modes', '-1:-1' );
+ list ( $countdown_limit, $countup_limit ) = explode( ':', $counter_modes );
+
+ $params->set( 'countdown_limit', $countdown_limit );
+ $params->set( 'countup_limit', $countup_limit );
+
+ $event_goto_url = $params->get( 'event_goto_url', '' );
+ $event_goto_menu = empty( $event_goto_url ) ? $params->get( 'event_goto_menu', '' ) : '';
+
+ $event_goto_link = self::getRedirectURL($event_goto_url, $event_goto_menu);
+
+ $params->set( 'redirect_url', $event_goto_link );
+
+ if ( $params->get( 'counter_clickable', 0 ) > 0 ) {
+ $params->set( 'click_url', $event_goto_link );
+ } else {
+ $params->set( 'click_url', '' );
+ }
+
+ $params->set( 'id', 'smartcountdown-' . $params->get( 'module_id', '' ) );
+ $params->set( 'ajaxurl', JURI::root( true ) . '/index.php' );
+
+ // read animations options
+
+ $animations = self::getAnimations( $params );
+ if ( $animations === false ) {
+ return false;
+ }
+
+ $params->set( 'animations', $animations );
+
+ return $params;
+ }
+ public static function getRedirectURL($event_goto_url, $event_goto_menu) {
+ if ( empty( $event_goto_url ) && empty( $event_goto_menu ) ) {
+ $event_goto_link = '';
+ } elseif ( !empty( $event_goto_url ) ) {
+ // workaround for duplicated 'http://' prefix prepended to url
+ // for relative urls (e.g. index.php)
+ if ( strripos( $event_goto_url, 'http' ) !== 0 ) {
+ $event_goto_url = substr( $event_goto_url, stripos( $event_goto_url, '://' ) + 3 );
+ }
+ $event_goto_link = $event_goto_url;
+
+ // ignore empty url
+ if ( substr( $event_goto_link, -3 ) == '://' ) {
+ $event_goto_link = '';
+ }
+ } else {
+ $menu = JFactory::getApplication()->getMenu();
+ $item = $menu->getItem( $event_goto_menu );
+
+ // we have to check if we have a valid item here: missing item
+ // can be caused by menu item unpublished state
+ if ( !empty( $item ) ) {
+ $router = JSite::getRouter();
+ if ( $router->getMode() == JROUTER_MODE_SEF ) {
+ $event_goto_link = 'index.php?Itemid=' . $event_goto_menu;
+ } else {
+ $event_goto_link = $item->link . '&Itemid=' . $event_goto_menu;
+ }
+ $event_goto_link .= '&lang=' . substr( $item->language, 0, 2 );
+ if ( strcasecmp( substr( $event_goto_link, 0, 4 ), 'http' ) && ( strpos( $event_goto_link, 'index.php?' ) !== false ) ) {
+ $event_goto_link = JRoute::_( $event_goto_link, true, $item->params->get( 'secure' ) );
+ } else {
+ $event_goto_link = JRoute::_( $event_goto_link );
+ }
+ $event_goto_link = JURI::getInstance()->toString( array (
+ 'scheme',
+ 'host'
+ ) ) . $event_goto_link;
+ } else {
+ $event_goto_link = '';
+ }
+ }
+ return $event_goto_link;
+ }
+ public static function getCounterLayout( $params ) {
+ $layout = array ();
+
+ $counter_layout = $params->get( 'counter_layout' );
+
+ $title_before_size = $params->get( 'title_before_size', 16 ) / SCD_BASE_FONT_SIZE;
+ $title_after_size = $params->get( 'title_after_size', 14 ) / SCD_BASE_FONT_SIZE;
+ $labels_size = $params->get( 'labels_size', 10 ) / SCD_BASE_FONT_SIZE;
+
+ $layout['event_text_pos'] = $params->get( 'event_text_pos' );
+ $layout['labels_pos'] = $params->get( 'labels_pos' );
+
+ $layout['title_before_style'] = 'font-size:' . $title_before_size . 'em;' . $params->get( 'title_before_style', '' );
+ $layout['title_after_style'] = 'font-size:' . $title_after_size . 'em;' . $params->get( 'title_after_style', '' );
+
+ $layout['digits_style'] = $params->get( 'digits_style', '' );
+ $layout['labels_style'] = 'font-size:' . $labels_size . 'em;' . $params->get( 'labels_style', '' );
+
+ $layout['title_before_style'] = empty( $layout['title_before_style'] ) ? '' : ' style="' . $layout['title_before_style'] . '"';
+ $layout['title_after_style'] = empty( $layout['title_after_style'] ) ? '' : ' style="' . $layout['title_after_style'] . '"';
+
+ $layout['digits_style'] = empty( $layout['digits_style'] ) ? '' : ' style="' . $layout['digits_style'] . '"';
+ $layout['labels_style'] = empty( $layout['labels_style'] ) ? '' : ' style="' . $layout['labels_style'] . '"';
+
+ $layout['module_style'] = $params->get( 'module_style', '' );
+ if ( $params->get( 'horizontally_center', 1 ) == 1 ) {
+ // if auto-center is set in options we add the rule to module container
+ $layout['module_style'] .= 'text-align:center;';
+ }
+ $layout['module_style'] = empty( $layout['module_style'] ) ? '' : ' style="' . $layout['module_style'] . '"';
+
+ switch ( $layout['labels_pos'] ) {
+ case 'left' :
+ case 'right' :
+ $layout['labels_class'] = 'scd-label scd-label-row';
+ $layout['digits_class'] = 'scd-digits scd-digits-row';
+ break;
+ case 'top' :
+ case 'bottom' :
+ default :
+ $layout['labels_class'] = 'scd-label scd-label-col';
+ $layout['digits_class'] = 'scd-digits scd-digits-col';
+ break;
+ }
+ switch ( $layout['event_text_pos'] ) {
+ case 'horz' :
+ $layout['text_class'] = 'scd-title scd-title-row';
+ $layout['counter_class'] = 'scd-counter scd-counter-row scd-counter-' . $counter_layout;
+ break;
+ case 'vert' :
+ default :
+ $layout['text_class'] = 'scd-title scd-title-col clearfix';
+ $layout['counter_class'] = 'scd-counter scd-counter-col clearfix';
+ }
+
+ $layout['units_class'] = 'scd-unit scd-unit-' . $counter_layout;
+ if ( $counter_layout == 'vert' ) {
+ $layout['units_class'] .= ' clearfix';
+ }
+
+ // read units spacing settings to be injected in scd-unit classes
+ $layout['units_spacing_horz'] = $params->get('units_spacing_horz', '');
+ $layout['units_spacing_vert'] = $params->get('units_spacing_vert', '');
+
+ return $layout;
+ }
+ public static function getAnimations( $params ) {
+ $file_name = JPATH_SITE . '/modules/mod_smartcountdown3/fx/' . $params->get( 'fx_preset', 'No_FX_animation.xml' );
+
+ if ( !file_exists( $file_name ) ) {
+ return false;
+ }
+ $xml = self::rtlAnimationsFix(file_get_contents( $file_name ));
+
+ libxml_use_internal_errors( true );
+
+ $xml = simplexml_load_string( $xml );
+
+ foreach ( libxml_get_errors() as $error ) {
+ // log errors here...
+ }
+ if ( empty( $xml ) ) {
+ return false;
+ }
+
+ $digitsConfig = array ();
+
+ // global settings
+ $digitsConfig['name'] = $xml['name'] ? ( string ) $xml['name'] : 'Custom';
+ $digitsConfig['description'] = $xml['description'] ? ( string ) $xml['description'] : '';
+ $images_folder = $xml['images_folder'] ? ( string ) $xml['images_folder'] : '';
+ // compatibility with profiles for smart countdown 2.5
+ if ( strpos( $images_folder, 'modules/mod_smartcountdown/images/' ) === 0 ) {
+ $images_folder = substr( $images_folder, strlen( 'modules/mod_smartcountdown/images/' ) );
+ }
+ $digitsConfig['images_folder'] = JUri::root( true ) . '/modules/mod_smartcountdown3/images/' . $images_folder;
+
+ $digitsConfig['uses_margin_values'] = false;
+
+ // *** TEST ONLY - for debugging to see previous values for all digits on init
+ // $digitsConfig['uses_margin_values'] = true;
+
+ // get all digit scopes configurations
+ foreach ( $xml->digit as $digit ) {
+
+ // scope attribute may contain more than one value (comma-separated list)
+ $scopes = explode( ',', ( string ) $digit['scope'] );
+
+ foreach ( $scopes as $scope ) {
+ // init config for all scopes in list
+ $digitsConfig['digits'][$scope] = array ();
+ }
+
+ // Calculate digits scale. We look for height and font-size scalable styles and calculate the
+ // effective scaling (basing on SCD_BASE_FONT_SIZE)
+ $scale = 1; // prepare for a fallback if no scalable relevant style is found
+
+ $digits_size = $params->get( 'digits_size', 24 );
+
+ foreach ( $digit->styles->style as $value ) {
+ $attrs = array ();
+ foreach ( $value->attributes() as $k => $v ) {
+ $attrs[$k] = ( string ) $v;
+ }
+ /*
+ * $$$ CHECK LOGIC with text based animations - EM setting and line-height:1em; (causes extra margin!)
+ */
+ if ( ( $attrs['name'] == 'height' || $attrs['name'] == 'font-size' ) && !empty( $attrs['scalable'] ) ) {
+ if ( $attrs['unit'] == 'px' ) {
+ $scale = $digits_size / $attrs['value'];
+ } elseif ( $attrs['unit'] == 'em' ) {
+ $scale = ( $digits_size / SCD_BASE_FONT_SIZE ) / $attrs['value'];
+ }
+ }
+ }
+
+ // construct digit style
+ $styles = array ();
+
+ foreach ( $digit->styles->style as $value ) {
+ $attrs = array ();
+ foreach ( $value->attributes() as $k => $v ) {
+ $attrs[$k] = ( string ) $v;
+ }
+
+ // If attribute unit is "px" we translate it to "em" using global base font size
+ // setting
+ if ( $attrs['unit'] == 'px' ) {
+ $attrs['unit'] = 'em';
+ $attrs['value'] = $attrs['value'] / SCD_BASE_FONT_SIZE;
+ }
+ // Scale the value if it has 'scalable' attribute set
+ $result = ( !empty( $attrs['scalable'] ) ? $scale * $attrs['value'] : $attrs['value'] ) . ( !empty( $attrs['unit'] ) ? $attrs['unit'] : '' );
+
+ $result = preg_replace( '#url\((\S+)\)#', 'url(' . $digitsConfig['images_folder'] . '$1)', $result );
+
+ // We save styles as array, must be joined by ";" before applying directly to style attribute!
+ $styles[$attrs['name']] = $result;
+ }
+
+ // *** old version: styles as a string
+ // for digit style - if background set, prepend images_folder
+ // $styles = preg_replace('#url\((\S+)\)#', 'url('.$digitsConfig['images_folder'].'$1)', $styles);
+
+ foreach ( $scopes as $scope ) {
+ // set styles for all scopes in list
+ $digitsConfig['digits'][$scope]['style'] = $styles;
+ }
+
+ // get modes (down and up)
+ foreach ( $digit->modes->mode as $groups ) {
+
+ $attrs = $groups->attributes();
+ $mode = ( string ) $attrs['name'];
+
+ foreach ( $groups as $group ) {
+
+ $grConfig = array ();
+
+ $grAttrs = $group->attributes();
+ foreach ( $grAttrs as $k => $v ) {
+ $grConfig[$k] = ( string ) $v;
+ if ( $k == 'transition' ) {
+ $grConfig[$k] = self::translateTransitions( $grConfig[$k] );
+ }
+ }
+
+ $grConfig['elements'] = array ();
+
+ // get all elements for the group
+ foreach ( $group as $element ) {
+ // default values to use if attribute is missing
+ $elConfig = array (
+ 'filename_base' => '',
+ 'filename_ext' => '',
+ 'value_type' => ''
+ );
+
+ $elAttrs = $element->attributes();
+ foreach ( $elAttrs as $k => $v ) {
+ $elConfig[$k] = ( string ) $v;
+ }
+
+ if ( $elConfig['value_type'] == 'pre-prev' || $elConfig['value_type'] == 'post-next' ) {
+ // working with pre-prev and post-next requires significant
+ // calculation in client script, so for performance sake we set the
+ // flag here, so that this calculation is performed only if needed
+ $digitsConfig['uses_margin_values'] = true;
+ }
+
+ $elConfig['styles'] = self::getElementStyles( $element->styles, $digitsConfig['images_folder'] );
+ $elConfig['tweens'] = self::getElementTweens( $element->tweens, empty( $grConfig['unit'] ) ? '%' : $grConfig['unit'] );
+
+ // if a style is missing in tweens['from'] we must add it here
+ $elConfig['tweens']['from'] = array_merge( $elConfig['styles'], $elConfig['tweens']['from'] );
+
+ // if a tweens rule (CSS property) is missing in element's styles, existing animations profiles
+ // get broken. At the moment we implement this workaround - explicitly add a style if a "tween.from"
+ // property is missing. Later we can check if this can be done in client script and/or if there are
+ // clear guidelines for correcting existing animation profiles
+ foreach ( $elConfig['tweens']['from'] as $style => $value ) {
+ if ( !isset( $elConfig['styles'][$style] ) ) {
+ $elConfig['styles'][$style] = $value;
+ }
+ }
+ $grConfig['elements'][] = $elConfig;
+ }
+
+ foreach ( $scopes as $scope ) {
+ // set fx configuration for all scopes in list
+ $digitsConfig['digits'][$scope][$mode][] = $grConfig;
+ }
+ }
+ }
+ }
+
+ $digitsConfig['digits'] = self::translateScopes( $digitsConfig['digits'] );
+ return $digitsConfig;
+ }
+
+ /**
+ * Fix "force off-screen" CSS rules using "left" attribute to be compatible with
+ * RTL languages. When negative "left" value is used in RTL template, browser window
+ * automatically grows in width, which is not correct.
+ * As a workaround for RTL we use "right" attribute to force elements off-screen
+ * (which is symmetric to using "left" attribute for LTR layouts.
+ *
+ * @param $content - original xml document
+ * @return string - fix xml document
+ */
+ private static function rtlAnimationsFix($content)
+ {
+ if(JFactory::getLanguage()->get('rtl'))
+ {
+ return str_replace('
-10000px', '
-10000px', $content);
+ }
+ return $content;
+ }
+
+ /**
+ * Translate old mootools easing directives to jQuery UI easing standards.
+ * When using native jQuery
+ * easing or unknown, returns $transition param without changes
+ *
+ * @param string $transition
+ * - sourse easing directive
+ * @return string - jQuery UI standard easing directive
+ */
+ private static function translateTransitions( $transition ) {
+ $parts = explode( ':', $transition );
+ if ( count( $parts ) == 2 ) {
+ return 'ease' . ucfirst( $parts[1] ) . ucfirst( $parts[0] );
+ } else {
+ return $transition;
+ }
+ }
+ /**
+ * Support smart countdown 2 animation profiles digit scopes in smart countdown 3
+ * - scope 6 has a special meaning - lower digit of "days", "weeks", "months" and "years" units
+ *
+ * @param array $scopes
+ * - animation data array, possibly containig smartcountdown-2 keys (0, 1, 2, etc...)
+ * @return array of scopes with smartcountdown3 keys notation (seconds0, seconds1, minutes0, etc...)
+ */
+ private static function translateScopes( $scopes ) {
+ $dict = array (
+ '0' => 'seconds0',
+ '1' => 'seconds1',
+ '2' => 'minutes0',
+ '3' => 'minutes1',
+ '4' => 'hours0',
+ '5' => 'hours1',
+ '6' => 'days0'
+ );
+
+ $translated = array ();
+
+ foreach ( $scopes as $scope => $data ) {
+ if ( isset( $dict[$scope] ) ) {
+ $translated[$dict[$scope]] = $data;
+ if ( $scope == 6 ) {
+ $translated['weeks0'] = $translated['months0'] = $translated['years0'] = $data;
+ }
+ } else {
+ $translated[$scope] = $data;
+ }
+ }
+ return $translated;
+ }
+ private static function getElementStyles( $styles, $images_folder ) {
+ $result = array ();
+
+ if ( empty( $styles ) ) {
+ return $result;
+ }
+
+ $styles = $styles->children();
+ for ( $i = 0; $count = count( $styles ), $i < $count; $i++ ) {
+ $result[$styles[$i]->getName()] = trim( preg_replace( '#url\((\S+)\)#', 'url(' . $images_folder . '$1)', ( string ) $styles[$i] ) );
+ }
+
+ return $result;
+ }
+
+ /*
+ * Split tweens to "from" and "to" CSS rules. Must-have for jQuery animation
+ */
+ private static function getElementTweens( $tweens, $unit ) {
+ $result = array (
+ 'from' => array (),
+ 'to' => array ()
+ );
+ if ( empty( $tweens ) ) {
+ return $result;
+ }
+
+ $tweens = $tweens->children();
+
+ for ( $i = 0; $count = count( $tweens ), $i < $count; $i++ ) {
+ $name = $tweens[$i]->getName();
+ if ( !in_array( $name, array (
+ 'top',
+ 'bottom',
+ 'left',
+ 'right',
+ 'height',
+ 'width',
+ 'font-size'
+ ) ) ) {
+ // discard unit for css rules that do not accept units
+ $unit = '';
+ }
+ $values = explode( ',', ( string ) $tweens[$i] );
+ $result['from'][$name] = trim( $values[0] . $unit );
+ $result['to'][$name] = trim( $values[1] . $unit );
+ }
+
+ return $result;
+ }
+}
\ No newline at end of file
diff --git a/deployed/smartcountdown3/modules/mod_smartcountdown3/helpers/index.html b/deployed/smartcountdown3/modules/mod_smartcountdown3/helpers/index.html
new file mode 100644
index 00000000..2efb97f3
--- /dev/null
+++ b/deployed/smartcountdown3/modules/mod_smartcountdown3/helpers/index.html
@@ -0,0 +1 @@
+
diff --git a/deployed/smartcountdown3/modules/mod_smartcountdown3/helpers/plurals/index.html b/deployed/smartcountdown3/modules/mod_smartcountdown3/helpers/plurals/index.html
new file mode 100644
index 00000000..2efb97f3
--- /dev/null
+++ b/deployed/smartcountdown3/modules/mod_smartcountdown3/helpers/plurals/index.html
@@ -0,0 +1 @@
+
diff --git a/deployed/smartcountdown3/modules/mod_smartcountdown3/helpers/plurals/plural.js b/deployed/smartcountdown3/modules/mod_smartcountdown3/helpers/plurals/plural.js
new file mode 100644
index 00000000..b7919c88
--- /dev/null
+++ b/deployed/smartcountdown3/modules/mod_smartcountdown3/helpers/plurals/plural.js
@@ -0,0 +1,7 @@
+function smartcountdown_plural(n) {
+ if(n == 1) {
+ return '_1';
+ } else {
+ return '';
+ }
+}
diff --git a/deployed/smartcountdown3/modules/mod_smartcountdown3/helpers/plurals/plural.php b/deployed/smartcountdown3/modules/mod_smartcountdown3/helpers/plurals/plural.php
new file mode 100644
index 00000000..c0bdaadf
--- /dev/null
+++ b/deployed/smartcountdown3/modules/mod_smartcountdown3/helpers/plurals/plural.php
@@ -0,0 +1,17 @@
+= 3 && rest100 <= 10 ? '_4' :
+ rest100 >= 11 ? '' : // no suffix for plural > 10
+ '_5';
+}
\ No newline at end of file
diff --git a/deployed/smartcountdown3/modules/mod_smartcountdown3/helpers/plurals/plural_ar-aa.php b/deployed/smartcountdown3/modules/mod_smartcountdown3/helpers/plurals/plural_ar-aa.php
new file mode 100644
index 00000000..646436c0
--- /dev/null
+++ b/deployed/smartcountdown3/modules/mod_smartcountdown3/helpers/plurals/plural_ar-aa.php
@@ -0,0 +1,17 @@
+addScript(JURI::root(true).'/modules/mod_smartcountdown3/helpers/plurals/plural' . $lang_suffix . '.js');
+
+ return $translated;
+ }
+}
+
diff --git a/deployed/smartcountdown3/modules/mod_smartcountdown3/helpers/plurals/plural_fr-fr.js b/deployed/smartcountdown3/modules/mod_smartcountdown3/helpers/plurals/plural_fr-fr.js
new file mode 100644
index 00000000..040a9d3c
--- /dev/null
+++ b/deployed/smartcountdown3/modules/mod_smartcountdown3/helpers/plurals/plural_fr-fr.js
@@ -0,0 +1,7 @@
+function smartcountdown_plural(n) {
+ if(n == 1 || n == 0) {
+ return '_1';
+ } else {
+ return '';
+ }
+}
diff --git a/deployed/smartcountdown3/modules/mod_smartcountdown3/helpers/plurals/plural_fr-fr.php b/deployed/smartcountdown3/modules/mod_smartcountdown3/helpers/plurals/plural_fr-fr.php
new file mode 100644
index 00000000..c02f7c48
--- /dev/null
+++ b/deployed/smartcountdown3/modules/mod_smartcountdown3/helpers/plurals/plural_fr-fr.php
@@ -0,0 +1,17 @@
+=2 && rest10 <= 4 && (rest100 < 10 || rest100 >= 20)) {
+ return '_2';
+ } else {
+ return '';
+ }
+}
diff --git a/deployed/smartcountdown3/modules/mod_smartcountdown3/helpers/plurals/plural_ru-ru.php b/deployed/smartcountdown3/modules/mod_smartcountdown3/helpers/plurals/plural_ru-ru.php
new file mode 100644
index 00000000..c97e3197
--- /dev/null
+++ b/deployed/smartcountdown3/modules/mod_smartcountdown3/helpers/plurals/plural_ru-ru.php
@@ -0,0 +1,17 @@
+
diff --git a/deployed/smartcountdown3/modules/mod_smartcountdown3/images/index.html b/deployed/smartcountdown3/modules/mod_smartcountdown3/images/index.html
new file mode 100644
index 00000000..2efb97f3
--- /dev/null
+++ b/deployed/smartcountdown3/modules/mod_smartcountdown3/images/index.html
@@ -0,0 +1 @@
+
diff --git a/deployed/smartcountdown3/modules/mod_smartcountdown3/images/wpspin_light.gif b/deployed/smartcountdown3/modules/mod_smartcountdown3/images/wpspin_light.gif
new file mode 100644
index 00000000..4c42dcb2
Binary files /dev/null and b/deployed/smartcountdown3/modules/mod_smartcountdown3/images/wpspin_light.gif differ
diff --git a/deployed/smartcountdown3/modules/mod_smartcountdown3/index.html b/deployed/smartcountdown3/modules/mod_smartcountdown3/index.html
new file mode 100644
index 00000000..2efb97f3
--- /dev/null
+++ b/deployed/smartcountdown3/modules/mod_smartcountdown3/index.html
@@ -0,0 +1 @@
+
diff --git a/deployed/smartcountdown3/modules/mod_smartcountdown3/js/index.html b/deployed/smartcountdown3/modules/mod_smartcountdown3/js/index.html
new file mode 100644
index 00000000..2efb97f3
--- /dev/null
+++ b/deployed/smartcountdown3/modules/mod_smartcountdown3/js/index.html
@@ -0,0 +1 @@
+
diff --git a/deployed/smartcountdown3/modules/mod_smartcountdown3/js/smartcountdown.js b/deployed/smartcountdown3/modules/mod_smartcountdown3/js/smartcountdown.js
new file mode 100644
index 00000000..a595edc3
--- /dev/null
+++ b/deployed/smartcountdown3/modules/mod_smartcountdown3/js/smartcountdown.js
@@ -0,0 +1,1858 @@
+/**
+ * @package Module Smart Countdown 3 for Joomla! 3.0
+ * @version 3.4.5
+ * @author Alex Polonski
+ * @copyright (C) 2012-2015 - Alex Polonski
+ * @license GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
+ **/
+(function($) {
+ var MILLIS_IN_DAY = 86400000;
+ var MILLIS_IN_HOUR = 3600000;
+ var MILLIS_IN_MINUTE = 60000;
+ var MILLIS_IN_SECOND = 1000;
+
+ var SECONDS_IN_DAY = 86400;
+ var SECONDS_IN_HOUR = 3600;
+ var SECONDS_IN_MINUTE = 60;
+ var MINUTES_IN_DAY = SECONDS_IN_DAY / 60;
+ var MINUTES_IN_HOUR = 60;
+ var HOURS_IN_DAY = 24;
+ var MONTHS_IN_YEAR = 12;
+
+ var MIN_SUSPEND_THRESHOLD = 50; // standard threshold
+ var SUSPEND_THRESHOLD_RELAX_STEP = 100; // temporarly increment threshold by this value
+ var SUSPEND_THRESHOLD_RESTRICT_STEP = 50; // gradually decrease threshold by this value
+
+ var WINDOW_RESIZE_EVENT_DELAY = 500; // avoid massive resize events
+ var SCD_SAFE_ADJUST_PX = 10; // responsive adjust safe margin - make required width bigger
+
+ // global container for smart countdown objects
+ scds_container = {
+ timer : {
+ id : false,
+ now : false,
+ offset : false,
+ awake_detect : false,
+ suspend_threshold : MIN_SUSPEND_THRESHOLD,
+ acc_correction : 0
+ },
+ instances : {},
+ add : function(options) {
+ // protection against adding the same instance more than once
+ if(typeof scds_container.instances[options.id] !== 'undefined') {
+ return;
+ }
+ // scd_counter is a generic object. We have to use a fresh copy
+ // each time we add a counter, so that scd_counter instance is
+ // always intact.
+ var working_copy = $.extend(true, {}, scd_counter);
+
+ // call init method. The recently created counter will
+ // be added to scds_container after it's setup is complete
+ working_copy.init(options);
+
+ // create the tick timer if not created yet
+ if(this.timer.id === false) {
+ this.timer.id = window.setTimeout(function() {
+ scds_container.fireAllCounters();
+ }, MILLIS_IN_SECOND);
+
+ // avoid massive resize events
+ $(window).resize(function() {
+ clearTimeout($.data(this, 'resizeTimer'));
+ $.data(this, 'resizeTimer', setTimeout(function() {
+ scds_container.responsiveAdjust();
+ }, WINDOW_RESIZE_EVENT_DELAY));
+ });
+ // on the first run (timer hasn't been created yet) we
+ // add some easings to support existing animations
+ this.setupVelocityEasings();
+ }
+ },
+ remove : function(id) {
+ delete(scds_container.instances[id]);
+ },
+ updateInstance : function(id, instance) {
+ scds_container.instances[id] = instance;
+ scds_container.responsiveAdjust();
+ },
+ fireAllCounters : function() {
+ var now = new Date().getTime();
+ if(this.timer.awake_detect === false) {
+ this.timer.awake_detect = now - MILLIS_IN_SECOND;
+ }
+ var elapsed = now - this.timer.awake_detect;
+ this.timer.awake_detect = now;
+
+ var bias = elapsed - MILLIS_IN_SECOND, timeout = MILLIS_IN_SECOND;
+ if(Math.abs(bias) < 20) {
+ // we can correct small timer fluctuations simply
+ // adjusting next timeout
+ timeout = MILLIS_IN_SECOND - bias;
+ this.timer.acc_correction -= bias;
+ }
+ // programm next tick right away
+ this.timer.id = window.setTimeout(function() {
+ scds_container.fireAllCounters();
+ }, timeout)
+
+ // keep track of accumulated correction
+ this.timer.acc_correction += (elapsed - MILLIS_IN_SECOND);
+
+ var correction = 0;
+ if(this.timer.acc_correction >= this.timer.suspend_threshold) {
+ correction = this.timer.acc_correction;
+ this.timer.acc_correction = 0;
+ this.timer.suspend_threshold += SUSPEND_THRESHOLD_RELAX_STEP;
+
+ // we are in suspend/resume correction and have to refresh current
+ // system time stored in this.timer object
+ this.getServerTime(true);
+ } else if(this.timer.suspend_threshold > MIN_SUSPEND_THRESHOLD) {
+ this.timer.suspend_threshold -= SUSPEND_THRESHOLD_RESTRICT_STEP;
+ }
+
+ // update internal server now each tick
+ this.timer.now += MILLIS_IN_SECOND;
+
+ $.each(this.instances, function() {
+ this.tick(true, correction);
+ });
+ },
+ setServerTime : function(ts) {
+ if(this.timer.offset === false) {
+ this.timer.offset = ts - new Date().getTime();
+
+ // set internal now on init, later it will be updated on each
+ // timer tick, but we have to make it available before the
+ // timer is activated
+ this.timer.now = ts;
+ }
+ },
+ getServerTime : function(renew) {
+ if(renew) {
+ this.timer.now = new Date().getTime() + this.timer.offset;
+ }
+ return this.timer.now;
+ },
+ responsiveAdjust : function() {
+ $.each(this.instances, function(id, counter) {
+ /*var width = window.innerWidth
+ || document.documentElement.clientWidth
+ || document.body.clientWidth;*/
+ counter.responsiveAdjust(/*width*/);
+ });
+ },
+ setupVelocityEasings : function() {
+ var VelocityContainer = window.Velocity || $.Velocity;
+
+ $.extend(VelocityContainer.Easings, {
+ Back: function( p ) {
+ return p * p * ( 3 * p - 2 );
+ },
+ Bounce: function ( p ) {
+ var pow2,
+ bounce = 4;
+
+ while ( p < ( ( pow2 = Math.pow( 2, --bounce ) ) - 1 ) / 11 ) {}
+ return 1 / Math.pow( 4, 3 - bounce ) - 7.5625 * Math.pow( ( pow2 * 3 - 2 ) / 22 - p, 2 );
+ }
+ });
+
+ $.each([ "Back", "Bounce" ], function( index, easeInName ) {
+
+ var easeIn = VelocityContainer.Easings[easeInName];
+
+ VelocityContainer.Easings[ "easeIn" + easeInName ] = easeIn;
+ VelocityContainer.Easings[ "easeOut" + easeInName ] = function( p ) {
+ return 1 - easeIn( 1 - p );
+ };
+ VelocityContainer.Easings[ "easeInOut" + easeInName ] = function( p ) {
+ return p < 0.5 ?
+ easeIn( p * 2 ) / 2 :
+ 1 - easeIn( p * -2 + 2 ) / 2;
+ };
+ });
+ }
+ }
+
+ var scd_counter = {
+ options : {
+ units : {
+ years : 1,
+ months : 1,
+ weeks : 1,
+ days : 1,
+ hours : 1,
+ minutes : 1,
+ seconds : 1
+ },
+ hide_lower_units : [],
+ limits : {
+ // default overflow limits for up mode. If some of related time units
+ // are not displayed these limits will be updated in getCounterValues()
+ seconds : SECONDS_IN_HOUR,
+ minutes : MINUTES_IN_HOUR,
+ hours : HOURS_IN_DAY
+ },
+ paddings : {
+ years : 1,
+ months : 1,
+ weeks : 1,
+ days : 2,
+ hours : 2,
+ minutes : 2,
+ seconds : 2
+ },
+ animations : {},
+ labels_vert_align : 'middle',
+ initDisplay : true,
+ allow_all_zeros : 0,
+ replace_lowest_zero : 1,
+ hide_highest_zeros : 0,
+ hide_countup_counter : 0,
+ shortcode : 0,
+ redirect_url : '',
+ click_url : '',
+ import_config : '',
+ base_font_size : 12,
+ counter_container : null,
+
+ countup_limit : -1,
+ countdown_limit : -1,
+ countdown_query_limit : -1
+ },
+ current_values : {},
+ elements : {},
+ animation_timers : {},
+
+ init : function(options) {
+ $.extend(true, this.options, options);
+
+ // backup original event titles - we'll need them later
+ // for appending imported event titles
+ this.options.original_title_before_down = this.options.title_before_down;
+ this.options.original_title_before_up = this.options.title_before_up;
+
+ this.options.original_title_after_down = this.options.title_after_down;
+ this.options.original_title_after_up = this.options.title_after_up;
+
+ // backup countdown limit. We will need these
+ // values when requesting next event. limits will change
+ // during counter life to indicate the next query interval
+ this.options.original_countdown_limit = this.options.countdown_limit;
+
+ // here we cannot rely on module container div class - different templates use different markup
+ // $$$ we should add an advanced option - "container class". For now, use some popular
+ // classes and fall back to our module content wrapper if outer container is not found.
+ this.options.counter_container = $('#' + this.options.id).closest('.moduletable, .module-inner');
+ if(this.options.counter_container.length == 0) {
+ this.options.counter_container = $('#' + this.options.id);
+ }
+
+ this.queryNextEvent(true);
+ },
+ tick : function(from_timer, correction) {
+ var delta = this.options.mode == 'up' ? 1 : -1;
+
+ if(typeof correction !== 'undefined' && correction != 0) {
+ var diff = this.diff + (correction + MILLIS_IN_SECOND ) * delta;
+ if(this.options.mode == 'down' && diff <= 0) {
+ // deadline reached while suspended
+ this.deadlineReached();
+ } else {
+ // recalculate counter values
+ // when browser is resumed, values queue can contain
+ // values which are not sequential. We pass "resumed"
+ // parameter here (reserved)
+ this.softInitCounter(true);
+ }
+ // on resume we do not set initDisplay because it incurres a significant
+ // workload on script (units visibility checks, etc.)
+ return;
+ }
+ // check for counter mode limits every tick - we do it before incrementing
+ // diff, so we react to countup limit reached on time
+ this.applyCounterLimits();
+
+ // advance current diff
+ if(from_timer) {
+ this.diff += delta * MILLIS_IN_SECOND;
+ }
+
+ // copy current values to new_values
+ var new_values = $.extend({},this.current_values);
+
+ // always advance seconds, even if they are not displayed
+ new_values.seconds += delta;
+
+ // update time units on seconds limit according to counter display
+ // settings
+
+ // 'up' mode
+ if(new_values.seconds >= this.options.limits.seconds) {
+ // if seconds value reaches 24h threshhold we always recalculate
+ // counter values
+ if(new_values.seconds >= SECONDS_IN_DAY) {
+ this.softInitCounter();
+ return;
+ }
+ // normal overflow, increment next higher displayed unit
+ new_values.seconds = 0;
+ if(this.options.units.minutes == 1) {
+ // minutes displayed
+ new_values.minutes++;
+ if(new_values.minutes >= this.options.limits.minutes) {
+ new_values.minutes = 0;
+ if(this.options.units.hours == 1) {
+ // minutes and hours displayed
+ new_values.hours++;
+ if(new_values.hours >= this.options.limits.hours) {
+ this.softInitCounter();
+ return;
+ }
+ } else {
+ // hours are not displayed but minutes have reached the
+ // MINUTES_IN_DAY limit, recalculate counter values
+ this.softInitCounter();
+ return;
+ }
+ }
+ } else if(this.options.units.hours == 1) {
+ // only hours are displayed
+ new_values.hours++;
+ if(new_values.hours >= this.options.limits.hours) {
+ this.softInitCounter();
+ return;
+ }
+ }
+ // if neither minutes nor hours are displayed, we shouldn't
+ // ever get to this point. Counter values recalculation method
+ // should have been already called
+ }
+
+ // 'down' mode
+ if(new_values.seconds < 0) {
+ // check for deadline
+ if(this.diff <= 0) {
+ return this.deadlineReached();
+ }
+ new_values.seconds = this.options.limits.seconds - 1;
+ if(this.options.units.minutes == 1) {
+ // minutes displayed
+ new_values.minutes--;
+ if(new_values.minutes < 0) {
+ new_values.minutes = this.options.limits.minutes - 1;
+ if(this.options.units.hours == 1) {
+ // minutes and hours displayed
+ new_values.hours--;
+ if(new_values.hours < 0) {
+ this.softInitCounter();
+ return;
+ }
+ } else {
+ // hours are not displayed but minutes have crossed zero,
+ // recalculate counter values
+ this.softInitCounter();
+ return;
+ }
+ }
+ } else if(this.options.units.hours == 1) {
+ // only hours are displayed
+ new_values.hours--;
+ if(new_values.hours < 0) {
+ // recalculate counter values
+ this.softInitCounter();
+ return;
+ }
+ } else {
+ // neither minutes nor hours are displayed.
+ // recalculate counter values
+ this.softInitCounter();
+ return;
+ }
+ }
+
+ this.display(new_values);
+ },
+ /**
+ * A set of calls for soft counter init:
+ * - Recalulate the counter values
+ * - If "resumed" param is set, set validate queue mode
+ */
+ softInitCounter : function(resumed) {
+ if(resumed) {
+ // additional actions on resume. Reserved ***
+ }
+ this.updateCounter(this.getCounterValues());
+ },
+ deadlineReached : function() {
+ // redirect if set so in options. We do it immediately when
+ // this method is called, because more actions at this point
+ // can cause counter flicker and / or orphan values. Anyway,
+ // changing window.location will result in page refresh, thus
+ // all required calculations will be done when the refreshed
+ // page is generated.
+ if(this.options.redirect_url != '') {
+ this.options.counter_container.hide();
+
+ // we hide the module first, then if user doesn't confirm redirection
+ // we show the module again
+ if(this.doRedirect(this.options.redirect_url, false) === false) {
+ this.options.counter_container.show();
+ }
+ }
+
+ // New feature: countdown_query_limit for support complex events overlapping
+ if(this.options.countdown_query_limit == 0) {
+ this.options.counter_container.hide();
+ this.queryNextEvent();
+ this.options.countup_limit = -1;
+ return;
+ }
+
+ var new_values = this.getCounterValues();
+
+ // in countdown-only and countdown-to-end modes "deadlineReached" requires
+ // immediate query for the next event (call to getCounterValues() method has
+ // already changed counter mode to "up")
+ this.applyCounterLimits();
+
+ // Force animations re-init in new mode - add mode_changed flag
+ this.updateCounter(new_values, true);
+
+ // update units visibilty, new_diff may be far from zero if the
+ // deadline was reached while suspended, so we must counter
+ // visibility here
+ this.setCounterUnitsVisibility(new_values);
+
+ this.applyCounterClickable();
+ },
+ /*
+ * This method performs the main work of calculating counter values
+ * It uses current module instance display options along with event deadline
+ * (target date and time) to set correct values relative to "now"
+ * argument. On module initialization "now" is read from options
+ * (system time) but later, e.g. on suspend/resume event this value
+ * will be corrected by suspend time, so that a valid "now" will not
+ * be requested from server - can be useful in case of short and repeated
+ * suspend periods
+ */
+ getCounterValues : function() {
+ var now_ts = scds_container.getServerTime();
+
+ // init Date objects from this.options.deadline and now
+ var t, dateFrom, dateTo;
+
+ dateFrom = new Date(now_ts);
+
+ // we expect ISO format here
+ var dateTo = new Date(this.options.deadline);
+ if(isNaN(dateTo.getTime())) {
+ // panic fallback
+ dateTo = new Date();
+ }
+
+ /** TEST UNIT ***
+ var testFrom = '2012-02-28';
+ var testTo = '2015-04-01';
+
+ if(testFrom.length == 10) testFrom = testFrom + ' 00:00:00';
+ if(testTo.length == 10) testTo = testTo + ' 00:00:00';
+
+ dateTo = new Date(testTo.replace(' ', 'T') + '+00:00');
+ dateFrom = new Date(testFrom.replace(' ', 'T') + '+00:00');
+ *** TEST UNIT END ***/
+
+ // swap dateTo and dateFrom for 'up' mode and
+ // set surrent counter mode ('down'/'up')
+ this.diff = dateTo - dateFrom;
+
+ if(this.diff <= 0) {
+ this.options.mode = 'up';
+ var tmp = dateFrom;
+ dateFrom = dateTo;
+ dateTo = tmp;
+ this.diff = this.diff * -1;
+
+ // do not allow 0 seconds diff in count up mode
+ if(this.diff < MILLIS_IN_SECOND) {
+ this.diff = MILLIS_IN_SECOND;
+ }
+ } else {
+ this.options.mode = 'down';
+ }
+
+ // get dates components as properties for faster access
+ var target = dateToObject(dateTo);
+ var now = dateToObject(dateFrom);
+
+ // calculate this.difference in units (years, months, days, hours,
+ // minutes and seconds)
+
+ var yearsDiff = target.year - now.year;
+ var monthsDiff = target.month - now.month;
+ var daysDiff = target.day - now.day;
+ var hoursDiff = target.hours - now.hours;
+ var minutesDiff = target.minutes - now.minutes;
+ var secondsDiff = target.seconds - now.seconds;
+
+ if(secondsDiff < 0) {
+ minutesDiff--;
+ secondsDiff += SECONDS_IN_MINUTE;
+ }
+ if(minutesDiff < 0) {
+ hoursDiff--;
+ minutesDiff += MINUTES_IN_HOUR;
+ }
+ if(hoursDiff < 0) {
+ daysDiff--;
+ hoursDiff += HOURS_IN_DAY;
+ }
+ if(daysDiff < 0) {
+ monthsDiff--;
+ // tricky: if we get negative days diff we must calculate correct effective days
+ // diff basing on the number of days in "now" month and in the month previous to
+ // "target" and choose the month with more days in it for correct calculation
+ var daysInNowMonth = daysInThisMonth(now.year, now.month);
+ var daysInPrevTargetMonth = daysInPrevMonth(target.year, target.month);
+ // correct daysDiff to get effective positive value
+ daysDiff += (daysInNowMonth > daysInPrevTargetMonth ? daysInNowMonth : daysInPrevTargetMonth);
+ }
+ if(monthsDiff < 0) {
+ yearsDiff--;
+ monthsDiff += MONTHS_IN_YEAR;
+ }
+ // Year diff must be always >= 0: if initial now is greated than initial target we swap them!
+
+ // Set counter values according to display settigns
+
+ // days-hours-seconds part of the interval
+ var timeSpan = (hoursDiff * SECONDS_IN_HOUR + minutesDiff * SECONDS_IN_MINUTE + secondsDiff) * MILLIS_IN_SECOND;
+
+ // get years interval part end date
+ var yearsEnd = new Date(Date.UTC(now.year + yearsDiff, now.month - 1, (now.month == 2 && now.day == 29 && new Date(now.year + yearsDiff, 1, 29).getMonth() != 1 ? 28 : now.day), now.hours, now.minutes, now.seconds));
+ var yearsSpan = yearsEnd.valueOf() - dateFrom.valueOf();
+
+ // get months interval part end date
+ var monthsEnd = new Date(dateTo.valueOf() - daysDiff * MILLIS_IN_DAY - timeSpan);
+ var monthsSpan = monthsEnd.valueOf() - yearsEnd.valueOf();
+
+ // construct resulting values
+ var result = {
+ /*
+ years : null,
+ months : null,
+ weeks : null,
+ days : null,
+ hours : null,
+ minutes : null,
+ seconds : null
+ */
+ };
+ var restDiff = this.diff;
+
+ // tricky cases
+
+ // if years or months are displayed we have to subtract yearsSpan
+ // from restDiff
+ if(this.options.units.years == 1 || this.options.units.months == 1) {
+ restDiff = restDiff - yearsSpan;
+ }
+ if(this.options.units.years == 1) {
+ result.years = yearsDiff;
+ } else if(this.options.units.months == 1) {
+ // no years but months present: adjust monthsDiff
+ monthsDiff = monthsDiff + yearsDiff * MONTHS_IN_YEAR;
+ }
+ if(this.options.units.months == 1) {
+ // show months value, monthsDiff could have already been adjusted if
+ // years are hidden
+ restDiff = restDiff - monthsSpan;
+ result.months = monthsDiff;
+ } else {
+ // no month display. We can rely on restDiff to calculate remainig
+ // days value (restDiff could be already adjusted due to year and/or
+ // month display settings
+ daysDiff = Math.floor(restDiff / MILLIS_IN_DAY);
+ }
+ // easy cases: starting from weeks unit and lower we can use simple
+ // division to calculate values. No days-in-month and leap years stuff.
+ // We chain restDiff subtraction on each unit that is displayed, so that
+ // next lower unit showes correct value
+ if(this.options.units.weeks == 1) {
+ var weeksDif = Math.floor(daysDiff / 7); // entire weeks
+ daysDiff = daysDiff % 7; // days left
+ restDiff = restDiff - weeksDif * 7 * MILLIS_IN_DAY;
+ result.weeks = weeksDif;
+ }
+ if(this.options.units.days == 1) {
+ result.days = Math.floor(restDiff / MILLIS_IN_DAY);
+ restDiff = restDiff - daysDiff * MILLIS_IN_DAY;
+ }
+ if(this.options.units.hours == 1) {
+ result.hours = Math.floor(restDiff / MILLIS_IN_HOUR);
+ restDiff = restDiff - result.hours * MILLIS_IN_HOUR;
+ }
+ if(this.options.units.minutes == 1) {
+ result.minutes = Math.floor(restDiff / MILLIS_IN_MINUTE);
+ restDiff = restDiff - result.minutes * MILLIS_IN_MINUTE;
+ }
+ // always include seconds in result. Even if seconds are not displayed on
+ // screen according to widget configuration, they will be rendered as hidden.
+ // Also seconds must be there for the "easy inc/dec" method to work -
+ // performance optimization to avoid heavy calculations in tick() method
+ result.seconds = Math.floor(restDiff / MILLIS_IN_SECOND);
+
+ // set overflow limits
+ if(this.options.units.minutes == 1) {
+ this.options.limits.seconds = SECONDS_IN_MINUTE;
+ } else {
+ if(this.options.units.hours == 1) {
+ this.options.limits.seconds = SECONDS_IN_HOUR;
+ } else {
+ this.options.limits.seconds = SECONDS_IN_DAY;
+ }
+ }
+ if(this.options.units.hours == 1) {
+ this.options.limits.minutes = MINUTES_IN_HOUR;
+ } else {
+ this.options.limits.minutes = MINUTES_IN_DAY;
+ }
+
+ // we have to check here if visible units count cound change, if so we
+ // set initDisplay flag, so that on display the module layout will be checked
+ // (this is important for suspend/resume cases - now we do not force initDisplay
+ // on each resume - for the sake of performance, but we are aware of the fact
+ // that if device is suspended for a long time, visible units count can change)
+ for(asset in this.current_values) {
+ if(asset != 'seconds' && !this.current_values[asset] != !result[asset]) {
+ this.initDisplay = true;
+ break;
+ }
+ }
+
+ return result;
+
+ // Helper functions
+ function dateToObject(date) {
+ return {
+ year : date.getUTCFullYear(),
+ month : date.getUTCMonth() + 1,
+ day : date.getUTCDate(),
+ hours : date.getUTCHours(),
+ minutes : date.getUTCMinutes(),
+ seconds : date.getUTCSeconds()
+ }
+ }
+ function daysInThisMonth(year, month) {
+ // js Date implements 0-based months (0-11), we need next month for current
+ // calculation, so passing 1-based month will do the trick, except DEC (12) -
+ // we convert it to month 0 of the next year
+ if(month == 12) {
+ year++;
+ month = 0;
+ }
+ // day 0 means the last hour of previous day, so we get here the date
+ // of the last day of month-1
+ return new Date(Date.UTC(year, month, 0)).getUTCDate();
+ }
+ function daysInPrevMonth(year, month) {
+ month = month - 2; // -1 for JS Date month notaion (0-11) - 1 for previous month
+ if(month < 0) {
+ year--;
+ }
+ return new Date(Date.UTC(year, month + 1, 0)).getUTCDate();
+ }
+ },
+ updateCounter : function(new_values, mode_changed) {
+ if(mode_changed === true) {
+ // reset all digits and elements, so that they are recreated
+ // for new animation (down/up modes can use different animations)
+ $('#' + this.options.id + ' .scd-digit').remove();
+ this.elements = {};
+ }
+
+ this.display(new_values, mode_changed);
+ this.displayTexts(); // *** this call is required only on mode down/up change
+ // e.g. texts are dirty
+ },
+ display : function(new_values, mode_changed) {
+ var prev, next;
+ if(typeof this.current_values.seconds === 'undefined') {
+ // first hard init case. Make this logic better!!! ***
+ this.initDisplay = true;
+ this.current_values = new_values;
+ }
+ // in initDisplay mode we have to abort all running and queued animations
+ if(this.initDisplay) {
+ for(key in this.animation_timers) {
+ window.clearTimeout(this.animation_timers[key]);
+ }
+ this.animation_timers = {};
+ }
+ prev = this.current_values;
+ next = new_values;
+
+ // Update counter output
+ var i, self = this, updateUnitsWidth = false;
+ $.each(this.options.units, function(asset, display) {
+ if(display == 0 || (!self.initDisplay && !mode_changed && next[asset] == prev[asset])) {
+ return; // no display or unit has not changed - continue loop
+ }
+ // only update on init or if the value actually changed
+ if(self.updateCounterUnit(asset, prev[asset], next[asset], self.initDisplay) === true) {
+ // if number of digits displayed has changed for a counter unit,
+ // updateCounterUnit() will return true
+ updateUnitsWidth = true;
+ }
+ });
+
+ // Update digits width if required
+ if(updateUnitsWidth) {
+ this.setRowVerticalAlign();
+ this.responsiveAdjust();
+ }
+
+ if(this.initDisplay ||
+ (this.options.mode == 'down' && next.seconds == this.options.limits.seconds - 1) ||
+ (this.options.mode == 'up' && next.seconds == 0)) {
+ this.setCounterUnitsVisibility(next);
+ }
+
+ this.initDisplay = false;
+
+ this.current_values = new_values;
+ },
+ displayTexts : function() {
+ if(this.options.mode == 'up') {
+ $('#' + this.options.id + '-title-before').html(this.options.title_before_up);
+ $('#' + this.options.id + '-title-after').html(this.options.title_after_up);
+ } else {
+ $('#' + this.options.id + '-title-before').html(this.options.title_before_down);
+ $('#' + this.options.id + '-title-after').html(this.options.title_after_down);
+ }
+ },
+ /**
+ * Update counter unit - digits and label
+ */
+ updateCounterUnit : function(asset, old_value, new_value, initDisplay) {
+ old_value = this.padLeft(old_value, this.options.paddings[asset]);
+ new_value = this.padLeft(new_value, this.options.paddings[asset]);
+
+ $('#' + this.options.id + '-' + asset + '-label').text(this.getLabel(asset, new_value));
+
+ var wrapper = $('#' + this.options.id + '-' + asset + '-digits'), count = wrapper.children('.scd-digit').length;
+ var updateDigitsWidth = false, new_digits;
+
+ if(new_value.length != count) {
+ new_digits = this.updateDigitsCount(asset, count, old_value, new_value, wrapper);
+ old_value = new_digits.old_value;
+ new_value = new_digits.new_value;
+ updateDigitsWidth = true;
+ }
+
+ // we have to split the values by digits to check which one actually must
+ // be updated
+ var values = {
+ 'prev' : old_value.split(''),
+ 'next' : new_value.split('')
+ };
+
+ for(i = 0; i < values['next'].length; i++) {
+ if(values['prev'][i] != values['next'][i] || initDisplay) {
+ // pass both old and new digit value, also scalar new unit value for
+ // margin digits calculation basing on current counter display options
+ // and the unit in question (asset parameter)
+ this.updateCounterDigit(asset, $(wrapper).children('.scd-digit').eq(i), values['next'].length - i - 1, values['prev'][i], values['next'][i], old_value, new_value, initDisplay);
+ }
+ }
+
+ return updateDigitsWidth;
+ },
+ // left pad with zero helper
+ padLeft : function(value, len) {
+ value = value + '';
+ if(value.length < len) {
+ value = Array(len + 1 - value.length).join('0') + value;
+ }
+ return value;
+ },
+
+ updateDigitsCount : function(asset, current_count, old_value, new_value, wrapper) {
+ var i;
+ if(new_value.length < current_count) {
+ // remove unused high digit(s)
+ for(i = current_count - 1; i >= new_value.length; i--) {
+ delete(this.elements[asset + i]);
+ wrapper.children('.scd-digit').first().remove();
+ }
+ old_value = old_value.slice(old_value.length - new_value.length);
+ return { old_value : old_value, new_value : new_value };
+ } else {
+ // initialize digits or add missing high digit(s)
+ var new_digit, guess_prev_value, config_index, config;
+
+ // we have to prepend new digits starting from the lower one
+ var digits_to_add = new_value.slice(0, new_value.length - current_count);
+ // reverse digits
+ digits_to_add = digits_to_add.split('').reverse().join('');
+ // pad old value to the same length as new value
+ old_value = this.padLeft(old_value, new_value.length);
+
+ // we must reverse old digits to get correct prev values
+ var digits_from = old_value.slice(0, old_value.length - current_count);
+ digits_from = digits_from.split('').reverse().join('');
+
+ for(i = 0; i < digits_to_add.length; i++) {
+ new_digit = $('
');
+ wrapper.prepend(new_digit);
+ // in init mode we use old_value as previous digit value, otherwise we are
+ // processing a "digits count changed" case, so we assume that previous
+ // digit value is always "0" (as if the old value were padded by zeros)
+ guess_prev_value = current_count == 0 ? digits_from[i] : '0';
+
+ // When adding a new digit we look for custom digit configuration. Custom digit positions must be expressed
+ // in asset+index form (less index = lower digit) but should be used with caution because the number of digits in
+ // real counters may differ due to options.unts setting
+ config_index = asset + (i + current_count);
+ config = typeof this.options.animations.digits[config_index] === 'undefined' ? this.options.animations.digits['*'] : this.options.animations.digits[config_index];
+
+ this.setElements(new_digit, { 'prev' : guess_prev_value, 'next' : digits_to_add[i] }, asset + (i + current_count), config);
+ }
+ return { old_value : old_value, new_value : new_value };
+ }
+ },
+ /**
+ * Method to actually update a counter digit. All digit transition and animation must be
+ * performed here.
+ */
+ updateCounterDigit : function(asset, wrapper, index, old_digit, new_digit, old_unit_value, new_unit_value, initDisplay) {
+ var hash_prefix = asset + index;
+
+ var values = {
+ 'prev' : old_digit,
+ 'next' : new_digit
+ }
+ // test-only not a bullet-proof guess! ***
+ if(this.options.animations.uses_margin_values == 1) {
+ if(this.options.mode == 'down') {
+ values['pre-prev'] = this.guessIncrValue(asset, index, old_digit, old_unit_value);
+ values['post-next'] = this.guessDecrValue(asset, index, new_digit, new_unit_value);
+ } else {
+ values['pre-prev'] = this.guessDecrValue(asset, index, old_digit, old_unit_value);
+ values['post-next'] = this.guessIncrValue(asset, index, new_digit, new_unit_value);
+ }
+ if(initDisplay) {
+ // on init "next" and "prev" are equal (this is a design flaw)
+ // calculated "pre-prev" will never be visible, so we can use it
+ // as simple "prev" (*** WORKAROUND, not beautiful at all...)
+ values['prev'] = values['pre-prev'];
+ }
+ }
+
+ var config_index = asset + index;
+ var config = typeof this.options.animations.digits[config_index] === 'undefined' ? this.options.animations.digits['*'] : this.options.animations.digits[config_index];
+ var groups = config[this.options.mode];
+
+ if(initDisplay) {
+ this.setElements(wrapper, values, hash_prefix, config);
+ }
+ if(values.prev != values.next) {
+ // only proceed with animation if the values differ
+ this.animateElements(values, hash_prefix, groups);
+ }
+ },
+ guessIncrValue : function(asset, index, digit_value, unit_value) {
+ var limit = this.guessDigitLimit(asset, index, digit_value, unit_value);
+ if(++digit_value > limit) {
+ digit_value = 0;
+ }
+ return digit_value;
+ },
+ guessDecrValue : function(asset, index, digit_value, unit_value) {
+ var limit = this.guessDigitLimit(asset, index, digit_value, unit_value);
+ if(--digit_value < 0) {
+ digit_value = limit;
+ }
+ return digit_value;
+ },
+ guessDigitLimit : function(asset, index, digit_value, unit_value) {
+ var limit = 9;
+ if(asset == 'seconds') {
+ if(this.options.units['minutes'] == 1) {
+ if(index != 0) {
+ limit = 5
+ }
+ }
+ } else if(asset == 'minutes') {
+ if(this.options.units['hours'] == 1) {
+ if(index != 0) {
+ limit = 5
+ }
+ }
+ } else if(asset == 'hours' && this.options.units['days'] == 1) {
+ if(index == 1) {
+ limit = 2;
+ } else if(index == 0 && unit_value >= 20) {
+ limit = 3;
+ }
+ }
+ return limit;
+ },
+
+ setElements : function(wrapper, values, prefix, config) {
+ wrapper.empty();
+ this.elements[prefix] = {};
+
+ wrapper.css(config.style);
+ var groups = config[this.options.mode];
+
+ var i, group;
+ for(i = 0; i < groups.length; i++) {
+ group = groups[i];
+ var els = group.elements, j, el, $el, hash;
+ for(j = 0; j < els.length; j++) {
+ el = els[j];
+ hash = this.getElementHash(el);
+ $el = this.createElement(el, values);
+
+ if(el.content_type == 'static-bg') {
+ $el.attr('src', this.options.animations.images_folder + el.filename_base + el.filename_ext);
+ }
+
+ // we have to add created element to collection by unique hash,
+ // so that element duplicates are not appended to wrapper, but can
+ // be referenced without ambiguity when we prodeed with animations
+ // *** store only first unique occurrence
+ if(typeof this.elements[prefix][hash] === 'undefined') {
+ this.elements[prefix][hash] = $el;
+ }
+ }
+ }
+
+ $.each(this.elements[prefix], function(hash, el) {
+ wrapper.append(el);
+ });
+ },
+
+ animateElements : function(values, prefix, groups) {
+ var i, group;
+
+ for(i = 0; i < groups.length; i++) {
+ group = groups[i];
+ var j, el, $el, value;
+ for(j = 0; j < group.elements.length; j++) {
+ el = group.elements[j];
+
+ if(el.content_type == 'static-bg') {
+ // no animation for static background
+ continue;
+ }
+
+ $el = this.elements[prefix][this.getElementHash(el)];
+
+ // resore original style(s) for all elements before we start the real animation
+ $el.css(el.styles);
+ }
+ }
+
+ // animate first group, next group animation (if any) will be launched after the
+ // previous group's animation is finished
+ this.animateGroup(values, 0, prefix, groups);
+ },
+ animateGroup : function(values, group_index, prefix, groups) {
+ if(group_index >= groups.length) {
+ return;
+ }
+ var i, group = groups[group_index], el, $el, styles, self = this;
+ var duration = this.initDisplay ? 0 : +group.duration; // in initDisplay mode we make all animations instant, i.e. duration = 0
+ var transition = group.transition;
+ var elements_count = group.elements.length, cur_element_index = 0, group_processed = false;
+
+ for(i = 0; i < group.elements.length; i++) {
+ // get stored element
+ el = group.elements[i];
+
+ if(el.content_type == 'static-bg') {
+ // no animation for static background
+ elements_count--; // the element is not included in group for
+ // animation, adjust elements_count, so that we can detect
+ // when all elements in group are processed
+ continue;
+ }
+
+ $el = this.elements[prefix][this.getElementHash(el)];
+
+ // apply tween.from styles
+ $el.css(el.tweens.from);
+
+ value = el.content_type == 'uni-img' ? '' : values[el.value_type];
+ if(el.content_type == 'txt') {
+ $el.text(value);
+ } else {
+ var src = this.options.animations.images_folder + el.filename_base + value + el.filename_ext;
+ $el.attr('src', src);
+ }
+
+ // We are sure that at least 1 element qualified for animation was found in the group
+ group_processed = true;
+
+ if(el.tweens.to.length === 0) { // objects have length undefined, so only empty array
+ // will pass this condition
+ // if tweens are empty we have to simulate animation duration. Of course,
+ // it is possible to use a "trivial" tween hack, e.g.
100,100,
+ // but using native setTimeout() shoud be better.
+ if(duration > 0) {
+ // even timeout zero causes animations on init, so if group duration = 0
+ // we increment cur_element_index directly and proceed to next group if
+ // required. Store timeout system id, so that it can be cleared explicitly
+ // in "initDisplay" mode
+ this.animation_timers[prefix + group_index] = window.setTimeout(function() {
+ cur_element_index++;
+ if(cur_element_index >= elements_count) {
+ self.animateGroup(values, group_index + 1, prefix, groups);
+ }
+ }, duration);
+ } else {
+ cur_element_index++;
+ if(cur_element_index >= elements_count) {
+ this.animateGroup(values, group_index + 1, prefix, groups);
+ }
+ }
+ } else {
+ // we have tweens defined. Proceed with animation. Stop running animation - prevent
+ // animations mess up on tab switch back and resume in some browsers
+ $el.velocity('stop');
+
+ // actually start animation
+ $el.velocity(el.tweens.to, duration, transition, function() {
+ cur_element_index++;
+ if(cur_element_index >= elements_count) {
+ self.animateGroup(values, group_index + 1, prefix, groups);
+ }
+ });
+ }
+ }
+
+ if(!group_processed) {
+ // empty group or a group containing only 'static-bg' elements.
+ // In some animations this kind of a group serves as a pause in animations queue
+ // Store timeout system id, so that it can be cleared explicitly
+ // in "initDisplay" mode
+ this.animation_timers[prefix + group_index] = window.setTimeout(function() {
+ self.animateGroup(values, group_index + 1, prefix, groups);
+ }, duration);
+ }
+ },
+ getElementHash : function(el) {
+ return [el.content_type, el.value_type, el.filename_base, el.filename_ext].join('::');
+ },
+ /*
+ * Create DOM element using jQuery, basing on "el" object properties (content_type, tag, etc...)
+ */
+ createElement : function(el, values) {
+ var $el;
+ if(el.content_type == 'txt') {
+ $el = $('<' + el.tag + '/>');
+ $el.text(values[el.value_type]);
+ } else {
+ var value = el.content_type == 'img' ? values[el.value_type] : '', src;
+ src = this.options.animations.images_folder + el.filename_base + value + el.filename_ext;
+
+ $el = $('<' + el.tag + '/>');
+ $el.attr('src', src);
+ }
+ $el.css(el.styles);
+ return $el;
+ },
+ getLabel : function(asset, value) {
+ var labels = {
+ years : 'Y',
+ months : 'M',
+ weeks : 'W',
+ days : 'D',
+ hours : 'H',
+ minutes : 'Min',
+ seconds : 'Sec'
+ };
+
+ var suffix = smartcountdown_plural(value);
+ return this.options.label_strings[asset + suffix] || labels[asset];
+ },
+ /**
+ * Set counter units visibility according to units display configuration and counter values.
+ * Related settings:
+ * - allow_all_zeros: show zero in the lowest counter unit, if not allowed, the unit with zero
+ * value will be replaced by a lower non-zero unit and later replaced with original unit once
+ * its value is grater than zero
+ * - hide_highest_zeros: hide highest counter units until a non-zero unit is found, even if these
+ * high units are set up as "displayed" in units configuration
+ */
+ setCounterUnitsVisibility : function(new_values) {
+ // restore original hide_lower_units from configuration
+ var hide_units = $.extend([], this.options.hide_lower_units);
+ var i, assets = ['years', 'months', 'weeks', 'days', 'hours', 'minutes', 'seconds'];
+
+ // allow_all_zeros feature
+ if(this.options.allow_all_zeros == 0 && $.inArray('seconds', hide_units) != -1) {
+ var index;
+ var lowest_displayed_unit = -1, is_non_zero = 0;
+ for(i = 0; i < assets.length; i++) {
+ index = $.inArray(assets[i], hide_units);
+ if(index == -1) {
+ is_non_zero = is_non_zero + (new_values[assets[i]] || 0);
+ lowest_displayed_unit = i;
+ }
+ }
+ // only apply "allow_all_zeros disabled" effect if all displayed counter units are zeros
+ if(!is_non_zero && lowest_displayed_unit >= 0 && new_values[assets[lowest_displayed_unit]] == 0) {
+ for(i = lowest_displayed_unit; i < assets.length; i++) {
+ if(new_values[assets[i]] > 0 || assets[i] == 'seconds') {
+ index = $.inArray(assets[i], hide_units);
+ if(index > -1) {
+ hide_units.splice(index, 1);
+ // replace unit with zero values with a non-zero lower one
+ if(this.options.replace_lowest_zero == 1) {
+ hide_units.push(assets[lowest_displayed_unit]);
+ }
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ // hide_highest_zeros feature
+ // 0 - disable feature
+ // 1 - hide highest zeros only
+ // 2 - hide all zeros (except seconds)
+ if(this.options.hide_highest_zeros == 2) {
+ // hide all zeros
+ for(i = 0; i < assets.length; i++) {
+ if(this.options.units[assets[i]] == 0) {
+ continue;
+ }
+ if((new_values[assets[i]] || 0) == 0) {
+ if($.inArray(assets[i], hide_units) == -1) {
+ hide_units.push(assets[i]);
+ }
+ }
+ }
+ } else if(this.options.hide_highest_zeros == 1) {
+ // hide highest only (default)
+ var lowest_displayed_unit = -1;
+ for(i = 0; i < assets.length; i++) {
+ if(this.options.units[assets[i]] == 0) {
+ continue;
+ }
+ lowest_displayed_unit = i;
+ if((new_values[assets[i]] || 0) == 0) {
+ if($.inArray(assets[i], hide_units) == -1) {
+ hide_units.push(assets[i]);
+ }
+ } else {
+ break;
+ }
+ }
+
+ // if lowest zero unit found, remove it from hide_units
+ if(lowest_displayed_unit > -1 && new_values[assets[lowest_displayed_unit]] == 0) {
+ hide_units.splice(lowest_displayed_unit, 1);
+ }
+ }
+
+ // make sure that we have at least one visible unit - some configurations
+ // (e.g. allow_all_zeros=1 && hide_highest_zeros=1) may result in "all units
+ // selected for display in module settings are hidden" effect
+ var visible_unit_found = false;
+ $.each(this.options.units, function(asset, display) {
+ if(display && $.inArray(asset, hide_units) == -1) {
+ visible_unit_found = true;
+ return false; // break the loop
+ }
+ });
+ // no visible units, show the lowest one
+ if(!visible_unit_found) {
+ hide_units.pop();
+ }
+
+ // optimize performance: only call responsiveAdjust of counter
+ // layout actually changes
+ var unitsChanged = false;
+
+ // apply calculated hide_units configuration
+ var self = this;
+ $.each(this.options.units, function(asset, display) {
+ var unit_wrapper = $('#' + self.options.id + '-' + asset);
+ if(display == 1 && $.inArray(asset, hide_units) == -1) {
+ if(!unit_wrapper.is(':visible')) {
+ // hidden => visible
+ unitsChanged = true;
+ }
+ unit_wrapper.show();
+ } else {
+ if(unit_wrapper.is(':visible')) {
+ // visible => hidden
+ unitsChanged = true;
+ }
+ unit_wrapper.hide();
+ }
+ });
+
+ if(unitsChanged) {
+ // only apply responsive if counter units set has changed
+ this.setRowVerticalAlign();
+ this.responsiveAdjust();
+ }
+
+ var counter_container = this.options.counter_container;
+
+ // For count up mode we implement an option to completely hide
+ // counter digits block after the event time is reached
+ if(this.options.mode == 'up') {
+ if(this.options.hide_countup_counter == 1) {
+ counter_container.find('.scd-counter').hide();
+ counter_container.show();
+ } else {
+ counter_container.find('.scd-counter').show();
+ }
+ } else {
+ // in "down" mode we always show counter block. The whole
+ // module will be hidden if required in applyCounterLimits()
+ counter_container.find('.scd-counter').show();
+ }
+ },
+
+ applyCounterLimits : function() {
+ // show module before/after event limits
+ if(this.options.mode == 'down') {
+ if(this.options.countdown_limit >= 0 && this.diff >= this.options.countdown_limit * MILLIS_IN_SECOND) {
+ this.options.counter_container.hide();
+ } else {
+ this.options.counter_container.show();
+ }
+
+ // New feature: countdown_query_limit for support complex events overlapping
+ if(this.options.countdown_query_limit > 0 && this.diff < this.options.countdown_query_limit * MILLIS_IN_SECOND) {
+ this.queryNextEvent();
+ this.options.countup_limit = -1;
+ }
+ }
+ if(this.options.mode == 'up') {
+ if(this.options.countup_limit >= 0 && this.diff >= this.options.countup_limit * MILLIS_IN_SECOND) {
+ this.queryNextEvent();
+
+ // disable countup limit temporarly, so that no more queryNextEvent() are
+ // done. Correct countup limit will be set when the event request is done.
+ // *** we do countup limit reset after calling queryNextEvent(), so that
+ // actual limit value can be used inside queryNextEvent() method. Anyway,
+ // resetting countup limit here will guarantee that no more queries will
+ // be done while current one is in progress
+ this.options.countup_limit = -1;
+ }
+ }
+ },
+
+ /*
+ * TODO: check if we can optimize calls to this method. For now it is called twice
+ * in some cases. This is not a big problem - the function is quite fast and at most
+ * called each minute, but for the sake of code cleanness...
+ */
+ setRowVerticalAlign : function() {
+ // calculate labels maximum width(s) for all singular/plural forms
+ if(typeof this.label_min_widths === 'undefined') {
+ // widths are calculated in em, so it has to be done only once
+ if(this.updateMinLabelsWidth() === false) {
+ // updateMinLabelsWidth failed, e.g. no visible labels - do nothing
+ return;
+ }
+ }
+
+ // align digits - for counter column layout only
+ var digits = $('#' + this.options.id + ' .scd-unit-vert .scd-digits-row:visible');
+ if(digits.length > 0) {
+ var maxWidth = 0, width;
+ digits.css('min-width', '');
+ digits.each(function() {
+ width = $(this).width();
+ if(width > maxWidth) {
+ maxWidth = width;
+ }
+ });
+ digits.css('min-width', maxWidth);
+ }
+
+ // Labels min-widths are expressed in 'em'.
+
+ // all row labels for vertical counter layout must have the same min-width =
+ // maximum width of all labels/all forms
+ var labels = $('#' + this.options.id + ' .scd-unit-vert .scd-label-row:visible');
+ labels.css('min-width', this.labels_max_width + 'em');
+
+ // for horizontal counter layout we set:
+ // - column labels: to maximum width of all labels/all forms
+ // - row labels: to maximum width of all forms for this label only
+ labels = $('#' + this.options.id + ' .scd-unit-horz .scd-label:visible');
+ if(labels.length > 0) {
+ var self = this;
+ labels.each(function() {
+ var $this = $(this);
+ width = $this.width();
+ if($this.hasClass('scd-label-col')) {
+ // same width for all
+ $this.css('min-width', self.labels_max_width + 'em');
+ } else {
+ // maximum width for this label (singular/plural forms)
+ $this.css('min-width', self.label_min_widths[$this.attr('id')] + 'em');
+ }
+ });
+ }
+ this.setLabelsPosition();
+ },
+
+ updateMinLabelsWidth : function() {
+ // use the fisrt visible label as test element for measuring. This method is called only once per
+ // script life-time and on early stage, so we can rely on visible pseudo-selector: counter visibilty
+ // is not updated yet, so all labels are visible. This can be a design flaw if program logic changes
+ var test_label = $('#' + this.options.id + ' .scd-label:visible').first(), unit, label_id, width, max_width = 0;
+ if(test_label.length == 0) {
+ // panic
+ return false;
+ }
+ // backup existing text
+ var the_text = test_label.text();
+ // reset measurement
+ test_label.css('min-width', '');
+ this.label_min_widths = {};
+ // loop through all label strings injected in js script
+ for(label_key in this.options.label_strings) {
+ // get unit name for object key
+ unit = label_key.split('_', 1)[0];
+ if(!unit) {
+ unit = label_key;
+ }
+ // constuct label id - it will be used as label_min_widths key and for fast
+ // access to label attributes
+ label_id = this.options.id + '-' + unit + '-label';
+
+ if(typeof this.label_min_widths[label_id] === 'undefined') {
+ // on first iteration initialize the value
+ this.label_min_widths[label_id] = 0;
+ }
+ // set test label text
+ test_label.text(this.options.label_strings[label_key]);
+ // do the measurement in 'em' based on labels size
+ width = test_label.width() / this.options.labels_size;
+ // update unit maximum
+ if(this.label_min_widths[label_id] < width) {
+ this.label_min_widths[label_id] = width;
+ }
+ // keep track of the maximum-for-all width
+ if(max_width < width) {
+ max_width = width;
+ }
+ // all widths are expressed in em, but stored as float numbers -
+ // make sure we append 'em' to these values when applying as css
+ }
+ // store maximum-for-all width
+ this.labels_max_width = max_width;
+ // clean up - restore original text of the test label
+ test_label.text(the_text);
+ },
+
+ // update labels vertical position for left or right labels placement
+ setLabelsPosition : function() {
+ // reset position for column lables
+ $('#' + this.options.id + ' .scd-label-col:visible').css('position', '');
+
+ // adjust labels position if neeed (if vertical label position is set)
+ var labels = $('#' + this.options.id + ' .scd-label-row:visible');
+ if(labels.length > 0) {
+ var digitsDiv, digitsHeight, labelHeight, top, self = this;
+ labels.each(function() {
+ var $this = $(this);
+ digitsDiv = $this.siblings('.scd-digits-row');
+ digitsHeight = digitsDiv.height();
+ labelHeight = $this.height();
+
+ // check if digits and label are horizontally overlapping
+ var a = digitsDiv[0].getBoundingClientRect();
+ var b = this.getBoundingClientRect();
+ if(!( // we allow adjacent divs
+ b.left > a.right ||
+ b.right < a.left ||
+ b.top > a.bottom ||
+ b.bottom < a.top
+ )) {
+ $this.css('position', '');
+ $this.css('top', '');
+ return true; // continue iteration
+ }
+ // continue with position (normal flow)
+ $this.css('position', 'relative');
+ switch(self.options.labels_vert_align) {
+ case 'top' :
+ top = 0;
+ break;
+ case 'bottom' :
+ top = digitsHeight - labelHeight;
+ break;
+ case 'high' :
+ top = labelHeight * 0.5;
+ break;
+ case 'low' :
+ top = digitsHeight - labelHeight * 1.5;
+ break;
+ case 'superscript' :
+ top = labelHeight * -0.5;
+ break;
+ case 'subscript' :
+ top = digitsHeight - labelHeight / 2;
+ break;
+ default: // middle
+ top = digitsHeight / 2 - labelHeight / 2;
+ }
+ $this.css('top', top);
+ });
+ }
+ },
+
+ resetAlignments : function(counter_container) {
+ counter_container.find('.scd-label').css({ position : '', top : '' });
+ counter_container.find('.scd-label, .scd-digits').css('min-width', '');
+ },
+
+ responsiveAdjust : function(/*width*/) {
+ var responsive = this.options.responsive;
+ var counter_container = $('#' + this.options.id), i, scale = 1.0, self = this;
+
+ // page layout changes during responsive adjust procedure and in some browsers
+ // can cause accidental scroll to window top. We fix the height of the module
+ // as a workaround. Later we reset fixed height - IMPORTANT: height rule in
+ // module style(s) setting will be discarded. Check if this is an important limitation...
+
+ var height = counter_container.height();
+ counter_container.css('height', height);
+
+ if(responsive && responsive.length > 0) {
+ // responsive behavior
+
+ // we have to reset all existing labels and digits alignment before proceeding with
+ // responsive adjust
+ this.resetAlignments(counter_container);
+
+ // reset container font before starting measurments
+ counter_container.css('font-size', this.options.base_font_size + 'px');
+
+ // restore original layout before measurement
+ var scale_preset = responsive[responsive.length - 1];
+ this.applyLayout(counter_container, scale_preset.alt_classes);
+
+ // update layout for new font size for correct measurement
+ this.setRowVerticalAlign();
+
+ // check if horizontal-layout units wrap
+ var is_wrapping = this.checkWrapping(counter_container.find('.scd-unit-horz:visible, .scd-title-row'));
+
+ if(is_wrapping.wrapped_width > 0) {
+ var container_width = counter_container.width();
+ var required_width = is_wrapping.row_width + is_wrapping.wrapped_width + SCD_SAFE_ADJUST_PX;
+
+ scale = container_width / required_width;
+ }
+
+ // check extreme case - wrapping digits in unit, do not allow this
+ var digit_groups = counter_container.find('.scd-digits:visible'), is_wrapped = false;
+ digit_groups.each(function() {
+ var $this = $(this);
+ var is_wrapping = self.checkWrapping($this.find('.scd-digit'));
+
+ if(is_wrapping.wrapped_width > 0) {
+ var container_width = $this.width();
+ var required_width = is_wrapping.row_width + is_wrapping.wrapped_width + SCD_SAFE_ADJUST_PX;
+
+ var this_scale = container_width / required_width;
+ // only update current effective scale if we get a lower value here
+ if(this_scale < scale) {
+ scale = this_scale;
+ }
+ is_wrapped = true;
+ }
+ });
+
+ // we have suggested scale at this point
+ // Look at scale alternative layouts in responsive settings
+
+ // IMPORTANT: scale nodes must be sorted ascending, otherwise responsive behavior will be
+ // unpredictable
+ for(i = 0; i < responsive.length; i++) {
+ var scale_preset = responsive[i];
+ if(scale <= scale_preset.scale) {
+ // apply additional classes (if any)
+ this.applyLayout(counter_container, scale_preset.alt_classes);
+
+ // we are done - no need to continue looping
+ break;
+ }
+ }
+ // we have alternative layout applied
+
+ // prepare to repeat measurement with updated layout - reset base font
+ scale = 1.0;
+ counter_container.css('font-size', this.options.base_font_size + 'px');
+
+ // realign labels and measure units (for column layouts)
+ this.setRowVerticalAlign();
+
+ // check if horizontal-layout units wrap
+ var is_wrapping = this.checkWrapping(counter_container.find('.scd-unit-horz:visible, .scd-title-row'));
+
+ if(is_wrapping.wrapped_width > 0) {
+ var container_width = counter_container.width();
+ var required_width = is_wrapping.row_width + is_wrapping.wrapped_width + SCD_SAFE_ADJUST_PX;
+
+ scale = container_width / required_width;
+ counter_container.css('font-size', (this.options.base_font_size * scale) + 'px');
+
+ // update layout for new base font size
+ this.setRowVerticalAlign();
+ }
+ } else {
+ // prepare for next measurement if responsive feature is disabled
+ counter_container.css('font-size', this.options.base_font_size + 'px');
+ }
+
+ // even if responsive feature is disabled we always check for digits wrapping and
+ // scale the module so that all digits in units are placed on the same line
+ var digit_groups = counter_container.find('.scd-digits:visible'), is_wrapped = false;
+
+ digit_groups.each(function() {
+ var $this = $(this);
+ var is_wrapping = self.checkWrapping($this.find('.scd-digit'));
+
+ if(is_wrapping.wrapped_width > 0) {
+ var container_width = $this.width();
+ var required_width = is_wrapping.row_width + is_wrapping.wrapped_width + SCD_SAFE_ADJUST_PX;
+
+ var this_scale = container_width / required_width;
+ // only update current effective scale if we get a lower value here
+ if(this_scale < scale) {
+ scale = this_scale;
+ }
+ is_wrapped = true;
+ }
+ });
+
+ if(is_wrapped) {
+ // apply new calulated scale
+ counter_container.css('font-size', (this.options.base_font_size * scale) + 'px');
+ }
+ // update layout for new base font size
+ this.setRowVerticalAlign();
+
+ // reset fixed height (accidental scroll workaround)
+ counter_container.css('height', '');
+ },
+
+ checkWrapping : function(units) {
+ var row_width = 0, wrapped_width = 0, top = null;
+ units.each(function() {
+ var $this = $(this), unit_position = $this.position();
+ if(top === null) {
+ top = unit_position.top;
+ }
+ if(top != unit_position.top) {
+ wrapped_width += $this.outerWidth(true);
+ } else {
+ row_width += $this.outerWidth(true);
+ }
+ });
+ return {
+ row_width : row_width, // top row width (non-wrapped units)
+ wrapped_width : wrapped_width // all other rows (wrapped units)
+ };
+ },
+
+ applyLayout : function(counter_container, alt_classes) {
+ if(alt_classes.length > 0) {
+ $.each(alt_classes, function(index, classes) {
+ if($.isArray(classes)) {
+ $.each(classes, function(ci, c) {
+ counter_container.find(c.selector).removeClass(c.remove).addClass(c.add);
+ });
+ } else {
+ counter_container.find(classes.selector).removeClass(classes.remove).addClass(classes.add);
+ }
+ });
+ }
+ },
+
+ applyCounterClickable : function(is_countdown_to_end) {
+ // if the counter is clickable, set the handler
+ if(this.options.click_url != '') {
+ if(this.options.counter_clickable == 1 ||
+ (this.options.counter_clickable == 2 && this.options.mode == 'down') ||
+ (this.options.counter_clickable == 3 && (this.options.mode == 'up' || is_countdown_to_end == 1))
+ ) {
+ this.options.counter_container.css('cursor', 'pointer');
+ this.options.counter_container.off('click');
+ var self = this;
+ this.options.counter_container.on('click', function() {
+ self.doRedirect(self.options.click_url, true);
+ });
+
+ // counter is clickable. We are done
+ return;
+ }
+ }
+ // we get to this point only if one of the conditions or making counter
+ // clickable was not met. Disable counter link (click functionality)
+ this.options.counter_container.css('cursor', 'default');
+ this.options.counter_container.off('click');
+ },
+
+ doRedirect : function(url, new_window) {
+ var confirmed;
+ if(this.options.confirm_redirect == 1 && !new_window) {
+ // we try to guess if there are partially filled-in forms on the page:
+ // - discard hidden inputs
+ // - discard checkboxes
+ var inputs = $('form input, form textarea, form select').not(':checkbox').not(':hidden');
+ if(!!inputs.filter(function() {
+ return $(this).val();
+ }).length) {
+ // user might lose data entered, ask permission
+ confirmed = confirm(Joomla.JText._('MOD_SMARTCOUNTDOWN3_REDIRECT_CONFIRM_HINT'));
+ } else {
+ // no form data found
+ confirmed = true;
+ }
+ } else {
+ // "confirm redirect" not enabled - implicit redirect permission
+ confirmed = true;
+ }
+ if(confirmed) {
+ if(new_window) {
+ window.open(url, '_blank');
+ } else {
+ window.location = url;
+ }
+ } else {
+ // return false to indicate that the user refused redirection. Sometimes we
+ // must show the module (in most cases the module is hidden just before starting
+ // redirection to avoid wrong display during page refresh).
+ return false;
+ }
+ },
+
+ queryNextEvent : function(isNew) {
+ var self = this;
+
+ // show spinner
+ $('#' + self.options.id + '-loading').show();
+
+ $('#' + self.options.id + ' .scd-all-wrapper').hide();
+
+ var queryData = {
+ option : 'com_smartcountdown3',
+ task : 'event.getevent',
+ scd_module_id : this.options.module_id,
+ format : 'json',
+ prevent_cache : new Date().getTime()
+ };
+
+ $.getJSON(
+ this.options.ajaxurl,
+ queryData,
+ function(response) {
+ // hide spinner
+ $('#' + self.options.id + '-loading').hide();
+
+ $('#' + self.options.id + ' .scd-all-wrapper').show();
+
+ if(typeof response !== 'undefined' && response.err_code == 0) {
+ // Actually we have "self" object already initialized and
+ // setup with options
+
+ // we have to add actual "deadline" here, it
+ // should work for plain counters (caching workaround) and
+ // also for events import plugins
+
+ self.options.deadline = response.options.deadline;
+
+ // we append imported event title (if any) to counter titles
+ // or insert imported title if a placeholder found in original
+
+ // now we support plugins which provide different titles for down and up modes,
+ // e.g. if link event option is set differently for events in fiture or events
+ // in progress.
+ var imported_title_down = response.options.imported_title_down;
+ var imported_title_up = response.options.imported_title_up;
+
+ // restore original titles for down mode (could be replaced during coutner life with
+ // countdown-to-end titles
+ self.options.title_before_down = self.options.original_title_before_down;
+ self.options.title_after_down = self.options.original_title_after_down;
+
+ if(typeof imported_title_down !== 'undefined') {
+ if(self.options.original_title_after_down != '' && self.options.original_title_after_down.indexOf('%imported%') != -1) {
+ // replace placeholder with imported title
+ self.options.title_after_down = self.options.original_title_after_down.replace('%imported%', imported_title_down);
+ } else if(self.options.original_title_before_down != '') { // only modify title before if imported title was not already inserted
+ if(self.options.original_title_before_down.indexOf('%imported%') != -1) {
+ // replace placeholder with imported title
+ self.options.title_before_down = self.options.original_title_before_down.replace('%imported%', imported_title_down);
+ } else {
+ // no placeholder - append imported title
+ self.options.title_before_down = self.options.original_title_before_down + ' ' + imported_title_down;
+ }
+ } else {
+ // generic title empty - use imported title as is
+ self.options.title_before_down = imported_title_down;
+ }
+ } else {
+ // just in case - remove "imported" placeholders
+ self.options.title_before_down = self.options.original_title_before_down.replace('%imported%', '');
+ self.options.title_after_down = self.options.original_title_after_down.replace('%imported%', '');
+ }
+
+ if(typeof imported_title_up !== 'undefined') {
+ if(self.options.original_title_after_up != '' && self.options.original_title_after_up.indexOf('%imported%') != -1) {
+ // replace placeholder with imported title
+ self.options.title_after_up = self.options.original_title_after_up.replace('%imported%', imported_title_up);
+ } else if(self.options.original_title_before_up != '') { // only modify title before if imported title was not already inserted
+ if(self.options.original_title_before_up.indexOf('%imported%') != -1) {
+ // replace placeholder with imported title
+ self.options.title_before_up = self.options.original_title_before_up.replace('%imported%', imported_title_up);
+ } else {
+ // no placeholder - append imported title
+ self.options.title_before_up = self.options.original_title_before_up + ' ' + imported_title_up;
+ }
+ } else {
+ // generic title empty - use imported title as is
+ self.options.title_before_up = imported_title_up;
+ }
+ } else {
+ // just in case - remove "imported" placeholders
+ self.options.title_before_up = self.options.original_title_before_up.replace('%imported%', '');
+ self.options.title_after_up = self.options.original_title_after_up.replace('%imported%', '');
+ }
+
+ // some event import plugins may set is_countdown_to_end flag indicating that
+ // event date and time are actually end time for an event, so that we should display
+ // a countdown but with "up" title
+ if(response.options.is_countdown_to_end == 1) {
+ self.options.title_before_down = self.options.title_before_up;
+ self.options.title_after_down = self.options.title_after_up;
+ // in "countdown to end" mode we release countdown limit to allow
+ // mode "0:-2". We have a certain limitation here: it is not possible
+ // to configure CTE counter to appear N seconds before event end.
+ // only 2 options are supported - only show CTE mode or "auto" + CTE,
+ // i.e. "3600:-2" kind of modes are not implemented
+ self.options.countdown_limit = -1;
+ } else {
+ self.options.countdown_limit = self.options.original_countdown_limit;
+ }
+ self.options.countup_limit = response.options.countup_limit;
+ // New feature: countdown_query_limit for support complex events overlapping
+ self.options.countdown_query_limit = typeof response.options.countdown_query_limit !== 'undefined'
+ ? response.options.countdown_query_limit : -1; // for those who updated the module but didn't update the component
+
+ if(response.options.deadline == '') {
+ // no next events. TODO: display message(?), etc.
+
+ // detach counter from container - this is a definitive
+ // shut-down for this counter instance, as there are no future events
+ scds_container.remove(self.options.id);
+
+ self.options.counter_container.hide();
+ return;
+ }
+
+ // event import plugins may provide custom redirect and click URLS,
+ // if so, update those in initial module options
+ if(typeof response.options.redirect_url !== 'undefined') {
+ self.options.redirect_url = response.options.redirect_url;
+ }
+ if(typeof response.options.click_url !== 'undefined') {
+ self.options.click_url = response.options.click_url;
+ }
+
+ // convert deadline to javascript Date (compatibility with IE8)
+ self.options.deadline = new Date(self.tsFromISO(self.options.deadline)).toString();
+ scds_container.setServerTime(response.options.now);
+ self.updateCounter(self.getCounterValues());
+
+ // We have to set counter mode limits after getting new event
+ self.applyCounterLimits();
+
+ self.applyCounterClickable(response.options.is_countdown_to_end);
+
+ // module instance registration in container is
+ // required only for the first event query, switching
+ // to next event in a running instance doesn't require
+ // adding module instance to container because it is already there
+ if(isNew) {
+ scds_container.updateInstance(self.options.id, self);
+ } else if(self.options.redirect_url != '' && self.options.mode == 'up') {
+ // when the counter is running and queryNextEvent is called on
+ // deadline-reached event, the event in response might have already
+ // started (overlapping events). So we have to simulate automatic
+ // redirection on countdown zero if set so in response - this event
+ // has actually started, but its auto-redirect eas not run!
+ // We are on the safe side with redirect loop hell because on new
+ // pages this code will never fire. If you reload the page right after
+ // this implicit redirect it will not execute auto-redirect
+ self.options.counter_container.hide();
+
+ // we hide the module first, then if user doesn't confirm redirection
+ // we show the module again
+ if(self.doRedirect(self.options.redirect_url, false) === false) {
+ self.options.counter_container.show();
+ }
+ }
+
+ // We have to set units display after getting new event
+ self.setCounterUnitsVisibility(self.current_values);
+ } else if(response.err_code == 101 && response.err_msg) {
+ // 101 code are errors from event import plugins, we display them as alerts
+ alert(response.err_msg);
+ }
+ }
+ ).fail(function(jqxhr, textStatus, error) {
+ $('#' + self.options.id + '-loading').hide();
+ $('#' + self.options.id + ' .scd-all-wrapper').show();
+ //alert(textStatus + ", " + error);
+ });
+ },
+ // parse date for older browsers
+ tsFromISO : function(s) {
+ var D = new Date(s);
+ if(isNaN(D.getTime())) {
+ var day, tz,
+ rx=/^(\d{4}\-\d\d\-\d\d([tT ][\d:\.]*)?)([zZ]|([+\-])(\d\d):(\d\d))?$/,
+ p= rx.exec(s) || [];
+ if(p[1]){
+ day= p[1].split(/\D/);
+ for(var i= 0, L= day.length; i
diff --git a/deployed/smartcountdown3/modules/mod_smartcountdown3/js/vendor/index.php b/deployed/smartcountdown3/modules/mod_smartcountdown3/js/vendor/index.php
new file mode 100644
index 00000000..62200328
--- /dev/null
+++ b/deployed/smartcountdown3/modules/mod_smartcountdown3/js/vendor/index.php
@@ -0,0 +1,2 @@
+e?0:e>s.max?s.max:e)}function s(i){var s=l(),n=s._rgba=[];return i=i.toLowerCase(),f(h,function(e,a){var o,r=a.re.exec(i),h=r&&a.parse(r),l=a.space||"rgba";return h?(o=s[l](h),s[u[l].cache]=o[u[l].cache],n=s._rgba=o._rgba,!1):t}),n.length?("0,0,0,0"===n.join()&&e.extend(n,a.transparent),s):a[i]}function n(e,t,i){return i=(i+1)%1,1>6*i?e+6*(t-e)*i:1>2*i?t:2>3*i?e+6*(t-e)*(2/3-i):e}var a,o="backgroundColor borderBottomColor borderLeftColor borderRightColor borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor",r=/^([\-+])=\s*(\d+\.?\d*)/,h=[{re:/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(e){return[e[1],e[2],e[3],e[4]]}},{re:/rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(e){return[2.55*e[1],2.55*e[2],2.55*e[3],e[4]]}},{re:/#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/,parse:function(e){return[parseInt(e[1],16),parseInt(e[2],16),parseInt(e[3],16)]}},{re:/#([a-f0-9])([a-f0-9])([a-f0-9])/,parse:function(e){return[parseInt(e[1]+e[1],16),parseInt(e[2]+e[2],16),parseInt(e[3]+e[3],16)]}},{re:/hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,space:"hsla",parse:function(e){return[e[1],e[2]/100,e[3]/100,e[4]]}}],l=e.Color=function(t,i,s,n){return new e.Color.fn.parse(t,i,s,n)},u={rgba:{props:{red:{idx:0,type:"byte"},green:{idx:1,type:"byte"},blue:{idx:2,type:"byte"}}},hsla:{props:{hue:{idx:0,type:"degrees"},saturation:{idx:1,type:"percent"},lightness:{idx:2,type:"percent"}}}},d={"byte":{floor:!0,max:255},percent:{max:1},degrees:{mod:360,floor:!0}},c=l.support={},p=e("")[0],f=e.each;p.style.cssText="background-color:rgba(1,1,1,.5)",c.rgba=p.style.backgroundColor.indexOf("rgba")>-1,f(u,function(e,t){t.cache="_"+e,t.props.alpha={idx:3,type:"percent",def:1}}),l.fn=e.extend(l.prototype,{parse:function(n,o,r,h){if(n===t)return this._rgba=[null,null,null,null],this;(n.jquery||n.nodeType)&&(n=e(n).css(o),o=t);var d=this,c=e.type(n),p=this._rgba=[];return o!==t&&(n=[n,o,r,h],c="array"),"string"===c?this.parse(s(n)||a._default):"array"===c?(f(u.rgba.props,function(e,t){p[t.idx]=i(n[t.idx],t)}),this):"object"===c?(n instanceof l?f(u,function(e,t){n[t.cache]&&(d[t.cache]=n[t.cache].slice())}):f(u,function(t,s){var a=s.cache;f(s.props,function(e,t){if(!d[a]&&s.to){if("alpha"===e||null==n[e])return;d[a]=s.to(d._rgba)}d[a][t.idx]=i(n[e],t,!0)}),d[a]&&0>e.inArray(null,d[a].slice(0,3))&&(d[a][3]=1,s.from&&(d._rgba=s.from(d[a])))}),this):t},is:function(e){var i=l(e),s=!0,n=this;return f(u,function(e,a){var o,r=i[a.cache];return r&&(o=n[a.cache]||a.to&&a.to(n._rgba)||[],f(a.props,function(e,i){return null!=r[i.idx]?s=r[i.idx]===o[i.idx]:t})),s}),s},_space:function(){var e=[],t=this;return f(u,function(i,s){t[s.cache]&&e.push(i)}),e.pop()},transition:function(e,t){var s=l(e),n=s._space(),a=u[n],o=0===this.alpha()?l("transparent"):this,r=o[a.cache]||a.to(o._rgba),h=r.slice();return s=s[a.cache],f(a.props,function(e,n){var a=n.idx,o=r[a],l=s[a],u=d[n.type]||{};null!==l&&(null===o?h[a]=l:(u.mod&&(l-o>u.mod/2?o+=u.mod:o-l>u.mod/2&&(o-=u.mod)),h[a]=i((l-o)*t+o,n)))}),this[n](h)},blend:function(t){if(1===this._rgba[3])return this;var i=this._rgba.slice(),s=i.pop(),n=l(t)._rgba;return l(e.map(i,function(e,t){return(1-s)*n[t]+s*e}))},toRgbaString:function(){var t="rgba(",i=e.map(this._rgba,function(e,t){return null==e?t>2?1:0:e});return 1===i[3]&&(i.pop(),t="rgb("),t+i.join()+")"},toHslaString:function(){var t="hsla(",i=e.map(this.hsla(),function(e,t){return null==e&&(e=t>2?1:0),t&&3>t&&(e=Math.round(100*e)+"%"),e});return 1===i[3]&&(i.pop(),t="hsl("),t+i.join()+")"},toHexString:function(t){var i=this._rgba.slice(),s=i.pop();return t&&i.push(~~(255*s)),"#"+e.map(i,function(e){return e=(e||0).toString(16),1===e.length?"0"+e:e}).join("")},toString:function(){return 0===this._rgba[3]?"transparent":this.toRgbaString()}}),l.fn.parse.prototype=l.fn,u.hsla.to=function(e){if(null==e[0]||null==e[1]||null==e[2])return[null,null,null,e[3]];var t,i,s=e[0]/255,n=e[1]/255,a=e[2]/255,o=e[3],r=Math.max(s,n,a),h=Math.min(s,n,a),l=r-h,u=r+h,d=.5*u;return t=h===r?0:s===r?60*(n-a)/l+360:n===r?60*(a-s)/l+120:60*(s-n)/l+240,i=0===l?0:.5>=d?l/u:l/(2-u),[Math.round(t)%360,i,d,null==o?1:o]},u.hsla.from=function(e){if(null==e[0]||null==e[1]||null==e[2])return[null,null,null,e[3]];var t=e[0]/360,i=e[1],s=e[2],a=e[3],o=.5>=s?s*(1+i):s+i-s*i,r=2*s-o;return[Math.round(255*n(r,o,t+1/3)),Math.round(255*n(r,o,t)),Math.round(255*n(r,o,t-1/3)),a]},f(u,function(s,n){var a=n.props,o=n.cache,h=n.to,u=n.from;l.fn[s]=function(s){if(h&&!this[o]&&(this[o]=h(this._rgba)),s===t)return this[o].slice();var n,r=e.type(s),d="array"===r||"object"===r?s:arguments,c=this[o].slice();return f(a,function(e,t){var s=d["object"===r?e:t.idx];null==s&&(s=c[t.idx]),c[t.idx]=i(s,t)}),u?(n=l(u(c)),n[o]=c,n):l(c)},f(a,function(t,i){l.fn[t]||(l.fn[t]=function(n){var a,o=e.type(n),h="alpha"===t?this._hsla?"hsla":"rgba":s,l=this[h](),u=l[i.idx];return"undefined"===o?u:("function"===o&&(n=n.call(this,u),o=e.type(n)),null==n&&i.empty?this:("string"===o&&(a=r.exec(n),a&&(n=u+parseFloat(a[2])*("+"===a[1]?1:-1))),l[i.idx]=n,this[h](l)))})})}),l.hook=function(t){var i=t.split(" ");f(i,function(t,i){e.cssHooks[i]={set:function(t,n){var a,o,r="";if("transparent"!==n&&("string"!==e.type(n)||(a=s(n)))){if(n=l(a||n),!c.rgba&&1!==n._rgba[3]){for(o="backgroundColor"===i?t.parentNode:t;(""===r||"transparent"===r)&&o&&o.style;)try{r=e.css(o,"backgroundColor"),o=o.parentNode}catch(h){}n=n.blend(r&&"transparent"!==r?r:"_default")}n=n.toRgbaString()}try{t.style[i]=n}catch(h){}}},e.fx.step[i]=function(t){t.colorInit||(t.start=l(t.elem,i),t.end=l(t.end),t.colorInit=!0),e.cssHooks[i].set(t.elem,t.start.transition(t.end,t.pos))}})},l.hook(o),e.cssHooks.borderColor={expand:function(e){var t={};return f(["Top","Right","Bottom","Left"],function(i,s){t["border"+s+"Color"]=e}),t}},a=e.Color.names={aqua:"#00ffff",black:"#000000",blue:"#0000ff",fuchsia:"#ff00ff",gray:"#808080",green:"#008000",lime:"#00ff00",maroon:"#800000",navy:"#000080",olive:"#808000",purple:"#800080",red:"#ff0000",silver:"#c0c0c0",teal:"#008080",white:"#ffffff",yellow:"#ffff00",transparent:[null,null,null,0],_default:"#ffffff"}}(i),function(){function t(t){var i,s,n=t.ownerDocument.defaultView?t.ownerDocument.defaultView.getComputedStyle(t,null):t.currentStyle,a={};if(n&&n.length&&n[0]&&n[n[0]])for(s=n.length;s--;)i=n[s],"string"==typeof n[i]&&(a[e.camelCase(i)]=n[i]);else for(i in n)"string"==typeof n[i]&&(a[i]=n[i]);return a}function s(t,i){var s,n,o={};for(s in i)n=i[s],t[s]!==n&&(a[s]||(e.fx.step[s]||!isNaN(parseFloat(n)))&&(o[s]=n));return o}var n=["add","remove","toggle"],a={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};e.each(["borderLeftStyle","borderRightStyle","borderBottomStyle","borderTopStyle"],function(t,s){e.fx.step[s]=function(e){("none"!==e.end&&!e.setAttr||1===e.pos&&!e.setAttr)&&(i.style(e.elem,s,e.end),e.setAttr=!0)}}),e.fn.addBack||(e.fn.addBack=function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}),e.effects.animateClass=function(i,a,o,r){var h=e.speed(a,o,r);return this.queue(function(){var a,o=e(this),r=o.attr("class")||"",l=h.children?o.find("*").addBack():o;l=l.map(function(){var i=e(this);return{el:i,start:t(this)}}),a=function(){e.each(n,function(e,t){i[t]&&o[t+"Class"](i[t])})},a(),l=l.map(function(){return this.end=t(this.el[0]),this.diff=s(this.start,this.end),this}),o.attr("class",r),l=l.map(function(){var t=this,i=e.Deferred(),s=e.extend({},h,{queue:!1,complete:function(){i.resolve(t)}});return this.el.animate(this.diff,s),i.promise()}),e.when.apply(e,l.get()).done(function(){a(),e.each(arguments,function(){var t=this.el;e.each(this.diff,function(e){t.css(e,"")})}),h.complete.call(o[0])})})},e.fn.extend({addClass:function(t){return function(i,s,n,a){return s?e.effects.animateClass.call(this,{add:i},s,n,a):t.apply(this,arguments)}}(e.fn.addClass),removeClass:function(t){return function(i,s,n,a){return arguments.length>1?e.effects.animateClass.call(this,{remove:i},s,n,a):t.apply(this,arguments)}}(e.fn.removeClass),toggleClass:function(t){return function(i,s,n,a,o){return"boolean"==typeof s||void 0===s?n?e.effects.animateClass.call(this,s?{add:i}:{remove:i},n,a,o):t.apply(this,arguments):e.effects.animateClass.call(this,{toggle:i},s,n,a)}}(e.fn.toggleClass),switchClass:function(t,i,s,n,a){return e.effects.animateClass.call(this,{add:i,remove:t},s,n,a)}})}(),function(){function i(t,i,s,n){return e.isPlainObject(t)&&(i=t,t=t.effect),t={effect:t},null==i&&(i={}),e.isFunction(i)&&(n=i,s=null,i={}),("number"==typeof i||e.fx.speeds[i])&&(n=s,s=i,i={}),e.isFunction(s)&&(n=s,s=null),i&&e.extend(t,i),s=s||i.duration,t.duration=e.fx.off?0:"number"==typeof s?s:s in e.fx.speeds?e.fx.speeds[s]:e.fx.speeds._default,t.complete=n||i.complete,t}function s(t){return!t||"number"==typeof t||e.fx.speeds[t]?!0:"string"!=typeof t||e.effects.effect[t]?e.isFunction(t)?!0:"object"!=typeof t||t.effect?!1:!0:!0}e.extend(e.effects,{version:"1.11.4",save:function(e,i){for(var s=0;i.length>s;s++)null!==i[s]&&e.data(t+i[s],e[0].style[i[s]])},restore:function(e,i){var s,n;for(n=0;i.length>n;n++)null!==i[n]&&(s=e.data(t+i[n]),void 0===s&&(s=""),e.css(i[n],s))},setMode:function(e,t){return"toggle"===t&&(t=e.is(":hidden")?"show":"hide"),t},getBaseline:function(e,t){var i,s;switch(e[0]){case"top":i=0;break;case"middle":i=.5;break;case"bottom":i=1;break;default:i=e[0]/t.height}switch(e[1]){case"left":s=0;break;case"center":s=.5;break;case"right":s=1;break;default:s=e[1]/t.width}return{x:s,y:i}},createWrapper:function(t){if(t.parent().is(".ui-effects-wrapper"))return t.parent();var i={width:t.outerWidth(!0),height:t.outerHeight(!0),"float":t.css("float")},s=e("
").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}),n={width:t.width(),height:t.height()},a=document.activeElement;try{a.id}catch(o){a=document.body}return t.wrap(s),(t[0]===a||e.contains(t[0],a))&&e(a).focus(),s=t.parent(),"static"===t.css("position")?(s.css({position:"relative"}),t.css({position:"relative"})):(e.extend(i,{position:t.css("position"),zIndex:t.css("z-index")}),e.each(["top","left","bottom","right"],function(e,s){i[s]=t.css(s),isNaN(parseInt(i[s],10))&&(i[s]="auto")}),t.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})),t.css(n),s.css(i).show()},removeWrapper:function(t){var i=document.activeElement;return t.parent().is(".ui-effects-wrapper")&&(t.parent().replaceWith(t),(t[0]===i||e.contains(t[0],i))&&e(i).focus()),t},setTransition:function(t,i,s,n){return n=n||{},e.each(i,function(e,i){var a=t.cssUnit(i);a[0]>0&&(n[i]=a[0]*s+a[1])}),n}}),e.fn.extend({effect:function(){function t(t){function i(){e.isFunction(a)&&a.call(n[0]),e.isFunction(t)&&t()}var n=e(this),a=s.complete,r=s.mode;(n.is(":hidden")?"hide"===r:"show"===r)?(n[r](),i()):o.call(n[0],s,i)}var s=i.apply(this,arguments),n=s.mode,a=s.queue,o=e.effects.effect[s.effect];return e.fx.off||!o?n?this[n](s.duration,s.complete):this.each(function(){s.complete&&s.complete.call(this)}):a===!1?this.each(t):this.queue(a||"fx",t)},show:function(e){return function(t){if(s(t))return e.apply(this,arguments);var n=i.apply(this,arguments);return n.mode="show",this.effect.call(this,n)}}(e.fn.show),hide:function(e){return function(t){if(s(t))return e.apply(this,arguments);var n=i.apply(this,arguments);return n.mode="hide",this.effect.call(this,n)}}(e.fn.hide),toggle:function(e){return function(t){if(s(t)||"boolean"==typeof t)return e.apply(this,arguments);var n=i.apply(this,arguments);return n.mode="toggle",this.effect.call(this,n)}}(e.fn.toggle),cssUnit:function(t){var i=this.css(t),s=[];return e.each(["em","px","%","pt"],function(e,t){i.indexOf(t)>0&&(s=[parseFloat(i),t])}),s}})}(),function(){var t={};e.each(["Quad","Cubic","Quart","Quint","Expo"],function(e,i){t[i]=function(t){return Math.pow(t,e+2)}}),e.extend(t,{Sine:function(e){return 1-Math.cos(e*Math.PI/2)},Circ:function(e){return 1-Math.sqrt(1-e*e)},Elastic:function(e){return 0===e||1===e?e:-Math.pow(2,8*(e-1))*Math.sin((80*(e-1)-7.5)*Math.PI/15)},Back:function(e){return e*e*(3*e-2)},Bounce:function(e){for(var t,i=4;((t=Math.pow(2,--i))-1)/11>e;);return 1/Math.pow(4,3-i)-7.5625*Math.pow((3*t-2)/22-e,2)}}),e.each(t,function(t,i){e.easing["easeIn"+t]=i,e.easing["easeOut"+t]=function(e){return 1-i(1-e)},e.easing["easeInOut"+t]=function(e){return.5>e?i(2*e)/2:1-i(-2*e+2)/2}})}(),e.effects});
\ No newline at end of file
diff --git a/deployed/smartcountdown3/modules/mod_smartcountdown3/js/vendor/jquery-ui-timepicker-addon.min.js b/deployed/smartcountdown3/modules/mod_smartcountdown3/js/vendor/jquery-ui-timepicker-addon.min.js
new file mode 100644
index 00000000..3c3b4c61
--- /dev/null
+++ b/deployed/smartcountdown3/modules/mod_smartcountdown3/js/vendor/jquery-ui-timepicker-addon.min.js
@@ -0,0 +1,5 @@
+/*! jQuery Timepicker Addon - v1.5.2 - 2015-03-15
+* http://trentrichardson.com/examples/timepicker
+* Copyright (c) 2015 Trent Richardson; Licensed MIT */
+(function(e){"function"==typeof define&&define.amd?define(["jquery","jquery.ui"],e):e(jQuery)})(function($){if($.ui.timepicker=$.ui.timepicker||{},!$.ui.timepicker.version){$.extend($.ui,{timepicker:{version:"1.5.2"}});var Timepicker=function(){this.regional=[],this.regional[""]={currentText:"Now",closeText:"Done",amNames:["AM","A"],pmNames:["PM","P"],timeFormat:"HH:mm",timeSuffix:"",timeOnlyTitle:"Choose Time",timeText:"Time",hourText:"Hour",minuteText:"Minute",secondText:"Second",millisecText:"Millisecond",microsecText:"Microsecond",timezoneText:"Time Zone",isRTL:!1},this._defaults={showButtonPanel:!0,timeOnly:!1,timeOnlyShowDate:!1,showHour:null,showMinute:null,showSecond:null,showMillisec:null,showMicrosec:null,showTimezone:null,showTime:!0,stepHour:1,stepMinute:1,stepSecond:1,stepMillisec:1,stepMicrosec:1,hour:0,minute:0,second:0,millisec:0,microsec:0,timezone:null,hourMin:0,minuteMin:0,secondMin:0,millisecMin:0,microsecMin:0,hourMax:23,minuteMax:59,secondMax:59,millisecMax:999,microsecMax:999,minDateTime:null,maxDateTime:null,maxTime:null,minTime:null,onSelect:null,hourGrid:0,minuteGrid:0,secondGrid:0,millisecGrid:0,microsecGrid:0,alwaysSetTime:!0,separator:" ",altFieldTimeOnly:!0,altTimeFormat:null,altSeparator:null,altTimeSuffix:null,altRedirectFocus:!0,pickerTimeFormat:null,pickerTimeSuffix:null,showTimepicker:!0,timezoneList:null,addSliderAccess:!1,sliderAccessArgs:null,controlType:"slider",oneLine:!1,defaultValue:null,parse:"strict",afterInject:null},$.extend(this._defaults,this.regional[""])};$.extend(Timepicker.prototype,{$input:null,$altInput:null,$timeObj:null,inst:null,hour_slider:null,minute_slider:null,second_slider:null,millisec_slider:null,microsec_slider:null,timezone_select:null,maxTime:null,minTime:null,hour:0,minute:0,second:0,millisec:0,microsec:0,timezone:null,hourMinOriginal:null,minuteMinOriginal:null,secondMinOriginal:null,millisecMinOriginal:null,microsecMinOriginal:null,hourMaxOriginal:null,minuteMaxOriginal:null,secondMaxOriginal:null,millisecMaxOriginal:null,microsecMaxOriginal:null,ampm:"",formattedDate:"",formattedTime:"",formattedDateTime:"",timezoneList:null,units:["hour","minute","second","millisec","microsec"],support:{},control:null,setDefaults:function(e){return extendRemove(this._defaults,e||{}),this},_newInst:function($input,opts){var tp_inst=new Timepicker,inlineSettings={},fns={},overrides,i;for(var attrName in this._defaults)if(this._defaults.hasOwnProperty(attrName)){var attrValue=$input.attr("time:"+attrName);if(attrValue)try{inlineSettings[attrName]=eval(attrValue)}catch(err){inlineSettings[attrName]=attrValue}}overrides={beforeShow:function(e,t){return $.isFunction(tp_inst._defaults.evnts.beforeShow)?tp_inst._defaults.evnts.beforeShow.call($input[0],e,t,tp_inst):void 0},onChangeMonthYear:function(e,t,i){$.isFunction(tp_inst._defaults.evnts.onChangeMonthYear)&&tp_inst._defaults.evnts.onChangeMonthYear.call($input[0],e,t,i,tp_inst)},onClose:function(e,t){tp_inst.timeDefined===!0&&""!==$input.val()&&tp_inst._updateDateTime(t),$.isFunction(tp_inst._defaults.evnts.onClose)&&tp_inst._defaults.evnts.onClose.call($input[0],e,t,tp_inst)}};for(i in overrides)overrides.hasOwnProperty(i)&&(fns[i]=opts[i]||null);tp_inst._defaults=$.extend({},this._defaults,inlineSettings,opts,overrides,{evnts:fns,timepicker:tp_inst}),tp_inst.amNames=$.map(tp_inst._defaults.amNames,function(e){return e.toUpperCase()}),tp_inst.pmNames=$.map(tp_inst._defaults.pmNames,function(e){return e.toUpperCase()}),tp_inst.support=detectSupport(tp_inst._defaults.timeFormat+(tp_inst._defaults.pickerTimeFormat?tp_inst._defaults.pickerTimeFormat:"")+(tp_inst._defaults.altTimeFormat?tp_inst._defaults.altTimeFormat:"")),"string"==typeof tp_inst._defaults.controlType?("slider"===tp_inst._defaults.controlType&&$.ui.slider===void 0&&(tp_inst._defaults.controlType="select"),tp_inst.control=tp_inst._controls[tp_inst._defaults.controlType]):tp_inst.control=tp_inst._defaults.controlType;var timezoneList=[-720,-660,-600,-570,-540,-480,-420,-360,-300,-270,-240,-210,-180,-120,-60,0,60,120,180,210,240,270,300,330,345,360,390,420,480,525,540,570,600,630,660,690,720,765,780,840];null!==tp_inst._defaults.timezoneList&&(timezoneList=tp_inst._defaults.timezoneList);var tzl=timezoneList.length,tzi=0,tzv=null;if(tzl>0&&"object"!=typeof timezoneList[0])for(;tzl>tzi;tzi++)tzv=timezoneList[tzi],timezoneList[tzi]={value:tzv,label:$.timepicker.timezoneOffsetString(tzv,tp_inst.support.iso8601)};return tp_inst._defaults.timezoneList=timezoneList,tp_inst.timezone=null!==tp_inst._defaults.timezone?$.timepicker.timezoneOffsetNumber(tp_inst._defaults.timezone):-1*(new Date).getTimezoneOffset(),tp_inst.hour=tp_inst._defaults.hourtp_inst._defaults.hourMax?tp_inst._defaults.hourMax:tp_inst._defaults.hour,tp_inst.minute=tp_inst._defaults.minutetp_inst._defaults.minuteMax?tp_inst._defaults.minuteMax:tp_inst._defaults.minute,tp_inst.second=tp_inst._defaults.secondtp_inst._defaults.secondMax?tp_inst._defaults.secondMax:tp_inst._defaults.second,tp_inst.millisec=tp_inst._defaults.millisectp_inst._defaults.millisecMax?tp_inst._defaults.millisecMax:tp_inst._defaults.millisec,tp_inst.microsec=tp_inst._defaults.microsectp_inst._defaults.microsecMax?tp_inst._defaults.microsecMax:tp_inst._defaults.microsec,tp_inst.ampm="",tp_inst.$input=$input,tp_inst._defaults.altField&&(tp_inst.$altInput=$(tp_inst._defaults.altField),tp_inst._defaults.altRedirectFocus===!0&&tp_inst.$altInput.css({cursor:"pointer"}).focus(function(){$input.trigger("focus")})),(0===tp_inst._defaults.minDate||0===tp_inst._defaults.minDateTime)&&(tp_inst._defaults.minDate=new Date),(0===tp_inst._defaults.maxDate||0===tp_inst._defaults.maxDateTime)&&(tp_inst._defaults.maxDate=new Date),void 0!==tp_inst._defaults.minDate&&tp_inst._defaults.minDate instanceof Date&&(tp_inst._defaults.minDateTime=new Date(tp_inst._defaults.minDate.getTime())),void 0!==tp_inst._defaults.minDateTime&&tp_inst._defaults.minDateTime instanceof Date&&(tp_inst._defaults.minDate=new Date(tp_inst._defaults.minDateTime.getTime())),void 0!==tp_inst._defaults.maxDate&&tp_inst._defaults.maxDate instanceof Date&&(tp_inst._defaults.maxDateTime=new Date(tp_inst._defaults.maxDate.getTime())),void 0!==tp_inst._defaults.maxDateTime&&tp_inst._defaults.maxDateTime instanceof Date&&(tp_inst._defaults.maxDate=new Date(tp_inst._defaults.maxDateTime.getTime())),tp_inst.$input.bind("focus",function(){tp_inst._onFocus()}),tp_inst},_addTimePicker:function(e){var t=$.trim(this.$altInput&&this._defaults.altFieldTimeOnly?this.$input.val()+" "+this.$altInput.val():this.$input.val());this.timeDefined=this._parseTime(t),this._limitMinMaxDateTime(e,!1),this._injectTimePicker(),this._afterInject()},_parseTime:function(e,t){if(this.inst||(this.inst=$.datepicker._getInst(this.$input[0])),t||!this._defaults.timeOnly){var i=$.datepicker._get(this.inst,"dateFormat");try{var s=parseDateTimeInternal(i,this._defaults.timeFormat,e,$.datepicker._getFormatConfig(this.inst),this._defaults);if(!s.timeObj)return!1;$.extend(this,s.timeObj)}catch(a){return $.timepicker.log("Error parsing the date/time string: "+a+"\ndate/time string = "+e+"\ntimeFormat = "+this._defaults.timeFormat+"\ndateFormat = "+i),!1}return!0}var n=$.datepicker.parseTime(this._defaults.timeFormat,e,this._defaults);return n?($.extend(this,n),!0):!1},_afterInject:function(){var e=this.inst.settings;$.isFunction(e.afterInject)&&e.afterInject.call(this)},_injectTimePicker:function(){var e=this.inst.dpDiv,t=this.inst.settings,i=this,s="",a="",n=null,r={},l={},o=null,c=0,u=0;if(0===e.find("div.ui-timepicker-div").length&&t.showTimepicker){var m=" ui_tpicker_unit_hide",d=''+'- "+t.timeText+"
"+'';for(c=0,u=this.units.length;u>c;c++){if(s=this.units[c],a=s.substr(0,1).toUpperCase()+s.substr(1),n=null!==t["show"+a]?t["show"+a]:this.support[s],r[s]=parseInt(t[s+"Max"]-(t[s+"Max"]-t[s+"Min"])%t["step"+a],10),l[s]=0,d+='- '+t[s+"Text"]+"
"+'- ',n&&t[s+"Grid"]>0){if(d+='
',"hour"===s)for(var h=t[s+"Min"];r[s]>=h;h+=parseInt(t[s+"Grid"],10)){l[s]++;var p=$.datepicker.formatTime(this.support.ampm?"hht":"HH",{hour:h},t);d+='| '+p+" | "}else for(var _=t[s+"Min"];r[s]>=_;_+=parseInt(t[s+"Grid"],10))l[s]++,d+=''+(10>_?"0":"")+_+" | ";d+="
"}d+=" "}var f=null!==t.showTimezone?t.showTimezone:this.support.timezone;d+='- '+t.timezoneText+"
",d+='',d+="
";var g=$(d);for(t.timeOnly===!0&&(g.prepend('"),e.find(".ui-datepicker-header, .ui-datepicker-calendar").hide()),c=0,u=i.units.length;u>c;c++)s=i.units[c],a=s.substr(0,1).toUpperCase()+s.substr(1),n=null!==t["show"+a]?t["show"+a]:this.support[s],i[s+"_slider"]=i.control.create(i,g.find(".ui_tpicker_"+s+"_slider"),s,i[s],t[s+"Min"],r[s],t["step"+a]),n&&t[s+"Grid"]>0&&(o=100*l[s]*t[s+"Grid"]/(r[s]-t[s+"Min"]),g.find(".ui_tpicker_"+s+" table").css({width:o+"%",marginLeft:t.isRTL?"0":o/(-2*l[s])+"%",marginRight:t.isRTL?o/(-2*l[s])+"%":"0",borderCollapse:"collapse"}).find("td").click(function(){var e=$(this),t=e.html(),a=parseInt(t.replace(/[^0-9]/g),10),n=t.replace(/[^apm]/gi),r=e.data("for");"hour"===r&&(-1!==n.indexOf("p")&&12>a?a+=12:-1!==n.indexOf("a")&&12===a&&(a=0)),i.control.value(i,i[r+"_slider"],s,a),i._onTimeChange(),i._onSelectHandler()}).css({cursor:"pointer",width:100/l[s]+"%",textAlign:"center",overflow:"hidden"}));if(this.timezone_select=g.find(".ui_tpicker_timezone").append("").find("select"),$.fn.append.apply(this.timezone_select,$.map(t.timezoneList,function(e){return $("").val("object"==typeof e?e.value:e).text("object"==typeof e?e.label:e)})),this.timezone!==void 0&&null!==this.timezone&&""!==this.timezone){var M=-1*new Date(this.inst.selectedYear,this.inst.selectedMonth,this.inst.selectedDay,12).getTimezoneOffset();M===this.timezone?selectLocalTimezone(i):this.timezone_select.val(this.timezone)}else this.hour!==void 0&&null!==this.hour&&""!==this.hour?this.timezone_select.val(t.timezone):selectLocalTimezone(i);this.timezone_select.change(function(){i._onTimeChange(),i._onSelectHandler(),i._afterInject()});var v=e.find(".ui-datepicker-buttonpane");if(v.length?v.before(g):e.append(g),this.$timeObj=g.find(".ui_tpicker_time"),null!==this.inst){var k=this.timeDefined;this._onTimeChange(),this.timeDefined=k}if(this._defaults.addSliderAccess){var T=this._defaults.sliderAccessArgs,D=this._defaults.isRTL;T.isRTL=D,setTimeout(function(){if(0===g.find(".ui-slider-access").length){g.find(".ui-slider:visible").sliderAccess(T);var e=g.find(".ui-slider-access:eq(0)").outerWidth(!0);e&&g.find("table:visible").each(function(){var t=$(this),i=t.outerWidth(),s=(""+t.css(D?"marginRight":"marginLeft")).replace("%",""),a=i-e,n=s*a/i+"%",r={width:a,marginRight:0,marginLeft:0};r[D?"marginRight":"marginLeft"]=n,t.css(r)})}},10)}i._limitMinMaxDateTime(this.inst,!0)}},_limitMinMaxDateTime:function(e,t){var i=this._defaults,s=new Date(e.selectedYear,e.selectedMonth,e.selectedDay);if(this._defaults.showTimepicker){if(null!==$.datepicker._get(e,"minDateTime")&&void 0!==$.datepicker._get(e,"minDateTime")&&s){var a=$.datepicker._get(e,"minDateTime"),n=new Date(a.getFullYear(),a.getMonth(),a.getDate(),0,0,0,0);(null===this.hourMinOriginal||null===this.minuteMinOriginal||null===this.secondMinOriginal||null===this.millisecMinOriginal||null===this.microsecMinOriginal)&&(this.hourMinOriginal=i.hourMin,this.minuteMinOriginal=i.minuteMin,this.secondMinOriginal=i.secondMin,this.millisecMinOriginal=i.millisecMin,this.microsecMinOriginal=i.microsecMin),e.settings.timeOnly||n.getTime()===s.getTime()?(this._defaults.hourMin=a.getHours(),this.hour<=this._defaults.hourMin?(this.hour=this._defaults.hourMin,this._defaults.minuteMin=a.getMinutes(),this.minute<=this._defaults.minuteMin?(this.minute=this._defaults.minuteMin,this._defaults.secondMin=a.getSeconds(),this.second<=this._defaults.secondMin?(this.second=this._defaults.secondMin,this._defaults.millisecMin=a.getMilliseconds(),this.millisec<=this._defaults.millisecMin?(this.millisec=this._defaults.millisecMin,this._defaults.microsecMin=a.getMicroseconds()):(this.microsec=this._defaults.hourMax?(this.hour=this._defaults.hourMax,this._defaults.minuteMax=r.getMinutes(),this.minute>=this._defaults.minuteMax?(this.minute=this._defaults.minuteMax,this._defaults.secondMax=r.getSeconds(),this.second>=this._defaults.secondMax?(this.second=this._defaults.secondMax,this._defaults.millisecMax=r.getMilliseconds(),this.millisec>=this._defaults.millisecMax?(this.millisec=this._defaults.millisecMax,this._defaults.microsecMax=r.getMicroseconds()):(this.microsec>this._defaults.microsecMax&&(this.microsec=this._defaults.microsecMax),this._defaults.microsecMax=this.microsecMaxOriginal)):(this._defaults.millisecMax=this.millisecMaxOriginal,this._defaults.microsecMax=this.microsecMaxOriginal)):(this._defaults.secondMax=this.secondMaxOriginal,this._defaults.millisecMax=this.millisecMaxOriginal,this._defaults.microsecMax=this.microsecMaxOriginal)):(this._defaults.minuteMax=this.minuteMaxOriginal,this._defaults.secondMax=this.secondMaxOriginal,this._defaults.millisecMax=this.millisecMaxOriginal,this._defaults.microsecMax=this.microsecMaxOriginal)):(this._defaults.hourMax=this.hourMaxOriginal,this._defaults.minuteMax=this.minuteMaxOriginal,this._defaults.secondMax=this.secondMaxOriginal,this._defaults.millisecMax=this.millisecMaxOriginal,this._defaults.microsecMax=this.microsecMaxOriginal)}if(null!==e.settings.minTime){var o=new Date("01/01/1970 "+e.settings.minTime);this.hourc.getHours()?(this.hour=this._defaults.hourMax=c.getHours(),this.minute=this._defaults.minuteMax=c.getMinutes()):this.hour===c.getHours()&&this.minute>c.getMinutes()?this.minute=this._defaults.minuteMax=c.getMinutes():this._defaults.hourMax>c.getHours()?(this._defaults.hourMax=c.getHours(),this._defaults.minuteMax=c.getMinutes()):this._defaults.minuteMax=this._defaults.hourMax===c.getHours()===this.hour&&this._defaults.minuteMax>c.getMinutes()?c.getMinutes():59}if(void 0!==t&&t===!0){var u=parseInt(this._defaults.hourMax-(this._defaults.hourMax-this._defaults.hourMin)%this._defaults.stepHour,10),m=parseInt(this._defaults.minuteMax-(this._defaults.minuteMax-this._defaults.minuteMin)%this._defaults.stepMinute,10),d=parseInt(this._defaults.secondMax-(this._defaults.secondMax-this._defaults.secondMin)%this._defaults.stepSecond,10),h=parseInt(this._defaults.millisecMax-(this._defaults.millisecMax-this._defaults.millisecMin)%this._defaults.stepMillisec,10),p=parseInt(this._defaults.microsecMax-(this._defaults.microsecMax-this._defaults.microsecMin)%this._defaults.stepMicrosec,10);this.hour_slider&&(this.control.options(this,this.hour_slider,"hour",{min:this._defaults.hourMin,max:u,step:this._defaults.stepHour}),this.control.value(this,this.hour_slider,"hour",this.hour-this.hour%this._defaults.stepHour)),this.minute_slider&&(this.control.options(this,this.minute_slider,"minute",{min:this._defaults.minuteMin,max:m,step:this._defaults.stepMinute}),this.control.value(this,this.minute_slider,"minute",this.minute-this.minute%this._defaults.stepMinute)),this.second_slider&&(this.control.options(this,this.second_slider,"second",{min:this._defaults.secondMin,max:d,step:this._defaults.stepSecond}),this.control.value(this,this.second_slider,"second",this.second-this.second%this._defaults.stepSecond)),this.millisec_slider&&(this.control.options(this,this.millisec_slider,"millisec",{min:this._defaults.millisecMin,max:h,step:this._defaults.stepMillisec}),this.control.value(this,this.millisec_slider,"millisec",this.millisec-this.millisec%this._defaults.stepMillisec)),this.microsec_slider&&(this.control.options(this,this.microsec_slider,"microsec",{min:this._defaults.microsecMin,max:p,step:this._defaults.stepMicrosec}),this.control.value(this,this.microsec_slider,"microsec",this.microsec-this.microsec%this._defaults.stepMicrosec))}}},_onTimeChange:function(){if(this._defaults.showTimepicker){var e=this.hour_slider?this.control.value(this,this.hour_slider,"hour"):!1,t=this.minute_slider?this.control.value(this,this.minute_slider,"minute"):!1,i=this.second_slider?this.control.value(this,this.second_slider,"second"):!1,s=this.millisec_slider?this.control.value(this,this.millisec_slider,"millisec"):!1,a=this.microsec_slider?this.control.value(this,this.microsec_slider,"microsec"):!1,n=this.timezone_select?this.timezone_select.val():!1,r=this._defaults,l=r.pickerTimeFormat||r.timeFormat,o=r.pickerTimeSuffix||r.timeSuffix;"object"==typeof e&&(e=!1),"object"==typeof t&&(t=!1),"object"==typeof i&&(i=!1),"object"==typeof s&&(s=!1),"object"==typeof a&&(a=!1),"object"==typeof n&&(n=!1),e!==!1&&(e=parseInt(e,10)),t!==!1&&(t=parseInt(t,10)),i!==!1&&(i=parseInt(i,10)),s!==!1&&(s=parseInt(s,10)),a!==!1&&(a=parseInt(a,10)),n!==!1&&(n=""+n);var c=r[12>e?"amNames":"pmNames"][0],u=e!==parseInt(this.hour,10)||t!==parseInt(this.minute,10)||i!==parseInt(this.second,10)||s!==parseInt(this.millisec,10)||a!==parseInt(this.microsec,10)||this.ampm.length>0&&12>e!=(-1!==$.inArray(this.ampm.toUpperCase(),this.amNames))||null!==this.timezone&&n!==""+this.timezone;u&&(e!==!1&&(this.hour=e),t!==!1&&(this.minute=t),i!==!1&&(this.second=i),s!==!1&&(this.millisec=s),a!==!1&&(this.microsec=a),n!==!1&&(this.timezone=n),this.inst||(this.inst=$.datepicker._getInst(this.$input[0])),this._limitMinMaxDateTime(this.inst,!0)),this.support.ampm&&(this.ampm=c),this.formattedTime=$.datepicker.formatTime(r.timeFormat,this,r),this.$timeObj&&(l===r.timeFormat?this.$timeObj.text(this.formattedTime+o):this.$timeObj.text($.datepicker.formatTime(l,this,r)+o)),this.timeDefined=!0,u&&this._updateDateTime()}},_onSelectHandler:function(){var e=this._defaults.onSelect||this.inst.settings.onSelect,t=this.$input?this.$input[0]:null;e&&t&&e.apply(t,[this.formattedDateTime,this])},_updateDateTime:function(e){e=this.inst||e;var t=e.currentYear>0?new Date(e.currentYear,e.currentMonth,e.currentDay):new Date(e.selectedYear,e.selectedMonth,e.selectedDay),i=$.datepicker._daylightSavingAdjust(t),s=$.datepicker._get(e,"dateFormat"),a=$.datepicker._getFormatConfig(e),n=null!==i&&this.timeDefined;this.formattedDate=$.datepicker.formatDate(s,null===i?new Date:i,a);var r=this.formattedDate;if(""===e.lastVal&&(e.currentYear=e.selectedYear,e.currentMonth=e.selectedMonth,e.currentDay=e.selectedDay),this._defaults.timeOnly===!0&&this._defaults.timeOnlyShowDate===!1?r=this.formattedTime:(this._defaults.timeOnly!==!0&&(this._defaults.alwaysSetTime||n)||this._defaults.timeOnly===!0&&this._defaults.timeOnlyShowDate===!0)&&(r+=this._defaults.separator+this.formattedTime+this._defaults.timeSuffix),this.formattedDateTime=r,this._defaults.showTimepicker)if(this.$altInput&&this._defaults.timeOnly===!1&&this._defaults.altFieldTimeOnly===!0)this.$altInput.val(this.formattedTime),this.$input.val(this.formattedDate);else if(this.$altInput){this.$input.val(r);var l="",o=null!==this._defaults.altSeparator?this._defaults.altSeparator:this._defaults.separator,c=null!==this._defaults.altTimeSuffix?this._defaults.altTimeSuffix:this._defaults.timeSuffix;this._defaults.timeOnly||(l=this._defaults.altFormat?$.datepicker.formatDate(this._defaults.altFormat,null===i?new Date:i,a):this.formattedDate,l&&(l+=o)),l+=null!==this._defaults.altTimeFormat?$.datepicker.formatTime(this._defaults.altTimeFormat,this,this._defaults)+c:this.formattedTime+c,this.$altInput.val(l)}else this.$input.val(r);else this.$input.val(this.formattedDate);this.$input.trigger("change")},_onFocus:function(){if(!this.$input.val()&&this._defaults.defaultValue){this.$input.val(this._defaults.defaultValue);var e=$.datepicker._getInst(this.$input.get(0)),t=$.datepicker._get(e,"timepicker");if(t&&t._defaults.timeOnly&&e.input.val()!==e.lastVal)try{$.datepicker._updateDatepicker(e)}catch(i){$.timepicker.log(i)}}},_controls:{slider:{create:function(e,t,i,s,a,n,r){var l=e._defaults.isRTL;return t.prop("slide",null).slider({orientation:"horizontal",value:l?-1*s:s,min:l?-1*n:a,max:l?-1*a:n,step:r,slide:function(t,s){e.control.value(e,$(this),i,l?-1*s.value:s.value),e._onTimeChange()},stop:function(){e._onSelectHandler()}})},options:function(e,t,i,s,a){if(e._defaults.isRTL){if("string"==typeof s)return"min"===s||"max"===s?void 0!==a?t.slider(s,-1*a):Math.abs(t.slider(s)):t.slider(s);var n=s.min,r=s.max;return s.min=s.max=null,void 0!==n&&(s.max=-1*n),void 0!==r&&(s.min=-1*r),t.slider(s)}return"string"==typeof s&&void 0!==a?t.slider(s,a):t.slider(s)},value:function(e,t,i,s){return e._defaults.isRTL?void 0!==s?t.slider("value",-1*s):Math.abs(t.slider("value")):void 0!==s?t.slider("value",s):t.slider("value")}},select:{create:function(e,t,i,s,a,n,r){for(var l='",t.children("select").remove(),$(l).appendTo(t).change(function(){e._onTimeChange(),e._onSelectHandler(),e._afterInject()}),t},options:function(e,t,i,s,a){var n={},r=t.children("select");if("string"==typeof s){if(void 0===a)return r.data(s);n[s]=a}else n=s;return e.control.create(e,t,r.data("unit"),r.val(),n.min>=0?n.min:r.data("min"),n.max||r.data("max"),n.step||r.data("step"))},value:function(e,t,i,s){var a=t.children("select");return void 0!==s?a.val(s):a.val()}}}}),$.fn.extend({timepicker:function(e){e=e||{};var t=Array.prototype.slice.call(arguments);return"object"==typeof e&&(t[0]=$.extend(e,{timeOnly:!0})),$(this).each(function(){$.fn.datetimepicker.apply($(this),t)})},datetimepicker:function(e){e=e||{};var t=arguments;return"string"==typeof e?"getDate"===e||"option"===e&&2===t.length&&"string"==typeof t[1]?$.fn.datepicker.apply($(this[0]),t):this.each(function(){var e=$(this);e.datepicker.apply(e,t)}):this.each(function(){var t=$(this);t.datepicker($.timepicker._newInst(t,e)._defaults)})}}),$.datepicker.parseDateTime=function(e,t,i,s,a){var n=parseDateTimeInternal(e,t,i,s,a);if(n.timeObj){var r=n.timeObj;n.date.setHours(r.hour,r.minute,r.second,r.millisec),n.date.setMicroseconds(r.microsec)}return n.date},$.datepicker.parseTime=function(e,t,i){var s=extendRemove(extendRemove({},$.timepicker._defaults),i||{});-1!==e.replace(/\'.*?\'/g,"").indexOf("Z");var a=function(e,t,i){var s,a=function(e,t){var i=[];return e&&$.merge(i,e),t&&$.merge(i,t),i=$.map(i,function(e){return e.replace(/[.*+?|()\[\]{}\\]/g,"\\$&")}),"("+i.join("|")+")?"},n=function(e){var t=e.toLowerCase().match(/(h{1,2}|m{1,2}|s{1,2}|l{1}|c{1}|t{1,2}|z|'.*?')/g),i={h:-1,m:-1,s:-1,l:-1,c:-1,t:-1,z:-1};if(t)for(var s=0;t.length>s;s++)-1===i[(""+t[s]).charAt(0)]&&(i[(""+t[s]).charAt(0)]=s+1);return i},r="^"+(""+e).replace(/([hH]{1,2}|mm?|ss?|[tT]{1,2}|[zZ]|[lc]|'.*?')/g,function(e){var t=e.length;switch(e.charAt(0).toLowerCase()){case"h":return 1===t?"(\\d?\\d)":"(\\d{"+t+"})";case"m":return 1===t?"(\\d?\\d)":"(\\d{"+t+"})";case"s":return 1===t?"(\\d?\\d)":"(\\d{"+t+"})";case"l":return"(\\d?\\d?\\d)";case"c":return"(\\d?\\d?\\d)";case"z":return"(z|[-+]\\d\\d:?\\d\\d|\\S+)?";case"t":return a(i.amNames,i.pmNames);default:return"("+e.replace(/\'/g,"").replace(/(\.|\$|\^|\\|\/|\(|\)|\[|\]|\?|\+|\*)/g,function(e){return"\\"+e})+")?"}}).replace(/\s/g,"\\s?")+i.timeSuffix+"$",l=n(e),o="";s=t.match(RegExp(r,"i"));var c={hour:0,minute:0,second:0,millisec:0,microsec:0};return s?(-1!==l.t&&(void 0===s[l.t]||0===s[l.t].length?(o="",c.ampm=""):(o=-1!==$.inArray(s[l.t].toUpperCase(),$.map(i.amNames,function(e){return e.toUpperCase()}))?"AM":"PM",c.ampm=i["AM"===o?"amNames":"pmNames"][0])),-1!==l.h&&(c.hour="AM"===o&&"12"===s[l.h]?0:"PM"===o&&"12"!==s[l.h]?parseInt(s[l.h],10)+12:Number(s[l.h])),-1!==l.m&&(c.minute=Number(s[l.m])),-1!==l.s&&(c.second=Number(s[l.s])),-1!==l.l&&(c.millisec=Number(s[l.l])),-1!==l.c&&(c.microsec=Number(s[l.c])),-1!==l.z&&void 0!==s[l.z]&&(c.timezone=$.timepicker.timezoneOffsetNumber(s[l.z])),c):!1},n=function(e,t,i){try{var s=new Date("2012-01-01 "+t);if(isNaN(s.getTime())&&(s=new Date("2012-01-01T"+t),isNaN(s.getTime())&&(s=new Date("01/01/2012 "+t),isNaN(s.getTime()))))throw"Unable to parse time with native Date: "+t;return{hour:s.getHours(),minute:s.getMinutes(),second:s.getSeconds(),millisec:s.getMilliseconds(),microsec:s.getMicroseconds(),timezone:-1*s.getTimezoneOffset()}}catch(n){try{return a(e,t,i)}catch(r){$.timepicker.log("Unable to parse \ntimeString: "+t+"\ntimeFormat: "+e)}}return!1};return"function"==typeof s.parse?s.parse(e,t,s):"loose"===s.parse?n(e,t,s):a(e,t,s)},$.datepicker.formatTime=function(e,t,i){i=i||{},i=$.extend({},$.timepicker._defaults,i),t=$.extend({hour:0,minute:0,second:0,millisec:0,microsec:0,timezone:null},t);var s=e,a=i.amNames[0],n=parseInt(t.hour,10);return n>11&&(a=i.pmNames[0]),s=s.replace(/(?:HH?|hh?|mm?|ss?|[tT]{1,2}|[zZ]|[lc]|'.*?')/g,function(e){switch(e){case"HH":return("0"+n).slice(-2);case"H":return n;case"hh":return("0"+convert24to12(n)).slice(-2);case"h":return convert24to12(n);case"mm":return("0"+t.minute).slice(-2);case"m":return t.minute;case"ss":return("0"+t.second).slice(-2);case"s":return t.second;case"l":return("00"+t.millisec).slice(-3);case"c":return("00"+t.microsec).slice(-3);case"z":return $.timepicker.timezoneOffsetString(null===t.timezone?i.timezone:t.timezone,!1);case"Z":return $.timepicker.timezoneOffsetString(null===t.timezone?i.timezone:t.timezone,!0);case"T":return a.charAt(0).toUpperCase();case"TT":return a.toUpperCase();case"t":return a.charAt(0).toLowerCase();case"tt":return a.toLowerCase();default:return e.replace(/'/g,"")}})},$.datepicker._base_selectDate=$.datepicker._selectDate,$.datepicker._selectDate=function(e,t){var i,s=this._getInst($(e)[0]),a=this._get(s,"timepicker");a&&s.settings.showTimepicker?(a._limitMinMaxDateTime(s,!0),i=s.inline,s.inline=s.stay_open=!0,this._base_selectDate(e,t),s.inline=i,s.stay_open=!1,this._notifyChange(s),this._updateDatepicker(s)):this._base_selectDate(e,t)},$.datepicker._base_updateDatepicker=$.datepicker._updateDatepicker,$.datepicker._updateDatepicker=function(e){var t=e.input[0];if(!($.datepicker._curInst&&$.datepicker._curInst!==e&&$.datepicker._datepickerShowing&&$.datepicker._lastInput!==t||"boolean"==typeof e.stay_open&&e.stay_open!==!1)){this._base_updateDatepicker(e);var i=this._get(e,"timepicker");i&&i._addTimePicker(e)}},$.datepicker._base_doKeyPress=$.datepicker._doKeyPress,$.datepicker._doKeyPress=function(e){var t=$.datepicker._getInst(e.target),i=$.datepicker._get(t,"timepicker");if(i&&$.datepicker._get(t,"constrainInput")){var s=i.support.ampm,a=null!==i._defaults.showTimezone?i._defaults.showTimezone:i.support.timezone,n=$.datepicker._possibleChars($.datepicker._get(t,"dateFormat")),r=(""+i._defaults.timeFormat).replace(/[hms]/g,"").replace(/TT/g,s?"APM":"").replace(/Tt/g,s?"AaPpMm":"").replace(/tT/g,s?"AaPpMm":"").replace(/T/g,s?"AP":"").replace(/tt/g,s?"apm":"").replace(/t/g,s?"ap":"")+" "+i._defaults.separator+i._defaults.timeSuffix+(a?i._defaults.timezoneList.join(""):"")+i._defaults.amNames.join("")+i._defaults.pmNames.join("")+n,l=String.fromCharCode(void 0===e.charCode?e.keyCode:e.charCode);return e.ctrlKey||" ">l||!n||r.indexOf(l)>-1}return $.datepicker._base_doKeyPress(e)},$.datepicker._base_updateAlternate=$.datepicker._updateAlternate,$.datepicker._updateAlternate=function(e){var t=this._get(e,"timepicker");if(t){var i=t._defaults.altField;if(i){var s=(t._defaults.altFormat||t._defaults.dateFormat,this._getDate(e)),a=$.datepicker._getFormatConfig(e),n="",r=t._defaults.altSeparator?t._defaults.altSeparator:t._defaults.separator,l=t._defaults.altTimeSuffix?t._defaults.altTimeSuffix:t._defaults.timeSuffix,o=null!==t._defaults.altTimeFormat?t._defaults.altTimeFormat:t._defaults.timeFormat;n+=$.datepicker.formatTime(o,t,t._defaults)+l,t._defaults.timeOnly||t._defaults.altFieldTimeOnly||null===s||(n=t._defaults.altFormat?$.datepicker.formatDate(t._defaults.altFormat,s,a)+r+n:t.formattedDate+r+n),$(i).val(e.input.val()?n:"")}}else $.datepicker._base_updateAlternate(e)},$.datepicker._base_doKeyUp=$.datepicker._doKeyUp,$.datepicker._doKeyUp=function(e){var t=$.datepicker._getInst(e.target),i=$.datepicker._get(t,"timepicker");if(i&&i._defaults.timeOnly&&t.input.val()!==t.lastVal)try{$.datepicker._updateDatepicker(t)}catch(s){$.timepicker.log(s)}return $.datepicker._base_doKeyUp(e)},$.datepicker._base_gotoToday=$.datepicker._gotoToday,$.datepicker._gotoToday=function(e){var t=this._getInst($(e)[0]);t.dpDiv,this._base_gotoToday(e);var i=this._get(t,"timepicker");selectLocalTimezone(i);var s=new Date;this._setTime(t,s),this._setDate(t,s)},$.datepicker._disableTimepickerDatepicker=function(e){var t=this._getInst(e);if(t){var i=this._get(t,"timepicker");$(e).datepicker("getDate"),i&&(t.settings.showTimepicker=!1,i._defaults.showTimepicker=!1,i._updateDateTime(t))
+}},$.datepicker._enableTimepickerDatepicker=function(e){var t=this._getInst(e);if(t){var i=this._get(t,"timepicker");$(e).datepicker("getDate"),i&&(t.settings.showTimepicker=!0,i._defaults.showTimepicker=!0,i._addTimePicker(t),i._updateDateTime(t))}},$.datepicker._setTime=function(e,t){var i=this._get(e,"timepicker");if(i){var s=i._defaults;i.hour=t?t.getHours():s.hour,i.minute=t?t.getMinutes():s.minute,i.second=t?t.getSeconds():s.second,i.millisec=t?t.getMilliseconds():s.millisec,i.microsec=t?t.getMicroseconds():s.microsec,i._limitMinMaxDateTime(e,!0),i._onTimeChange(),i._updateDateTime(e)}},$.datepicker._setTimeDatepicker=function(e,t,i){var s=this._getInst(e);if(s){var a=this._get(s,"timepicker");if(a){this._setDateFromField(s);var n;t&&("string"==typeof t?(a._parseTime(t,i),n=new Date,n.setHours(a.hour,a.minute,a.second,a.millisec),n.setMicroseconds(a.microsec)):(n=new Date(t.getTime()),n.setMicroseconds(t.getMicroseconds())),"Invalid Date"==""+n&&(n=void 0),this._setTime(s,n))}}},$.datepicker._base_setDateDatepicker=$.datepicker._setDateDatepicker,$.datepicker._setDateDatepicker=function(e,t){var i=this._getInst(e),s=t;if(i){"string"==typeof t&&(s=new Date(t),s.getTime()||(this._base_setDateDatepicker.apply(this,arguments),s=$(e).datepicker("getDate")));var a,n=this._get(i,"timepicker");s instanceof Date?(a=new Date(s.getTime()),a.setMicroseconds(s.getMicroseconds())):a=s,n&&a&&(n.support.timezone||null!==n._defaults.timezone||(n.timezone=-1*a.getTimezoneOffset()),s=$.timepicker.timezoneAdjust(s,n.timezone),a=$.timepicker.timezoneAdjust(a,n.timezone)),this._updateDatepicker(i),this._base_setDateDatepicker.apply(this,arguments),this._setTimeDatepicker(e,a,!0)}},$.datepicker._base_getDateDatepicker=$.datepicker._getDateDatepicker,$.datepicker._getDateDatepicker=function(e,t){var i=this._getInst(e);if(i){var s=this._get(i,"timepicker");if(s){void 0===i.lastVal&&this._setDateFromField(i,t);var a=this._getDate(i);return a&&s._parseTime($(e).val(),s.timeOnly)&&(a.setHours(s.hour,s.minute,s.second,s.millisec),a.setMicroseconds(s.microsec),null!=s.timezone&&(s.support.timezone||null!==s._defaults.timezone||(s.timezone=-1*a.getTimezoneOffset()),a=$.timepicker.timezoneAdjust(a,s.timezone))),a}return this._base_getDateDatepicker(e,t)}},$.datepicker._base_parseDate=$.datepicker.parseDate,$.datepicker.parseDate=function(e,t,i){var s;try{s=this._base_parseDate(e,t,i)}catch(a){if(!(a.indexOf(":")>=0))throw a;s=this._base_parseDate(e,t.substring(0,t.length-(a.length-a.indexOf(":")-2)),i),$.timepicker.log("Error parsing the date string: "+a+"\ndate string = "+t+"\ndate format = "+e)}return s},$.datepicker._base_formatDate=$.datepicker._formatDate,$.datepicker._formatDate=function(e){var t=this._get(e,"timepicker");return t?(t._updateDateTime(e),t.$input.val()):this._base_formatDate(e)},$.datepicker._base_optionDatepicker=$.datepicker._optionDatepicker,$.datepicker._optionDatepicker=function(e,t,i){var s,a=this._getInst(e);if(!a)return null;var n=this._get(a,"timepicker");if(n){var r,l,o,c,u=null,m=null,d=null,h=n._defaults.evnts,p={};if("string"==typeof t){if("minDate"===t||"minDateTime"===t)u=i;else if("maxDate"===t||"maxDateTime"===t)m=i;else if("onSelect"===t)d=i;else if(h.hasOwnProperty(t)){if(i===void 0)return h[t];p[t]=i,s={}}}else if("object"==typeof t){t.minDate?u=t.minDate:t.minDateTime?u=t.minDateTime:t.maxDate?m=t.maxDate:t.maxDateTime&&(m=t.maxDateTime);for(r in h)h.hasOwnProperty(r)&&t[r]&&(p[r]=t[r])}for(r in p)p.hasOwnProperty(r)&&(h[r]=p[r],s||(s=$.extend({},t)),delete s[r]);if(s&&isEmptyObject(s))return;if(u?(u=0===u?new Date:new Date(u),n._defaults.minDate=u,n._defaults.minDateTime=u):m?(m=0===m?new Date:new Date(m),n._defaults.maxDate=m,n._defaults.maxDateTime=m):d&&(n._defaults.onSelect=d),u||m)return c=$(e),o=c.datetimepicker("getDate"),l=this._base_optionDatepicker.call($.datepicker,e,s||t,i),c.datetimepicker("setDate",o),l}return void 0===i?this._base_optionDatepicker.call($.datepicker,e,t):this._base_optionDatepicker.call($.datepicker,e,s||t,i)};var isEmptyObject=function(e){var t;for(t in e)if(e.hasOwnProperty(t))return!1;return!0},extendRemove=function(e,t){$.extend(e,t);for(var i in t)(null===t[i]||void 0===t[i])&&(e[i]=t[i]);return e},detectSupport=function(e){var t=e.replace(/'.*?'/g,"").toLowerCase(),i=function(e,t){return-1!==e.indexOf(t)?!0:!1};return{hour:i(t,"h"),minute:i(t,"m"),second:i(t,"s"),millisec:i(t,"l"),microsec:i(t,"c"),timezone:i(t,"z"),ampm:i(t,"t")&&i(e,"h"),iso8601:i(e,"Z")}},convert24to12=function(e){return e%=12,0===e&&(e=12),e+""},computeEffectiveSetting=function(e,t){return e&&e[t]?e[t]:$.timepicker._defaults[t]},splitDateTime=function(e,t){var i=computeEffectiveSetting(t,"separator"),s=computeEffectiveSetting(t,"timeFormat"),a=s.split(i),n=a.length,r=e.split(i),l=r.length;return l>1?{dateString:r.splice(0,l-n).join(i),timeString:r.splice(0,n).join(i)}:{dateString:e,timeString:""}},parseDateTimeInternal=function(e,t,i,s,a){var n,r,l;if(r=splitDateTime(i,a),n=$.datepicker._base_parseDate(e,r.dateString,s),""===r.timeString)return{date:n};if(l=$.datepicker.parseTime(t,r.timeString,a),!l)throw"Wrong time format";return{date:n,timeObj:l}},selectLocalTimezone=function(e,t){if(e&&e.timezone_select){var i=t||new Date;e.timezone_select.val(-i.getTimezoneOffset())}};$.timepicker=new Timepicker,$.timepicker.timezoneOffsetString=function(e,t){if(isNaN(e)||e>840||-720>e)return e;var i=e,s=i%60,a=(i-s)/60,n=t?":":"",r=(i>=0?"+":"-")+("0"+Math.abs(a)).slice(-2)+n+("0"+Math.abs(s)).slice(-2);return"+00:00"===r?"Z":r},$.timepicker.timezoneOffsetNumber=function(e){var t=(""+e).replace(":","");return"Z"===t.toUpperCase()?0:/^(\-|\+)\d{4}$/.test(t)?("-"===t.substr(0,1)?-1:1)*(60*parseInt(t.substr(1,2),10)+parseInt(t.substr(3,2),10)):e},$.timepicker.timezoneAdjust=function(e,t){var i=$.timepicker.timezoneOffsetNumber(t);return isNaN(i)||e.setMinutes(e.getMinutes()+-e.getTimezoneOffset()-i),e},$.timepicker.timeRange=function(e,t,i){return $.timepicker.handleRange("timepicker",e,t,i)},$.timepicker.datetimeRange=function(e,t,i){$.timepicker.handleRange("datetimepicker",e,t,i)},$.timepicker.dateRange=function(e,t,i){$.timepicker.handleRange("datepicker",e,t,i)},$.timepicker.handleRange=function(e,t,i,s){function a(a,n){var r=t[e]("getDate"),l=i[e]("getDate"),o=a[e]("getDate");if(null!==r){var c=new Date(r.getTime()),u=new Date(r.getTime());c.setMilliseconds(c.getMilliseconds()+s.minInterval),u.setMilliseconds(u.getMilliseconds()+s.maxInterval),s.minInterval>0&&c>l?i[e]("setDate",c):s.maxInterval>0&&l>u?i[e]("setDate",u):r>l&&n[e]("setDate",o)}}function n(t,i,a){if(t.val()){var n=t[e].call(t,"getDate");null!==n&&s.minInterval>0&&("minDate"===a&&n.setMilliseconds(n.getMilliseconds()+s.minInterval),"maxDate"===a&&n.setMilliseconds(n.getMilliseconds()-s.minInterval)),n.getTime&&i[e].call(i,"option",a,n)}}s=$.extend({},{minInterval:0,maxInterval:0,start:{},end:{}},s);var r=!1;return"timepicker"===e&&(r=!0,e="datetimepicker"),$.fn[e].call(t,$.extend({timeOnly:r,onClose:function(){a($(this),i)},onSelect:function(){n($(this),i,"minDate")}},s,s.start)),$.fn[e].call(i,$.extend({timeOnly:r,onClose:function(){a($(this),t)},onSelect:function(){n($(this),t,"maxDate")}},s,s.end)),a(t,i),n(t,i,"minDate"),n(i,t,"maxDate"),$([t.get(0),i.get(0)])},$.timepicker.log=function(){window.console&&window.console.log.apply(window.console,Array.prototype.slice.call(arguments))},$.timepicker._util={_extendRemove:extendRemove,_isEmptyObject:isEmptyObject,_convert24to12:convert24to12,_detectSupport:detectSupport,_selectLocalTimezone:selectLocalTimezone,_computeEffectiveSetting:computeEffectiveSetting,_splitDateTime:splitDateTime,_parseDateTimeInternal:parseDateTimeInternal},Date.prototype.getMicroseconds||(Date.prototype.microseconds=0,Date.prototype.getMicroseconds=function(){return this.microseconds},Date.prototype.setMicroseconds=function(e){return this.setMilliseconds(this.getMilliseconds()+Math.floor(e/1e3)),this.microseconds=e%1e3,this}),$.timepicker.version="1.5.2"}});
\ No newline at end of file
diff --git a/deployed/smartcountdown3/modules/mod_smartcountdown3/js/vendor/timepicker.collapse.js b/deployed/smartcountdown3/modules/mod_smartcountdown3/js/vendor/timepicker.collapse.js
new file mode 100644
index 00000000..4236f1e8
--- /dev/null
+++ b/deployed/smartcountdown3/modules/mod_smartcountdown3/js/vendor/timepicker.collapse.js
@@ -0,0 +1,8 @@
+jQuery(document).ready(function() {
+ jQuery(document).on('click', '.t-datepicker', function(e) {
+ jQuery(this).datetimepicker('destroy').datetimepicker({
+ dateFormat : 'yy-mm-dd',
+ timeFormat: 'HH:mm:ss'
+ }).focus();
+ });
+});
diff --git a/deployed/smartcountdown3/modules/mod_smartcountdown3/js/vendor/velocity.min.js b/deployed/smartcountdown3/modules/mod_smartcountdown3/js/vendor/velocity.min.js
new file mode 100644
index 00000000..10036035
--- /dev/null
+++ b/deployed/smartcountdown3/modules/mod_smartcountdown3/js/vendor/velocity.min.js
@@ -0,0 +1,4 @@
+/*! VelocityJS.org (1.2.3). (C) 2014 Julian Shapiro. MIT @license: en.wikipedia.org/wiki/MIT_License */
+/*! VelocityJS.org jQuery Shim (1.0.1). (C) 2014 The jQuery Foundation. MIT @license: en.wikipedia.org/wiki/MIT_License. */
+!function(a){function b(a){var b=a.length,d=c.type(a);return"function"===d||c.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===d||0===b||"number"==typeof b&&b>0&&b-1 in a}if(!a.jQuery){var c=function(a,b){return new c.fn.init(a,b)};c.isWindow=function(a){return null!=a&&a==a.window},c.type=function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?e[g.call(a)]||"object":typeof a},c.isArray=Array.isArray||function(a){return"array"===c.type(a)},c.isPlainObject=function(a){var b;if(!a||"object"!==c.type(a)||a.nodeType||c.isWindow(a))return!1;try{if(a.constructor&&!f.call(a,"constructor")&&!f.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(d){return!1}for(b in a);return void 0===b||f.call(a,b)},c.each=function(a,c,d){var e,f=0,g=a.length,h=b(a);if(d){if(h)for(;g>f&&(e=c.apply(a[f],d),e!==!1);f++);else for(f in a)if(e=c.apply(a[f],d),e===!1)break}else if(h)for(;g>f&&(e=c.call(a[f],f,a[f]),e!==!1);f++);else for(f in a)if(e=c.call(a[f],f,a[f]),e===!1)break;return a},c.data=function(a,b,e){if(void 0===e){var f=a[c.expando],g=f&&d[f];if(void 0===b)return g;if(g&&b in g)return g[b]}else if(void 0!==b){var f=a[c.expando]||(a[c.expando]=++c.uuid);return d[f]=d[f]||{},d[f][b]=e,e}},c.removeData=function(a,b){var e=a[c.expando],f=e&&d[e];f&&c.each(b,function(a,b){delete f[b]})},c.extend=function(){var a,b,d,e,f,g,h=arguments[0]||{},i=1,j=arguments.length,k=!1;for("boolean"==typeof h&&(k=h,h=arguments[i]||{},i++),"object"!=typeof h&&"function"!==c.type(h)&&(h={}),i===j&&(h=this,i--);j>i;i++)if(null!=(f=arguments[i]))for(e in f)a=h[e],d=f[e],h!==d&&(k&&d&&(c.isPlainObject(d)||(b=c.isArray(d)))?(b?(b=!1,g=a&&c.isArray(a)?a:[]):g=a&&c.isPlainObject(a)?a:{},h[e]=c.extend(k,g,d)):void 0!==d&&(h[e]=d));return h},c.queue=function(a,d,e){function f(a,c){var d=c||[];return null!=a&&(b(Object(a))?!function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;)a[e++]=b[d++];if(c!==c)for(;void 0!==b[d];)a[e++]=b[d++];return a.length=e,a}(d,"string"==typeof a?[a]:a):[].push.call(d,a)),d}if(a){d=(d||"fx")+"queue";var g=c.data(a,d);return e?(!g||c.isArray(e)?g=c.data(a,d,f(e)):g.push(e),g):g||[]}},c.dequeue=function(a,b){c.each(a.nodeType?[a]:a,function(a,d){b=b||"fx";var e=c.queue(d,b),f=e.shift();"inprogress"===f&&(f=e.shift()),f&&("fx"===b&&e.unshift("inprogress"),f.call(d,function(){c.dequeue(d,b)}))})},c.fn=c.prototype={init:function(a){if(a.nodeType)return this[0]=a,this;throw new Error("Not a DOM node.")},offset:function(){var b=this[0].getBoundingClientRect?this[0].getBoundingClientRect():{top:0,left:0};return{top:b.top+(a.pageYOffset||document.scrollTop||0)-(document.clientTop||0),left:b.left+(a.pageXOffset||document.scrollLeft||0)-(document.clientLeft||0)}},position:function(){function a(){for(var a=this.offsetParent||document;a&&"html"===!a.nodeType.toLowerCase&&"static"===a.style.position;)a=a.offsetParent;return a||document}var b=this[0],a=a.apply(b),d=this.offset(),e=/^(?:body|html)$/i.test(a.nodeName)?{top:0,left:0}:c(a).offset();return d.top-=parseFloat(b.style.marginTop)||0,d.left-=parseFloat(b.style.marginLeft)||0,a.style&&(e.top+=parseFloat(a.style.borderTopWidth)||0,e.left+=parseFloat(a.style.borderLeftWidth)||0),{top:d.top-e.top,left:d.left-e.left}}};var d={};c.expando="velocity"+(new Date).getTime(),c.uuid=0;for(var e={},f=e.hasOwnProperty,g=e.toString,h="Boolean Number String Function Array Date RegExp Object Error".split(" "),i=0;ie;++e){var f=j(c,a,d);if(0===f)return c;var g=i(c,a,d)-b;c-=g/f}return c}function l(){for(var b=0;t>b;++b)x[b]=i(b*u,a,d)}function m(b,c,e){var f,g,h=0;do g=c+(e-c)/2,f=i(g,a,d)-b,f>0?e=g:c=g;while(Math.abs(f)>r&&++h=q?k(b,h):0==i?h:m(b,c,c+u)}function o(){y=!0,(a!=c||d!=e)&&l()}var p=4,q=.001,r=1e-7,s=10,t=11,u=1/(t-1),v="Float32Array"in b;if(4!==arguments.length)return!1;for(var w=0;4>w;++w)if("number"!=typeof arguments[w]||isNaN(arguments[w])||!isFinite(arguments[w]))return!1;a=Math.min(a,1),d=Math.min(d,1),a=Math.max(a,0),d=Math.max(d,0);var x=v?new Float32Array(t):new Array(t),y=!1,z=function(b){return y||o(),a===c&&d===e?b:0===b?0:1===b?1:i(n(b),c,e)};z.getControlPoints=function(){return[{x:a,y:c},{x:d,y:e}]};var A="generateBezier("+[a,c,d,e]+")";return z.toString=function(){return A},z}function j(a,b){var c=a;return p.isString(a)?t.Easings[a]||(c=!1):c=p.isArray(a)&&1===a.length?h.apply(null,a):p.isArray(a)&&2===a.length?u.apply(null,a.concat([b])):p.isArray(a)&&4===a.length?i.apply(null,a):!1,c===!1&&(c=t.Easings[t.defaults.easing]?t.defaults.easing:s),c}function k(a){if(a){var b=(new Date).getTime(),c=t.State.calls.length;c>1e4&&(t.State.calls=e(t.State.calls));for(var f=0;c>f;f++)if(t.State.calls[f]){var h=t.State.calls[f],i=h[0],j=h[2],n=h[3],o=!!n,q=null;n||(n=t.State.calls[f][3]=b-16);for(var r=Math.min((b-n)/j.duration,1),s=0,u=i.length;u>s;s++){var w=i[s],y=w.element;if(g(y)){var z=!1;if(j.display!==d&&null!==j.display&&"none"!==j.display){if("flex"===j.display){var A=["-webkit-box","-moz-box","-ms-flexbox","-webkit-flex"];m.each(A,function(a,b){v.setPropertyValue(y,"display",b)})}v.setPropertyValue(y,"display",j.display)}j.visibility!==d&&"hidden"!==j.visibility&&v.setPropertyValue(y,"visibility",j.visibility);for(var B in w)if("element"!==B){var C,D=w[B],E=p.isString(D.easing)?t.Easings[D.easing]:D.easing;if(1===r)C=D.endValue;else{var F=D.endValue-D.startValue;if(C=D.startValue+F*E(r,j,F),!o&&C===D.currentValue)continue}if(D.currentValue=C,"tween"===B)q=C;else{if(v.Hooks.registered[B]){var G=v.Hooks.getRoot(B),H=g(y).rootPropertyValueCache[G];H&&(D.rootPropertyValue=H)}var I=v.setPropertyValue(y,B,D.currentValue+(0===parseFloat(C)?"":D.unitType),D.rootPropertyValue,D.scrollData);v.Hooks.registered[B]&&(g(y).rootPropertyValueCache[G]=v.Normalizations.registered[G]?v.Normalizations.registered[G]("extract",null,I[1]):I[1]),"transform"===I[0]&&(z=!0)}}j.mobileHA&&g(y).transformCache.translate3d===d&&(g(y).transformCache.translate3d="(0px, 0px, 0px)",z=!0),z&&v.flushTransformCache(y)}}j.display!==d&&"none"!==j.display&&(t.State.calls[f][2].display=!1),j.visibility!==d&&"hidden"!==j.visibility&&(t.State.calls[f][2].visibility=!1),j.progress&&j.progress.call(h[1],h[1],r,Math.max(0,n+j.duration-b),n,q),1===r&&l(f)}}t.State.isTicking&&x(k)}function l(a,b){if(!t.State.calls[a])return!1;for(var c=t.State.calls[a][0],e=t.State.calls[a][1],f=t.State.calls[a][2],h=t.State.calls[a][4],i=!1,j=0,k=c.length;k>j;j++){var l=c[j].element;if(b||f.loop||("none"===f.display&&v.setPropertyValue(l,"display",f.display),"hidden"===f.visibility&&v.setPropertyValue(l,"visibility",f.visibility)),f.loop!==!0&&(m.queue(l)[1]===d||!/\.velocityQueueEntryFlag/i.test(m.queue(l)[1]))&&g(l)){g(l).isAnimating=!1,g(l).rootPropertyValueCache={};var n=!1;m.each(v.Lists.transforms3D,function(a,b){var c=/^scale/.test(b)?1:0,e=g(l).transformCache[b];g(l).transformCache[b]!==d&&new RegExp("^\\("+c+"[^.]").test(e)&&(n=!0,delete g(l).transformCache[b])}),f.mobileHA&&(n=!0,delete g(l).transformCache.translate3d),n&&v.flushTransformCache(l),v.Values.removeClass(l,"velocity-animating")}if(!b&&f.complete&&!f.loop&&j===k-1)try{f.complete.call(e,e)}catch(o){setTimeout(function(){throw o},1)}h&&f.loop!==!0&&h(e),g(l)&&f.loop===!0&&!b&&(m.each(g(l).tweensContainer,function(a,b){/^rotate/.test(a)&&360===parseFloat(b.endValue)&&(b.endValue=0,b.startValue=360),/^backgroundPosition/.test(a)&&100===parseFloat(b.endValue)&&"%"===b.unitType&&(b.endValue=0,b.startValue=100)}),t(l,"reverse",{loop:!0,delay:f.delay})),f.queue!==!1&&m.dequeue(l,f.queue)}t.State.calls[a]=!1;for(var p=0,q=t.State.calls.length;q>p;p++)if(t.State.calls[p]!==!1){i=!0;break}i===!1&&(t.State.isTicking=!1,delete t.State.calls,t.State.calls=[])}var m,n=function(){if(c.documentMode)return c.documentMode;for(var a=7;a>4;a--){var b=c.createElement("div");if(b.innerHTML="",b.getElementsByTagName("span").length)return b=null,a}return d}(),o=function(){var a=0;return b.webkitRequestAnimationFrame||b.mozRequestAnimationFrame||function(b){var c,d=(new Date).getTime();return c=Math.max(0,16-(d-a)),a=d+c,setTimeout(function(){b(d+c)},c)}}(),p={isString:function(a){return"string"==typeof a},isArray:Array.isArray||function(a){return"[object Array]"===Object.prototype.toString.call(a)},isFunction:function(a){return"[object Function]"===Object.prototype.toString.call(a)},isNode:function(a){return a&&a.nodeType},isNodeList:function(a){return"object"==typeof a&&/^\[object (HTMLCollection|NodeList|Object)\]$/.test(Object.prototype.toString.call(a))&&a.length!==d&&(0===a.length||"object"==typeof a[0]&&a[0].nodeType>0)},isWrapped:function(a){return a&&(a.jquery||b.Zepto&&b.Zepto.zepto.isZ(a))},isSVG:function(a){return b.SVGElement&&a instanceof b.SVGElement},isEmptyObject:function(a){for(var b in a)return!1;return!0}},q=!1;if(a.fn&&a.fn.jquery?(m=a,q=!0):m=b.Velocity.Utilities,8>=n&&!q)throw new Error("Velocity: IE8 and below require jQuery to be loaded before Velocity.");if(7>=n)return void(jQuery.fn.velocity=jQuery.fn.animate);var r=400,s="swing",t={State:{isMobile:/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent),isAndroid:/Android/i.test(navigator.userAgent),isGingerbread:/Android 2\.3\.[3-7]/i.test(navigator.userAgent),isChrome:b.chrome,isFirefox:/Firefox/i.test(navigator.userAgent),prefixElement:c.createElement("div"),prefixMatches:{},scrollAnchor:null,scrollPropertyLeft:null,scrollPropertyTop:null,isTicking:!1,calls:[]},CSS:{},Utilities:m,Redirects:{},Easings:{},Promise:b.Promise,defaults:{queue:"",duration:r,easing:s,begin:d,complete:d,progress:d,display:d,visibility:d,loop:!1,delay:!1,mobileHA:!0,_cacheValues:!0},init:function(a){m.data(a,"velocity",{isSVG:p.isSVG(a),isAnimating:!1,computedStyle:null,tweensContainer:null,rootPropertyValueCache:{},transformCache:{}})},hook:null,mock:!1,version:{major:1,minor:2,patch:2},debug:!1};b.pageYOffset!==d?(t.State.scrollAnchor=b,t.State.scrollPropertyLeft="pageXOffset",t.State.scrollPropertyTop="pageYOffset"):(t.State.scrollAnchor=c.documentElement||c.body.parentNode||c.body,t.State.scrollPropertyLeft="scrollLeft",t.State.scrollPropertyTop="scrollTop");var u=function(){function a(a){return-a.tension*a.x-a.friction*a.v}function b(b,c,d){var e={x:b.x+d.dx*c,v:b.v+d.dv*c,tension:b.tension,friction:b.friction};return{dx:e.v,dv:a(e)}}function c(c,d){var e={dx:c.v,dv:a(c)},f=b(c,.5*d,e),g=b(c,.5*d,f),h=b(c,d,g),i=1/6*(e.dx+2*(f.dx+g.dx)+h.dx),j=1/6*(e.dv+2*(f.dv+g.dv)+h.dv);return c.x=c.x+i*d,c.v=c.v+j*d,c}return function d(a,b,e){var f,g,h,i={x:-1,v:0,tension:null,friction:null},j=[0],k=0,l=1e-4,m=.016;for(a=parseFloat(a)||500,b=parseFloat(b)||20,e=e||null,i.tension=a,i.friction=b,f=null!==e,f?(k=d(a,b),g=k/e*m):g=m;;)if(h=c(h||i,g),j.push(1+h.x),k+=16,!(Math.abs(h.x)>l&&Math.abs(h.v)>l))break;return f?function(a){return j[a*(j.length-1)|0]}:k}}();t.Easings={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},spring:function(a){return 1-Math.cos(4.5*a*Math.PI)*Math.exp(6*-a)}},m.each([["ease",[.25,.1,.25,1]],["ease-in",[.42,0,1,1]],["ease-out",[0,0,.58,1]],["ease-in-out",[.42,0,.58,1]],["easeInSine",[.47,0,.745,.715]],["easeOutSine",[.39,.575,.565,1]],["easeInOutSine",[.445,.05,.55,.95]],["easeInQuad",[.55,.085,.68,.53]],["easeOutQuad",[.25,.46,.45,.94]],["easeInOutQuad",[.455,.03,.515,.955]],["easeInCubic",[.55,.055,.675,.19]],["easeOutCubic",[.215,.61,.355,1]],["easeInOutCubic",[.645,.045,.355,1]],["easeInQuart",[.895,.03,.685,.22]],["easeOutQuart",[.165,.84,.44,1]],["easeInOutQuart",[.77,0,.175,1]],["easeInQuint",[.755,.05,.855,.06]],["easeOutQuint",[.23,1,.32,1]],["easeInOutQuint",[.86,0,.07,1]],["easeInExpo",[.95,.05,.795,.035]],["easeOutExpo",[.19,1,.22,1]],["easeInOutExpo",[1,0,0,1]],["easeInCirc",[.6,.04,.98,.335]],["easeOutCirc",[.075,.82,.165,1]],["easeInOutCirc",[.785,.135,.15,.86]]],function(a,b){t.Easings[b[0]]=i.apply(null,b[1])});var v=t.CSS={RegEx:{isHex:/^#([A-f\d]{3}){1,2}$/i,valueUnwrap:/^[A-z]+\((.*)\)$/i,wrappedValueAlreadyExtracted:/[0-9.]+ [0-9.]+ [0-9.]+( [0-9.]+)?/,valueSplit:/([A-z]+\(.+\))|(([A-z0-9#-.]+?)(?=\s|$))/gi},Lists:{colors:["fill","stroke","stopColor","color","backgroundColor","borderColor","borderTopColor","borderRightColor","borderBottomColor","borderLeftColor","outlineColor"],transformsBase:["translateX","translateY","scale","scaleX","scaleY","skewX","skewY","rotateZ"],transforms3D:["transformPerspective","translateZ","scaleZ","rotateX","rotateY"]},Hooks:{templates:{textShadow:["Color X Y Blur","black 0px 0px 0px"],boxShadow:["Color X Y Blur Spread","black 0px 0px 0px 0px"],clip:["Top Right Bottom Left","0px 0px 0px 0px"],backgroundPosition:["X Y","0% 0%"],transformOrigin:["X Y Z","50% 50% 0px"],perspectiveOrigin:["X Y","50% 50%"]},registered:{},register:function(){for(var a=0;a=n)switch(a){case"name":return"filter";case"extract":var d=c.toString().match(/alpha\(opacity=(.*)\)/i);return c=d?d[1]/100:1;case"inject":return b.style.zoom=1,parseFloat(c)>=1?"":"alpha(opacity="+parseInt(100*parseFloat(c),10)+")"}else switch(a){case"name":return"opacity";case"extract":return c;case"inject":return c}}},register:function(){9>=n||t.State.isGingerbread||(v.Lists.transformsBase=v.Lists.transformsBase.concat(v.Lists.transforms3D));for(var a=0;ae&&(e=1),f=!/(\d)$/i.test(e);break;case"skew":f=!/(deg|\d)$/i.test(e);break;case"rotate":f=!/(deg|\d)$/i.test(e)}return f||(g(c).transformCache[b]="("+e+")"),g(c).transformCache[b]}}}();for(var a=0;a=n||3!==f.split(" ").length||(f+=" 1"),f;case"inject":return 8>=n?4===e.split(" ").length&&(e=e.split(/\s+/).slice(0,3).join(" ")):3===e.split(" ").length&&(e+=" 1"),(8>=n?"rgb":"rgba")+"("+e.replace(/\s+/g,",").replace(/\.(\d)+(?=,)/g,"")+")"}}}()}},Names:{camelCase:function(a){return a.replace(/-(\w)/g,function(a,b){return b.toUpperCase()})},SVGAttribute:function(a){var b="width|height|x|y|cx|cy|r|rx|ry|x1|x2|y1|y2";return(n||t.State.isAndroid&&!t.State.isChrome)&&(b+="|transform"),new RegExp("^("+b+")$","i").test(a)},prefixCheck:function(a){if(t.State.prefixMatches[a])return[t.State.prefixMatches[a],!0];for(var b=["","Webkit","Moz","ms","O"],c=0,d=b.length;d>c;c++){var e;if(e=0===c?a:b[c]+a.replace(/^\w/,function(a){return a.toUpperCase()}),p.isString(t.State.prefixElement.style[e]))return t.State.prefixMatches[a]=e,[e,!0]}return[a,!1]}},Values:{hexToRgb:function(a){var b,c=/^#?([a-f\d])([a-f\d])([a-f\d])$/i,d=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i;return a=a.replace(c,function(a,b,c,d){return b+b+c+c+d+d}),b=d.exec(a),b?[parseInt(b[1],16),parseInt(b[2],16),parseInt(b[3],16)]:[0,0,0]},isCSSNullValue:function(a){return 0==a||/^(none|auto|transparent|(rgba\(0, ?0, ?0, ?0\)))$/i.test(a)},getUnitType:function(a){return/^(rotate|skew)/i.test(a)?"deg":/(^(scale|scaleX|scaleY|scaleZ|alpha|flexGrow|flexHeight|zIndex|fontWeight)$)|((opacity|red|green|blue|alpha)$)/i.test(a)?"":"px"},getDisplayType:function(a){var b=a&&a.tagName.toString().toLowerCase();return/^(b|big|i|small|tt|abbr|acronym|cite|code|dfn|em|kbd|strong|samp|var|a|bdo|br|img|map|object|q|script|span|sub|sup|button|input|label|select|textarea)$/i.test(b)?"inline":/^(li)$/i.test(b)?"list-item":/^(tr)$/i.test(b)?"table-row":/^(table)$/i.test(b)?"table":/^(tbody)$/i.test(b)?"table-row-group":"block"},addClass:function(a,b){a.classList?a.classList.add(b):a.className+=(a.className.length?" ":"")+b},removeClass:function(a,b){a.classList?a.classList.remove(b):a.className=a.className.toString().replace(new RegExp("(^|\\s)"+b.split(" ").join("|")+"(\\s|$)","gi")," ")}},getPropertyValue:function(a,c,e,f){function h(a,c){function e(){j&&v.setPropertyValue(a,"display","none")}var i=0;if(8>=n)i=m.css(a,c);else{var j=!1;if(/^(width|height)$/.test(c)&&0===v.getPropertyValue(a,"display")&&(j=!0,v.setPropertyValue(a,"display",v.Values.getDisplayType(a))),!f){if("height"===c&&"border-box"!==v.getPropertyValue(a,"boxSizing").toString().toLowerCase()){var k=a.offsetHeight-(parseFloat(v.getPropertyValue(a,"borderTopWidth"))||0)-(parseFloat(v.getPropertyValue(a,"borderBottomWidth"))||0)-(parseFloat(v.getPropertyValue(a,"paddingTop"))||0)-(parseFloat(v.getPropertyValue(a,"paddingBottom"))||0);return e(),k}if("width"===c&&"border-box"!==v.getPropertyValue(a,"boxSizing").toString().toLowerCase()){var l=a.offsetWidth-(parseFloat(v.getPropertyValue(a,"borderLeftWidth"))||0)-(parseFloat(v.getPropertyValue(a,"borderRightWidth"))||0)-(parseFloat(v.getPropertyValue(a,"paddingLeft"))||0)-(parseFloat(v.getPropertyValue(a,"paddingRight"))||0);return e(),l}}var o;o=g(a)===d?b.getComputedStyle(a,null):g(a).computedStyle?g(a).computedStyle:g(a).computedStyle=b.getComputedStyle(a,null),"borderColor"===c&&(c="borderTopColor"),i=9===n&&"filter"===c?o.getPropertyValue(c):o[c],(""===i||null===i)&&(i=a.style[c]),e()}if("auto"===i&&/^(top|right|bottom|left)$/i.test(c)){var p=h(a,"position");("fixed"===p||"absolute"===p&&/top|left/i.test(c))&&(i=m(a).position()[c]+"px")}return i}var i;if(v.Hooks.registered[c]){var j=c,k=v.Hooks.getRoot(j);e===d&&(e=v.getPropertyValue(a,v.Names.prefixCheck(k)[0])),v.Normalizations.registered[k]&&(e=v.Normalizations.registered[k]("extract",a,e)),i=v.Hooks.extractValue(j,e)}else if(v.Normalizations.registered[c]){var l,o;l=v.Normalizations.registered[c]("name",a),"transform"!==l&&(o=h(a,v.Names.prefixCheck(l)[0]),v.Values.isCSSNullValue(o)&&v.Hooks.templates[c]&&(o=v.Hooks.templates[c][1])),i=v.Normalizations.registered[c]("extract",a,o)}if(!/^[\d-]/.test(i))if(g(a)&&g(a).isSVG&&v.Names.SVGAttribute(c))if(/^(height|width)$/i.test(c))try{i=a.getBBox()[c]}catch(p){i=0}else i=a.getAttribute(c);else i=h(a,v.Names.prefixCheck(c)[0]);return v.Values.isCSSNullValue(i)&&(i=0),t.debug>=2&&console.log("Get "+c+": "+i),i},setPropertyValue:function(a,c,d,e,f){var h=c;if("scroll"===c)f.container?f.container["scroll"+f.direction]=d:"Left"===f.direction?b.scrollTo(d,f.alternateValue):b.scrollTo(f.alternateValue,d);else if(v.Normalizations.registered[c]&&"transform"===v.Normalizations.registered[c]("name",a))v.Normalizations.registered[c]("inject",a,d),h="transform",d=g(a).transformCache[c];else{if(v.Hooks.registered[c]){var i=c,j=v.Hooks.getRoot(c);e=e||v.getPropertyValue(a,j),d=v.Hooks.injectValue(i,d,e),c=j}if(v.Normalizations.registered[c]&&(d=v.Normalizations.registered[c]("inject",a,d),c=v.Normalizations.registered[c]("name",a)),h=v.Names.prefixCheck(c)[0],8>=n)try{a.style[h]=d}catch(k){t.debug&&console.log("Browser does not support ["+d+"] for ["+h+"]")}else g(a)&&g(a).isSVG&&v.Names.SVGAttribute(c)?a.setAttribute(c,d):a.style[h]=d;t.debug>=2&&console.log("Set "+c+" ("+h+"): "+d)}return[h,d]},flushTransformCache:function(a){function b(b){return parseFloat(v.getPropertyValue(a,b))}var c="";if((n||t.State.isAndroid&&!t.State.isChrome)&&g(a).isSVG){var d={translate:[b("translateX"),b("translateY")],skewX:[b("skewX")],skewY:[b("skewY")],scale:1!==b("scale")?[b("scale"),b("scale")]:[b("scaleX"),b("scaleY")],rotate:[b("rotateZ"),0,0]};m.each(g(a).transformCache,function(a){/^translate/i.test(a)?a="translate":/^scale/i.test(a)?a="scale":/^rotate/i.test(a)&&(a="rotate"),d[a]&&(c+=a+"("+d[a].join(" ")+") ",delete d[a])})}else{var e,f;m.each(g(a).transformCache,function(b){return e=g(a).transformCache[b],"transformPerspective"===b?(f=e,!0):(9===n&&"rotateZ"===b&&(b="rotate"),void(c+=b+e+" "))}),f&&(c="perspective"+f+" "+c)}v.setPropertyValue(a,"transform",c)}};v.Hooks.register(),v.Normalizations.register(),t.hook=function(a,b,c){var e=d;return a=f(a),m.each(a,function(a,f){if(g(f)===d&&t.init(f),c===d)e===d&&(e=t.CSS.getPropertyValue(f,b));else{var h=t.CSS.setPropertyValue(f,b,c);"transform"===h[0]&&t.CSS.flushTransformCache(f),e=h}}),e};var w=function(){function a(){return h?B.promise||null:i}function e(){function a(){function a(a,b){var c=d,e=d,g=d;return p.isArray(a)?(c=a[0],!p.isArray(a[1])&&/^[\d-]/.test(a[1])||p.isFunction(a[1])||v.RegEx.isHex.test(a[1])?g=a[1]:(p.isString(a[1])&&!v.RegEx.isHex.test(a[1])||p.isArray(a[1]))&&(e=b?a[1]:j(a[1],h.duration),a[2]!==d&&(g=a[2]))):c=a,b||(e=e||h.easing),p.isFunction(c)&&(c=c.call(f,y,x)),p.isFunction(g)&&(g=g.call(f,y,x)),[c||0,e,g]}function l(a,b){var c,d;return d=(b||"0").toString().toLowerCase().replace(/[%A-z]+$/,function(a){return c=a,""}),c||(c=v.Values.getUnitType(a)),[d,c]}function n(){var a={myParent:f.parentNode||c.body,position:v.getPropertyValue(f,"position"),fontSize:v.getPropertyValue(f,"fontSize")},d=a.position===I.lastPosition&&a.myParent===I.lastParent,e=a.fontSize===I.lastFontSize;I.lastParent=a.myParent,I.lastPosition=a.position,I.lastFontSize=a.fontSize;var h=100,i={};if(e&&d)i.emToPx=I.lastEmToPx,i.percentToPxWidth=I.lastPercentToPxWidth,i.percentToPxHeight=I.lastPercentToPxHeight;else{var j=g(f).isSVG?c.createElementNS("http://www.w3.org/2000/svg","rect"):c.createElement("div");t.init(j),a.myParent.appendChild(j),m.each(["overflow","overflowX","overflowY"],function(a,b){t.CSS.setPropertyValue(j,b,"hidden")}),t.CSS.setPropertyValue(j,"position",a.position),t.CSS.setPropertyValue(j,"fontSize",a.fontSize),t.CSS.setPropertyValue(j,"boxSizing","content-box"),m.each(["minWidth","maxWidth","width","minHeight","maxHeight","height"],function(a,b){t.CSS.setPropertyValue(j,b,h+"%")}),t.CSS.setPropertyValue(j,"paddingLeft",h+"em"),i.percentToPxWidth=I.lastPercentToPxWidth=(parseFloat(v.getPropertyValue(j,"width",null,!0))||1)/h,i.percentToPxHeight=I.lastPercentToPxHeight=(parseFloat(v.getPropertyValue(j,"height",null,!0))||1)/h,i.emToPx=I.lastEmToPx=(parseFloat(v.getPropertyValue(j,"paddingLeft"))||1)/h,a.myParent.removeChild(j)}return null===I.remToPx&&(I.remToPx=parseFloat(v.getPropertyValue(c.body,"fontSize"))||16),null===I.vwToPx&&(I.vwToPx=parseFloat(b.innerWidth)/100,I.vhToPx=parseFloat(b.innerHeight)/100),i.remToPx=I.remToPx,i.vwToPx=I.vwToPx,i.vhToPx=I.vhToPx,t.debug>=1&&console.log("Unit ratios: "+JSON.stringify(i),f),i}if(h.begin&&0===y)try{h.begin.call(o,o)}catch(r){setTimeout(function(){throw r},1)}if("scroll"===C){var u,w,z,A=/^x$/i.test(h.axis)?"Left":"Top",D=parseFloat(h.offset)||0;h.container?p.isWrapped(h.container)||p.isNode(h.container)?(h.container=h.container[0]||h.container,u=h.container["scroll"+A],z=u+m(f).position()[A.toLowerCase()]+D):h.container=null:(u=t.State.scrollAnchor[t.State["scrollProperty"+A]],w=t.State.scrollAnchor[t.State["scrollProperty"+("Left"===A?"Top":"Left")]],z=m(f).offset()[A.toLowerCase()]+D),i={scroll:{rootPropertyValue:!1,startValue:u,currentValue:u,endValue:z,unitType:"",easing:h.easing,scrollData:{container:h.container,direction:A,alternateValue:w}},element:f},t.debug&&console.log("tweensContainer (scroll): ",i.scroll,f)}else if("reverse"===C){if(!g(f).tweensContainer)return void m.dequeue(f,h.queue);"none"===g(f).opts.display&&(g(f).opts.display="auto"),"hidden"===g(f).opts.visibility&&(g(f).opts.visibility="visible"),g(f).opts.loop=!1,g(f).opts.begin=null,g(f).opts.complete=null,s.easing||delete h.easing,s.duration||delete h.duration,h=m.extend({},g(f).opts,h);var E=m.extend(!0,{},g(f).tweensContainer);for(var F in E)if("element"!==F){var G=E[F].startValue;E[F].startValue=E[F].currentValue=E[F].endValue,E[F].endValue=G,p.isEmptyObject(s)||(E[F].easing=h.easing),t.debug&&console.log("reverse tweensContainer ("+F+"): "+JSON.stringify(E[F]),f)}i=E}else if("start"===C){var E;g(f).tweensContainer&&g(f).isAnimating===!0&&(E=g(f).tweensContainer),m.each(q,function(b,c){if(RegExp("^"+v.Lists.colors.join("$|^")+"$").test(b)){var e=a(c,!0),f=e[0],g=e[1],h=e[2];if(v.RegEx.isHex.test(f)){for(var i=["Red","Green","Blue"],j=v.Values.hexToRgb(f),k=h?v.Values.hexToRgb(h):d,l=0;lL;L++){var M={delay:E.delay,progress:E.progress};L===K-1&&(M.display=E.display,M.visibility=E.visibility,M.complete=E.complete),w(o,"reverse",M)}return a()}};t=m.extend(w,t),t.animate=w;var x=b.requestAnimationFrame||o;return t.State.isMobile||c.hidden===d||c.addEventListener("visibilitychange",function(){c.hidden?(x=function(a){return setTimeout(function(){a(!0)},16)},k()):x=b.requestAnimationFrame||o}),a.Velocity=t,a!==b&&(a.fn.velocity=w,a.fn.velocity.defaults=t.defaults),m.each(["Down","Up"],function(a,b){t.Redirects["slide"+b]=function(a,c,e,f,g,h){var i=m.extend({},c),j=i.begin,k=i.complete,l={height:"",marginTop:"",marginBottom:"",paddingTop:"",paddingBottom:""},n={};i.display===d&&(i.display="Down"===b?"inline"===t.CSS.Values.getDisplayType(a)?"inline-block":"block":"none"),i.begin=function(){j&&j.call(g,g);for(var c in l){n[c]=a.style[c];var d=t.CSS.getPropertyValue(a,c);l[c]="Down"===b?[d,0]:[0,d]}n.overflow=a.style.overflow,a.style.overflow="hidden"},i.complete=function(){for(var b in n)a.style[b]=n[b];k&&k.call(g,g),h&&h.resolver(g)},t(a,l,i)}}),m.each(["In","Out"],function(a,b){t.Redirects["fade"+b]=function(a,c,e,f,g,h){var i=m.extend({},c),j={opacity:"In"===b?1:0},k=i.complete;i.complete=e!==f-1?i.begin=null:function(){k&&k.call(g,g),h&&h.resolver(g)},i.display===d&&(i.display="In"===b?"auto":"none"),t(this,j,i)}}),t}(window.jQuery||window.Zepto||window,window,document)});
diff --git a/deployed/smartcountdown3/modules/mod_smartcountdown3/language/ar-AA/ar-AA.mod_smartcountdown3.ini b/deployed/smartcountdown3/modules/mod_smartcountdown3/language/ar-AA/ar-AA.mod_smartcountdown3.ini
new file mode 100644
index 00000000..65e4d5d3
--- /dev/null
+++ b/deployed/smartcountdown3/modules/mod_smartcountdown3/language/ar-AA/ar-AA.mod_smartcountdown3.ini
@@ -0,0 +1,221 @@
+; Note : All ini files need to be saved as UTF-8 - No BOM
+MOD_SMARTCOUNTDOWN3="Smart Countdown 3"
+MOD_SMARTCOUNTDOWN3_XML_DESCRIPTION="Smart Countdown 3 Module"
+MOD_SMARTCOUNTDOWN3_WITH_EXTRA_FX_XML_DESCRIPTION="Smart Countdown 3 Module with additional animation profiles"
+
+; Basic options
+MOD_SMARTCOUNTDOWN3_DEADLINE_LABEL="Event Date and Time"
+MOD_SMARTCOUNTDOWN3_DEADLINE_DESC="Event time (Joomla server time zone)"
+
+MOD_SMARTCOUNTDOWN3_COUNTER_MODES_LABEL="Module Display"
+MOD_SMARTCOUNTDOWN3_COUNTER_MODES_DESC="Choose an option for countdown/count up modes display
*) When "_QQ_"auto"_QQ_" is selected and events queue is imported by a plugin, the event's duration (if set) will be used as a count up limit
**) "_QQ_"Countdown to event end"_QQ_" will work with compatible event import plugins only"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_ONLY="Show countdown only"
+MOD_SMARTCOUNTDOWN3_SHOW_BOTH_AUTO="Show countdown and count up (auto)*"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_ONLY="Show count up only"
+MOD_SMARTCOUNTDOWN3_COUNTDOWN_OPTIONS_GROUP="- Countdown will start before event -"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_60="Countdown starts 1 minute before event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_300="Countdown starts 5 minutes before event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_900="Countdown starts 15 minutes before event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_1800="Countdown starts 30 minutes before event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_3600="Countdown starts 1 hour before event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_28800="Countdown starts 8 hours before event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_43200="Countdown starts 12 hours before event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_86400="Countdown starts 24 hours before event"
+MOD_SMARTCOUNTDOWN3_COUNTUP_OPTIONS_GROUP="- Count up will stop after event -"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_60="Count up stops 1 minute after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_300="Count up stops 5 minutes after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_900="Count up stops 15 minutes after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_1800="Count up stops 30 minutes after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_3600="Count up stops 1 hour after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_28800="Count up stops 8 hours after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_43200="Count up stops 12 hours after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_86400="Count up stops 24 hours after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_TO_END="Countdown to event end **"
+
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_DOWN_LABEL="Text Before Counter
(countdown mode)"
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_DOWN_DESC="Enter event description displayed before counter block in countdown mode"
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_DOWN_LABEL="Text After Counter
(countdown mode)"
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_DOWN_DESC="Enter event description displayed after counter block in countdown mode"
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_UP_LABEL="Text Before Counter
(count up mode)"
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_UP_DESC="Enter event description displayed before counter block in count up mode"
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_UP_LABEL="Text After Counter
(count up mode)"
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_UP_DESC="Enter event description displayed after counter block in count up mode"
+
+MOD_SMARTCOUNTDOWN3_HIDE_COUNTUP_COUNTER_LABEL="Hide counter in count up mode"
+MOD_SMARTCOUNTDOWN3_HIDE_COUNTUP_COUNTER_DESC="Only display event descriptions in count up mode ("_QQ_"Time has arrived!"_QQ_" message mode)"
+
+; Layout
+COM_MODULES_LAYOUT_FIELDSET_LABEL="Layout"
+MOD_SMARTCOUNTDOWN3_UNITS_LABEL="Counter Units"
+MOD_SMARTCOUNTDOWN3_UNITS_DESC="Check counter units to show"
+MOD_SMARTCOUNTDOWN3_UNITS_YEARS="Years"
+MOD_SMARTCOUNTDOWN3_UNITS_MONTHS="Months"
+MOD_SMARTCOUNTDOWN3_UNITS_WEEKS="Weeks"
+MOD_SMARTCOUNTDOWN3_UNITS_DAYS="Days"
+MOD_SMARTCOUNTDOWN3_UNITS_HOURS="Hours"
+MOD_SMARTCOUNTDOWN3_UNITS_MINUTES="Minutes"
+MOD_SMARTCOUNTDOWN3_UNITS_SECONDS="Seconds"
+
+MOD_SMARTCOUNTDOWN3_LAYOUT_PRESET_LABEL="Layout Preset"
+MOD_SMARTCOUNTDOWN3_LAYOUT_PRESET_DESC="Select layout preset"
+MOD_SMARTCOUNTDOWN3_FX_PRESET_LABEL="Digits Animation"
+MOD_SMARTCOUNTDOWN3_FX_PRESET_DESC="Select digits animation preset"
+MOD_SMARTCOUNTDOWN3_HORIZONTALLY_CENTER_LABEL="Horizontally Center"
+MOD_SMARTCOUNTDOWN3_HORIZONTALLY_CENTER_DESC="Horizontally center all counter elements"
+
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_SIZE_LABEL="Text Before Size"
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_SIZE_DESC="Select font size in px for event description displayed before counter"
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_SIZE_LABEL="Text After Size"
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_SIZE_DESC="Select font size in px for event description displayed after counter"
+MOD_SMARTCOUNTDOWN3_DIGITS_SIZE_LABEL="Digits Size"
+MOD_SMARTCOUNTDOWN3_DIGITS_SIZE_DESC="Select size in px for counter digits"
+MOD_SMARTCOUNTDOWN3_LABELS_SIZE_LABEL="Labels Size"
+MOD_SMARTCOUNTDOWN3_LABELS_SIZE_DESC="Select font size in px for counter labels"
+
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_HORZ_LABEL="Units Horizontal Spacing"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_HORZ_DESC="Spacing between counter units in horizontal (row) layout"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_VERT_LABEL="Units Vertical Spacing"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_VERT_DESC="Spacing between counter units in vertical (column) layout"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_WIDE_PLUS="Largest"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_WIDE="Large"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_NORMAL="Normal"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_CONDENSED="Small"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_CONDENSED_PLUS="Smallest"
+
+MOD_SMARTCOUNTDOWN3_PREVIEW_LABEL="Preview"
+MOD_SMARTCOUNTDOWN3_PREVIEW_DESC="Preview module output in a separate test window. If you are changing module configuration and are not sure about the effects you can temporarily unpublish the module. It will not appear on your site front end but you will be able to test the changes in preview."
+MOD_SMARTCOUNTDOWN3_PREVIEW_OPEN="Open preview"
+MOD_SMARTCOUNTDOWN3_PREVIEW_SAVE_FIRST="Preview not available until you save the module.
You can initially save it as unpublished - it will be available for preview only and will not appear on your site front end."
+
+; Layout overrides
+COM_MODULES_OVERRIDE_LAYOUT_FIELDSET_LABEL="Layout Overrides"
+MOD_SMARTCOUNTDOWN3_OVERRIDE_LAYOUT_DESC="By default counter layout is read from currently selected layout preset. However you can override some layout settings using controls below. Please, keep in mind that if responsive feature is enabled, overrides will affect full-width module display only! Any further layout transformations in response to template position width changes will be controlled by responsive rules listed in active layout preset and cannot be overridden here. You have to create a custom layout preset to get full control over the module layout on all screens."
+MOD_SMARTCOUNTDOWN3_LAYOUT_OVERRIDE_NONE="- Do not override -"
+
+MOD_SMARTCOUNTDOWN3_COUNTER_LAYOUT_LABEL="Counter Layout"
+MOD_SMARTCOUNTDOWN3_COUNTER_LAYOUT_DESC="Choose how counter digits are aligned - horizontally (from left to right) or vertically (from top to bottom)"
+MOD_SMARTCOUNTDOWN3_COUNTER_LAYOUT_VERT="vertical"
+MOD_SMARTCOUNTDOWN3_COUNTER_LAYOUT_HORZ="horizontal"
+
+MOD_SMARTCOUNTDOWN3_EVENT_TEXT_POS_LABEL="Event Text Position"
+MOD_SMARTCOUNTDOWN3_EVENT_TEXT_POS_DESC="Choose where to display event description(s) - above/below the counter block or inline with the counter"
+MOD_SMARTCOUNTDOWN3_EVENT_TEXT_POS_VERT="above/below"
+MOD_SMARTCOUNTDOWN3_EVENT_TEXT_POS_HORZ="inline"
+
+MOD_SMARTCOUNTDOWN3_LABELS_POS_LABEL="Labels Position"
+MOD_SMARTCOUNTDOWN3_LABELS_POS_DESC="Choose labels position relative to digits"
+MOD_SMARTCOUNTDOWN3_LABELS_POS_RIGTH="right"
+MOD_SMARTCOUNTDOWN3_LABELS_POS_BOTTOM="bottom"
+MOD_SMARTCOUNTDOWN3_LABELS_POS_TOP="top"
+MOD_SMARTCOUNTDOWN3_LABELS_POS_LEFT="left"
+MOD_SMARTCOUNTDOWN3_LAYOUT_OVERRIDE_ALL_SCREENS_DESC="The settings below will be effective on all screens"
+
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_LABEL="Labels Vertical Alignment"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_DESC="Choose how labels are aligned with digits (for "_QQ_"right"_QQ_" or "_QQ_"left"_QQ_" labels positions only)
May not work as expected if digits size is not significantly larger than labels size"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_MIDDLE="middle"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_TOP="top"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_BOTTOM="bottom"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_HIGH="1/4 from top"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_LOW="1/4 from bottom"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_SUPERSCRIPT="superscript"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_SUBSCRIPT="subscript"
+
+MOD_SMARTCOUNTDOWN3_HIDE_HIGHEST_ZEROS_LABEL="Hide Zero Units"
+MOD_SMARTCOUNTDOWN3_HIDE_HIGHEST_ZEROS_DESC="Hide counter units (except seconds) if they display zero values"
+MOD_SMARTCOUNTDOWN3_HIDE_HIGHEST_ZEROS_HIGHEST="Highest zeros only"
+MOD_SMARTCOUNTDOWN3_HIDE_HIGHEST_ZEROS_ALL="All zeros"
+
+MOD_SMARTCOUNTDOWN3_ALLOW_ALL_ZEROS_LABEL="Allow All Zeros"
+MOD_SMARTCOUNTDOWN3_ALLOW_ALL_ZEROS_DESC="Allow the counter to display all zeros when time interval becomes less than the lowest time unit displayed"
+
+MOD_SMARTCOUNTDOWN3_DISABLE_RESPONSIVE_LABEL="Responsive Behavior"
+MOD_SMARTCOUNTDOWN3_DISABLE_RESPONSIVE_DESC="Disable responsive behavior"
+
+; Styles
+COM_MODULES_STYLES_FIELDSET_LABEL="Styles"
+MOD_SMARTCOUNTDOWN3_MODULE_STYLE_LABEL="Module Style(s)"
+MOD_SMARTCOUNTDOWN3_MODULE_STYLE_DESC="Additional style(s) applied to the module. Enter CSS rules separated and ended by "_QQ_";"_QQ_""
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_STYLE_LABEL="Text Before Style(s)"
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_STYLE_DESC="Additional event text style(s). Enter CSS rules separated and ended by "_QQ_";"_QQ_""
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_STYLE_LABEL="Text After Style(s)"
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_STYLE_DESC="Additional event text style(s). Enter CSS rules separated and ended by "_QQ_";"_QQ_""
+MOD_SMARTCOUNTDOWN3_DIGITS_STYLE_LABEL="Digits Style(s)"
+MOD_SMARTCOUNTDOWN3_DIGITS_STYLE_DESC="Additional style(s) applied to counter digits. Not all styles will have effect for all animations. Enter CSS rules separated and ended by "_QQ_";"_QQ_""
+MOD_SMARTCOUNTDOWN3_LABELS_STYLE_LABEL="Labels Style(s)"
+MOD_SMARTCOUNTDOWN3_LABELS_STYLE_DESC="Additional labels style(s). Enter CSS rules separated and ended by "_QQ_";"_QQ_""
+
+; Redirection
+COM_MODULES_REDIRECTION_FIELDSET_LABEL="Automatic Redirection"
+MOD_SMARTCOUNTDOWN3_COUNTER_CLICKABLE_LABEL="Redirect on click"
+MOD_SMARTCOUNTDOWN3_COUNTER_CLICKABLE_DESC="Open redirection URL when the module is clicked"
+MOD_SMARTCOUNTDOWN3_COUNTER_CLICKABLE_NEVER="Disabled"
+MOD_SMARTCOUNTDOWN3_COUNTER_CLICKABLE_ALWAYS="Always"
+MOD_SMARTCOUNTDOWN3_COUNTER_CLICKABLE_COUNTDOWN="Only before event start"
+MOD_SMARTCOUNTDOWN3_COUNTER_CLICKABLE_COUNTUP="Only while event is in progress"
+MOD_SMARTCOUNTDOWN3_CONFIRM_REDIRECT_LABEL="Confirm Redirection"
+MOD_SMARTCOUNTDOWN3_CONFIRM_REDIRECT_DESC="Ask user permission to leave the page if non-empty forms are found on the page"
+MOD_SMARTCOUNTDOWN3_REDIRECT_CONTROL_LABEL="Redirect on countdown zero or module click (optional) - Select menu item or enter absolute URL. If absolute URL is set redirect menu item will be ignored."
+MOD_SMARTCOUNTDOWN3_EVENT_GOTO_MENU_LABEL="Menu Item"
+MOD_SMARTCOUNTDOWN3_EVENT_GOTO_MENU_DESC="Choose menu item for automatic redirection. Choose "_QQ_"Disabled"_QQ_" (default) to disable automatic redirection"
+MOD_SMARTCOUNTDOWN3_EVENT_GOTO_URL_LABEL="Absolute URL"
+MOD_SMARTCOUNTDOWN3_EVENT_GOTO_URL_DESC="Enter absolute URL for automatic redirection."
+
+; Time units
+
+; n%100>=11 - [4]
+MOD_SMARTCOUNTDOWN3_N_YEARS="سنة"
+MOD_SMARTCOUNTDOWN3_N_MONTHS="شهر"
+MOD_SMARTCOUNTDOWN3_N_WEEKS="أسبوع"
+MOD_SMARTCOUNTDOWN3_N_DAYS="يوم"
+MOD_SMARTCOUNTDOWN3_N_HOURS="ساعة"
+MOD_SMARTCOUNTDOWN3_N_MINUTES="دقيقة"
+MOD_SMARTCOUNTDOWN3_N_SECONDS="ثانية"
+
+; n==0 - [0]
+MOD_SMARTCOUNTDOWN3_N_YEARS_1="سنة"
+MOD_SMARTCOUNTDOWN3_N_MONTHS_1="شهر"
+MOD_SMARTCOUNTDOWN3_N_WEEKS_1="أسبوع"
+MOD_SMARTCOUNTDOWN3_N_DAYS_1="يوم"
+MOD_SMARTCOUNTDOWN3_N_HOURS_1="ساعة"
+MOD_SMARTCOUNTDOWN3_N_MINUTES_1="دقيقة"
+MOD_SMARTCOUNTDOWN3_N_SECONDS_1="ثانية"
+
+; n==1 - [1]
+MOD_SMARTCOUNTDOWN3_N_YEARS_2="سنة"
+MOD_SMARTCOUNTDOWN3_N_MONTHS_2="شهر"
+MOD_SMARTCOUNTDOWN3_N_WEEKS_2="أسبوع"
+MOD_SMARTCOUNTDOWN3_N_DAYS_2="يوم"
+MOD_SMARTCOUNTDOWN3_N_HOURS_2="ساعة"
+MOD_SMARTCOUNTDOWN3_N_MINUTES_2="دقيقة"
+MOD_SMARTCOUNTDOWN3_N_SECONDS_2="ثانية"
+
+; n==2 - [2]
+MOD_SMARTCOUNTDOWN3_N_YEARS_3="سنتين"
+MOD_SMARTCOUNTDOWN3_N_MONTHS_3="شهرين"
+MOD_SMARTCOUNTDOWN3_N_WEEKS_3="أسبوعين"
+MOD_SMARTCOUNTDOWN3_N_DAYS_3="يومين"
+MOD_SMARTCOUNTDOWN3_N_HOURS_3="ساعتين"
+MOD_SMARTCOUNTDOWN3_N_MINUTES_3="دقيقتين"
+MOD_SMARTCOUNTDOWN3_N_SECONDS_3="ثانيتين"
+
+; n%100>=3 && n%100<=10 - [3]
+MOD_SMARTCOUNTDOWN3_N_YEARS_4="سنوات"
+MOD_SMARTCOUNTDOWN3_N_MONTHS_4="شهور"
+MOD_SMARTCOUNTDOWN3_N_WEEKS_4="أسابيع"
+MOD_SMARTCOUNTDOWN3_N_DAYS_4="أيام"
+MOD_SMARTCOUNTDOWN3_N_HOURS_4="ساعات"
+MOD_SMARTCOUNTDOWN3_N_MINUTES_4="دقائق"
+MOD_SMARTCOUNTDOWN3_N_SECONDS_4="ثوانٍ"
+
+; n>100 && n%100<3 - [5]
+MOD_SMARTCOUNTDOWN3_N_YEARS_5="سنة"
+MOD_SMARTCOUNTDOWN3_N_MONTHS_5="شهر"
+MOD_SMARTCOUNTDOWN3_N_WEEKS_5="أسبوع"
+MOD_SMARTCOUNTDOWN3_N_DAYS_5="يوم"
+MOD_SMARTCOUNTDOWN3_N_HOURS_5="ساعة"
+MOD_SMARTCOUNTDOWN3_N_MINUTES_5="دقيقة"
+MOD_SMARTCOUNTDOWN3_N_SECONDS_5="ثانية"
+
+
+; Misc frontend translations
+MOD_SMARTCOUNTDOWN3_REDIRECT_CONFIRM_HINT="أنت على وشك مغادرة الصفحة. جميع البيانات غير المحفوظة سيتم فقدانها. هل أنت متأكد من الخروج؟"
diff --git a/deployed/smartcountdown3/modules/mod_smartcountdown3/language/ar-AA/index.html b/deployed/smartcountdown3/modules/mod_smartcountdown3/language/ar-AA/index.html
new file mode 100644
index 00000000..2efb97f3
--- /dev/null
+++ b/deployed/smartcountdown3/modules/mod_smartcountdown3/language/ar-AA/index.html
@@ -0,0 +1 @@
+
diff --git a/deployed/smartcountdown3/modules/mod_smartcountdown3/language/de-DE/de-DE.mod_smartcountdown3.ini b/deployed/smartcountdown3/modules/mod_smartcountdown3/language/de-DE/de-DE.mod_smartcountdown3.ini
new file mode 100644
index 00000000..e4ec8ed5
--- /dev/null
+++ b/deployed/smartcountdown3/modules/mod_smartcountdown3/language/de-DE/de-DE.mod_smartcountdown3.ini
@@ -0,0 +1,180 @@
+; Note : All ini files need to be saved as UTF-8 - No BOM
+MOD_SMARTCOUNTDOWN3="Smart Countdown 3"
+MOD_SMARTCOUNTDOWN3_XML_DESCRIPTION="Smart Countdown 3 Module"
+MOD_SMARTCOUNTDOWN3_WITH_EXTRA_FX_XML_DESCRIPTION="Smart Countdown 3 Module with additional animation profiles"
+
+; Basic options
+MOD_SMARTCOUNTDOWN3_DEADLINE_LABEL="Event Date and Time"
+MOD_SMARTCOUNTDOWN3_DEADLINE_DESC="Event time (Joomla server time zone)"
+
+MOD_SMARTCOUNTDOWN3_COUNTER_MODES_LABEL="Module Display"
+MOD_SMARTCOUNTDOWN3_COUNTER_MODES_DESC="Choose an option for countdown/count up modes display
*) When "_QQ_"auto"_QQ_" is selected and events queue is imported by a plugin, the event's duration (if set) will be used as a count up limit
**) "_QQ_"Countdown to event end"_QQ_" will work with compatible event import plugins only"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_ONLY="Show countdown only"
+MOD_SMARTCOUNTDOWN3_SHOW_BOTH_AUTO="Show countdown and count up (auto)*"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_ONLY="Show count up only"
+MOD_SMARTCOUNTDOWN3_COUNTDOWN_OPTIONS_GROUP="- Countdown will start before event -"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_60="Countdown starts 1 minute before event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_300="Countdown starts 5 minutes before event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_900="Countdown starts 15 minutes before event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_1800="Countdown starts 30 minutes before event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_3600="Countdown starts 1 hour before event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_28800="Countdown starts 8 hours before event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_43200="Countdown starts 12 hours before event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_86400="Countdown starts 24 hours before event"
+MOD_SMARTCOUNTDOWN3_COUNTUP_OPTIONS_GROUP="- Count up will stop after event -"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_60="Count up stops 1 minute after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_300="Count up stops 5 minutes after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_900="Count up stops 15 minutes after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_1800="Count up stops 30 minutes after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_3600="Count up stops 1 hour after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_28800="Count up stops 8 hours after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_43200="Count up stops 12 hours after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_86400="Count up stops 24 hours after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_TO_END="Countdown to event end **"
+
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_DOWN_LABEL="Text Before Counter
(countdown mode)"
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_DOWN_DESC="Enter event description displayed before counter block in countdown mode"
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_DOWN_LABEL="Text After Counter
(countdown mode)"
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_DOWN_DESC="Enter event description displayed after counter block in countdown mode"
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_UP_LABEL="Text Before Counter
(count up mode)"
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_UP_DESC="Enter event description displayed before counter block in count up mode"
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_UP_LABEL="Text After Counter
(count up mode)"
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_UP_DESC="Enter event description displayed after counter block in count up mode"
+
+MOD_SMARTCOUNTDOWN3_HIDE_COUNTUP_COUNTER_LABEL="Hide counter in count up mode"
+MOD_SMARTCOUNTDOWN3_HIDE_COUNTUP_COUNTER_DESC="Only display event descriptions in count up mode ("_QQ_"Time has arrived!"_QQ_" message mode)"
+
+; Layout
+COM_MODULES_LAYOUT_FIELDSET_LABEL="Layout"
+MOD_SMARTCOUNTDOWN3_UNITS_LABEL="Counter Units"
+MOD_SMARTCOUNTDOWN3_UNITS_DESC="Check counter units to show"
+MOD_SMARTCOUNTDOWN3_UNITS_YEARS="Years"
+MOD_SMARTCOUNTDOWN3_UNITS_MONTHS="Months"
+MOD_SMARTCOUNTDOWN3_UNITS_WEEKS="Weeks"
+MOD_SMARTCOUNTDOWN3_UNITS_DAYS="Days"
+MOD_SMARTCOUNTDOWN3_UNITS_HOURS="Hours"
+MOD_SMARTCOUNTDOWN3_UNITS_MINUTES="Minutes"
+MOD_SMARTCOUNTDOWN3_UNITS_SECONDS="Seconds"
+
+MOD_SMARTCOUNTDOWN3_LAYOUT_PRESET_LABEL="Layout Preset"
+MOD_SMARTCOUNTDOWN3_LAYOUT_PRESET_DESC="Select layout preset"
+MOD_SMARTCOUNTDOWN3_FX_PRESET_LABEL="Digits Animation"
+MOD_SMARTCOUNTDOWN3_FX_PRESET_DESC="Select digits animation preset"
+MOD_SMARTCOUNTDOWN3_HORIZONTALLY_CENTER_LABEL="Horizontally Center"
+MOD_SMARTCOUNTDOWN3_HORIZONTALLY_CENTER_DESC="Horizontally center all counter elements"
+
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_SIZE_LABEL="Text Before Size"
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_SIZE_DESC="Select font size in px for event description displayed before counter"
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_SIZE_LABEL="Text After Size"
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_SIZE_DESC="Select font size in px for event description displayed after counter"
+MOD_SMARTCOUNTDOWN3_DIGITS_SIZE_LABEL="Digits Size"
+MOD_SMARTCOUNTDOWN3_DIGITS_SIZE_DESC="Select size in px for counter digits"
+MOD_SMARTCOUNTDOWN3_LABELS_SIZE_LABEL="Labels Size"
+MOD_SMARTCOUNTDOWN3_LABELS_SIZE_DESC="Select font size in px for counter labels"
+
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_HORZ_LABEL="Units Horizontal Spacing"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_HORZ_DESC="Spacing between counter units in horizontal (row) layout"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_VERT_LABEL="Units Vertical Spacing"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_VERT_DESC="Spacing between counter units in vertical (column) layout"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_WIDE_PLUS="Largest"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_WIDE="Large"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_NORMAL="Normal"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_CONDENSED="Small"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_CONDENSED_PLUS="Smallest"
+
+MOD_SMARTCOUNTDOWN3_PREVIEW_LABEL="Preview"
+MOD_SMARTCOUNTDOWN3_PREVIEW_DESC="Preview module output in a separate test window. If you are changing module configuration and are not sure about the effects you can temporarily unpublish the module. It will not appear on your site front end but you will be able to test the changes in preview."
+MOD_SMARTCOUNTDOWN3_PREVIEW_OPEN="Open preview"
+MOD_SMARTCOUNTDOWN3_PREVIEW_SAVE_FIRST="Preview not available until you save the module.
You can initially save it as unpublished - it will be available for preview only and will not appear on your site front end."
+
+; Layout overrides
+COM_MODULES_OVERRIDE_LAYOUT_FIELDSET_LABEL="Layout Overrides"
+MOD_SMARTCOUNTDOWN3_OVERRIDE_LAYOUT_DESC="By default counter layout is read from currently selected layout preset. However you can override some layout settings using controls below. Please, keep in mind that if responsive feature is enabled, overrides will affect full-width module display only! Any further layout transformations in response to template position width changes will be controlled by responsive rules listed in active layout preset and cannot be overridden here. You have to create a custom layout preset to get full control over the module layout on all screens."
+MOD_SMARTCOUNTDOWN3_LAYOUT_OVERRIDE_NONE="- Do not override -"
+
+MOD_SMARTCOUNTDOWN3_COUNTER_LAYOUT_LABEL="Counter Layout"
+MOD_SMARTCOUNTDOWN3_COUNTER_LAYOUT_DESC="Choose how counter digits are aligned - horizontally (from left to right) or vertically (from top to bottom)"
+MOD_SMARTCOUNTDOWN3_COUNTER_LAYOUT_VERT="vertical"
+MOD_SMARTCOUNTDOWN3_COUNTER_LAYOUT_HORZ="horizontal"
+
+MOD_SMARTCOUNTDOWN3_EVENT_TEXT_POS_LABEL="Event Text Position"
+MOD_SMARTCOUNTDOWN3_EVENT_TEXT_POS_DESC="Choose where to display event description(s) - above/below the counter block or inline with the counter"
+MOD_SMARTCOUNTDOWN3_EVENT_TEXT_POS_VERT="above/below"
+MOD_SMARTCOUNTDOWN3_EVENT_TEXT_POS_HORZ="inline"
+
+MOD_SMARTCOUNTDOWN3_LABELS_POS_LABEL="Labels Position"
+MOD_SMARTCOUNTDOWN3_LABELS_POS_DESC="Choose labels position relative to digits"
+MOD_SMARTCOUNTDOWN3_LABELS_POS_RIGTH="right"
+MOD_SMARTCOUNTDOWN3_LABELS_POS_BOTTOM="bottom"
+MOD_SMARTCOUNTDOWN3_LABELS_POS_TOP="top"
+MOD_SMARTCOUNTDOWN3_LABELS_POS_LEFT="left"
+MOD_SMARTCOUNTDOWN3_LAYOUT_OVERRIDE_ALL_SCREENS_DESC="The settings below will be effective on all screens"
+
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_LABEL="Labels Vertical Alignment"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_DESC="Choose how labels are aligned with digits (for "_QQ_"right"_QQ_" or "_QQ_"left"_QQ_" labels positions only)
May not work as expected if digits size is not significantly larger than labels size"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_MIDDLE="middle"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_TOP="top"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_BOTTOM="bottom"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_HIGH="1/4 from top"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_LOW="1/4 from bottom"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_SUPERSCRIPT="superscript"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_SUBSCRIPT="subscript"
+
+MOD_SMARTCOUNTDOWN3_HIDE_HIGHEST_ZEROS_LABEL="Hide Zero Units"
+MOD_SMARTCOUNTDOWN3_HIDE_HIGHEST_ZEROS_DESC="Hide counter units (except seconds) if they display zero values"
+MOD_SMARTCOUNTDOWN3_HIDE_HIGHEST_ZEROS_HIGHEST="Highest zeros only"
+MOD_SMARTCOUNTDOWN3_HIDE_HIGHEST_ZEROS_ALL="All zeros"
+
+MOD_SMARTCOUNTDOWN3_ALLOW_ALL_ZEROS_LABEL="Allow All Zeros"
+MOD_SMARTCOUNTDOWN3_ALLOW_ALL_ZEROS_DESC="Allow the counter to display all zeros when time interval becomes less than the lowest time unit displayed"
+
+MOD_SMARTCOUNTDOWN3_DISABLE_RESPONSIVE_LABEL="Responsive Behavior"
+MOD_SMARTCOUNTDOWN3_DISABLE_RESPONSIVE_DESC="Disable responsive behavior"
+
+; Styles
+COM_MODULES_STYLES_FIELDSET_LABEL="Styles"
+MOD_SMARTCOUNTDOWN3_MODULE_STYLE_LABEL="Module Style(s)"
+MOD_SMARTCOUNTDOWN3_MODULE_STYLE_DESC="Additional style(s) applied to the module. Enter CSS rules separated and ended by "_QQ_";"_QQ_""
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_STYLE_LABEL="Text Before Style(s)"
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_STYLE_DESC="Additional event text style(s). Enter CSS rules separated and ended by "_QQ_";"_QQ_""
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_STYLE_LABEL="Text After Style(s)"
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_STYLE_DESC="Additional event text style(s). Enter CSS rules separated and ended by "_QQ_";"_QQ_""
+MOD_SMARTCOUNTDOWN3_DIGITS_STYLE_LABEL="Digits Style(s)"
+MOD_SMARTCOUNTDOWN3_DIGITS_STYLE_DESC="Additional style(s) applied to counter digits. Not all styles will have effect for all animations. Enter CSS rules separated and ended by "_QQ_";"_QQ_""
+MOD_SMARTCOUNTDOWN3_LABELS_STYLE_LABEL="Labels Style(s)"
+MOD_SMARTCOUNTDOWN3_LABELS_STYLE_DESC="Additional labels style(s). Enter CSS rules separated and ended by "_QQ_";"_QQ_""
+
+; Redirection
+COM_MODULES_REDIRECTION_FIELDSET_LABEL="Automatic Redirection"
+MOD_SMARTCOUNTDOWN3_COUNTER_CLICKABLE_LABEL="Redirect on click"
+MOD_SMARTCOUNTDOWN3_COUNTER_CLICKABLE_DESC="Open redirection URL when the module is clicked"
+MOD_SMARTCOUNTDOWN3_COUNTER_CLICKABLE_NEVER="Disabled"
+MOD_SMARTCOUNTDOWN3_COUNTER_CLICKABLE_ALWAYS="Always"
+MOD_SMARTCOUNTDOWN3_COUNTER_CLICKABLE_COUNTDOWN="Only before event start"
+MOD_SMARTCOUNTDOWN3_COUNTER_CLICKABLE_COUNTUP="Only while event is in progress"
+MOD_SMARTCOUNTDOWN3_CONFIRM_REDIRECT_LABEL="Confirm Redirection"
+MOD_SMARTCOUNTDOWN3_CONFIRM_REDIRECT_DESC="Ask user permission to leave the page if non-empty forms are found on the page"
+MOD_SMARTCOUNTDOWN3_REDIRECT_CONTROL_LABEL="Redirect on countdown zero or module click (optional) - Select menu item or enter absolute URL. If absolute URL is set redirect menu item will be ignored."
+MOD_SMARTCOUNTDOWN3_EVENT_GOTO_MENU_LABEL="Menu Item"
+MOD_SMARTCOUNTDOWN3_EVENT_GOTO_MENU_DESC="Choose menu item for automatic redirection. Choose "_QQ_"Disabled"_QQ_" (default) to disable automatic redirection"
+MOD_SMARTCOUNTDOWN3_EVENT_GOTO_URL_LABEL="Absolute URL"
+MOD_SMARTCOUNTDOWN3_EVENT_GOTO_URL_DESC="Enter absolute URL for automatic redirection."
+
+; Time units
+MOD_SMARTCOUNTDOWN3_N_YEARS="Jahre"
+MOD_SMARTCOUNTDOWN3_N_MONTHS="Monate"
+MOD_SMARTCOUNTDOWN3_N_WEEKS="Wochen"
+MOD_SMARTCOUNTDOWN3_N_DAYS="Tage"
+MOD_SMARTCOUNTDOWN3_N_HOURS="Stunden"
+MOD_SMARTCOUNTDOWN3_N_MINUTES="Minuten"
+MOD_SMARTCOUNTDOWN3_N_SECONDS="Sekunden"
+MOD_SMARTCOUNTDOWN3_N_YEARS_1="Jahr"
+MOD_SMARTCOUNTDOWN3_N_MONTHS_1="Monat"
+MOD_SMARTCOUNTDOWN3_N_WEEKS_1="Woche"
+MOD_SMARTCOUNTDOWN3_N_DAYS_1="Tag"
+MOD_SMARTCOUNTDOWN3_N_HOURS_1="Stunde"
+MOD_SMARTCOUNTDOWN3_N_MINUTES_1="Minute"
+MOD_SMARTCOUNTDOWN3_N_SECONDS_1="Sekunde"
+
+; Misc frontend translations
+MOD_SMARTCOUNTDOWN3_REDIRECT_CONFIRM_HINT="You are going to leave this page. All unsaved data will be lost. Are you sure?"
diff --git a/deployed/smartcountdown3/modules/mod_smartcountdown3/language/de-DE/index.html b/deployed/smartcountdown3/modules/mod_smartcountdown3/language/de-DE/index.html
new file mode 100644
index 00000000..2efb97f3
--- /dev/null
+++ b/deployed/smartcountdown3/modules/mod_smartcountdown3/language/de-DE/index.html
@@ -0,0 +1 @@
+
diff --git a/deployed/smartcountdown3/modules/mod_smartcountdown3/language/en-GB/en-GB.mod_smartcountdown3.ini b/deployed/smartcountdown3/modules/mod_smartcountdown3/language/en-GB/en-GB.mod_smartcountdown3.ini
new file mode 100644
index 00000000..e19b4cf2
--- /dev/null
+++ b/deployed/smartcountdown3/modules/mod_smartcountdown3/language/en-GB/en-GB.mod_smartcountdown3.ini
@@ -0,0 +1,180 @@
+; Note : All ini files need to be saved as UTF-8 - No BOM
+MOD_SMARTCOUNTDOWN3="Smart Countdown 3"
+MOD_SMARTCOUNTDOWN3_XML_DESCRIPTION="Smart Countdown 3 Module"
+MOD_SMARTCOUNTDOWN3_WITH_EXTRA_FX_XML_DESCRIPTION="Smart Countdown 3 Module with additional animation profiles"
+
+; Basic options
+MOD_SMARTCOUNTDOWN3_DEADLINE_LABEL="Event Date and Time"
+MOD_SMARTCOUNTDOWN3_DEADLINE_DESC="Event time (Joomla server time zone)"
+
+MOD_SMARTCOUNTDOWN3_COUNTER_MODES_LABEL="Module Display"
+MOD_SMARTCOUNTDOWN3_COUNTER_MODES_DESC="Choose an option for countdown/count up modes display
*) When "_QQ_"auto"_QQ_" is selected and events queue is imported by a plugin, the event's duration (if set) will be used as a count up limit
**) "_QQ_"Countdown to event end"_QQ_" will work with compatible event import plugins only"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_ONLY="Show countdown only"
+MOD_SMARTCOUNTDOWN3_SHOW_BOTH_AUTO="Show countdown and count up (auto)*"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_ONLY="Show count up only"
+MOD_SMARTCOUNTDOWN3_COUNTDOWN_OPTIONS_GROUP="- Countdown will start before event -"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_60="Countdown starts 1 minute before event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_300="Countdown starts 5 minutes before event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_900="Countdown starts 15 minutes before event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_1800="Countdown starts 30 minutes before event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_3600="Countdown starts 1 hour before event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_28800="Countdown starts 8 hours before event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_43200="Countdown starts 12 hours before event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_86400="Countdown starts 24 hours before event"
+MOD_SMARTCOUNTDOWN3_COUNTUP_OPTIONS_GROUP="- Count up will stop after event -"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_60="Count up stops 1 minute after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_300="Count up stops 5 minutes after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_900="Count up stops 15 minutes after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_1800="Count up stops 30 minutes after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_3600="Count up stops 1 hour after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_28800="Count up stops 8 hours after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_43200="Count up stops 12 hours after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_86400="Count up stops 24 hours after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_TO_END="Countdown to event end **"
+
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_DOWN_LABEL="Text Before Counter
(countdown mode)"
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_DOWN_DESC="Enter event description displayed before counter block in countdown mode"
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_DOWN_LABEL="Text After Counter
(countdown mode)"
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_DOWN_DESC="Enter event description displayed after counter block in countdown mode"
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_UP_LABEL="Text Before Counter
(count up mode)"
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_UP_DESC="Enter event description displayed before counter block in count up mode"
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_UP_LABEL="Text After Counter
(count up mode)"
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_UP_DESC="Enter event description displayed after counter block in count up mode"
+
+MOD_SMARTCOUNTDOWN3_HIDE_COUNTUP_COUNTER_LABEL="Hide counter in count up mode"
+MOD_SMARTCOUNTDOWN3_HIDE_COUNTUP_COUNTER_DESC="Only display event descriptions in count up mode ("_QQ_"Time has arrived!"_QQ_" message mode)"
+
+; Layout
+COM_MODULES_LAYOUT_FIELDSET_LABEL="Layout"
+MOD_SMARTCOUNTDOWN3_UNITS_LABEL="Counter Units"
+MOD_SMARTCOUNTDOWN3_UNITS_DESC="Check counter units to show"
+MOD_SMARTCOUNTDOWN3_UNITS_YEARS="Years"
+MOD_SMARTCOUNTDOWN3_UNITS_MONTHS="Months"
+MOD_SMARTCOUNTDOWN3_UNITS_WEEKS="Weeks"
+MOD_SMARTCOUNTDOWN3_UNITS_DAYS="Days"
+MOD_SMARTCOUNTDOWN3_UNITS_HOURS="Hours"
+MOD_SMARTCOUNTDOWN3_UNITS_MINUTES="Minutes"
+MOD_SMARTCOUNTDOWN3_UNITS_SECONDS="Seconds"
+
+MOD_SMARTCOUNTDOWN3_LAYOUT_PRESET_LABEL="Layout Preset"
+MOD_SMARTCOUNTDOWN3_LAYOUT_PRESET_DESC="Select layout preset"
+MOD_SMARTCOUNTDOWN3_FX_PRESET_LABEL="Digits Animation"
+MOD_SMARTCOUNTDOWN3_FX_PRESET_DESC="Select digits animation preset"
+MOD_SMARTCOUNTDOWN3_HORIZONTALLY_CENTER_LABEL="Horizontally Center"
+MOD_SMARTCOUNTDOWN3_HORIZONTALLY_CENTER_DESC="Horizontally center all counter elements"
+
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_SIZE_LABEL="Text Before Size"
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_SIZE_DESC="Select font size in px for event description displayed before counter"
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_SIZE_LABEL="Text After Size"
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_SIZE_DESC="Select font size in px for event description displayed after counter"
+MOD_SMARTCOUNTDOWN3_DIGITS_SIZE_LABEL="Digits Size"
+MOD_SMARTCOUNTDOWN3_DIGITS_SIZE_DESC="Select size in px for counter digits"
+MOD_SMARTCOUNTDOWN3_LABELS_SIZE_LABEL="Labels Size"
+MOD_SMARTCOUNTDOWN3_LABELS_SIZE_DESC="Select font size in px for counter labels"
+
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_HORZ_LABEL="Units Horizontal Spacing"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_HORZ_DESC="Spacing between counter units in horizontal (row) layout"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_VERT_LABEL="Units Vertical Spacing"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_VERT_DESC="Spacing between counter units in vertical (column) layout"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_WIDE_PLUS="Largest"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_WIDE="Large"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_NORMAL="Normal"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_CONDENSED="Small"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_CONDENSED_PLUS="Smallest"
+
+MOD_SMARTCOUNTDOWN3_PREVIEW_LABEL="Preview"
+MOD_SMARTCOUNTDOWN3_PREVIEW_DESC="Preview module output in a separate test window. If you are changing module configuration and are not sure about the effects you can temporarily unpublish the module. It will not appear on your site front end but you will be able to test the changes in preview."
+MOD_SMARTCOUNTDOWN3_PREVIEW_OPEN="Open preview"
+MOD_SMARTCOUNTDOWN3_PREVIEW_SAVE_FIRST="Preview not available until you save the module.
You can initially save it as unpublished - it will be available for preview only and will not appear on your site front end."
+
+; Layout overrides
+COM_MODULES_OVERRIDE_LAYOUT_FIELDSET_LABEL="Layout Overrides"
+MOD_SMARTCOUNTDOWN3_OVERRIDE_LAYOUT_DESC="By default counter layout is read from currently selected layout preset. However you can override some layout settings using controls below. Please, keep in mind that if responsive feature is enabled, overrides will affect full-width module display only! Any further layout transformations in response to template position width changes will be controlled by responsive rules listed in active layout preset and cannot be overridden here. You have to create a custom layout preset to get full control over the module layout on all screens."
+MOD_SMARTCOUNTDOWN3_LAYOUT_OVERRIDE_NONE="- Do not override -"
+
+MOD_SMARTCOUNTDOWN3_COUNTER_LAYOUT_LABEL="Counter Layout"
+MOD_SMARTCOUNTDOWN3_COUNTER_LAYOUT_DESC="Choose how counter digits are aligned - horizontally (from left to right) or vertically (from top to bottom)"
+MOD_SMARTCOUNTDOWN3_COUNTER_LAYOUT_VERT="vertical"
+MOD_SMARTCOUNTDOWN3_COUNTER_LAYOUT_HORZ="horizontal"
+
+MOD_SMARTCOUNTDOWN3_EVENT_TEXT_POS_LABEL="Event Text Position"
+MOD_SMARTCOUNTDOWN3_EVENT_TEXT_POS_DESC="Choose where to display event description(s) - above/below the counter block or inline with the counter"
+MOD_SMARTCOUNTDOWN3_EVENT_TEXT_POS_VERT="above/below"
+MOD_SMARTCOUNTDOWN3_EVENT_TEXT_POS_HORZ="inline"
+
+MOD_SMARTCOUNTDOWN3_LABELS_POS_LABEL="Labels Position"
+MOD_SMARTCOUNTDOWN3_LABELS_POS_DESC="Choose labels position relative to digits"
+MOD_SMARTCOUNTDOWN3_LABELS_POS_RIGTH="right"
+MOD_SMARTCOUNTDOWN3_LABELS_POS_BOTTOM="bottom"
+MOD_SMARTCOUNTDOWN3_LABELS_POS_TOP="top"
+MOD_SMARTCOUNTDOWN3_LABELS_POS_LEFT="left"
+MOD_SMARTCOUNTDOWN3_LAYOUT_OVERRIDE_ALL_SCREENS_DESC="The settings below will be effective on all screens"
+
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_LABEL="Labels Vertical Alignment"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_DESC="Choose how labels are aligned with digits (for "_QQ_"right"_QQ_" or "_QQ_"left"_QQ_" labels positions only)
May not work as expected if digits size is not significantly larger than labels size"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_MIDDLE="middle"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_TOP="top"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_BOTTOM="bottom"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_HIGH="1/4 from top"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_LOW="1/4 from bottom"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_SUPERSCRIPT="superscript"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_SUBSCRIPT="subscript"
+
+MOD_SMARTCOUNTDOWN3_HIDE_HIGHEST_ZEROS_LABEL="Hide Zero Units"
+MOD_SMARTCOUNTDOWN3_HIDE_HIGHEST_ZEROS_DESC="Hide counter units (except seconds) if they display zero values"
+MOD_SMARTCOUNTDOWN3_HIDE_HIGHEST_ZEROS_HIGHEST="Highest zeros only"
+MOD_SMARTCOUNTDOWN3_HIDE_HIGHEST_ZEROS_ALL="All zeros"
+
+MOD_SMARTCOUNTDOWN3_ALLOW_ALL_ZEROS_LABEL="Allow All Zeros"
+MOD_SMARTCOUNTDOWN3_ALLOW_ALL_ZEROS_DESC="Allow the counter to display all zeros when time interval becomes less than the lowest time unit displayed"
+
+MOD_SMARTCOUNTDOWN3_DISABLE_RESPONSIVE_LABEL="Responsive Behavior"
+MOD_SMARTCOUNTDOWN3_DISABLE_RESPONSIVE_DESC="Disable responsive behavior"
+
+; Styles
+COM_MODULES_STYLES_FIELDSET_LABEL="Styles"
+MOD_SMARTCOUNTDOWN3_MODULE_STYLE_LABEL="Module Style(s)"
+MOD_SMARTCOUNTDOWN3_MODULE_STYLE_DESC="Additional style(s) applied to the module. Enter CSS rules separated and ended by "_QQ_";"_QQ_""
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_STYLE_LABEL="Text Before Style(s)"
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_STYLE_DESC="Additional event text style(s). Enter CSS rules separated and ended by "_QQ_";"_QQ_""
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_STYLE_LABEL="Text After Style(s)"
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_STYLE_DESC="Additional event text style(s). Enter CSS rules separated and ended by "_QQ_";"_QQ_""
+MOD_SMARTCOUNTDOWN3_DIGITS_STYLE_LABEL="Digits Style(s)"
+MOD_SMARTCOUNTDOWN3_DIGITS_STYLE_DESC="Additional style(s) applied to counter digits. Not all styles will have effect for all animations. Enter CSS rules separated and ended by "_QQ_";"_QQ_""
+MOD_SMARTCOUNTDOWN3_LABELS_STYLE_LABEL="Labels Style(s)"
+MOD_SMARTCOUNTDOWN3_LABELS_STYLE_DESC="Additional labels style(s). Enter CSS rules separated and ended by "_QQ_";"_QQ_""
+
+; Redirection
+COM_MODULES_REDIRECTION_FIELDSET_LABEL="Automatic Redirection"
+MOD_SMARTCOUNTDOWN3_COUNTER_CLICKABLE_LABEL="Redirect on click"
+MOD_SMARTCOUNTDOWN3_COUNTER_CLICKABLE_DESC="Open redirection URL when the module is clicked"
+MOD_SMARTCOUNTDOWN3_COUNTER_CLICKABLE_NEVER="Disabled"
+MOD_SMARTCOUNTDOWN3_COUNTER_CLICKABLE_ALWAYS="Always"
+MOD_SMARTCOUNTDOWN3_COUNTER_CLICKABLE_COUNTDOWN="Only before event start"
+MOD_SMARTCOUNTDOWN3_COUNTER_CLICKABLE_COUNTUP="Only while event is in progress"
+MOD_SMARTCOUNTDOWN3_CONFIRM_REDIRECT_LABEL="Confirm Redirection"
+MOD_SMARTCOUNTDOWN3_CONFIRM_REDIRECT_DESC="Ask user permission to leave the page if non-empty forms are found on the page"
+MOD_SMARTCOUNTDOWN3_REDIRECT_CONTROL_LABEL="Redirect on countdown zero or module click (optional) - Select menu item or enter absolute URL. If absolute URL is set redirect menu item will be ignored."
+MOD_SMARTCOUNTDOWN3_EVENT_GOTO_MENU_LABEL="Menu Item"
+MOD_SMARTCOUNTDOWN3_EVENT_GOTO_MENU_DESC="Choose menu item for automatic redirection. Choose "_QQ_"Disabled"_QQ_" (default) to disable automatic redirection"
+MOD_SMARTCOUNTDOWN3_EVENT_GOTO_URL_LABEL="Absolute URL"
+MOD_SMARTCOUNTDOWN3_EVENT_GOTO_URL_DESC="Enter absolute URL for automatic redirection."
+
+; Time units
+MOD_SMARTCOUNTDOWN3_N_YEARS="Years"
+MOD_SMARTCOUNTDOWN3_N_MONTHS="Months"
+MOD_SMARTCOUNTDOWN3_N_WEEKS="Weeks"
+MOD_SMARTCOUNTDOWN3_N_DAYS="Days"
+MOD_SMARTCOUNTDOWN3_N_HOURS="Hours"
+MOD_SMARTCOUNTDOWN3_N_MINUTES="Minutes"
+MOD_SMARTCOUNTDOWN3_N_SECONDS="Seconds"
+MOD_SMARTCOUNTDOWN3_N_YEARS_1="Year"
+MOD_SMARTCOUNTDOWN3_N_MONTHS_1="Month"
+MOD_SMARTCOUNTDOWN3_N_WEEKS_1="Week"
+MOD_SMARTCOUNTDOWN3_N_DAYS_1="Day"
+MOD_SMARTCOUNTDOWN3_N_HOURS_1="Hour"
+MOD_SMARTCOUNTDOWN3_N_MINUTES_1="Minute"
+MOD_SMARTCOUNTDOWN3_N_SECONDS_1="Second"
+
+; Misc frontend translations
+MOD_SMARTCOUNTDOWN3_REDIRECT_CONFIRM_HINT="You are going to leave this page. All unsaved data will be lost. Are you sure?"
diff --git a/deployed/smartcountdown3/modules/mod_smartcountdown3/language/en-GB/en-GB.mod_smartcountdown3.sys.ini b/deployed/smartcountdown3/modules/mod_smartcountdown3/language/en-GB/en-GB.mod_smartcountdown3.sys.ini
new file mode 100644
index 00000000..15f07db5
--- /dev/null
+++ b/deployed/smartcountdown3/modules/mod_smartcountdown3/language/en-GB/en-GB.mod_smartcountdown3.sys.ini
@@ -0,0 +1,4 @@
+; Note : All ini files need to be saved as UTF-8 - No BOM
+MOD_SMARTCOUNTDOWN3="Smart Countdown 3"
+MOD_SMARTCOUNTDOWN3_XML_DESCRIPTION="Smart Countdown 3 Module"
+MOD_SMARTCOUNTDOWN3_WITH_EXTRA_FX_XML_DESCRIPTION="Smart Countdown 3 Module with additional animation profiles"
\ No newline at end of file
diff --git a/deployed/smartcountdown3/modules/mod_smartcountdown3/language/en-GB/index.html b/deployed/smartcountdown3/modules/mod_smartcountdown3/language/en-GB/index.html
new file mode 100644
index 00000000..2efb97f3
--- /dev/null
+++ b/deployed/smartcountdown3/modules/mod_smartcountdown3/language/en-GB/index.html
@@ -0,0 +1 @@
+
diff --git a/deployed/smartcountdown3/modules/mod_smartcountdown3/language/es-ES/es-ES.mod_smartcountdown3.ini b/deployed/smartcountdown3/modules/mod_smartcountdown3/language/es-ES/es-ES.mod_smartcountdown3.ini
new file mode 100644
index 00000000..d0df0984
--- /dev/null
+++ b/deployed/smartcountdown3/modules/mod_smartcountdown3/language/es-ES/es-ES.mod_smartcountdown3.ini
@@ -0,0 +1,180 @@
+; Note : All ini files need to be saved as UTF-8 - No BOM
+MOD_SMARTCOUNTDOWN3="Smart Countdown 3"
+MOD_SMARTCOUNTDOWN3_XML_DESCRIPTION="Smart Countdown 3 Module"
+MOD_SMARTCOUNTDOWN3_WITH_EXTRA_FX_XML_DESCRIPTION="Smart Countdown 3 Module with additional animation profiles"
+
+; Basic options
+MOD_SMARTCOUNTDOWN3_DEADLINE_LABEL="Event Date and Time"
+MOD_SMARTCOUNTDOWN3_DEADLINE_DESC="Event time (Joomla server time zone)"
+
+MOD_SMARTCOUNTDOWN3_COUNTER_MODES_LABEL="Module Display"
+MOD_SMARTCOUNTDOWN3_COUNTER_MODES_DESC="Choose an option for countdown/count up modes display
*) When "_QQ_"auto"_QQ_" is selected and events queue is imported by a plugin, the event's duration (if set) will be used as a count up limit
**) "_QQ_"Countdown to event end"_QQ_" will work with compatible event import plugins only"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_ONLY="Show countdown only"
+MOD_SMARTCOUNTDOWN3_SHOW_BOTH_AUTO="Show countdown and count up (auto)*"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_ONLY="Show count up only"
+MOD_SMARTCOUNTDOWN3_COUNTDOWN_OPTIONS_GROUP="- Countdown will start before event -"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_60="Countdown starts 1 minute before event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_300="Countdown starts 5 minutes before event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_900="Countdown starts 15 minutes before event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_1800="Countdown starts 30 minutes before event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_3600="Countdown starts 1 hour before event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_28800="Countdown starts 8 hours before event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_43200="Countdown starts 12 hours before event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_86400="Countdown starts 24 hours before event"
+MOD_SMARTCOUNTDOWN3_COUNTUP_OPTIONS_GROUP="- Count up will stop after event -"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_60="Count up stops 1 minute after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_300="Count up stops 5 minutes after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_900="Count up stops 15 minutes after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_1800="Count up stops 30 minutes after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_3600="Count up stops 1 hour after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_28800="Count up stops 8 hours after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_43200="Count up stops 12 hours after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_86400="Count up stops 24 hours after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_TO_END="Countdown to event end **"
+
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_DOWN_LABEL="Text Before Counter
(countdown mode)"
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_DOWN_DESC="Enter event description displayed before counter block in countdown mode"
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_DOWN_LABEL="Text After Counter
(countdown mode)"
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_DOWN_DESC="Enter event description displayed after counter block in countdown mode"
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_UP_LABEL="Text Before Counter
(count up mode)"
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_UP_DESC="Enter event description displayed before counter block in count up mode"
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_UP_LABEL="Text After Counter
(count up mode)"
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_UP_DESC="Enter event description displayed after counter block in count up mode"
+
+MOD_SMARTCOUNTDOWN3_HIDE_COUNTUP_COUNTER_LABEL="Hide counter in count up mode"
+MOD_SMARTCOUNTDOWN3_HIDE_COUNTUP_COUNTER_DESC="Only display event descriptions in count up mode ("_QQ_"Time has arrived!"_QQ_" message mode)"
+
+; Layout
+COM_MODULES_LAYOUT_FIELDSET_LABEL="Layout"
+MOD_SMARTCOUNTDOWN3_UNITS_LABEL="Counter Units"
+MOD_SMARTCOUNTDOWN3_UNITS_DESC="Check counter units to show"
+MOD_SMARTCOUNTDOWN3_UNITS_YEARS="Years"
+MOD_SMARTCOUNTDOWN3_UNITS_MONTHS="Months"
+MOD_SMARTCOUNTDOWN3_UNITS_WEEKS="Weeks"
+MOD_SMARTCOUNTDOWN3_UNITS_DAYS="Days"
+MOD_SMARTCOUNTDOWN3_UNITS_HOURS="Hours"
+MOD_SMARTCOUNTDOWN3_UNITS_MINUTES="Minutes"
+MOD_SMARTCOUNTDOWN3_UNITS_SECONDS="Seconds"
+
+MOD_SMARTCOUNTDOWN3_LAYOUT_PRESET_LABEL="Layout Preset"
+MOD_SMARTCOUNTDOWN3_LAYOUT_PRESET_DESC="Select layout preset"
+MOD_SMARTCOUNTDOWN3_FX_PRESET_LABEL="Digits Animation"
+MOD_SMARTCOUNTDOWN3_FX_PRESET_DESC="Select digits animation preset"
+MOD_SMARTCOUNTDOWN3_HORIZONTALLY_CENTER_LABEL="Horizontally Center"
+MOD_SMARTCOUNTDOWN3_HORIZONTALLY_CENTER_DESC="Horizontally center all counter elements"
+
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_SIZE_LABEL="Text Before Size"
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_SIZE_DESC="Select font size in px for event description displayed before counter"
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_SIZE_LABEL="Text After Size"
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_SIZE_DESC="Select font size in px for event description displayed after counter"
+MOD_SMARTCOUNTDOWN3_DIGITS_SIZE_LABEL="Digits Size"
+MOD_SMARTCOUNTDOWN3_DIGITS_SIZE_DESC="Select size in px for counter digits"
+MOD_SMARTCOUNTDOWN3_LABELS_SIZE_LABEL="Labels Size"
+MOD_SMARTCOUNTDOWN3_LABELS_SIZE_DESC="Select font size in px for counter labels"
+
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_HORZ_LABEL="Units Horizontal Spacing"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_HORZ_DESC="Spacing between counter units in horizontal (row) layout"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_VERT_LABEL="Units Vertical Spacing"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_VERT_DESC="Spacing between counter units in vertical (column) layout"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_WIDE_PLUS="Largest"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_WIDE="Large"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_NORMAL="Normal"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_CONDENSED="Small"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_CONDENSED_PLUS="Smallest"
+
+MOD_SMARTCOUNTDOWN3_PREVIEW_LABEL="Preview"
+MOD_SMARTCOUNTDOWN3_PREVIEW_DESC="Preview module output in a separate test window. If you are changing module configuration and are not sure about the effects you can temporarily unpublish the module. It will not appear on your site front end but you will be able to test the changes in preview."
+MOD_SMARTCOUNTDOWN3_PREVIEW_OPEN="Open preview"
+MOD_SMARTCOUNTDOWN3_PREVIEW_SAVE_FIRST="Preview not available until you save the module.
You can initially save it as unpublished - it will be available for preview only and will not appear on your site front end."
+
+; Layout overrides
+COM_MODULES_OVERRIDE_LAYOUT_FIELDSET_LABEL="Layout Overrides"
+MOD_SMARTCOUNTDOWN3_OVERRIDE_LAYOUT_DESC="By default counter layout is read from currently selected layout preset. However you can override some layout settings using controls below. Please, keep in mind that if responsive feature is enabled, overrides will affect full-width module display only! Any further layout transformations in response to template position width changes will be controlled by responsive rules listed in active layout preset and cannot be overridden here. You have to create a custom layout preset to get full control over the module layout on all screens."
+MOD_SMARTCOUNTDOWN3_LAYOUT_OVERRIDE_NONE="- Do not override -"
+
+MOD_SMARTCOUNTDOWN3_COUNTER_LAYOUT_LABEL="Counter Layout"
+MOD_SMARTCOUNTDOWN3_COUNTER_LAYOUT_DESC="Choose how counter digits are aligned - horizontally (from left to right) or vertically (from top to bottom)"
+MOD_SMARTCOUNTDOWN3_COUNTER_LAYOUT_VERT="vertical"
+MOD_SMARTCOUNTDOWN3_COUNTER_LAYOUT_HORZ="horizontal"
+
+MOD_SMARTCOUNTDOWN3_EVENT_TEXT_POS_LABEL="Event Text Position"
+MOD_SMARTCOUNTDOWN3_EVENT_TEXT_POS_DESC="Choose where to display event description(s) - above/below the counter block or inline with the counter"
+MOD_SMARTCOUNTDOWN3_EVENT_TEXT_POS_VERT="above/below"
+MOD_SMARTCOUNTDOWN3_EVENT_TEXT_POS_HORZ="inline"
+
+MOD_SMARTCOUNTDOWN3_LABELS_POS_LABEL="Labels Position"
+MOD_SMARTCOUNTDOWN3_LABELS_POS_DESC="Choose labels position relative to digits"
+MOD_SMARTCOUNTDOWN3_LABELS_POS_RIGTH="right"
+MOD_SMARTCOUNTDOWN3_LABELS_POS_BOTTOM="bottom"
+MOD_SMARTCOUNTDOWN3_LABELS_POS_TOP="top"
+MOD_SMARTCOUNTDOWN3_LABELS_POS_LEFT="left"
+MOD_SMARTCOUNTDOWN3_LAYOUT_OVERRIDE_ALL_SCREENS_DESC="The settings below will be effective on all screens"
+
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_LABEL="Labels Vertical Alignment"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_DESC="Choose how labels are aligned with digits (for "_QQ_"right"_QQ_" or "_QQ_"left"_QQ_" labels positions only)
May not work as expected if digits size is not significantly larger than labels size"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_MIDDLE="middle"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_TOP="top"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_BOTTOM="bottom"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_HIGH="1/4 from top"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_LOW="1/4 from bottom"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_SUPERSCRIPT="superscript"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_SUBSCRIPT="subscript"
+
+MOD_SMARTCOUNTDOWN3_HIDE_HIGHEST_ZEROS_LABEL="Hide Zero Units"
+MOD_SMARTCOUNTDOWN3_HIDE_HIGHEST_ZEROS_DESC="Hide counter units (except seconds) if they display zero values"
+MOD_SMARTCOUNTDOWN3_HIDE_HIGHEST_ZEROS_HIGHEST="Highest zeros only"
+MOD_SMARTCOUNTDOWN3_HIDE_HIGHEST_ZEROS_ALL="All zeros"
+
+MOD_SMARTCOUNTDOWN3_ALLOW_ALL_ZEROS_LABEL="Allow All Zeros"
+MOD_SMARTCOUNTDOWN3_ALLOW_ALL_ZEROS_DESC="Allow the counter to display all zeros when time interval becomes less than the lowest time unit displayed"
+
+MOD_SMARTCOUNTDOWN3_DISABLE_RESPONSIVE_LABEL="Responsive Behavior"
+MOD_SMARTCOUNTDOWN3_DISABLE_RESPONSIVE_DESC="Disable responsive behavior"
+
+; Styles
+COM_MODULES_STYLES_FIELDSET_LABEL="Styles"
+MOD_SMARTCOUNTDOWN3_MODULE_STYLE_LABEL="Module Style(s)"
+MOD_SMARTCOUNTDOWN3_MODULE_STYLE_DESC="Additional style(s) applied to the module. Enter CSS rules separated and ended by "_QQ_";"_QQ_""
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_STYLE_LABEL="Text Before Style(s)"
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_STYLE_DESC="Additional event text style(s). Enter CSS rules separated and ended by "_QQ_";"_QQ_""
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_STYLE_LABEL="Text After Style(s)"
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_STYLE_DESC="Additional event text style(s). Enter CSS rules separated and ended by "_QQ_";"_QQ_""
+MOD_SMARTCOUNTDOWN3_DIGITS_STYLE_LABEL="Digits Style(s)"
+MOD_SMARTCOUNTDOWN3_DIGITS_STYLE_DESC="Additional style(s) applied to counter digits. Not all styles will have effect for all animations. Enter CSS rules separated and ended by "_QQ_";"_QQ_""
+MOD_SMARTCOUNTDOWN3_LABELS_STYLE_LABEL="Labels Style(s)"
+MOD_SMARTCOUNTDOWN3_LABELS_STYLE_DESC="Additional labels style(s). Enter CSS rules separated and ended by "_QQ_";"_QQ_""
+
+; Redirection
+COM_MODULES_REDIRECTION_FIELDSET_LABEL="Automatic Redirection"
+MOD_SMARTCOUNTDOWN3_COUNTER_CLICKABLE_LABEL="Redirect on click"
+MOD_SMARTCOUNTDOWN3_COUNTER_CLICKABLE_DESC="Open redirection URL when the module is clicked"
+MOD_SMARTCOUNTDOWN3_COUNTER_CLICKABLE_NEVER="Disabled"
+MOD_SMARTCOUNTDOWN3_COUNTER_CLICKABLE_ALWAYS="Always"
+MOD_SMARTCOUNTDOWN3_COUNTER_CLICKABLE_COUNTDOWN="Only before event start"
+MOD_SMARTCOUNTDOWN3_COUNTER_CLICKABLE_COUNTUP="Only while event is in progress"
+MOD_SMARTCOUNTDOWN3_CONFIRM_REDIRECT_LABEL="Confirm Redirection"
+MOD_SMARTCOUNTDOWN3_CONFIRM_REDIRECT_DESC="Ask user permission to leave the page if non-empty forms are found on the page"
+MOD_SMARTCOUNTDOWN3_REDIRECT_CONTROL_LABEL="Redirect on countdown zero or module click (optional) - Select menu item or enter absolute URL. If absolute URL is set redirect menu item will be ignored."
+MOD_SMARTCOUNTDOWN3_EVENT_GOTO_MENU_LABEL="Menu Item"
+MOD_SMARTCOUNTDOWN3_EVENT_GOTO_MENU_DESC="Choose menu item for automatic redirection. Choose "_QQ_"Disabled"_QQ_" (default) to disable automatic redirection"
+MOD_SMARTCOUNTDOWN3_EVENT_GOTO_URL_LABEL="Absolute URL"
+MOD_SMARTCOUNTDOWN3_EVENT_GOTO_URL_DESC="Enter absolute URL for automatic redirection."
+
+; Time units
+MOD_SMARTCOUNTDOWN3_N_YEARS="Años"
+MOD_SMARTCOUNTDOWN3_N_MONTHS="Meses"
+MOD_SMARTCOUNTDOWN3_N_WEEKS="Semanas"
+MOD_SMARTCOUNTDOWN3_N_DAYS="Días"
+MOD_SMARTCOUNTDOWN3_N_HOURS="Horas"
+MOD_SMARTCOUNTDOWN3_N_MINUTES="Minutos"
+MOD_SMARTCOUNTDOWN3_N_SECONDS="Segundos"
+MOD_SMARTCOUNTDOWN3_N_YEARS_1="Año"
+MOD_SMARTCOUNTDOWN3_N_MONTHS_1="Mes"
+MOD_SMARTCOUNTDOWN3_N_WEEKS_1="Semana"
+MOD_SMARTCOUNTDOWN3_N_DAYS_1="Día"
+MOD_SMARTCOUNTDOWN3_N_HOURS_1="Hora"
+MOD_SMARTCOUNTDOWN3_N_MINUTES_1="Minuto"
+MOD_SMARTCOUNTDOWN3_N_SECONDS_1="Segundo"
+
+; Misc frontend translations
+MOD_SMARTCOUNTDOWN3_REDIRECT_CONFIRM_HINT="Está a punto de abandonar la página y va a perder los datos introducidos en los formularios. ¿Está seguro?"
diff --git a/deployed/smartcountdown3/modules/mod_smartcountdown3/language/es-ES/index.html b/deployed/smartcountdown3/modules/mod_smartcountdown3/language/es-ES/index.html
new file mode 100644
index 00000000..2efb97f3
--- /dev/null
+++ b/deployed/smartcountdown3/modules/mod_smartcountdown3/language/es-ES/index.html
@@ -0,0 +1 @@
+
diff --git a/deployed/smartcountdown3/modules/mod_smartcountdown3/language/fr-FR/fr-FR.mod_smartcountdown3.ini b/deployed/smartcountdown3/modules/mod_smartcountdown3/language/fr-FR/fr-FR.mod_smartcountdown3.ini
new file mode 100644
index 00000000..82442cca
--- /dev/null
+++ b/deployed/smartcountdown3/modules/mod_smartcountdown3/language/fr-FR/fr-FR.mod_smartcountdown3.ini
@@ -0,0 +1,180 @@
+; Note : All ini files need to be saved as UTF-8 - No BOM
+MOD_SMARTCOUNTDOWN3="Smart Countdown 3"
+MOD_SMARTCOUNTDOWN3_XML_DESCRIPTION="Smart Countdown 3 Module"
+MOD_SMARTCOUNTDOWN3_WITH_EXTRA_FX_XML_DESCRIPTION="Smart Countdown 3 Module with additional animation profiles"
+
+; Basic options
+MOD_SMARTCOUNTDOWN3_DEADLINE_LABEL="Event Date and Time"
+MOD_SMARTCOUNTDOWN3_DEADLINE_DESC="Event time (Joomla server time zone)"
+
+MOD_SMARTCOUNTDOWN3_COUNTER_MODES_LABEL="Module Display"
+MOD_SMARTCOUNTDOWN3_COUNTER_MODES_DESC="Choose an option for countdown/count up modes display
*) When "_QQ_"auto"_QQ_" is selected and events queue is imported by a plugin, the event's duration (if set) will be used as a count up limit
**) "_QQ_"Countdown to event end"_QQ_" will work with compatible event import plugins only"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_ONLY="Show countdown only"
+MOD_SMARTCOUNTDOWN3_SHOW_BOTH_AUTO="Show countdown and count up (auto)*"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_ONLY="Show count up only"
+MOD_SMARTCOUNTDOWN3_COUNTDOWN_OPTIONS_GROUP="- Countdown will start before event -"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_60="Countdown starts 1 minute before event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_300="Countdown starts 5 minutes before event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_900="Countdown starts 15 minutes before event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_1800="Countdown starts 30 minutes before event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_3600="Countdown starts 1 hour before event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_28800="Countdown starts 8 hours before event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_43200="Countdown starts 12 hours before event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_86400="Countdown starts 24 hours before event"
+MOD_SMARTCOUNTDOWN3_COUNTUP_OPTIONS_GROUP="- Count up will stop after event -"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_60="Count up stops 1 minute after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_300="Count up stops 5 minutes after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_900="Count up stops 15 minutes after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_1800="Count up stops 30 minutes after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_3600="Count up stops 1 hour after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_28800="Count up stops 8 hours after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_43200="Count up stops 12 hours after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_86400="Count up stops 24 hours after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_TO_END="Countdown to event end **"
+
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_DOWN_LABEL="Text Before Counter
(countdown mode)"
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_DOWN_DESC="Enter event description displayed before counter block in countdown mode"
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_DOWN_LABEL="Text After Counter
(countdown mode)"
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_DOWN_DESC="Enter event description displayed after counter block in countdown mode"
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_UP_LABEL="Text Before Counter
(count up mode)"
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_UP_DESC="Enter event description displayed before counter block in count up mode"
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_UP_LABEL="Text After Counter
(count up mode)"
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_UP_DESC="Enter event description displayed after counter block in count up mode"
+
+MOD_SMARTCOUNTDOWN3_HIDE_COUNTUP_COUNTER_LABEL="Hide counter in count up mode"
+MOD_SMARTCOUNTDOWN3_HIDE_COUNTUP_COUNTER_DESC="Only display event descriptions in count up mode ("_QQ_"Time has arrived!"_QQ_" message mode)"
+
+; Layout
+COM_MODULES_LAYOUT_FIELDSET_LABEL="Layout"
+MOD_SMARTCOUNTDOWN3_UNITS_LABEL="Counter Units"
+MOD_SMARTCOUNTDOWN3_UNITS_DESC="Check counter units to show"
+MOD_SMARTCOUNTDOWN3_UNITS_YEARS="Years"
+MOD_SMARTCOUNTDOWN3_UNITS_MONTHS="Months"
+MOD_SMARTCOUNTDOWN3_UNITS_WEEKS="Weeks"
+MOD_SMARTCOUNTDOWN3_UNITS_DAYS="Days"
+MOD_SMARTCOUNTDOWN3_UNITS_HOURS="Hours"
+MOD_SMARTCOUNTDOWN3_UNITS_MINUTES="Minutes"
+MOD_SMARTCOUNTDOWN3_UNITS_SECONDS="Seconds"
+
+MOD_SMARTCOUNTDOWN3_LAYOUT_PRESET_LABEL="Layout Preset"
+MOD_SMARTCOUNTDOWN3_LAYOUT_PRESET_DESC="Select layout preset"
+MOD_SMARTCOUNTDOWN3_FX_PRESET_LABEL="Digits Animation"
+MOD_SMARTCOUNTDOWN3_FX_PRESET_DESC="Select digits animation preset"
+MOD_SMARTCOUNTDOWN3_HORIZONTALLY_CENTER_LABEL="Horizontally Center"
+MOD_SMARTCOUNTDOWN3_HORIZONTALLY_CENTER_DESC="Horizontally center all counter elements"
+
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_SIZE_LABEL="Text Before Size"
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_SIZE_DESC="Select font size in px for event description displayed before counter"
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_SIZE_LABEL="Text After Size"
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_SIZE_DESC="Select font size in px for event description displayed after counter"
+MOD_SMARTCOUNTDOWN3_DIGITS_SIZE_LABEL="Digits Size"
+MOD_SMARTCOUNTDOWN3_DIGITS_SIZE_DESC="Select size in px for counter digits"
+MOD_SMARTCOUNTDOWN3_LABELS_SIZE_LABEL="Labels Size"
+MOD_SMARTCOUNTDOWN3_LABELS_SIZE_DESC="Select font size in px for counter labels"
+
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_HORZ_LABEL="Units Horizontal Spacing"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_HORZ_DESC="Spacing between counter units in horizontal (row) layout"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_VERT_LABEL="Units Vertical Spacing"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_VERT_DESC="Spacing between counter units in vertical (column) layout"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_WIDE_PLUS="Largest"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_WIDE="Large"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_NORMAL="Normal"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_CONDENSED="Small"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_CONDENSED_PLUS="Smallest"
+
+MOD_SMARTCOUNTDOWN3_PREVIEW_LABEL="Preview"
+MOD_SMARTCOUNTDOWN3_PREVIEW_DESC="Preview module output in a separate test window. If you are changing module configuration and are not sure about the effects you can temporarily unpublish the module. It will not appear on your site front end but you will be able to test the changes in preview."
+MOD_SMARTCOUNTDOWN3_PREVIEW_OPEN="Open preview"
+MOD_SMARTCOUNTDOWN3_PREVIEW_SAVE_FIRST="Preview not available until you save the module.
You can initially save it as unpublished - it will be available for preview only and will not appear on your site front end."
+
+; Layout overrides
+COM_MODULES_OVERRIDE_LAYOUT_FIELDSET_LABEL="Layout Overrides"
+MOD_SMARTCOUNTDOWN3_OVERRIDE_LAYOUT_DESC="By default counter layout is read from currently selected layout preset. However you can override some layout settings using controls below. Please, keep in mind that if responsive feature is enabled, overrides will affect full-width module display only! Any further layout transformations in response to template position width changes will be controlled by responsive rules listed in active layout preset and cannot be overridden here. You have to create a custom layout preset to get full control over the module layout on all screens."
+MOD_SMARTCOUNTDOWN3_LAYOUT_OVERRIDE_NONE="- Do not override -"
+
+MOD_SMARTCOUNTDOWN3_COUNTER_LAYOUT_LABEL="Counter Layout"
+MOD_SMARTCOUNTDOWN3_COUNTER_LAYOUT_DESC="Choose how counter digits are aligned - horizontally (from left to right) or vertically (from top to bottom)"
+MOD_SMARTCOUNTDOWN3_COUNTER_LAYOUT_VERT="vertical"
+MOD_SMARTCOUNTDOWN3_COUNTER_LAYOUT_HORZ="horizontal"
+
+MOD_SMARTCOUNTDOWN3_EVENT_TEXT_POS_LABEL="Event Text Position"
+MOD_SMARTCOUNTDOWN3_EVENT_TEXT_POS_DESC="Choose where to display event description(s) - above/below the counter block or inline with the counter"
+MOD_SMARTCOUNTDOWN3_EVENT_TEXT_POS_VERT="above/below"
+MOD_SMARTCOUNTDOWN3_EVENT_TEXT_POS_HORZ="inline"
+
+MOD_SMARTCOUNTDOWN3_LABELS_POS_LABEL="Labels Position"
+MOD_SMARTCOUNTDOWN3_LABELS_POS_DESC="Choose labels position relative to digits"
+MOD_SMARTCOUNTDOWN3_LABELS_POS_RIGTH="right"
+MOD_SMARTCOUNTDOWN3_LABELS_POS_BOTTOM="bottom"
+MOD_SMARTCOUNTDOWN3_LABELS_POS_TOP="top"
+MOD_SMARTCOUNTDOWN3_LABELS_POS_LEFT="left"
+MOD_SMARTCOUNTDOWN3_LAYOUT_OVERRIDE_ALL_SCREENS_DESC="The settings below will be effective on all screens"
+
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_LABEL="Labels Vertical Alignment"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_DESC="Choose how labels are aligned with digits (for "_QQ_"right"_QQ_" or "_QQ_"left"_QQ_" labels positions only)
May not work as expected if digits size is not significantly larger than labels size"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_MIDDLE="middle"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_TOP="top"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_BOTTOM="bottom"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_HIGH="1/4 from top"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_LOW="1/4 from bottom"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_SUPERSCRIPT="superscript"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_SUBSCRIPT="subscript"
+
+MOD_SMARTCOUNTDOWN3_HIDE_HIGHEST_ZEROS_LABEL="Hide Zero Units"
+MOD_SMARTCOUNTDOWN3_HIDE_HIGHEST_ZEROS_DESC="Hide counter units (except seconds) if they display zero values"
+MOD_SMARTCOUNTDOWN3_HIDE_HIGHEST_ZEROS_HIGHEST="Highest zeros only"
+MOD_SMARTCOUNTDOWN3_HIDE_HIGHEST_ZEROS_ALL="All zeros"
+
+MOD_SMARTCOUNTDOWN3_ALLOW_ALL_ZEROS_LABEL="Allow All Zeros"
+MOD_SMARTCOUNTDOWN3_ALLOW_ALL_ZEROS_DESC="Allow the counter to display all zeros when time interval becomes less than the lowest time unit displayed"
+
+MOD_SMARTCOUNTDOWN3_DISABLE_RESPONSIVE_LABEL="Responsive Behavior"
+MOD_SMARTCOUNTDOWN3_DISABLE_RESPONSIVE_DESC="Disable responsive behavior"
+
+; Styles
+COM_MODULES_STYLES_FIELDSET_LABEL="Styles"
+MOD_SMARTCOUNTDOWN3_MODULE_STYLE_LABEL="Module Style(s)"
+MOD_SMARTCOUNTDOWN3_MODULE_STYLE_DESC="Additional style(s) applied to the module. Enter CSS rules separated and ended by "_QQ_";"_QQ_""
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_STYLE_LABEL="Text Before Style(s)"
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_STYLE_DESC="Additional event text style(s). Enter CSS rules separated and ended by "_QQ_";"_QQ_""
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_STYLE_LABEL="Text After Style(s)"
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_STYLE_DESC="Additional event text style(s). Enter CSS rules separated and ended by "_QQ_";"_QQ_""
+MOD_SMARTCOUNTDOWN3_DIGITS_STYLE_LABEL="Digits Style(s)"
+MOD_SMARTCOUNTDOWN3_DIGITS_STYLE_DESC="Additional style(s) applied to counter digits. Not all styles will have effect for all animations. Enter CSS rules separated and ended by "_QQ_";"_QQ_""
+MOD_SMARTCOUNTDOWN3_LABELS_STYLE_LABEL="Labels Style(s)"
+MOD_SMARTCOUNTDOWN3_LABELS_STYLE_DESC="Additional labels style(s). Enter CSS rules separated and ended by "_QQ_";"_QQ_""
+
+; Redirection
+COM_MODULES_REDIRECTION_FIELDSET_LABEL="Automatic Redirection"
+MOD_SMARTCOUNTDOWN3_COUNTER_CLICKABLE_LABEL="Redirect on click"
+MOD_SMARTCOUNTDOWN3_COUNTER_CLICKABLE_DESC="Open redirection URL when the module is clicked"
+MOD_SMARTCOUNTDOWN3_COUNTER_CLICKABLE_NEVER="Disabled"
+MOD_SMARTCOUNTDOWN3_COUNTER_CLICKABLE_ALWAYS="Always"
+MOD_SMARTCOUNTDOWN3_COUNTER_CLICKABLE_COUNTDOWN="Only before event start"
+MOD_SMARTCOUNTDOWN3_COUNTER_CLICKABLE_COUNTUP="Only while event is in progress"
+MOD_SMARTCOUNTDOWN3_CONFIRM_REDIRECT_LABEL="Confirm Redirection"
+MOD_SMARTCOUNTDOWN3_CONFIRM_REDIRECT_DESC="Ask user permission to leave the page if non-empty forms are found on the page"
+MOD_SMARTCOUNTDOWN3_REDIRECT_CONTROL_LABEL="Redirect on countdown zero or module click (optional) - Select menu item or enter absolute URL. If absolute URL is set redirect menu item will be ignored."
+MOD_SMARTCOUNTDOWN3_EVENT_GOTO_MENU_LABEL="Menu Item"
+MOD_SMARTCOUNTDOWN3_EVENT_GOTO_MENU_DESC="Choose menu item for automatic redirection. Choose "_QQ_"Disabled"_QQ_" (default) to disable automatic redirection"
+MOD_SMARTCOUNTDOWN3_EVENT_GOTO_URL_LABEL="Absolute URL"
+MOD_SMARTCOUNTDOWN3_EVENT_GOTO_URL_DESC="Enter absolute URL for automatic redirection."
+
+; Time units
+MOD_SMARTCOUNTDOWN3_N_YEARS="Ans"
+MOD_SMARTCOUNTDOWN3_N_MONTHS="Mois"
+MOD_SMARTCOUNTDOWN3_N_WEEKS="Semaines"
+MOD_SMARTCOUNTDOWN3_N_DAYS="Jours"
+MOD_SMARTCOUNTDOWN3_N_HOURS="Heures"
+MOD_SMARTCOUNTDOWN3_N_MINUTES="Minutes"
+MOD_SMARTCOUNTDOWN3_N_SECONDS="Secondes"
+MOD_SMARTCOUNTDOWN3_N_YEARS_1="Année"
+MOD_SMARTCOUNTDOWN3_N_MONTHS_1="Mois"
+MOD_SMARTCOUNTDOWN3_N_WEEKS_1="Semaine"
+MOD_SMARTCOUNTDOWN3_N_DAYS_1="Jour"
+MOD_SMARTCOUNTDOWN3_N_HOURS_1="Heure"
+MOD_SMARTCOUNTDOWN3_N_MINUTES_1="Minute"
+MOD_SMARTCOUNTDOWN3_N_SECONDS_1="Seconde"
+
+; Misc frontend translations
+MOD_SMARTCOUNTDOWN3_REDIRECT_CONFIRM_HINT="En quittant cette page, toutes les données non sauvegardées seront perdues. Êtes vous sûr ?"
diff --git a/deployed/smartcountdown3/modules/mod_smartcountdown3/language/fr-FR/index.html b/deployed/smartcountdown3/modules/mod_smartcountdown3/language/fr-FR/index.html
new file mode 100644
index 00000000..2efb97f3
--- /dev/null
+++ b/deployed/smartcountdown3/modules/mod_smartcountdown3/language/fr-FR/index.html
@@ -0,0 +1 @@
+
diff --git a/deployed/smartcountdown3/modules/mod_smartcountdown3/language/index.html b/deployed/smartcountdown3/modules/mod_smartcountdown3/language/index.html
new file mode 100644
index 00000000..2efb97f3
--- /dev/null
+++ b/deployed/smartcountdown3/modules/mod_smartcountdown3/language/index.html
@@ -0,0 +1 @@
+
diff --git a/deployed/smartcountdown3/modules/mod_smartcountdown3/language/it-IT/index.html b/deployed/smartcountdown3/modules/mod_smartcountdown3/language/it-IT/index.html
new file mode 100644
index 00000000..2efb97f3
--- /dev/null
+++ b/deployed/smartcountdown3/modules/mod_smartcountdown3/language/it-IT/index.html
@@ -0,0 +1 @@
+
diff --git a/deployed/smartcountdown3/modules/mod_smartcountdown3/language/it-IT/it-IT.mod_smartcountdown3.ini b/deployed/smartcountdown3/modules/mod_smartcountdown3/language/it-IT/it-IT.mod_smartcountdown3.ini
new file mode 100644
index 00000000..5d1cb88b
--- /dev/null
+++ b/deployed/smartcountdown3/modules/mod_smartcountdown3/language/it-IT/it-IT.mod_smartcountdown3.ini
@@ -0,0 +1,180 @@
+; Note : All ini files need to be saved as UTF-8 - No BOM
+MOD_SMARTCOUNTDOWN3="Smart Countdown 3"
+MOD_SMARTCOUNTDOWN3_XML_DESCRIPTION="Smart Countdown 3 Module"
+MOD_SMARTCOUNTDOWN3_WITH_EXTRA_FX_XML_DESCRIPTION="Smart Countdown 3 Module with additional animation profiles"
+
+; Basic options
+MOD_SMARTCOUNTDOWN3_DEADLINE_LABEL="Event Date and Time"
+MOD_SMARTCOUNTDOWN3_DEADLINE_DESC="Event time (Joomla server time zone)"
+
+MOD_SMARTCOUNTDOWN3_COUNTER_MODES_LABEL="Module Display"
+MOD_SMARTCOUNTDOWN3_COUNTER_MODES_DESC="Choose an option for countdown/count up modes display
*) When "_QQ_"auto"_QQ_" is selected and events queue is imported by a plugin, the event's duration (if set) will be used as a count up limit
**) "_QQ_"Countdown to event end"_QQ_" will work with compatible event import plugins only"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_ONLY="Show countdown only"
+MOD_SMARTCOUNTDOWN3_SHOW_BOTH_AUTO="Show countdown and count up (auto)*"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_ONLY="Show count up only"
+MOD_SMARTCOUNTDOWN3_COUNTDOWN_OPTIONS_GROUP="- Countdown will start before event -"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_60="Countdown starts 1 minute before event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_300="Countdown starts 5 minutes before event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_900="Countdown starts 15 minutes before event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_1800="Countdown starts 30 minutes before event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_3600="Countdown starts 1 hour before event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_28800="Countdown starts 8 hours before event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_43200="Countdown starts 12 hours before event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_86400="Countdown starts 24 hours before event"
+MOD_SMARTCOUNTDOWN3_COUNTUP_OPTIONS_GROUP="- Count up will stop after event -"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_60="Count up stops 1 minute after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_300="Count up stops 5 minutes after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_900="Count up stops 15 minutes after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_1800="Count up stops 30 minutes after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_3600="Count up stops 1 hour after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_28800="Count up stops 8 hours after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_43200="Count up stops 12 hours after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_86400="Count up stops 24 hours after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_TO_END="Countdown to event end **"
+
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_DOWN_LABEL="Text Before Counter
(countdown mode)"
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_DOWN_DESC="Enter event description displayed before counter block in countdown mode"
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_DOWN_LABEL="Text After Counter
(countdown mode)"
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_DOWN_DESC="Enter event description displayed after counter block in countdown mode"
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_UP_LABEL="Text Before Counter
(count up mode)"
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_UP_DESC="Enter event description displayed before counter block in count up mode"
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_UP_LABEL="Text After Counter
(count up mode)"
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_UP_DESC="Enter event description displayed after counter block in count up mode"
+
+MOD_SMARTCOUNTDOWN3_HIDE_COUNTUP_COUNTER_LABEL="Hide counter in count up mode"
+MOD_SMARTCOUNTDOWN3_HIDE_COUNTUP_COUNTER_DESC="Only display event descriptions in count up mode ("_QQ_"Time has arrived!"_QQ_" message mode)"
+
+; Layout
+COM_MODULES_LAYOUT_FIELDSET_LABEL="Layout"
+MOD_SMARTCOUNTDOWN3_UNITS_LABEL="Counter Units"
+MOD_SMARTCOUNTDOWN3_UNITS_DESC="Check counter units to show"
+MOD_SMARTCOUNTDOWN3_UNITS_YEARS="Years"
+MOD_SMARTCOUNTDOWN3_UNITS_MONTHS="Months"
+MOD_SMARTCOUNTDOWN3_UNITS_WEEKS="Weeks"
+MOD_SMARTCOUNTDOWN3_UNITS_DAYS="Days"
+MOD_SMARTCOUNTDOWN3_UNITS_HOURS="Hours"
+MOD_SMARTCOUNTDOWN3_UNITS_MINUTES="Minutes"
+MOD_SMARTCOUNTDOWN3_UNITS_SECONDS="Seconds"
+
+MOD_SMARTCOUNTDOWN3_LAYOUT_PRESET_LABEL="Layout Preset"
+MOD_SMARTCOUNTDOWN3_LAYOUT_PRESET_DESC="Select layout preset"
+MOD_SMARTCOUNTDOWN3_FX_PRESET_LABEL="Digits Animation"
+MOD_SMARTCOUNTDOWN3_FX_PRESET_DESC="Select digits animation preset"
+MOD_SMARTCOUNTDOWN3_HORIZONTALLY_CENTER_LABEL="Horizontally Center"
+MOD_SMARTCOUNTDOWN3_HORIZONTALLY_CENTER_DESC="Horizontally center all counter elements"
+
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_SIZE_LABEL="Text Before Size"
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_SIZE_DESC="Select font size in px for event description displayed before counter"
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_SIZE_LABEL="Text After Size"
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_SIZE_DESC="Select font size in px for event description displayed after counter"
+MOD_SMARTCOUNTDOWN3_DIGITS_SIZE_LABEL="Digits Size"
+MOD_SMARTCOUNTDOWN3_DIGITS_SIZE_DESC="Select size in px for counter digits"
+MOD_SMARTCOUNTDOWN3_LABELS_SIZE_LABEL="Labels Size"
+MOD_SMARTCOUNTDOWN3_LABELS_SIZE_DESC="Select font size in px for counter labels"
+
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_HORZ_LABEL="Units Horizontal Spacing"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_HORZ_DESC="Spacing between counter units in horizontal (row) layout"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_VERT_LABEL="Units Vertical Spacing"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_VERT_DESC="Spacing between counter units in vertical (column) layout"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_WIDE_PLUS="Largest"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_WIDE="Large"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_NORMAL="Normal"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_CONDENSED="Small"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_CONDENSED_PLUS="Smallest"
+
+MOD_SMARTCOUNTDOWN3_PREVIEW_LABEL="Preview"
+MOD_SMARTCOUNTDOWN3_PREVIEW_DESC="Preview module output in a separate test window. If you are changing module configuration and are not sure about the effects you can temporarily unpublish the module. It will not appear on your site front end but you will be able to test the changes in preview."
+MOD_SMARTCOUNTDOWN3_PREVIEW_OPEN="Open preview"
+MOD_SMARTCOUNTDOWN3_PREVIEW_SAVE_FIRST="Preview not available until you save the module.
You can initially save it as unpublished - it will be available for preview only and will not appear on your site front end."
+
+; Layout overrides
+COM_MODULES_OVERRIDE_LAYOUT_FIELDSET_LABEL="Layout Overrides"
+MOD_SMARTCOUNTDOWN3_OVERRIDE_LAYOUT_DESC="By default counter layout is read from currently selected layout preset. However you can override some layout settings using controls below. Please, keep in mind that if responsive feature is enabled, overrides will affect full-width module display only! Any further layout transformations in response to template position width changes will be controlled by responsive rules listed in active layout preset and cannot be overridden here. You have to create a custom layout preset to get full control over the module layout on all screens."
+MOD_SMARTCOUNTDOWN3_LAYOUT_OVERRIDE_NONE="- Do not override -"
+
+MOD_SMARTCOUNTDOWN3_COUNTER_LAYOUT_LABEL="Counter Layout"
+MOD_SMARTCOUNTDOWN3_COUNTER_LAYOUT_DESC="Choose how counter digits are aligned - horizontally (from left to right) or vertically (from top to bottom)"
+MOD_SMARTCOUNTDOWN3_COUNTER_LAYOUT_VERT="vertical"
+MOD_SMARTCOUNTDOWN3_COUNTER_LAYOUT_HORZ="horizontal"
+
+MOD_SMARTCOUNTDOWN3_EVENT_TEXT_POS_LABEL="Event Text Position"
+MOD_SMARTCOUNTDOWN3_EVENT_TEXT_POS_DESC="Choose where to display event description(s) - above/below the counter block or inline with the counter"
+MOD_SMARTCOUNTDOWN3_EVENT_TEXT_POS_VERT="above/below"
+MOD_SMARTCOUNTDOWN3_EVENT_TEXT_POS_HORZ="inline"
+
+MOD_SMARTCOUNTDOWN3_LABELS_POS_LABEL="Labels Position"
+MOD_SMARTCOUNTDOWN3_LABELS_POS_DESC="Choose labels position relative to digits"
+MOD_SMARTCOUNTDOWN3_LABELS_POS_RIGTH="right"
+MOD_SMARTCOUNTDOWN3_LABELS_POS_BOTTOM="bottom"
+MOD_SMARTCOUNTDOWN3_LABELS_POS_TOP="top"
+MOD_SMARTCOUNTDOWN3_LABELS_POS_LEFT="left"
+MOD_SMARTCOUNTDOWN3_LAYOUT_OVERRIDE_ALL_SCREENS_DESC="The settings below will be effective on all screens"
+
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_LABEL="Labels Vertical Alignment"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_DESC="Choose how labels are aligned with digits (for "_QQ_"right"_QQ_" or "_QQ_"left"_QQ_" labels positions only)
May not work as expected if digits size is not significantly larger than labels size"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_MIDDLE="middle"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_TOP="top"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_BOTTOM="bottom"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_HIGH="1/4 from top"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_LOW="1/4 from bottom"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_SUPERSCRIPT="superscript"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_SUBSCRIPT="subscript"
+
+MOD_SMARTCOUNTDOWN3_HIDE_HIGHEST_ZEROS_LABEL="Hide Zero Units"
+MOD_SMARTCOUNTDOWN3_HIDE_HIGHEST_ZEROS_DESC="Hide counter units (except seconds) if they display zero values"
+MOD_SMARTCOUNTDOWN3_HIDE_HIGHEST_ZEROS_HIGHEST="Highest zeros only"
+MOD_SMARTCOUNTDOWN3_HIDE_HIGHEST_ZEROS_ALL="All zeros"
+
+MOD_SMARTCOUNTDOWN3_ALLOW_ALL_ZEROS_LABEL="Allow All Zeros"
+MOD_SMARTCOUNTDOWN3_ALLOW_ALL_ZEROS_DESC="Allow the counter to display all zeros when time interval becomes less than the lowest time unit displayed"
+
+MOD_SMARTCOUNTDOWN3_DISABLE_RESPONSIVE_LABEL="Responsive Behavior"
+MOD_SMARTCOUNTDOWN3_DISABLE_RESPONSIVE_DESC="Disable responsive behavior"
+
+; Styles
+COM_MODULES_STYLES_FIELDSET_LABEL="Styles"
+MOD_SMARTCOUNTDOWN3_MODULE_STYLE_LABEL="Module Style(s)"
+MOD_SMARTCOUNTDOWN3_MODULE_STYLE_DESC="Additional style(s) applied to the module. Enter CSS rules separated and ended by "_QQ_";"_QQ_""
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_STYLE_LABEL="Text Before Style(s)"
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_STYLE_DESC="Additional event text style(s). Enter CSS rules separated and ended by "_QQ_";"_QQ_""
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_STYLE_LABEL="Text After Style(s)"
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_STYLE_DESC="Additional event text style(s). Enter CSS rules separated and ended by "_QQ_";"_QQ_""
+MOD_SMARTCOUNTDOWN3_DIGITS_STYLE_LABEL="Digits Style(s)"
+MOD_SMARTCOUNTDOWN3_DIGITS_STYLE_DESC="Additional style(s) applied to counter digits. Not all styles will have effect for all animations. Enter CSS rules separated and ended by "_QQ_";"_QQ_""
+MOD_SMARTCOUNTDOWN3_LABELS_STYLE_LABEL="Labels Style(s)"
+MOD_SMARTCOUNTDOWN3_LABELS_STYLE_DESC="Additional labels style(s). Enter CSS rules separated and ended by "_QQ_";"_QQ_""
+
+; Redirection
+COM_MODULES_REDIRECTION_FIELDSET_LABEL="Automatic Redirection"
+MOD_SMARTCOUNTDOWN3_COUNTER_CLICKABLE_LABEL="Redirect on click"
+MOD_SMARTCOUNTDOWN3_COUNTER_CLICKABLE_DESC="Open redirection URL when the module is clicked"
+MOD_SMARTCOUNTDOWN3_COUNTER_CLICKABLE_NEVER="Disabled"
+MOD_SMARTCOUNTDOWN3_COUNTER_CLICKABLE_ALWAYS="Always"
+MOD_SMARTCOUNTDOWN3_COUNTER_CLICKABLE_COUNTDOWN="Only before event start"
+MOD_SMARTCOUNTDOWN3_COUNTER_CLICKABLE_COUNTUP="Only while event is in progress"
+MOD_SMARTCOUNTDOWN3_CONFIRM_REDIRECT_LABEL="Confirm Redirection"
+MOD_SMARTCOUNTDOWN3_CONFIRM_REDIRECT_DESC="Ask user permission to leave the page if non-empty forms are found on the page"
+MOD_SMARTCOUNTDOWN3_REDIRECT_CONTROL_LABEL="Redirect on countdown zero or module click (optional) - Select menu item or enter absolute URL. If absolute URL is set redirect menu item will be ignored."
+MOD_SMARTCOUNTDOWN3_EVENT_GOTO_MENU_LABEL="Menu Item"
+MOD_SMARTCOUNTDOWN3_EVENT_GOTO_MENU_DESC="Choose menu item for automatic redirection. Choose "_QQ_"Disabled"_QQ_" (default) to disable automatic redirection"
+MOD_SMARTCOUNTDOWN3_EVENT_GOTO_URL_LABEL="Absolute URL"
+MOD_SMARTCOUNTDOWN3_EVENT_GOTO_URL_DESC="Enter absolute URL for automatic redirection."
+
+; Time units
+MOD_SMARTCOUNTDOWN3_N_YEARS="Anni"
+MOD_SMARTCOUNTDOWN3_N_MONTHS="Mesi"
+MOD_SMARTCOUNTDOWN3_N_WEEKS="Settimane"
+MOD_SMARTCOUNTDOWN3_N_DAYS="Giorni"
+MOD_SMARTCOUNTDOWN3_N_HOURS="Ore"
+MOD_SMARTCOUNTDOWN3_N_MINUTES="Minuti"
+MOD_SMARTCOUNTDOWN3_N_SECONDS="Secondi"
+MOD_SMARTCOUNTDOWN3_N_YEARS_1="Anno"
+MOD_SMARTCOUNTDOWN3_N_MONTHS_1="Mese"
+MOD_SMARTCOUNTDOWN3_N_WEEKS_1="Settimana"
+MOD_SMARTCOUNTDOWN3_N_DAYS_1="Giorno"
+MOD_SMARTCOUNTDOWN3_N_HOURS_1="Ora"
+MOD_SMARTCOUNTDOWN3_N_MINUTES_1="Minuto"
+MOD_SMARTCOUNTDOWN3_N_SECONDS_1="Secondo"
+
+; Misc frontend translations
+MOD_SMARTCOUNTDOWN3_REDIRECT_CONFIRM_HINT="You are going to leave this page. All unsaved data will be lost. Are you sure?"
diff --git a/deployed/smartcountdown3/modules/mod_smartcountdown3/language/nl-BE/index.html b/deployed/smartcountdown3/modules/mod_smartcountdown3/language/nl-BE/index.html
new file mode 100644
index 00000000..2efb97f3
--- /dev/null
+++ b/deployed/smartcountdown3/modules/mod_smartcountdown3/language/nl-BE/index.html
@@ -0,0 +1 @@
+
diff --git a/deployed/smartcountdown3/modules/mod_smartcountdown3/language/nl-BE/nl-BE.mod_smartcountdown3.ini b/deployed/smartcountdown3/modules/mod_smartcountdown3/language/nl-BE/nl-BE.mod_smartcountdown3.ini
new file mode 100644
index 00000000..d1e99487
--- /dev/null
+++ b/deployed/smartcountdown3/modules/mod_smartcountdown3/language/nl-BE/nl-BE.mod_smartcountdown3.ini
@@ -0,0 +1,180 @@
+; Note : All ini files need to be saved as UTF-8 - No BOM
+MOD_SMARTCOUNTDOWN3="Smart Countdown 3"
+MOD_SMARTCOUNTDOWN3_XML_DESCRIPTION="Smart Countdown 3 Module"
+MOD_SMARTCOUNTDOWN3_WITH_EXTRA_FX_XML_DESCRIPTION="Smart Countdown 3 Module with additional animation profiles"
+
+; Basic options
+MOD_SMARTCOUNTDOWN3_DEADLINE_LABEL="Event Date and Time"
+MOD_SMARTCOUNTDOWN3_DEADLINE_DESC="Event time (Joomla server time zone)"
+
+MOD_SMARTCOUNTDOWN3_COUNTER_MODES_LABEL="Module Display"
+MOD_SMARTCOUNTDOWN3_COUNTER_MODES_DESC="Choose an option for countdown/count up modes display
*) When "_QQ_"auto"_QQ_" is selected and events queue is imported by a plugin, the event's duration (if set) will be used as a count up limit
**) "_QQ_"Countdown to event end"_QQ_" will work with compatible event import plugins only"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_ONLY="Show countdown only"
+MOD_SMARTCOUNTDOWN3_SHOW_BOTH_AUTO="Show countdown and count up (auto)*"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_ONLY="Show count up only"
+MOD_SMARTCOUNTDOWN3_COUNTDOWN_OPTIONS_GROUP="- Countdown will start before event -"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_60="Countdown starts 1 minute before event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_300="Countdown starts 5 minutes before event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_900="Countdown starts 15 minutes before event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_1800="Countdown starts 30 minutes before event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_3600="Countdown starts 1 hour before event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_28800="Countdown starts 8 hours before event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_43200="Countdown starts 12 hours before event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_86400="Countdown starts 24 hours before event"
+MOD_SMARTCOUNTDOWN3_COUNTUP_OPTIONS_GROUP="- Count up will stop after event -"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_60="Count up stops 1 minute after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_300="Count up stops 5 minutes after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_900="Count up stops 15 minutes after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_1800="Count up stops 30 minutes after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_3600="Count up stops 1 hour after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_28800="Count up stops 8 hours after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_43200="Count up stops 12 hours after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_86400="Count up stops 24 hours after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_TO_END="Countdown to event end **"
+
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_DOWN_LABEL="Text Before Counter
(countdown mode)"
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_DOWN_DESC="Enter event description displayed before counter block in countdown mode"
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_DOWN_LABEL="Text After Counter
(countdown mode)"
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_DOWN_DESC="Enter event description displayed after counter block in countdown mode"
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_UP_LABEL="Text Before Counter
(count up mode)"
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_UP_DESC="Enter event description displayed before counter block in count up mode"
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_UP_LABEL="Text After Counter
(count up mode)"
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_UP_DESC="Enter event description displayed after counter block in count up mode"
+
+MOD_SMARTCOUNTDOWN3_HIDE_COUNTUP_COUNTER_LABEL="Hide counter in count up mode"
+MOD_SMARTCOUNTDOWN3_HIDE_COUNTUP_COUNTER_DESC="Only display event descriptions in count up mode ("_QQ_"Time has arrived!"_QQ_" message mode)"
+
+; Layout
+COM_MODULES_LAYOUT_FIELDSET_LABEL="Layout"
+MOD_SMARTCOUNTDOWN3_UNITS_LABEL="Counter Units"
+MOD_SMARTCOUNTDOWN3_UNITS_DESC="Check counter units to show"
+MOD_SMARTCOUNTDOWN3_UNITS_YEARS="Years"
+MOD_SMARTCOUNTDOWN3_UNITS_MONTHS="Months"
+MOD_SMARTCOUNTDOWN3_UNITS_WEEKS="Weeks"
+MOD_SMARTCOUNTDOWN3_UNITS_DAYS="Days"
+MOD_SMARTCOUNTDOWN3_UNITS_HOURS="Hours"
+MOD_SMARTCOUNTDOWN3_UNITS_MINUTES="Minutes"
+MOD_SMARTCOUNTDOWN3_UNITS_SECONDS="Seconds"
+
+MOD_SMARTCOUNTDOWN3_LAYOUT_PRESET_LABEL="Layout Preset"
+MOD_SMARTCOUNTDOWN3_LAYOUT_PRESET_DESC="Select layout preset"
+MOD_SMARTCOUNTDOWN3_FX_PRESET_LABEL="Digits Animation"
+MOD_SMARTCOUNTDOWN3_FX_PRESET_DESC="Select digits animation preset"
+MOD_SMARTCOUNTDOWN3_HORIZONTALLY_CENTER_LABEL="Horizontally Center"
+MOD_SMARTCOUNTDOWN3_HORIZONTALLY_CENTER_DESC="Horizontally center all counter elements"
+
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_SIZE_LABEL="Text Before Size"
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_SIZE_DESC="Select font size in px for event description displayed before counter"
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_SIZE_LABEL="Text After Size"
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_SIZE_DESC="Select font size in px for event description displayed after counter"
+MOD_SMARTCOUNTDOWN3_DIGITS_SIZE_LABEL="Digits Size"
+MOD_SMARTCOUNTDOWN3_DIGITS_SIZE_DESC="Select size in px for counter digits"
+MOD_SMARTCOUNTDOWN3_LABELS_SIZE_LABEL="Labels Size"
+MOD_SMARTCOUNTDOWN3_LABELS_SIZE_DESC="Select font size in px for counter labels"
+
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_HORZ_LABEL="Units Horizontal Spacing"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_HORZ_DESC="Spacing between counter units in horizontal (row) layout"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_VERT_LABEL="Units Vertical Spacing"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_VERT_DESC="Spacing between counter units in vertical (column) layout"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_WIDE_PLUS="Largest"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_WIDE="Large"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_NORMAL="Normal"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_CONDENSED="Small"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_CONDENSED_PLUS="Smallest"
+
+MOD_SMARTCOUNTDOWN3_PREVIEW_LABEL="Preview"
+MOD_SMARTCOUNTDOWN3_PREVIEW_DESC="Preview module output in a separate test window. If you are changing module configuration and are not sure about the effects you can temporarily unpublish the module. It will not appear on your site front end but you will be able to test the changes in preview."
+MOD_SMARTCOUNTDOWN3_PREVIEW_OPEN="Open preview"
+MOD_SMARTCOUNTDOWN3_PREVIEW_SAVE_FIRST="Preview not available until you save the module.
You can initially save it as unpublished - it will be available for preview only and will not appear on your site front end."
+
+; Layout overrides
+COM_MODULES_OVERRIDE_LAYOUT_FIELDSET_LABEL="Layout Overrides"
+MOD_SMARTCOUNTDOWN3_OVERRIDE_LAYOUT_DESC="By default counter layout is read from currently selected layout preset. However you can override some layout settings using controls below. Please, keep in mind that if responsive feature is enabled, overrides will affect full-width module display only! Any further layout transformations in response to template position width changes will be controlled by responsive rules listed in active layout preset and cannot be overridden here. You have to create a custom layout preset to get full control over the module layout on all screens."
+MOD_SMARTCOUNTDOWN3_LAYOUT_OVERRIDE_NONE="- Do not override -"
+
+MOD_SMARTCOUNTDOWN3_COUNTER_LAYOUT_LABEL="Counter Layout"
+MOD_SMARTCOUNTDOWN3_COUNTER_LAYOUT_DESC="Choose how counter digits are aligned - horizontally (from left to right) or vertically (from top to bottom)"
+MOD_SMARTCOUNTDOWN3_COUNTER_LAYOUT_VERT="vertical"
+MOD_SMARTCOUNTDOWN3_COUNTER_LAYOUT_HORZ="horizontal"
+
+MOD_SMARTCOUNTDOWN3_EVENT_TEXT_POS_LABEL="Event Text Position"
+MOD_SMARTCOUNTDOWN3_EVENT_TEXT_POS_DESC="Choose where to display event description(s) - above/below the counter block or inline with the counter"
+MOD_SMARTCOUNTDOWN3_EVENT_TEXT_POS_VERT="above/below"
+MOD_SMARTCOUNTDOWN3_EVENT_TEXT_POS_HORZ="inline"
+
+MOD_SMARTCOUNTDOWN3_LABELS_POS_LABEL="Labels Position"
+MOD_SMARTCOUNTDOWN3_LABELS_POS_DESC="Choose labels position relative to digits"
+MOD_SMARTCOUNTDOWN3_LABELS_POS_RIGTH="right"
+MOD_SMARTCOUNTDOWN3_LABELS_POS_BOTTOM="bottom"
+MOD_SMARTCOUNTDOWN3_LABELS_POS_TOP="top"
+MOD_SMARTCOUNTDOWN3_LABELS_POS_LEFT="left"
+MOD_SMARTCOUNTDOWN3_LAYOUT_OVERRIDE_ALL_SCREENS_DESC="The settings below will be effective on all screens"
+
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_LABEL="Labels Vertical Alignment"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_DESC="Choose how labels are aligned with digits (for "_QQ_"right"_QQ_" or "_QQ_"left"_QQ_" labels positions only)
May not work as expected if digits size is not significantly larger than labels size"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_MIDDLE="middle"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_TOP="top"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_BOTTOM="bottom"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_HIGH="1/4 from top"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_LOW="1/4 from bottom"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_SUPERSCRIPT="superscript"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_SUBSCRIPT="subscript"
+
+MOD_SMARTCOUNTDOWN3_HIDE_HIGHEST_ZEROS_LABEL="Hide Zero Units"
+MOD_SMARTCOUNTDOWN3_HIDE_HIGHEST_ZEROS_DESC="Hide counter units (except seconds) if they display zero values"
+MOD_SMARTCOUNTDOWN3_HIDE_HIGHEST_ZEROS_HIGHEST="Highest zeros only"
+MOD_SMARTCOUNTDOWN3_HIDE_HIGHEST_ZEROS_ALL="All zeros"
+
+MOD_SMARTCOUNTDOWN3_ALLOW_ALL_ZEROS_LABEL="Allow All Zeros"
+MOD_SMARTCOUNTDOWN3_ALLOW_ALL_ZEROS_DESC="Allow the counter to display all zeros when time interval becomes less than the lowest time unit displayed"
+
+MOD_SMARTCOUNTDOWN3_DISABLE_RESPONSIVE_LABEL="Responsive Behavior"
+MOD_SMARTCOUNTDOWN3_DISABLE_RESPONSIVE_DESC="Disable responsive behavior"
+
+; Styles
+COM_MODULES_STYLES_FIELDSET_LABEL="Styles"
+MOD_SMARTCOUNTDOWN3_MODULE_STYLE_LABEL="Module Style(s)"
+MOD_SMARTCOUNTDOWN3_MODULE_STYLE_DESC="Additional style(s) applied to the module. Enter CSS rules separated and ended by "_QQ_";"_QQ_""
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_STYLE_LABEL="Text Before Style(s)"
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_STYLE_DESC="Additional event text style(s). Enter CSS rules separated and ended by "_QQ_";"_QQ_""
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_STYLE_LABEL="Text After Style(s)"
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_STYLE_DESC="Additional event text style(s). Enter CSS rules separated and ended by "_QQ_";"_QQ_""
+MOD_SMARTCOUNTDOWN3_DIGITS_STYLE_LABEL="Digits Style(s)"
+MOD_SMARTCOUNTDOWN3_DIGITS_STYLE_DESC="Additional style(s) applied to counter digits. Not all styles will have effect for all animations. Enter CSS rules separated and ended by "_QQ_";"_QQ_""
+MOD_SMARTCOUNTDOWN3_LABELS_STYLE_LABEL="Labels Style(s)"
+MOD_SMARTCOUNTDOWN3_LABELS_STYLE_DESC="Additional labels style(s). Enter CSS rules separated and ended by "_QQ_";"_QQ_""
+
+; Redirection
+COM_MODULES_REDIRECTION_FIELDSET_LABEL="Automatic Redirection"
+MOD_SMARTCOUNTDOWN3_COUNTER_CLICKABLE_LABEL="Redirect on click"
+MOD_SMARTCOUNTDOWN3_COUNTER_CLICKABLE_DESC="Open redirection URL when the module is clicked"
+MOD_SMARTCOUNTDOWN3_COUNTER_CLICKABLE_NEVER="Disabled"
+MOD_SMARTCOUNTDOWN3_COUNTER_CLICKABLE_ALWAYS="Always"
+MOD_SMARTCOUNTDOWN3_COUNTER_CLICKABLE_COUNTDOWN="Only before event start"
+MOD_SMARTCOUNTDOWN3_COUNTER_CLICKABLE_COUNTUP="Only while event is in progress"
+MOD_SMARTCOUNTDOWN3_CONFIRM_REDIRECT_LABEL="Confirm Redirection"
+MOD_SMARTCOUNTDOWN3_CONFIRM_REDIRECT_DESC="Ask user permission to leave the page if non-empty forms are found on the page"
+MOD_SMARTCOUNTDOWN3_REDIRECT_CONTROL_LABEL="Redirect on countdown zero or module click (optional) - Select menu item or enter absolute URL. If absolute URL is set redirect menu item will be ignored."
+MOD_SMARTCOUNTDOWN3_EVENT_GOTO_MENU_LABEL="Menu Item"
+MOD_SMARTCOUNTDOWN3_EVENT_GOTO_MENU_DESC="Choose menu item for automatic redirection. Choose "_QQ_"Disabled"_QQ_" (default) to disable automatic redirection"
+MOD_SMARTCOUNTDOWN3_EVENT_GOTO_URL_LABEL="Absolute URL"
+MOD_SMARTCOUNTDOWN3_EVENT_GOTO_URL_DESC="Enter absolute URL for automatic redirection."
+
+; Time units
+MOD_SMARTCOUNTDOWN3_N_YEARS="Jaren"
+MOD_SMARTCOUNTDOWN3_N_MONTHS="Maanden"
+MOD_SMARTCOUNTDOWN3_N_WEEKS="Weken"
+MOD_SMARTCOUNTDOWN3_N_DAYS="Dagen"
+MOD_SMARTCOUNTDOWN3_N_HOURS="Uren"
+MOD_SMARTCOUNTDOWN3_N_MINUTES="Minuten"
+MOD_SMARTCOUNTDOWN3_N_SECONDS="Seconden"
+MOD_SMARTCOUNTDOWN3_N_YEARS_1="Jaar"
+MOD_SMARTCOUNTDOWN3_N_MONTHS_1="Maand"
+MOD_SMARTCOUNTDOWN3_N_WEEKS_1="Week"
+MOD_SMARTCOUNTDOWN3_N_DAYS_1="Dag"
+MOD_SMARTCOUNTDOWN3_N_HOURS_1="Uur"
+MOD_SMARTCOUNTDOWN3_N_MINUTES_1="Minuut"
+MOD_SMARTCOUNTDOWN3_N_SECONDS_1="Seconde"
+
+; Misc frontend translations
+MOD_SMARTCOUNTDOWN3_REDIRECT_CONFIRM_HINT="You are going to leave this page. All unsaved data will be lost. Are you sure?"
diff --git a/deployed/smartcountdown3/modules/mod_smartcountdown3/language/nl-NL/index.html b/deployed/smartcountdown3/modules/mod_smartcountdown3/language/nl-NL/index.html
new file mode 100644
index 00000000..2efb97f3
--- /dev/null
+++ b/deployed/smartcountdown3/modules/mod_smartcountdown3/language/nl-NL/index.html
@@ -0,0 +1 @@
+
diff --git a/deployed/smartcountdown3/modules/mod_smartcountdown3/language/nl-NL/nl-NL.mod_smartcountdown3.ini b/deployed/smartcountdown3/modules/mod_smartcountdown3/language/nl-NL/nl-NL.mod_smartcountdown3.ini
new file mode 100644
index 00000000..d1e99487
--- /dev/null
+++ b/deployed/smartcountdown3/modules/mod_smartcountdown3/language/nl-NL/nl-NL.mod_smartcountdown3.ini
@@ -0,0 +1,180 @@
+; Note : All ini files need to be saved as UTF-8 - No BOM
+MOD_SMARTCOUNTDOWN3="Smart Countdown 3"
+MOD_SMARTCOUNTDOWN3_XML_DESCRIPTION="Smart Countdown 3 Module"
+MOD_SMARTCOUNTDOWN3_WITH_EXTRA_FX_XML_DESCRIPTION="Smart Countdown 3 Module with additional animation profiles"
+
+; Basic options
+MOD_SMARTCOUNTDOWN3_DEADLINE_LABEL="Event Date and Time"
+MOD_SMARTCOUNTDOWN3_DEADLINE_DESC="Event time (Joomla server time zone)"
+
+MOD_SMARTCOUNTDOWN3_COUNTER_MODES_LABEL="Module Display"
+MOD_SMARTCOUNTDOWN3_COUNTER_MODES_DESC="Choose an option for countdown/count up modes display
*) When "_QQ_"auto"_QQ_" is selected and events queue is imported by a plugin, the event's duration (if set) will be used as a count up limit
**) "_QQ_"Countdown to event end"_QQ_" will work with compatible event import plugins only"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_ONLY="Show countdown only"
+MOD_SMARTCOUNTDOWN3_SHOW_BOTH_AUTO="Show countdown and count up (auto)*"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_ONLY="Show count up only"
+MOD_SMARTCOUNTDOWN3_COUNTDOWN_OPTIONS_GROUP="- Countdown will start before event -"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_60="Countdown starts 1 minute before event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_300="Countdown starts 5 minutes before event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_900="Countdown starts 15 minutes before event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_1800="Countdown starts 30 minutes before event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_3600="Countdown starts 1 hour before event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_28800="Countdown starts 8 hours before event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_43200="Countdown starts 12 hours before event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_86400="Countdown starts 24 hours before event"
+MOD_SMARTCOUNTDOWN3_COUNTUP_OPTIONS_GROUP="- Count up will stop after event -"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_60="Count up stops 1 minute after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_300="Count up stops 5 minutes after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_900="Count up stops 15 minutes after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_1800="Count up stops 30 minutes after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_3600="Count up stops 1 hour after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_28800="Count up stops 8 hours after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_43200="Count up stops 12 hours after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_86400="Count up stops 24 hours after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_TO_END="Countdown to event end **"
+
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_DOWN_LABEL="Text Before Counter
(countdown mode)"
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_DOWN_DESC="Enter event description displayed before counter block in countdown mode"
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_DOWN_LABEL="Text After Counter
(countdown mode)"
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_DOWN_DESC="Enter event description displayed after counter block in countdown mode"
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_UP_LABEL="Text Before Counter
(count up mode)"
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_UP_DESC="Enter event description displayed before counter block in count up mode"
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_UP_LABEL="Text After Counter
(count up mode)"
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_UP_DESC="Enter event description displayed after counter block in count up mode"
+
+MOD_SMARTCOUNTDOWN3_HIDE_COUNTUP_COUNTER_LABEL="Hide counter in count up mode"
+MOD_SMARTCOUNTDOWN3_HIDE_COUNTUP_COUNTER_DESC="Only display event descriptions in count up mode ("_QQ_"Time has arrived!"_QQ_" message mode)"
+
+; Layout
+COM_MODULES_LAYOUT_FIELDSET_LABEL="Layout"
+MOD_SMARTCOUNTDOWN3_UNITS_LABEL="Counter Units"
+MOD_SMARTCOUNTDOWN3_UNITS_DESC="Check counter units to show"
+MOD_SMARTCOUNTDOWN3_UNITS_YEARS="Years"
+MOD_SMARTCOUNTDOWN3_UNITS_MONTHS="Months"
+MOD_SMARTCOUNTDOWN3_UNITS_WEEKS="Weeks"
+MOD_SMARTCOUNTDOWN3_UNITS_DAYS="Days"
+MOD_SMARTCOUNTDOWN3_UNITS_HOURS="Hours"
+MOD_SMARTCOUNTDOWN3_UNITS_MINUTES="Minutes"
+MOD_SMARTCOUNTDOWN3_UNITS_SECONDS="Seconds"
+
+MOD_SMARTCOUNTDOWN3_LAYOUT_PRESET_LABEL="Layout Preset"
+MOD_SMARTCOUNTDOWN3_LAYOUT_PRESET_DESC="Select layout preset"
+MOD_SMARTCOUNTDOWN3_FX_PRESET_LABEL="Digits Animation"
+MOD_SMARTCOUNTDOWN3_FX_PRESET_DESC="Select digits animation preset"
+MOD_SMARTCOUNTDOWN3_HORIZONTALLY_CENTER_LABEL="Horizontally Center"
+MOD_SMARTCOUNTDOWN3_HORIZONTALLY_CENTER_DESC="Horizontally center all counter elements"
+
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_SIZE_LABEL="Text Before Size"
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_SIZE_DESC="Select font size in px for event description displayed before counter"
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_SIZE_LABEL="Text After Size"
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_SIZE_DESC="Select font size in px for event description displayed after counter"
+MOD_SMARTCOUNTDOWN3_DIGITS_SIZE_LABEL="Digits Size"
+MOD_SMARTCOUNTDOWN3_DIGITS_SIZE_DESC="Select size in px for counter digits"
+MOD_SMARTCOUNTDOWN3_LABELS_SIZE_LABEL="Labels Size"
+MOD_SMARTCOUNTDOWN3_LABELS_SIZE_DESC="Select font size in px for counter labels"
+
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_HORZ_LABEL="Units Horizontal Spacing"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_HORZ_DESC="Spacing between counter units in horizontal (row) layout"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_VERT_LABEL="Units Vertical Spacing"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_VERT_DESC="Spacing between counter units in vertical (column) layout"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_WIDE_PLUS="Largest"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_WIDE="Large"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_NORMAL="Normal"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_CONDENSED="Small"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_CONDENSED_PLUS="Smallest"
+
+MOD_SMARTCOUNTDOWN3_PREVIEW_LABEL="Preview"
+MOD_SMARTCOUNTDOWN3_PREVIEW_DESC="Preview module output in a separate test window. If you are changing module configuration and are not sure about the effects you can temporarily unpublish the module. It will not appear on your site front end but you will be able to test the changes in preview."
+MOD_SMARTCOUNTDOWN3_PREVIEW_OPEN="Open preview"
+MOD_SMARTCOUNTDOWN3_PREVIEW_SAVE_FIRST="Preview not available until you save the module.
You can initially save it as unpublished - it will be available for preview only and will not appear on your site front end."
+
+; Layout overrides
+COM_MODULES_OVERRIDE_LAYOUT_FIELDSET_LABEL="Layout Overrides"
+MOD_SMARTCOUNTDOWN3_OVERRIDE_LAYOUT_DESC="By default counter layout is read from currently selected layout preset. However you can override some layout settings using controls below. Please, keep in mind that if responsive feature is enabled, overrides will affect full-width module display only! Any further layout transformations in response to template position width changes will be controlled by responsive rules listed in active layout preset and cannot be overridden here. You have to create a custom layout preset to get full control over the module layout on all screens."
+MOD_SMARTCOUNTDOWN3_LAYOUT_OVERRIDE_NONE="- Do not override -"
+
+MOD_SMARTCOUNTDOWN3_COUNTER_LAYOUT_LABEL="Counter Layout"
+MOD_SMARTCOUNTDOWN3_COUNTER_LAYOUT_DESC="Choose how counter digits are aligned - horizontally (from left to right) or vertically (from top to bottom)"
+MOD_SMARTCOUNTDOWN3_COUNTER_LAYOUT_VERT="vertical"
+MOD_SMARTCOUNTDOWN3_COUNTER_LAYOUT_HORZ="horizontal"
+
+MOD_SMARTCOUNTDOWN3_EVENT_TEXT_POS_LABEL="Event Text Position"
+MOD_SMARTCOUNTDOWN3_EVENT_TEXT_POS_DESC="Choose where to display event description(s) - above/below the counter block or inline with the counter"
+MOD_SMARTCOUNTDOWN3_EVENT_TEXT_POS_VERT="above/below"
+MOD_SMARTCOUNTDOWN3_EVENT_TEXT_POS_HORZ="inline"
+
+MOD_SMARTCOUNTDOWN3_LABELS_POS_LABEL="Labels Position"
+MOD_SMARTCOUNTDOWN3_LABELS_POS_DESC="Choose labels position relative to digits"
+MOD_SMARTCOUNTDOWN3_LABELS_POS_RIGTH="right"
+MOD_SMARTCOUNTDOWN3_LABELS_POS_BOTTOM="bottom"
+MOD_SMARTCOUNTDOWN3_LABELS_POS_TOP="top"
+MOD_SMARTCOUNTDOWN3_LABELS_POS_LEFT="left"
+MOD_SMARTCOUNTDOWN3_LAYOUT_OVERRIDE_ALL_SCREENS_DESC="The settings below will be effective on all screens"
+
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_LABEL="Labels Vertical Alignment"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_DESC="Choose how labels are aligned with digits (for "_QQ_"right"_QQ_" or "_QQ_"left"_QQ_" labels positions only)
May not work as expected if digits size is not significantly larger than labels size"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_MIDDLE="middle"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_TOP="top"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_BOTTOM="bottom"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_HIGH="1/4 from top"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_LOW="1/4 from bottom"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_SUPERSCRIPT="superscript"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_SUBSCRIPT="subscript"
+
+MOD_SMARTCOUNTDOWN3_HIDE_HIGHEST_ZEROS_LABEL="Hide Zero Units"
+MOD_SMARTCOUNTDOWN3_HIDE_HIGHEST_ZEROS_DESC="Hide counter units (except seconds) if they display zero values"
+MOD_SMARTCOUNTDOWN3_HIDE_HIGHEST_ZEROS_HIGHEST="Highest zeros only"
+MOD_SMARTCOUNTDOWN3_HIDE_HIGHEST_ZEROS_ALL="All zeros"
+
+MOD_SMARTCOUNTDOWN3_ALLOW_ALL_ZEROS_LABEL="Allow All Zeros"
+MOD_SMARTCOUNTDOWN3_ALLOW_ALL_ZEROS_DESC="Allow the counter to display all zeros when time interval becomes less than the lowest time unit displayed"
+
+MOD_SMARTCOUNTDOWN3_DISABLE_RESPONSIVE_LABEL="Responsive Behavior"
+MOD_SMARTCOUNTDOWN3_DISABLE_RESPONSIVE_DESC="Disable responsive behavior"
+
+; Styles
+COM_MODULES_STYLES_FIELDSET_LABEL="Styles"
+MOD_SMARTCOUNTDOWN3_MODULE_STYLE_LABEL="Module Style(s)"
+MOD_SMARTCOUNTDOWN3_MODULE_STYLE_DESC="Additional style(s) applied to the module. Enter CSS rules separated and ended by "_QQ_";"_QQ_""
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_STYLE_LABEL="Text Before Style(s)"
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_STYLE_DESC="Additional event text style(s). Enter CSS rules separated and ended by "_QQ_";"_QQ_""
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_STYLE_LABEL="Text After Style(s)"
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_STYLE_DESC="Additional event text style(s). Enter CSS rules separated and ended by "_QQ_";"_QQ_""
+MOD_SMARTCOUNTDOWN3_DIGITS_STYLE_LABEL="Digits Style(s)"
+MOD_SMARTCOUNTDOWN3_DIGITS_STYLE_DESC="Additional style(s) applied to counter digits. Not all styles will have effect for all animations. Enter CSS rules separated and ended by "_QQ_";"_QQ_""
+MOD_SMARTCOUNTDOWN3_LABELS_STYLE_LABEL="Labels Style(s)"
+MOD_SMARTCOUNTDOWN3_LABELS_STYLE_DESC="Additional labels style(s). Enter CSS rules separated and ended by "_QQ_";"_QQ_""
+
+; Redirection
+COM_MODULES_REDIRECTION_FIELDSET_LABEL="Automatic Redirection"
+MOD_SMARTCOUNTDOWN3_COUNTER_CLICKABLE_LABEL="Redirect on click"
+MOD_SMARTCOUNTDOWN3_COUNTER_CLICKABLE_DESC="Open redirection URL when the module is clicked"
+MOD_SMARTCOUNTDOWN3_COUNTER_CLICKABLE_NEVER="Disabled"
+MOD_SMARTCOUNTDOWN3_COUNTER_CLICKABLE_ALWAYS="Always"
+MOD_SMARTCOUNTDOWN3_COUNTER_CLICKABLE_COUNTDOWN="Only before event start"
+MOD_SMARTCOUNTDOWN3_COUNTER_CLICKABLE_COUNTUP="Only while event is in progress"
+MOD_SMARTCOUNTDOWN3_CONFIRM_REDIRECT_LABEL="Confirm Redirection"
+MOD_SMARTCOUNTDOWN3_CONFIRM_REDIRECT_DESC="Ask user permission to leave the page if non-empty forms are found on the page"
+MOD_SMARTCOUNTDOWN3_REDIRECT_CONTROL_LABEL="Redirect on countdown zero or module click (optional) - Select menu item or enter absolute URL. If absolute URL is set redirect menu item will be ignored."
+MOD_SMARTCOUNTDOWN3_EVENT_GOTO_MENU_LABEL="Menu Item"
+MOD_SMARTCOUNTDOWN3_EVENT_GOTO_MENU_DESC="Choose menu item for automatic redirection. Choose "_QQ_"Disabled"_QQ_" (default) to disable automatic redirection"
+MOD_SMARTCOUNTDOWN3_EVENT_GOTO_URL_LABEL="Absolute URL"
+MOD_SMARTCOUNTDOWN3_EVENT_GOTO_URL_DESC="Enter absolute URL for automatic redirection."
+
+; Time units
+MOD_SMARTCOUNTDOWN3_N_YEARS="Jaren"
+MOD_SMARTCOUNTDOWN3_N_MONTHS="Maanden"
+MOD_SMARTCOUNTDOWN3_N_WEEKS="Weken"
+MOD_SMARTCOUNTDOWN3_N_DAYS="Dagen"
+MOD_SMARTCOUNTDOWN3_N_HOURS="Uren"
+MOD_SMARTCOUNTDOWN3_N_MINUTES="Minuten"
+MOD_SMARTCOUNTDOWN3_N_SECONDS="Seconden"
+MOD_SMARTCOUNTDOWN3_N_YEARS_1="Jaar"
+MOD_SMARTCOUNTDOWN3_N_MONTHS_1="Maand"
+MOD_SMARTCOUNTDOWN3_N_WEEKS_1="Week"
+MOD_SMARTCOUNTDOWN3_N_DAYS_1="Dag"
+MOD_SMARTCOUNTDOWN3_N_HOURS_1="Uur"
+MOD_SMARTCOUNTDOWN3_N_MINUTES_1="Minuut"
+MOD_SMARTCOUNTDOWN3_N_SECONDS_1="Seconde"
+
+; Misc frontend translations
+MOD_SMARTCOUNTDOWN3_REDIRECT_CONFIRM_HINT="You are going to leave this page. All unsaved data will be lost. Are you sure?"
diff --git a/deployed/smartcountdown3/modules/mod_smartcountdown3/language/pt-BR/index.html b/deployed/smartcountdown3/modules/mod_smartcountdown3/language/pt-BR/index.html
new file mode 100644
index 00000000..2efb97f3
--- /dev/null
+++ b/deployed/smartcountdown3/modules/mod_smartcountdown3/language/pt-BR/index.html
@@ -0,0 +1 @@
+
diff --git a/deployed/smartcountdown3/modules/mod_smartcountdown3/language/pt-BR/pt-BR.mod_smartcountdown3.ini b/deployed/smartcountdown3/modules/mod_smartcountdown3/language/pt-BR/pt-BR.mod_smartcountdown3.ini
new file mode 100644
index 00000000..5b08af4d
--- /dev/null
+++ b/deployed/smartcountdown3/modules/mod_smartcountdown3/language/pt-BR/pt-BR.mod_smartcountdown3.ini
@@ -0,0 +1,180 @@
+; Note : All ini files need to be saved as UTF-8 - No BOM
+MOD_SMARTCOUNTDOWN3="Smart Countdown 3"
+MOD_SMARTCOUNTDOWN3_XML_DESCRIPTION="Smart Countdown 3 Module"
+MOD_SMARTCOUNTDOWN3_WITH_EXTRA_FX_XML_DESCRIPTION="Smart Countdown 3 Module with additional animation profiles"
+
+; Basic options
+MOD_SMARTCOUNTDOWN3_DEADLINE_LABEL="Event Date and Time"
+MOD_SMARTCOUNTDOWN3_DEADLINE_DESC="Event time (Joomla server time zone)"
+
+MOD_SMARTCOUNTDOWN3_COUNTER_MODES_LABEL="Module Display"
+MOD_SMARTCOUNTDOWN3_COUNTER_MODES_DESC="Choose an option for countdown/count up modes display
*) When "_QQ_"auto"_QQ_" is selected and events queue is imported by a plugin, the event's duration (if set) will be used as a count up limit
**) "_QQ_"Countdown to event end"_QQ_" will work with compatible event import plugins only"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_ONLY="Show countdown only"
+MOD_SMARTCOUNTDOWN3_SHOW_BOTH_AUTO="Show countdown and count up (auto)*"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_ONLY="Show count up only"
+MOD_SMARTCOUNTDOWN3_COUNTDOWN_OPTIONS_GROUP="- Countdown will start before event -"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_60="Countdown starts 1 minute before event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_300="Countdown starts 5 minutes before event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_900="Countdown starts 15 minutes before event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_1800="Countdown starts 30 minutes before event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_3600="Countdown starts 1 hour before event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_28800="Countdown starts 8 hours before event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_43200="Countdown starts 12 hours before event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_86400="Countdown starts 24 hours before event"
+MOD_SMARTCOUNTDOWN3_COUNTUP_OPTIONS_GROUP="- Count up will stop after event -"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_60="Count up stops 1 minute after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_300="Count up stops 5 minutes after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_900="Count up stops 15 minutes after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_1800="Count up stops 30 minutes after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_3600="Count up stops 1 hour after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_28800="Count up stops 8 hours after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_43200="Count up stops 12 hours after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_86400="Count up stops 24 hours after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_TO_END="Countdown to event end **"
+
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_DOWN_LABEL="Text Before Counter
(countdown mode)"
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_DOWN_DESC="Enter event description displayed before counter block in countdown mode"
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_DOWN_LABEL="Text After Counter
(countdown mode)"
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_DOWN_DESC="Enter event description displayed after counter block in countdown mode"
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_UP_LABEL="Text Before Counter
(count up mode)"
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_UP_DESC="Enter event description displayed before counter block in count up mode"
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_UP_LABEL="Text After Counter
(count up mode)"
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_UP_DESC="Enter event description displayed after counter block in count up mode"
+
+MOD_SMARTCOUNTDOWN3_HIDE_COUNTUP_COUNTER_LABEL="Hide counter in count up mode"
+MOD_SMARTCOUNTDOWN3_HIDE_COUNTUP_COUNTER_DESC="Only display event descriptions in count up mode ("_QQ_"Time has arrived!"_QQ_" message mode)"
+
+; Layout
+COM_MODULES_LAYOUT_FIELDSET_LABEL="Layout"
+MOD_SMARTCOUNTDOWN3_UNITS_LABEL="Counter Units"
+MOD_SMARTCOUNTDOWN3_UNITS_DESC="Check counter units to show"
+MOD_SMARTCOUNTDOWN3_UNITS_YEARS="Years"
+MOD_SMARTCOUNTDOWN3_UNITS_MONTHS="Months"
+MOD_SMARTCOUNTDOWN3_UNITS_WEEKS="Weeks"
+MOD_SMARTCOUNTDOWN3_UNITS_DAYS="Days"
+MOD_SMARTCOUNTDOWN3_UNITS_HOURS="Hours"
+MOD_SMARTCOUNTDOWN3_UNITS_MINUTES="Minutes"
+MOD_SMARTCOUNTDOWN3_UNITS_SECONDS="Seconds"
+
+MOD_SMARTCOUNTDOWN3_LAYOUT_PRESET_LABEL="Layout Preset"
+MOD_SMARTCOUNTDOWN3_LAYOUT_PRESET_DESC="Select layout preset"
+MOD_SMARTCOUNTDOWN3_FX_PRESET_LABEL="Digits Animation"
+MOD_SMARTCOUNTDOWN3_FX_PRESET_DESC="Select digits animation preset"
+MOD_SMARTCOUNTDOWN3_HORIZONTALLY_CENTER_LABEL="Horizontally Center"
+MOD_SMARTCOUNTDOWN3_HORIZONTALLY_CENTER_DESC="Horizontally center all counter elements"
+
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_SIZE_LABEL="Text Before Size"
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_SIZE_DESC="Select font size in px for event description displayed before counter"
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_SIZE_LABEL="Text After Size"
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_SIZE_DESC="Select font size in px for event description displayed after counter"
+MOD_SMARTCOUNTDOWN3_DIGITS_SIZE_LABEL="Digits Size"
+MOD_SMARTCOUNTDOWN3_DIGITS_SIZE_DESC="Select size in px for counter digits"
+MOD_SMARTCOUNTDOWN3_LABELS_SIZE_LABEL="Labels Size"
+MOD_SMARTCOUNTDOWN3_LABELS_SIZE_DESC="Select font size in px for counter labels"
+
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_HORZ_LABEL="Units Horizontal Spacing"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_HORZ_DESC="Spacing between counter units in horizontal (row) layout"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_VERT_LABEL="Units Vertical Spacing"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_VERT_DESC="Spacing between counter units in vertical (column) layout"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_WIDE_PLUS="Largest"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_WIDE="Large"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_NORMAL="Normal"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_CONDENSED="Small"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_CONDENSED_PLUS="Smallest"
+
+MOD_SMARTCOUNTDOWN3_PREVIEW_LABEL="Preview"
+MOD_SMARTCOUNTDOWN3_PREVIEW_DESC="Preview module output in a separate test window. If you are changing module configuration and are not sure about the effects you can temporarily unpublish the module. It will not appear on your site front end but you will be able to test the changes in preview."
+MOD_SMARTCOUNTDOWN3_PREVIEW_OPEN="Open preview"
+MOD_SMARTCOUNTDOWN3_PREVIEW_SAVE_FIRST="Preview not available until you save the module.
You can initially save it as unpublished - it will be available for preview only and will not appear on your site front end."
+
+; Layout overrides
+COM_MODULES_OVERRIDE_LAYOUT_FIELDSET_LABEL="Layout Overrides"
+MOD_SMARTCOUNTDOWN3_OVERRIDE_LAYOUT_DESC="By default counter layout is read from currently selected layout preset. However you can override some layout settings using controls below. Please, keep in mind that if responsive feature is enabled, overrides will affect full-width module display only! Any further layout transformations in response to template position width changes will be controlled by responsive rules listed in active layout preset and cannot be overridden here. You have to create a custom layout preset to get full control over the module layout on all screens."
+MOD_SMARTCOUNTDOWN3_LAYOUT_OVERRIDE_NONE="- Do not override -"
+
+MOD_SMARTCOUNTDOWN3_COUNTER_LAYOUT_LABEL="Counter Layout"
+MOD_SMARTCOUNTDOWN3_COUNTER_LAYOUT_DESC="Choose how counter digits are aligned - horizontally (from left to right) or vertically (from top to bottom)"
+MOD_SMARTCOUNTDOWN3_COUNTER_LAYOUT_VERT="vertical"
+MOD_SMARTCOUNTDOWN3_COUNTER_LAYOUT_HORZ="horizontal"
+
+MOD_SMARTCOUNTDOWN3_EVENT_TEXT_POS_LABEL="Event Text Position"
+MOD_SMARTCOUNTDOWN3_EVENT_TEXT_POS_DESC="Choose where to display event description(s) - above/below the counter block or inline with the counter"
+MOD_SMARTCOUNTDOWN3_EVENT_TEXT_POS_VERT="above/below"
+MOD_SMARTCOUNTDOWN3_EVENT_TEXT_POS_HORZ="inline"
+
+MOD_SMARTCOUNTDOWN3_LABELS_POS_LABEL="Labels Position"
+MOD_SMARTCOUNTDOWN3_LABELS_POS_DESC="Choose labels position relative to digits"
+MOD_SMARTCOUNTDOWN3_LABELS_POS_RIGTH="right"
+MOD_SMARTCOUNTDOWN3_LABELS_POS_BOTTOM="bottom"
+MOD_SMARTCOUNTDOWN3_LABELS_POS_TOP="top"
+MOD_SMARTCOUNTDOWN3_LABELS_POS_LEFT="left"
+MOD_SMARTCOUNTDOWN3_LAYOUT_OVERRIDE_ALL_SCREENS_DESC="The settings below will be effective on all screens"
+
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_LABEL="Labels Vertical Alignment"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_DESC="Choose how labels are aligned with digits (for "_QQ_"right"_QQ_" or "_QQ_"left"_QQ_" labels positions only)
May not work as expected if digits size is not significantly larger than labels size"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_MIDDLE="middle"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_TOP="top"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_BOTTOM="bottom"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_HIGH="1/4 from top"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_LOW="1/4 from bottom"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_SUPERSCRIPT="superscript"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_SUBSCRIPT="subscript"
+
+MOD_SMARTCOUNTDOWN3_HIDE_HIGHEST_ZEROS_LABEL="Hide Zero Units"
+MOD_SMARTCOUNTDOWN3_HIDE_HIGHEST_ZEROS_DESC="Hide counter units (except seconds) if they display zero values"
+MOD_SMARTCOUNTDOWN3_HIDE_HIGHEST_ZEROS_HIGHEST="Highest zeros only"
+MOD_SMARTCOUNTDOWN3_HIDE_HIGHEST_ZEROS_ALL="All zeros"
+
+MOD_SMARTCOUNTDOWN3_ALLOW_ALL_ZEROS_LABEL="Allow All Zeros"
+MOD_SMARTCOUNTDOWN3_ALLOW_ALL_ZEROS_DESC="Allow the counter to display all zeros when time interval becomes less than the lowest time unit displayed"
+
+MOD_SMARTCOUNTDOWN3_DISABLE_RESPONSIVE_LABEL="Responsive Behavior"
+MOD_SMARTCOUNTDOWN3_DISABLE_RESPONSIVE_DESC="Disable responsive behavior"
+
+; Styles
+COM_MODULES_STYLES_FIELDSET_LABEL="Styles"
+MOD_SMARTCOUNTDOWN3_MODULE_STYLE_LABEL="Module Style(s)"
+MOD_SMARTCOUNTDOWN3_MODULE_STYLE_DESC="Additional style(s) applied to the module. Enter CSS rules separated and ended by "_QQ_";"_QQ_""
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_STYLE_LABEL="Text Before Style(s)"
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_STYLE_DESC="Additional event text style(s). Enter CSS rules separated and ended by "_QQ_";"_QQ_""
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_STYLE_LABEL="Text After Style(s)"
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_STYLE_DESC="Additional event text style(s). Enter CSS rules separated and ended by "_QQ_";"_QQ_""
+MOD_SMARTCOUNTDOWN3_DIGITS_STYLE_LABEL="Digits Style(s)"
+MOD_SMARTCOUNTDOWN3_DIGITS_STYLE_DESC="Additional style(s) applied to counter digits. Not all styles will have effect for all animations. Enter CSS rules separated and ended by "_QQ_";"_QQ_""
+MOD_SMARTCOUNTDOWN3_LABELS_STYLE_LABEL="Labels Style(s)"
+MOD_SMARTCOUNTDOWN3_LABELS_STYLE_DESC="Additional labels style(s). Enter CSS rules separated and ended by "_QQ_";"_QQ_""
+
+; Redirection
+COM_MODULES_REDIRECTION_FIELDSET_LABEL="Automatic Redirection"
+MOD_SMARTCOUNTDOWN3_COUNTER_CLICKABLE_LABEL="Redirect on click"
+MOD_SMARTCOUNTDOWN3_COUNTER_CLICKABLE_DESC="Open redirection URL when the module is clicked"
+MOD_SMARTCOUNTDOWN3_COUNTER_CLICKABLE_NEVER="Disabled"
+MOD_SMARTCOUNTDOWN3_COUNTER_CLICKABLE_ALWAYS="Always"
+MOD_SMARTCOUNTDOWN3_COUNTER_CLICKABLE_COUNTDOWN="Only before event start"
+MOD_SMARTCOUNTDOWN3_COUNTER_CLICKABLE_COUNTUP="Only while event is in progress"
+MOD_SMARTCOUNTDOWN3_CONFIRM_REDIRECT_LABEL="Confirm Redirection"
+MOD_SMARTCOUNTDOWN3_CONFIRM_REDIRECT_DESC="Ask user permission to leave the page if non-empty forms are found on the page"
+MOD_SMARTCOUNTDOWN3_REDIRECT_CONTROL_LABEL="Redirect on countdown zero or module click (optional) - Select menu item or enter absolute URL. If absolute URL is set redirect menu item will be ignored."
+MOD_SMARTCOUNTDOWN3_EVENT_GOTO_MENU_LABEL="Menu Item"
+MOD_SMARTCOUNTDOWN3_EVENT_GOTO_MENU_DESC="Choose menu item for automatic redirection. Choose "_QQ_"Disabled"_QQ_" (default) to disable automatic redirection"
+MOD_SMARTCOUNTDOWN3_EVENT_GOTO_URL_LABEL="Absolute URL"
+MOD_SMARTCOUNTDOWN3_EVENT_GOTO_URL_DESC="Enter absolute URL for automatic redirection."
+
+; Time units
+MOD_SMARTCOUNTDOWN3_N_YEARS="Anos"
+MOD_SMARTCOUNTDOWN3_N_MONTHS="Meses"
+MOD_SMARTCOUNTDOWN3_N_WEEKS="Semanas"
+MOD_SMARTCOUNTDOWN3_N_DAYS="Dias"
+MOD_SMARTCOUNTDOWN3_N_HOURS="Horas"
+MOD_SMARTCOUNTDOWN3_N_MINUTES="Minutos"
+MOD_SMARTCOUNTDOWN3_N_SECONDS="Segundos"
+MOD_SMARTCOUNTDOWN3_N_YEARS_1="Ano"
+MOD_SMARTCOUNTDOWN3_N_MONTHS_1="Mês"
+MOD_SMARTCOUNTDOWN3_N_WEEKS_1="Semana"
+MOD_SMARTCOUNTDOWN3_N_DAYS_1="Dia"
+MOD_SMARTCOUNTDOWN3_N_HOURS_1="Hora"
+MOD_SMARTCOUNTDOWN3_N_MINUTES_1="Minuto"
+MOD_SMARTCOUNTDOWN3_N_SECONDS_1="Segundo"
+
+; Misc frontend translations
+MOD_SMARTCOUNTDOWN3_REDIRECT_CONFIRM_HINT="Você está deixando essa página. Todos os dados não salvos serão perdidos. Você tem certeza?"
diff --git a/deployed/smartcountdown3/modules/mod_smartcountdown3/language/pt-PT/index.html b/deployed/smartcountdown3/modules/mod_smartcountdown3/language/pt-PT/index.html
new file mode 100644
index 00000000..2efb97f3
--- /dev/null
+++ b/deployed/smartcountdown3/modules/mod_smartcountdown3/language/pt-PT/index.html
@@ -0,0 +1 @@
+
diff --git a/deployed/smartcountdown3/modules/mod_smartcountdown3/language/pt-PT/pt-BR.mod_smartcountdown3.ini b/deployed/smartcountdown3/modules/mod_smartcountdown3/language/pt-PT/pt-BR.mod_smartcountdown3.ini
new file mode 100644
index 00000000..ad384e7e
--- /dev/null
+++ b/deployed/smartcountdown3/modules/mod_smartcountdown3/language/pt-PT/pt-BR.mod_smartcountdown3.ini
@@ -0,0 +1,180 @@
+; Note : All ini files need to be saved as UTF-8 - No BOM
+MOD_SMARTCOUNTDOWN3="Smart Countdown 3"
+MOD_SMARTCOUNTDOWN3_XML_DESCRIPTION="Smart Countdown 3 Module"
+MOD_SMARTCOUNTDOWN3_WITH_EXTRA_FX_XML_DESCRIPTION="Smart Countdown 3 Module with additional animation profiles"
+
+; Basic options
+MOD_SMARTCOUNTDOWN3_DEADLINE_LABEL="Event Date and Time"
+MOD_SMARTCOUNTDOWN3_DEADLINE_DESC="Event time (Joomla server time zone)"
+
+MOD_SMARTCOUNTDOWN3_COUNTER_MODES_LABEL="Module Display"
+MOD_SMARTCOUNTDOWN3_COUNTER_MODES_DESC="Choose an option for countdown/count up modes display
*) When "_QQ_"auto"_QQ_" is selected and events queue is imported by a plugin, the event's duration (if set) will be used as a count up limit
**) "_QQ_"Countdown to event end"_QQ_" will work with compatible event import plugins only"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_ONLY="Show countdown only"
+MOD_SMARTCOUNTDOWN3_SHOW_BOTH_AUTO="Show countdown and count up (auto)*"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_ONLY="Show count up only"
+MOD_SMARTCOUNTDOWN3_COUNTDOWN_OPTIONS_GROUP="- Countdown will start before event -"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_60="Countdown starts 1 minute before event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_300="Countdown starts 5 minutes before event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_900="Countdown starts 15 minutes before event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_1800="Countdown starts 30 minutes before event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_3600="Countdown starts 1 hour before event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_28800="Countdown starts 8 hours before event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_43200="Countdown starts 12 hours before event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_86400="Countdown starts 24 hours before event"
+MOD_SMARTCOUNTDOWN3_COUNTUP_OPTIONS_GROUP="- Count up will stop after event -"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_60="Count up stops 1 minute after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_300="Count up stops 5 minutes after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_900="Count up stops 15 minutes after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_1800="Count up stops 30 minutes after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_3600="Count up stops 1 hour after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_28800="Count up stops 8 hours after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_43200="Count up stops 12 hours after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_86400="Count up stops 24 hours after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_TO_END="Countdown to event end **"
+
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_DOWN_LABEL="Text Before Counter
(countdown mode)"
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_DOWN_DESC="Enter event description displayed before counter block in countdown mode"
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_DOWN_LABEL="Text After Counter
(countdown mode)"
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_DOWN_DESC="Enter event description displayed after counter block in countdown mode"
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_UP_LABEL="Text Before Counter
(count up mode)"
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_UP_DESC="Enter event description displayed before counter block in count up mode"
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_UP_LABEL="Text After Counter
(count up mode)"
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_UP_DESC="Enter event description displayed after counter block in count up mode"
+
+MOD_SMARTCOUNTDOWN3_HIDE_COUNTUP_COUNTER_LABEL="Hide counter in count up mode"
+MOD_SMARTCOUNTDOWN3_HIDE_COUNTUP_COUNTER_DESC="Only display event descriptions in count up mode ("_QQ_"Time has arrived!"_QQ_" message mode)"
+
+; Layout
+COM_MODULES_LAYOUT_FIELDSET_LABEL="Layout"
+MOD_SMARTCOUNTDOWN3_UNITS_LABEL="Counter Units"
+MOD_SMARTCOUNTDOWN3_UNITS_DESC="Check counter units to show"
+MOD_SMARTCOUNTDOWN3_UNITS_YEARS="Years"
+MOD_SMARTCOUNTDOWN3_UNITS_MONTHS="Months"
+MOD_SMARTCOUNTDOWN3_UNITS_WEEKS="Weeks"
+MOD_SMARTCOUNTDOWN3_UNITS_DAYS="Days"
+MOD_SMARTCOUNTDOWN3_UNITS_HOURS="Hours"
+MOD_SMARTCOUNTDOWN3_UNITS_MINUTES="Minutes"
+MOD_SMARTCOUNTDOWN3_UNITS_SECONDS="Seconds"
+
+MOD_SMARTCOUNTDOWN3_LAYOUT_PRESET_LABEL="Layout Preset"
+MOD_SMARTCOUNTDOWN3_LAYOUT_PRESET_DESC="Select layout preset"
+MOD_SMARTCOUNTDOWN3_FX_PRESET_LABEL="Digits Animation"
+MOD_SMARTCOUNTDOWN3_FX_PRESET_DESC="Select digits animation preset"
+MOD_SMARTCOUNTDOWN3_HORIZONTALLY_CENTER_LABEL="Horizontally Center"
+MOD_SMARTCOUNTDOWN3_HORIZONTALLY_CENTER_DESC="Horizontally center all counter elements"
+
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_SIZE_LABEL="Text Before Size"
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_SIZE_DESC="Select font size in px for event description displayed before counter"
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_SIZE_LABEL="Text After Size"
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_SIZE_DESC="Select font size in px for event description displayed after counter"
+MOD_SMARTCOUNTDOWN3_DIGITS_SIZE_LABEL="Digits Size"
+MOD_SMARTCOUNTDOWN3_DIGITS_SIZE_DESC="Select size in px for counter digits"
+MOD_SMARTCOUNTDOWN3_LABELS_SIZE_LABEL="Labels Size"
+MOD_SMARTCOUNTDOWN3_LABELS_SIZE_DESC="Select font size in px for counter labels"
+
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_HORZ_LABEL="Units Horizontal Spacing"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_HORZ_DESC="Spacing between counter units in horizontal (row) layout"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_VERT_LABEL="Units Vertical Spacing"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_VERT_DESC="Spacing between counter units in vertical (column) layout"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_WIDE_PLUS="Largest"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_WIDE="Large"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_NORMAL="Normal"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_CONDENSED="Small"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_CONDENSED_PLUS="Smallest"
+
+MOD_SMARTCOUNTDOWN3_PREVIEW_LABEL="Preview"
+MOD_SMARTCOUNTDOWN3_PREVIEW_DESC="Preview module output in a separate test window. If you are changing module configuration and are not sure about the effects you can temporarily unpublish the module. It will not appear on your site front end but you will be able to test the changes in preview."
+MOD_SMARTCOUNTDOWN3_PREVIEW_OPEN="Open preview"
+MOD_SMARTCOUNTDOWN3_PREVIEW_SAVE_FIRST="Preview not available until you save the module.
You can initially save it as unpublished - it will be available for preview only and will not appear on your site front end."
+
+; Layout overrides
+COM_MODULES_OVERRIDE_LAYOUT_FIELDSET_LABEL="Layout Overrides"
+MOD_SMARTCOUNTDOWN3_OVERRIDE_LAYOUT_DESC="By default counter layout is read from currently selected layout preset. However you can override some layout settings using controls below. Please, keep in mind that if responsive feature is enabled, overrides will affect full-width module display only! Any further layout transformations in response to template position width changes will be controlled by responsive rules listed in active layout preset and cannot be overridden here. You have to create a custom layout preset to get full control over the module layout on all screens."
+MOD_SMARTCOUNTDOWN3_LAYOUT_OVERRIDE_NONE="- Do not override -"
+
+MOD_SMARTCOUNTDOWN3_COUNTER_LAYOUT_LABEL="Counter Layout"
+MOD_SMARTCOUNTDOWN3_COUNTER_LAYOUT_DESC="Choose how counter digits are aligned - horizontally (from left to right) or vertically (from top to bottom)"
+MOD_SMARTCOUNTDOWN3_COUNTER_LAYOUT_VERT="vertical"
+MOD_SMARTCOUNTDOWN3_COUNTER_LAYOUT_HORZ="horizontal"
+
+MOD_SMARTCOUNTDOWN3_EVENT_TEXT_POS_LABEL="Event Text Position"
+MOD_SMARTCOUNTDOWN3_EVENT_TEXT_POS_DESC="Choose where to display event description(s) - above/below the counter block or inline with the counter"
+MOD_SMARTCOUNTDOWN3_EVENT_TEXT_POS_VERT="above/below"
+MOD_SMARTCOUNTDOWN3_EVENT_TEXT_POS_HORZ="inline"
+
+MOD_SMARTCOUNTDOWN3_LABELS_POS_LABEL="Labels Position"
+MOD_SMARTCOUNTDOWN3_LABELS_POS_DESC="Choose labels position relative to digits"
+MOD_SMARTCOUNTDOWN3_LABELS_POS_RIGTH="right"
+MOD_SMARTCOUNTDOWN3_LABELS_POS_BOTTOM="bottom"
+MOD_SMARTCOUNTDOWN3_LABELS_POS_TOP="top"
+MOD_SMARTCOUNTDOWN3_LABELS_POS_LEFT="left"
+MOD_SMARTCOUNTDOWN3_LAYOUT_OVERRIDE_ALL_SCREENS_DESC="The settings below will be effective on all screens"
+
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_LABEL="Labels Vertical Alignment"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_DESC="Choose how labels are aligned with digits (for "_QQ_"right"_QQ_" or "_QQ_"left"_QQ_" labels positions only)
May not work as expected if digits size is not significantly larger than labels size"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_MIDDLE="middle"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_TOP="top"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_BOTTOM="bottom"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_HIGH="1/4 from top"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_LOW="1/4 from bottom"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_SUPERSCRIPT="superscript"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_SUBSCRIPT="subscript"
+
+MOD_SMARTCOUNTDOWN3_HIDE_HIGHEST_ZEROS_LABEL="Hide Zero Units"
+MOD_SMARTCOUNTDOWN3_HIDE_HIGHEST_ZEROS_DESC="Hide counter units (except seconds) if they display zero values"
+MOD_SMARTCOUNTDOWN3_HIDE_HIGHEST_ZEROS_HIGHEST="Highest zeros only"
+MOD_SMARTCOUNTDOWN3_HIDE_HIGHEST_ZEROS_ALL="All zeros"
+
+MOD_SMARTCOUNTDOWN3_ALLOW_ALL_ZEROS_LABEL="Allow All Zeros"
+MOD_SMARTCOUNTDOWN3_ALLOW_ALL_ZEROS_DESC="Allow the counter to display all zeros when time interval becomes less than the lowest time unit displayed"
+
+MOD_SMARTCOUNTDOWN3_DISABLE_RESPONSIVE_LABEL="Responsive Behavior"
+MOD_SMARTCOUNTDOWN3_DISABLE_RESPONSIVE_DESC="Disable responsive behavior"
+
+; Styles
+COM_MODULES_STYLES_FIELDSET_LABEL="Styles"
+MOD_SMARTCOUNTDOWN3_MODULE_STYLE_LABEL="Module Style(s)"
+MOD_SMARTCOUNTDOWN3_MODULE_STYLE_DESC="Additional style(s) applied to the module. Enter CSS rules separated and ended by "_QQ_";"_QQ_""
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_STYLE_LABEL="Text Before Style(s)"
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_STYLE_DESC="Additional event text style(s). Enter CSS rules separated and ended by "_QQ_";"_QQ_""
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_STYLE_LABEL="Text After Style(s)"
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_STYLE_DESC="Additional event text style(s). Enter CSS rules separated and ended by "_QQ_";"_QQ_""
+MOD_SMARTCOUNTDOWN3_DIGITS_STYLE_LABEL="Digits Style(s)"
+MOD_SMARTCOUNTDOWN3_DIGITS_STYLE_DESC="Additional style(s) applied to counter digits. Not all styles will have effect for all animations. Enter CSS rules separated and ended by "_QQ_";"_QQ_""
+MOD_SMARTCOUNTDOWN3_LABELS_STYLE_LABEL="Labels Style(s)"
+MOD_SMARTCOUNTDOWN3_LABELS_STYLE_DESC="Additional labels style(s). Enter CSS rules separated and ended by "_QQ_";"_QQ_""
+
+; Redirection
+COM_MODULES_REDIRECTION_FIELDSET_LABEL="Automatic Redirection"
+MOD_SMARTCOUNTDOWN3_COUNTER_CLICKABLE_LABEL="Redirect on click"
+MOD_SMARTCOUNTDOWN3_COUNTER_CLICKABLE_DESC="Open redirection URL when the module is clicked"
+MOD_SMARTCOUNTDOWN3_COUNTER_CLICKABLE_NEVER="Disabled"
+MOD_SMARTCOUNTDOWN3_COUNTER_CLICKABLE_ALWAYS="Always"
+MOD_SMARTCOUNTDOWN3_COUNTER_CLICKABLE_COUNTDOWN="Only before event start"
+MOD_SMARTCOUNTDOWN3_COUNTER_CLICKABLE_COUNTUP="Only while event is in progress"
+MOD_SMARTCOUNTDOWN3_CONFIRM_REDIRECT_LABEL="Confirm Redirection"
+MOD_SMARTCOUNTDOWN3_CONFIRM_REDIRECT_DESC="Ask user permission to leave the page if non-empty forms are found on the page"
+MOD_SMARTCOUNTDOWN3_REDIRECT_CONTROL_LABEL="Redirect on countdown zero or module click (optional) - Select menu item or enter absolute URL. If absolute URL is set redirect menu item will be ignored."
+MOD_SMARTCOUNTDOWN3_EVENT_GOTO_MENU_LABEL="Menu Item"
+MOD_SMARTCOUNTDOWN3_EVENT_GOTO_MENU_DESC="Choose menu item for automatic redirection. Choose "_QQ_"Disabled"_QQ_" (default) to disable automatic redirection"
+MOD_SMARTCOUNTDOWN3_EVENT_GOTO_URL_LABEL="Absolute URL"
+MOD_SMARTCOUNTDOWN3_EVENT_GOTO_URL_DESC="Enter absolute URL for automatic redirection."
+
+; Time units
+MOD_SMARTCOUNTDOWN3_N_YEARS="Anos"
+MOD_SMARTCOUNTDOWN3_N_MONTHS="Meses"
+MOD_SMARTCOUNTDOWN3_N_WEEKS="Semanas"
+MOD_SMARTCOUNTDOWN3_N_DAYS="Dias"
+MOD_SMARTCOUNTDOWN3_N_HOURS="Horas"
+MOD_SMARTCOUNTDOWN3_N_MINUTES="Minutos"
+MOD_SMARTCOUNTDOWN3_N_SECONDS="Segundos"
+MOD_SMARTCOUNTDOWN3_N_YEARS_1="Ano"
+MOD_SMARTCOUNTDOWN3_N_MONTHS_1="Mês"
+MOD_SMARTCOUNTDOWN3_N_WEEKS_1="Semana"
+MOD_SMARTCOUNTDOWN3_N_DAYS_1="Dia"
+MOD_SMARTCOUNTDOWN3_N_HOURS_1="Hora"
+MOD_SMARTCOUNTDOWN3_N_MINUTES_1="Minuto"
+MOD_SMARTCOUNTDOWN3_N_SECONDS_1="Segundo"
+
+; Misc frontend translations
+MOD_SMARTCOUNTDOWN3_REDIRECT_CONFIRM_HINT="Você vai deixar essa página. Todos os dados não salvos serão perdidos. Você tem certeza?"
diff --git a/deployed/smartcountdown3/modules/mod_smartcountdown3/language/ru-RU/index.html b/deployed/smartcountdown3/modules/mod_smartcountdown3/language/ru-RU/index.html
new file mode 100644
index 00000000..2efb97f3
--- /dev/null
+++ b/deployed/smartcountdown3/modules/mod_smartcountdown3/language/ru-RU/index.html
@@ -0,0 +1 @@
+
diff --git a/deployed/smartcountdown3/modules/mod_smartcountdown3/language/ru-RU/ru-RU.mod_smartcountdown3.ini b/deployed/smartcountdown3/modules/mod_smartcountdown3/language/ru-RU/ru-RU.mod_smartcountdown3.ini
new file mode 100644
index 00000000..70c2a9ea
--- /dev/null
+++ b/deployed/smartcountdown3/modules/mod_smartcountdown3/language/ru-RU/ru-RU.mod_smartcountdown3.ini
@@ -0,0 +1,187 @@
+; Note : All ini files need to be saved as UTF-8 - No BOM
+MOD_SMARTCOUNTDOWN3="Smart Countdown 3"
+MOD_SMARTCOUNTDOWN3_XML_DESCRIPTION="Smart Countdown 3 Module"
+MOD_SMARTCOUNTDOWN3_WITH_EXTRA_FX_XML_DESCRIPTION="Smart Countdown 3 Module with additional animation profiles"
+
+; Basic options
+MOD_SMARTCOUNTDOWN3_DEADLINE_LABEL="Event Date and Time"
+MOD_SMARTCOUNTDOWN3_DEADLINE_DESC="Event time (Joomla server time zone)"
+
+MOD_SMARTCOUNTDOWN3_COUNTER_MODES_LABEL="Module Display"
+MOD_SMARTCOUNTDOWN3_COUNTER_MODES_DESC="Choose an option for countdown/count up modes display
*) When "_QQ_"auto"_QQ_" is selected and events queue is imported by a plugin, the event's duration (if set) will be used as a count up limit
**) "_QQ_"Countdown to event end"_QQ_" will work with compatible event import plugins only"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_ONLY="Show countdown only"
+MOD_SMARTCOUNTDOWN3_SHOW_BOTH_AUTO="Show countdown and count up (auto)*"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_ONLY="Show count up only"
+MOD_SMARTCOUNTDOWN3_COUNTDOWN_OPTIONS_GROUP="- Countdown will start before event -"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_60="Countdown starts 1 minute before event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_300="Countdown starts 5 minutes before event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_900="Countdown starts 15 minutes before event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_1800="Countdown starts 30 minutes before event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_3600="Countdown starts 1 hour before event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_28800="Countdown starts 8 hours before event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_43200="Countdown starts 12 hours before event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_86400="Countdown starts 24 hours before event"
+MOD_SMARTCOUNTDOWN3_COUNTUP_OPTIONS_GROUP="- Count up will stop after event -"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_60="Count up stops 1 minute after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_300="Count up stops 5 minutes after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_900="Count up stops 15 minutes after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_1800="Count up stops 30 minutes after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_3600="Count up stops 1 hour after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_28800="Count up stops 8 hours after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_43200="Count up stops 12 hours after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTUP_86400="Count up stops 24 hours after event"
+MOD_SMARTCOUNTDOWN3_SHOW_COUNTDOWN_TO_END="Countdown to event end **"
+
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_DOWN_LABEL="Text Before Counter
(countdown mode)"
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_DOWN_DESC="Enter event description displayed before counter block in countdown mode"
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_DOWN_LABEL="Text After Counter
(countdown mode)"
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_DOWN_DESC="Enter event description displayed after counter block in countdown mode"
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_UP_LABEL="Text Before Counter
(count up mode)"
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_UP_DESC="Enter event description displayed before counter block in count up mode"
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_UP_LABEL="Text After Counter
(count up mode)"
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_UP_DESC="Enter event description displayed after counter block in count up mode"
+
+MOD_SMARTCOUNTDOWN3_HIDE_COUNTUP_COUNTER_LABEL="Hide counter in count up mode"
+MOD_SMARTCOUNTDOWN3_HIDE_COUNTUP_COUNTER_DESC="Only display event descriptions in count up mode ("_QQ_"Time has arrived!"_QQ_" message mode)"
+
+; Layout
+COM_MODULES_LAYOUT_FIELDSET_LABEL="Layout"
+MOD_SMARTCOUNTDOWN3_UNITS_LABEL="Counter Units"
+MOD_SMARTCOUNTDOWN3_UNITS_DESC="Check counter units to show"
+MOD_SMARTCOUNTDOWN3_UNITS_YEARS="Years"
+MOD_SMARTCOUNTDOWN3_UNITS_MONTHS="Months"
+MOD_SMARTCOUNTDOWN3_UNITS_WEEKS="Weeks"
+MOD_SMARTCOUNTDOWN3_UNITS_DAYS="Days"
+MOD_SMARTCOUNTDOWN3_UNITS_HOURS="Hours"
+MOD_SMARTCOUNTDOWN3_UNITS_MINUTES="Minutes"
+MOD_SMARTCOUNTDOWN3_UNITS_SECONDS="Seconds"
+
+MOD_SMARTCOUNTDOWN3_LAYOUT_PRESET_LABEL="Layout Preset"
+MOD_SMARTCOUNTDOWN3_LAYOUT_PRESET_DESC="Select layout preset"
+MOD_SMARTCOUNTDOWN3_FX_PRESET_LABEL="Digits Animation"
+MOD_SMARTCOUNTDOWN3_FX_PRESET_DESC="Select digits animation preset"
+MOD_SMARTCOUNTDOWN3_HORIZONTALLY_CENTER_LABEL="Horizontally Center"
+MOD_SMARTCOUNTDOWN3_HORIZONTALLY_CENTER_DESC="Horizontally center all counter elements"
+
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_SIZE_LABEL="Text Before Size"
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_SIZE_DESC="Select font size in px for event description displayed before counter"
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_SIZE_LABEL="Text After Size"
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_SIZE_DESC="Select font size in px for event description displayed after counter"
+MOD_SMARTCOUNTDOWN3_DIGITS_SIZE_LABEL="Digits Size"
+MOD_SMARTCOUNTDOWN3_DIGITS_SIZE_DESC="Select size in px for counter digits"
+MOD_SMARTCOUNTDOWN3_LABELS_SIZE_LABEL="Labels Size"
+MOD_SMARTCOUNTDOWN3_LABELS_SIZE_DESC="Select font size in px for counter labels"
+
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_HORZ_LABEL="Units Horizontal Spacing"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_HORZ_DESC="Spacing between counter units in horizontal (row) layout"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_VERT_LABEL="Units Vertical Spacing"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_VERT_DESC="Spacing between counter units in vertical (column) layout"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_WIDE_PLUS="Largest"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_WIDE="Large"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_NORMAL="Normal"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_CONDENSED="Small"
+MOD_SMARTCOUNTDOWN3_UNITS_SPACING_CONDENSED_PLUS="Smallest"
+
+MOD_SMARTCOUNTDOWN3_PREVIEW_LABEL="Preview"
+MOD_SMARTCOUNTDOWN3_PREVIEW_DESC="Preview module output in a separate test window. If you are changing module configuration and are not sure about the effects you can temporarily unpublish the module. It will not appear on your site front end but you will be able to test the changes in preview."
+MOD_SMARTCOUNTDOWN3_PREVIEW_OPEN="Open preview"
+MOD_SMARTCOUNTDOWN3_PREVIEW_SAVE_FIRST="Preview not available until you save the module.
You can initially save it as unpublished - it will be available for preview only and will not appear on your site front end."
+
+; Layout overrides
+COM_MODULES_OVERRIDE_LAYOUT_FIELDSET_LABEL="Layout Overrides"
+MOD_SMARTCOUNTDOWN3_OVERRIDE_LAYOUT_DESC="By default counter layout is read from currently selected layout preset. However you can override some layout settings using controls below. Please, keep in mind that if responsive feature is enabled, overrides will affect full-width module display only! Any further layout transformations in response to template position width changes will be controlled by responsive rules listed in active layout preset and cannot be overridden here. You have to create a custom layout preset to get full control over the module layout on all screens."
+MOD_SMARTCOUNTDOWN3_LAYOUT_OVERRIDE_NONE="- Do not override -"
+
+MOD_SMARTCOUNTDOWN3_COUNTER_LAYOUT_LABEL="Counter Layout"
+MOD_SMARTCOUNTDOWN3_COUNTER_LAYOUT_DESC="Choose how counter digits are aligned - horizontally (from left to right) or vertically (from top to bottom)"
+MOD_SMARTCOUNTDOWN3_COUNTER_LAYOUT_VERT="vertical"
+MOD_SMARTCOUNTDOWN3_COUNTER_LAYOUT_HORZ="horizontal"
+
+MOD_SMARTCOUNTDOWN3_EVENT_TEXT_POS_LABEL="Event Text Position"
+MOD_SMARTCOUNTDOWN3_EVENT_TEXT_POS_DESC="Choose where to display event description(s) - above/below the counter block or inline with the counter"
+MOD_SMARTCOUNTDOWN3_EVENT_TEXT_POS_VERT="above/below"
+MOD_SMARTCOUNTDOWN3_EVENT_TEXT_POS_HORZ="inline"
+
+MOD_SMARTCOUNTDOWN3_LABELS_POS_LABEL="Labels Position"
+MOD_SMARTCOUNTDOWN3_LABELS_POS_DESC="Choose labels position relative to digits"
+MOD_SMARTCOUNTDOWN3_LABELS_POS_RIGTH="right"
+MOD_SMARTCOUNTDOWN3_LABELS_POS_BOTTOM="bottom"
+MOD_SMARTCOUNTDOWN3_LABELS_POS_TOP="top"
+MOD_SMARTCOUNTDOWN3_LABELS_POS_LEFT="left"
+MOD_SMARTCOUNTDOWN3_LAYOUT_OVERRIDE_ALL_SCREENS_DESC="The settings below will be effective on all screens"
+
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_LABEL="Labels Vertical Alignment"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_DESC="Choose how labels are aligned with digits (for "_QQ_"right"_QQ_" or "_QQ_"left"_QQ_" labels positions only)
May not work as expected if digits size is not significantly larger than labels size"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_MIDDLE="middle"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_TOP="top"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_BOTTOM="bottom"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_HIGH="1/4 from top"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_LOW="1/4 from bottom"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_SUPERSCRIPT="superscript"
+MOD_SMARTCOUNTDOWN3_LABELS_VERT_ALIGN_SUBSCRIPT="subscript"
+
+MOD_SMARTCOUNTDOWN3_HIDE_HIGHEST_ZEROS_LABEL="Hide Zero Units"
+MOD_SMARTCOUNTDOWN3_HIDE_HIGHEST_ZEROS_DESC="Hide counter units (except seconds) if they display zero values"
+MOD_SMARTCOUNTDOWN3_HIDE_HIGHEST_ZEROS_HIGHEST="Highest zeros only"
+MOD_SMARTCOUNTDOWN3_HIDE_HIGHEST_ZEROS_ALL="All zeros"
+
+MOD_SMARTCOUNTDOWN3_ALLOW_ALL_ZEROS_LABEL="Allow All Zeros"
+MOD_SMARTCOUNTDOWN3_ALLOW_ALL_ZEROS_DESC="Allow the counter to display all zeros when time interval becomes less than the lowest time unit displayed"
+
+MOD_SMARTCOUNTDOWN3_DISABLE_RESPONSIVE_LABEL="Responsive Behavior"
+MOD_SMARTCOUNTDOWN3_DISABLE_RESPONSIVE_DESC="Disable responsive behavior"
+
+; Styles
+COM_MODULES_STYLES_FIELDSET_LABEL="Styles"
+MOD_SMARTCOUNTDOWN3_MODULE_STYLE_LABEL="Module Style(s)"
+MOD_SMARTCOUNTDOWN3_MODULE_STYLE_DESC="Additional style(s) applied to the module. Enter CSS rules separated and ended by "_QQ_";"_QQ_""
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_STYLE_LABEL="Text Before Style(s)"
+MOD_SMARTCOUNTDOWN3_TITLE_BEFORE_STYLE_DESC="Additional event text style(s). Enter CSS rules separated and ended by "_QQ_";"_QQ_""
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_STYLE_LABEL="Text After Style(s)"
+MOD_SMARTCOUNTDOWN3_TITLE_AFTER_STYLE_DESC="Additional event text style(s). Enter CSS rules separated and ended by "_QQ_";"_QQ_""
+MOD_SMARTCOUNTDOWN3_DIGITS_STYLE_LABEL="Digits Style(s)"
+MOD_SMARTCOUNTDOWN3_DIGITS_STYLE_DESC="Additional style(s) applied to counter digits. Not all styles will have effect for all animations. Enter CSS rules separated and ended by "_QQ_";"_QQ_""
+MOD_SMARTCOUNTDOWN3_LABELS_STYLE_LABEL="Labels Style(s)"
+MOD_SMARTCOUNTDOWN3_LABELS_STYLE_DESC="Additional labels style(s). Enter CSS rules separated and ended by "_QQ_";"_QQ_""
+
+; Redirection
+COM_MODULES_REDIRECTION_FIELDSET_LABEL="Automatic Redirection"
+MOD_SMARTCOUNTDOWN3_COUNTER_CLICKABLE_LABEL="Redirect on click"
+MOD_SMARTCOUNTDOWN3_COUNTER_CLICKABLE_DESC="Open redirection URL when the module is clicked"
+MOD_SMARTCOUNTDOWN3_COUNTER_CLICKABLE_NEVER="Disabled"
+MOD_SMARTCOUNTDOWN3_COUNTER_CLICKABLE_ALWAYS="Always"
+MOD_SMARTCOUNTDOWN3_COUNTER_CLICKABLE_COUNTDOWN="Only before event start"
+MOD_SMARTCOUNTDOWN3_COUNTER_CLICKABLE_COUNTUP="Only while event is in progress"
+MOD_SMARTCOUNTDOWN3_CONFIRM_REDIRECT_LABEL="Confirm Redirection"
+MOD_SMARTCOUNTDOWN3_CONFIRM_REDIRECT_DESC="Ask user permission to leave the page if non-empty forms are found on the page"
+MOD_SMARTCOUNTDOWN3_REDIRECT_CONTROL_LABEL="Redirect on countdown zero or module click (optional) - Select menu item or enter absolute URL. If absolute URL is set redirect menu item will be ignored."
+MOD_SMARTCOUNTDOWN3_EVENT_GOTO_MENU_LABEL="Menu Item"
+MOD_SMARTCOUNTDOWN3_EVENT_GOTO_MENU_DESC="Choose menu item for automatic redirection. Choose "_QQ_"Disabled"_QQ_" (default) to disable automatic redirection"
+MOD_SMARTCOUNTDOWN3_EVENT_GOTO_URL_LABEL="Absolute URL"
+MOD_SMARTCOUNTDOWN3_EVENT_GOTO_URL_DESC="Enter absolute URL for automatic redirection."
+
+; Time units
+MOD_SMARTCOUNTDOWN3_N_YEARS="Лет"
+MOD_SMARTCOUNTDOWN3_N_MONTHS="Месяцев"
+MOD_SMARTCOUNTDOWN3_N_WEEKS="Недель"
+MOD_SMARTCOUNTDOWN3_N_DAYS="Дней"
+MOD_SMARTCOUNTDOWN3_N_HOURS="Часов"
+MOD_SMARTCOUNTDOWN3_N_MINUTES="Минут"
+MOD_SMARTCOUNTDOWN3_N_SECONDS="Секунд"
+MOD_SMARTCOUNTDOWN3_N_YEARS_1="Год"
+MOD_SMARTCOUNTDOWN3_N_MONTHS_1="Месяц"
+MOD_SMARTCOUNTDOWN3_N_WEEKS_1="Неделя"
+MOD_SMARTCOUNTDOWN3_N_DAYS_1="День"
+MOD_SMARTCOUNTDOWN3_N_HOURS_1="Час"
+MOD_SMARTCOUNTDOWN3_N_MINUTES_1="Минута"
+MOD_SMARTCOUNTDOWN3_N_SECONDS_1="Секунда"
+MOD_SMARTCOUNTDOWN3_N_YEARS_2="Года"
+MOD_SMARTCOUNTDOWN3_N_MONTHS_2="Месяца"
+MOD_SMARTCOUNTDOWN3_N_WEEKS_2="Недели"
+MOD_SMARTCOUNTDOWN3_N_DAYS_2="Дня"
+MOD_SMARTCOUNTDOWN3_N_HOURS_2="Часа"
+MOD_SMARTCOUNTDOWN3_N_MINUTES_2="Минуты"
+MOD_SMARTCOUNTDOWN3_N_SECONDS_2="Секунды"
+
+; Misc frontend translations
+MOD_SMARTCOUNTDOWN3_REDIRECT_CONFIRM_HINT="Вы собираетесь покинуть эту страницу, данные веб-форм будут потеряны. Продолжить?"
diff --git a/deployed/smartcountdown3/modules/mod_smartcountdown3/layouts/auto.xml b/deployed/smartcountdown3/modules/mod_smartcountdown3/layouts/auto.xml
new file mode 100644
index 00000000..2f626afc
--- /dev/null
+++ b/deployed/smartcountdown3/modules/mod_smartcountdown3/layouts/auto.xml
@@ -0,0 +1,32 @@
+
+
+
+ 1
+ 2
+ 1
+ 2
+ 2
+ 2
+ 2
+
+ horz
+ vert
+ right
+ middle
+ 1
+ 0
+
+
+ vert
+ col
+
+
+ vert
+ row
+
+
+ horz
+ col
+
+
+
\ No newline at end of file
diff --git a/deployed/smartcountdown3/modules/mod_smartcountdown3/layouts/horizontal.xml b/deployed/smartcountdown3/modules/mod_smartcountdown3/layouts/horizontal.xml
new file mode 100644
index 00000000..2f626afc
--- /dev/null
+++ b/deployed/smartcountdown3/modules/mod_smartcountdown3/layouts/horizontal.xml
@@ -0,0 +1,32 @@
+
+
+
+ 1
+ 2
+ 1
+ 2
+ 2
+ 2
+ 2
+
+ horz
+ vert
+ right
+ middle
+ 1
+ 0
+
+
+ vert
+ col
+
+
+ vert
+ row
+
+
+ horz
+ col
+
+
+
\ No newline at end of file
diff --git a/deployed/smartcountdown3/modules/mod_smartcountdown3/layouts/horizontal_compact.xml b/deployed/smartcountdown3/modules/mod_smartcountdown3/layouts/horizontal_compact.xml
new file mode 100644
index 00000000..ad821f99
--- /dev/null
+++ b/deployed/smartcountdown3/modules/mod_smartcountdown3/layouts/horizontal_compact.xml
@@ -0,0 +1,28 @@
+
+
+
+ 1
+ 2
+ 1
+ 2
+ 2
+ 2
+ 2
+
+ horz
+ vert
+ bottom
+ middle
+ 1
+ 0
+
+
+ vert
+ col
+
+
+ vert
+ row
+
+
+
\ No newline at end of file
diff --git a/deployed/smartcountdown3/modules/mod_smartcountdown3/layouts/horizontal_compact_titles_inline.xml b/deployed/smartcountdown3/modules/mod_smartcountdown3/layouts/horizontal_compact_titles_inline.xml
new file mode 100644
index 00000000..84cd31a1
--- /dev/null
+++ b/deployed/smartcountdown3/modules/mod_smartcountdown3/layouts/horizontal_compact_titles_inline.xml
@@ -0,0 +1,30 @@
+
+
+
+ 1
+ 2
+ 1
+ 2
+ 2
+ 2
+ 2
+
+ horz
+ horz
+ bottom
+ middle
+ 1
+ 0
+
+
+ vert
+ col
+ vert
+
+
+ horz
+ col
+ vert
+
+
+
\ No newline at end of file
diff --git a/deployed/smartcountdown3/modules/mod_smartcountdown3/layouts/horizontal_compact_wrapping.xml b/deployed/smartcountdown3/modules/mod_smartcountdown3/layouts/horizontal_compact_wrapping.xml
new file mode 100644
index 00000000..b474c8ff
--- /dev/null
+++ b/deployed/smartcountdown3/modules/mod_smartcountdown3/layouts/horizontal_compact_wrapping.xml
@@ -0,0 +1,19 @@
+
+
+
+ 1
+ 2
+ 1
+ 2
+ 2
+ 2
+ 2
+
+ horz
+ vert
+ bottom
+ middle
+ 1
+ 0
+
+
\ No newline at end of file
diff --git a/deployed/smartcountdown3/modules/mod_smartcountdown3/layouts/horizontal_labels_left.xml b/deployed/smartcountdown3/modules/mod_smartcountdown3/layouts/horizontal_labels_left.xml
new file mode 100644
index 00000000..01dbb047
--- /dev/null
+++ b/deployed/smartcountdown3/modules/mod_smartcountdown3/layouts/horizontal_labels_left.xml
@@ -0,0 +1,32 @@
+
+
+
+ 1
+ 2
+ 1
+ 2
+ 2
+ 2
+ 2
+
+ horz
+ vert
+ left
+ middle
+ 1
+ 0
+
+
+ vert
+ col
+
+
+ vert
+ row
+
+
+ horz
+ col
+
+
+
\ No newline at end of file
diff --git a/deployed/smartcountdown3/modules/mod_smartcountdown3/layouts/index.html b/deployed/smartcountdown3/modules/mod_smartcountdown3/layouts/index.html
new file mode 100644
index 00000000..2efb97f3
--- /dev/null
+++ b/deployed/smartcountdown3/modules/mod_smartcountdown3/layouts/index.html
@@ -0,0 +1 @@
+
diff --git a/deployed/smartcountdown3/modules/mod_smartcountdown3/layouts/index.php b/deployed/smartcountdown3/modules/mod_smartcountdown3/layouts/index.php
new file mode 100644
index 00000000..62200328
--- /dev/null
+++ b/deployed/smartcountdown3/modules/mod_smartcountdown3/layouts/index.php
@@ -0,0 +1,2 @@
+
+
+
+ 1
+ 2
+ 1
+ 2
+ 2
+ 2
+ 2
+
+ vert
+ vert
+ right
+ middle
+ 1
+ 0
+
+
+ vert
+ col
+
+
+
\ No newline at end of file
diff --git a/deployed/smartcountdown3/modules/mod_smartcountdown3/layouts/vertical_compact.xml b/deployed/smartcountdown3/modules/mod_smartcountdown3/layouts/vertical_compact.xml
new file mode 100644
index 00000000..fece3b3c
--- /dev/null
+++ b/deployed/smartcountdown3/modules/mod_smartcountdown3/layouts/vertical_compact.xml
@@ -0,0 +1,19 @@
+
+
+
+ 1
+ 2
+ 1
+ 2
+ 2
+ 2
+ 2
+
+ vert
+ vert
+ bottom
+ middle
+ 1
+ 0
+
+
\ No newline at end of file
diff --git a/deployed/smartcountdown3/modules/mod_smartcountdown3/layouts/vertical_labels_left.xml b/deployed/smartcountdown3/modules/mod_smartcountdown3/layouts/vertical_labels_left.xml
new file mode 100644
index 00000000..dea3a313
--- /dev/null
+++ b/deployed/smartcountdown3/modules/mod_smartcountdown3/layouts/vertical_labels_left.xml
@@ -0,0 +1,24 @@
+
+
+
+ 1
+ 2
+ 1
+ 2
+ 2
+ 2
+ 1
+
+ vert
+ vert
+ left
+ middle
+ 1
+ 0
+
+
+ vert
+ col
+
+
+
\ No newline at end of file
diff --git a/deployed/smartcountdown3/modules/mod_smartcountdown3/mod_smartcountdown3.php b/deployed/smartcountdown3/modules/mod_smartcountdown3/mod_smartcountdown3.php
new file mode 100644
index 00000000..e5325fbe
--- /dev/null
+++ b/deployed/smartcountdown3/modules/mod_smartcountdown3/mod_smartcountdown3.php
@@ -0,0 +1,142 @@
+addScript( JURI::root( true ) . '/modules/mod_smartcountdown3/js/smartcountdown.js' );
+$document->addScript( JURI::root( true ) . '/modules/mod_smartcountdown3/js/vendor/velocity.min.js' );
+
+$lang = JFactory::getLanguage( 'site' );
+$tag = strtolower( $lang->getTag() );
+
+// Check if language-specific plural php file exists
+$file_name = 'plural_' . $tag . '.php';
+if ( file_exists( dirname( __FILE__ ) . '/helpers/plurals/' . $file_name ) ) {
+ // use language-specific file
+ include_once dirname( __FILE__ ) . '/helpers/plurals/' . $file_name;
+
+ $js_file_name = 'plural_' . $tag . '.js';
+} else {
+ // use default file (suitable for most languages)
+ include_once dirname( __FILE__ ) . '/helpers/plurals/plural.php';
+
+ $js_file_name = 'plural.js';
+}
+$document->addStyleSheet( JURI::root( true ) . '/modules/mod_smartcountdown3/css/smartcountdown.css' );
+if(JFactory::getLanguage()->get('rtl'))
+{
+ // add CSS overloads for RTL
+ $document->addStyleSheet( JURI::root( true ) . '/modules/mod_smartcountdown3/css/smartcountdown_rtl.css' );
+}
+
+// Add language strings to options (do not depend on Joomla.Jtext._())
+$js_label_strings = scdSetupTranslatedPlurals();
+
+// Add redirect confirmation hint
+JText::script('MOD_SMARTCOUNTDOWN3_REDIRECT_CONFIRM_HINT', true);
+
+$params->set( 'module_id', $module->id );
+$params->set( 'label_strings', $js_label_strings );
+
+// parse and expand params
+$params = modSmartCountdown3Helper::parseCounterOptions( $params );
+
+if ( $params === false ) {
+ JError::raiseError( 500, 'Invalid Smart Countdown 3 Configuration' );
+}
+
+// layout configuration - used in module template
+$params->set( 'layout_config', modSmartCountdown3Helper::getCounterLayout( $params ) );
+
+$moduleclass_sfx = htmlspecialchars( $params->get( 'moduleclass_sfx' ) );
+
+$options = $params->toArray();
+$module_id = $params->get( 'module_id', '' );
+
+/*
+ * We need the tricky code below to load smartcoutndown-related scripts and style on
+ * cached pages and in a specific scenario (at least):
+ * Conditions:
+ * 1. smartcountdown module is embedded into an article on front page
+ * 2. open another page, embedded countdown is not rendered (because the article isn't there),
+ * but smartcountdown scripts are not loaded when the page is loaded from cache.
+ * At the moment we have no explanation for this issue, might be desired behavior, but for this
+ * application we have to load scripts on the fly if they are not found on the page.
+ */
+$document->addScriptDeclaration( '
+ jQuery(document).ready(function() {
+
+ // A weird bug: this code is multiply duplicated in caching mode!!!
+ // this is a dirty workaround...
+ if(window["scd_init_called_' . $module_id . '"] === true) {
+ return;
+ }
+ window["scd_init_called_' . $module_id . '"] = true;
+
+ // Another issue. See description above.
+ if(typeof scds_container === "undefined") {
+ // only load scripts once
+ if(!window["scd_waiting_for_scripts"]) {
+ var script;
+ script = document.createElement("script");
+ script.setAttribute("src","' . JUri::root( true ) . '/modules/mod_smartcountdown3/js/smartcountdown.js");
+ script.setAttribute("async", false);
+ document.head.appendChild(script);
+
+ script = document.createElement("script");
+ script.setAttribute("src","' . JUri::root( true ) . '/modules/mod_smartcountdown3/js/vendor/jquery-ui-easing.min.js");
+ script.setAttribute("async", false);
+ document.head.appendChild(script);
+
+ script = document.createElement("script");
+ script.setAttribute("src","' . JUri::root( true ) . '/modules/mod_smartcountdown3/helpers/plurals/' . $js_file_name . '");
+ script.setAttribute("async", false);
+ document.head.appendChild(script);
+
+ jQuery("")
+ .appendTo("head")
+ .attr({type : "text/css", rel : "stylesheet"})
+ .attr("href", "' . JUri::root( true ) . '/modules/mod_smartcountdown3/css/smartcountdown.css");
+
+ window["scd_waiting_for_scripts"] = true;
+ }
+ // each module instance must wait until the scripts are loaded before it can call
+ // scds_container.add(). Although we explicitely set synced load and most likely
+ // the scripts will be already loaded when we get to this point, we still use
+ // timer loop here. Should work with async script loading also.
+ window["scd_waiting_for_scripts_' . $module_id . '"] = window.setInterval(function() {
+ if(typeof scds_container !== "undefined") {
+ window.clearInterval(window["scd_waiting_for_scripts_' . $module_id . '"]);
+ delete(window["scd_waiting_for_scripts_' . $module_id . '"]);
+ scds_add_instance_' . $module_id . '();
+ delete(window["scd_waiting_for_scripts"]);
+ }
+ }, 100);
+ } else {
+ scds_add_instance_' . $module_id . '();
+ }
+ // use this helper function to inject json-encoded options only once on the page.
+ function scds_add_instance_' . $module_id . '() {
+ scds_container.add(' . json_encode( $options ) . ');
+ }
+ });
+' );
+// at the moment we only support default layout
+if ( !empty( $is_admin_preview ) ) {
+ require JPATH_SITE . '/modules/mod_smartcountdown3/tmpl/default.php';
+} else {
+ require JModuleHelper::getLayoutPath( 'mod_smartcountdown3', 'default' );
+}
+
+
diff --git a/deployed/smartcountdown3/modules/mod_smartcountdown3/mod_smartcountdown3.xml b/deployed/smartcountdown3/modules/mod_smartcountdown3/mod_smartcountdown3.xml
new file mode 100644
index 00000000..3065989a
--- /dev/null
+++ b/deployed/smartcountdown3/modules/mod_smartcountdown3/mod_smartcountdown3.xml
@@ -0,0 +1,283 @@
+
+
+ MOD_SMARTCOUNTDOWN3
+ Alex Polonski
+ 2012 - 2015
+ Copyright (c)2012 Alex Polonski
+ GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
+ alex3493@yandex.ru
+ smartcalc.es
+ 3.4.7
+ MOD_SMARTCOUNTDOWN3_XML_DESCRIPTION
+
+ mod_smartcountdown3.php
+ tmpl
+ helpers
+ fields
+ css
+ fx
+ images
+ js
+ language
+ layouts
+ index.html
+ mod_smartcountdown3.xml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ http://smartcalc.org/updates/mod-smartcountdown3-update.xml
+
+
diff --git a/deployed/smartcountdown3/modules/mod_smartcountdown3/tmpl/default.php b/deployed/smartcountdown3/modules/mod_smartcountdown3/tmpl/default.php
new file mode 100644
index 00000000..d9bd5c96
--- /dev/null
+++ b/deployed/smartcountdown3/modules/mod_smartcountdown3/tmpl/default.php
@@ -0,0 +1,50 @@
+get('layout_config', array());
+
+$module_DOM_id = $options['id'];
+
+// Add dynamic styles for units spacing. We use module ID to apply styles to correct module
+// instance if there are various counters on the same page.
+$margin_horz = $layout['units_spacing_horz'] != '' ? $layout['units_spacing_horz'] : '0 0.8em';
+$margin_vert = $layout['units_spacing_vert'] != '' ? $layout['units_spacing_vert'] : '0.5em 0';
+$margin_styles = "
+ #{$module_DOM_id} .scd-unit-horz {
+ margin: {$margin_horz};
+ }
+ #{$module_DOM_id} .scd-unit-vert {
+ margin: {$margin_vert};
+ }
+";
+JFactory::getDocument()->addStyleDeclaration($margin_styles);
+?>
+
+
+
>
+
>
+
+
+
>
+
+
>
+
>
+
+
>
+
>
+
+
+
+
+
>
+
+
+
\ No newline at end of file
diff --git a/deployed/smartcountdown3/modules/mod_smartcountdown3/tmpl/index.html b/deployed/smartcountdown3/modules/mod_smartcountdown3/tmpl/index.html
new file mode 100644
index 00000000..2efb97f3
--- /dev/null
+++ b/deployed/smartcountdown3/modules/mod_smartcountdown3/tmpl/index.html
@@ -0,0 +1 @@
+