Created
November 23, 2012 01:38
-
-
Save patrickkettner/4133639 to your computer and use it in GitHub Desktop.
a calendar datepicker, for photoshop scripts
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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(); |
Author
patrickkettner
commented
Nov 23, 2012
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment