
Код AS3:
package {
import flash.display.MovieClip;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.text.TextField;
import flash.text.TextFormat;
import flash.text.TextFormatAlign;
import com.greensock.*;
import com.greensock.easing.*;
public class Calendar extends MovieClip {
public static const CHANGEDATE:String = 'changedate';//константа для имени события
public static const XGRID:Number = 12;//координаты сетки из ячеек с датами и панельки с днями недели
public static const YGRID:Number = 95;
public static const YDAYS:Number = 60;
public static const BETWEENCELLS:Number = 5;//расстояние между ячейками
private var _dateObject:Date;//экземпляр нужен для получения значений текущей даты, дня недели, года
private var _currentDate:Number;//текущая дата
private var _currentDay:Number;//текущий день недели
private var _currentMonth:Number;//текущий месяц
private var _currentYear:Number;//текущий год
private var _days:Array;//массив для хранения названий дней недели
private var _dates:Array;//массив для хранения дат
private var _months:Array;//массив для хранения названий месяцев
private var _daysinMonth:Array;//массив для хранения количества дней в месяце
private var _nextMonthButton:NextMonthButton;//кнопки
private var _prevMonthButton:PrevMonthButton;
private var _nextYearButton:NextYearButton;
private var _prevYearButton:PrevYearButton;
private var _textCurrentMonth:TextField;//текстовое поле для названия месяца
private var _textCurrentYear:TextField;//текстовое поле для значения года
private var _formateTextMonthAndYear:TextFormat;//форматы для текстовых полей
private var _formateTextDate:TextFormat;
private var _formateTextDays:TextFormat;
private var _startCell:Number;//ячейка с сегодняшней датой
public function Calendar() {
init();
}
private function init():void {
_dateObject = new Date();
_currentDate = _dateObject.getDate();
_currentDay = _dateObject.getDay();
_currentYear = _dateObject.getFullYear();
_currentMonth = _dateObject.getMonth();
_days = ['пн', 'вт', 'ср', 'чт', 'пт', 'сб', 'вс']
_months = ["январь", "февраль", "март", "апрель", "май", "июнь", "июль", "август", "сентябрь", "октябрь", "ноябрь", "декабрь"];
_daysinMonth = [31,28,31,30,31,30,31,31,30,31,30,31];
buildHeader();//создаем текстовые поля для названия месяца, года; создаем панельку с днями недели
buildGrid();//создаем сетку из ячеек с датами
showCurrentDate();//изменяем сетку в соответствии с видом текущего месяца
//когда пользователь кликает по кнопкам для изменения даты или года (см метод onClick()),
//мы отправляем событие Calendar.CHANGEDATE, которое обрабатывает метод onChangeDate()
addEventListener(MouseEvent.CLICK, onClick);
addEventListener(Calendar.CHANGEDATE, onChangeDate);
addEventListener(MouseEvent.CLICK,onDate); // по нажатию на иконку дату перемещаем.
}
private function buildHeader():void {
//создаем экземпляр текстового поля с присоединенным шрифтом, чтобы
//этот шрифт можно было использовать в нашем ролике
var textEmbed:TextEmbed = new TextEmbed();
//создаем формат текстовых полей для названия месяца и значения года
_formateTextMonthAndYear = new TextFormat();
_formateTextMonthAndYear.color = 0x333333;
_formateTextMonthAndYear.font = 'Tahoma';
_formateTextMonthAndYear.size = '16';
_formateTextMonthAndYear.bold = true;
_formateTextMonthAndYear.align = TextFormatAlign.CENTER;
//создаем формат текстового поля для значений даты
_formateTextDate = new TextFormat();
_formateTextDate.color = 0xffffff;
_formateTextDate.font = 'Tahoma';
_formateTextDate.size = '13';
_formateTextDate.bold = true;
_formateTextDate.align = TextFormatAlign.CENTER;
//создаем формат текстового поля для значений дней недели
_formateTextDays = new TextFormat();
_formateTextDays.color = 0xffffff;
_formateTextDays.font = 'Tahoma';
_formateTextDays.size = '14';
_formateTextDays.bold = true;
_formateTextDays.align = TextFormatAlign.CENTER;
//создаем текстовое поле для названия месяца
_textCurrentMonth = new TextField();
_textCurrentMonth.selectable = false;
_textCurrentMonth.defaultTextFormat = _formateTextMonthAndYear;
_textCurrentMonth.embedFonts = true;
_textCurrentMonth.x = 23;
_textCurrentMonth.y = 25;
_textCurrentMonth.width = 90;
_textCurrentMonth.height = 40;
_textCurrentMonth.text = _months[_currentMonth];
addChild(_textCurrentMonth);
//создаем текстовое поле для значения года
_textCurrentYear = new TextField();
_textCurrentYear.embedFonts = true;
_textCurrentYear.selectable = false;
_textCurrentYear.defaultTextFormat = _formateTextMonthAndYear;
_textCurrentYear.x = 137;
_textCurrentYear.y = 25;
_textCurrentYear.width = 80;
_textCurrentYear.height = 40;
_textCurrentYear.text = _currentYear.toString();
addChild(_textCurrentYear);
//создаем ячейки с названиями дней недели
for (var i:int = 0; i < _days.length; i++) {
var bgDay:BgDay = new BgDay();
addChild(bgDay);
bgDay.x = i * (bgDay.width + BETWEENCELLS) + XGRID;
bgDay.y = YDAYS;
var textDay:TextField = new TextField();
textDay.mouseEnabled = false;
textDay.selectable = false;
textDay.text = _days[i];
textDay.width = 30;
textDay.height = 30;
textDay.embedFonts = true;
textDay.setTextFormat(_formateTextDays);
bgDay.addChild(textDay);
textDay.x = -3;//эти значения получаем опытным путем :)
textDay.y = 1;
}
//создаем кнопки для изменения месяцев и лет
_nextMonthButton = new NextMonthButton();
_nextMonthButton.stop();
_nextMonthButton.x = 115;
_nextMonthButton.y = 33;
_nextMonthButton.buttonMode = true;
_nextMonthButton.useHandCursor = true;
addChild(_nextMonthButton);
_prevMonthButton = new PrevMonthButton();
_prevMonthButton.stop();
_prevMonthButton.x = 15;
_prevMonthButton.y = 33;
_prevMonthButton.buttonMode = true;
_prevMonthButton.useHandCursor = true;
addChild(_prevMonthButton);
_nextYearButton = new NextYearButton();
_nextYearButton.stop();
_nextYearButton.x = 209;
_nextYearButton.y = 33;
_nextYearButton.buttonMode = true;
_nextYearButton.useHandCursor = true;
addChild(_nextYearButton);
_prevYearButton = new PrevYearButton();
_prevYearButton.stop();
_prevYearButton.x = 137;
_prevYearButton.y = 33;
_prevYearButton.buttonMode = true;
_prevYearButton.useHandCursor = true;
addChild(_prevYearButton);
}
private function onChangeDate(e:Event):void {
clearGrid()//убираем старую сетку
buildGrid();//делаем новую
showCurrentDate();
}
private function clearGrid():void {
//удаляем все ячейки
_dates = null;
while (getChildAt(numChildren-1) is BgDate) {
removeChild(getChildAt(numChildren-1));
};
//создаем новый объект Date, со значениями года и месяца, которые выбрал пользователь
_dateObject = new Date(_currentYear,_currentMonth, _currentDate);
_currentDate = _dateObject.getDate();
_currentDay = _dateObject.getDay();
_currentYear = _dateObject.getFullYear();
_currentMonth = _dateObject.getMonth();
}
private function showCurrentDate():void {
//небольшая проверка на високосный год, если год не високосный, то в феврале 28 дней
_daysinMonth[1] = 28;
//если високосный - 29
if ((_currentYear / 4 - Math.floor(_currentYear / 4) == 0)) {
_daysinMonth[1] = 29;
}
if (_currentYear / 100 - Math.floor(_currentYear / 100) == 0 &&
_currentYear / 400 - Math.floor(_currentYear / 400) != 0) {
_daysinMonth[1] = 28;
}
//ищем в сетке ближайшую ячейку, день недели которой совпадает со значением _currentDay
for (var i:Number = _currentDate - 1; i < _dates.length - 1; i++) {
if (_dates[i][1] == _currentDay) {
_startCell = i;
_dates[i][2].gotoAndStop(2);
break;
}
}
var tempNumber:Number;
tempNumber = _startCell;
//функция добавляет текстовое поле в ячейку
function attachTextField(it:Number):void {
var textDate:TextField = new TextField();
textDate.mouseEnabled = false;
textDate.selectable = false;
textDate.text = it.toString();
textDate.width = 30;
textDate.height = 30;
textDate.embedFonts = true;
textDate.setTextFormat(_formateTextDate);
_dates[tempNumber][2].addChild(textDate);
textDate.x = -3;//эти значения получаем опытным путем :)
textDate.y = 1;
}
//добавляем текстовые поля к ячейкам от текущей даты до первого числа месяца
for (var j:Number = _currentDate; j > 0; j--) {
attachTextField(j);
tempNumber--;
}
//восстанавливаем значение tempNumber
tempNumber = _startCell;
//добавляем текстовые поля к ячейкам от текущей даты до последнего числа месяца
for (var k:Number = _currentDate; k <= _daysinMonth[_currentMonth]; k++) {
attachTextField(k);
tempNumber++;
}
//удаляем ячейки без текстовых полей из списка отображения, хотя можно этого и не делать,
//а просто изменять их внешний вид
for (var l:Number = 0; l < _dates.length ; l++) {
if (_dates[l][2].numChildren==1) {
removeChild(_dates[l][2]);
}
}