First
| @@ -1,2 +1,5 @@ | ||||
| # schedule | ||||
|  | ||||
| DokuWiki Extensions : https://www.dokuwiki.org/plugin:schedule | ||||
|  | ||||
| Event management for multi-organization. | ||||
|   | ||||
							
								
								
									
										29
									
								
								action.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,29 @@ | ||||
| <?php | ||||
| /** | ||||
|  * @license    http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.html | ||||
|  * @author     Francois Merciol <dokuplugin@merciol.fr> | ||||
|  * | ||||
|  * Plugin Schedule: manage events per wiki @groups | ||||
|  */ | ||||
|   | ||||
| if (!defined ('DOKU_INC')) | ||||
|   die (); | ||||
| if (!defined ('DOKU_PLUGIN')) | ||||
|   define ('DOKU_PLUGIN', DOKU_INC.'lib/plugins/'); | ||||
| require_once (DOKU_PLUGIN.'action.php'); | ||||
|  | ||||
| class action_plugin_schedule extends DokuWiki_Action_Plugin { | ||||
|   | ||||
|     // ============================================================ | ||||
|     function register (Doku_Event_Handler $controller) { | ||||
|         $controller->register_hook ('DOKUWIKI_STARTED', 'AFTER',  $this, '_defconf'); | ||||
|     } | ||||
|     function _defconf (&$event, $param) { | ||||
|         global $JSINFO; | ||||
|         $JSINFO ['schedule']['useMap'] = $this->getConf ('useMap'); | ||||
|         $JSINFO ['schedule']['defaultCenter'] = json_decode ($this->getConf ('defaultCenter'), true); | ||||
|         $JSINFO ['schedule']['defaultZoom'] = json_decode ($this->getConf ('defaultZoom'), true); | ||||
|     } | ||||
|  | ||||
|     // ============================================================ | ||||
| } | ||||
							
								
								
									
										57
									
								
								ajax.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,57 @@ | ||||
| <?php | ||||
| /** | ||||
|  * @license    http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.html | ||||
|  * @author     Francois Merciol <dokuplugin@merciol.fr> | ||||
|  * | ||||
|  * Plugin Schedule: manage events per wiki @groups | ||||
|  | ||||
|  $df_ : 31/12/2000 | ||||
|  $ds_ : 20001231 | ||||
|  $dn_ : 978217200 | ||||
|  $dt_ : array ("Y" => 2000, "m" => 12, "d" => "31) | ||||
| */ | ||||
|  | ||||
| if (!defined ('DOKU_INC')) | ||||
|     define ('DOKU_INC', realpath (dirname (__FILE__).'/../../../').'/'); | ||||
| global $conf; | ||||
| require_once (DOKU_INC.'inc/init.php'); | ||||
| if (!$conf['lang']) | ||||
|     $conf['lang'] = 'fr'; | ||||
| require_once (DOKU_INC.'inc/common.php'); | ||||
| require_once (DOKU_INC.'inc/auth.php'); | ||||
|  | ||||
| // ============================================================ | ||||
| if (isset ($_SERVER['REMOTE_USER'])) | ||||
|     $INFO['userinfo'] = $auth->getUserData ($auth->cleanUser ($_SERVER['REMOTE_USER'])); | ||||
| $schdplug =& plugin_load ('syntax', 'schedule_block'); | ||||
| $scheduleRoot = new scheduleRoot ($schdplug); | ||||
| ob_start (); | ||||
| switch ($_REQUEST ['schd']['action']) { | ||||
|     // schedule Table  | ||||
| case 'changeDate': | ||||
|     global $conf; | ||||
|     $dn_showDay = mktime (0, 0, 0, date ("n"), date ("j"), date("Y")); | ||||
|     $ds_showDay = trim ($scheduleRoot->df2ds ($_REQUEST['schd']['date'])); | ||||
|     if (preg_match ("#(?<Y>[0-9][0-9][0-9][0-9])(?<m>[0-9][0-9])(?<d>[0-9][0-9])#", $ds_showDay, $dt_showDay)) | ||||
|         $dn_showDay = mktime (0, 0, 0, $dt_showDay["m"], $dt_showDay["d"], $dt_showDay["Y"]); | ||||
|     $schedules = new schedules ($scheduleRoot, $_REQUEST['schd']['ns']); | ||||
|     $schedules->load (); | ||||
|     $schedules->printScheduleCalendar ($_REQUEST['schd']['mapId'], $dn_showDay); | ||||
|     break; | ||||
|  | ||||
|     // schedule Root Admin | ||||
| case 'moveSchedules': | ||||
|     $scheduleRoot->manageAction ($_REQUEST['schd']); | ||||
|     $scheduleRoot->printForm (); | ||||
|     break; | ||||
|  | ||||
| default : | ||||
|     ptnl ('No Ajax Function !'); | ||||
| } | ||||
| $text = ob_get_contents (); | ||||
| ob_end_clean (); | ||||
| foreach ($scheduleRoot->message as $type => $msg) | ||||
|     $text = '<div class="'.$type.'">'.$msg.'</div>'.$text; | ||||
| ptln ($text); | ||||
|  | ||||
| // ============================================================ | ||||
							
								
								
									
										32
									
								
								ajaxClearCache.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,32 @@ | ||||
| <?php | ||||
| /** | ||||
|  * @license    http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.html | ||||
|  * @author     Francois Merciol <dokuplugin@merciol.fr> | ||||
|  * | ||||
|  * Plugin Schedule: manage events per wiki @groups | ||||
|  | ||||
|  */ | ||||
|  | ||||
| if (!defined ('DOKU_INC')) | ||||
|     define ('DOKU_INC', realpath (dirname (__FILE__).'/../../../').'/'); | ||||
| require_once (DOKU_INC.'inc/init.php'); | ||||
| require_once (DOKU_INC.'inc/common.php'); | ||||
| require_once (DOKU_INC.'inc/auth.php'); | ||||
|  | ||||
| // ============================================================ | ||||
| if (isset ($_SERVER['REMOTE_USER'])) | ||||
|     $INFO['userinfo'] = $auth->getUserData ($auth->cleanUser ($_SERVER['REMOTE_USER'])); | ||||
| $schdplug =& plugin_load ('syntax', 'schedule_block'); | ||||
| $scheduleRoot = new scheduleRoot ($schdplug); | ||||
|  | ||||
| switch ($_REQUEST ['schedule']['action']) { | ||||
| case 'clear': | ||||
|     $schedules = new schedules ($scheduleRoot, $_REQUEST ['schedule']['ns']); | ||||
|     $schedules->clearCache (); | ||||
|     break; | ||||
| case 'clearAll': | ||||
|     $scheduleRoot->clearCache (); | ||||
|     break; | ||||
| } | ||||
|  | ||||
| // ============================================================ | ||||
							
								
								
									
										45
									
								
								ajaxPOI.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,45 @@ | ||||
| <?php | ||||
| /** | ||||
|  * @license    http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.html | ||||
|  * @author     Francois Merciol <dokuplugin@merciol.fr> | ||||
|  * | ||||
|  * Plugin Schedule: manage events per wiki @groups | ||||
|  | ||||
|  */ | ||||
|  | ||||
| // faire un XML | ||||
|  | ||||
| if (!defined ('DOKU_INC')) | ||||
|     define ('DOKU_INC', realpath (dirname (__FILE__).'/../../../').'/'); | ||||
| require_once (DOKU_INC.'inc/init.php'); | ||||
| require_once (DOKU_INC.'inc/common.php'); | ||||
| require_once (DOKU_INC.'inc/auth.php'); | ||||
| require_once (realpath (dirname (__FILE__)).'/poiDB.class.php'); | ||||
|  | ||||
| // ============================================================ | ||||
| if (isset ($_SERVER['REMOTE_USER'])) | ||||
|     $INFO['userinfo'] = $auth->getUserData ($auth->cleanUser ($_SERVER['REMOTE_USER'])); | ||||
| $schdplug =& plugin_load ('syntax', 'schedule_block'); | ||||
| $isAdmin = | ||||
|          isset ($INFO ['userinfo']) && | ||||
|          isset ($INFO ['userinfo']['grps']) && | ||||
|          in_array (trim ($schdplug->getConf ('adminGroup')), $INFO ['userinfo']['grps']); | ||||
|  | ||||
| $poiDB = new poiDB ($schdplug); | ||||
| if ('list' == $_REQUEST ['action']) | ||||
|     echo json_encode ($poiDB->getInsee ($_REQUEST['insee'])); | ||||
| elseif ($isAdmin) { | ||||
|     switch ($_REQUEST ['action']) { | ||||
|     case 'add': | ||||
|         $poiDB->addLine ($_REQUEST ['line']); | ||||
|         break; | ||||
|     case 'remove': | ||||
|         $poiDB->removeLine ($_REQUEST ['line']); | ||||
|         break; | ||||
|     default: | ||||
|         die ('No Ajax Function !'); | ||||
|     } | ||||
| } else | ||||
|       die ("No Ajax Function !"); | ||||
|  | ||||
| // ============================================================ | ||||
							
								
								
									
										27
									
								
								conf/default.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,27 @@ | ||||
| <?php | ||||
| /** | ||||
|  * @license    http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.html | ||||
|  * @author     Francois Merciol <dokuplugin@merciol.fr> | ||||
|  * | ||||
|  * Options for the Schedule Plugin | ||||
|  */ | ||||
| $conf['scheduleGroup']    = 'schedule'; | ||||
| $conf['adminGroup']       = 'admin'; | ||||
| $conf['dataDir']          = 'schedule'; | ||||
| $conf['groupsDir']        = 'membres'; | ||||
| $conf['noSchedule']       = '2010'; | ||||
| $conf['scheduleDir']      = 'agenda'; | ||||
| $conf['sharedDir']        = 'commun'; | ||||
| $conf['scheduleWhat']     = 'A:Manifestation, Vote, Pétition, Action|B:Echange, Forum, Débat, Conférence, Projection, Exposition, Spectacle, Radio, TV, Pique-Nique|C:Assemblée Générale, Réunion, Mensuelle, Hebdomadaire'; | ||||
| $conf['scheduleAudience'] = 'Ouvert à tous, Membres, Commission, Bureau'; | ||||
| $conf['iconName']         = 'logo.png'; | ||||
| $conf['iconWidth']        = 30; | ||||
| $conf['repeatPosition']   = 'isolated'; | ||||
| $conf['bubblePosition']   = 'right'; | ||||
|  | ||||
| $conf['useMap']        	  = 1; | ||||
| $conf['defaultCenter']    = "[47.95583, -2.54833]"; | ||||
| $conf['defaultZoom']      = 14; | ||||
| $conf['migrate']          = 0; | ||||
| $conf['showOldValues']    = 0; | ||||
| ?> | ||||
							
								
								
									
										28
									
								
								conf/metadata.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,28 @@ | ||||
| <?php | ||||
| /** | ||||
|  * @license    http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.html | ||||
|  * @author     Francois Merciol <dokuplugin@merciol.fr> | ||||
|  * | ||||
|  * Metadata for configuration manager plugin | ||||
|  * Additions for the schedule plugin | ||||
|  */ | ||||
| $meta['scheduleGroup']    = array('string');	// who can use form | ||||
| $meta['adminGroup']       = array('string');	// who can admin data | ||||
| $meta['dataDir']          = array('string');	// root dir for XML files | ||||
| $meta['groupsDir']        = array('string');	// dir group in wiki pages to find group names | ||||
| $meta['noSchedule']       = array('string');	// forbiden name for group (ex skip annual archive dir) | ||||
| $meta['scheduleDir']      = array('string');	// dir in wiki pages for events (contains subdir for group name or the shared dir) | ||||
| $meta['sharedDir']        = array('string');	// dir for shared event in wiki pages | ||||
| $meta['scheduleWhat']     = array('string');	// type event list | ||||
| $meta['scheduleAudience'] = array('string');	// type audience list | ||||
| $meta['iconName']         = array('string');	// file name containing logo in group dir  | ||||
| $meta['iconWidth']        = array('numeric');	// default logo width size | ||||
| $meta['repeatPosition']   = array('multichoice', '_choices' => array('grouped', 'isolated'));	// does the repeated events are group on top of form | ||||
| $meta['bubblePosition']   = array('multichoice', '_choices' => array('left', 'right'));			// tooltips position | ||||
|  | ||||
| $meta['useMap']        	  = array('onoff'); | ||||
| $meta['defaultCenter']    = array('string'); | ||||
| $meta['defaultZoom']      = array('numeric'); | ||||
| $meta['migrate']          = array('onoff');		// XXX to remove ? | ||||
| $meta['showOldValues']    = array('onoff');		// XXX to remove ? | ||||
| ?> | ||||
							
								
								
									
										
											BIN
										
									
								
								images/bul_a.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1014 B | 
							
								
								
									
										
											BIN
										
									
								
								images/bul_b.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								images/bul_c.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								images/calendar.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 549 B | 
							
								
								
									
										
											BIN
										
									
								
								images/cat_a.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 159 B | 
							
								
								
									
										
											BIN
										
									
								
								images/cat_ab.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 169 B | 
							
								
								
									
										
											BIN
										
									
								
								images/cat_abc.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 181 B | 
							
								
								
									
										
											BIN
										
									
								
								images/cat_ac.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 169 B | 
							
								
								
									
										
											BIN
										
									
								
								images/cat_b.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 159 B | 
							
								
								
									
										
											BIN
										
									
								
								images/cat_bc.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 169 B | 
							
								
								
									
										
											BIN
										
									
								
								images/cat_c.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 159 B | 
							
								
								
									
										
											BIN
										
									
								
								images/edit.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 668 B | 
							
								
								
									
										
											BIN
										
									
								
								images/empty.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 166 B | 
							
								
								
									
										
											BIN
										
									
								
								images/orange.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								images/poi.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.2 KiB | 
							
								
								
									
										
											BIN
										
									
								
								images/poiRed.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 6.3 KiB | 
							
								
								
									
										
											BIN
										
									
								
								images/red.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1014 B | 
							
								
								
									
										
											BIN
										
									
								
								images/repeat.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1003 B | 
							
								
								
									
										
											BIN
										
									
								
								images/warning.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 514 B | 
							
								
								
									
										
											BIN
										
									
								
								images/wizard.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 797 B | 
							
								
								
									
										121
									
								
								lang/en/lang.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,121 @@ | ||||
| <?php | ||||
| /** | ||||
|  * @license    http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.html | ||||
|  * @author     Francois Merciol <dokuplugin@merciol.fr> | ||||
|  * | ||||
|  * English language file | ||||
|  */ | ||||
|  | ||||
| // javascript | ||||
| $lang['js']			= | ||||
|     array ('pleaseWait' => 'Connection to the server in progress ...'); | ||||
|  | ||||
| // commands | ||||
| $lang['Valid']			= 'Valid'; | ||||
| $lang['add']			= 'Add'; | ||||
| $lang['clear']			= 'Clear cache'; | ||||
| $lang['clearAll']		= 'Clear all cache'; | ||||
| $lang['clearCache']		= 'Clear cache';	// XXX | ||||
| $lang['created']		= 'Created'; | ||||
| $lang['modify']			= 'Modify'; | ||||
| $lang['modifyAll']		= 'Modify All'; | ||||
| $lang['prop']			= 'Suggest'; | ||||
| $lang['remove']			= 'Remove'; | ||||
| $lang['selected']		= 'Selected'; | ||||
| $lang['show']			= 'Show'; | ||||
| $lang['test']			= 'Test'; | ||||
|  | ||||
| $lang['repeatType']		= array ('day' => 'days', 'week' => 'weeks', 'dayMonth' => 'months', 'dateMonth' => 'months', 'year' => 'years'); | ||||
|  | ||||
| // placeholder | ||||
| $lang['titlePH']		= 'event title'; | ||||
| $lang['leadPH']			= 'Lead paragraph / organisation team / context / ... (optional)'; | ||||
| $lang['posterPH']		= 'http://... (optional)'; | ||||
| $lang['paperPH']		= 'http://... (optional)'; | ||||
| $lang['remarkPH']		= 'explanation / comments / remarks / ... (optional)'; | ||||
| $lang['ratePH']			= 'x € / y € (optional)'; | ||||
| $lang['cityPH']			= 'city (or INSEE code) +!!enter!!'; | ||||
| $lang['addrPH']			= '1, rue de la Tannerie ~br~ 56 000 +!!enter!!'; | ||||
| $lang['datePH']			= 'mm/dd/aa'; | ||||
| $lang['hourPH']			= '--h-- (ex: 09h30-15h)'; | ||||
| $lang['rootMoveDatePH']		= 'mm/dd/aa (move until this date)'; | ||||
|  | ||||
| // messages | ||||
| $lang['days']			= array ('sunday' => 'S', 'monday' => 'M', 'tuesday' => 'T', 'wednesday' => 'W', 'friday' => 'F', 'thursday' => 'T', 'saturday' => 'S'); | ||||
| $lang['enterTip']		= 'Press \'enter\' to update this field!'; | ||||
|  | ||||
| $lang['who']			= 'Who'; | ||||
| $lang['audience']		= 'Audience'; | ||||
| $lang['shared']			= array ('', 'Shared'); | ||||
| $lang['proposedBy']		= 'Proposed by'; | ||||
| $lang['what']			= 'What'; | ||||
| $lang['title']			= 'Title'; | ||||
| $lang['lead']			= 'Lead paragraph'; | ||||
| $lang['posterURL']		= 'Poster'; | ||||
| $lang['paperURL']		= 'Paper'; | ||||
| $lang['remark']			= 'Topic'; | ||||
| $lang['rate']			= 'Rate'; | ||||
| $lang['where']			= 'Where'; | ||||
| $lang['city']			= 'Commune'; | ||||
| $lang['addresse']		= 'Addresse'; | ||||
| $lang['when']			= 'When'; | ||||
| $lang['allDates']		= 'All dates'; | ||||
| $lang['inverted']		= 'Inverted'; | ||||
| $lang['noEvent']		= 'No event'; | ||||
| $lang['validation']		= 'Validation'; | ||||
| $lang['proposition']	= 'Proposition'; | ||||
| $lang['reactiveMap']	= 'Interactive map!'; | ||||
| $lang['toComplet']      = 'To complete'; | ||||
|  | ||||
| $lang['audienceChoice']		= 'For whom ?'; | ||||
| $lang['memberChoice']		= 'Proposed by ?'; | ||||
| $lang['eventTypeChoice']	= 'What kind of event ?'; | ||||
|  | ||||
| $lang['from']			= 'from'; | ||||
| $lang['to']			= 'to'; | ||||
| $lang['fromHour']		= 'from'; | ||||
| $lang['toHour']			= 'to'; | ||||
| $lang['at']			= 'at'; | ||||
| $lang['all']			= 'all'; | ||||
| $lang['each']			= 'each'; | ||||
|  | ||||
| $lang['startError']		= "Validation couldn't be performed because:"; | ||||
| $lang['noAudienceError']	= 'audience miss'; | ||||
| $lang['noMemberError']		= 'member miss'; | ||||
| $lang['noTypeError']		= 'event type miss'; | ||||
| $lang['noWhereError']		= 'place miss'; | ||||
| $lang['noTitleError']		= 'title miss'; | ||||
| $lang['mktimeError']		= 'unsupported date (OVH server limitation is : 13 decembre 1901 < YYYY-mm-dd < 20 janvier 2038)'; | ||||
| $lang['pastError']		= 'date out of bounds'; | ||||
| $lang['pastToError']		= 'end date before start :-D'; | ||||
| $lang['badDateError']		= 'inappropriate date'; | ||||
| $lang['notMemberError']		= 'not member'; | ||||
|  | ||||
| $lang['addEvent']		= 'Add an event'; | ||||
| $lang['proposedEvent']		= 'Suggest an event'; | ||||
|  | ||||
| $lang['propSuccess']		= "Votre proposition est enregistrée. Nous allons vérifier qu'elle est conforme à l'esprit du FSL avant de la mettre en ligne. Merci de votre contributon."; | ||||
|  | ||||
| $lang['notifySubject']		= '[Schedule] New proposal !'; | ||||
| $lang['notifyContent']		= "A new proposal is done.\n\n"; | ||||
|  | ||||
| // toolTip | ||||
| $lang['tipPrevM']		= 'Previous mounth'; | ||||
| $lang['tipNextM']		= 'Next mounth'; | ||||
|  | ||||
| // format | ||||
| $lang['dateFormat']		= 'mdY'; | ||||
| // $lang['orderedFormat']	= function ($num) { // XXX pb OVH | ||||
| //   if ($num < 1) | ||||
| //     return $num; | ||||
| //   switch ($num) { | ||||
| //   case 1: | ||||
| //     return '1st'; | ||||
| //   default: | ||||
| //     return "{$num}th"; | ||||
| //   } | ||||
| // }; | ||||
|  | ||||
| $lang['orderedFormat']		= array (1 => '1st', 2 => '2th', 3 => '3th', 4 => '4th', 5 => '5th', 6 => '6th', 7 => '7th', 8 => '8th', 9 => '9th', 10 => '10th', 11 => '11th', 12 => '12th', 13 => '13th', 14 => '14th', 15 => '15th', 16 => '16th', 17 => '17th', 18 => '18th', 19 => '19th', 20 => '20th', 21 => '21th', 22 => '22th', 23 => '23th', 24 => '24th', 25 => '25th', 26 => '26th', 27 => '27th', 28 => '28th', 29 => '29th', 30 => '30th', 31 => '31th'); | ||||
|  | ||||
| ?> | ||||
							
								
								
									
										29
									
								
								lang/en/settings.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,29 @@ | ||||
| <?php | ||||
| /** | ||||
|  * @license    http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.html | ||||
|  * @author     Francois Merciol <dokuplugin@merciol.fr> | ||||
|  * | ||||
|  * English language file | ||||
|  */ | ||||
|   | ||||
| // for the configuration manager | ||||
| $lang['scheduleGroup']    = 'in this group one can add event'; | ||||
| $lang['adminGroup']       = 'admin group with all rights on events'; | ||||
| $lang['dataDir']          = 'directory contains XML file per group'; | ||||
| $lang['groupsDir']        = 'directory where group names could be find'; | ||||
| $lang['noSchedule']       = 'forbiden group names'; | ||||
| $lang['scheduleDir']      = 'wiki page for schedule (contains one dir per group)'; | ||||
| $lang['sharedDir']        = 'directory for shared events'; | ||||
| $lang['scheduleWhat']     = 'type of events per categrory (c1:w1,w2|c2:w3,w4|c3:w5,w6,w7)'; | ||||
| $lang['scheduleAudience'] = 'type of public'; | ||||
| $lang['iconName']         = 'logo name of the group which define an event (a1,a2,a3)'; | ||||
| $lang['iconWidth']        = 'logo width of the group which define an event'; | ||||
| $lang['repeatPosition']   = 'Repeat event position (grouped on top or isolated)'; | ||||
| $lang['bubblePosition']   = 'tooltips position of calendar'; | ||||
|  | ||||
| $lang['useMap']        	  = 'Display map'; | ||||
| $lang['defaultCenter']    = "Empty map default localization (lat, lon)"; | ||||
| $lang['defaultZoom']      = "Default zoom"; | ||||
| $lang['migrate']          = 'Performe data migration'; | ||||
| $lang['showOldValues']	  = 'Highlight non migrate data'; | ||||
| ?> | ||||
							
								
								
									
										121
									
								
								lang/fr/lang.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,121 @@ | ||||
| <?php | ||||
| /** | ||||
|  * @license    http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.html | ||||
|  * @author     Francois Merciol <dokuplugin@merciol.fr> | ||||
|  * | ||||
|  * French language file | ||||
|  */ | ||||
|  | ||||
| // javascript | ||||
| $lang['js']			= | ||||
|     array ('pleaseWait' => 'Connexion avec le serveur en cours ...'); | ||||
|  | ||||
| // commands | ||||
| $lang['add']			= 'Ajouter'; | ||||
| $lang['clear']			= 'Effacer le cache'; | ||||
| $lang['clearAll']		= 'Effacer tout les caches'; | ||||
| $lang['clearCache']		= 'Effacer le cache';	// XXX | ||||
| $lang['created']		= 'Créer'; | ||||
| $lang['modify']			= 'Modifier'; | ||||
| $lang['modifyAll']		= 'Modifier Tout'; | ||||
| $lang['prop']			= 'Proposer'; | ||||
| $lang['remove']			= 'Supprimer'; | ||||
| $lang['selected']		= 'Selectionner'; | ||||
| $lang['show']			= 'Montrer'; | ||||
| $lang['test']			= 'Tester'; | ||||
| $lang['valid']			= 'Valider'; | ||||
|  | ||||
| $lang['repeatType']		= array ('day' => 'jour', 'week' => 'semaine', 'dayMonth' => 'mois', 'dateMonth' => 'mois', 'year' => 'ans'); | ||||
|  | ||||
| // placeholder | ||||
| $lang['titlePH']		= "titre de l'évènement"; | ||||
| $lang['leadPH']			= 'Chapeau éditorial / organisateur / contexte / ... (facultatif)'; | ||||
| $lang['posterPH']		= 'http://... (facultatif)'; | ||||
| $lang['paperPH']		= 'http://... (facultatif)'; | ||||
| $lang['remarkPH']		= 'texte explicatif / commentaires / remarques / ... (facultatif)'; | ||||
| $lang['ratePH']			= 'x € / y € (facultatif)'; | ||||
| $lang['cityPH']			= 'commune (ou code INSEE) +!!entrée!!'; | ||||
| $lang['addrPH']			= '1, rue de la Tannerie ~br~ 56 000 +!!entrée!!'; | ||||
| $lang['datePH']			= 'jj/mm/aa'; | ||||
| $lang['hourPH']			= '--h-- (ex: 09h30-15h)'; | ||||
| $lang['rootMoveDatePH']		= "jj/mm/aa (déplace jusqu'à cette date)"; | ||||
|  | ||||
| // messages | ||||
| $lang['days']			= array ('dimanche' => 'D', 'lundi' => 'L', 'mardi' => 'M', 'mercredi' => 'M', 'jeudi' => 'J', 'vendredi' => 'V', 'samedi' => 'S'); | ||||
| $lang['enterTip']		= 'Appuyez sur \'entrée\' pour mettre à jour ce champ !'; | ||||
|  | ||||
| $lang['who']			= 'Qui'; | ||||
| $lang['audience']		= 'Auditoire'; | ||||
| $lang['shared']			= array ('', 'Partagé'); | ||||
| $lang['proposedBy']		= 'Proposé par'; | ||||
| $lang['what']			= 'Quoi'; | ||||
| $lang['title']			= 'Titre '; | ||||
| $lang['lead']			= 'Chapeau éditorial '; | ||||
| $lang['posterURL']		= 'Affiche '; | ||||
| $lang['paperURL']		= 'Article '; | ||||
| $lang['remark']			= 'Sujet '; | ||||
| $lang['rate']			= 'Tarif '; | ||||
| $lang['where']			= 'Où '; | ||||
| $lang['city']			= 'Commune '; | ||||
| $lang['addresse']		= 'Adresse '; | ||||
| $lang['when']			= 'Quand '; | ||||
| $lang['allDates']		= 'Toutes dates'; | ||||
| $lang['inverted']		= 'Inverser'; | ||||
| $lang['noEvent']		= "Pas d'évènement"; | ||||
| $lang['validation']		= 'Validation'; | ||||
| $lang['proposition']	= 'Proposition'; | ||||
| $lang['reactiveMap']	= 'Carte interactive !'; | ||||
| $lang['toComplet']      = 'À compléter'; | ||||
|  | ||||
| $lang['audienceChoice']		= 'Quelle audience ?'; | ||||
| $lang['memberChoice']		= 'Proposé par ?'; | ||||
| $lang['eventTypeChoice']	= "Quelle nature d'évènement ?"; | ||||
|  | ||||
| $lang['from']			= 'du'; | ||||
| $lang['to']			= 'au'; | ||||
| $lang['fromHour']		= 'de'; | ||||
| $lang['toHour']			= 'à'; | ||||
| $lang['at']			= 'à'; | ||||
| $lang['all']			= 'chaque'; | ||||
| $lang['each']			= 'chaque'; | ||||
|  | ||||
| $lang['startError']		= 'Certaines informations ne permettent pas la validation :'; | ||||
| $lang['noAudienceError']	= "manque d'auditoire"; | ||||
| $lang['noMemberError']		= 'manque de membre'; | ||||
| $lang['noTypeError']		= "manque de nature d'évènement"; | ||||
| $lang['noWhereError']		= 'manque de lieu'; | ||||
| $lang['noTitleError']		= 'manque de titre'; | ||||
| $lang['mktimeError']		= 'date non gérée (pour OVH : 13 decembre 1901 < YYYY-mm-dd < 20 janvier 2038)'; | ||||
| $lang['pastError']		= 'début en dehors des limites indiquées'; | ||||
| $lang['pastToError']		= 'date de fin avant le début :-D'; | ||||
| $lang['badDateError']		= 'date incorrecte'; | ||||
| $lang['notMemberError']		= 'non membre'; | ||||
|  | ||||
| $lang['addEvent']		= 'Ajouter un évènement'; | ||||
| $lang['proposedEvent']		= 'Proposer un évènement'; | ||||
|  | ||||
| $lang['propSuccess']		= "Votre proposition est enregistrée. Nous allons vérifier qu'elle est conforme à l'esprit du FSL avant de la mettre en ligne. Merci de votre contributon."; | ||||
|  | ||||
| $lang['notifySubject']		= '[Agenda] Nouvelle proposition !'; | ||||
| $lang['notifyContent']		= "Une nouvelle proposition a été faite.\n\n"; | ||||
|  | ||||
| // toolTip | ||||
| $lang['tipPrevM']		= 'Mois précédent'; | ||||
| $lang['tipNextM']		= 'Mois suivant'; | ||||
|  | ||||
| // format | ||||
| $lang['dateFormat']		= 'dmY'; | ||||
| // $lang['orderedFormat']	= function ($num) { // XXX pb OVH | ||||
| //   if ($num < 1) | ||||
| //     return $num; | ||||
| //   switch ($num) { | ||||
| //   case 1: | ||||
| //     return '1er'; | ||||
| //   default: | ||||
| //     return "{$num}e"; | ||||
| //   } | ||||
| // }; | ||||
|  | ||||
| $lang['orderedFormat']		= array (1 => '1er', 2 => '2e', 3 => '3e', 4 => '4e', 5 => '5e', 6 => '6e', 7 => '7e', 8 => '8e', 9 => '9e', 10 => '10e', 11 => '11e', 12 => '12e', 13 => '13e', 14 => '14e', 15 => '15e', 16 => '16e', 17 => '17e', 18 => '18e', 19 => '19e', 20 => '20e', 21 => '21e', 22 => '22e', 23 => '23e', 24 => '24e', 25 => '25e', 26 => '26e', 27 => '27e', 28 => '28e', 29 => '29e', 30 => '30e', 31 => '31e'); | ||||
|  | ||||
| ?> | ||||
							
								
								
									
										33
									
								
								lang/fr/settings.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,33 @@ | ||||
| <?php | ||||
| /** | ||||
|  * @license    http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.html | ||||
|  * @author     Francois Merciol <dokuplugin@merciol.fr> | ||||
|  * | ||||
|  * French language file | ||||
|  */ | ||||
|  | ||||
| // for the configuration manager | ||||
| $lang['scheduleGroup']             = 'en appartenant à ce groupe, on a accès au formulaire pour ajouter des évènements'; | ||||
| $lang['adminGroup']                = 'le groupe qui à tous les droits sur les évènements'; | ||||
| $lang['dataDir']                   = 'répertoire où sont placés les fichiers XML des évènements par entité'; | ||||
| $lang['groupsDir']                 = 'répertoire où se trouve les entités dans le wiki'; | ||||
| $lang['noSchedule']                = 'liste des entité (séparé par ",") ne devant pas créer des évènements'; | ||||
| $lang['scheduleDir']               = 'page wiki de gestion de l\'agenda (contient un répertoire par entité)'; | ||||
| $lang['sharedDir']                 = 'répertoire regroupant les évènements partagés par tous les groupes'; | ||||
| $lang['scheduleWhat']              = 'liste des types d\'évènement par catégorie (c1:t1,t2|c2:t3,t4|c3:t5,t6,t7)'; | ||||
| $lang['scheduleAudience']          = 'les différents auditoires attendus pour les évènement (a1,a2,a3)'; | ||||
| $lang['iconName']                  = 'nom du logo du groupe qui à créé l\'évènement'; | ||||
| $lang['iconWidth']                 = 'largeur logo du groupe qui à créé l\'évènement'; | ||||
| $lang['repeatPosition']            = 'Position des évènements répétés (groupé en haut ou séparé)'; | ||||
| $lang['repeatPosition_o_grouped']  = 'groupé'; | ||||
| $lang['repeatPosition_o_isolated'] = 'séparé'; | ||||
| $lang['bubblePosition']            = 'Position des info-bulles du calendrier'; | ||||
| $lang['bubblePosition_o_left']     = 'gauche'; | ||||
| $lang['bubblePosition_o_right']    = 'droite'; | ||||
|  | ||||
| $lang['useMap']        	           = 'Affiche une carte de localisation'; | ||||
| $lang['defaultCenter']             = "Position par défaut d'une carte vide (lat, lon)"; | ||||
| $lang['defaultZoom']               = "Zoom par défaut"; | ||||
| $lang['migrate']                   = 'Effectue une migration des données'; | ||||
| $lang['showOldValues']	           = 'Souligne les données non migrées'; | ||||
| ?> | ||||
							
								
								
									
										600
									
								
								lib/scheduleCitiesMap.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,600 @@ | ||||
| /* | ||||
|   All scheduleMap behaviors managed by schedule plugin | ||||
|  | ||||
|   scheduleMapList: Map of | ||||
|     mapId => scheduleMap | ||||
|  | ||||
|   scheduleMap | ||||
|     mapId:        div map ID | ||||
|     map:          map | ||||
|     poi:          Point Of Interest | ||||
|     poiSize:      # of number | ||||
|     clusterLayer: clusterLayer | ||||
| */ | ||||
| var scheduleMapList = {}; | ||||
|  | ||||
| var scheduleUseMap          = JSINFO['schedule']['useMap']; | ||||
| var scheduleZoom            = JSINFO['schedule']['defaultZoom']; | ||||
| var scheduleCenter          = JSINFO['schedule']['defaultCenter']; | ||||
| var schedulePoiUri          = DOKU_BASE+'lib/plugins/schedule/images/poi.png'; | ||||
| var scheduleSelectedPoiUri  = DOKU_BASE+'lib/plugins/schedule/images/poiRed.png'; | ||||
| var scheduleEmptyUri        = DOKU_BASE+'lib/plugins/schedule/images/empty.png'; | ||||
| var scheduleIconCalendarUri = DOKU_BASE+'lib/plugins/schedule/images/calendar.png'; | ||||
| var scheduleAjaxPoiUri      = DOKU_BASE+"lib/plugins/schedule/ajaxPOI.php"; | ||||
| var schedulePrecision       = 5; | ||||
|  | ||||
| var locationFormatRE       = new RegExp ("^\\s*\\(\\s*([\\-0-9.]+)\\s*\\|\\s*([\\-0-9.]+)\\s*\\)\\s*(.*)$"); | ||||
|  | ||||
| var iconStyle; | ||||
| var iconSelectedStyle; | ||||
|  | ||||
| /* selected LI on city UL */ | ||||
| var scheduleSelectedCity = null; | ||||
|  | ||||
| // ======================================== | ||||
| /* format location */ | ||||
| function scheduleGetLocation (lat, lon) { | ||||
|     return "("+ | ||||
| 	parseFloat (parseFloat (lat).toFixed (schedulePrecision))+"|"+ | ||||
| 	parseFloat (parseFloat (lon).toFixed (schedulePrecision))+")"; | ||||
| } | ||||
|  | ||||
| // ======================================== | ||||
| /* convert and reverse location */ | ||||
| function scheduleGetCoordFromLocation (latLonArray) { | ||||
|     return ol.proj.transform ([latLonArray [1], latLonArray [0]], 'EPSG:4326', 'EPSG:3857'); | ||||
| } | ||||
|  | ||||
| // ======================================== | ||||
| /* convert and reverse location */ | ||||
| function scheduleGetLocationFromCoord (coord) { | ||||
|     var lonLat = ol.proj.transform (coord, 'EPSG:3857', 'EPSG:4326'); | ||||
|     return [parseFloat (lonLat[1]).toFixed (schedulePrecision), parseFloat (lonLat [0]).toFixed (schedulePrecision)]; | ||||
| } | ||||
|  | ||||
| // ======================================== | ||||
| /* center scheduleMap according POI markers */ | ||||
| function scheduleCenterMap (scheduleMap) { | ||||
|     if (!scheduleUseMap) | ||||
|     	return; | ||||
|     if (scheduleMap.poiSize) { | ||||
| 	scheduleMap.map.getView ().fit (scheduleMap.poi.getExtent (), scheduleMap.map.getSize ()); | ||||
| 	scheduleMap.map.getView ().setZoom (Math.min (scheduleMap.map.getView ().getZoom ()*.9, | ||||
| 						      scheduleZoom)); | ||||
| 	return; | ||||
|     } | ||||
|     scheduleMap.map.getView ().setCenter (scheduleGetCoordFromLocation (scheduleCenter)); | ||||
|     scheduleMap.map.getView ().setZoom (6); //scheduleZoom); | ||||
| } | ||||
|  | ||||
| // ======================================== | ||||
| /* remove all POI markers */ | ||||
| function scheduleClearMarkers (scheduleMap) { | ||||
|     if (!scheduleUseMap) | ||||
|     	return; | ||||
|     scheduleMap.poiSize = 0; | ||||
|     if (scheduleMap.poi !== undefined) | ||||
| 	scheduleMap.poi.clear (); | ||||
| } | ||||
|  | ||||
| // ======================================== | ||||
| /* add a wellknown city marker */ | ||||
| function scheduleAddCityMarker (scheduleMap, cityCode) { | ||||
|     if (! cityCode) | ||||
| 	return; | ||||
|     var inseeLocation = inseeCityNameLatLon[cityCode]; | ||||
|     if (!style) { | ||||
| 	// XXX not found | ||||
| 	return; | ||||
|     } | ||||
|     scheduleAddLatLonCityMarker (scheduleMap, cityCode, | ||||
| 				 inseeCityNameLatLon[cityCode][1], | ||||
| 				 inseeCityNameLatLon[cityCode][2]); | ||||
| } | ||||
|  | ||||
| // ======================================== | ||||
| /* add a positioned city marker */ | ||||
| function scheduleAddLatLonCityMarker (scheduleMap, cityCode, lat, lon) { | ||||
|     if (!scheduleUseMap) | ||||
|     	return; | ||||
|     scheduleMap.poiSize++; | ||||
|     if (scheduleMap.poi === undefined) | ||||
| 	return; | ||||
|     scheduleMap.poi.addFeature (new ol.Feature({ | ||||
| 	geometry: new ol.geom.Point (scheduleGetCoordFromLocation ([lat, lon])), | ||||
| 	cityCode: cityCode, | ||||
| 	location: scheduleGetLocation (lat, lon), | ||||
| 	lat: lat, | ||||
| 	lon: lon, | ||||
| 	selected: false | ||||
|     })); | ||||
| } | ||||
|  | ||||
| // ======================================== | ||||
| /* highlight all cities on the list of adress */ | ||||
| function scheduleHighlightAddress (locations) { | ||||
|     if (!locations) { | ||||
| 	jQuery ('div.scheduleAddresse').removeClass("poiAdrLight"); | ||||
| 	return; | ||||
|     } | ||||
|     jQuery ('div.scheduleAddresse').each (function () { | ||||
| 	var adrBlock = jQuery (this); | ||||
| 	var location = adrBlock.attr ('location'); | ||||
| 	if (location && (','+locations).indexOf (location) >= 0) | ||||
| 	    adrBlock.addClass("poiAdrLight"); | ||||
| 	else | ||||
| 	    adrBlock.removeClass("poiAdrLight"); | ||||
|     }); | ||||
| } | ||||
|  | ||||
| function scheduleHighlightLocation (location) { | ||||
|     scheduleHighlightAddress (location); | ||||
|     scheduleHighlightPOI (location); | ||||
| } | ||||
|  | ||||
| // ======================================== | ||||
| /* display cities from a UL */ | ||||
| function scheduleAddAllCityFromUl (scheduleMap, ul) { | ||||
|     scheduleClearMarkers (scheduleMap); | ||||
|     ul.find ('li').each (function (index) { | ||||
| 	var li = jQuery (this); | ||||
| 	scheduleAddLatLonCityMarker (scheduleMap, li.attr ('insee'), | ||||
| 				     li.attr ('lat'), li.attr ('lon')); | ||||
|     }); | ||||
|     if (!scheduleUseMap) | ||||
|     	return; | ||||
|     if (scheduleMap.poi !== undefined){ | ||||
| 	scheduleMap.poi.changed (); | ||||
| 	scheduleMap.map.render (); | ||||
|     } | ||||
| } | ||||
|  | ||||
| // ======================================== | ||||
| function scheduleAddCityToUl (ul, cityName) { | ||||
|     var cityCode = /[0-9AB]{5,}/.exec (cityName); | ||||
|     var lat = ""; | ||||
|     var lon = ""; | ||||
|     if (cityCode != null) | ||||
| 	cityCode = cityCode[0]; | ||||
|     if (!cityCode) | ||||
| 	cityCode = inseeCityNameInsee [cityName.toLowerCase ()]; | ||||
|     if (!cityCode) | ||||
| 	cityName = cityCode = cityName.replace(/[^A-ZÀÂÆÇÉÈÊËÎÏÑÔŒÙÛÜÿ a-zàâæçéèêëîïñôœùûüÿ'\-]/gi,''); | ||||
|     else { | ||||
| 	cityName = inseeCityNameLatLon[cityCode][0]; | ||||
| 	lat = inseeCityNameLatLon[cityCode][1]; | ||||
| 	lon = inseeCityNameLatLon[cityCode][2]; | ||||
|     } | ||||
|     var recorded = false; | ||||
|     ul.find ('li[insee="'+cityCode+'"][lat="'+lat+'"][lon="'+lon+'"]').each (function (index) { | ||||
| 	recorded = true; | ||||
| 	scheduleSetSelectCity (jQuery (this)); | ||||
|     }); | ||||
|     if (recorded) | ||||
| 	return; | ||||
|     var lonLat = | ||||
| 	(lat && lon) ? | ||||
| 	' lat="'+lat+'" lon="'+lon+'"' : | ||||
| 	' class="unknown"'; | ||||
|     ul.append ('<li insee="'+cityCode+'"'+lonLat+' onclick="scheduleSelectCity (this)">'+ | ||||
| 	       '<img class="checked" src="'+scheduleEmptyUri+'" width="10" height="16" onclick="scheduleRemoveCity (this)"/>'+ | ||||
| 	       ' <span class="addresse"></span> '+ | ||||
| 	       '<span class="city">'+cityName+'</span></li>'); | ||||
|     scheduleSetSelectCity (ul.find ("li").last ()); | ||||
| } | ||||
|  | ||||
| // ======================================== | ||||
| /* Sort UL by city name (XXX what about addresse ?) */ | ||||
| function scheduleSortUlCities (ul) { | ||||
|     ul.children ('li').sort (function (a, b) { | ||||
| 	var upa = jQuery (a).find ('span.city').text ().toUpperCase (); | ||||
| 	var upb = jQuery (b).find ('span.city').text ().toUpperCase (); | ||||
| 	return (upa < upb) ? -1 : (upa > upb) ? 1 : 0; | ||||
|     }).appendTo (ul[0]); | ||||
| } | ||||
|  | ||||
| function scheduleAjaxPOILine (action) { | ||||
|     if (!scheduleSelectedCity) | ||||
| 	// XXX dire quelque chose | ||||
| 	return; | ||||
|     var insee = scheduleSelectedCity.attr ('insee'); | ||||
|     var lat = scheduleSelectedCity.attr ('lat'); | ||||
|     var lon = scheduleSelectedCity.attr ('lon'); | ||||
|     var addr = scheduleSelectedCity.find ('span.addresse').html ().replace (/<br>/gi, '~br~'); | ||||
|     line = new Array (); | ||||
|     line.push (insee); | ||||
|     line.push (lat); | ||||
|     line.push (lon); | ||||
|     line.push (addr); | ||||
|     jQuery.ajax ({ | ||||
| 	type: "POST", | ||||
| 	url: scheduleAjaxPoiUri, | ||||
| 	cache: true, | ||||
| 	async: true, | ||||
|         data: { action: action, line: line.join ('|') }, | ||||
| 	success: function (response) { alert (response); } | ||||
|     }); | ||||
| } | ||||
|  | ||||
| function scheduleAddInsee () { | ||||
|     scheduleAjaxPOILine ("add"); | ||||
| } | ||||
| function scheduleRemoveInsee () { | ||||
|     scheduleAjaxPOILine ("remove"); | ||||
| } | ||||
| function scheduleTestInsee () { | ||||
| } | ||||
|  | ||||
| function scheduleSetSelectCity (li) { | ||||
|     scheduleSelectedCity = li; | ||||
|     // change autocomplete | ||||
|     var cityCode = scheduleSelectedCity.attr ('insee'); | ||||
|     var form = scheduleSelectedCity.closest ('.scheduleCitiesForm'); | ||||
|     var input = form.find ('input[name="addr"]'); | ||||
|     input. val (scheduleSelectedCity.find ('span.addresse').html ().replace (/<br>/gi, '~br~')); | ||||
|     jQuery.ajax ({ | ||||
| 	type: "POST", | ||||
| 	url: scheduleAjaxPoiUri, | ||||
| 	cache: true, | ||||
| 	async: true, | ||||
|         data: { action: "list", insee: cityCode }, | ||||
| 	success: function (response) { | ||||
| 	    var db = jQuery.parseJSON (response); | ||||
| 	    source = new Array (); | ||||
| 	    for (var i = 0; i < db.length; i++) { | ||||
| 		var vals = db[i].split ("|");  | ||||
| 		source.push ("("+vals[0]+"|"+vals[1]+") "+vals[2]); | ||||
| 	    } | ||||
| 	    input.autocomplete ({ source: source }); | ||||
| 	} | ||||
|     }); | ||||
| } | ||||
|  | ||||
| function scheduleFocusCity () { | ||||
|     if (!scheduleUseMap) | ||||
| 	return; | ||||
|     var form = scheduleSelectedCity.closest ('.scheduleCitiesForm'); | ||||
|     // focus on map | ||||
|     form.find ('.scheduleMap').each (function () { | ||||
| 	var scheduleMap = scheduleMapList [jQuery (this).attr ('id')]; | ||||
| 	scheduleMap.map.getView ().setCenter (scheduleGetCoordFromLocation ([scheduleSelectedCity.attr ('lat'), scheduleSelectedCity.attr ('lon')])); | ||||
| 	scheduleMap.map.getView ().setZoom (Math.min (scheduleMap.map.getView ().getZoom (), scheduleZoom)); | ||||
|     });     | ||||
| } | ||||
|  | ||||
| // ======================================== | ||||
| /* User LI selection and focus on map */ | ||||
| function scheduleSelectCity (item) { | ||||
|     scheduleSetSelectCity (jQuery (item).closest ('li')); | ||||
|     scheduleFocusCity (); | ||||
| } | ||||
|  | ||||
| // ======================================== | ||||
| /* User remove LI */ | ||||
| function scheduleRemoveCity (item) { | ||||
|     var li = jQuery (item).closest ('li'); | ||||
|     var ul = li.closest ('ul'); | ||||
|     li.remove (); | ||||
|     scheduleUpdateUlCity (ul); | ||||
| } | ||||
|  | ||||
| function scheduleUpdateUlCity (ul) { | ||||
|     ul.closest ('.scheduleCitiesForm'). find ('.scheduleMap').each (function () { | ||||
| 	var scheduleMap = scheduleMapList [jQuery (this).attr ('id')]; | ||||
| 	scheduleAddAllCityFromUl (scheduleMap, ul); | ||||
| 	scheduleCenterMap (scheduleMap); | ||||
|     }); | ||||
|     scheduleCheckInputs (); | ||||
| } | ||||
|  | ||||
| // ======================================== | ||||
| /* Find all initial values */ | ||||
| function scheduleInitPOI () { | ||||
|     jQuery ('.schedulePOI').each (function () { | ||||
| 	var poiDiv = jQuery (this); | ||||
| 	var scheduleMap = scheduleMapList [poiDiv.find ('.scheduleMap').attr ('id')]; | ||||
| 	scheduleClearMarkers (scheduleMap); | ||||
| 	poiDiv.find ('span.poiLocations').each (function () { | ||||
| 	    var poiLocations = jQuery (this).text ().split (','); | ||||
| 	    for (var i = 0; i < poiLocations.length; i++) { | ||||
| 		var latLon = poiLocations[i]; | ||||
| 		var match = latLon.match (locationFormatRE); | ||||
| 		if (match) { | ||||
| 		    var lat = parseFloat (match [1]).toFixed (schedulePrecision); | ||||
| 		    var lon = parseFloat (match [2]).toFixed (schedulePrecision); | ||||
| 		    scheduleAddLatLonCityMarker (scheduleMap, "", lat, lon); | ||||
| 		} else | ||||
| 		    // cityCode = latLon | ||||
| 		    scheduleAddCityMarker (scheduleMap, latLon); | ||||
| 	    } | ||||
| 	    scheduleCenterMap (scheduleMap); | ||||
| 	}); | ||||
| 	poiDiv.find ('ul.poiLatLon').each (function () { | ||||
| 	    jQuery (this).find ('li').each (function (index) { | ||||
| 		var li = jQuery (this); | ||||
| 		scheduleAddLatLonCityMarker (scheduleMap, li.text (), | ||||
| 					     li.attr ('lat'), li.attr ('lon')); | ||||
| 	    }); | ||||
| 	    scheduleCenterMap (scheduleMap); | ||||
| 	}); | ||||
|     }); | ||||
|     jQuery ('.scheduleCitiesForm').each (function () { | ||||
| 	var scheduleCitiesForm = jQuery (this); | ||||
| 	var scheduleMapDiv = scheduleCitiesForm.find ('.scheduleMap'); | ||||
| 	if (scheduleMapDiv[0] === undefined) | ||||
| 	    return; | ||||
| 	var scheduleMap = scheduleMapList [scheduleMapDiv.attr ('id')]; | ||||
| 	scheduleAddAllCityFromUl (scheduleMap, jQuery (this).find ('.cities')); | ||||
| 	scheduleCenterMap (scheduleMap); | ||||
|     }); | ||||
| } | ||||
|  | ||||
| // ======================================== | ||||
| /* Find all maps */ | ||||
| function scheduleInitMaps () { | ||||
|     if (!scheduleUseMap) | ||||
|     	return; | ||||
|  | ||||
|     jQuery ('.scheduleMap').each (function () { | ||||
| 	var mapDiv = jQuery (this).find ('div'); | ||||
| 	if (mapDiv !== undefined && mapDiv && mapDiv.length) | ||||
| 	    return; | ||||
| 	var mapId = jQuery (this).attr ('id'); | ||||
| 	var osm = new ol.layer.Tile ({ | ||||
|             source: new ol.source.OSM () | ||||
| 	}); | ||||
| 	var poi = new ol.source.Vector ({ | ||||
| 	    features: [] | ||||
| 	}); | ||||
| 	iconStyle = new ol.style.Style ({ | ||||
| 	    image: new ol.style.Icon (/** @type {olx.style.IconOptions} */ ({ | ||||
| 		anchor: [.5, 1], | ||||
| 		anchorXUnits: 'fraction', | ||||
| 		anchorYUnits: 'fraction', | ||||
| 		opacity: 0.75, | ||||
| 		src: schedulePoiUri | ||||
| 	    })) | ||||
| 	}); | ||||
| 	iconSelectedStyle = new ol.style.Style ({ | ||||
| 	    image: new ol.style.Icon (/** @type {olx.style.IconOptions} */ ({ | ||||
| 		anchor: [.5, 1], | ||||
| 		anchorXUnits: 'fraction', | ||||
| 		anchorYUnits: 'fraction', | ||||
| 		opacity: 0.75, | ||||
| 		src: scheduleSelectedPoiUri | ||||
| 	    })) | ||||
| 	}); | ||||
| 	var clusters = new ol.source.Cluster({ | ||||
| 	    distance: 10, | ||||
| 	    source: poi, | ||||
| 	}); | ||||
| 	var styleCache = {false: {}, true: {}}; | ||||
| 	var clusterLayer = new ol.layer.Vector({ | ||||
| 	    source: clusters, | ||||
| 	    style: function (feature) { | ||||
| 		var features = feature.get ('features'); | ||||
| 	     	var size = features.length; | ||||
| 		if (size < 2) | ||||
| 		    return features [0].get ('selected') ? iconSelectedStyle : iconStyle; | ||||
| 		var selected = false; | ||||
| 		features.forEach (function (item) { | ||||
| 		    if (item.get ('selected')) | ||||
| 			selected = true; | ||||
| 		}); | ||||
|  | ||||
| 		var style = styleCache[selected][size]; | ||||
| 		if (!style) { | ||||
| 		    style = [new ol.style.Style({ | ||||
| 			image: new ol.style.Icon (/** @type {olx.style.IconOptions} */ ({ | ||||
| 			    anchor: [.5, 1], | ||||
| 			    anchorXUnits: 'fraction', | ||||
| 			    anchorYUnits: 'fraction', | ||||
| 			    opacity: 0.75, | ||||
| 			    src: selected ? scheduleSelectedPoiUri : schedulePoiUri | ||||
| 			})), | ||||
| 			text: new ol.style.Text({ | ||||
|                             text: size.toString (), | ||||
|                             offsetY: -24 // XXX textpos conf ? | ||||
| 			}) | ||||
| 		    })]; | ||||
| 		    styleCache[selected][size] = style; | ||||
| 		} | ||||
| 		return style; | ||||
| 	    } | ||||
| 	}); | ||||
| 	var map = new ol.Map ({ | ||||
|             target: mapId, | ||||
|             layers: [osm, clusterLayer], | ||||
|             //logo: false, | ||||
|             controls: ol.control.defaults ({ | ||||
| 		zoom: true, | ||||
| 		attribution: false, | ||||
| 		rotate: false | ||||
|             }), | ||||
| 	    view: new ol.View ({ | ||||
| 		center: ol.proj.fromLonLat (scheduleCenter), | ||||
| 		zoom: scheduleZoom | ||||
| 	    }) | ||||
| 	}); | ||||
| 	if (jQuery (this).hasClass ("scheduleMapDisplay")) | ||||
| 	    map.set ("mapType", "display"); | ||||
| 	if (jQuery (this).hasClass ("scheduleMapForm")) | ||||
| 	    map.set ("mapType", "form"); | ||||
| 	if (jQuery (this).hasClass ("scheduleMapCalendar")) | ||||
| 	    map.set ("mapType", "calendar"); | ||||
|  | ||||
| 	map.on ("singleclick", function (evt) { | ||||
| 	    var f; | ||||
| 	    map.forEachFeatureAtPixel (evt.pixel, function (feature) { | ||||
| 		f = feature; | ||||
| 		return true; | ||||
| 	    }); | ||||
| 	    switch (map.get ("mapType")) { | ||||
| 	    case "display": | ||||
| 		if (f) { | ||||
| 		    if (f.get ('features').length) | ||||
| 			f = f.get ('features')[0]; | ||||
| 		    window.open ("https://www.openstreetmap.org/?mlat="+f.get ('lat')+"&mlon="+f.get ('lon')+"&zoom="+scheduleZoom, "_self"); | ||||
| 		} | ||||
| 		break; | ||||
| 	    case "form": | ||||
| 		var location = scheduleGetLocationFromCoord (evt.coordinate); | ||||
| 		scheduleSelectedCity.attr ('lat', location[0]); | ||||
| 		scheduleSelectedCity.attr ('lon', location[1]); | ||||
| 		scheduleAddAllCityFromUl  (scheduleMap, scheduleSelectedCity.closest ('ul')); | ||||
| 		break; | ||||
| 	    } | ||||
| 	}); | ||||
| 	map.on ("pointermove", function (evt) { | ||||
| 	    var locations = new Set (); | ||||
| 	    map.forEachFeatureAtPixel (evt.pixel, function (feature) { | ||||
| 		feature.get ('features').forEach (function (item) { | ||||
| 		    locations.add (item.get ('location')); | ||||
| 		}); | ||||
| 	    }); | ||||
| 	    locations = Array.from (locations); | ||||
| 	    scheduleHighlightDays (locations); | ||||
| 	    scheduleHighlightLocation (locations.join (',')); | ||||
| 	}); | ||||
| 	var scheduleMap = { | ||||
| 	    mapId: mapId, | ||||
| 	    map: map, | ||||
| 	    poiSize: 0, | ||||
| 	    poi: poi, | ||||
| 	    clusterLayer: clusterLayer | ||||
| 	}; | ||||
|  | ||||
| 	scheduleMapList[mapId] = scheduleMap; | ||||
| 	scheduleCenterMap (scheduleMap); | ||||
|     }); | ||||
| } | ||||
|  | ||||
| // ======================================== | ||||
| /* Initialisation and attach function */ | ||||
| jQuery (function () { | ||||
|     jQuery (function () { | ||||
| 	// create tabs before OpenLayers stuff (important !) | ||||
| 	jQuery (".scheduleTabForm").tabs ({ | ||||
| 	    active: 0 | ||||
| 	}); | ||||
| 	jQuery ("#scheduleHelp").accordion ({ | ||||
| 	    collapsible: true, | ||||
| 	    animated: false, | ||||
| 	    active: false | ||||
| 	}); | ||||
| 	jQuery.datepicker.setDefaults ({ | ||||
| 	    showOn: "both", | ||||
| 	    buttonImageOnly: true, | ||||
| 	    buttonImage: scheduleIconCalendarUri, | ||||
| 	    buttonText: "", | ||||
| 	    firstDay: 0 | ||||
| 	}); | ||||
| 	jQuery.datepicker.formatDate ("yy-mm-dd"); | ||||
| 	jQuery (".scheduleTabForm .date").datepicker (); | ||||
|  | ||||
| 	divError = jQuery ("div.schedule").prev ("div.error"); | ||||
| 	if (divError !== undefined && divError && divError.length) | ||||
| 	    // XXX a tester (avant divError.size ()) | ||||
| 	    scheduleForceCheckInputs (); | ||||
|     }); | ||||
|  | ||||
|     // check and format form request | ||||
|     jQuery ('.scheduleFinalForm').submit (function () { | ||||
| 	var scheduleFinalForm = jQuery (this); | ||||
| 	if (!scheduleForceCheckInputs ()) | ||||
| 	    return false; | ||||
| 	var scheduleForm = scheduleFinalForm.closest ('.scheduleTabForm'); | ||||
| 	var scheduleCitiesForm = scheduleForm.find ('.scheduleCitiesForm'); | ||||
| 	var cities = new Array (); | ||||
| 	var lats = new Array (); | ||||
| 	var lons = new Array (); | ||||
| 	var addrs = new Array (); | ||||
| 	scheduleCitiesForm.find ('li').each (function (index) { | ||||
| 	    var li = jQuery (this); | ||||
| 	    cities.push (li.attr ('insee')); | ||||
| 	    lats.push (li.attr ('lat')); | ||||
| 	    lons.push (li.attr ('lon')); | ||||
| 	    addrs.push (li.find ('span.addresse').html ()); | ||||
| 	}); | ||||
| 	scheduleFinalForm.append ('<input type="hidden" name="schd[where]" value="'+cities.join (",")+'"/>'); | ||||
| 	scheduleFinalForm.append ('<input type="hidden" name="schd[lat]" value="'+lats.join (",")+'"/>'); | ||||
| 	scheduleFinalForm.append ('<input type="hidden" name="schd[lon]" value="'+lons.join (",")+'"/>'); | ||||
| 	scheduleFinalForm.append ('<input type="hidden" name="schd[addr]" value="'+addrs.join ("|").replace (/<br>/gi, '~br~')+'"/>'); | ||||
|  | ||||
| 	var scheduleMiscForm = scheduleForm.find ('.scheduleMiscForm'); | ||||
| 	scheduleMiscForm.find ('input[type="text"]').each (function (index) { | ||||
| 	    if (this.value) | ||||
| 		scheduleFinalForm.append ('<input type="hidden" name="'+this.name+'" value="'+this.value.replace(/"/gi, "''")+'"/>'); | ||||
| 	}); | ||||
| 	scheduleMiscForm.find ('select:not([class="members"])').each (function (index) { | ||||
| 	    scheduleFinalForm.append ('<input type="hidden" name="'+this.name+'" value="'+this.value+'"/>'); | ||||
| 	}); | ||||
| 	var members = new Array (); | ||||
| 	scheduleMiscForm.find ('select[class="members"]').each (function (index) { | ||||
| 	    jQuery (this).find ('option:selected').each (function (index) { | ||||
| 		members.push (jQuery (this).val ()); | ||||
| 	    }); | ||||
| 	}); | ||||
| 	if (members.length > 0) | ||||
| 	    scheduleFinalForm.append ('<input type="hidden" name="schd[member]" value="'+members.join (",")+'"/>'); | ||||
| 	scheduleMiscForm.find ('textarea').each (function (index) { | ||||
| 	    var val = jQuery (this).val ().replace(/"/gi, "''"); | ||||
| 	    var name = jQuery (this).attr ('name'); | ||||
| 	    scheduleFinalForm.append ('<input type="hidden" name="'+name+'" value="'+val+'"/>'); | ||||
| 	}); | ||||
| 	return true; | ||||
|     }); | ||||
|  | ||||
|     // city validation | ||||
|     jQuery ('.scheduleCitiesForm input[name="city"]').keypress (function (e) { | ||||
| 	if (e.which != 13) | ||||
| 	    return; | ||||
| 	var input = jQuery (this); | ||||
| 	var form = input.closest ('.scheduleCitiesForm'); | ||||
| 	var cityName = input.val (); | ||||
| 	if (!cityName) | ||||
| 	    return false; | ||||
| 	input.val (""); | ||||
| 	form.find ('input[name="addr"]').val (""); | ||||
| 	var ul = form.find ('ul'); | ||||
| 	scheduleAddCityToUl (ul, cityName); | ||||
| 	scheduleSortUlCities (ul); | ||||
| 	scheduleUpdateUlCity (ul); | ||||
| 	return false; | ||||
|     }); | ||||
|  | ||||
|     // full adress validation | ||||
|     jQuery ('.scheduleCitiesForm input[name="addr"]').keypress (function (e) { | ||||
| 	if (e.which != 13) | ||||
| 	    return; | ||||
| 	if (!scheduleSelectedCity) | ||||
| 	    return; | ||||
| 	var input = jQuery (this); | ||||
| 	var form = input.closest ('.scheduleCitiesForm'); | ||||
| 	var addr = input.val (); | ||||
| 	var match = addr.match (locationFormatRE); | ||||
| 	if (match) { | ||||
| 	    addr = match [3]; | ||||
| 	    scheduleSelectedCity.attr ('lat', parseFloat (match [1]).toFixed (schedulePrecision)); | ||||
| 	    scheduleSelectedCity.attr ('lon', parseFloat (match [2]).toFixed (schedulePrecision)); | ||||
| 	    var scheduleMap = scheduleMapList [form.find ('.scheduleMap').attr ('id')]; | ||||
| 	    scheduleAddAllCityFromUl (scheduleMap, scheduleSelectedCity.closest ('ul')); | ||||
| 	    scheduleFocusCity (); | ||||
| 	} | ||||
| 	input.val (addr); | ||||
| 	scheduleSelectedCity.find ('span.addresse').html (addr.replace (/~br~/gi, '<br/>')); | ||||
|     }); | ||||
|  | ||||
|     // default form validation for each text field | ||||
|     jQuery ('.scheduleMiscForm input').keypress (function (e) { | ||||
| 	if (e.which != 13) | ||||
| 	    return; | ||||
| 	jQuery (this).closest ('.scheduleTabForm').find ('input[type="submit"]').first ().trigger ('click'); | ||||
|     }); | ||||
|  | ||||
|     // init maps | ||||
|     scheduleInitMaps (); | ||||
|     scheduleInitPOI (); | ||||
| }); | ||||
|  | ||||
| // ======================================== | ||||
							
								
								
									
										145
									
								
								lib/scheduleForm.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,145 @@ | ||||
| // ======================================== | ||||
|  | ||||
| var scheduleDoCkeck = false; | ||||
|  | ||||
| function scheduleForceCheckInputs () { | ||||
|     scheduleDoCkeck = true; | ||||
|     return scheduleCheckInputs (); | ||||
| } | ||||
|  | ||||
| function scheduleCheckSelect (select) { | ||||
|     var warning = select.find ('option:selected').val () == ""; | ||||
|     select.prev (".warningPlace").toggleClass ("warning", warning); | ||||
|     return warning; | ||||
| } | ||||
| function scheduleCheckInput (input) { | ||||
|     var warning = input.val () == ""; | ||||
|     input.toggleClass ("warning", warning); | ||||
|     return warning; | ||||
| } | ||||
| function scheduleCheckUL (ul) { | ||||
|     var warning = ul.children ().length == 0; | ||||
|     ul.toggleClass ("warning", warning); | ||||
|     return warning; | ||||
| } | ||||
| /* | ||||
|  * highlight missing input fields | ||||
|  */ | ||||
| function scheduleCheckInputs () { | ||||
|     if (!scheduleDoCkeck) | ||||
| 	return false; | ||||
|     var tab = jQuery (".scheduleTabForm"); | ||||
|     var tabs = tab.find ("li a.warningPlace"); | ||||
|     var checked = true; | ||||
|     var warning = false; | ||||
|     warning = scheduleCheckSelect (tab.find ('select[name="schd[audience]"]')); | ||||
|     warning = scheduleCheckSelect (tab.find ('select.members')) || warning; | ||||
|     tabs.slice (0,1).toggleClass ("warning", warning); | ||||
|     if (warning) | ||||
| 	checked = false; | ||||
|     warning = scheduleCheckSelect (tab.find ('select[name="schd[what]"]')); | ||||
|     warning = scheduleCheckInput (tab.find ('input[name="schd[title]"]')) || warning; | ||||
|     tabs.slice (1,2).toggleClass ("warning", warning); | ||||
|     if (warning) | ||||
| 	checked = false; | ||||
|     warning = scheduleCheckUL (tab.find ('ul.cities')); | ||||
|     tabs.slice (2,3).toggleClass ("warning", warning); | ||||
|     if (warning) | ||||
| 	checked = false; | ||||
|     warning = scheduleCheckInput (tab.find ('input[name="schd[from]"]')); | ||||
|     tabs.slice (3,4).toggleClass ("warning", warning); | ||||
|     if (warning) | ||||
| 	checked = false; | ||||
|     warning = scheduleCheckInput (tab.find ('input.edit')); | ||||
|     tabs.slice (4,5).toggleClass ("warning", warning); | ||||
|     if (warning) | ||||
| 	checked = false; | ||||
|     return checked; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * switch all selected events for delete. | ||||
|  */ | ||||
| function scheduleSwitchSelection (form) { | ||||
|     for (var i = 0; i < form.elements.length; i++) | ||||
| 	form.elements[i].checked = !form.elements[i].checked; | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * change member selection mode according share status | ||||
|  */ | ||||
| function scheduleSharedEvent (form) { | ||||
|     var form = jQuery (form); | ||||
|     var shared = null; | ||||
|  | ||||
|     form.find ('select[name="schd[shared]"]').each (function () { | ||||
| 	if (this.options [this.selectedIndex].text != "") | ||||
| 	    shared = "true"; | ||||
|     }); | ||||
|     form.find ('select[name="schd[member]"]').each (function () { | ||||
| 	this.multiple = shared; | ||||
| 	this.size = shared ? 9 : 1; | ||||
|     }); | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * display repeat input according selection | ||||
|  */ | ||||
| function scheduleUpdateRepeatType (repeatSelection) { | ||||
|     var selectedValue = repeatSelection.options [repeatSelection.selectedIndex].value; | ||||
|     var inputs = repeatSelection.form.elements; | ||||
|     var disabledWeek = (selectedValue != "week"); | ||||
|     var disabledDay  = (selectedValue != "dayMonth"); | ||||
|     var disabledDate = (selectedValue != "dateMonth"); | ||||
|     var checkedDay = 0; | ||||
|     // XXX jquery ? | ||||
|     for (var i = 0; i < inputs.length; i++) { | ||||
| 	var name = inputs[i].name; | ||||
| 	if (name == "schd[weekDays][]") { | ||||
| 	    inputs[i].disabled = disabledWeek; | ||||
| 	    if (inputs[i].checked) | ||||
| 		checkedDay++; | ||||
| 	} else if (name == "schd[weekRank]") | ||||
| 	    inputs[i].disabled = disabledDay; | ||||
| 	else if (name == "schd[dayInWeek]") | ||||
| 	    inputs[i].disabled = disabledDay; | ||||
| 	else if (name == "schd[dayRank]") | ||||
| 	    inputs[i].disabled = disabledDate; | ||||
|     } | ||||
|     if (!disabledWeek && checkedDay == 0) | ||||
| 	scheduleForceDay (inputs); | ||||
|     // XXX forcer le Ie jour du mois | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * display repeat input according selection | ||||
|  */ | ||||
| function scheduleUpdateWeekDays (DaySelection) { | ||||
|     var inputs = DaySelection.form.elements; | ||||
|     var checkedDay = 0; | ||||
|     // XXX jquery | ||||
|     for (var i = 0; i < inputs.length; i++) { | ||||
| 	if (inputs[i].name == "schd[weekDays][]") | ||||
| 	    if (inputs[i].checked) | ||||
| 		checkedDay++; | ||||
|     } | ||||
|     if (checkedDay == 0) | ||||
| 	scheduleForceDay (inputs); | ||||
| } | ||||
|  | ||||
| function scheduleForceDay (inputs) { | ||||
|     var date = document.getElementById ("scheduleFrom").value; | ||||
|     if (!date) | ||||
| 	date = new Date (); | ||||
|     else { | ||||
| 	date = date.split ('/'); // XXX bug format FR seulement | ||||
| 	date [1] = parseInt (date [1]) - 1; | ||||
| 	if (date[2] < 100) | ||||
| 	    date [2] = parseInt (date [2]) + 2000; | ||||
| 	date = new Date (date[2], date [1], date [0]); | ||||
|     } | ||||
|     var rankDay = date.getDay(); | ||||
|     for (var i = 0; i < inputs.length; i++) | ||||
| 	if (inputs[i].name == "schd[weekDays][]" && inputs[i].value == rankDay) | ||||
| 	    inputs[i].checked = true; | ||||
| } | ||||
							
								
								
									
										93
									
								
								lib/scheduleTable.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,93 @@ | ||||
| // ======================================== | ||||
| /* highlight day and cities in table according the event under the mouse */ | ||||
| function scheduleHighlightEvent (day, locations) { | ||||
|     jQuery ('div.cityBubble div.bubble').each (function () { | ||||
| 	jQuery (this).hide (); | ||||
|     }); | ||||
|     scheduleHighlightPOI (locations); | ||||
|     jQuery ('div.schedule table.short div.mapSelect').each (function () { | ||||
| 	var showDay = jQuery (this); | ||||
| 	var today = showDay.attr ('day'); | ||||
| 	if (day && today == day) | ||||
| 	    showDay.show (); | ||||
| 	else | ||||
| 	    showDay.hide (); | ||||
|     }); | ||||
| } | ||||
|  | ||||
| // ======================================== | ||||
| /* highlight all days in table according the city under the mouse */ | ||||
| function scheduleHighlightDays (targetLocations) { | ||||
|     jQuery ('div.cityBubble div.bubble').each (function () { | ||||
| 	jQuery (this).hide (); | ||||
|     }); | ||||
|     if (!targetLocations || !targetLocations.length) { | ||||
| 	jQuery ('div.schedule table.short div.mapSelect').hide (); | ||||
| 	return; | ||||
|     } | ||||
|     targetLocations.forEach (function (location) { | ||||
| 	jQuery ('div.cityBubble[location="'+location+'"] div.bubble').each (function () { | ||||
| 	    jQuery (this).show (); | ||||
| 	}); | ||||
|     }); | ||||
|     jQuery ('div.schedule table.short div.mapSelect').each (function () { | ||||
| 	var showDay = jQuery (this); | ||||
| 	var eventLocations = showDay.attr ('locations'); | ||||
| 	if (!eventLocations) { | ||||
| 	    showDay.hide (); | ||||
| 	    return; | ||||
| 	} | ||||
| 	var doShow = false; | ||||
| 	targetLocations.forEach (function (location) { | ||||
| 	    if ((','+eventLocations+',').indexOf (location) >= 0) { | ||||
| 		doShow = true; | ||||
| 		return; | ||||
| 	    } | ||||
| 	}); | ||||
| 	if (doShow) | ||||
| 	    showDay.show (); | ||||
| 	else | ||||
| 	    showDay.hide (); | ||||
|     }); | ||||
| } | ||||
|  | ||||
| var scheduleMapList; | ||||
|  | ||||
| // ======================================== | ||||
| /* highlight all cities on the map according the day under the mouse */ | ||||
| function scheduleHighlightPOI (locations) { | ||||
|     if (!locations) { | ||||
| 	jQuery ('div.schedule table.short div.mapSelect').hide (); | ||||
| 	jQuery.each (scheduleMapList, function (mapId, scheduleMap) { | ||||
| 	    scheduleMap.poi.forEachFeature (function (item) { | ||||
| 		item.set ('selected', false); | ||||
| 	    }); | ||||
| 	    scheduleMap.poi.changed (); | ||||
| 	    scheduleMap.map.render (); | ||||
| 	}); | ||||
| 	return; | ||||
|     } | ||||
|     jQuery.each (scheduleMapList, function (mapId, scheduleMap) { | ||||
| 	var changed = false; | ||||
| 	scheduleMap.poi.forEachFeature (function (item) { | ||||
| 	    var location = item.get ('location'); | ||||
| 	    item.set ('selected', (location && (','+locations).indexOf (location) >= 0)); | ||||
| 	}); | ||||
| 	scheduleMap.poi.changed (); | ||||
| 	scheduleMap.map.render (); | ||||
|     }); | ||||
| } | ||||
| // ======================================== | ||||
| function scheduleChangeDate (obj, ns, mapId, date) { | ||||
|     var table = jQuery (obj).closest ("table")[0]; | ||||
|     scheduleSend (table, | ||||
| 		  DOKU_BASE+"lib/plugins/schedule/ajax.php", | ||||
| 		  "schd[ns]="+ns+"&schd[mapId]="+mapId+"&schd[action]=changeDate&schd[date]="+date); | ||||
| } | ||||
|  | ||||
| // ======================================== | ||||
| function scheduleSelectDate (date) { | ||||
|     jQuery ("#scheduleFrom").val (date); | ||||
| } | ||||
|  | ||||
| // ======================================== | ||||
							
								
								
									
										7
									
								
								plugin.info.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,7 @@ | ||||
| base   schedule | ||||
| author Francois Merciol | ||||
| email  dokuplugin@merciol.fr | ||||
| date   2021-03-31 | ||||
| name   Schedule Plugin | ||||
| desc   Includes and manage shcedule into a page (V4) | ||||
| url    http://www.dokuwiki.org/plugin:schedule | ||||
							
								
								
									
										113
									
								
								poiDB.class.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,113 @@ | ||||
| <?php | ||||
| /** | ||||
|  * @license    http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.html | ||||
|  * @author     Francois Merciol <dokuplugin@merciol.fr> | ||||
|  * | ||||
|  * Plugin Schedule: manage events per wiki @groups | ||||
|  | ||||
|  */ | ||||
|  | ||||
| // ============================================================ | ||||
| class poiDB { | ||||
|     var $modify = false; | ||||
|     var $dbFileName; | ||||
|     var $dbByInsee; | ||||
|     var $allLines; | ||||
|  | ||||
|     // ============================================================ | ||||
|     function __construct ($plugin) { | ||||
|         global $conf; | ||||
|         $this->dbFileName = | ||||
|                           ((!$conf['savedir'] || strpos ($conf['savedir'], '.') === 0) ? DOKU_INC : ""). | ||||
|                           $conf['savedir'].'/'.trim ($plugin->getConf ('dataDir').'/poiDB.txt'); | ||||
|         $this->read (); | ||||
|     } | ||||
|  | ||||
|     // ============================================================ | ||||
|     function getInsee ($insee) { | ||||
|         if (!isset ($this->dbByInsee [$insee])) | ||||
|             return array (); | ||||
|         return $this->dbByInsee [$insee]; | ||||
|     } | ||||
|  | ||||
|     // ============================================================ | ||||
|     function addLine ($line) { | ||||
|         $this->cleanDB (); | ||||
|         $line = $this->cleanLine ($line); | ||||
|         if (!$this->allLines || !in_array ($line, $this->allLines)) { | ||||
|             $this->allLines [] = $line; | ||||
|             sort ($this->allLines); | ||||
|             $this->modify = true; | ||||
|         } | ||||
|         $this->write (); | ||||
|         echo "record".NL; | ||||
|     } | ||||
|  | ||||
|     // ============================================================ | ||||
|     function removeLine ($line) { | ||||
|         $this->cleanDB (); | ||||
|         $line = $this->cleanLine ($line); | ||||
|  | ||||
|         if (($key = array_search ($line, $this->allLines)) !== false) { | ||||
|             unset ($this->allLines [$key]); | ||||
|             $this->modify = true; | ||||
|         } | ||||
|         $this->write (); | ||||
|     } | ||||
|  | ||||
|     // ============================================================ | ||||
|     function cleanLine ($line) { | ||||
|         // XXX vérifier nombre | ||||
|         $data = explode ("|", $line); | ||||
|         foreach ($data as $key => $val) | ||||
|             $data[$key] = trim ($val); | ||||
|         $data [1] = number_format ((float)$data[1], 4); | ||||
|         $data [2] = number_format ((float)$data[2], 4); | ||||
|         return implode ("|", $data); | ||||
|     } | ||||
|  | ||||
|     // ============================================================ | ||||
|     function cleanDB () { | ||||
|         if ($this->allLines) | ||||
|             foreach ($this->allLines as $key => $line) { | ||||
|                 $lineCleaned = $this->cleanLine ($line); | ||||
|                 if ($lineCleaned != $line) | ||||
|                     $this->modify = true; | ||||
|                 $this->allLines [$key] = $lineCleaned; | ||||
|             } | ||||
|     } | ||||
|  | ||||
|     // ============================================================ | ||||
|     function read () { | ||||
|         $this->dbByInsee = array (); | ||||
|         $handle = @fopen ($this->dbFileName, "r"); | ||||
|         if ($handle) { | ||||
|             while (($line = fgets ($handle)) !== false) { | ||||
|                 $line = trim (preg_replace ("/#.*$/", "", str_replace ('\\\\', '~br~', $line))); | ||||
|                 if (!$line) | ||||
|                     continue; | ||||
|                 $this->allLines [] = $line; | ||||
|                 list ($insee, $end) = explode ('|', $line, 2); | ||||
|                 $this->dbByInsee [$insee][] = $end; | ||||
|             } | ||||
|             fclose ($handle); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     // ============================================================ | ||||
|     function write () { | ||||
|         if (!$this->modify) { | ||||
|             echo "POI DB unchanged !".NL; | ||||
|             return; | ||||
|         } | ||||
|         $handle = @fopen ($this->dbFileName, "w"); | ||||
|         if ($handle == false) | ||||
|             die("unable to create file: ".$this->dbFileName); // XXX | ||||
|         foreach ($this->allLines as $line) | ||||
|             fputs ($handle, $line.NL); | ||||
|         fclose ($handle); | ||||
|         echo "POI DB updated !".NL; | ||||
|     } | ||||
|  | ||||
|     // ============================================================ | ||||
| } | ||||
							
								
								
									
										64
									
								
								schedule.class.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,64 @@ | ||||
| <?php | ||||
| /** | ||||
|  * @license    http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.html | ||||
|  * @author     Francois Merciol <dokuplugin@merciol.fr> | ||||
|  * | ||||
|  * Plugin Schedule: manage events per wiki @groups | ||||
|  */ | ||||
| if (!defined ('DOKU_INC')) | ||||
|     define ('DOKU_INC', realpath (dirname (__FILE__).'/../../../').'/'); | ||||
| if (!defined ('DOKU_PLUGIN')) | ||||
|     define ('DOKU_PLUGIN', DOKU_INC.'lib/plugins/'); | ||||
|  | ||||
| // ============================================================ | ||||
| // event class | ||||
| class schedule { | ||||
|     var $id;			// event id | ||||
|     var $member;		// event owner | ||||
|     var $from;			// event begining date | ||||
|     var $to;			// event ending date | ||||
|     var $at;			// event begining hour | ||||
|     var $what;			// event type | ||||
|     var $where;			// event place insee code or city name | ||||
|     var $lon;			// event place latitude | ||||
|     var $lat;			// event place longitude | ||||
|     var $addr;			// event place addresse | ||||
|     var $audience;		// event expected audience | ||||
|     var $shared;		// shared event | ||||
|     var $title;			// event page title | ||||
|     var $lead;			// event lead | ||||
|     var $posterURL;		// event poster URL | ||||
|     var $paperURL;		// event paper URL | ||||
|     var $remark;		// event remark | ||||
|     var $rate;			// event rate | ||||
|  | ||||
|     var $repeatFlag;	// event repeat or not | ||||
|     var $repeat;		// event step of repeat | ||||
|     var $repeatType;	// event type of repeat | ||||
|     var $repeatGrouped;	// repeat event grouped on top | ||||
|     var $weekDays;		// event array days concern by the repeating week  | ||||
|     var $weekRank;		// event week concern by the repeating month  | ||||
|     var $dayInWeek;		// event day in the week concern by the repeating month  | ||||
|     var $dayRank;		// event day in the month concern by the repeating month  | ||||
|  | ||||
|     var $requestMembers;	// all members proposed during the request | ||||
| } | ||||
|  | ||||
| // ============================================================ | ||||
| // sort event by event date, then creation date  | ||||
| function cmpSchedule ($a, $b) { | ||||
|     if ($a->from == $b->from) { | ||||
|         if ($a->at == $b->at) | ||||
|             return ($a->id < $b->id) ? -1 : 1; | ||||
|         return ($a->at < $b->at) ? -1 : 1; | ||||
|     } | ||||
|     return ($a->from < $b->from) ? -1 : 1; | ||||
| } | ||||
| // sort info bubbles by date  | ||||
| function cmpScheduleInDay ($a, $b) { | ||||
|     if ($a['at'] == $b['at']) | ||||
|         return ($a['id'] < $b['id']) ? -1 : 1; | ||||
|     return ($a['at'] < $b['at']) ? -1 : 1; | ||||
| } | ||||
|  | ||||
| // ============================================================ | ||||
							
								
								
									
										2830
									
								
								scheduleInseeCities.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										465
									
								
								scheduleRoot.class.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,465 @@ | ||||
| <?php | ||||
| /** | ||||
|  * @license    http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.html | ||||
|  * @author     Francois Merciol <dokuplugin@merciol.fr> | ||||
|  * | ||||
|  * Plugin Schedule: manage events per wiki @groups | ||||
|  * | ||||
|  * $df_ : 31/12/2000 | ||||
|  * $ds_ : 20001231 | ||||
|  * $dn_ : 978217200 | ||||
|  * $dt_ : array ("Y" => 2000, "m" => 12, "d" => "31) | ||||
|  */ | ||||
| if (!defined ('DOKU_INC')) | ||||
|     define ('DOKU_INC', realpath (dirname (__FILE__).'/../../../').'/'); | ||||
| if (!defined ('DOKU_PLUGIN')) | ||||
|     define ('DOKU_PLUGIN', DOKU_INC.'lib/plugins/'); | ||||
|  | ||||
| function cmpScheduleConfig ($a, $b) { | ||||
|     return ($a['nameSpace'] < $b['nameSpace']) ? -1 : 1; | ||||
| } | ||||
|  | ||||
| // ============================================================ | ||||
| // admin class | ||||
| class scheduleRoot { | ||||
|  | ||||
|     // ============================================================ | ||||
|     // Config attributs | ||||
|     // ============================================================ | ||||
|     var $cacheRootDir;					// root cache directory | ||||
|     var $dataRootDir;					// root data directory | ||||
|  | ||||
|     var $scheduleGroup;					// group who can display and fill form | ||||
|     var $groupsDir;						// pages groups directories | ||||
|     var $scheduleDir;					// schedule pages groups directories | ||||
|     var $sharedDir;						// schedule directory for shared events | ||||
|     var $scheduleWhat = array ();		// set of legal "what"  | ||||
|     var $scheduleAudience = array ();	// set of legal "audience" | ||||
|     var $iconName;						// group icon name | ||||
|     var $iconWidth;						// group icon width | ||||
|     // lang | ||||
|     var $scheduleShared = array ();		// notshared/shared | ||||
|     var $currentDateFormat; | ||||
|  | ||||
|     // ============================================================ | ||||
|     // Constant attributs $this->scheduleRoot-> | ||||
|     // ============================================================ | ||||
|     //var $imagesUrlDir = '/lib/plugins/schedule/images/'; // DOKU_REL | ||||
|     var $wizardIconUrl = '/lib/plugins/schedule/images/wizard.png'; // $this->imagesUrlDir | ||||
|     var $editIconUrl = '/lib/plugins/schedule/images/edit.png'; | ||||
|     var $repeatIconUrl = '/lib/plugins/schedule/images/repeat.png'; | ||||
|     var $emptyIconUrl = '/lib/plugins/schedule/images/empty.png'; | ||||
|  | ||||
|     var $oldConfigFile = "config.xml";	// old file config name | ||||
|     var $configFile = "cfg.xml";		// file config name | ||||
|     var $mbrPrefix = "mbr-";			// member prefix file name | ||||
|     var $propFile = "prop.xml";			// member prefix file name | ||||
|     var $configAttributsName = array ("nameSpace", "lastNotification", "lastNotificationReset"); | ||||
|     // scheduleDir == NS ? | ||||
|     var $dateFormat = array ("dmY" => array ("shortScan" => "(?<d>[0-9]{1,2})[ /-](?<m>[0-9]{1,2})[ /-](?<Y>[0-9]{1,2})", | ||||
|                                              "longScan" => "(?<d>[0-9]{1,2})[ /-](?<m>[0-9]{1,2})[ /-](?<Y>[0-9]{4})", | ||||
|                                              "fieldName" => array ("d", "m", "Y"), | ||||
|                                              "prettyPrint" => "d/m/Y", | ||||
|                                              "dayMonth" => "d/m"), | ||||
|  | ||||
|                              "mdY" => array ("shortScan" => "(?<m>[0-9]{1,2})[ /-](?<d>[0-9]{1,2})[ /-](?<Y>[0-9]{1,2})", | ||||
|                                              "longScan" => "(?<m>[0-9]{1,2})[ /-](?<d>[0-9]{1,2})[ /-](?<Y>[0-9]{4})", | ||||
|                                              "fieldName" => array ("m", "d", "Y"), | ||||
|                                              "prettyPrint" => "m/d/Y", | ||||
|                                              "dayMonth" => "m/d")); | ||||
|     var $oddEvenValues = array ("odd", "even"); | ||||
|     var $scheduleRequestAttributsName = array ("id", "audience", "shared", | ||||
|                                                "what", "title", "lead", "posterURL", "paperURL", "remark", "rate", | ||||
|                                                "where", "lon", "lat", "addr", | ||||
|                                                "from", "to", "at", | ||||
|                                                "repeat", "repeatType", "weekRank", "dayInWeek", "dayRank", | ||||
|                                                "user"); | ||||
|     var $scheduleSaveAttributsName; | ||||
|     var $filterNames = array ("noMember" => "member", | ||||
|                               "noWhat" => "what", | ||||
|                               "NoAudience" => "audience"); | ||||
|  | ||||
|  | ||||
|     // ============================================================ | ||||
|     // Transcient attributs | ||||
|     // ============================================================ | ||||
|     var $message = array ();		// messages to display : "notify" =>, "info" =>, "success" =>, "error" => | ||||
|     var $plugin;				// link to wiki plugin inforation (conf, lang, ...) | ||||
|     var $isAdmin;				// if user member of schedule adminGroup | ||||
|     var $oddEven = 0;			// background color for table lines | ||||
|  | ||||
|     // ============================================================ | ||||
|     // Util | ||||
|     // ============================================================ | ||||
|     /* messages container to be display before plugin */ | ||||
|     function message ($type, $text) { | ||||
|         if (isset ($this->message[$type])) | ||||
|             $this->message[$type] .= '<br/>'.NL; | ||||
|         $this->message[$type] .= $text; | ||||
|     } | ||||
|     function startMessage ($type, $text) { | ||||
|         if (isset ($this->message[$type])) | ||||
|             $this->message[$type] = '<br/>'.NL.$this->message[$type]; | ||||
|         $this->message[$type] = $text.$this->message[$type]; | ||||
|     } | ||||
|     /* debug messages for admin only */ | ||||
|     function debug ($text) { | ||||
|         global $INFO; | ||||
|         // XXX | ||||
|         if (isset ($INFO['userinfo'] ['grps']) && in_array ('admin', $INFO ['userinfo'] ['grps'])) | ||||
|             $this->message ('notify', '<pre>'.$text.'</pre>'); | ||||
|     } | ||||
|     /* Change date format from array to number  */ | ||||
|     function dt2dn ($dt_date) { | ||||
|         $dn_date = mktime (0, 0, 0, $dt_date["m"], $dt_date["d"], $dt_date["Y"]); | ||||
|         if (!$dn_date) | ||||
|             $this->message ('error', $dt_date["Y"]."-".$dt_date["d"]."-".$dt_date["m"]." : ".$this->plugin->getLang ('mktimeError').'<br/>'.NL); | ||||
|         return $dn_date; | ||||
|     } | ||||
|     /* Check date format 31/12/2000 */ | ||||
|     function checkDS ($ds_date) { | ||||
|         return | ||||
|             preg_match ("#([0-9]{8})#", $ds_date,  $dumy); | ||||
|     } | ||||
|     /* Change date format from MM/DD/AAAA to number  */ | ||||
|     function df2ds ($df_date) { | ||||
|         $df_date = trim ($df_date); | ||||
|         if (!$df_date) | ||||
|             return; | ||||
|         if ("!" == $df_date) | ||||
|             $ds_date = date ("Ymd"); | ||||
|         elseif (preg_match ("#\+(?<delta>[0-9]+)#", $df_date, $matches)) | ||||
|             $ds_date = sprintf ("%08d", date ("Ymd", mktime (0, 0, 0, date ("n"), date ("j")+$matches["delta"], date ("Y")))); | ||||
|         elseif (preg_match ("#\-(?<delta>[0-9]+)#", $df_date, $matches)) | ||||
|             $ds_date = sprintf ("%08d",  date ("Ymd", mktime (0, 0, 0, date ("n"), date ("j")-$matches["delta"], date ("Y")))); | ||||
|         elseif (preg_match ("#".$this->currentDateFormat ["longScan"]."#", $df_date, $dt_date)) | ||||
|             $ds_date = sprintf ("%04d%02d%02d", $dt_date["Y"], $dt_date["m"], $dt_date["d"]); | ||||
|         elseif (preg_match ("#".$this->currentDateFormat ["shortScan"]."#", $df_date, $dt_date)) | ||||
|             $ds_date = sprintf ("20%02d%02d%02d", $dt_date["Y"], $dt_date["m"], $dt_date["d"]); | ||||
|         else | ||||
|             $ds_date = "{$df_date}"; | ||||
|         return $ds_date; | ||||
|     } | ||||
|     /* Change date format from number to MM/DD/AAAA  */ | ||||
|     function ds2df ($ds_date) { | ||||
|         $ds_date = trim ($ds_date); | ||||
|         if (preg_match ("#(?<Y>[0-9][0-9][0-9][0-9])(?<m>[0-9][0-9])(?<d>[0-9][0-9])#", $ds_date,  $dt_date)) | ||||
|             return sprintf ("%02d/%02d/%04d", | ||||
|                             $dt_date[$this->currentDateFormat["fieldName"][0]], | ||||
|                             $dt_date[$this->currentDateFormat["fieldName"][1]], | ||||
|                             $dt_date[$this->currentDateFormat["fieldName"][2]]); | ||||
|         else | ||||
|             return "{$ds_date}"; | ||||
|     } | ||||
|     function ds2ln ($ds_date, $bold = false) { | ||||
|         $ds_date = trim ($ds_date); | ||||
|         if (preg_match ("#(?<Y>[0-9][0-9][0-9][0-9])(?<m>[0-9][0-9])(?<d>[0-9][0-9])#", $ds_date,  $dt_date)) { | ||||
|             // XXX prévoir le format anglais | ||||
|             setlocale (LC_TIME, 'fr_FR.utf8','fra');  | ||||
|             return strftime (($bold ? "**%A %e %B** %Y" : "%A %e %B %Y"), | ||||
|                              mktime (0, 0, 0, | ||||
|                                      $dt_date[$this->currentDateFormat["fieldName"][1]], | ||||
|                                      $dt_date[$this->currentDateFormat["fieldName"][0]], | ||||
|                                      $dt_date[$this->currentDateFormat["fieldName"][2]])); | ||||
|         } else | ||||
|             return "{$ds_date}"; | ||||
|     } | ||||
|  | ||||
|     /* Convert array on string (words seperated bay '|')  */ | ||||
|     static function array2string ($array) { | ||||
|         if (!$array) | ||||
|             return ""; | ||||
|         $array = array_unique ($array); | ||||
|         if (in_array ("", $array)) | ||||
|             $array = array_diff ("", $array); | ||||
|         if (count ($array) < 1) | ||||
|             return ""; | ||||
|         return implode ("|", $array); | ||||
|     } | ||||
|     /* Convert array on string (words seperated bay '|')  */ | ||||
|     function assocImplode ($array, $vSep = '|', $kSep = ':') { | ||||
|         $result = ""; | ||||
|         foreach ($array as $k => $v) { | ||||
|             $result .= $vSepNeeded.$k.$kSep.$v; | ||||
|             $vSepNeeded = $vSep; | ||||
|         } | ||||
|         return $result; | ||||
|     } | ||||
|     /* Convert array on string (words seperated bay '|')  */ | ||||
|     function assocExplode ($string, $vSep = '|', $kSep = ':') { | ||||
|         $result = array (); | ||||
|         foreach (explode ($vSep, $string) as $kv) { | ||||
|             $data = explode ($kSep, $kv); | ||||
|             $result [$data[0]] = $data[1]; | ||||
|         } | ||||
|         return $result; | ||||
|     } | ||||
|     /* Convert array on string (words seperated bay '|') */ | ||||
|     // $ find data/[mp]*/membres/*/agenda/*/* data/[mp]*/commun/agenda/*/* -type f -print > dumy | ||||
|     // $ emacs dumy | ||||
|     //   C-x ( mv ' ' C-k C-y ' ' C-y C-f C-x ) | ||||
|     //   M-1000 C-x e | ||||
|     //   C-M-% | ||||
|     //     ^\([^ ]* [^ ]* [^ ]*agenda/[^/ ]*_\)/ => \1 | ||||
|     //   C-M-% | ||||
|     //     ^\([^ ]* [^ ]* [^ ]*agenda/[^/ ]*_\)/ => \1 | ||||
|     //   C-M-% | ||||
|     //     ^\([^ ]* [^ ]* [^ ]*agenda/[^/ ]*\)/ => \1_ | ||||
|     // $ find data/[mp]*/membres/*/agenda/* -type d -exec rmdir {} \; -print | ||||
|     function removeSep ($titleId) { | ||||
|         return strtr ($titleId, ':/;', '   '); | ||||
|     } | ||||
|  | ||||
|     function getPageId ($schedule) { | ||||
|         return ":". | ||||
|                   $this->scheduleDir.":". | ||||
|                   ($schedule->shared ? $this->sharedDir : $schedule->member).":". | ||||
|                   $this->removeSep ($schedule->title); | ||||
|     } | ||||
|  | ||||
|     function resetOddEven () { | ||||
|         $this->oddEven = 0; | ||||
|     } | ||||
|     function switchOddEven () { | ||||
|         $this->oddEven = 1 - $this->oddEven; | ||||
|     } | ||||
|  | ||||
|     function getOddEven () { | ||||
|         return $this->oddEvenValues [$this->oddEven]; | ||||
|     } | ||||
|  | ||||
|      static function createDirIsNeeded ($dir) { | ||||
|         if (is_dir ($dir)) | ||||
|             return; | ||||
|         @mkdir ($dir); | ||||
|         @chmod ($dir, 0775); | ||||
|     } | ||||
|  | ||||
|     // ============================================================ | ||||
|     function __construct ($plugin) { | ||||
|         $this->plugin = $plugin; | ||||
|         $this->scheduleSaveAttributsName = array_merge ($this->scheduleRequestAttributsName, array ("weekDays")); | ||||
|         global $conf; | ||||
|         $savedir = ((!$conf['savedir'] || strpos ($conf['savedir'], '.') === 0) ? DOKU_INC : "").$conf['savedir']."/"; | ||||
|         $this->cacheRootDir = $savedir."cache/schedule/"; | ||||
|         $this->dataRootDir = $savedir.trim ($this->plugin->getConf ('dataDir').'/'); | ||||
|         scheduleRoot::createDirIsNeeded ($this->cacheRootDir); | ||||
|         scheduleRoot::createDirIsNeeded ($this->dataRootDir); | ||||
|         $this->scheduleGroup = trim ($this->plugin->getConf ('scheduleGroup')); | ||||
|         $this->groupsDir = trim ($this->plugin->getConf ('groupsDir')); | ||||
|         $this->scheduleDir = trim ($this->plugin->getConf ('scheduleDir')); | ||||
|         $this->sharedDir = trim ($this->plugin->getConf ('sharedDir')); | ||||
|  | ||||
|         foreach (explode ('|', $this->plugin->getConf ('scheduleWhat')) as $tmpCatDef) { | ||||
|             $tmpCatExp = explode (':', trim ($tmpCatDef)); | ||||
|             $tmpCat = trim ($tmpCatExp[0]); | ||||
|             foreach (explode (',', $tmpCatExp[1]) as $tmpWhat) { | ||||
|                 $tmpWhat = trim ($tmpWhat); | ||||
|                 $this->scheduleWhat[$tmpWhat] = $tmpCat; | ||||
|             } | ||||
|         } | ||||
|         $this->scheduleAudience [""] = $this->plugin->getLang ('audienceChoice'); | ||||
|         foreach (explode (',', $this->plugin->getConf ('scheduleAudience')) as $tmpAudience) | ||||
|             $this->scheduleAudience[trim ($tmpAudience)] = trim ($tmpAudience); | ||||
|         $this->iconName = $this->plugin->getConf ('iconName'); | ||||
|         $this->iconWidth = $this->plugin->getConf ('iconWidth'); | ||||
|         foreach (array (false, true) as $sharedVal) { | ||||
|             $tmp = $this->plugin->getLang ('shared'); | ||||
|             $this->scheduleShared[] = trim ($tmp[$sharedVal]); | ||||
|         } | ||||
|         $this->currentDateFormat = $this->dateFormat [$this->plugin->getLang ('dateFormat')]; | ||||
|  | ||||
|         global $INFO; | ||||
|         $this->isAdmin = | ||||
|                        isset ($INFO ['userinfo']) && | ||||
|                        isset ($INFO ['userinfo']['grps']) && | ||||
|                        in_array (trim ($this->plugin->getConf ('adminGroup')), $INFO ['userinfo']['grps']); | ||||
|     } | ||||
|  | ||||
|     // ============================================================ | ||||
|     // Manage XML file | ||||
|     // ============================================================ | ||||
|     /* read lodging config */ | ||||
|     function readConfig ($dir) { | ||||
|         $oldFileName = $dir.$this->oldConfigFile; | ||||
|         $fileName = $dir.$this->configFile; | ||||
|  | ||||
|         // rename old fashion membre file name | ||||
|         if (file_exists ($oldFileName)) { | ||||
|             // XXX migration | ||||
|             rename ($oldFileName, $fileName); | ||||
|             $exclude = ".|..|".$this->scheduleRoot->configFile; | ||||
|             $exclude_array = explode("|", $exclude); | ||||
|             $pathDir = rtrim ($dir, "/") . "/"; | ||||
|             if (is_dir($pathDir)) { | ||||
|                 $pathDirObj = opendir ($pathDir); | ||||
|                 while (false !== ($file = readdir ($pathDirObj))) { | ||||
|                     if (in_array (strtolower ($file), $exclude_array)) | ||||
|                         continue; | ||||
|                     $pathFile = $pathDir.$file; | ||||
|                     if (is_file ($pathFile) && preg_match ('#.*\.xml$#i', $file, $b)) | ||||
|                         rename ($pathFile, $pathDir.$this->mbrPrefix.$file); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         if (!file_exists ($fileName)) | ||||
|             return false; | ||||
|         $result = array (); | ||||
|         // if (! class_exists ('DOMDocument')) | ||||
|         //     return $result; | ||||
|         $xml = new DOMDocument ("1.0", "utf8"); | ||||
|         $xml->load ($fileName); | ||||
|         $root = $xml->documentElement; | ||||
|         foreach ($this->configAttributsName as $field) { | ||||
|             $element = $root->getElementsByTagName ($field); | ||||
|             if ($element) | ||||
|                 $result [$field] = $element->item (0)->nodeValue; | ||||
|         } | ||||
|         return $result; | ||||
|     } | ||||
|     /* write lodging config */ | ||||
|     function writeConfig ($schedules) { | ||||
|         $fileName = $schedules->dataDir.$this->configFile; | ||||
|         scheduleRoot::createDirIsNeeded ($schedules->dataDir); | ||||
|         // if (! class_exists ('DOMDocument')) | ||||
|         //     return; | ||||
|         $xml = new DOMDocument ("1.0", "utf8"); | ||||
|         $root = $xml->createElement ("schedule"); | ||||
|         $xml->appendChild ($root); | ||||
|         foreach ($this->configAttributsName as $field) | ||||
|             $root->appendChild ($xml->createElement ($field, htmlspecialchars ($schedules->$field))); | ||||
|         $xml->formatOutput = true; | ||||
|         $xml->save ($fileName); | ||||
|         chmod ($fileName, 0664); | ||||
|     } | ||||
|  | ||||
|     // ============================================================ | ||||
|     function manageAction ($request) { | ||||
|         if (!$this->isAdmin) | ||||
|             return; | ||||
|         $md5 = $request['md5']; | ||||
|         if (!$md5) | ||||
|             return; | ||||
|         $schedules = new schedules ($this, $request[$md5]['ns']); | ||||
|         switch ($request["action"]) { | ||||
|  | ||||
|         case 'moveSchedules': | ||||
|             $md5 = $request['md5']; | ||||
|             $date = $this->df2ds ($request[$md5]['date']); | ||||
|             $md5bis = $request[$md5]['toNs']; | ||||
|             if (!$date) | ||||
|                 return; | ||||
|             $src = new schedules ($this, $request[$md5]['ns']); | ||||
|             $src->load (); | ||||
|             $dst = new schedules ($this, $request[$md5bis]['ns']); | ||||
|             $dst->load (); | ||||
|             $filter = array (); | ||||
|             foreach ($src->allSchedules as $id => $schedule) | ||||
|                 if (($schedule->to ? $schedule->to : $schedule->from) < $date) | ||||
|                     $filter [$id] = $schedule; | ||||
|             foreach ($filter as $id => $schedule) { | ||||
|                 $dst->addSchedule ($schedule); | ||||
|                 $src->removeSchedule ($id); | ||||
|             } | ||||
|             $dst->writeSchedules (); | ||||
|             $src->writeSchedules (); | ||||
|  | ||||
|             unset ($_REQUEST['schd']); | ||||
|             break; | ||||
|         default: | ||||
|             return; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     // ============================================================ | ||||
|     function printForm () { | ||||
|         if (!$this->isAdmin) | ||||
|             return; | ||||
|         $list = $this->readAllSchedules (); | ||||
|         echo | ||||
|             '<form method="POST" action="" onSubmit="return false;" >'.NL. | ||||
|             ' <table class="admin" >'.NL. | ||||
|             '  <thead>'.NL. | ||||
|             // XXX getLang () | ||||
|             '   <tr><th>Description</th><th>Valeurs</th></tr>'.NL. | ||||
|             '  </thead>'.NL. | ||||
|             '  <tbody>'.NL; | ||||
|         $this->resetOddEven (); | ||||
|         foreach ($list as $md5 => $item) { | ||||
|             $nameSpace = $item ["nameSpace"]; | ||||
|             $schedules = $item ["schedules"]; | ||||
|             echo | ||||
|                 '   <tr class="'.$this->getOddEven ().'">'.NL. | ||||
|                 '    <td class="name">NameSpace</td>'.NL. | ||||
|                 '    <td class="value"><input type="hidden" name="schd['.$md5.'][ns]" value="'.$nameSpace.'"/>'.$nameSpace.'</td>'.NL. | ||||
|                 '   </tr>'.NL. | ||||
|                 '   <tr class="'.$this->getOddEven ().'">'.NL. | ||||
|                 '    <td class="name">MD5</td>'.NL. | ||||
|                 '    <td class="value">'.$md5.'</td>'.NL. | ||||
|                 '   </tr>'.NL. | ||||
|                 '   <tr class="'.$this->getOddEven ().'">'.NL. | ||||
|                 '    <td class="name">Members</td>'.NL. | ||||
|                 '    <td class="value">'.count ($schedules->memberSchedules).'</td>'.NL. | ||||
|                 '   </tr>'.NL. | ||||
|                 '   <tr class="'.$this->getOddEven ().'">'.NL. | ||||
|                 '    <td class="name">Events</td>'.NL. | ||||
|                 '    <td class="value">'.count ($schedules->datedSchedules).'</td>'.NL. | ||||
|                 '   </tr>'.NL. | ||||
|                 '   <tr class="'.$this->getOddEven ().'">'.NL. | ||||
|                 '    <td class="name">Repeated</td>'.NL. | ||||
|                 '    <td class="value">'.count ($schedules->repeatedSchedules).'</td>'.NL. | ||||
|                 '   </tr>'.NL. | ||||
|                 '   <tr class="'.$this->getOddEven ().'">'.NL. | ||||
|                 '    <td class="name">Date</td>'.NL. | ||||
|                 '    <td><input type="text" name="schd['.$md5.'][date]" value="'.'"  placeholder="'.$this->plugin->getLang ('rootMoveDatePH').'"/></td>'.NL. | ||||
|                 '   </tr>'.NL. | ||||
|                 '   <tr class="'.$this->getOddEven ().'">'.NL. | ||||
|                 '    <td class="name">Vers</td>'.NL. | ||||
|                 '    <td><select name="schd['.$md5.'][toNs]"/>'.NL; | ||||
|             foreach ($list as $md5bis => $itemBis) | ||||
|                 if ($md5bis != $md5) | ||||
|                     echo | ||||
|                         '      <option value="'.$md5bis.'">'.$itemBis["nameSpace"].'</option>'.NL; | ||||
|             echo | ||||
|                 '    </select></td>'.NL. | ||||
|                 '   </tr>'.NL. | ||||
|                 '   <tr class="'.$this->getOddEven ().'">'.NL. | ||||
|                 '    <td class="name">Action</td>'.NL. | ||||
|                 '    <td><input type="submit" name="action" value="moveSchedules" onClick="scheduleAjax(this.form,\'moveSchedules\',\''.$md5.'\')" /></td>'.NL. | ||||
|                 '   </tr>'.NL; | ||||
|             $this->switchOddEven (); | ||||
|         } | ||||
|         echo | ||||
|             '  </tbody>'.NL. | ||||
|             ' </table>'.NL. | ||||
|             '</form>'.NL; | ||||
|     } | ||||
|  | ||||
|     // ============================================================ | ||||
|     function readAllSchedules () { | ||||
|         $exclude_array = explode ("|", ".|.."); | ||||
|         if (!is_dir($this->dataRootDir)) | ||||
|             return; | ||||
|         $pathDirObj = opendir ($this->dataRootDir); | ||||
|         while (false !== ($file = readdir ($pathDirObj))) { | ||||
|             $subDir = $this->dataRootDir.$file.'/'; | ||||
|             if (in_array (strtolower ($file), $exclude_array) || !is_dir ($subDir)) | ||||
|                 continue; | ||||
|             $list [$file] = $this->readConfig ($subDir); | ||||
|             $list [$file]["schedules"] = new schedules ($this,  $list [$file]["nameSpace"]); | ||||
|             $list [$file]["schedules"]->load (); | ||||
|         } | ||||
|         uasort ($list, "cmpScheduleConfig"); | ||||
|         return $list; | ||||
|     } | ||||
|  | ||||
|     function clearCache () { | ||||
|         $list = $this->readAllSchedules (); | ||||
|         foreach ($list as $md5 => $item) { | ||||
|             $schedules = $item ["schedules"]; | ||||
|             $schedules->clearCache (); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     // ============================================================ | ||||
| } | ||||
							
								
								
									
										1663
									
								
								schedules.class.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										79
									
								
								script.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,79 @@ | ||||
| /** | ||||
|  * @license    http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.html | ||||
|  * @author     Francois Merciol <dokuplugin@merciol.fr> | ||||
|  * | ||||
|  * Javascript functionality for the include plugin | ||||
|  */ | ||||
|  | ||||
| /* DOKUWIKI:include_once lib/scheduleForm.js */ | ||||
| /* DOKUWIKI:include_once lib/scheduleTable.js */ | ||||
| /* DOKUWIKI:include_once ../ol3/script.js */ | ||||
| /* DOKUWIKI:include_once lib/scheduleCitiesMap.js */ | ||||
|  | ||||
| // ======================================== | ||||
| // Ajax function | ||||
| // ======================================== | ||||
| /* Clear popup message */ | ||||
| function scheduleClearMsgJ (item) { | ||||
|     item.closest ("div").find ("div.popup").each (function () { | ||||
| 	jQuery (this).remove (); | ||||
|     }); | ||||
| } | ||||
|  | ||||
| function scheduleClearCache (action, ns) { | ||||
|     jQuery.ajax ({ | ||||
| 	type: "POST", | ||||
| 	url: DOKU_BASE+"lib/plugins/schedule/ajaxClearCache.php", | ||||
| 	//success: function (response) { alert (response); }, | ||||
| 	cache: true, | ||||
| 	async: true, | ||||
| 	data: "schedule[action]="+action+"&schedule[ns]="+ns | ||||
|     }); | ||||
| } | ||||
|  | ||||
| /* performe ajax request to swap month */ | ||||
| function scheduleAjax (form, action, md5) { | ||||
|     var params = ""; | ||||
|     // XXX jquery | ||||
|     for (var idx = 0; idx < form.elements.length; idx++) { | ||||
| 	var elem = form.elements[idx]; | ||||
| 	if (elem.type == "checkbox") { | ||||
| 	    if (elem.checked) | ||||
| 		params += "&"+elem.name+"="+elem.value; | ||||
| 	} else if (elem.type == "select" || elem.type == "select-multiple") { | ||||
| 	    while (elem.options.selectedIndex >= 0) { | ||||
| 		opt = elem.options [elem.options.selectedIndex]; | ||||
| 		params += "&"+elem.name+"="+opt.text; | ||||
| 		elem.options [elem.options.selectedIndex] = null; | ||||
| 	    } | ||||
| 	} else | ||||
| 	    params += "&"+elem.name+"="+elem.value; | ||||
|     } | ||||
|     params += "&schd[action]="+action+"&schd[md5]="+md5; | ||||
|  | ||||
|     scheduleSend (form, | ||||
| 		  DOKU_BASE+"lib/plugins/schedule/ajax.php", | ||||
| 		  params); | ||||
|     return false; | ||||
| } | ||||
|  | ||||
| function scheduleSend (sender, uri, params) { | ||||
|     var jDiv = jQuery (sender).closest ("div"); | ||||
|     scheduleClearMsgJ (jDiv); | ||||
|     jQuery ('<div class="popup">'+LANG["plugins"]["schedule"]["pleaseWait"]+'</div>'). | ||||
| 	insertBefore (jDiv.children ().first ()); | ||||
|     jQuery.ajax ({ | ||||
| 	type: "POST", | ||||
| 	url: uri, | ||||
| 	cache: false, | ||||
| 	async: true, | ||||
| 	data: params, | ||||
| 	success: function (response) { | ||||
| 	    jDiv.html (response); | ||||
| 	    scheduleInitMaps (); | ||||
| 	    scheduleInitPOI (); | ||||
| 	} | ||||
|     }); | ||||
| } | ||||
|  | ||||
| // ======================================== | ||||
							
								
								
									
										528
									
								
								style.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,528 @@ | ||||
| /* | ||||
|  * @license    http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.html | ||||
|  * @author     Francois <dokuplugin@merciol.fr> | ||||
|  */ | ||||
|  | ||||
| div.schedule { | ||||
|     margin: 1em; | ||||
| } | ||||
|  | ||||
| div.schedule table { | ||||
|     border: 0 none; | ||||
|     border-spacing: 0; | ||||
| } | ||||
|  | ||||
| div.schedule table th, div.schedule table th { | ||||
|     border: 0 none; | ||||
|     text-align: center; | ||||
|     margin: 0; | ||||
|     padding: 0; | ||||
| } | ||||
|  | ||||
| /* ==================== */ | ||||
| div.schedule table.admin { | ||||
|     border-collapse: collapse; | ||||
|     border-spacing: 0; | ||||
| } | ||||
| div.schedule table.admin tr { | ||||
|     border: 0 none; | ||||
|     text-align: center; | ||||
|     vertical-align: middle; | ||||
|     margin: 0 4px; | ||||
|     padding: 0 4px; | ||||
| } | ||||
| div.schedule table.admin tr.even { | ||||
|     background-color: #DDD; | ||||
| } | ||||
| div.schedule table.admin tr td.name { | ||||
|     text-align: right; | ||||
| } | ||||
| div.schedule table.admin tr td.value { | ||||
|     text-align: left; | ||||
|     font-weight: bold; | ||||
| } | ||||
| div.schedule table.admin tr td input { | ||||
|     width: 100%; | ||||
| } | ||||
| div.schedule table.admin select { | ||||
|     width: 100%; | ||||
| } | ||||
|  | ||||
| /* ==================== */ | ||||
| div.schedule table.long { | ||||
|     border-collapse: collapse; | ||||
|     border-spacing: 0; | ||||
| } | ||||
|  | ||||
| div.schedule table.long tr.odd { | ||||
|     vertical-align: middle; | ||||
| } | ||||
|  | ||||
| div.schedule table.long tr.even { | ||||
|     vertical-align: middle; | ||||
|     background-color: #DDD; | ||||
| } | ||||
|  | ||||
| div.schedule table.long tr th, | ||||
| div.schedule table.long tr td { | ||||
|     border: 0 none; | ||||
|     text-align: center; | ||||
|     margin: 0 4px; | ||||
|     padding: 0 4px; | ||||
| } | ||||
|  | ||||
| /* ======================================== | ||||
|  * Depend on "scheduleWhat" configuration | ||||
|  * ======================================== */ | ||||
|  | ||||
| div.schedule table.long tr.cat_a td.what { | ||||
|     padding-left: 20px; | ||||
|     background-image: url("images/bul_a.png"); | ||||
|     background-repeat: no-repeat; | ||||
| } | ||||
|  | ||||
| div.schedule table.long tr.cat_b td.what { | ||||
|     padding-left: 20px; | ||||
|     background-image: url("images/bul_b.png"); | ||||
|     background-repeat: no-repeat; | ||||
| } | ||||
|  | ||||
| div.schedule table.long tr.cat_c td.what { | ||||
|     padding-left: 20px; | ||||
|     background-image: url("images/bul_c.png"); | ||||
|     background-repeat: no-repeat; | ||||
| } | ||||
|  | ||||
| /* ==================== */ | ||||
| div.schedule table.short { | ||||
|     margin: auto; | ||||
|     border: 0 none; | ||||
|     border-spacing: 0; | ||||
| } | ||||
|  | ||||
| div.schedule table.short th, div.schedule table.short td { | ||||
|     border: 0 none; | ||||
|     text-align: center; | ||||
|     margin: 0; | ||||
|     padding: 0; | ||||
|     width: 1em; | ||||
|     height: 1em; | ||||
|     z-index: 1; | ||||
| } | ||||
|  | ||||
| div.schedule table.short td a { | ||||
|     font-weight: bold; | ||||
| } | ||||
|  | ||||
| div.schedule table.short td.week { | ||||
|     margin: 2px 0; | ||||
|     color: #888; | ||||
| } | ||||
|  | ||||
| div.schedule table.short td.empty { | ||||
|     opacity: 0.4; | ||||
| } | ||||
|  | ||||
| div.schedule table.short td.weekend { | ||||
|     background-color: #CCC; | ||||
| } | ||||
| div.schedule table.short td.outofscope { | ||||
|     text-decoration: overline line-through underline; | ||||
|     background-color: #888; | ||||
|     color: #666; | ||||
| } | ||||
| div.schedule table.short td.free { | ||||
|     background-color: white; | ||||
| } | ||||
|  | ||||
| div.schedule table.short caption { | ||||
|     font-weight: bold; | ||||
|     text-align: center; | ||||
| } | ||||
| div.schedule table.short caption.scheduleShow { | ||||
|     border: 2px solid orange; | ||||
| } | ||||
| div.schedule table.short caption.scheduleToday { | ||||
|     border: 2px solid red; | ||||
| } | ||||
|  | ||||
| /* ======================================== | ||||
|  * Depend on "scheduleWhat" configuration | ||||
|  * ======================================== */ | ||||
|  | ||||
| div.schedule table.short td.cat_a { | ||||
|     font-weight: bold; | ||||
|     background: url("images/cat_a.png") repeat; | ||||
| } | ||||
|  | ||||
| div.schedule table.short td.cat_b { | ||||
|     background: url("images/cat_b.png") repeat; | ||||
| } | ||||
|  | ||||
| div.schedule table.short td.cat_c { | ||||
|     background: url("images/cat_c.png") repeat; | ||||
| } | ||||
|  | ||||
| div.schedule table.short td.cat_ab { | ||||
|     background: url("images/cat_ab.png") repeat; | ||||
| } | ||||
|  | ||||
| div.schedule table.short td.cat_ac { | ||||
|     background: url("images/cat_ac.png") repeat; | ||||
| } | ||||
|  | ||||
| div.schedule table.short td.cat_bc { | ||||
|     background: url("images/cat_bc.png") repeat; | ||||
| } | ||||
|  | ||||
| div.schedule table.short td.cat_abc { | ||||
|     background: url("images/cat_abc.png") repeat; | ||||
| } | ||||
|  | ||||
| div.schedule table.short td.op_1 { | ||||
|     opacity: 1; | ||||
| } | ||||
|  | ||||
| div.schedule table.short td.op_2 { | ||||
|     opacity: 1; | ||||
| } | ||||
|  | ||||
| div.schedule table.short td.op_3 { | ||||
|     opacity: 1; | ||||
| } | ||||
|  | ||||
| /* ======================================== | ||||
|  *  | ||||
|  * ======================================== */ | ||||
| div.schedule .popup { | ||||
|     position: absolute; | ||||
|     top: auto; | ||||
|     left: auto; | ||||
|     width: auto; | ||||
|     height: auto; | ||||
|     margin: 1em; | ||||
|     padding: 1em; | ||||
|     overflow: visible; | ||||
|     z-index: 1000; | ||||
|     opacity: 0.7; | ||||
|     background: #EDDB31; | ||||
|     color: black; | ||||
|     border: 1px solid #AE090D; | ||||
|     font-weight: bold; | ||||
| } | ||||
|  | ||||
| div.bubble img { | ||||
|     vertical-align: middle; | ||||
| } | ||||
|  | ||||
| div.bubble a, | ||||
| div.bubble a:visited, | ||||
| div.bubble a:hover, | ||||
| div.bubble a:active, | ||||
| div.bubble a:link { | ||||
|     /*cursor: pointer;*/ | ||||
|     display: block; | ||||
|     text-decoration: none ! important; | ||||
|     font-weight: bold; | ||||
|     color: #AE090D ! important; | ||||
| } | ||||
|  | ||||
| div.bubble div.date { | ||||
|     font-weight: bold; | ||||
|     text-align: center; | ||||
| } | ||||
| div.bubble div.odd { | ||||
|     background-color: #FDD ! important; | ||||
|     padding: 0 4px; | ||||
| } | ||||
| div.bubble div.even { | ||||
|     background-color: #FE5 ! important; | ||||
|     padding: 0 4px; | ||||
| } | ||||
|  | ||||
| div.schedule table.short caption div div.bubble, | ||||
| div.schedule table.short td div.bubble { | ||||
|     position: absolute; | ||||
|     z-index: 1000; | ||||
|     opacity: 0.8; | ||||
|     background: #EDDB31;   /* Définition du fond, sinon on a le même que notre lien */ | ||||
|     color: black; | ||||
|     border: 1px solid #AE090D; /* Définition des bordures */ | ||||
|     text-align: left; | ||||
|     vertical-align: middle; | ||||
|     padding: 0; | ||||
|     font-size: 75%; | ||||
|     top: auto; | ||||
|     overflow: visible; | ||||
|     width: 16em; | ||||
|     height:  auto; | ||||
|     margin-top: 1em; | ||||
|  | ||||
|     display: none; | ||||
| } | ||||
|  | ||||
| div.schedule table.short div.leftBubble { | ||||
|     left: -13em; | ||||
| } | ||||
|  | ||||
| div.schedule table.short div.rightBubble { | ||||
|      left: 18em; | ||||
| } | ||||
|  | ||||
| /* Rend visible tout notre bloc bubble et lui attribue une taille */ | ||||
| div.schedule .showBubbleOnFocus:hover div.bubble, | ||||
| div.schedule .showBubbleOnFocus:focus div.bubble, | ||||
| div.schedule .showBubbleOnFocus:active div.bubble { | ||||
|     display: block; | ||||
| } | ||||
| div.schedule table.short td div.bubble a img { | ||||
|     opacity: 1; | ||||
| } | ||||
|  | ||||
| div.schedule table.short div.over { | ||||
|     position: absolute; | ||||
|     top: auto; | ||||
|     left: auto; | ||||
|     z-index: 900; | ||||
| } | ||||
|  | ||||
| div.schedule table.short td div.past { | ||||
|     font-weight: bold; | ||||
|     color: #FFF; | ||||
|     background-color: #444; | ||||
|     opacity: 0.7; | ||||
|     margin: 0 0 0 3px !important; | ||||
| } | ||||
|  | ||||
| div.schedule table.short td div.scheduleToday { | ||||
|     opacity: 1; | ||||
|     z-index: 3; | ||||
|     font-weight: bold; | ||||
|     margin: -3px -4px 0 0; | ||||
|     border: 3px solid red; | ||||
|     padding: 0; | ||||
|     color: black; | ||||
| } | ||||
|  | ||||
| div.schedule table.short td div.scheduleShow { | ||||
|     opacity: 1; | ||||
|     z-index: 3; | ||||
|     font-weight: bold; | ||||
|     margin: -3px -4px 0 0; | ||||
|     border: 3px solid orange; | ||||
|     padding: 0; | ||||
|     color: black; | ||||
| } | ||||
|  | ||||
| div.schedule table.short td div.mapSelect { | ||||
|     z-index: 4; | ||||
|     font-weight: bold; | ||||
|     margin: -3px -4px 0 0; | ||||
|     border: 3px solid #F0F; | ||||
|     padding: 0; | ||||
|     color: #F0F; | ||||
| } | ||||
|  | ||||
| /* ==================== */ | ||||
| form.scheduleCitiesForm input { | ||||
|     width: 26em; | ||||
| } | ||||
|  | ||||
| div.schedule table.form select, | ||||
| div.schedule table.form input { | ||||
|     font-size: 100%; | ||||
| } | ||||
|  | ||||
| div.scheduleTabForm textarea { | ||||
|     width: 100%; | ||||
|     height: 5em; | ||||
| } | ||||
|  | ||||
| div.scheduleTabForm input.lat { | ||||
|     width: 4em; | ||||
| } | ||||
| div.scheduleTabForm input.lon { | ||||
|     width: 4em; | ||||
| } | ||||
|  | ||||
| div.scheduleTabForm input.date { | ||||
|     width: 6em; | ||||
| } | ||||
| div.scheduleTabForm input.where { | ||||
|     width: 100%; | ||||
| } | ||||
|  | ||||
| div.scheduleTabForm input.hour { | ||||
|     width: 10em; | ||||
| } | ||||
|  | ||||
| div.scheduleTabForm input.repeat { | ||||
|     width: 2em; | ||||
| } | ||||
|  | ||||
| div.scheduleTabForm td.repeat { | ||||
|     text-align: left; | ||||
| } | ||||
|  | ||||
| div.scheduleTabForm div >* { | ||||
|     vertical-align: top; | ||||
| } | ||||
| div.scheduleTabForm p >* { | ||||
|     vertical-align: top; | ||||
| } | ||||
|  | ||||
| div.scheduleTabForm img.checked { | ||||
|     height: 16px; | ||||
|     background-image: url("images/poi.png"); /* poi.png */ | ||||
|     background-size: 10px 16px; | ||||
|     background-repeat: no-repeat; | ||||
| } | ||||
| div.scheduleTabForm li:hover img.checked { | ||||
|     background-image: url("images/poiRed.png"); /* selectedPoi.gif */ | ||||
| } | ||||
|  | ||||
| /* ==================== */ | ||||
|  | ||||
| .ui-accordion .ui-accordion-content { | ||||
|     height: auto !important; | ||||
| } | ||||
|  | ||||
| .scheduleCitiesForm ul { | ||||
|     /*padding: 0 !important;*/ | ||||
|     margin: 0 !important; | ||||
| } | ||||
| .scheduleCitiesForm ul li { | ||||
|     margin-left: 20px; | ||||
| } | ||||
| .scheduleCitiesForm ul img { | ||||
|     margin-left: -20px; | ||||
| } | ||||
|  | ||||
| .scheduleCitiesForm .ui-widget>* { | ||||
|     display: block; | ||||
| } | ||||
|  | ||||
| .scheduleCitiesForm div>div { | ||||
|     vertical-align: top; | ||||
|     display: inline-block; | ||||
| } | ||||
|  | ||||
| .scheduleCitiesForm .cities { | ||||
|     min-height: 4em; | ||||
|     max-height: 4em; | ||||
|     overflow-y: scroll; | ||||
|     overflow-x:hidden; | ||||
|     border-style: solid; | ||||
|     border-color: grey; | ||||
|     border-width: 1px; | ||||
|     padding: 1px; | ||||
| } | ||||
|  | ||||
| .scheduleCitiesForm .cities li { | ||||
|     list-style-type:none; | ||||
| } | ||||
|  | ||||
| .scheduleCitiesForm .unknown { | ||||
|     background-color: #FDD; | ||||
| } | ||||
|  | ||||
| div.schedule table.short div.tabSelect { | ||||
|     position: absolute; | ||||
|     top: auto; | ||||
|     left: auto; | ||||
|     z-index: 900; | ||||
|     margin-top: -16px; | ||||
|     width: 16px; | ||||
|     height: 16px; | ||||
|     min-width: 16px; | ||||
|     min-height: 16px; | ||||
|     background-image: url("images/cat_c.gif"); /* selectedPoi.gif */ | ||||
|     background-size: 10px 16px; | ||||
| } | ||||
|  | ||||
| /* ==================== */ | ||||
| .schedule .scheduleMap { | ||||
|     width: 150px; | ||||
|     height: 150px; | ||||
| } | ||||
|  | ||||
| .schedule div.olControlPanZoom { | ||||
|     display: none; | ||||
| } | ||||
|  | ||||
| .scheduleScaledMap .scheduleMap { | ||||
|     width: 200px; | ||||
|     height: 300px; | ||||
| } | ||||
|  | ||||
| .scheduleScaledMap div.olControlPanZoom { | ||||
|     opacity: 0.2; | ||||
| } | ||||
|  | ||||
| div.scheduleMap div.olControlAttribution, | ||||
| div.scheduleMap div.olControlScaleLine { | ||||
|     font-family: Verdana; | ||||
|     font-size: 0.5em; | ||||
|     right: 1px; | ||||
|     bottom: 1px; | ||||
| } | ||||
|  | ||||
| ul.ui-autocomplete { | ||||
|     max-height: 10em; | ||||
|     overflow-y:scroll; | ||||
|     overflow-x:hidden; | ||||
| } | ||||
|  | ||||
| .poiPinPush { | ||||
|     background-image: url("images/cat_ab.png"); /* poi.png */ | ||||
|     opacity: 0.6; | ||||
| } | ||||
| .poiPinPop { | ||||
|     background-image: url("images/cat_ac.png"); /* poi.png */ | ||||
|     background-size: 10px 16px; | ||||
| } | ||||
| .poiPinLight { | ||||
|     background-image: url("images/cat_bc.png"); /* poi.png */ | ||||
|     opacity: 0.3; | ||||
| } | ||||
|  | ||||
| /* ==================== */ | ||||
| .scheduleAddresse { | ||||
|     width: 16em; | ||||
|     max-width: 16em; | ||||
|     min-height: 8em; | ||||
|     text-align: left; | ||||
| } | ||||
|  | ||||
| .proposal { | ||||
|     border-width: 2px; | ||||
|     border-style: solid none; | ||||
|     border-color: orange; | ||||
| } | ||||
|  | ||||
| div.scheduleTabForm div.warningPlace { | ||||
|     display: inline-block; | ||||
| } | ||||
| div.scheduleTabForm div.warning { | ||||
|     width: 16px; | ||||
|     height: 16px; | ||||
| } | ||||
| div.schedule table.long tr.proposal, | ||||
| div.scheduleTabForm div.warning, | ||||
| div.scheduleTabForm a.warning, | ||||
| div.scheduleTabForm input.warning, | ||||
| div.scheduleTabForm ul.warning { | ||||
|     background-image: url("images/warning.png") !important; | ||||
|     background-repeat: no-repeat !important; | ||||
| } | ||||
| div.scheduleTabForm input.warning { | ||||
|     border: 2px solid yellow !important; | ||||
|     background-position: right center !important; | ||||
| } | ||||
|  | ||||
| div.scheduleAddresse { | ||||
| } | ||||
|  | ||||
| div.scheduleAddresse.poiAdrLight { | ||||
|     background-color: #DDD; | ||||
| } | ||||
							
								
								
									
										205
									
								
								syntax/block.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,205 @@ | ||||
| <?php | ||||
| /** | ||||
|  * @license    http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.html | ||||
|  * @author     Francois Merciol <dokuplugin@merciol.fr> | ||||
|  * | ||||
|  * Plugin Schedule: manage events per wiki @groups | ||||
|  */ | ||||
|  | ||||
| if (!defined ('DOKU_INC')) | ||||
|     define ('DOKU_INC', realpath (__DIR__.'/../../../').'/'); | ||||
| if (!defined ('DOKU_PLUGIN')) | ||||
|     define ('DOKU_PLUGIN', DOKU_INC.'lib/plugins/'); | ||||
| require_once(DOKU_PLUGIN.'syntax.php'); | ||||
|  | ||||
| require_once (realpath (__DIR__.'/..').'/schedule.class.php'); | ||||
| require_once (realpath (__DIR__.'/..').'/scheduleRoot.class.php'); | ||||
| require_once (realpath (__DIR__.'/..').'/schedules.class.php'); | ||||
|  | ||||
| // ============================================================ | ||||
| class syntax_plugin_schedule_block extends DokuWiki_Syntax_Plugin { | ||||
|   | ||||
|     // ============================================================ | ||||
|     function getType () { return 'substition'; } | ||||
|     function getPType () { return 'block'; } | ||||
|     function getSort () { return 299; } | ||||
|     function connectTo ($mode) { | ||||
|         $this->Lexer->addSpecialPattern ('\{\{schedule[^}]*\}\}', $mode, 'plugin_schedule_block'); | ||||
|     } | ||||
|  | ||||
|     // ============================================================ | ||||
|     function handle ($match, $state, $pos, Doku_Handler $handler) { | ||||
|         switch ($state) { | ||||
|         case DOKU_LEXER_SPECIAL : | ||||
|             return array ($state, trim (substr ($match, 10, -2))); // "{{schedule" => 10 "}}" => 2 | ||||
|         } | ||||
|         return false; | ||||
|     } | ||||
|  | ||||
|     var $scheduleRoot; | ||||
|     var $schedules; | ||||
|  | ||||
|     // ============================================================ | ||||
|     function render ($mode, Doku_Renderer $renderer, $indata) { | ||||
|         $dumy = ""; | ||||
|         if (empty($indata)) | ||||
|             return false; | ||||
|         if ($mode != 'xhtml') | ||||
|             return false; | ||||
|         list ($instr, $data) = $indata; | ||||
|         switch ($instr) { | ||||
|         case DOKU_LEXER_SPECIAL : | ||||
|             $args = " ".$data." "; | ||||
|             if (preg_match_all ("#(\"[^\"]*\")* help (\"[^\"]*\")*#", strtolower ($args), $dumy) > 0) { | ||||
|                 $renderer->doc .= $this->scheduleHelp (); | ||||
|                 return true; | ||||
|             } | ||||
|  | ||||
|             $this->scheduleRoot = new scheduleRoot ($this); | ||||
|  | ||||
|             if (preg_match_all ("#(\"[^\"]*\")* admin (\"[^\"]*\")*#", strtolower ($args), $dumy) > 0) { | ||||
|                 ob_start (); | ||||
|                 echo '<div class="schedule">'.NL; | ||||
|                 $this->scheduleRoot->manageAction ($_REQUEST['schd']); | ||||
|                 $this->scheduleRoot->printForm (); | ||||
|                 echo '      </div>'; | ||||
|                 $text = ob_get_contents (); | ||||
|                 ob_end_clean (); | ||||
|                 foreach ($this->scheduleRoot->message as $type => $msg) | ||||
|                     $text = '<div class="'.$type.'">'.$msg.'</div>'.$text; | ||||
|                 $renderer->doc .= $text; | ||||
|                 return true; | ||||
|             } | ||||
|  | ||||
|             // namespace | ||||
|             global $ID; | ||||
|             $ns = getNS ($ID); | ||||
|             if (preg_match_all ("#^ >([^ ]*) (.*)#", $args, $dumy) > 0) { | ||||
|                 $ns = $dumy[1][0]; | ||||
|                 $args = ' '.$dumy[2][0]; | ||||
|                 if (($ns == '*') || ($ns == ':')) | ||||
|                     $ns = ''; | ||||
|                 elseif ($ns == '.') | ||||
|                     $ns = getNS ($ID); | ||||
|                 else | ||||
|                     $ns = cleanID ($ns); | ||||
|             } | ||||
|             $mapId = ""; | ||||
|             if (preg_match_all ('/("[^"]*")* id="(?<id>[0-9a-zA-Z_]+)" ("[^"]*")*/', strtolower ($args), $dumy) > 0) | ||||
|                 for ($i = 0; $i < count ($dumy['id']); $i++) | ||||
|                     $mapId = $dumy ['id'][$i]; | ||||
|             $this->schedules = new schedules ($this->scheduleRoot, $ns); | ||||
|             $renderer->info ['cache'] = FALSE; | ||||
|             $request = false; | ||||
|             global $_REQUEST; | ||||
|             if ((isset ($_REQUEST['schd']) && isset ($_REQUEST['schd']['ns']) && $_REQUEST['schd']['ns'] == $ns) || | ||||
|                 (preg_match_all ("#(\"[^\"]*\")* (prop|form|ctrl) (\"[^\"]*\")*#", strtolower ($args), $dumy) > 0)) | ||||
|                 $request = true; | ||||
|             if ($this->getConf ('useMap') && !is_dir (__DIR__.'/../../ol3')) | ||||
|                 $renderer->doc .= '<p><a href="http://www.dokuwiki.org/plugin:ol3">ol3 plugin</a> not installed (see <a href="http://www.dokuwiki.org/plugin:schedule">doc</a>)</p>'; | ||||
|             $cache = $this->schedules->readCache ($args); | ||||
|             if ($cache) { | ||||
|                 $renderer->doc .= $cache; | ||||
|                 return true; | ||||
|             } | ||||
|             $this->schedules->load (); | ||||
|             ob_start (); | ||||
|             if (preg_match_all ("#(\"[^\"]*\")* table (\"[^\"]*\")*#", strtolower ($args), $dumy) > 0) { | ||||
|                 echo '<div class="schedule">'.NL; | ||||
|                 $this->schedules->printScheduleCalendar (($mapId ? $mapId : "scheduleMapTable"), mktime (0, 0, 0, date ("n"), date ("j"), date ("Y"))); | ||||
|                 echo '</div>'; | ||||
|             } else { | ||||
|                 $formLevel = 0; | ||||
|                 // form | ||||
|                 if (preg_match_all ("#(\"[^\"]*\")* prop (\"[^\"]*\")*#", strtolower ($args), $dumy) > 0) | ||||
|                     $formLevel = max ($formLevel, 3); | ||||
|                 if (preg_match_all ("#(\"[^\"]*\")* form (\"[^\"]*\")*#", strtolower ($args), $dumy) > 0) | ||||
|                     $formLevel = max ($formLevel, 2); | ||||
|                 if (preg_match_all ("#(\"[^\"]*\")* ctrl (\"[^\"]*\")*#", strtolower ($args), $dumy) > 0) | ||||
|                     $formLevel = max ($formLevel, 1); | ||||
|                 $this->scheduleDateFilters ($args); | ||||
|                 $this->schedules->setFormLevel ($formLevel); | ||||
|                 if ($request) | ||||
|                     $this->schedules->manageAction ($_REQUEST['schd']); | ||||
|                 $this->scheduleOtherFilters ($args); | ||||
|                 $this->schedules->printScheduleList (($mapId ? $mapId : "scheduleMapList")); | ||||
|             } | ||||
|             $text = ob_get_contents (); | ||||
|             ob_end_clean (); | ||||
|             if (!$request) | ||||
|                 $this->schedules->writeCache ($args, $text); | ||||
|  | ||||
|             $this->schedules->writeSchedules (); | ||||
|             $this->schedules->writeProp (); | ||||
|             foreach ($this->scheduleRoot->message as $type => $msg) | ||||
|                 $text = '<div class="'.$type.'">'.$msg.'</div>'.$text; | ||||
|             $renderer->doc .= $text; | ||||
|         } | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
|     // ============================================================ | ||||
|     function scheduleHelp () { | ||||
|         $url = "http://admin.parlenet.org/plugins/schedule/"; | ||||
|         return | ||||
|             '      <h1>Help Schedule</h1>'.NL. | ||||
|             '      <ul>'.NL. | ||||
|             '        <li><b>{{schedule</b> help <b>}}</b></li>'.NL. | ||||
|             '        <li><b>{{schedule</b> admin <b>}}</b></li>'.NL. | ||||
|             '        <li><b>{{schedule></b>nameSpace table [(<|=|>)(!|+-delta|jj/mm/aa|jj/mm/aaaa)] <b>}}</b></li>'.NL. | ||||
|             '        <li><b>{{schedule></b>nameSpace id="id" [(<|=|>)(!|+-delta|jj/mm/aa|jj/mm/aaaa)] [#maxLine] [prop|form|ctrl] [(member|what|audience|noMember|noWhat|noAudience)="x1,x2,..."] <b>}}</b></li>'.NL. | ||||
|             '      </ul>'.NL. | ||||
|             '      <p><a class="urlextern" rel="nofollow" title="'.$url.'" href="'.$url.'">'.$url.'</a></p>'.NL; | ||||
|     } | ||||
|  | ||||
|     // ============================================================ | ||||
|     function scheduleDateFilters ($args) { | ||||
|         $before = ""; | ||||
|         $date = ""; | ||||
|         $after = ""; | ||||
|         $periode = array ("<" => &$before, "=" => &$date, ">" => &$after); | ||||
|         $dumy = ""; | ||||
|         // <! =! >! | ||||
|         if (preg_match_all ("#(\"[^\"]*\")*(?<op>[<=>])!(\"[^\"]*\")*#", $args, $dumy) > 0) | ||||
|             $periode [$dumy ['op'][0]] = "!"; | ||||
|         // <+j =+j >+j <-j =-j >-j  | ||||
|         if (preg_match_all ("#(\"[^\"]*\")*(?<op>[<=>])(?<delta>[+\-][0-9]*)(\"[^\"]*\")*#", $args, $dumy) > 0) | ||||
|             for ($i = 0; $i < count ($dumy['op']); $i++) | ||||
|                 $periode [$dumy ['op'][$i]] = $dumy ['delta'][$i]; | ||||
|         // <jj/mm/aaa =jj/mm/aaa >jj/mm/aaa | ||||
|         if (preg_match_all ("# (?<op>[<=>])(?<date>[0-9]{1,2}[-/][0-9]{1,2}[-/][0-9]{1,4}) #", $args, $dumy) > 0) | ||||
|             for ($i = 0; $i < count ($dumy['op']); $i++) | ||||
|                 $periode [$dumy ['op'][$i]] = $dumy ['date'][$i]; | ||||
|         $this->schedules->setDateFilters ($before, $date, $after); | ||||
|     } | ||||
|  | ||||
|     // ============================================================ | ||||
|     function scheduleOtherFilters ($args) { | ||||
|         $max = ""; | ||||
|         $filterNames = array ("member", "what", "audience", "noMember", "noWhat", "noAudience"); | ||||
|         $filters = array (); | ||||
|         $grouped = ""; | ||||
|         $dumy = ""; | ||||
|  | ||||
|         // maxline | ||||
|         if (preg_match_all ("/(\"[^\"]*\")*#(?<max>[0-9]+)(\"[^\"]*\")*/", strtolower ($args), $dumy) > 0) | ||||
|             for ($i = 0; $i < count ($dumy['max']); $i++) | ||||
|                 $max = $dumy ['max'][$i]; | ||||
|         // filters | ||||
|         foreach ($filterNames as $filterName) { | ||||
|             if (preg_match_all ("#".$filterName."=\"(?<".$filterName.">[^\"]*)\"#", $args, $dumy) > 0) { | ||||
|                 $sep = ""; | ||||
|                 for ($i = 0; $i < count ($dumy[$filterName]); $i++) { | ||||
|                     $filters [$filterName] .= $sep.trim (trim ($dumy[$filterName][$i]), ','); | ||||
|                     $sep = ','; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         // grouped | ||||
|         if (preg_match_all ("#(\"[^\"]*\")* (?<grouped>grouped|isolated) (\"[^\"]*\")*#", strtolower ($args), $dumy) > 0) | ||||
|             $grouped = $dumy ['grouped'][0]; | ||||
|         $this->schedules->setOtherFilters ($max, $filters, $grouped); | ||||
|     } | ||||
|  | ||||
|     // ============================================================ | ||||
| } | ||||
							
								
								
									
										136
									
								
								syntax/display.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,136 @@ | ||||
| <?php | ||||
| /** | ||||
|  * @license    http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.html | ||||
|  * @author     Francois Merciol <dokuplugin@merciol.fr> | ||||
|  * | ||||
|  * Plugin Schedule: manage events per wiki @groups | ||||
|  */ | ||||
|  | ||||
| if (!defined ('DOKU_INC')) | ||||
|     define ('DOKU_INC', realpath (__DIR__.'/../../../').'/'); | ||||
| if (!defined ('DOKU_PLUGIN')) | ||||
|     define ('DOKU_PLUGIN', DOKU_INC.'lib/plugins/'); | ||||
| require_once(DOKU_PLUGIN.'syntax.php'); | ||||
|  | ||||
| require_once (realpath (__DIR__.'/..').'/scheduleInseeCities.php'); | ||||
|  | ||||
| // ============================================================ | ||||
| class syntax_plugin_schedule_display extends DokuWiki_Syntax_Plugin { | ||||
|   | ||||
|     // ============================================================ | ||||
|     function getInfo() { | ||||
|         return confToHash (__DIR__.'/../INFO.txt'); | ||||
|     } | ||||
|     function getType () { return 'substition'; } | ||||
|     function getPType () { return 'block'; } | ||||
|     function getSort () { return 299; } | ||||
|     function connectTo ($mode) { | ||||
|         $this->Lexer->addEntryPattern ('<schedule[^>]*>', $mode, 'plugin_schedule_display'); | ||||
|     } | ||||
|     function postConnect () { | ||||
|         $this->Lexer->addExitPattern ('</schedule>', 'plugin_schedule_display'); | ||||
|     } | ||||
|  | ||||
|     // ============================================================ | ||||
|     function handle ($match, $state, $pos, Doku_Handler $handler) { | ||||
|         switch ($state) { | ||||
|         case DOKU_LEXER_ENTER: | ||||
|             return array ($state, trim (substr ($match, 8, -1))); // "<schedule" => 8 ">" => 1 | ||||
|         case DOKU_LEXER_UNMATCHED: | ||||
|             return array ($state, $match); | ||||
|         case DOKU_LEXER_EXIT: | ||||
|             return array ($state, ''); | ||||
|         } | ||||
|         return false; | ||||
|     } | ||||
|  | ||||
|     // ============================================================ | ||||
|     function render ($mode, Doku_Renderer $renderer, $indata) { | ||||
|         if (empty($indata)) | ||||
|             return false; | ||||
|         if ($mode != 'xhtml') | ||||
|             return false; | ||||
|         list ($instr, $data) = $indata; | ||||
|         switch ($instr) { | ||||
|              | ||||
|         case DOKU_LEXER_ENTER : | ||||
|             $args = strtolower (" ".$data." "); | ||||
|             $mapId = "scheduleMapPOI"; | ||||
|             $width = ""; | ||||
|             $height = ""; | ||||
|             if (preg_match_all ('/("[^"]*")* id="(?<id>[0-9a-zA-Z_]+)" ("[^"]*")*/', $args, $dumy) > 0) | ||||
|                 for ($i = 0; $i < count ($dumy['id']); $i++) | ||||
|                     $mapId = $dumy ['id'][$i]; | ||||
|             if (preg_match_all ('/.* width=(?<width>[0-9]+) .*/', $args, $dumy) > 0) | ||||
|                 for ($i = 0; $i < count ($dumy['width']); $i++) | ||||
|                     $width=' width="'.$dumy ['width'][$i].'"'; | ||||
|             if (preg_match_all ('/.* height=(?<height>[0-9]+) .*/', $args, $dumy) > 0) | ||||
|                 for ($i = 0; $i < count ($dumy['height']); $i++) | ||||
|                     $height=' height="'.$dumy ['height'][$i].'"'; | ||||
|             $renderer->doc .= | ||||
|                            '<div class="wrap_left plugin_wrap">'.NL. | ||||
|                            ' <div class="schedulePOI scheduleScaledMap">'.NL; | ||||
|             if ($this->getConf ('useMap')) { | ||||
|                 if (!is_dir (realpath (__DIR__.'/../../ol3'))) | ||||
|                     $renderer->doc .= '<p><a href="http://www.dokuwiki.org/plugin:ol3">ol3 plugin</a> not installed (see <a href="http://www.dokuwiki.org/plugin:schedule">doc</a>)</p>'; | ||||
|                 $renderer->doc .= '  <div id="'.$mapId.'" class="scheduleMap scheduleMapDisplay"'.$width.$height.'></div>'.NL; | ||||
|             } | ||||
|             break; | ||||
|  | ||||
|         case DOKU_LEXER_UNMATCHED : | ||||
|             $data = trim ($data); | ||||
|             $address =""; | ||||
|             if ($this->getConf ('useMap')) | ||||
|                 $renderer->doc .= '<span class="wrap_tip wrap_center wrap_centeralign">'.$this->getLang ('reactiveMap').'</span>'.NL; | ||||
|             $renderer->doc .= '  <ul style="display:none;" class="poiLatLon">'.NL; | ||||
|  | ||||
|             global $scheduleInseeCities; | ||||
|             if (! empty ($data)) | ||||
|                 foreach (explode ("\n",  preg_replace ('%~[eE][nN][dD]~%', "\n", $data)) as $line) { | ||||
|                     $line = trim (preg_replace ("/#.*$/", "", $line)); | ||||
|                     if (!$line) | ||||
|                         continue; | ||||
|                     $line = preg_replace ("#\s+\|#", "|", $line); | ||||
|                     $line = preg_replace ("#\|\s+#", "|", $line); | ||||
|                     $line = trim ($line,'|'); | ||||
|                     list ($insee, $lat, $lon, $addr, $occ) = explode ("|", $line); | ||||
|                     // XXX vérif des formats (nombres, ...) | ||||
|                     if (!$insee || !$lon) { | ||||
|                         if ($insee && $lat) | ||||
|                             $renderer->doc .= '   <li lat="'.$insee.'" lon="'.$lat.'">56000</li>'.NL; // XXX position par defaut | ||||
|                         continue; | ||||
|                     } | ||||
|                     if ($insee && $lat && $lon) { | ||||
|                         $iter=$occ?$occ:1; | ||||
|                         for ($i = 1; $i <= $iter; $i++) | ||||
|                             $renderer->doc .= '   <li lat="'.$lat.'" lon="'.$lon.'">'.$insee.'</li>'.NL; | ||||
|                     } | ||||
|                     $addrHtml = | ||||
|                               ($addr ? | ||||
|                                preg_replace ('%\\\\\\\\%', "<br/>", preg_replace ('%~[bB][rR]~%', "<br/>", $addr)) : | ||||
|                                '<span class="wrap_round wrap_todo">'.$this->lang ('toComplet').'</span><br/>').' '. | ||||
|                               // XXX all insee ??? | ||||
|                               (isset ($scheduleInseeCities[$insee]) ? $scheduleInseeCities[$insee][0] : $insee).'<br/>'. | ||||
|                               (($addr && $lat && $lon) ?  | ||||
|                                '<span style="font-size:50%; background-color:#DDD;">(Lat. : '.$lat.' Long. : '.$lon.')</span>' : | ||||
|                                ''); | ||||
|                     $address .= | ||||
|                              '<div class="scheduleAddresse wrap_left plugin_wrap" location="('.$lat.'|'.$lon.')">'.NL. | ||||
|                              ' <p onMouseOver="javascript:scheduleHighlightLocation (\'('.$lat.'|'.$lon.')\')" onMouseOut="javascript:scheduleHighlightLocation (null)">'.$addrHtml.' </p>'.NL. | ||||
|                              '</div>'.NL; | ||||
|                 } | ||||
|             $renderer->doc .= | ||||
|                            '  </ul>'.NL. | ||||
|                            ' </div>'.NL. | ||||
|                            '</div>'.NL. | ||||
|                            $address. | ||||
|                            '<div class="wrap_clear plugin_wrap"></div>'.NL; | ||||
|             break; | ||||
|         case DOKU_LEXER_EXIT : | ||||
|             break; | ||||
|         } | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
|     // ============================================================ | ||||
| } | ||||