diff --git a/_define.php b/_define.php
new file mode 100644
index 0000000..9a6684c
--- /dev/null
+++ b/_define.php
@@ -0,0 +1,28 @@
+registerModule(
+ /* Name */ 'lunarPhase',
+ /* Description */ 'Display the moon phases',
+ /* Author */ 'Tomtom, Pierre Van Glabeke',
+ /* Verion */ '1.5',
+ /* Properties */
+ array(
+ 'permissions' => 'usage,contentadmin',
+ 'type' => 'plugin',
+ 'dc_min' => '2.7',
+ 'support' => 'http://lab.dotclear.org/wiki/plugin/lunarPhase',
+ 'details' => 'http://plugins.dotaddict.org/dc2/details/lunarPhase'
+ )
+);
\ No newline at end of file
diff --git a/_prepend.php b/_prepend.php
new file mode 100644
index 0000000..99ee36c
--- /dev/null
+++ b/_prepend.php
@@ -0,0 +1,16 @@
+addBehavior('publicHeadContent',array('lunarPhaseBehaviors','addCss'));
+
+class lunarPhaseBehaviors
+{
+ /**
+ This function add CSS file in the public header
+ */
+ public static function addCss()
+ {
+ global $core;
+
+ $url = $core->blog->getQMarkURL().'pf='.basename(dirname(__FILE__)).'/style.css';
+
+ echo '';
+ }
+}
+
+class lunarPhasePublic
+{
+ /**
+ Displays lunarphase widget
+
+ @param w dcWidget dcWidget object
+ @return string HTML code of widget
+ */
+ public static function widget($w)
+ {
+ global $core;
+
+ if ($w->offline)
+ return;
+
+ $lp = new lunarPhase();
+
+ if (($w->homeonly == 1 && $core->url->type != 'default') ||
+ ($w->homeonly == 2 && $core->url->type == 'default')) {
+ return;
+ }
+
+ $res =
+ ($w->title ? $w->renderTitle(html::escapeHTML($w->title)) : '');
+
+ # Get live content
+ $res .= lunarPhasePublic::getLive($w,$lp);
+ # Get prevision content
+ $res .= lunarPhasePublic::getPrevisions($w,$lp);
+
+ return $w->renderDiv($w->content_only,'lunarphase '.$w->class,'',$res);
+
+ }
+
+ /**
+ Returns "live" part of lunarphase widget
+
+ @param w dcWidget dcWidget object
+ @param lp lunarPhaset lunarPhase object
+ @return string Live HTML part
+ */
+ public static function getLive($w,$lp)
+ {
+ $ul_mask = '
';
+ $li_mask = '%1$s';
+ $live = $lp->getLive();
+ $res = '';
+
+ # Phase
+ if ($w->phase) {
+ $res .= sprintf($li_mask,$live['name'],$live['id']);
+ }
+ # Illumination
+ if ($w->illumination) {
+ $res .=
+ sprintf($li_mask,sprintf(__('Illumination: %s%%'),
+ lunarPhasePublic::formatValue('percent',$live['illumination'])),
+ 'illumination');
+ }
+ # Moon's age
+ if ($w->age) {
+ $res .=
+ sprintf($li_mask,sprintf(__('Age of moon: %s days'),
+ lunarPhasePublic::formatValue('int',$live['age'])),
+ 'age');
+ }
+ # Distance from earth
+ if ($w->dist_to_earth) {
+ $res .=
+ sprintf($li_mask,sprintf(__('Distance to earth: %s km'),
+ lunarPhasePublic::formatValue('int',$live['dist_to_earth'])),
+ 'dist_to_earth');
+ }
+ # Distance from sun
+ if ($w->dist_to_sun) {
+ $res .=
+ sprintf($li_mask,sprintf(__('Distance to sun: %s km'),
+ lunarPhasePublic::formatValue('int',$live['dist_to_sun'])),
+ 'dist_to_sun');
+ }
+ # Moon's angle
+ if ($w->moon_angle) {
+ $res .=
+ sprintf($li_mask,sprintf(__('Angle of moon: %s deg'),
+ lunarPhasePublic::formatValue('deg',$live['moon_angle'])),
+ 'moon_angle');
+ }
+ # Sun's angle
+ if ($w->sun_angle) {
+ $res .=
+ sprintf($li_mask,sprintf(__('Angle of sun: %s deg'),
+ lunarPhasePublic::formatValue('deg',$live['sun_angle'])),
+ 'sun_angle');
+ }
+ # Parallax
+ if ($w->parallax) {
+ $res .=
+ sprintf($li_mask,sprintf(__('Parallax: %s deg'),
+ lunarPhasePublic::formatValue('deg',$live['parallax'])),
+ 'parallax');
+ }
+
+ if (strlen($res) > 0) {
+ return
+ ''.__('In live').'
'.
+ sprintf($ul_mask,$res,'lunarphase');
+ }
+ }
+
+ /**
+ Returns "previsions" part of lunarphase widget
+
+ @param w dcWidget dcWidget object
+ @param lp lunarPhaset lunarPhase object
+ @return string previsions HTML part
+ */
+ public static function getPrevisions($w,$lp)
+ {
+ $ul_mask = '';
+ $li_mask = '%1$s';
+ $res = '';
+
+ if ($w->previsions) {
+ foreach ($lp->getPrevisions() as $k => $v) {
+ $res .= sprintf($li_mask,lunarPhasePublic::formatValue('date',$v['date']),$k,$v['name']);
+ }
+ }
+
+ if (strlen($res) > 0) {
+ return
+ ''.__('Previsions').'
'.
+ sprintf($ul_mask,$res,'lunarphase');
+ }
+ }
+
+ /**
+ Returns value passed in argument with a correct format
+
+ @param type string Type of convertion
+ @param value mixed Value to convert
+ @return mixed Converted value
+ */
+ public static function formatValue($type = '',$value)
+ {
+ $res = '';
+ $format = $GLOBALS['core']->blog->settings->system->date_format.' - ';
+ $format .= $GLOBALS['core']->blog->settings->system->time_format;
+ $tz = $GLOBALS['core']->blog->settings->system->blog_timezone;
+
+ switch ($type) {
+ case 'int':
+ $res = number_format($value,0);
+ break;
+ case 'float':
+ $res = number_format($value,2);
+ break;
+ case 'percent':
+ $res = number_format($value * 100,0);
+ break;
+ case 'date':
+ $res = dt::str($format,$value,$tz);
+ break;
+ case 'deg':
+ $res = number_format(($value * (180.0 / M_PI)),2);
+ break;
+ default:
+ $res = $value;
+ break;
+ }
+
+ return $res;
+ }
+}
\ No newline at end of file
diff --git a/_widgets.php b/_widgets.php
new file mode 100644
index 0000000..0ffb6ae
--- /dev/null
+++ b/_widgets.php
@@ -0,0 +1,44 @@
+addBehavior('initWidgets',array('lunarPhaseWidgets','initWidgets'));
+
+class lunarPhaseWidgets
+{
+ public static function initWidgets($w)
+ {
+ $w->create('lunarphase',__('LunarPhase: moon phases'),array('lunarPhasePublic','widget'),
+ null,
+ __('Display the moon phases'));
+ $w->lunarphase->setting('title',__('Title:'),__('Moon phases'));
+ $w->lunarphase->setting('phase',__('Display actual phase of moon'),1,'check');
+ $w->lunarphase->setting('illumination',__('Display actual illumination of moon'),1,'check');
+ $w->lunarphase->setting('age',__('Display actual age of moon'),1,'check');
+ $w->lunarphase->setting('dist_to_earth',__('Display actual distance between moon and earth'),1,'check');
+ $w->lunarphase->setting('dist_to_sun',__('Display actual distance between moon and sun'),1,'check');
+ $w->lunarphase->setting('moon_angle',__('Display actual angle of moon'),1,'check');
+ $w->lunarphase->setting('sun_angle',__('Display actual angle of sun'),1,'check');
+ $w->lunarphase->setting('parallax',__('Display actual parallax of moon'),1,'check');
+ $w->lunarphase->setting('previsions',__('Display all previsions for the next moon phases'),1,'check');
+ $w->lunarphase->setting('homeonly',__('Display on:'),0,'combo',
+ array(
+ __('All pages') => 0,
+ __('Home page only') => 1,
+ __('Except on home page') => 2
+ )
+ );
+ $w->lunarphase->setting('content_only',__('Content only'),0,'check');
+ $w->lunarphase->setting('class',__('CSS class:'),'');
+ $w->lunarphase->setting('offline',__('Offline'),0,'check');
+ }
+}
\ No newline at end of file
diff --git a/changelog b/changelog
new file mode 100644
index 0000000..bb1823e
--- /dev/null
+++ b/changelog
@@ -0,0 +1,15 @@
+v1.5 (23/04/2015) Pierre Van Glabeke :
+modification url support
+
+v1.4 (06/02/2015) Pierre Van Glabeke :
+modifications localisation
+
+v1.3 (14/12/2014) Pierre Van Glabeke :
+compatibilité dc2.7
+
+v1.2 (17/02/2014) :
+reprise par Pierre Van Glabeke
+correction bug (waning_crescent_moon)
+images refaites (merci à 999Diaoul)
+compatibilité dc2.6
+fin de ligne unix
\ No newline at end of file
diff --git a/img/fm.png b/img/fm.png
new file mode 100644
index 0000000..9d2d572
Binary files /dev/null and b/img/fm.png differ
diff --git a/img/fqm.png b/img/fqm.png
new file mode 100644
index 0000000..359d9b2
Binary files /dev/null and b/img/fqm.png differ
diff --git a/img/nm.png b/img/nm.png
new file mode 100644
index 0000000..95f4e53
Binary files /dev/null and b/img/nm.png differ
diff --git a/img/tqm.png b/img/tqm.png
new file mode 100644
index 0000000..41c75ba
Binary files /dev/null and b/img/tqm.png differ
diff --git a/img/wcm1.png b/img/wcm1.png
new file mode 100644
index 0000000..0c15754
Binary files /dev/null and b/img/wcm1.png differ
diff --git a/img/wcm2.png b/img/wcm2.png
new file mode 100644
index 0000000..f399a1b
Binary files /dev/null and b/img/wcm2.png differ
diff --git a/img/wgm1.png b/img/wgm1.png
new file mode 100644
index 0000000..4651a73
Binary files /dev/null and b/img/wgm1.png differ
diff --git a/img/wgm2.png b/img/wgm2.png
new file mode 100644
index 0000000..197db89
Binary files /dev/null and b/img/wgm2.png differ
diff --git a/inc/class.lunarphase.php b/inc/class.lunarphase.php
new file mode 100644
index 0000000..1e59a47
--- /dev/null
+++ b/inc/class.lunarphase.php
@@ -0,0 +1,213 @@
+live = new ArrayObject;
+ $this->previsions = new ArrayObject;
+
+ $this->setLive();
+ $this->setPrevisions();
+ }
+
+ public function getLive()
+ {
+ return $this->live;
+ }
+
+ public function getPrevisions()
+ {
+ return $this->previsions;
+ }
+
+ private function setLive()
+ {
+ $day = $this->jTime(time()) - self::epoch;
+
+ # Calculate sun's position and angle
+ $N = $this->fixAngle((360 / 365.2422) * $day);
+ $M = $this->fixAngle($N + self::elonge - self::elongp);
+ $Ec = $this->kepler($M, self::eccent);
+ $Ec = sqrt((1 + self::eccent) / (1 - self::eccent)) * tan($Ec / 2);
+ $Ec = 2 * $this->toDeg(atan($Ec));
+ $lambdaSun = $this->fixAngle($Ec + self::elongp);
+ $F = ((1 + self::eccent * cos($this->toRad($Ec))) / (1 - self::eccent * self::eccent));
+
+ # Calculate moon's age, position and angle
+ $ml = $this->fixAngle(13.1763966 * $day + self::mmLong);
+ $MM = $this->fixAngle($ml - 0.1114041 * $day - self::mmLongp);
+ $MN = $this->fixAngle(self::mlNode - 0.0529539 * $day);
+ $Ev = 1.2739 * sin($this->toRad(2 * ($ml - $lambdaSun) - $MM));
+ $Ae = 0.1858 * sin($this->toRad($M));
+ $A3 = 0.37 * sin($this->toRad($M));
+ $MmP = $MM + $Ev - $Ae - $A3;
+ $mEc = 6.2886 * sin($this->toRad($MmP));
+ $A4 = 0.214 * sin($this->toRad(2 * $MmP));
+ $lP = $ml + $Ev + $mEc - $Ae + $A4;
+ $V = 0.6583 * sin($this->toRad(2 * ($lP - $lambdaSun)));
+ $lPP = $lP + $V;
+ $NP = $MN - 0.16 * sin($this->toRad($M));
+ $y = sin($this->toRad($lPP - $NP)) * cos($this->toRad(self::mInc));
+ $x = cos($this->toRad($lPP - $NP));
+ $lambdaMoon = $this->toDeg(atan2($y, $x));
+ $lambdaMoon += $NP;
+ $mage = $lPP - $lambdaSun;
+ $BetaM = $this->toDeg(asin(sin($this->toRad($lPP - $NP)) * sin($this->toRad(self::mInc))));
+
+ $this->live['illumination'] = (1 - cos($this->toRad($mage))) / 2;
+ $this->live['age'] = self::synodic * ($this->fixAngle($mage) / 360.0);
+ $this->live['dist_to_earth'] = (self::msMax * (1 - self::mEcc * self::mEcc)) / (1 + self::mEcc * cos($this->toRad($MmP + $mEc)));
+ $this->live['dist_to_sun'] = self::sunsMax / $F;
+ $this->live['sun_angle'] = $F * self::sunAngSiz;
+ $this->live['moon_angle'] = self::mAngSiz / ($this->live['dist_to_earth'] / self::msMax);
+ $this->live['parallax'] = self::mParallax / ($this->live['dist_to_earth'] / self::msMax);
+
+ $this->setPhase();
+ }
+
+ private function setPhase()
+ {
+ if ($this->live['age'] >= self::synodic || $this->live['age'] <= self::synodic/8) {
+ $this->live['id'] = 'new_moon';
+ $this->live['name'] = __('New moon');
+ }
+ elseif ($this->live['age'] >= self::synodic/8 && $this->live['age'] <= self::synodic/4) {
+ $this->live['id'] = 'waxing_crescent_moon';
+ $this->live['name'] = __('Waxing crescent moon');
+ }
+ elseif ($this->live['age'] >= self::synodic/4 && $this->live['age'] <= self::synodic*3/8) {
+ $this->live['id'] = 'first_quarter_moon';
+ $this->live['name'] = __('First quarter moon');
+ }
+ elseif ($this->live['age'] >= self::synodic*3/8 && $this->live['age'] <= self::synodic/2) {
+ $this->live['id'] = 'waxing_gibbous_moon';
+ $this->live['name'] = __('Waxing gibbous moon');
+ }
+ elseif ($this->live['age'] >= self::synodic/2 && $this->live['age'] <= self::synodic*5/8) {
+ $this->live['id'] = 'full_moon';
+ $this->live['name'] = __('Full moon');
+ }
+ elseif ($this->live['age'] >= self::synodic*5/8 && $this->live['age'] <= self::synodic*3/4) {
+ $this->live['id'] = 'waning_gibbous_moon';
+ $this->live['name'] = __('Waning gibbous moon');
+ }
+ elseif ($this->live['age'] >= self::synodic*3/4 && $this->live['age'] <= self::synodic*7/8) {
+ $this->live['id'] = 'last_quarter_moon';
+ $this->live['name'] = __('Last quarter moon');
+ }
+ elseif ($this->live['age'] >= self::synodic*7/8 && $this->live['age'] <= self::synodic) {
+ $this->live['id'] = 'waning_crescent_moon';
+ $this->live['name'] = __('Waning crescent moon');
+ }
+ }
+
+ private function setPrevisions()
+ {
+ $ts_day = 24*60*60;
+ $ts_synodic = self::synodic * $ts_day;
+ $start = time() - $this->live['age'] * $ts_day;
+
+ $this->previsions['waxing_crescent_moon'] = array(
+ 'name' => __('Waxing crescent moon'),
+ 'date' => $start + $ts_synodic / 8
+ );
+ $this->previsions['first_quarter_moon'] = array(
+ 'name' => __('First quarter moon'),
+ 'date' => $start + $ts_synodic / 4
+ );
+ $this->previsions['waxing_gibbous_moon'] = array(
+ 'name' => __('Waxing gibbous moon'),
+ 'date' => $start + $ts_synodic * 3 / 8
+ );
+ $this->previsions['full_moon'] = array(
+ 'name' => __('Full moon'),
+ 'date' => $start + $ts_synodic / 2
+ );
+ $this->previsions['waning_gibbous_moon'] = array(
+ 'name' => __('Waning gibbous moon'),
+ 'date' => $start + $ts_synodic * 5 / 8
+ );
+ $this->previsions['last_quarter_moon'] = array(
+ 'name' => __('Last quarter moon'),
+ 'date' => $start + $ts_synodic * 3 / 4
+ );
+ $this->previsions['waning_crescent_moon'] = array(
+ 'name' => __('Waning crescent moon'),
+ 'date' => $start + $ts_synodic * 7 / 8
+ );
+ $this->previsions['new_moon'] = array(
+ 'name' => __('New moon'),
+ 'date' =>$start + $ts_synodic
+ );
+ }
+
+ private function fixAngle($x)
+ {
+ return ($x - 360.0 * (floor($x / 360.0)));
+ }
+
+ private function toRad($x)
+ {
+ return ($x * (M_PI / 180.0));
+ }
+
+ private function toDeg($x)
+ {
+ return ($x * (180.0 / M_PI));
+ }
+
+ private function jTime($t)
+ {
+ return ($t / 86400) + 2440587.5;
+ }
+
+ private function kepler($m, $ecc)
+ {
+ $delta = null;
+ $EPSILON = 1e-6;
+
+ $m = $this->toRad($m);
+ $e = $m;
+ while (abs($delta) > $EPSILON)
+ {
+ $delta = $e - $ecc * sin($e) - $m;
+ $e -= $delta / (1 - $ecc * cos($e));
+ }
+ return ($e);
+ }
+}
\ No newline at end of file
diff --git a/locales/fr/main.po b/locales/fr/main.po
new file mode 100644
index 0000000..fd4fec7
--- /dev/null
+++ b/locales/fr/main.po
@@ -0,0 +1,133 @@
+msgid ""
+msgstr ""
+"Content-Type: text/plain; charset=UTF-8\n"
+"Project-Id-Version: lunarPhase 1.1-RC2\n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: 2010-09-30T22:49:45+00:00\n"
+"Last-Translator: Thomas Bouron\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+msgid "Display the moon phases"
+msgstr "Afficher les phases de la Lune et autres données"
+
+#: _public.php:84
+msgid "Illumination: %s%%"
+msgstr "Illumination : %s%%"
+
+#: _public.php:91
+msgid "Age of moon: %s days"
+msgstr "Age de la Lune : %s jours"
+
+#: _public.php:98
+msgid "Distance to earth: %s km"
+msgstr "Distance à la Terre : %s km"
+
+#: _public.php:105
+msgid "Distance to sun: %s km"
+msgstr "Distance au Soleil : %s km"
+
+#: _public.php:112
+msgid "Angle of moon: %s deg"
+msgstr "Angle de la Lune : %s deg"
+
+#: _public.php:119
+msgid "Angle of sun: %s deg"
+msgstr "Angle du Soleil : %s deg"
+
+#: _public.php:126
+msgid "Parallax: %s deg"
+msgstr "Parallaxe : %s deg"
+
+#: _public.php:133
+msgid "In live"
+msgstr "En direct"
+
+#: _public.php:159
+msgid "Previsions"
+msgstr "Prévisions"
+
+#: _widgets.php:20
+msgid "LunarPhase: moon phases"
+msgstr "LunarPhase : phases de la Lune"
+
+#: _widgets.php:22
+msgid "Moon phases"
+msgstr "Phases de la Lune"
+
+#: _widgets.php:24
+msgid "Display actual phase of moon"
+msgstr "Afficher la phase actuelle de la Lune"
+
+#: _widgets.php:25
+msgid "Display actual illumination of moon"
+msgstr "Afficher le taux d'illumination actuel de la Lune"
+
+#: _widgets.php:26
+msgid "Display actual age of moon"
+msgstr "Afficher l'âge actuel de la Lune"
+
+#: _widgets.php:27
+msgid "Display actual distance between moon and earth"
+msgstr "Afficher la distance actuelle entre la Terre et la Lune"
+
+#: _widgets.php:28
+msgid "Display actual distance between moon and sun"
+msgstr "Afficher la distance actuelle entre le Soleil et la Lune"
+
+#: _widgets.php:29
+msgid "Display actual angle of moon"
+msgstr "Afficher l'angle actuel de la Lune"
+
+#: _widgets.php:30
+msgid "Display actual angle of sun"
+msgstr "Afficher l'angle actuel du Soleil"
+
+#: _widgets.php:31
+msgid "Display actual parallax of moon"
+msgstr "Afficher la parallaxe actuelle de la Lune"
+
+#: _widgets.php:32
+msgid "Display all previsions for the next moon phases"
+msgstr "Afficher toutes les prévisions des prochaines lunaisons"
+
+#: inc/class.lunarphase.php:107
+#: inc/class.lunarphase.php:174
+msgid "New moon"
+msgstr "Nouvelle lune"
+
+#: inc/class.lunarphase.php:111
+#: inc/class.lunarphase.php:146
+msgid "Waxing crescent moon"
+msgstr "Lune croissante"
+
+#: inc/class.lunarphase.php:115
+#: inc/class.lunarphase.php:150
+msgid "First quarter moon"
+msgstr "Premier quartier"
+
+#: inc/class.lunarphase.php:119
+#: inc/class.lunarphase.php:154
+msgid "Waxing gibbous moon"
+msgstr "Lune gibbeuse croissante"
+
+#: inc/class.lunarphase.php:123
+#: inc/class.lunarphase.php:158
+msgid "Full moon"
+msgstr "Pleine lune"
+
+#: inc/class.lunarphase.php:127
+#: inc/class.lunarphase.php:162
+msgid "Waning gibbous moon"
+msgstr "Lune gibbeuse décroissante"
+
+#: inc/class.lunarphase.php:131
+#: inc/class.lunarphase.php:166
+msgid "Last quarter moon"
+msgstr "Dernier quartier"
+
+#: inc/class.lunarphase.php:135
+#: inc/class.lunarphase.php:170
+msgid "Waning crescent moon"
+msgstr "Lune décroissante"
\ No newline at end of file
diff --git a/style.css b/style.css
new file mode 100644
index 0000000..2bed568
--- /dev/null
+++ b/style.css
@@ -0,0 +1,8 @@
+#sidebar .lunarphase ul li.new_moon{background:transparent url(index.php?pf=lunarPhase/img/nm.png) no-repeat left 0.2em;padding-left:2em;}
+#sidebar .lunarphase ul li.waxing_crescent_moon{background:transparent url(index.php?pf=lunarPhase/img/wcm1.png) no-repeat left 0.2em;padding-left:2em;}
+#sidebar .lunarphase ul li.first_quarter_moon{background:transparent url(index.php?pf=lunarPhase/img/fqm.png) no-repeat left 0.2em;padding-left:2em;}
+#sidebar .lunarphase ul li.waxing_gibbous_moon{background:transparent url(index.php?pf=lunarPhase/img/wgm1.png) no-repeat left 0.2em;padding-left:2em;}
+#sidebar .lunarphase ul li.full_moon{background:transparent url(index.php?pf=lunarPhase/img/fm.png) no-repeat left 0.2em;padding-left:2em;}
+#sidebar .lunarphase ul li.waning_gibbous_moon{background:transparent url(index.php?pf=lunarPhase/img/wgm2.png) no-repeat left 0.2em;padding-left:2em;}
+#sidebar .lunarphase ul li.last_quarter_moon{background:transparent url(index.php?pf=lunarPhase/img/tqm.png) no-repeat left 0.2em;padding-left:2em;}
+#sidebar .lunarphase ul li.waning_crescent_moon{background:transparent url(index.php?pf=lunarPhase/img/wcm2.png) no-repeat left 0.2em;padding-left:2em;}
\ No newline at end of file