
Calendarikko Script for Adobe Illustrator
Description
The calendarikko.jsx
script is designed for Adobe Illustrator CC+ and was created by Alexander Ladygin. This script allows users to quickly create a customizable calendar grid, and even multiple grids within one document. It offers extensive functionality for customization, enabling users to flexibly adjust the grid to their needs. The script also allows users to update the calendar content for another year without changing the original state.
Author Information
- Author: Alexander Ladygin
- Email: i@ladygin.pro
- Website: www.ladyginpro.ru
Features
- Date Range Settings:
- Start Year: Specify the starting year for the calendar.
- End Year: Specify the ending year for the calendar.
- Start Month: Specify the starting month for the calendar.
- End Month: Specify the ending month for the calendar.
- Language Support:
- Choose the language for the calendar grid (English, Ukrainian, Deutsch, French, Spanish, Italian, Danish).
- Template Options:
- Various month arrangement templates (e.g., 3×4, 4×3, 6×2-top, circle).
- Day of the Week Styles:
- Choose the style for day of the week headers (One letter, Short form, Full word).
- Specify weekends with their own style.
- Calendar Standards:
- Choose between European or American standards for filling out the calendar.
- Frame and Size Settings:
- Set the frame size for creating the calendar.
- Fit the calendar within artboard borders or selected element borders.
- Custom size options for width, height, gutter X, and gutter Y.
- Text Frame Options:
- Create connections between text frames (threaded text).
- Margin and Padding:
- Specify outer margins and internal padding.
- Calendar Naming:
- Assign a name to the calendar to create multiple calendars in one document.
- Additional Display Settings:
- Position of day of the week headers (Top, Bottom, Top & Bottom).
- Position of week numbers (Left, Right, Left & Right).
- Options to display day of the week headers, week numbers, month title, year in month header, and month number in month title.
- Enable or disable display of days of other months.
- Shapes for Frames:
- Create or select symbols for the background of each month.
- Options to create new symbols, use existing ones, or fit symbols to the frame.
- Holidays and Compact Mode:
- Specify holidays with their own style.
- Enable compact mode to reduce the maximum number of lines in a month to 5.
- Replacement and Update Options:
- Replace calendar content with extended options for replacement.
- Select calendars and symbols to replace with new ones.
Usage
- Prerequisites:
- Ensure you have Adobe Illustrator CC+ installed.
- Running the Script:
- Open the
calendarikko.jsx
script in Adobe Illustrator. - The script will check if there are any objects selected.
- If objects are selected, the GUI will appear.
- GUI Components:
- Date Range Settings: Specify the start and end years and months.
- Language Support: Choose the language for the calendar.
- Template Options: Select month arrangement templates.
- Day of the Week Styles: Choose the style for day of the week headers and specify weekends.
- Calendar Standards: Choose between European or American standards.
- Frame and Size Settings: Set the frame size and fit options.
- Text Frame Options: Enable or disable threaded text frames.
- Margin and Padding: Specify outer margins and internal padding.
- Calendar Naming: Assign a name to the calendar.
- Additional Display Settings: Set the position of day of the week headers and week numbers, and enable or disable various display options.
- Shapes for Frames: Create or select symbols for the calendar frame background.
- Holidays and Compact Mode: Specify holidays and enable compact mode.
- Replacement and Update Options: Replace calendar content and select calendars and symbols to replace.
- Buttons:
- Create Calendar: Create a new calendar with specified parameters.
- Replace: Open a new window with extended replacement options.
- Cancel: Close the GUI without applying changes.
- OK: Apply the calendar settings and create or update the calendar.
- Settings:
- The script saves settings to a JSON file in the user’s documents folder.
- Settings are loaded automatically when the script is run.
Additional Information
- If no objects are selected when the script is run, an alert will prompt the user to select objects.
- The script includes helper functions for handling input events and customization options.
Notes
- When changing the calendar, the symbol will always be replaced to adjust its size to the possible new size of the calendar.
- You can create multiple calendars in one document by giving each a unique name.
Contact
For any questions or support, you can contact the author at i@ladygin.pro or visit www.ladyginpro.ru.
JavaScript
/*
Author: Alexander Ladygin (i@ladygin.pro)
Program version: Adobe Illustrator CC+ (presumably in Adobe Illustrator CS6 - did not test)
Name: calendarikko.jsx;
Copyright (c) 2018
www.ladyginpro.ru
*/
$.errorMessage = function (err) {alert(err + '\n' + err.line);};
$.appName = {indesign: (BridgeTalk.appName.toLowerCase() === 'indesign'),photoshop: (BridgeTalk.appName.toLowerCase() === 'photoshop'),illustrator: (BridgeTalk.appName.toLowerCase() === 'illustrator')};
$.color = function (a, v) {if (a) {if (typeof a === 'string') {a = a.toLocaleLowerCase();}}else {return undefined;}if ((a === 'hex') && $.appName.illustrator) {if (!v) {return new RGBColor();}else {if (v === 'random') return $.color('rgb', v);else return $.hexToColor(v, 'RGB');}}else if ((a === 'cmyk') || (a === 'cmykcolor')) {var c = new CMYKColor(), b = [];if (v) {b = b.concat(v);if (typeof v === 'string' && v.toLocaleLowerCase() === 'random') {b = [Math.floor(Math.random() * 100), Math.floor(Math.random() * 100), Math.floor(Math.random() * 100), Math.floor(Math.random() * 100)];}else {for (var i = 0; i < b.length; i++) {if (b[i] === 'random') {b[i] = Math.floor(Math.random() * 100);}}}c.cyan = parseInt(b[0]);c.magenta = parseInt(b[1]);c.yellow = parseInt(b[2]);c.black = parseInt(b[3]);}return c;}else if ((a === 'rgb') || (a === 'rgbcolor') || ((a === 'hex') && $.appName.photoshop)) {var c = new RGBColor(), b = [];if (v) {b = b.concat(v);if (typeof v === 'string' && v.toLocaleLowerCase() === 'random') {b = [Math.floor(Math.random() * 255), Math.floor(Math.random() * 255), Math.floor(Math.random() * 255)];}else {for (var i = 0; i < b.length; i++) {if (b[i] === 'random') {b[i] = Math.floor(Math.random() * 100);}}}if ($.appName.photoshop) {if (a !== 'hex' || (typeof v === 'string' && v.toLocaleLowerCase() === 'random')) {c.red = parseInt(b[0]);c.green = parseInt(b[1]);c.blue = parseInt(b[2]);}else {c.hexValue = b[0];}}else if ($.appName.illustrator) {c.red = parseInt(b[0]);c.green = parseInt(b[1]);c.blue = parseInt(b[2]);}}return c;}else if ((a === 'gray') || (a === 'grayscale') || (a === 'grayscale') || (a === 'graycolor')) {var c = new GrayColor(), b = [];if (v) {b = b.concat(v);if (typeof v === 'string' && v.toLocaleLowerCase() === 'random') {b = Math.floor(Math.random() * 100);}c.gray = parseInt(b[0] || b);}return c;}else if ((a === 'lab') || (a === 'labcolor')) {var c = new LabColor(), value, b = [];if (v) {b = b.concat(v);if (typeof v === 'string' && v.toLocaleLowerCase() === 'random') {b = [Math.floor(Math.random() * 100), Math.floor(-128 + Math.random() * 256), Math.floor(-128 + Math.random() * 256)];}else {for (var i = 0; i < b.length; i++) {if (i === 0) {if (b[i] === 'random') {b[i] = Math.floor(Math.random() * 100);}}else {if (b[i] === 'random') {b[i] = Math.floor(-128 + Math.random() * 256);}}}}c.l = parseInt(b[0]);c.a = parseInt(b[1]);c.b = parseInt(b[2]);}return c;}else if ((a === 'spot') || (a === 'spotcolor')) {var c = new SpotColor(), b = [];if (v) {b = b.concat(v);c.tint = parseInt(b[1]);}return c;}else if ((a === 'gradient') || (a === 'Gradient') || (a === 'GradientColor')) {var c = app.activeDocument.gradients.add(), g = new GradientColor(), b = [];if (v) {b = b.concat(v);for (var i = 0; i < b.length; i++) {c.gradientStops[i].color = $.color(b[i][0], b[i][1]);}g.gradient = c;}return g;}else if ((a === 'no') || (a === 'nocolor')) {return new NoColor();}};
$.toHex = function (color, hash) {if (color.typename !== 'RGBColor' && $.appName.illustrator) {color = $.convertColor(color, 'RGB');}return (hash ? '#' : '') + to(color.red) + to(color.green) + to(color.blue);function to(val) {var hex = val.toString(16);return hex.length === 1 ? '0' + hex : hex;}};
$.hexToColor = function (color, type) {color = color.toLocaleLowerCase();color = correct(color);function correct(a) {var l, b = '000000';if (a[0] === '#') {a = a.slice(1);}l = a.length;a = a + b.slice(l);return a;}return $.convertColor($.color('rgb', [parseInt((gc(color)).slice(0, 2), 16), parseInt((gc(color)).slice(2, 4), 16), parseInt((gc(color)).slice(4, 6), 16)]), type || 'rgb');function gc(h) {return (h.slice(0, 1) === '#') ? h.slice(1, 7) : h;}};
$.isColor = function (color) {if ((color.typename === 'GradientColor')|| (color.typename === 'PatternColor')|| (color.typename === 'CMYKColor')|| (color.typename === 'SpotColor')|| (color.typename === 'GrayColor')|| (color.typename === 'LabColor')|| (color.typename === 'RGBColor')|| (color.typename === 'NoColor')) {return true;}else {return false;}};
$.getColorValues = function (color) {if (color === undefined) {return undefined;}else if (color.typename === 'CMYKColor') {return [color.cyan, color.magenta, color.yellow, color.black];}else if (color.typename === 'RGBColor') {return [color.red, color.green, color.blue];}else if (color.typename === 'LabColor') {return [color.l, color.a, color.b];}else if (color.typename === 'SpotColor') {return [color.spotl, color.tint];}else if (color.typename === 'GrayColor') {return [color.gray];}else if (color.typename === 'NoColor') {return undefined;}else if (color.typename === 'GradientColor') {var colors = [], gradients = color.gradient.gradientStops;for (var i = 0; i < gradients.length; i++) {colors = colors.concat(gradients[i].color.getColorValues());}return colors;}};
CMYKColor.prototype.getColorValues = function () {return $.getColorValues(this);};
RGBColor.prototype.getColorValues = function () {return $.getColorValues(this);};
GrayColor.prototype.getColorValues = function () {return $.getColorValues(this);};
LabColor.prototype.getColorValues = function () {return $.getColorValues(this);};
NoColor.prototype.getColorValues = function () {return $.getColorValues(this);};
$.getUnits = function (val, def) {try {return 'px,pt,mm,cm,in,pc'.indexOf(val.slice(-2)) > -1 ? val.slice(-2) : def;}catch (e) {$.errorMessage('check units: " ' + e + ' "');}};
$.convertUnits = function (obj, b) {if (obj === undefined) {return obj;}if (b === undefined) {b = 'px';}if (typeof obj === 'number') {obj = obj + 'px';}if (typeof obj === 'string') {var unit = $.getUnits(obj),val = parseFloat(obj);if (unit && !isNaN(val)) {obj = val;}else if (!isNaN(val)) {obj = val; unit = 'px';}}if ($.appName.illustrator) {if (((unit === 'px') || (unit === 'pt')) && (b === 'mm')) {obj = parseFloat(obj) / 2.83464566929134;}else if (((unit === 'px') || (unit === 'pt')) && (b === 'cm')) {obj = parseFloat(obj) / (2.83464566929134 * 10);}else if (((unit === 'px') || (unit === 'pt')) && (b === 'in')) {obj = parseFloat(obj) / 72;}else if ((unit === 'mm') && ((b === 'px') || (b === 'pt'))) {obj = parseFloat(obj) * 2.83464566929134;}else if ((unit === 'mm') && (b === 'cm')) {obj = parseFloat(obj) * 10;}else if ((unit === 'mm') && (b === 'in')) {obj = parseFloat(obj) / 25.4;}else if ((unit === 'cm') && ((b === 'px') || (b === 'pt'))) {obj = parseFloat(obj) * 2.83464566929134 * 10;}else if ((unit === 'cm') && (b === 'mm')) {obj = parseFloat(obj) / 10;}else if ((unit === 'cm') && (b === 'in')) {obj = parseFloat(obj) * 2.54;}else if ((unit === 'in') && ((b === 'px') || (b === 'pt'))) {obj = parseFloat(obj) * 72;}else if ((unit === 'in') && (b === 'mm')) {obj = parseFloat(obj) * 25.4;}else if ((unit === 'in') && (b === 'cm')) {obj = parseFloat(obj) * 25.4;}return parseFloat(obj);}else if ($.appName.photoshop) {return parseFloat(obj);}};
String.prototype.getUnits = function () {try {var str = this.slice(-2),u = ['px', 'pt', 'mm', 'cm', 'in', 'pc'];for (var i = 0; i < u.length; i++) {if (str === u[i]) {return u[i];}}return false;}catch (e) {$.errorMessage('check units: " ' + e + ' "');}};
String.prototype.convertUnits = function (b) {return $.convertUnits(this.toString(), b);};
String.prototype.hexEncode = function () {var s = unescape(encodeURIComponent(this)), h = '';for (var i = 0; i < s.length; i++) h += s.charCodeAt(i).toString(16);return h;};
String.prototype.hexDecode = function () {var s = '';for (var i = 0; i < this.length; i += 2) s += String.fromCharCode(parseInt(this.substr(i, 2), 16));return decodeURIComponent(escape(s));};
Object.prototype.extend = function (userObject, deep) {try {for (var key in userObject) {if (this.hasOwnProperty(key)) {if (deep&& this[key] instanceof Object&& !(this[key] instanceof Array)&& userObject[key] instanceof Object&& !(userObject[key] instanceof Array)) {this[key].extend(userObject[key], deep);}else this[key] = userObject[key];}}return this;}catch (e) {$.errorMessage('$.objectParser() - error: ' + e);}};
Object.prototype.getNearby = function (prevOrNext) {var parent = this.parent,items = parent.pageItems,l = items.length;prevOrNext = prevOrNext || 'next';for (var i = 0; i < l; i++) {if (items[i] === this) {return (((prevOrNext === 'next') && (i + 1 < l)) ? items[i + 1] : (((prevOrNext === 'prev') && (i - 1 >= 0)) ? items[i - 1] : undefined));}}}
function parseMargin (value, ifErrReturnValue) {value = (typeof value === 'string' ? value.split(' ') : (value instanceof Array ? value : ''));if (!value.length) return ifErrReturnValue !== undefined ? ifErrReturnValue : [0, 0, 0, 0];if (value.length === 2) {value[2] = value[0];value[3] = value[1];}else if (value.length < 4) {var val = value[value.length - 1];for (var i = value.length; i < 4; i++) {value[i] = val;}}for (var i = 0; i < value.length; i++) {value[i] = $.convertUnits(value[i], 'px');}return value;}
function getBounds (items, bounds) {bounds = bounds || 'geometricBounds'; bounds = (bounds && bounds.toLowerCase().indexOf('bounds') === -1) ? bounds += 'Bounds' : bounds;var l = items.length, x = [], y = [], w = [], h = [];for (var i = 0; i < l; i++) {x.push(items[i][bounds][0]);y.push(items[i][bounds][1]);w.push(items[i][bounds][2]);h.push(items[i][bounds][3]);};return [Math.min.apply(null, x), Math.max.apply(null, y), Math.max.apply(null, w), Math.min.apply(null, h)];}
var scriptName = 'Calendarikko',
copyright = ' \u00A9 www.ladyginpro.ru',
settingFile = {
name: scriptName + '__setting.json',
folder: Folder.myDocuments + '/LA_AI_Scripts/'
},
$margins = '0',
$paddings = '0',
isShowReplaceWindow = false,
SYSTEMNAMES = {
prefix: 'clkko',
calendarName: 'full',
layer: 'layer',
frame: 'frame',
month: 'month',
body: 'body',
weekNames: 'weekNames',
weekNumbers: 'weekNumbers',
weekFrames: 'weekFrame',
symbol: 'symbol',
symbolName: '',
},
winForReplaceSize = null;
SYSTEMNAMES.symbolName = SYSTEMNAMES.prefix + SYSTEMNAMES.symbol;
function calendarikko(userOptions) {
var $date = new Date(),
options = {
startYear: $date.getFullYear(),
endYear: $date.getFullYear(),
startMonth: 1,
endMonth: 12,
frameWidth: 500,
frameHeight: 500,
columns_gutter: 0,
rows_gutter: 0,
gutter_x: 20,
gutter_y: 20,
fontSize: 'auto',
standart: 'us',
notStyles: false,
/*
eu: European
us: American
*/
linkFrames: false,
shapes: 'use-fill',
/*
none: None
create-new: Create new shape
use-fill: if the shape is created, use it and copy width, height, top, left, else create new shape
use-existing: if the shape is created, use it, else create new shape
*/
otherDays: 'fill',
enableFrames: {
day: true,
week: true,
month: true,
yearInMonth: true,
numberMonth: true,
},
margin: '0',
padding: '0',
compact_mode: false,
isReplace: false,
fontColor: {
body: {
type: 'cmyk',
values: [0, 0, 0, 100]
},
months: {
type: 'cmyk',
values: [0, 0, 0, 100]
},
bodyEmpty: {
type: 'cmyk',
values: [0, 0, 0, 20]
},
weekends: {
type: 'cmyk',
values: [0, 100, 100, 0]
},
weekNumbers: {
type: 'cmyk',
values: [0, 0, 0, 40]
},
},
weekends: [6, 7],
holidays: [
// '[day].[month]'
'01.01',
'07.01',
'23.02',
'08.03',
'01.05',
'09.05',
'12.06',
'04.11'
],
template: '3x4',
/*
3x4
4x3
6x2-top
6x2-bottom
6|6
left-bottom
top-right
full-top
full-bottom
circle
circle-compact
full-columns
full-rows
*/
preset: 'days-title-top, week-numbers-left',
/*
presets:
days-title-top
days-title-bottom
week-numbers-left
week-numbers-right
*/
language: 'ru',
daysFormat: 'shortForm',
systemNames: {
prefix: 'clkko',
calendarName: 'full',
layer: 'layer',
frame: 'frame',
month: 'month',
body: 'body',
weekNames: 'weekNames',
weekNumbers: 'weekNumbers',
weekFrames: 'weekFrame',
symbol: 'symbol',
symbolName: '',
},
names: {
ru: {
oneLetter: [
'П',
'В',
'С',
'Ч',
'П',
'С',
'В'
],
shortForm: [
'Пн',
'Вт',
'Ср',
'Чт',
'Пт',
'Сб',
'Вс'
],
fullWord: [
'Понедельник',
'Вторник',
'Среда',
'Четверг',
'Пятница',
'Суббота',
'Воскресенье'
],
weeks: {
oneLetter: 'Н',
shortForm: 'Нед',
fullWord: 'Недели',
},
months: [
'Январь',
'Февраль',
'Март',
'Апрель',
'Май',
'Июнь',
'Июль',
'Август',
'Сентябрь',
'Октябрь',
'Ноябрь',
'Декабрь'
]
},
en: {
oneLetter: [
'M',
'T',
'W',
'T',
'F',
'S',
'S'
],
shortForm: [
'Mon',
'Tue',
'Wed',
'Thu',
'Fri',
'Sat',
'Sun'
],
fullWord: [
'Monday',
'Tuesday',
'Wednesday',
'Thursday',
'Friday',
'Saturday',
'Sunday'
],
weeks: {
oneLetter: 'W',
shortForm: 'Wee',
fullWord: 'Weeks',
},
months: [
'January',
'February',
'March',
'April',
'May',
'June',
'July',
'August',
'September',
'October',
'November',
'December'
]
},
de: {
oneLetter: [
'S',
'M',
'D',
'M',
'D',
'F',
'S'
],
shortForm: [
'So',
'Mo',
'Di',
'Mi',
'Do',
'Fr',
'Sa'
],
fullWord: [
'Sonntag',
'Montag',
'Dienstag',
'Mittwoch',
'Donnerstag',
'Freitag',
'Samstag'
],
weeks: {
oneLetter: 'W',
shortForm: 'Woc',
fullWord: 'Woche',
},
months: [
'Januar',
'Februar',
'Mдrz',
'April',
'Mai',
'Juni',
'Juli',
'August',
'September',
'Oktober',
'November',
'Dezember'
]
},
fr: {
oneLetter: [
'D',
'T',
'W',
'T',
'F',
'S',
'S'
],
shortForm: [
'Dim',
'Lun',
'Mar',
'Mer',
'Jeu',
'Ven',
'Sam'
],
fullWord: [
'Dimanche',
'Lundi',
'Mardi',
'Mercredi',
'Jeudi',
'Vendredi',
'Samedi'
],
weeks: {
oneLetter: 'S',
shortForm: 'Sem',
fullWord: 'Semaine',
},
months: [
'Janvier',
'Fйvrier',
'Mars',
'Avril',
'Mai',
'Juin',
'Juillet',
'Aoыt',
'Septembre',
'Octobre',
'Novembre',
'Dйcembre'
]
},
es: {
oneLetter: [
'D',
'L',
'M',
'M',
'J',
'V',
'S'
],
shortForm: [
'Dom',
'Lun',
'Mar',
'Mer',
'Jeu',
'Ven',
'Sam'
],
fullWord: [
'Domingo',
'Lunes',
'Mardi',
'Mercredi',
'Jeudi',
'Vendredi',
'Samedi'
],
weeks: {
oneLetter: 'S',
shortForm: 'Sem',
fullWord: 'Semana',
},
months: [
'Enero',
'Febrero',
'Marzo',
'Abril',
'Mayo',
'Junio',
'Julio',
'Agosto',
'Septiembre',
'Octubre',
'Noviembre',
'Diciembre'
]
},
it: {
oneLetter: [
'D',
'L',
'M',
'M',
'G',
'V',
'S'
],
shortForm: [
'Dom',
'Lun',
'Mar',
'Mer',
'Gio',
'Ven',
'Sab'
],
fullWord: [
'Domenica',
'Lunedм',
'Martedм',
'Mercoledм',
'Giovedм',
'Venerdм',
'Sabato'
],
weeks: {
oneLetter: 'S',
shortForm: 'Set',
fullWord: 'Settimana',
},
months: [
'Gennaio',
'Febbraio',
'Marzo',
'Aprile',
'Maggio',
'Giugno',
'Luglio',
'Agosto',
'Settembre',
'Ottobre',
'Novembre',
'Dicembre'
]
},
dt: {
oneLetter: [
'D',
'M',
'D',
'W',
'D',
'V',
'Z'
],
shortForm: [
'Zo',
'Ma',
'Di',
'Wo',
'Do',
'Vr',
'Za'
],
fullWord: [
'Zondag',
'Maandag',
'Dinsdag',
'Woensdag',
'Donderdag',
'Vrijdag',
'Zaterdag'
],
weeks: {
oneLetter: 'W',
shortForm: 'Wee',
fullWord: 'Weeks',
},
months: [
'Januari',
'Februari',
'Maart',
'April',
'Mei',
'Juni',
'Juli',
'Augustus',
'September',
'Oktober',
'November',
'December'
]
},
uk: {
oneLetter: [
'н',
'п',
'в',
'с',
'ч',
'п',
'с'
],
shortForm: [
'нд',
'пн',
'вт',
'ср',
'чт',
'пт',
'сб'
],
fullWord: [
'Неділля',
'Понеділок',
'Вівторок',
'Середа',
'Четвер',
'П\'ятниця',
'Субота'
],
weeks: {
oneLetter: 'Т',
shortForm: 'Тиж',
fullWord: 'Тижні',
},
months: [
'Січень',
'Лютий',
'Березень',
'Квітень',
'Травень',
'Червень',
'Липень',
'Серпень',
'Вересень',
'Жовтень',
'Листопад',
'Грудень'
]
},
// português
po: {
oneLetter: [
's',
't',
'q',
'q',
's',
's',
'd'
],
shortForm: [
'Seg',
'Ter',
'Qua',
'Qui',
'Sex',
'Sáb',
'Dom'
],
fullWord: [
'Segunda',
'Terça',
'Quarta',
'Quinta',
'Sexta',
'Sábado',
'Domingo'
],
weeks: {
oneLetter: 'S',
shortForm: 'Sem',
fullWord: 'Semana',
},
months: [
'Janeiro',
'Fevereiro',
'Março',
'Abril',
'Maio',
'Junho',
'Julho',
'Agosto',
'Setembro',
'Outubro',
'Novembro',
'Dezembro'
]
},
}
}.extend(userOptions || {}, true);
if (options.systemNames.prefix.indexOf('_') < 0) {
options.systemNames.prefix = options.systemNames.calendarName + '_' + options.systemNames.prefix + '_';
}
if (!options.systemNames.symbolName) {
options.systemNames.symbolName = options.systemNames.prefix + options.systemNames.symbol;
}
// convert units
options.frameWidth = $.getUnits(options.frameWidth, false) ? $.convertUnits(options.frameWidth, 'px') : options.frameWidth;
options.frameHeight = $.getUnits(options.frameHeight, false) ? $.convertUnits(options.frameHeight, 'px') : options.frameHeight;
options.gutter_x = $.convertUnits(options.gutter_x, 'px');
options.gutter_y = $.convertUnits(options.gutter_y, 'px');
options.columns_gutter = $.convertUnits(options.columns_gutter, 'px');
options.rows_gutter = $.convertUnits(options.rows_gutter, 'px');
// global
var frameColumns = 7,
frameRows = (options.compact_mode ? 5 : 6),
totalCeils = frameColumns * frameRows;
daysFormatCorrectHeight = false,
shapesCreated = false;
// holidays
var holidaysMask = ',' + options.holidays.toString().replace(/ /g, '') + ',';
// styles
var fontSize = false,
lastYear = options.endYear,
lastMonth = options.endMonth,
framesCollection = [],
namePrefix = options.systemNames.prefix,
stylesName = {
months: namePrefix + 'months',
dayName: namePrefix + 'days-of-week',
weekends: namePrefix + 'weekends',
body: namePrefix + 'body',
bodyEmpty: namePrefix + 'body_prev-next-days',
weekNumbers: namePrefix + 'week_numbers',
doubleDays: namePrefix + 'double-days',
};
// set standart
var isUS = (options.standart === 'us'), __DTFLast;
if (isUS) {
__DTFLast = [options.names[options.language][options.daysFormat].pop()];
options.names[options.language][options.daysFormat] = __DTFLast.concat(options.names[options.language][options.daysFormat]);
}
// parse shapes
options.shapes = (options.shapes.length ? options.shapes.toString().toLowerCase() : 'create-new');
var bodyStyle = bodyEmptyStyle = phStyleMonth = phStyleDayName = phStyleWeekNumbers = charStyleWeekends = doubleDays = false;
// check and change of the variable values
var activeArt = activeDocument.artboards[activeDocument.artboards.getActiveArtboardIndex()],
$selRect, artWidth, artHeight;
function setRect() {
options.rect = options.rect ? options.rect : activeArt.artboardRect;
artWidth = options.rect[2] - options.rect[0];
artHeight = options.rect[1] - options.rect[3];
if (typeof options.frameWidth === 'string' && options.frameWidth.slice(0,3) === 'sel' && selection.length) {
$selRect = getBounds(selection, 'geometricBounds');
options.rect[0] = $selRect[0];
options.rect[2] = $selRect[2];
artWidth = options.rect[2] - options.rect[0];
}
if (typeof options.frameHeight === 'string' && options.frameHeight.slice(0,3) === 'sel' && selection.length) {
$selRect = getBounds(selection, 'geometricBounds');
options.rect[1] = $selRect[1];
options.rect[3] = $selRect[3];
artHeight = options.rect[1] - options.rect[3];
}
options.margin = parseMargin(options.margin);
if (options.frameWidth === 'selectionsize') {
options.margin[1] = 0;
options.margin[3] = 0;
}
if (options.frameHeight === 'selectionsize') {
options.margin[0] = 0;
options.margin[2] = 0;
}
options.padding = parseMargin(options.padding);
if (options.frameWidth === 'selectionsize') {
options.padding[1] = 0;
options.padding[3] = 0;
}
if (options.frameHeight === 'selectionsize') {
options.padding[0] = 0;
options.padding[2] = 0;
}
options.frameWidth = typeof options.frameWidth === 'number'
? options.frameWidth
: (typeof options.frameWidth === 'string'
? (((options.frameWidth.slice(0, 2).toLowerCase() === 'fi') || (options.frameWidth === 'selectionfit'))
? false
: (((options.frameWidth.slice(0, 3).toLowerCase() === 'art') || (options.frameWidth === 'selectionsize'))
? artWidth - options.margin[1] - options.margin[3]
: 500)
)
: 500);
options.frameHeight = typeof options.frameHeight === 'number'
? options.frameHeight
: (typeof options.frameHeight === 'string'
? (((options.frameHeight.slice(0, 2).toLowerCase() === 'fi') || (options.frameHeight === 'selectionfit'))
? false
: (((options.frameHeight.slice(0, 3).toLowerCase() === 'art') || (options.frameHeight === 'selectionsize'))
? artHeight - options.margin[0] - options.margin[2]
: 500)
)
: 400);
}
function createSpot (name, clr, swGroup) {
var spots = activeDocument.spots;
try {
var oldSpot = activeDocument.spots.getByName(name);
oldSpot.color = clr;
return activeDocument.swatches.getByName(name).color;
} catch (err) {
var newSpot = spots.add();
newSpot.name = name;
newSpot.color = clr;
newSpot.colorType = ColorModel.SPOT;
swGroup.addSpot(newSpot);
return activeDocument.swatches.getByName(name).color;
}
}
function createStyles() {
try { bodyStyle = activeDocument.paragraphStyles.getByName(stylesName.body); } catch (e) { options.notStyles = !1; }
try { bodyEmptyStyle = activeDocument.characterStyles.getByName(stylesName.bodyEmpty); } catch (e) { options.notStyles = !1; }
try { phStyleMonth = activeDocument.paragraphStyles.getByName(stylesName.months); } catch (e) { options.notStyles = !1; }
try { phStyleDayName = activeDocument.paragraphStyles.getByName(stylesName.dayName); } catch (e) { options.notStyles = !1; }
try { phStyleWeekNumbers = activeDocument.paragraphStyles.getByName(stylesName.weekNumbers); } catch (e) { options.notStyles = !1; }
try { charStyleWeekends = activeDocument.characterStyles.getByName(stylesName.weekends); } catch (e) { options.notStyles = !1; }
try { doubleDays = activeDocument.characterStyles.getByName(stylesName.doubleDays); } catch (e) { options.notStyles = !1; }
bodyStyle = bodyStyle || activeDocument.paragraphStyles.add(stylesName.body);
bodyEmptyStyle = bodyEmptyStyle || activeDocument.characterStyles.add(stylesName.bodyEmpty);
phStyleMonth = phStyleMonth || activeDocument.paragraphStyles.add(stylesName.months);
phStyleDayName = phStyleDayName || activeDocument.paragraphStyles.add(stylesName.dayName);
phStyleWeekNumbers = phStyleWeekNumbers || activeDocument.paragraphStyles.add(stylesName.weekNumbers);
charStyleWeekends = charStyleWeekends || activeDocument.characterStyles.add(stylesName.weekends);
doubleDays = doubleDays || activeDocument.characterStyles.add(stylesName.doubleDays);
// font color
var swGroup, swGroup_name = namePrefix + 'color_group';
try { swGroup = activeDocument.swatchGroups.getByName(swGroup_name); }
catch (err) {
swGroup = activeDocument.swatchGroups.add();
swGroup.name = swGroup_name;
}
options.fontColor = {
body: createSpot(namePrefix + 'color_body', $.color(options.fontColor.body.type, options.fontColor.body.values), swGroup),
months: createSpot(namePrefix + 'color_months', $.color(options.fontColor.months.type, options.fontColor.months.values), swGroup),
bodyEmpty: createSpot(namePrefix + 'color_bodyEmpty', $.color(options.fontColor.bodyEmpty.type, options.fontColor.bodyEmpty.values), swGroup),
weekends: createSpot(namePrefix + 'color_weekends', $.color(options.fontColor.weekends.type, options.fontColor.weekends.values), swGroup),
weekNumbers: createSpot(namePrefix + 'color_weekNumbers', $.color(options.fontColor.weekNumbers.type, options.fontColor.weekNumbers.values), swGroup),
};
if (!options.notStyles) {
// body
bodyStyle.paragraphAttributes.justification = Justification.CENTER;
// months
phStyleMonth.paragraphAttributes.justification = Justification.CENTER;
phStyleMonth.characterAttributes.fillColor = options.fontColor.months;
// dayName
phStyleDayName.paragraphAttributes.justification = Justification.CENTER;
phStyleDayName.characterAttributes.fillColor = options.fontColor.body;
// body
bodyStyle.characterAttributes.fillColor = options.fontColor.body;
bodyEmptyStyle.characterAttributes.fillColor = options.fontColor.bodyEmpty;
// week numbers
phStyleWeekNumbers.paragraphAttributes.justification = Justification.CENTER;
phStyleWeekNumbers.characterAttributes.fillColor = options.fontColor.weekNumbers;
// weekends
charStyleWeekends.characterAttributes.fillColor = options.fontColor.weekends;
// doubleDays
doubleDays.characterAttributes.horizontalScale = doubleDays.characterAttributes.verticalScale = 100;
}
}
function getDaysBefore() {
var str = '', isFill = options.otherDays === 'fill',
__date = new Date($date.getFullYear(), $date.getMonth()),
n = __date.getDay() - 1;
if (n < 0) {
n = new Date($date.getFullYear(), $date.getMonth(), n + 1).getDay();
}
while (n--) {
__date.setDate(__date.getDate() - 1);
str = (isFill ? __date.getDate() : ' ') + '\n' + str;
};
return (isUS ? ((isFill ? (__date.getDate() - 1 === 0 ? new Date(__date.getFullYear(), __date.getMonth(), __date.getDate() - 1).getDate() : __date.getDate() - 1) : ' ') + '\n') : '') + str;
}
function getDaysAfter(x) {
var str = '', isFill = options.otherDays === 'fill',
__date = new Date($date.getFullYear(), $date.getMonth() + 1);
for (var n = 0; n < x; n++) {
str += (isFill ? __date.getDate() : ' ') + '\n';
__date.setDate(__date.getDate() + 1);
};
return str;
}
function getContent() {
var localDate = $date,
currentYear = localDate.getFullYear(),
currentMonth = localDate.getMonth(),
str = getDaysBefore(), maxDays = 32,
allCeils = totalCeils;
str = str === '\n' ? '' : str;
var emptyCells = allCeils - (str.split('\n').length - 1);
for (var j = 0; j < maxDays; j++) {
localDate.setDate(j + 1);
if (localDate.getMonth() !== currentMonth) {
localDate.setMonth(currentMonth);
localDate.setFullYear(currentYear);
break;
}
str += (j + 1) + (j < maxDays - 1 ? '\n' : '');
emptyCells--;
}
str += getDaysAfter(emptyCells);
return str.slice(0, -1);
}
function setWeekends(frame) {
var j = options.weekends.length,
color = charStyleWeekends.characterAttributes.fillColor;
function process(day) {
var lines = frame.lines,
length = lines.length;
for (var i = 0; i < length; i++) {
!i ? i += day : i += day + (6 - day);
if (i < length) charStyleWeekends.applyTo(lines[i]);
}
}
while (j--) process(parseInt(options.weekends[j]) - 1);
}
function setHolidays(frame) {
var localDate = $date,
lines = frame.lines,
j = lines.length,
month = localDate.getMonth() + 1;
while (j--) {
if (holidaysMask.indexOf(',' + ('0' + lines[j].contents.replace(/\n/g, '')).slice(-2) + '.' + ('0' + month).slice(-2) + ',') > -1) {
charStyleWeekends.applyTo(lines[j]);
}
}
}
function setEmptyDays(frame) {
if (options.otherDays === 'fill') {
var words = frame.words,
l = words.length,
month = $date.getMonth(),
breakFirst = breakLast = false,
lastDay = new Date($date.getFullYear(), $date.getMonth() + 1, 0).getDate();
for (var j = 0; j < l; j++) {
if (parseInt(words[j].contents) === 1 && !breakFirst && !breakLast) breakFirst = true;
if (parseInt(words[j].contents) === lastDay && breakFirst) {
breakFirst = false;
breakLast = true;
continue;
}
if (!breakFirst) bodyEmptyStyle.applyTo(words[j]);
}
}
}
function getWeekNumber() {
var d = new Date(Date.UTC($date.getFullYear(), $date.getMonth(), $date.getDate()));
d.setUTCDate(d.getUTCDate() + 4 - (d.getUTCDay() || 7));
var yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));
return Math.ceil((((d - yearStart) / 86400000) + 1) / 7);
}
function getWeeksContent(weekNum) {
var weekStart = weekNum || getWeekNumber(),
length = weekStart + frameRows,
str = '';
for (var i = weekStart; i < length; i++) {
str += (('0' + i.toString()).slice(-2)) + '\n';
}
return str.slice(0, -1);
}
function normalizeRows (__frame) {
var separator = '',
strArr = __frame.contents.split('\r'),
words = __frame.words;
if (strArr.length > totalCeils) {
var l = strArr.length;
for (var i = j = totalCeils, x = 0; j < l; j++, x++) {
words[frameColumns * (frameRows - 1) + x].contents = (x ? separator : '') + words[frameColumns * (frameRows - 1) + x].contents + '/' + strArr[i + x];
doubleDays.applyTo(words[frameColumns * (frameRows - 1) + x]);
words[frameColumns * (frameRows - 1) + x].characterAttributes.size = doubleDays.characterAttributes.size;
words[frameColumns * (frameRows - 1) + x].characterAttributes.baselineShift = doubleDays.characterAttributes.baselineShift;
try { words[i].remove(); } catch (e) {}
}
if (__frame.textRanges[__frame.textRanges.length - 1].contents === '\r') __frame.textRanges[__frame.textRanges.length - 1].remove();
}
}
function isPreset (__preset) {
return options.preset.indexOf(__preset) > -1;
}
function createMonth ($layer, x, y, anchor_x, anchor_y, $frame) {
var monthGroup = ($frame && $frame.typename ? $frame : $layer.groupItems.add()),
frameWidthWithPadding = options.frameWidth - options.padding[1] - options.padding[3],
frameHeightWithPadding = options.frameHeight - options.padding[0] - options.padding[2],
rectDirection = anchor_y < 0 ? -1 : 1,
heightDayTitle = !options.enableFrames.day ? 0 : options.frameHeight / frameColumns / 2,
offsetDayTitle = !options.enableFrames.day ? 0 : 0,
heightMonthTitle = !options.enableFrames.month ? 0 : frameHeightWithPadding / frameColumns - offsetDayTitle,
heightArea = frameHeightWithPadding - heightMonthTitle - heightDayTitle - offsetDayTitle * 2,
widthWeeks = !options.enableFrames.week ? 0 : frameWidthWithPadding / 7 / 2,
area, frame,
monthTitle, monthTitleFrame, dayTitle, dayTitleFrame, doubleDayTitleFrame,
weeksTitle, weeksTitleFrame, doubleWeeksTitleFrame,
weeksNumbersTitle, weeksNumbersTitleFrame, doubleWeeksNumbersTitleFrame,
props = {
backdrop: {
x: (anchor_x + options.margin[3]) + ((options.frameWidth + options.gutter_x) * x),
y: ((anchor_y - options.margin[0] * rectDirection)) + ((options.frameHeight + options.gutter_y) * y),
w: options.frameWidth,
h: options.frameHeight,
},
frame: {
x: (anchor_x + options.margin[3]) + ((options.frameWidth + options.gutter_x) * x) + options.padding[3],
y: ((anchor_y - options.margin[0] * rectDirection)) + ((options.frameHeight + options.gutter_y) * y) - options.padding[0],
w: frameWidthWithPadding,
h: frameHeightWithPadding,
},
monthTitle: {
x: (anchor_x + options.margin[3]) + ((options.frameWidth + options.gutter_x) * x) + options.padding[3],
y: ((anchor_y - options.margin[0] * rectDirection)) + ((options.frameHeight + options.gutter_y) * y) - options.padding[0],
w: frameWidthWithPadding,
h: heightMonthTitle,
},
dayTitle: {
x: (anchor_x + options.margin[3] + widthWeeks) + ((options.frameWidth + options.gutter_x) * x) + options.padding[3],
y: ((anchor_y - options.margin[0] * rectDirection) - heightMonthTitle - offsetDayTitle) + ((options.frameHeight + options.gutter_y) * y) - options.padding[0],
w: frameWidthWithPadding - widthWeeks,
h: heightDayTitle,
},
weeksNumbersTitle: {
x: (anchor_x + options.margin[3]) + ((options.frameWidth + options.gutter_x) * x) + options.padding[3],
y: ((anchor_y - options.margin[0] * rectDirection) - heightMonthTitle - offsetDayTitle) + ((options.frameHeight + options.gutter_y) * y) - options.padding[0],
w: widthWeeks,
h: heightDayTitle,
},
weeksTitle: {
x: (anchor_x + options.margin[3]) + ((options.frameWidth + options.gutter_x) * x) + options.padding[3],
y: ((anchor_y - options.margin[0] * rectDirection) - heightMonthTitle - heightDayTitle - offsetDayTitle * 2) + ((options.frameHeight + options.gutter_y) * y) - options.padding[0],
w: widthWeeks,
h: heightArea,
},
body: {
x: (anchor_x + options.margin[3] + widthWeeks) + ((options.frameWidth + options.gutter_x) * x) + options.padding[3],
y: ((anchor_y - options.margin[0] * rectDirection) - heightMonthTitle - heightDayTitle - offsetDayTitle * 2) + ((options.frameHeight + options.gutter_y) * y) - options.padding[0],
w: frameWidthWithPadding - widthWeeks,
h: heightArea,
}
};
if (isPreset('week-numbers-right') && !isPreset('week-numbers-left')) {
props.weeksTitle.x += options.frameWidth - widthWeeks;
props.body.x -= widthWeeks;
props.dayTitle.x -= widthWeeks;
props.weeksNumbersTitle.x += options.frameWidth - widthWeeks;
}
else if (isPreset('week-numbers-right') && isPreset('week-numbers-left')) {
props.body.w -= widthWeeks;
props.dayTitle.w -= widthWeeks;
}
if (isPreset('days-title-bottom') && !isPreset('days-title-top')) {
props.weeksTitle.y += (heightDayTitle + offsetDayTitle * 2);
props.body.y += (heightDayTitle + offsetDayTitle * 2);
props.dayTitle.y -= heightArea;
props.weeksNumbersTitle.y -= heightArea;
}
else if (isPreset('days-title-bottom') && isPreset('days-title-top')) {
props.body.h -= (heightDayTitle + offsetDayTitle * 2);
props.weeksTitle.h -= (heightDayTitle + offsetDayTitle * 2);
}
// set name for month group
monthGroup.name = options.systemNames.prefix + options.systemNames.frame;
// create shape
createShapes(monthGroup, props);
// month title
if (options.enableFrames.month) {
if (!$frame) {
monthTitle = monthGroup.pathItems.rectangle(props.monthTitle.y, props.monthTitle.x, props.monthTitle.w, props.monthTitle.h),
monthTitleFrame = monthGroup.textFrames.areaText(monthTitle);
monthTitleFrame.name = options.systemNames.prefix + options.systemNames.month;
}
else {
monthTitleFrame = $frame.pageItems.getByName(options.systemNames.prefix + options.systemNames.month);
}
// set content & font size
monthTitleFrame.contents = options.names[options.language].months[$date.getMonth()];
if (options.enableFrames.numberMonth) {
monthTitleFrame.contents = ($date.getMonth() + 1) + ' ' + monthTitleFrame.contents;
} else {
monthTitleFrame.contents = monthTitleFrame.contents.replace(/{month}/g, ($date.getMonth() + 1));
}
if (options.enableFrames.yearInMonth) {
monthTitleFrame.contents += ' ' + $date.getFullYear();
} else {
monthTitleFrame.contents = monthTitleFrame.contents.replace(/{year}/g, $date.getFullYear());
}
}
// days title
if (options.enableFrames.day) {
if (!$frame) {
dayTitle = monthGroup.pathItems.rectangle(props.dayTitle.y, props.dayTitle.x, props.dayTitle.w, props.dayTitle.h),
dayTitleFrame = monthGroup.textFrames.areaText(dayTitle);
dayTitleFrame.name = options.systemNames.prefix + options.systemNames.weekNames;
}
else {
dayTitleFrame = $frame.pageItems.getByName(options.systemNames.prefix + options.systemNames.weekNames);
}
// set grid
dayTitleFrame.columnCount = frameColumns;
dayTitleFrame.columnGutter = options.columns_gutter;
// set content & font size
dayTitleFrame.contents = options.names[options.language][options.daysFormat].toString().replace(/,/g, '\n');
if (options.enableFrames.week) {
if (!$frame) {
weeksNumbersTitle = monthGroup.pathItems.rectangle(props.weeksNumbersTitle.y, props.weeksNumbersTitle.x, props.weeksNumbersTitle.w, props.weeksNumbersTitle.h),
weeksNumbersTitleFrame = monthGroup.textFrames.areaText(weeksNumbersTitle);
weeksNumbersTitleFrame.name = options.systemNames.prefix + options.systemNames.weekFrames;
}
else {
weeksNumbersTitleFrame = $frame.pageItems.getByName(options.systemNames.prefix + options.systemNames.weekFrames);
}
weeksNumbersTitleFrame.contents = options.names[options.language].weeks[options.daysFormat].toString().replace(/,/g, '\n');
}
}
// all days
if (!$frame) {
area = monthGroup.pathItems.rectangle(props.body.y, props.body.x, props.body.w, props.body.h);
frame = monthGroup.textFrames.areaText(area, TextOrientation.HORIZONTAL);
frame.name = options.systemNames.prefix + options.systemNames.body;
}
else {
frame = $frame.pageItems.getByName(options.systemNames.prefix + options.systemNames.body);
}
// frame push to collection
framesCollection.push(frame);
// body
if ($frame) {
activeDocument.characterStyles[0].applyTo(frame.textRange);
activeDocument.paragraphStyles[0].applyTo(frame.textRange);
}
bodyStyle.applyTo(frame.textRange);
// set days
frame.contents = getContent();
// set grid
frame.columnCount = frameColumns;
frame.rowCount = frameRows;
frame.columnGutter = options.columns_gutter;
frame.rowGutter = options.rows_gutter;
// weeks numbers
if (options.enableFrames.week) {
var weekNumbers = getWeekNumber();
if (!$frame) {
weeksTitle = monthGroup.pathItems.rectangle(props.weeksTitle.y, props.weeksTitle.x, props.weeksTitle.w, props.weeksTitle.h),
weeksTitleFrame = monthGroup.textFrames.areaText(weeksTitle);
weeksTitleFrame.name = options.systemNames.prefix + options.systemNames.weekNumbers;
}
else {
weeksTitleFrame = $frame.pageItems.getByName(options.systemNames.prefix + options.systemNames.weekNumbers);
}
// set grid
weeksTitleFrame.rowCount = frameRows;
weeksTitleFrame.rowGutter = options.rows_gutter;
// set content & font size
weeksTitleFrame.contents = getWeeksContent(weekNumbers);
// check empty weeks
weeksTitleFrame.contents = isNaN(parseInt(frame.contents.slice(-8))) ? weeksTitleFrame.contents.slice(0, -2) : weeksTitleFrame.contents;
}
// set styles
if (!options.notStyles) {
var autoFontSize = ((props.body.w > props.body.h) ? props.body.h / (frameColumns - 2 + options.columns_gutter / 2) : props.body.w / (frameRows + options.rows_gutter / 2)) / 2;
// set font size
if (fontSize === false) {
fontSize = (options.fontSize === 'auto' ? autoFontSize : (options.fontSize < 2.5 ? autoFontSize * options.fontSize : options.fontSize));
// paragraphStyles
bodyStyle.paragraphAttributes.spaceBefore = heightArea / frameRows;
phStyleDayName.paragraphAttributes.spaceBefore = heightDayTitle;
bodyStyle.characterAttributes.size = fontSize;
bodyStyle.characterAttributes.baselineShift = ((props.body.h / (frameColumns + options.columns_gutter / 2) - fontSize)) * -1.5;
doubleDays.characterAttributes.size = fontSize * 0.5;
doubleDays.characterAttributes.baselineShift = ((props.body.h / (frameColumns + options.columns_gutter / 2) - doubleDays.characterAttributes.size)) * -1;
}
}
// body set font size
// frame.textRange.characterAttributes.baselineShift = bodyStyle.characterAttributes.baselineShift;
// frame.textRange.characterAttributes.size = bodyStyle.characterAttributes.size;
// months
if (options.enableFrames.month) {
if (!options.notStyles) {
phStyleMonth.characterAttributes.size = heightMonthTitle * 0.7;
phStyleMonth.characterAttributes.baselineShift = heightMonthTitle * -0.175;
}
phStyleMonth.applyTo(monthTitleFrame.textRange);
}
// days
if (options.enableFrames.day) {
var monthsNames = options.names[options.language][options.daysFormat];
if (!options.notStyles) phStyleDayName.characterAttributes.size = options.daysFormat !== 'fullWord' ? heightDayTitle * 0.5 : (frameWidthWithPadding - widthWeeks) / frameColumns / (monthsNames.toString().replace(/,/g, '').length / monthsNames.length);
phStyleDayName.applyTo(dayTitleFrame.textRange);
if (!options.notStyles && daysFormatCorrectHeight === false) {
var dayTitleFrameOutline = dayTitleFrame.duplicate();
dayTitleFrameOutline.textRange.contents = 'Oy';
dayTitleFrameOutline = dayTitleFrameOutline.createOutline();
daysFormatCorrectHeight = dayTitleFrameOutline.height;
dayTitleFrameOutline.remove();
phStyleDayName.characterAttributes.baselineShift = (heightDayTitle * 1.15 - daysFormatCorrectHeight) / -2;
}
if (options.enableFrames.week) {
phStyleDayName.applyTo(weeksNumbersTitleFrame.textRange);
// if (!options.notStyles) {
weeksNumbersTitleFrame.textRange.characterAttributes.size = phStyleDayName.characterAttributes.size * 0.7;
weeksNumbersTitleFrame.textRange.characterAttributes.baselineShift = phStyleDayName.characterAttributes.baselineShift * 1.15;
// }
}
if (isPreset('days-title-bottom') && isPreset('days-title-top')) {
if ($frame){
var prevItem = dayTitleFrame.getNearby('next');
if (prevItem && prevItem.name === options.systemNames.prefix + options.systemNames.weekNames) prevItem.remove();
}
doubleDayTitleFrame = dayTitleFrame.duplicate();
doubleDayTitleFrame.top -= heightArea * ($frame ? -1 : 1);
if (options.enableFrames.week) {
if ($frame){
var prevItem = weeksNumbersTitleFrame.getNearby('next');
if (prevItem && prevItem.name === options.systemNames.prefix + options.systemNames.weekFrames) prevItem.remove();
}
doubleWeeksNumbersTitleFrame = weeksNumbersTitleFrame.duplicate();
doubleWeeksNumbersTitleFrame.top -= heightArea * ($frame ? -1 : 1);
}
}
}
// weeksTitleFrame
if (options.enableFrames.week) {
if (!options.notStyles) {
phStyleWeekNumbers.characterAttributes.size = ((widthWeeks < heightArea / frameRows) ? widthWeeks * 0.6 : fontSize);
phStyleWeekNumbers.paragraphAttributes.spaceBefore = heightArea / frameRows;
phStyleWeekNumbers.characterAttributes.baselineShift = ((widthWeeks < heightArea / frameRows) ? ((heightArea / (frameRows + options.rows_gutter / 2) - phStyleWeekNumbers.characterAttributes.size) * -0.6) : bodyStyle.characterAttributes.baselineShift);
}
bodyStyle.applyTo(weeksTitleFrame.textRange);
phStyleWeekNumbers.applyTo(weeksTitleFrame.textRange);
if (isPreset('week-numbers-right') && isPreset('week-numbers-left')) {
if ($frame){
var prevItem = weeksTitleFrame.getNearby('next');
if (prevItem && prevItem.name === options.systemNames.prefix + options.systemNames.weekNumbers) prevItem.remove();
}
doubleWeeksTitleFrame = weeksTitleFrame.duplicate();
doubleWeeksTitleFrame.left += (props.body.w + widthWeeks) * ($frame ? -1 : 1);
if ($frame){
var prevItem = weeksNumbersTitleFrame.getNearby('next');
if (prevItem && prevItem.name === options.systemNames.prefix + options.systemNames.weekFrames) prevItem.remove();
}
weeksNumbersTitleFrame = weeksNumbersTitleFrame.duplicate();
weeksNumbersTitleFrame.left += (props.body.w + widthWeeks) * ($frame ? -1 : 1);
if (doubleWeeksNumbersTitleFrame) {
if ($frame){
var prevItem = doubleWeeksNumbersTitleFrame.getNearby('next').getNearby('next').getNearby('next');
if (prevItem && prevItem.name === options.systemNames.prefix + options.systemNames.weekFrames) prevItem.remove();
}
doubleWeeksNumbersTitleFrame = doubleWeeksNumbersTitleFrame.duplicate();
doubleWeeksNumbersTitleFrame.left += (props.body.w + widthWeeks) * ($frame ? -1 : 1);
}
}
}
// set weekends
setWeekends(frame);
// set holidays
setHolidays(frame);
// set empty days
setEmptyDays(frame);
// normalize rows, example: 26/31
if (options.compact_mode) normalizeRows(frame);
}
function createShapes (placement, $props) {
var POSITION_MODE = 'backdrop'; // backdrop, frame
if (options.shapes.slice(0,1) === 'n') return;
var symbolFrame, symbolFrameItem, symbolFrameReplace,
sItems = activeDocument.symbolItems,
symbolGroup = activeDocument.groupItems.add(),
symbolName = options.systemNames.symbolName,
shapesCollection = [], $shapesDay, $shapesWeek;
// if options.shapes === 'use-'
if (options.shapes.slice(0,1) === 'u') {
try {
symbolFrame = activeDocument.symbols.getByName(symbolName);
var sItem = pasteSymbol();
// if options.shapes === 'use-fill'
if (options.shapes.split('-')[1][0] === 'f') {
sItem.width = $props.backdrop.w;
sItem.height = $props.backdrop.h;
sItem.position = [$props[POSITION_MODE].x, $props[POSITION_MODE].y];
symbolGroup.remove();
}
return sItem;
} catch (e) {}
}
// create backdrop shape
var shapeBackdrop = symbolGroup.pathItems.rectangle($props.backdrop.y, $props.backdrop.x, $props.backdrop.w, $props.backdrop.h);
shapesCollection.push(shapeBackdrop);
if (options.enableFrames.month) {
shapesCollection.push(symbolGroup.pathItems.rectangle($props.monthTitle.y, $props.monthTitle.x, $props.monthTitle.w, $props.monthTitle.h));
}
if (options.enableFrames.day) {
$shapesDay = symbolGroup.groupItems.add();
var $shapesDayW = $props.dayTitle.w / frameColumns;
for (var i = 0; i < frameColumns; i++) {
$shapesDay.pathItems.rectangle($props.dayTitle.y, $props.dayTitle.x + ($shapesDayW * i), $shapesDayW, $props.dayTitle.h);
}
shapesCollection.push($shapesDay);
if (options.enableFrames.week) {
if (isPreset('week-numbers-right') && isPreset('week-numbers-left')) {
$shapesDay.pathItems.rectangle($props.weeksNumbersTitle.y, $props.weeksNumbersTitle.x + $props.body.w + $props.weeksTitle.w, $props.weeksNumbersTitle.w, $props.weeksNumbersTitle.h);
}
}
if (isPreset('days-title-bottom') && isPreset('days-title-top')) {
var $dd = $shapesDay.duplicate();
$dd.top -= $props.body.h + $props.dayTitle.h;
shapesCollection.push($dd);
}
}
if (options.enableFrames.week) {
$shapesWeek = symbolGroup.groupItems.add();
var $shapesWeekH = $props.weeksTitle.h / frameRows;
for (var i = 0; i < frameRows; i++) {
$shapesWeek.pathItems.rectangle($props.weeksTitle.y - ($shapesWeekH * i), $props.weeksTitle.x, $props.weeksTitle.w, $shapesWeekH);
}
if (options.enableFrames.day) {
$shapesDay.pathItems.rectangle($props.weeksNumbersTitle.y, $props.weeksNumbersTitle.x, $props.weeksNumbersTitle.w, $props.weeksNumbersTitle.h);
if (isPreset('days-title-bottom') && isPreset('days-title-top')) {
$shapesDay.pathItems.rectangle($props.weeksNumbersTitle.y - $props.body.h - $props.weeksNumbersTitle.h, $props.weeksNumbersTitle.x, $props.weeksNumbersTitle.w, $props.weeksNumbersTitle.h);
}
}
shapesCollection.push($shapesWeek);
if (isPreset('week-numbers-right') && isPreset('week-numbers-left')) {
var $dd = $shapesWeek.duplicate();
$dd.left += $props.body.w + $props.weeksTitle.w;
shapesCollection.push($dd);
}
}
var $shapesBody = symbolGroup.groupItems.add(),
$shapesBodyW = $props.body.w / frameColumns;
$shapesBodyH = $props.body.h / frameRows;
for (var i = 0; i < frameColumns; i++) {
for (var j = 0; j < frameRows; j++) {
$shapesBody.pathItems.rectangle($props.body.y - ($shapesBodyH * j), $props.body.x + ($shapesBodyW * i), $shapesBodyW, $shapesBodyH);
}
}
shapesCollection.push($shapesBody);
function pasteSymbol (__frame, fillToFrame) {
symbolFrameItem = activeDocument.symbolItems.add(__frame || symbolFrame);
if (fillToFrame) {
symbolFrameItem.width = $props.backdrop.w;
symbolFrameItem.height = $props.backdrop.h;
}
symbolFrameItem.position = [$props[POSITION_MODE].x, $props[POSITION_MODE].y];
symbolFrameItem.moveToBeginning(placement);
return symbolFrameItem;
}
// create or replace symbol
try {
symbolFrame = activeDocument.symbols.getByName(symbolName);
if (!options.isReplace && !shapesCreated) {
// create symbol
symbolFrameReplace = activeDocument.symbols.add(symbolGroup, SymbolRegistrationPoint.SYMBOLCENTERPOINT);
// replace symbol items in document
var i = sItems.length;
if (i) {
while (i--) sItems[i].symbol = symbolFrameReplace;
}
else {
pasteSymbol(symbolFrameReplace).symbol = symbolFrameReplace;
shapesCreated = true;
}
// remove shapes
symbolGroup.remove();
symbolFrame.remove();
// set symbol name
symbolFrameReplace.name = symbolName + '_' + activeDocument.symbols.length;
}
else {
pasteSymbol(null, options.isReplace && symbolSizeFill.value);
}
}
catch(e){
// create symbol
symbolFrame = activeDocument.symbols.add(symbolGroup, SymbolRegistrationPoint.SYMBOLCENTERPOINT);
// set symbol name
symbolFrame.name = symbolName;
// paste symbol on artboard
pasteSymbol();
// remove shapes
symbolGroup.remove();
shapesCreated = true;
}
// clear shapes
var j = shapesCollection.length;
while (j--) shapesCollection[j].remove();
}
function reverseOrder (items, callback) {
var i = items.length;
while (i--) items[i].zOrder(ZOrderMethod.SENDTOBACK);
return items;
}
function createCalendarriko (__layer, isReplace) {
var $layer = (__layer && __layer.typename === 'Layer' ? __layer : activeDocument.layers.add()),
allMonths = options.endMonth,
allYears = options.endYear - options.startYear,
isSavePos = false;
options.isReplace = isReplace;
if (!isReplace) {
$layer.name = options.systemNames.prefix + options.systemNames.layer;
options.notStyles = !!options.notStyles;
}
else {
options.notStyles = true;
options.margin = [0, 0, 0, 0];
var frames = $layer.pageItems,
fl = frames.length;
options.rect = getBounds(frames, 'geometricBounds');
isSavePos = confirm('Save position?');
if (!isSavePos) while (fl--) frames[fl].remove();
}
setRect();
$date.setFullYear(options.startYear);
if (allYears > 0) {
allMonths = options.startMonth + (12 * allYears - options.startMonth) + options.endMonth;
}
createStyles();
if (!isSavePos) {
switch (options.template.toLowerCase()) {
case '3x4': {
var valX = 3, valY = 4;
if (options.frameWidth === false) options.frameWidth = (artWidth - options.margin[1] - options.margin[3] - (options.gutter_x * valX)) / valX + (options.gutter_x / valX);
if (options.frameHeight === false) options.frameHeight = (artHeight - options.margin[0] - options.margin[2] - (options.gutter_y * valY)) / valY + (options.gutter_y / valY);
for (var i = m = options.startMonth - 1, x = 0, y = 0; i < allMonths; i++, x++, m++) {
$date.setFullYear(options.startYear);
$date.setDate(1);
$date.setMonth(m);
if (x === valX) { x = 0; y--; }
createMonth($layer, x, y, options.rect[0], options.rect[1]);
}
break;
};
case '4x3': {
var valX = 4, valY = 3;
if (options.frameWidth === false) options.frameWidth = (artWidth - options.margin[1] - options.margin[3] - (options.gutter_x * valX)) / valX + (options.gutter_x / valX);
if (options.frameHeight === false) options.frameHeight = (artHeight - options.margin[0] - options.margin[2] - (options.gutter_y * valY)) / valY + (options.gutter_y / valY);
for (var i = options.startMonth - 1, m = options.startMonth - 1, x = 0, y = 0; i < allMonths; i++, x++, m++) {
$date.setFullYear(options.startYear);
$date.setDate(1);
$date.setMonth(m);
if (x === valX) { x = 0; y--; }
createMonth($layer, x, y, options.rect[0], options.rect[1]);
}
break;
};
case '6x2-top': {
var valX = 6, valY = 6;
if (options.frameWidth === false) options.frameWidth = (artWidth - options.margin[1] - options.margin[3] - (options.gutter_x * valX)) / valX + (options.gutter_x / valX);
if (options.frameHeight === false) options.frameHeight = (artHeight - options.margin[0] - options.margin[2] - (options.gutter_y * valY)) / valY + (options.gutter_y / valY);
for (var i = m = options.startMonth - 1, x = 0, y = 0; i < allMonths; i++, x++, m++) {
$date.setFullYear(options.startYear);
$date.setDate(1);
$date.setMonth(m);
if (x === valX) { x = 0; y--; }
createMonth($layer, x, y, options.rect[0], options.rect[1]);
}
break;
};
case '6x2-bottom': {
var valX = 6, valY = 6;
if (options.frameWidth === false) options.frameWidth = (artWidth - options.margin[1] - options.margin[3] - (options.gutter_x * valX)) / valX + (options.gutter_x / valX);
if (options.frameHeight === false) options.frameHeight = (artHeight - options.margin[0] - options.margin[2] - (options.gutter_y * valY)) / valY + (options.gutter_y / valY);
for (var i = m = options.startMonth - 1, x = 0, y = 0; i < allMonths; i++, x++, m++) {
$date.setFullYear(options.startYear);
$date.setDate(1);
$date.setMonth(m);
if (x === valX) { x = 0; y--; }
createMonth($layer, x, y, options.rect[0], options.rect[3] + ((options.frameHeight + options.gutter_y / 2) * 2));
}
break;
};
case '6|6': {
var valX = 6, valY = 6, anchorX = options.rect[0];
if (options.frameWidth === false) options.frameWidth = (artWidth - options.margin[1] - options.margin[3] - (options.gutter_x * valX)) / valX + (options.gutter_x / valX);
if (options.frameHeight === false) options.frameHeight = (artHeight - options.margin[0] - options.margin[2] - (options.gutter_y * valY)) / valY + (options.gutter_y / valY);
for (var i = m = options.startMonth - 1, x = 0, y = 0; i < allMonths; i++ , x-- , y-- , m++) {
$date.setFullYear(options.startYear);
$date.setDate(1);
$date.setMonth(m);
if (x === -valX) {
anchorX = options.rect[2] - (options.frameWidth + options.margin[1]);
y = 0;
}
createMonth($layer, 0, y, anchorX, options.rect[1]);
}
break;
};
case 'left-bottom': {
var valX = 7, valY = 6;
if (options.frameWidth === false) options.frameWidth = ((artWidth - options.margin[1] - options.margin[3]) - (options.gutter_x * valX)) / valX + (options.gutter_x / valX);
if (options.frameHeight === false) options.frameHeight = ((artHeight - options.margin[0] - options.margin[2]) - (options.gutter_y * valY)) / valY + (options.gutter_y / valY);
for (var i = m = options.startMonth - 1, x = 0, y = 0; i < allMonths; i++, m++) {
$date.setFullYear(options.startYear);
$date.setDate(1);
$date.setMonth(m);
createMonth($layer, x, y, options.rect[0], options.rect[1]);
y === -(valY - 1) ? x++ : y--;
}
break;
};
case 'top-right': {
var valX = 7, valY = 6;
if (options.frameWidth === false) options.frameWidth = ((artWidth - options.margin[1] - options.margin[3]) - (options.gutter_x * valX)) / valX + (options.gutter_x / valX);
if (options.frameHeight === false) options.frameHeight = ((artHeight - options.margin[0] - options.margin[2]) - (options.gutter_y * valY)) / valY + (options.gutter_y / valY);
for (var i = m = options.startMonth - 1, x = 0, y = 0; i < allMonths; i++, m++) {
$date.setFullYear(options.startYear);
$date.setDate(1);
$date.setMonth(m);
createMonth($layer, x, y, options.rect[0], options.rect[1]);
x === valX - 1 ? y-- : x++;
}
break;
};
case 'full-top': {
var valX = 12, valY = 1;
if (options.frameWidth === false) options.frameWidth = ((artWidth - options.margin[1] - options.margin[3]) - (options.gutter_x * valX)) / valX + (options.gutter_x / valX);
if (options.frameHeight === false) options.frameHeight = options.frameWidth / 1.2;
for (var i = m = options.startMonth - 1, x = 0, y = 0; i < allMonths; i++, x++, m++) {
$date.setFullYear(options.startYear);
$date.setDate(1);
$date.setMonth(m);
createMonth($layer, x, y, options.rect[0], options.rect[1]);
}
break;
};
case 'full-bottom': {
var valX = 12, valY = 1;
if (options.frameWidth === false) options.frameWidth = ((artWidth - options.margin[1] - options.margin[3]) - (options.gutter_x * valX)) / valX + (options.gutter_x / valX);
if (options.frameHeight === false) options.frameHeight = options.frameWidth / 1.2;
for (var i = m = options.startMonth - 1, x = 0, y = 0; i < allMonths; i++, x++, m++) {
$date.setFullYear(options.startYear);
$date.setDate(1);
$date.setMonth(m);
createMonth($layer, x, y, options.rect[0], options.rect[3] + options.frameHeight);
}
break;
};
case 'circle': {
var valX = 6, valY = 6, anchorX = (options.rect[2] - options.rect[0]) / 2, reverseY = false, reverseX = false;
if (options.frameWidth === false) options.frameWidth = ((artWidth - options.margin[1] - options.margin[3]) - (options.gutter_x * valX)) / valX + (options.gutter_x / valX);
if (options.frameHeight === false) options.frameHeight = (artHeight - options.margin[0] - options.margin[2] - (options.gutter_y * valY)) / valY + (options.gutter_y / valY);
for (var i = m = options.startMonth - 1, x = 0, y = 0; i < allMonths; i++ , m++) {
$date.setFullYear(options.startYear);
$date.setDate(1);
$date.setMonth(m);
if (y === -valY) {
y++;
reverseY = true;
}
if (x === 3) {
x--;
reverseX = true;
}
else if (x === -4) {
x++;
reverseX = false;
}
createMonth($layer, x, y, anchorX, options.rect[1]);
!reverseY ? y-- : y++;
!reverseX ? x++ : x--;
}
break;
};
case 'circle-compact': {
var valX = 6, valY = 6, anchorX = (options.rect[2] - options.rect[0]) / 2, reverseY = false, reverseX = false, $val = 0.5;
if (options.frameWidth === false) options.frameWidth = ((artWidth - options.margin[1] - options.margin[3]) - (options.gutter_x * valX)) / valX + (options.gutter_x / valX);
if (options.frameHeight === false) options.frameHeight = (artHeight - options.margin[0] - options.margin[2] - (options.gutter_y * valY)) / valY + (options.gutter_y / valY);
for (var i = m = options.startMonth - 1, x = 0, y = 0; i < allMonths; i++ , m++) {
$date.setFullYear(options.startYear);
$date.setDate(1);
$date.setMonth(m);
if (y === -valY) {
y++;
reverseY = true;
}
if (m === 12 * $val) {
anchorX -= options.frameWidth / 2;
}
if (x === 3 * $val) {
x -= $val;
reverseX = true;
}
else if (x === -4 * $val) {
x += $val;
reverseX = false;
}
createMonth($layer, x, y, anchorX, options.rect[1]);
!reverseY ? y-- : y++;
x = !reverseX ? x + $val : x - $val;
}
break;
};
case 'full-columns': {
var valX = allMonths, valY = 1;
if (options.frameWidth === false) options.frameWidth = ((artWidth - options.margin[1] - options.margin[3]) - (options.gutter_x * valX)) / valX + (options.gutter_x / valX);
if (options.frameHeight === false) options.frameHeight = (artHeight - options.margin[0] - options.margin[2]);
for (var i = m = options.startMonth - 1, x = 0, y = 0; i < allMonths; i++, x++, m++) {
$date.setFullYear(options.startYear);
$date.setDate(1);
$date.setMonth(m);
createMonth($layer, x, y, options.rect[0], options.rect[1]);
}
break;
};
case 'full-rows': {
var valX = 1, valY = allMonths;
if (options.frameWidth === false) options.frameWidth = (artWidth - options.margin[1] - options.margin[3]);
if (options.frameHeight === false) options.frameHeight = ((artHeight - options.margin[0] - options.margin[2]) - (options.gutter_y * valY)) / valY + (options.gutter_y / valY);
for (var i = m = options.startMonth - 1, x = 0, y = 0; i < allMonths; i++, y++, m++) {
$date.setFullYear(options.startYear);
$date.setDate(1);
$date.setMonth(m);
createMonth($layer, x, y, options.rect[0], options.rect[1]);
}
break;
};
}
}
else {
var __pos = [], a = 0;
while (fl--) {
__pos[a] = frames[fl].position.concat([
frames[fl].width,
frames[fl].height
]);
frames[fl].remove();
a++;
}
var $max = __pos.reverse().length,
gXbak = options.gutter_x,
gYbak = options.gutter_y;
options.margin = [0, 0, 0, 0];
options.gutter_x = options.gutter_y = 0;
for (var i = m = options.startMonth - 1, x = 0, y = 0; i < allMonths; i++, x++, m++) {
$date.setFullYear(options.startYear);
$date.setDate(1);
$date.setMonth(m);
if (x >= $max) {
y--;
options.gutter_x = gXbak;
options.gutter_y = gYbak;
}
else {
options.frameWidth = __pos[x][2];
options.frameHeight = __pos[x][3];
}
createMonth($layer, 0, y, (x < $max ? __pos[x][0] : __pos[$max - 1][0]), (x < $max ? __pos[x][1] : __pos[$max - 1][1]));
}
}
if (options.linkFrames) {
var selectionBak = selection,
items = $layer.pageItems,
l = items.length;
selection = null;
for (var i = 0; i < l; i++) {
try { items[i].pageItems.getByName(options.systemNames.prefix + options.systemNames.body).selected = true; } catch(e){}
}
if (app.executeMenuCommand instanceof Function) app.executeMenuCommand('threadTextCreate');
selection = selectionBak;
}
reverseOrder($layer.pageItems);
}
// run
this.create = function () {
createCalendarriko();
return this;
}
this.replace = function (layer) {
if (layer && layer.typename === 'Layer') {
createCalendarriko(layer, true);
} else {
try {
layer = (layer && !(layer instanceof Function)) || activeDocument.layers.getByName(options.systemNames.prefix + options.systemNames.layer);
} catch(e) {}
if (layer && layer.name === options.systemNames.prefix + options.systemNames.layer && layer.pageItems.length) {
createCalendarriko(layer, true);
}
else {
if (confirm('Sorry, calendar not found! Create new?')) {
createCalendarriko();
}
}
}
return this;
}
this.clear = function () {
try { activeDocument.layers.getByName(options.systemNames.prefix + options.systemNames.layer).remove(); } catch (e) {}
return this;
}
};
function inputNumberEvents (ev, _input, min, max, callback){
var step,
_dir = (ev.keyName ? ev.keyName.toLowerCase().slice(0,1) : '#none#'),
_value = parseFloat(_input.text),
units = (',px,pt,mm,cm,in,'.indexOf(_input.text.length > 2 ? (',' + _input.text.replace(/ /g, '').slice(-2) + ',') : ',!,') > -1 ? _input.text.replace(/ /g, '').slice(-2) : '');
min = (min === undefined ? 0 : min);
max = (max === undefined ? Infinity : max);
step = (ev.shiftKey ? 10 : (ev.ctrlKey ? .1 : 1));
if (isNaN(_value)) {
_input.text = min;
}
else {
_value = ( ((_dir === 'u') || (_dir === 'r')) ? _value + step : (((_dir === 'd') || (_dir === 'l')) ? _value - step : false) );
if (_value !== false) {
_value = (_value <= min ? min : (_value >= max ? max : _value))
_input.text = _value;
if (callback instanceof Function) callback(_value, _input, min, max, units);
else if (units) _input.text = parseFloat(_input.text) + ' ' + units;
}
else if (units) _input.text = parseFloat(_input.text) + ' ' + units;
}
}
function normalizeInputYear (val, item, min, max) {
if (item === __startYear) {
if (val > parseFloat(__endYear.text)) { __endYear.text = ((val + 1) >= max ? max + 1 : val); }
}
else if (item === __endYear) {
if (val < parseFloat(__startYear.text)) { __startYear.text = ((val - 1) < min ? min - 1 : val); }
}
}
function normalizeInputMonth (val, item, min, max) {
if (parseFloat(__startYear.text) === parseFloat(__endYear.text)) {
if (item === __startMonth) {
if (val > parseFloat(__endMonth.text)) { __endMonth.text = ((val + 1) >= max ? max : val); }
}
else if (item === __endMonth) {
if (val < parseFloat(__startMonth.text)) { __startMonth.text = ((val - 1) < min ? min : val); }
}
}
}
function getItemsNameCollection(items, prefix) {
var length = items.length,
collection = [];
for (var i = 0; i < length; i++) {
if (prefix) {
if ((items[i].name || '').match(prefix)) {
collection.push(items[i].name);
}
} else {
collection.push(items[i].name);
}
}
return collection;
}
function getItemsByPrefix(items) {
return getItemsNameCollection(items, SYSTEMNAMES.prefix + '_')
}
function getShapeSymbols() {
return getItemsNameCollection(activeDocument.symbols);
}
function getCalendarLayers() {
return getItemsByPrefix(activeDocument.layers);
}
var symbolsCollection = getShapeSymbols();
var isSymbolsCollection = !!symbolsCollection.length;
var layersWithCalendarCollection = getCalendarLayers();
var isLayersWithCalendar = !!layersWithCalendarCollection.length;
var win = new Window('dialog', scriptName + copyright),
globalGroup = win.add('group');
globalGroup.orientation = 'column';
globalGroup.alignChildren = 'fill';
with (globalGroup.add('group')) {
orientation = 'row';
alignChildren = ['fill', 'fill'];
with (add('panel')) {
orientation = 'row';
alignChildren = ['fill', 'fill'];
with (add('group')) {
orientation = 'column';
alignChildren = 'fill';
add('statictext', undefined, 'Start Year');
var __startYear = add('edittext', undefined, new Date().getFullYear());
__startYear.addEventListener('keydown', function(e) { inputNumberEvents(e, __startYear, 1970, Infinity, normalizeInputYear); });
__startYear.addEventListener('change', function (e) { normalizeInputYear(parseInt(__startYear.text), __startYear, 1970, Infinity); });
add('statictext', undefined, 'Start Month');
var __startMonth = add('edittext', undefined, 1);
__startMonth.addEventListener('keydown', function(e) { inputNumberEvents(e, __startMonth, 1, 12, normalizeInputMonth); });
__startMonth.addEventListener('change', function(e) { if (parseInt(this.text) > 12) this.text = '12'; else if (parseInt(this.text) <= 1) this.text = '1'; });
}
with (add('group')) {
orientation = 'column';
alignChildren = 'fill';
add('statictext', undefined, 'End Year');
var __endYear = add('edittext', undefined, new Date().getFullYear());
__endYear.addEventListener('keydown', function(e) { inputNumberEvents(e, __endYear, 1970, Infinity, normalizeInputYear); });
__endYear.addEventListener('change', function (e) { normalizeInputYear(parseInt(__endYear.text), __endYear, 1970, Infinity); });
add('statictext', undefined, 'End Month');
var __endMonth = add('edittext', undefined, 12);
__endMonth.addEventListener('keydown', function(e) { inputNumberEvents(e, __endMonth, 1, 12, normalizeInputMonth); });
__endMonth.addEventListener('change', function(e) { if (parseInt(this.text) > 12) this.text = '12'; else if (parseInt(this.text) <= 1) this.text = '1'; });
}
}
with (add('panel')) {
alignChildren = 'fill';
with (add('group')) {
orientation = 'row';
alignChildren = ['fill', 'fill'];
with (add('group')) {
orientation = 'column';
alignChildren = 'fill';
add('statictext', undefined, 'Language:');
var __lang = add('dropdownlist', undefined, 'Russian,Ukrainian,Português,English,Deutsch,French,Spanish,Italian,Danish'.split(','));
__lang.selection = 0;
}
with (add('group')) {
orientation = 'column';
alignChildren = 'fill';
add('statictext', undefined, 'Template:');
var __template = add('dropdownlist', undefined, '3x4,4x3,6x2-top,6x2-bottom,6|6,left-bottom,top-right,full-top,full-bottom,circle,circle-compact,full-columns,full-rows'.split(','));
__template.selection = 0;
}
}
with (add('group')) {
orientation = 'row';
alignChildren = ['fill', 'fill'];
with (add('group')) {
orientation = 'column';
alignChildren = 'fill';
add('statictext', undefined, 'Days week:');
var __daysFormat = add('dropdownlist', undefined, 'One Letter,Short Form,Full Word'.split(','));
__daysFormat.selection = 1;
}
with (add('group')) {
orientation = 'column';
alignChildren = 'fill';
add('statictext', undefined, 'Weekends:');
var __weekends = add('edittext', undefined, '6, 7');
}
with (add('group')) {
orientation = 'column';
alignChildren = 'fill';
add('statictext', undefined, 'Standart:');
var __standart = add('dropdownlist', undefined, ['European', 'American']);
__standart.selection = 0;
}
}
}
}
with (globalGroup.add('group')) {
orientation = 'row';
alignChildren = ['fill', 'fill'];
with (add('group')) {
orientation = 'column';
alignChildren = ['fill', 'fill'];
with (add('panel')) {
orientation = 'column';
alignChildren = ['fill', 'fill'];
with(add('group')) {
orientation = 'row';
alignChildren = ['fill', 'fill'];
add('statictext', undefined, 'Frame size:');
var __frameAutoSize = add('dropdownlist', undefined, ['Fit artboad', 'Artboard size', 'Selection fit', 'Selection size', 'Custom']);
__frameAutoSize.selection = 0;
__frameAutoSize.onChange = function () {
var val = this.selection.text === 'Custom';
__frameWidthText.enabled = __frameWidth.enabled = __frameHeightText.enabled = __frameHeight.enabled = val;
marginsButton.enabled = !val;
}
}
with (add('group')) {
orientation = 'row';
alignChildren = ['fill', 'fill'];
with (add('group')) {
orientation = 'column';
alignChildren = 'fill';
var __frameWidthText = add('statictext', undefined, 'Width (px, mm)'),
__frameWidth = add('edittext', undefined, '300 mm');
__frameWidthText.enabled = __frameWidth.enabled = false;
add('statictext', undefined, 'Gutter X (px, mm)');
var __gutterX = add('edittext', undefined, '15 mm');
__gutterX.addEventListener('keydown', function(e) { inputNumberEvents(e, __gutterX, 0, Infinity); });
__gutterX.addEventListener('change', function(e) { inputNumberEvents(e, __gutterX, 0, Infinity); });
}
with (add('group')) {
orientation = 'column';
alignChildren = 'fill';
var __frameHeightText = add('statictext', undefined, 'Height (px, mm)'),
__frameHeight = add('edittext', undefined, '175 mm');
__frameHeightText.enabled = __frameHeight.enabled = false;
add('statictext', undefined, 'Gutter Y (px, mm)');
var __gutterY = add('edittext', undefined, '15 mm');
__gutterY.addEventListener('keydown', function(e) { inputNumberEvents(e, __gutterY, 0, Infinity); });
__gutterY.addEventListener('change', function(e) { inputNumberEvents(e, __gutterY, 0, Infinity); });
}
}
var __linksFrames = add('checkbox', undefined, 'Create threaded text for frames?');
__linksFrames.value = false;
with (add('group')) {
orientation = 'row';
alignChildren = ['fill', 'fill'];
var marginsButton = add('button', undefined, 'Margin');
marginsButton.onClick = function () {
$margins = prompt('Enter the margin - [ top, right, bottom, left ]. Units mm, px. Separator space', $margins, 'Enter the Margin').toLowerCase();
}
var paddingsButton = add('button', undefined, 'Padding');
paddingsButton.onClick = function () {
$paddings = prompt('Enter the padding - [ top, right, bottom, left ]. Units mm, px. Separator space', $paddings, 'Enter the Padding').toLowerCase();
}
}
}
with (add('panel')) {
orientation = 'row';
alignChildren = ['fill', 'left'];
add('statictext', undefined, 'Calendar name:');
var inputCalendarName = add('edittext', [0, 0, 120, 25], SYSTEMNAMES.calendarName);
}
}
with(add('group')) {
orientation = 'column';
alignChildren = ['fill', 'fill'];
with (add('panel')) {
alignChildren = 'left';
with (add('group')) {
orientation = 'row';
alignChildren = 'left';
add('statictext', undefined, 'Days week position:')
var __daysPosition = add('dropdownlist', [0, 0, 80, 25], 'Top,Bottom,Top & Bottom'.split(','));
__daysPosition.selection = 0;
}
with (add('group')) {
orientation = 'row';
alignChildren = 'left';
add('statictext', undefined, 'Week num position:')
var __weekNumbersPosition = add('dropdownlist', [0, 0, 80, 25], 'Left,Right,Left & Right'.split(','));
__weekNumbersPosition.selection = 0;
}
with (add('group')) {
orientation = 'row';
alignChildren = ['fill', 'fill'];
var __isDay = add('checkbox', undefined, 'Days week'),
__isWeek = add('checkbox', undefined, 'Week numbers');
}
with (add('group')) {
orientation = 'row';
alignChildren = ['fill', 'fill'];
var __isMonth = add('checkbox', undefined, 'Month name'),
__isYearInMonth = add('checkbox', undefined, 'Year in month');
}
var __isMonthNumber = add('checkbox', undefined, 'Month number in month name');
__isDay.value = __isWeek.value = __isMonth.value = __isMonthNumber.value = __isYearInMonth.value = true;
with (add('group')) {
orientation = 'row';
alignChildren = ['fill', 'fill'];
var __otherDays = add('checkbox', undefined, 'Enable days of other months');
__otherDays.value = true;
}
}
with(add('panel')) {
with (add('group')) {
orientation = 'row';
alignChildren = 'fill';
add('statictext', undefined, 'Shapes for frames:');
var shapesVal = add('dropdownlist', [0, 0, 85, 25], 'None,Create New,Use Fill,Use Existing'.split(','));
shapesVal.selection = 1;
shapesVal.onChange = function (e) {
if (!!symbolsCollection.length) {
selectShapeGroup.enabled = this.selection.index > 1
}
}
}
with (selectShapeGroup = add('group')) {
orientation = 'row';
alignChildren = 'fill';
enabled = !!symbolsCollection.length;
add('statictext', undefined, 'Select shape:');
var selectShape = add('dropdownlist', [0, 0, 115, 25], symbolsCollection);
selectShape.selection = 0;
}
with (add('group')) {
orientation = 'row';
alignChildren = 'fill';
var __createStyle = add('checkbox', undefined, 'Create styles or replace existing?');
__createStyle.value = true;
}
}
}
}
with (globalGroup.add('group')) {
orientation = 'row';
alignChildren = 'fill';
add('statictext', undefined, 'Holidays - [day].[month]:');
var winHolidays = add('edittext', [0, 0, 335, 25], '01.01, 07.01, 23.02, 08.03, 01.05, 09.05, 12.06, 04.11');
}
var winButtons = globalGroup.add('group');
winButtons.alignChildren = ['fill', 'fill'];
var __compactMode = winButtons.add('checkbox', undefined, 'Compact mode:');
__compactMode.value = true;
var cancel = winButtons.add('button', undefined, 'Cancel');
cancel.helpTip = 'Press Esc to Close';
cancel.onClick = function () { win.close(); }
var replaceButton = winButtons.add('button', undefined, 'Replace');
replaceButton.helpTip = 'Replaces everything except width, height, position, shapes and styles';
replaceButton.onClick = function () {
if (isLayersWithCalendar) {
isShowReplaceWindow = true;
win.active = false;
winForReplace.center();
winForReplace.show();
if (!winForReplaceSize) {
winForReplaceSize = winForReplace.preferredSize;
} else {
winForReplace.preferredSize = winForReplaceSize;
}
winForReplace.active = true;
} else {
alert('Calendar not found!');
}
};
var ok = winButtons.add('button', undefined, 'Create calendar', { justify: 'right' });
ok.helpTip = 'Press Enter to Run';
ok.onClick = startAction;
ok.active = true;
var winForReplace = new Window('dialog', 'Replace / Extra settings: ' + scriptName + copyright);
winForReplace.orientation = 'column';
winForReplace.alignChildren = 'fill';
with (winForReplace.add('group')) {
orientation = 'column';
alignChildren = 'fill';
add('statictext', undefined, 'Select calendar:');
var layersWithCalendar = add('dropdownlist', undefined, layersWithCalendarCollection);
layersWithCalendar.selection = 0;
layersWithCalendar.enabled = isLayersWithCalendar;
with (add('panel', undefined, 'Symbols')) {
orientation = 'column';
alignChildren = ['fill', 'fill'];
var winForReplaceSymbols = add('dropdownlist', undefined, symbolsCollection);
winForReplaceSymbols.selection = selectShape.selection.index;
winForReplaceSymbols.enabled = isSymbolsCollection;
var symbolSizeFill = add('checkbox', undefined, 'Symbol size - fill to frame');
symbolSizeFill.value = true;
}
var replaceOnlySymbolsButton = add('button', undefined, 'Replace only symbols');
replaceOnlySymbolsButton.onClick = function() {
var symbol = activeDocument.symbols.getByName(winForReplaceSymbols.selection.text);
var layer = activeDocument.layers.getByName(layersWithCalendar.selection.text);
if (layer && layer.typename === 'Layer') {
var months = layer.pageItems;
for (var i = 0; i < months.length; i++) {
var monthFrame = months[i];
var monthRemains = monthFrame.pageItems;
for (var j = monthRemains.length - 1; j >= 0; j--) {
if (monthRemains[j].typename === 'SymbolItem') {
if (symbolSizeFill.value) {
var width = monthRemains[j].width;
var height = monthRemains[j].height;
var position = monthRemains[j].position;
}
monthRemains[j].symbol = symbol;
if (symbolSizeFill.value) {
monthRemains[j].width = monthFrame.width > width ? monthFrame.width : width;
monthRemains[j].height = monthFrame.height > height ? monthFrame.height : height;
monthRemains[j].position = [
monthFrame.width > width ? monthFrame.position[0] : position[0],
monthFrame.height > height ? monthFrame.position[1] : position[1]
];
}
break;
}
}
}
}
win.close();
winForReplace.close();
}
with (add('group')) {
orientation = 'row';
alignChildren = ['fill', 'fill'];
var winForReplaceButtonCancel = add('button', undefined, 'Cancel');
winForReplaceButtonCancel.helpTip = 'Press Esc to Close';
winForReplaceButtonCancel.onClick = function () {
winForReplace.close();
}
var winForReplaceButtonOK = add('button', undefined, 'Replace');
winForReplaceButtonOK.helpTip = 'Replace calendar';
winForReplaceButtonOK.onClick = function () {
var layer = activeDocument.layers.getByName(layersWithCalendar.selection.text);
replaceAction(layer);
win.close();
winForReplace.close();
};
}
}
function saveSettings() {
var $file = new File(settingFile.folder + settingFile.name),
data = [
__startYear.text,
__startMonth.text,
__endYear.text,
__endMonth.text,
__lang.selection.index,
__template.selection.index,
__daysFormat.selection.index,
__frameAutoSize.selection.index,
__frameWidth.text,
__gutterX.text,
__frameHeight.text,
__gutterY.text,
__daysPosition.selection.index,
__weekNumbersPosition.selection.index,
__isDay.value,
__isWeek.value,
__isMonth.value,
__isYearInMonth.value,
__otherDays.value,
__standart.selection.index,
shapesVal.selection.index,
__createStyle.value,
__linksFrames.value,
__compactMode.value,
inputCalendarName.text,
__isMonthNumber.value
].toString() + '\n' +
__weekends.text.replace(/ /g, '').replace(/,/g, ', ') + '\n' +
winHolidays.text.replace(/ /g, '').replace(/,/g, ', ') + '\n' +
$margins + '\n' +
$paddings + '\n' +
// settings for "replace" window
[
symbolSizeFill.value
].toString();
$file.open('w');
$file.write(data);
$file.close();
}
function loadSettings() {
var $file = File(settingFile.folder + settingFile.name);
if ($file.exists) {
try {
$file.open('r');
var data = $file.read().split('\n'),
$main = data[0].split(','),
$wnds = data[1],
$holi = data[2],
$mrgn = data[3],
$pdns = data[4];
$forReplaceWin = data[5].split(',');
__startYear.text = $main[0];
__startMonth.text = $main[1];
__endYear.text = $main[2];
__endMonth.text = $main[3];
__lang.selection = parseInt($main[4]);
__template.selection = parseInt($main[5]);
__daysFormat.selection = parseInt($main[6]);
__frameAutoSize.selection = parseInt($main[7]);
__frameWidth.text = $main[8];
__gutterX.text = $main[9];
__frameHeight.text = $main[10];
__gutterY.text = $main[11];
__daysPosition.selection = parseInt($main[12]);
__weekNumbersPosition.selection = parseInt($main[13]);
__isDay.value = ($main[14] === 'true');
__isWeek.value = ($main[15] === 'true');
__isMonth.value = ($main[16] === 'true');
__isYearInMonth.value = ($main[17] === 'true');
__otherDays.value = ($main[18] === 'true');
__standart.selection = parseInt($main[19]);
shapesVal.selection = parseInt($main[20]);
selectShapeGroup.enabled = shapesVal.selection.index > 1;
__createStyle.value = ($main[21] === 'true');
__linksFrames.value = ($main[22] === 'true');
__compactMode.value = ($main[23] === 'true');
inputCalendarName.text = ($main[24] || SYSTEMNAMES.calendarName);
__isMonthNumber.value = ($main[25] === 'true');
__weekends.text = $wnds;
winHolidays.text = $holi;
$margins = $mrgn;
$paddings = $pdns;
symbolSizeFill.value = ($forReplaceWin[0] === 'true');
var val = __frameAutoSize.selection.text === 'Custom';
__frameWidthText.enabled = __frameWidth.enabled = __frameHeightText.enabled = __frameHeight.enabled = val;
marginsButton.enabled = !val;
} catch (e) {}
$file.close();
}
}
function getCalendarData() {
var $size = {
width: (__frameAutoSize.selection.text === 'Custom' ? __frameWidth.text.replace(/ /g, '') : __frameAutoSize.selection.text.replace(/ /g, '').toLowerCase()),
height: (__frameAutoSize.selection.text === 'Custom' ? __frameHeight.text.replace(/ /g, '') : __frameAutoSize.selection.text.replace(/ /g, '').toLowerCase()),
},
$preset = (__daysPosition.selection.index === 2 ? 'days-title-top, days-title-bottom' : ('days-title-' + __daysPosition.selection.text.toLowerCase()));
$preset += (__weekNumbersPosition.selection.index === 2 ? 'week-numbers-left, week-numbers-right' : ('week-numbers-' + __weekNumbersPosition.selection.text.toLowerCase()));
if (isShowReplaceWindow) {
SYSTEMNAMES.calendarName = layersWithCalendar.selection.text.slice(0, layersWithCalendar.selection.text.indexOf('_'));
SYSTEMNAMES.symbolName = (isSymbolsCollection && winForReplaceSymbols.selection.text);
} else {
SYSTEMNAMES.calendarName = inputCalendarName.text;
SYSTEMNAMES.symbolName = ((isSymbolsCollection && shapesVal.selection.index > 1) && selectShape.selection.text);
}
SYSTEMNAMES.prefix = SYSTEMNAMES.calendarName + '_' + SYSTEMNAMES.prefix + '_';
return {
startYear: parseInt(__startYear.text),
endYear: parseInt(__endYear.text),
startMonth: parseInt(__startMonth.text),
endMonth: parseInt(__endMonth.text),
otherDays: __otherDays.value ? 'fill': 'empty',
language: __lang.selection.text.toLowerCase().slice(0,2),
holidays: winHolidays.text.replace(/ /g, '').split(','),
compact_mode: __compactMode.value,
margin: $margins || 0,
padding: $paddings === 'undefined' ? 0 : ($paddings || 0),
shapes: shapesVal.selection.text.toLowerCase().replace(/ /g, '-'),
standart: __standart.selection.text === 'European' ? 'eu' : 'us',
frameWidth: $size.width,
frameHeight: $size.height,
template: __template.selection.text.toLowerCase(),
daysFormat: __daysFormat.selection.text.slice(0,1).toLowerCase() + __daysFormat.selection.text.replace(/ /g, '').slice(1),
gutter_x: __gutterX.text,
gutter_y: __gutterY.text,
preset: $preset,
notStyles: !__createStyle.value,
linkFrames: __linksFrames.value,
weekends: __weekends.text.replace(/ /g, '').split(','),
systemNames: SYSTEMNAMES,
enableFrames: {
day: __isDay.value,
week: __isWeek.value,
month: __isMonth.value,
yearInMonth: __isYearInMonth.value,
numberMonth: __isMonthNumber.value,
},
};
}
function startAction() {
try {
new calendarikko(getCalendarData()).create();
win.close();
}
catch (e) {
$.errorMessage(e);
}
}
function replaceAction (layer) {
try {
new calendarikko(getCalendarData()).replace(layer);
win.close();
}
catch (e) {
$.errorMessage(e);
}
}
function checkSettingFolder() {
var $folder = new Folder(settingFile.folder);
if (!$folder.exists) $folder.create();
}
checkSettingFolder();
loadSettings();
win.onClose = function() {
saveSettings();
return true;
}
win.onShow = function() {
if (!selection.length) {
__frameAutoSize.splice(2,1);
__frameAutoSize.splice(3,1);
}
}
win.center();
win.show();
Download from its original source : https://raw.githubusercontent.com/alexander-ladygin/illustrator-scripts/master/calendarikko.jsx
Calendar – Illustrator Script (0 downloads )