;;; sv-kalender.el --- Svenska kalenderfunktioner- och inställningar för Emacs
;;; version 1.4

;;; Copyright (c) 2002-2004 av Daniel Jensen <daniel@bigwalter.net>
;;; Denna fil är licensierad under GNU GPL.
;;; Licensvatalet finns att läsa på http://www.gnu.org/copyleft/gpl.html
;;; En svensk översättning finns på http://www.gnuheter.org/gpl.php

;;;; Kommentarer:

;;; Denna fil modifierar hur Emacs kalender ser ut. Den byter namn på
;;; veckodagar, månader etc., samt inför svenska helgdagar och högtider
;;; i stället för de amerikanska.
;;;
;;; För att använda den svenska kalendern behöver du bara placera
;;; (load "sv-kalender") någonstans i din ~/.emacs

;;;; Ändringar:

;;; 1.4 - Månader och dagar med små begynnelsebokstäver
;;; 1.3 - Nya flaggdagar och en bugg i "mer påsk" fixad (Alan Campbell)
;;; 1.2 - Adventsdagarna justerade (Alan Campbell)
;;; 1.1 - Fettisdagen flyttad en vecka bakåt.

;;;; Kod:

;;; Allmänna inställningar

;; Veckan börjar med en måndag
(setq calendar-week-start-day 1)

;; Använd "europeiska" datum (dag/måndad)
(setq european-calendar-style 1)

;; Datumformat
(setq calendar-date-display-form
      '((if dayname
            (concat dayname ", "))
        day " " monthname " " year))

;; 24-timmarsklocka utan tidszon
(setq calendar-time-display-form
      '(24-hours ":" minutes))

;; Dagarnas namn
(setq calendar-day-name-array
      ["söndag" "måndag" "tisdag" "onsdag" "torsdag" "fredag" "lördag"])

;; Månadernas namn
(setq calendar-month-name-array
      ["januari" "februari" "mars" "april" "maj" "juni"
       "juli" "augusti" "september" "oktober" "november" "december"])

;; Årets vändpunkter
(setq solar-n-hemi-seasons
  '("Vårdagjämningen" "Sommarsolståndet" "Höstdagjämningen" "Vintersolståndet"))

;; Ändra till t för att gömma vissa högtider
(defvar hide-some-holidays nil
  "Om icke-NIL, göm vissa helgdagar i kalendern")

;; Göm andra helgdagar
(setq oriental-holidays nil
      islamic-holidays nil
      hebrew-holidays nil
      christian-holidays nil)

;;; Påskdagen

;; Många helgdagar utgår från påskdagen. Den är lite knepig att räkna ut!

(defun påskdagen (år)
  "Datum för påskdagen för ett visst ÅR."
  (let* ((århundrade (1+ (/ år 100)))
         (månfas (% (+ 14 (* 11 (% år 19))
                       (- (/ (* 3 århundrade) 4))
                       (/ (+ 5 (* 8 århundrade)) 25)
                       (* 30 århundrade))
                    30))
         (justerad-fas (if (or (= månfas 0)
                               (and (= månfas 1)
                                    (< 10 (% år 19))))
                           (1+ månfas)
                         månfas))
         (fullmåne (- (calendar-absolute-from-gregorian
                       (list 4 19 år))
                      justerad-fas))
         (påsk (calendar-dayname-on-or-before 0 (+ fullmåne 7))))
    påsk))

;;; Helgdagar

(setq general-holidays
      '((holiday-fixed 1 1 "Nyårsdagen")
        (holiday-fixed 1 6 "Trettondedag jul")

        ;; Påsk och pingst
        (filter-visible-calendar-holidays
         (mapcar
          (lambda (dag)
            (list (calendar-gregorian-from-absolute
                   (+ (påskdagen displayed-year) (car dag)))
                  (cadr dag)))
          '((  -2 "Långfredagen")
            (  -1 "Påskafton")
            (   0 "Påskdagen")
            (  +1 "Annandag påsk")
            ( +39 "Kristi himmelfärdsdag")
            ( +49 "Pingstdagen")
            ( +50 "Annandag pingst"))))

        (holiday-fixed 5 1 "Första maj")

        (let ((midsommar-d (calendar-dayname-on-or-before
                            6 (calendar-absolute-from-gregorian
                               (list 6 26 displayed-year)))))
          ;; midsommar
          (filter-visible-calendar-holidays
          (list
           (list
            (calendar-gregorian-from-absolute (1- midsommar-d))
            "Midsommarafton")
           (list
            (calendar-gregorian-from-absolute midsommar-d)
            "Midsommardagen")
           ;; Alla helgons dag
           (list
            (calendar-gregorian-from-absolute
             (calendar-dayname-on-or-before
              6 (calendar-absolute-from-gregorian
                 (list 11 6 displayed-year))))
            "Alla helgons dag"))))
         
        (holiday-fixed 12 25 "Juldagen")
        (holiday-fixed 12 26 "Annandag jul")))

;;; Andra högtider

(setq other-holidays
      '((holiday-fixed 1 13 "Tjogondag Knut")
        (unless hide-some-holidays
          (holiday-fixed 1 28 "Konungens namnsdag"))
        (unless hide-some-holidays
          (holiday-fixed 2 2 "Kyndelsmässodagen"))
        (holiday-fixed 2 14 "Alla hjärtans dag")

        ;; fettisdagen
        (filter-visible-calendar-holidays
         (list
          (list
           (calendar-gregorian-from-absolute
            (calendar-dayname-on-or-before
             2 (- (påskdagen displayed-year) 47)))
           "Fettisdagen")))

        (holiday-fixed 3 8 "Internationella kvinnodagen")
        (unless hide-some-holidays
          (holiday-fixed 3 12 "Kronprinsessans namnsdag"))
        (holiday-fixed 3 25 "Vårfrudagen")

        ;; mer påsk
        (filter-visible-calendar-holidays
         (mapcar
          (lambda (dag)
            (list (calendar-gregorian-from-absolute
                   (+ (påskdagen displayed-year) (car dag)))
                  (cadr dag)))
          (if hide-some-holidays
              '(( -3 "Skärtorsdagen"))
            '(( -7 "Palmsöndagen")
              ( -4 "Dymmelonsdagen")
              ( -3 "Skärtorsdagen")))))

        (unless hide-some-holidays
          (holiday-fixed 4 30 "Konungens födelsedag"))
        (unless hide-some-holidays
          (holiday-fixed 4 1 "Första april"))
        (holiday-fixed 4 30 "Valborgsmässoafton")
        (holiday-float 5 0 -1 "Mors dag")
        (holiday-fixed 6 6 "Sveriges nationaldag")
        (unless hide-some-holidays
          (holiday-fixed 7 14 "Kronprinsessans födelsedag"))
        (unless hide-some-holidays
          (holiday-fixed 8 8 "Drottningens namnsdag"))
        (holiday-fixed 10 24 "FN-dagen")
        (holiday-float 11 0 2 "Fars dag")
        (unless hide-some-holidays
          (holiday-fixed 11 6 "Gustaf Adolfsdagen"))
        (holiday-fixed 11 10 "Mårtensafton")
        (holiday-float 12 0 -4 "Första advent" 24)
        (holiday-float 12 0 -3 "Andra advent" 24)
        (holiday-float 12 0 -2 "Tredje advent" 24)
        (holiday-float 12 0 -1 "Fjärde advent" 24)
        (holiday-fixed 12 10 "Nobeldagen")
        (holiday-fixed 12 13 "Lucia")
        (unless hide-some-holidays
          (holiday-fixed 12 23 "Drottningens födelsedag"))
        (holiday-fixed 12 24 "Julafton")
        (holiday-fixed 12 31 "Nyårsafton")))

;;; Solstånd, dagjämningar, vinter- och sommartid

(setq solar-holidays
      (if hide-some-holidays
          nil
        '((if (fboundp 'atan)
              (solar-equinoxes-solstices))
          (if (progn
                (require 'cal-dst)
                t)
              (funcall 'holiday-sexp calendar-daylight-savings-starts
                       '(format "Sommartid börjar %s"
                                (if
                                    (fboundp 'atan)
                                    (solar-time-string
                                     (/ calendar-daylight-savings-starts-time
                                        (float 60))
                                     calendar-standard-time-zone-name)
                                  ""))))
          (funcall 'holiday-sexp calendar-daylight-savings-ends
                   '(format "Vintertid börjar %s"
                            (if
                                (fboundp 'atan)
                                (solar-time-string
                                 (/ calendar-daylight-savings-ends-time
                                    (float 60))
                                 calendar-daylight-time-zone-name)
                              ""))))))