#target InDesign
//DESCRIPTION: Farbzuweisung für Ferien
/*
+ Anwendungsbereich: Kalender
+ Funktion:
1. Script sucht nach Zeitspannen (z.B.Ferientage von 7.7. bis 15.9.) in einem Jahr
2. Script weist den Tabellenzeilen mit den entsprechenden Fundstellen
eine auswählbare Hintergrundfarbe zu
+ Voraussetzungen für die fehlerfreie Ausführung:
1. Kalender ist mittels Tabellen aufgebaut (Habe ich jeden Monat in einer Tabelle)
2. Der Eintrag für Monat und Jahr hat folgendes Format "Monat Jahr" z.B. "Januar 2011" (NUR Monat kein Jahr)
3. Auf einer Seite befindet sich jeweils nur ein Monat (Alle Monate auf einer Seite(Wandplaner))
4. Die Tabelle mit den farblich zu hinterlegenden Ferientagen befindet sich
auf der gleichen Seite wie der Eintrag für Monat und Jahr (Habe Ja nur eine Seite)
5. In dieser Tabelle (Punkt 4) findet sich der Ausdruck "Mo" (für Montag) (Ist vorhanden)
*/
var _dok = app.activeDocument;
var m;
var _antwort = true;
var _monatMap = idsMap();
_monatMap.pushItem(1,"Januar");
_monatMap.pushItem(2,"Februar");
_monatMap.pushItem(3,"März");
_monatMap.pushItem(4,"April");
_monatMap.pushItem(5,"Mai");
_monatMap.pushItem(6,"Juni");
_monatMap.pushItem(7,"Juli");
_monatMap.pushItem(8,"August");
_monatMap.pushItem(9,"September");
_monatMap.pushItem(10,"Oktober");
_monatMap.pushItem(11,"November");
_monatMap.pushItem(12,"Dezember");
if (app.scriptPreferences.version >= 6) {
while (_antwort) {
app.doScript(main, ScriptLanguage.JAVASCRIPT , [], UndoModes.ENTIRE_SCRIPT, "Farbzuweisungen Ferientage");
_antwort = confirm("Möchten Sie weitere Ferientage eingeben?");
}
} else {
while (_antwort) {
main();
_antwort = confirm("Möchten Sie weitere Ferientage eingeben?");
}
}
function main () {
var _ersterTag;
var _monatJahr;
var _letzterTag ;
var _eingabe = dialog();
var _jahr = _eingabe[0];
var _tagBeginn = _eingabe[1];
var _monatBeginn = _eingabe[2];
var _tagEnde = _eingabe[3];
var _monatEnde = _eingabe[4];
var _farbeFeiertage = _eingabe[5];
if (_monatBeginn == _monatEnde) { //Beginn und Ende der Ferien im gleichen Monat
_monatJahr = _monatMap.getItem(_monatBeginn) + " " + _jahr;
_ersterTag = _tagBeginn;
_letzterTag = _tagEnde;
mark(markInside,[_monatJahr,_farbeFeiertage,_ersterTag,_letzterTag]);
} else { // ansonsten bis zum Ende des Monats mit der Farbe hinterlegen
_monatJahr = _monatMap.getItem(_monatBeginn) + " " + _jahr;
_ersterTag = _tagBeginn;
mark(markEnd,[_monatJahr,_farbeFeiertage,_ersterTag,_letzterTag]); // Bis zum Ende des Monats mit der Farbe hinterlegen
for (m = _monatBeginn; m < 12; m++) {
if ( (m + 1) == _monatEnde) { // Vergeleich ob der Monat mit dem Ferienende schon erreicht ist
_monatJahr = _monatMap.getItem(m+1) + " " + _jahr;
_letzterTag = _tagEnde;
mark(markBegin,[_monatJahr,_farbeFeiertage,_ersterTag,_letzterTag]); // Vom 1. des Monats bis zum Ende der Ferientage mit der Farbe hinterlegen
break;
} else { // ansonsten den ganzen Monat mit der Farbe hinterlegen
_monatJahr = _monatMap.getItem(m+1) + " " + _jahr;
mark(markAll,[_monatJahr,_farbeFeiertage,_ersterTag,_letzterTag]);
}
}
}
}
function dialog () {
var _gui = app.dialogs.add({name:"Zeitraum und Farbe für die Ferientage festlegen"});
var _minWidthJahr = 40;
var _minWidthMonat = 45;
var _minWidthTag = 45;
var _minWidthFarbe = 60;
var _minWidthBox = 300;
with (_gui) {
with (dialogColumns.add()) {
with (borderPanels.add()) {
with (dialogColumns.add()) {
with (dialogRows.add()) {
staticTexts.add( {staticLabel: "Kalenderjahr:", minWidth: _minWidthMonat} );
var _jahr = textEditboxes.add( {editContents: "2012", minWidth: _minWidthJahr} );
}
}
}
with (borderPanels.add()) {
with (dialogColumns.add()) {
with (dialogRows.add()) {
staticTexts.add( {staticLabel: "Ferienbeginn:" } );
}
with (dialogRows.add()) {
staticTexts.add( {staticLabel: "Tag:"} );
var _tageAuswahl = ["1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31"];
var _tagBeginn = integerComboboxes.add({stringList: _tageAuswahl, editValue: 1, minWidth: _minWidthTag});
staticTexts.add( {staticLabel: "Monat:", minWidth: _minWidthMonat} );
var _monateAuswahl = ["1","2","3","4","5","6","7","8","9","10","11","12"];
var _monatBeginn = integerComboboxes.add({stringList: _monateAuswahl, editValue: 1, minWidth: _minWidthMonat});
}
}
}
with (borderPanels.add()) {
with (dialogColumns.add()) {
with (dialogRows.add()) {
staticTexts.add( {staticLabel: "Ferienende:"} );
}
with (dialogRows.add()) {
staticTexts.add( {staticLabel: "Tag:"} );
var _tagEnde = integerComboboxes.add({stringList: _tageAuswahl, editValue: 1, minWidth: _minWidthTag});
staticTexts.add( {staticLabel: "Monat:", minWidth: _minWidthMonat} );
var _monatEnde = integerComboboxes.add({stringList: _monateAuswahl, editValue: 1, minWidth: _minWidthMonat});
}
}
}
with (borderPanels.add()) {
with (dialogColumns.add()) {
with (dialogRows.add()) {
staticTexts.add( {staticLabel: "Farbe für die Feiertage:"} );
}
with (dialogRows.add()) {
staticTexts.add( {staticLabel: "Farbe:"} );
var _farbfelder = _dok.swatches.everyItem().name;
var _farbe = dropdowns.add({ stringList: _farbfelder, selectedIndex: 2, minWidth: _minWidthFarbe});
}
}
}
}
}
if (_gui.show() == false) {
_gui.destroy();
} else {
var _eingabe = [_jahr.editContents,_tagBeginn.editValue,_monatBeginn.editValue,_tagEnde.editValue,_monatEnde.editValue, _farbfelder[_farbe.selectedIndex]];
return _eingabe;
}
}
// Hintergrundfarbe für die Tabellen-Zeile zuweisen
function mark (markTable, _args) {
var _monatJahr = _args[0]; //"Februar 2011"
var _farbeFerientage = _args[1]; // Name der Farbe
var _ersteZeile = _args[2] - 1;
var _letzteZeile = _args[3] - 1;
var _suchErgebnis = find ([_monatJahr,""]);
var _gesuchteSeite = _suchErgebnis[0].parentTextFrames[0].parentPage;
_dok.select(_gesuchteSeite.textFrames.everyItem());
app.findGrepPreferences = NothingEnum.nothing;
app.changeGrepPreferences = NothingEnum.nothing;
app.findGrepPreferences.findWhat = "Mo\\>"; // Suche nach Mo, um die zum Monat zugehoerige Tabelle mit den Wochentagen zu identifiziern
// Alle Elemente der Auswahl werden durchlaufen, da Selection[0] nicht in jedem Fall der gewünschte Textrahmen
for (var s=0; s < _dok.selection.length; s++) {
var _suchErgebnisWT = _dok.selection[s].findGrep();
if (_suchErgebnisWT.length > 0) {
break; //For-Schleife bricht ab, sobald ein Ergebnis fuer "Mo" gefunden ist.
}
}
app.findGrepPreferences = NothingEnum.nothing;
app.changeGrepPreferences = NothingEnum.nothing;
var _gesuchteTabelle = _suchErgebnisWT[0].insertionPoints.firstItem().parent.parent;
app.activeDocument.select(_gesuchteTabelle);
markTable (_ersteZeile,_letzteZeile,_farbeFerientage,_gesuchteTabelle);
}
// markieren Innerhalb eines Monats
function markInside (_begin,_end,_color,_table) {
_table.rows.itemByRange(_begin,_end).fillColor = _dok.colors.itemByName(_color);
}
// Anfang der Ferien bis zum Ende des Monats
function markEnd (_begin,_end,_color,_table) {
_end = _table.rows.length - 1;
_table.rows.itemByRange(_begin,_end).fillColor = _dok.colors.itemByName(_color);
}
// Anfang des Monats bis Ferientag Ende
function markBegin (_begin,_end,_color,_table) {
_begin = 0;
_table.rows.itemByRange(_begin,_end).fillColor = _dok.colors.itemByName(_color);
}
// Gesamtes Monat
function markAll (_begin,_end,_color,_table) {
_begin = 0;
_end = _table.rows.length - 1;
_table.rows.itemByRange(_begin,_end).fillColor = _dok.colors.itemByName(_color);
}
function find (_args) {
var _grep = _args[0]
var _style = _args[1]
app.findGrepPreferences = NothingEnum.nothing;
app.changeGrepPreferences = NothingEnum.nothing;
app.findGrepPreferences.findWhat = _grep
app.findGrepPreferences.appliedCharacterStyle = _style;
_ergebnis = app.activeDocument.findGrep();
app.findGrepPreferences = NothingEnum.nothing;
app.changeGrepPreferences = NothingEnum.nothing;
return _ergebnis;
}
/*
+ Hashmap for JavaScript
+ based on http://www.mojavelinux.com/articles/javascript_hashes.html by Dan Allen.
*/
function idsMap () {
return {
length : 0,
items : [],
removeItem : function(_key) {
var _previous;
if (typeof(this.items[_key]) != 'undefined') {
this.length--;
var _previous = this.items[_key];
delete this.items[_key];
}
return _previous;
},
getItem : function(_key) {
return this.items[_key];
},
pushItem : function(_key, _value) {
var _previous;
if (typeof(_value) != 'undefined') {
if (typeof(this.items[_key]) == 'undefined') {
this.length++;
}
else {
_previous = this.items[_key];
}
this.items[_key] = _value;
}
return _previous;
},
hasItem : function(_key) {
return typeof(this.items[_key]) != 'undefined';
},
clear : function() {
for (var i in this.items) {
delete this.items[i];
}
this.length = 0;
}
}
}