Skip to content

Instantly share code, notes, and snippets.

@patrickkettner
Created November 23, 2012 01:38
Show Gist options
  • Save patrickkettner/4133639 to your computer and use it in GitHub Desktop.
Save patrickkettner/4133639 to your computer and use it in GitHub Desktop.
a calendar datepicker, for photoshop scripts
var calendarData = {};
var calendar = new Window( 'dialog', 'calendar' );
calendar.MonthAndYear = calendar.add('group');
var MonthAndYear = calendar.MonthAndYear;
var months = ["January", "Feburary", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
var month = MonthAndYear.add('dropdownlist', undefined, months);
var thisMonth = new Date().getMonth();
month.selection = month.items[thisMonth];
var years = (function(){
var yearArray = [];
var startYear = new Date().getFullYear() - 2;
for (var i = 0; i < 5; i++) {
yearArray.push(startYear + i);
}
return yearArray;
})();
var year = MonthAndYear.add('dropdownlist', undefined, years);
year.selection = year.items[2];
function daysInMonth(month,year) {
return new Date(year, month + 1, 0).getDate();
}
function firstDayOfMonth(month, year) {
var requestedMonth = new Date(year, month, 1);
requestedMonth.setDate(1);
return requestedMonth.getDay();
}
calendar.dayLabels = calendar.add('group', [0, 25, 300, 40]);
var days = calendar.dayLabels;
days.day1 = days.add('statictext', [0,0,8,0], 'S')
days.day2 = days.add('statictext', [45, 0, 60, 0], 'M')
days.day3 = days.add('statictext', [90, 0, 98, 0], 'T')
days.day4 = days.add('statictext', [135, 0, 148, 0], 'W')
days.day5 = days.add('statictext', [185, 0, 193, 0], 'T')
days.day6 = days.add('statictext', [230, 0, 238, 0], 'F')
days.day7 = days.add('statictext', [275, 0, 283, 0], 'S')
function cleanUpMonth() {
var thisWeek = 1;
while (typeof calendar['week' + thisWeek] === "object") {
delete calendar['week' + thisWeek];
thisWeek = thisWeek + 1;
}
}
function disableOthers(checked) {
calendarData.selectedDay = checked;
for (var i = 0; i <= calendarData.days.length; i++) {
if (calendarData.days[i].text !== checked) {
calendarData.days[i].value = false;
}
}
}
function updateDays() {
var thisMonth = month.selection;
var thisYear = parseInt(year.selection.toString(), 10);
var startPadding = originalPadding = firstDayOfMonth(thisMonth, thisYear);
var totalDays = daysInMonth(thisMonth, thisYear) + startPadding;
var endPadding = ((Math.ceil(totalDays/7) * 7) - totalDays);
var extraDays = (calendarData.days.length - totalDays - endPadding > 0 ? calendarData.days.length - totalDays - endPadding : 0);
if ((totalDays + endPadding) < calendarData.days.length) {
calendarData.days = calendarData.days.slice(0, (totalDays + endPadding));
}
for (var i = 1; i <= (totalDays + endPadding + extraDays); i++) {
var thisDay = calendarData.days[i - 1];
if (!thisDay) {
var thisWeek = calendar['week' + Math.floor(i/7)];
if (typeof thisWeek !== 'object') {
thisWeek = calendar.add('group');
}
thisDay = calendarData.days[i] = thisWeek.add('radiobutton', undefined, i);
}
if (startPadding > 0) {
thisDay.enabled = false;
thisDat.text = '00';
startPadding = startPadding - 1;
}
else if (i <= totalDays) {
thisDay.enabled = true;
thisDay.text = (i.toString().length === 2 ? i : '0' + (i - originalPadding).toString());
}
else {
thisDay.enabled = false;
thisDat.text = 00;
}
}
}
function setUpMonth() {
var thisMonth = month.selection;
var thisYear = parseInt(year.selection.toString(), 10);
var startPadding = originalPadding = firstDayOfMonth(thisMonth, thisYear);
var totalDays = daysInMonth(thisMonth, thisYear) + startPadding;
var endPadding = ((Math.ceil(totalDays/7) * 7) - totalDays);
var today = new Date().getDate() + startPadding;
calendarData.days = [];
for (var i = 1; i <= (totalDays + endPadding); i++) {
var thisLine = (Math.floor((i - 1)/7));
var shouldDisable = false;
if (typeof calendar['week' + thisLine] !== 'object') {
calendar['week' + thisLine] = calendar.add('group');
}
var thisWeek = calendar['week' + thisLine];
var dayLabel;
if (startPadding > 0) {
dayLabel = '00'
startPadding = startPadding - 1
shouldDisable = true;
}
else if (i <= totalDays) {
var day = (i - originalPadding);
dayLabel = (day.toString().length === 2 ? day : '0' + day);
}
else {
dayLabel = '00'
shouldDisable = true;
}
thisWeek[dayLabel] = thisWeek.add('radiobutton', undefined, dayLabel);
if (shouldDisable) {
thisWeek[dayLabel].enabled = false;
}
else if (i === today) {
calendarData.selectedDay = thisWeek[dayLabel].text;
thisWeek[dayLabel].value = true;
}
thisWeek[dayLabel].onClick = function() {
if (this.enabled) {
disableOthers(this.text);
}
}
calendarData.days.push(thisWeek[dayLabel]);
}
}
setUpMonth();
calendar.buttons = calendar.add('group');
var button = calendar.buttons.add('button', undefined, 'select');
month.onChange = function() {
updateDays()
};
year.onChange = function() {
updateDays();
};
button.onClick = function() {
var selectedYear = year.selection;
var selectedMonth = months.indexOf(month.selection.toString());
var selectedDay = parseInt(calendarData.selectedDay, 10);
calendarData.finalDate = new Date(selectedYear, selectedMonth, selectedDay);
alert(calendarData.finalDate.getFullYear() + 110);
alert(calendarData.finalDate.getDate());
alert(calendarData.finalDate.getMonth());
}
calendar.show();
@patrickkettner
Copy link
Author

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment