2014-12-16 11:40:15 +00:00
var Calendar = function ( dom ) {
c = this ;
this . create _event _btn = $ ( "#create_event_btn" ) ;
this . event _create _space = $ ( "#event_create_space" ) ;
this . title = $ ( "#current_title" ) ;
this . calendar = $ ( dom ) ;
this . nextBtn = $ ( "#next_month_btn" ) ;
this . prevBtn = $ ( "#prev_month_btn" ) ;
this . todayBtn = $ ( "#today_btn" ) ;
this . modeBtns = $ ( ".calendar_mode button" ) ;
this . refreshBtn = $ ( "#refresh_btn" ) ;
this . mousePosition = { } ;
this . dialog = new EventDialog ( c ) ;
this . loading = $ ( '#calendar-loading' ) ;
this . success _event = null ;
this . agenda _space = $ ( "#calendar_agenda" ) ;
this . currentView = "month" ;
this . navigation = $ ( "#navigation" ) ;
this . rangeSelection = $ ( "#range_selection" ) ;
var agendaView = new AgendaView ( c ) ;
var loadeventsonviewchange = false ;
this . initialize = function ( ) {
var date = new Date ( ) ;
var d = date . getDate ( ) ;
var m = date . getMonth ( ) ;
var y = date . getFullYear ( ) ;
var change _event = function ( _event , delta ) {
_event . end = ( _event . end ? _event . end : _event . start ) ;
var s = $ . fullCalendar . parseDate ( c . calendar . find ( ".fc-view table tbody td:first" ) . data ( "date" ) ) ;
var e = $ . fullCalendar . parseDate ( c . calendar . find ( ".fc-view table tbody td:first" ) . data ( "date" ) ) ;
$ . ajax ( {
url : "/admin/calendars/" + _event . id ,
// data: {event:{id:_event.id,start:_event.start,end: _event.end,_s:Math.round(+s / 1000), _e:Math.round(+e / 1000)}},
data : { event : { id : _event . id , start : _event . start , end : _event . end } } ,
type : 'put' ,
datatype : 'JSON' ,
error : function ( jqXHR , textStatus , errorThrown ) { } ,
success : function ( data ) {
console . log ( 'event was success updated' ) ;
}
} ) ;
}
var success _event = function ( data , allDay , type , addbtn ) {
c . dialog . dismiss ( ) ;
c . event _create _space . html ( data ) ;
var create _space _height = c . event _create _space . height ( ) ,
create _space _width = c . event _create _space . width ( ) ;
if ( ( create _space _height + c . mousePosition [ "y" ] ) >= $ ( window ) . height ( ) ) {
c . event _create _space . css ( "top" , ( c . mousePosition [ "y" ] - create _space _height ) + "px" ) ;
} else {
c . event _create _space . css ( "top" , c . mousePosition [ "y" ] + "px" ) ;
}
if ( ( create _space _width + c . mousePosition [ "x" ] ) >= $ ( window ) . width ( ) ) {
c . event _create _space . css ( "left" , ( c . mousePosition [ "x" ] - create _space _width ) + "px" ) ;
} else {
c . event _create _space . css ( "left" , c . mousePosition [ "x" ] + "px" ) ;
}
if ( addbtn ) {
c . event _create _space . css ( { "right" : "8px" , "bottom" : "50px" , "left" : "auto" , "top" : "auto" } ) ;
} else {
c . event _create _space . css ( { "right" : "" , "bottom" : "" } ) ;
}
c . event _create _space . show ( ) ;
var dtpick = $ ( '.datetimepick' ) ;
var pickers = new Array ( ) ;
var checked = ( $ ( "#all_day_check" ) . is ( ":checked" ) ? true : false ) ;
var checked _function = function ( c ) {
if ( c ) {
for ( i in pickers ) {
var input = pickers [ i ] . find ( "input" ) ;
input . val ( input . val ( ) . split ( " " ) [ 0 ] ) ;
}
} else {
for ( i in pickers ) {
var d = new Date ( ) ;
var input = pickers [ i ] . find ( "input" ) ;
if ( input . val ( ) )
input . val ( input . val ( ) + " " + d . getHours ( ) + ":" + d . getMinutes ( ) ) ;
}
}
}
var repeat _function = function ( ) {
if ( c . event _create _space . find ( "#event_period" ) . val ( ) == c . event _create _space . find ( "#event_period option:eq(0)" ) . val ( ) ) {
c . event _create _space . find ( "#event_frequency" ) . attr ( "disabled" , "disabled" ) ;
} else {
c . event _create _space . find ( "#event_frequency" ) . removeAttr ( "disabled" ) ;
}
}
dtpick . each ( function ( ) {
var $data = $ ( this ) . data ( ) ;
var options = {
format : $data . dateFormat ,
pickTime : $data . picktime ,
language : $data . language ,
place : "top"
}
pickers . push (
$ ( this ) . datetimepicker ( options )
) ;
} ) ;
$ ( "a.btn-close" ) . one ( "click" , function ( ) {
c . event _create _space . html ( "" ) . hide ( ) ;
return false ;
} ) ;
$ ( "#all_day_check" ) . click ( function ( ) {
if ( $ ( this ) . is ( ":checked" ) ) {
checked = true ;
} else {
checked = false ;
}
checked _function ( checked ) ;
} ) ;
$ ( "#recurring_checkbox" ) . click ( function ( ) {
if ( $ ( this ) . is ( ":checked" ) )
$ ( "#recurring_panel" ) . show ( ) ;
else
$ ( "#recurring_panel" ) . hide ( ) ;
} )
$ ( 'form[data-remote]' ) . bind ( "ajax:success" , function ( evt , data , status ) {
c . event _create _space . html ( "" ) . hide ( ) ;
if ( type == "new" )
c . renderEvent ( data ) ;
if ( type == "edit" )
c . calendar . fullCalendar ( "refetchEvents" ) ;
} ) ;
c . event _create _space . find ( "#event_period" ) . change ( function ( ) {
repeat _function ( ) ;
} )
for ( i in pickers ) {
pickers [ i ] . on ( "changeDate" , function ( e ) {
if ( checked ) {
var input = $ ( this ) . find ( "input" ) ;
input . val ( input . val ( ) . split ( " " ) [ 0 ] ) ;
}
} )
}
repeat _function ( ) ;
if ( allDay )
checked _function ( checked ) ;
}
c . success _event = success _event ;
var dview = ( c . currentView == "agenda" ? "month" : c . currentView ) ;
c . calendar . fullCalendar ( {
editable : true ,
selectable : true ,
events : "/admin/calendars/" ,
eventResize : change _event ,
eventDrop : change _event ,
header : false ,
default : dview ,
height : $ ( window ) . height ( ) - 315 ,
loading : function ( bool ) {
if ( bool ) c . loading . css ( "left" , ( $ ( window ) . width ( ) / 2 - 60 ) + "px" ) . show ( ) ;
else c . loading . hide ( ) ;
} ,
windowResize : function ( view ) {
view . setHeight ( $ ( window ) . height ( ) - 315 ) ;
c . calendar . fullCalendar ( "refetchEvents" ) ;
} ,
viewDisplay : function ( view ) {
c . title . html ( view . title ) ;
} ,
eventClick : function ( calEvent , e , view ) {
c . event _create _space . html ( "" ) . hide ( ) ;
c . dialog . dismiss ( ) ;
c . dialog . inflate ( calEvent ) ;
c . dialog . show ( { "x" : e . originalEvent . clientX , "y" : e . originalEvent . clientY } ) ;
} ,
select : function ( startDate , endDate , allDay , jsEvent , view ) {
var start = new Date ( startDate ) ,
end = new Date ( endDate ) ,
startString = start . getFullYear ( ) + "/" + ( start . getMonth ( ) + 1 > 9 ? start . getMonth ( ) + 1 : "0" + ( start . getMonth ( ) + 1 ) ) + "/" + ( start . getDate ( ) > 9 ? start . getDate ( ) : "0" + start . getDate ( ) ) ,
endString = end . getFullYear ( ) + "/" + ( end . getMonth ( ) + 1 > 9 ? end . getMonth ( ) + 1 : "0" + ( end . getMonth ( ) + 1 ) ) + "/" + ( end . getDate ( ) > 9 ? end . getDate ( ) : "0" + end . getDate ( ) ) ;
if ( ! allDay ) {
startString += " " + ( start . getHours ( ) > 9 ? start . getHours ( ) : "0" + start . getHours ( ) ) + ":" + ( start . getMinutes ( ) > 9 ? start . getMinutes ( ) : "0" + start . getMinutes ( ) ) ;
endString += " " + ( end . getHours ( ) > 9 ? end . getHours ( ) : "0" + end . getHours ( ) ) + ":" + ( end . getMinutes ( ) > 9 ? end . getMinutes ( ) : "0" + end . getMinutes ( ) ) ;
} else {
startString += " " + start . getHours ( ) + ":" + start . getMinutes ( ) ;
endString += " " + end . getMinutes ( ) + ":" + end . getMinutes ( ) ;
}
$ . ajax ( {
type : "get" ,
url : c . create _event _btn . attr ( "href" ) ,
data : { "startDate" : startString , "endDate" : endString , "allDay" : allDay } ,
success : function ( data ) {
success _event ( data , allDay , "new" ) ;
}
} )
}
} ) ;
c . create _event _btn . click ( function ( ) {
$ . ajax ( {
type : "get" ,
url : $ ( this ) . attr ( "href" ) ,
success : function ( data ) {
success _event ( data , false , "new" , true ) ;
}
} )
return false ;
} ) ;
c . nextBtn . click ( function ( ) {
c . dialog . dismiss ( ) ;
c . calendar . fullCalendar ( 'next' ) ;
} ) ;
c . prevBtn . click ( function ( ) {
c . dialog . dismiss ( ) ;
c . calendar . fullCalendar ( 'prev' ) ;
} ) ;
c . todayBtn . click ( function ( ) {
c . dialog . dismiss ( ) ;
c . calendar . fullCalendar ( 'today' ) ;
} ) ;
c . modeBtns . click ( function ( ) {
c . dialog . dismiss ( ) ;
c . event _create _space . html ( "" ) . hide ( ) ;
toggleViews ( $ ( this ) . data ( "mode" ) ) ;
} ) ;
c . refreshBtn . click ( function ( ) {
c . dialog . dismiss ( ) ;
if ( c . currentView == "agenda" )
agendaView . refresh ( ) ;
else
c . calendar . fullCalendar ( "refetchEvents" ) ;
} ) ;
c . calendar . mouseup ( function ( e ) {
c . mousePosition = { "x" : e . pageX , "y" : e . pageY } ;
} )
var toggleViews = function ( view ) {
c . modeBtns . removeClass ( "active" ) ;
c . modeBtns . each ( function ( ) {
if ( $ ( this ) . data ( "mode" ) == view )
$ ( this ) . addClass ( "active" ) ;
} )
if ( view != "agenda" ) {
if ( c . currentView == "agenda" ) {
$ ( "#sec1" ) . addClass ( "span3" ) . removeClass ( "span7" ) ;
$ ( "#sec2" ) . show ( ) ;
$ ( "#sec3" ) . addClass ( "span4" ) . removeClass ( "span5" ) ;
agendaView . hide ( ) ;
}
c . calendar . fullCalendar ( 'changeView' , view ) ;
} else {
$ ( "#sec1" ) . addClass ( "span7" ) . removeClass ( "span3" ) ;
$ ( "#sec2" ) . hide ( ) ;
$ ( "#sec3" ) . addClass ( "span5" ) . removeClass ( "span4" ) ;
agendaView . inflate ( ) ;
}
c . currentView = view ;
if ( loadeventsonviewchange ) {
c . calendar . fullCalendar ( "refetchEvents" ) ;
loadeventsonviewchange = false ;
}
}
if ( c . currentView == "agenda" ) { toggleViews ( "agenda" ) ; loadeventsonviewchange = true ; }
$ ( document ) . on ( "DOMMouseScroll mousewheel" , function ( e ) {
if ( c . calendar . fullCalendar ( "getView" ) . name == "month" ) {
if ( ! c . isFormVisible ( ) ) {
c . dialog . dismiss ( ) ;
if ( /Firefox/i . test ( navigator . userAgent ) ) {
if ( e . originalEvent . detail == 1 ) {
c . calendar . fullCalendar ( 'next' ) ;
} else if ( e . originalEvent . detail == - 1 ) {
c . calendar . fullCalendar ( 'prev' ) ;
}
} else {
if ( e . originalEvent . wheelDelta / 120 > 0 )
c . calendar . fullCalendar ( 'prev' ) ;
else
c . calendar . fullCalendar ( 'next' ) ;
}
}
}
} ) ;
}
this . isFormVisible = function ( ) {
return ( c . event _create _space . html ( ) == "" ? false : true ) ;
}
this . renderEvent = function ( eventStick ) {
if ( eventStick . recurring == true ) {
c . calendar . fullCalendar ( "refetchEvents" ) ;
} else {
c . calendar . fullCalendar ( "renderEvent" , eventStick ) ;
}
}
this . updateEvent = function ( eventStick ) {
c . calendar . fullCalendar ( "updateEvent" , eventStick ) ;
}
this . deleteEvent = function ( delete _url , _id ) {
$ . ajax ( {
type : "delete" ,
url : delete _url ,
success : function ( ) {
c . calendar . fullCalendar ( "removeEvents" , [ _id ] ) ;
c . dialog . dismiss ( ) ;
}
} )
}
this . editEvent = function ( edit _url , allDay ) {
$ . ajax ( {
type : "get" ,
url : edit _url ,
success : function ( data ) {
c . success _event ( data , allDay , "edit" , true ) ;
c . dialog . dismiss ( ) ;
}
} )
}
$ ( document ) . ready ( function ( ) {
c . initialize ( ) ;
} ) ;
}
var EventDialog = function ( calendar , event ) {
_t = this ;
var event _quick _view = null ;
var template = "" ;
var _this _event = null ;
this . inflate = function ( _event ) {
if ( ! _event ) throw new UserException ( "EventStick can't be null!" ) ;
_this _event = _event ;
var start _time = "" ,
end _time = "" ,
time _string = null ;
if ( _event . allDay ) {
start _time = ( /00:00:00/i . test ( _event . _start . toLocaleString ( ) ) ? $ . fullCalendar . formatDate ( _event . _start , "ddd MMM dd, yyyy" ) : $ . fullCalendar . formatDate ( _event . _start , "ddd MMM dd, yyyy hh:mm" ) ) ;
if ( _event . _end )
end _time = ( /00:00:00/i . test ( _event . _end . toLocaleString ( ) ) ? $ . fullCalendar . formatDate ( _event . _end , "ddd MMM dd, yyyy" ) : $ . fullCalendar . formatDate ( _event . _end , "ddd MMM dd, yyyy hh:mm" ) ) ;
time _string = ( _event . _start === _event . _end || ! _event . _end ? start _time : start _time + " - " + end _time ) ;
} else {
var reg = new RegExp ( / [0-9][0-9]:[0-9][0-9]:[0-9][0-9]/ ) ,
stime = _event . _start . toLocaleString ( ) . split ( "," ) [ 1 ] ,
etime = _event . _end . toLocaleString ( ) . split ( "," ) [ 1 ] ;
start _time = _event . _start . toLocaleString ( ) . replace ( stime , "" ) ;
end _time = _event . _end . toLocaleString ( ) . replace ( etime , "" ) ;
stime = stime . substr ( 0 , stime . length - 3 ) ;
etime = etime . substr ( 0 , etime . length - 3 ) ;
time _string = ( start _time === end _time ? start _time + " " + stime + " - " + etime : start _time + " " + stime + " - " + end _time + " " + etime ) ;
}
event _quick _view = $ ( '<div class="modal" style="width: 300px; display:none; margin:0 0 0 0;"></div>' ) ;
2014-12-17 09:08:50 +00:00
template = '<div class="modal-header"><button type="button" class="close event-close-btn" data-dismiss="modal" aria-hidden="true">×</button><h3>' + _event . title + '</h3></div><div class="modal-body"><div class="event_summary">' + time _string + '</div>' + _event . note + '</div>' ;
if ( _event . can _edit ) {
template += '<div class="modal-footer"><a href="' + _event . delete _url + '" class="delete btn btn-primary">Delete</a><a href="' + _event . edit _url + '" class="edit btn btn-primary" >Edit</a></div>' ;
}
2014-12-16 11:40:15 +00:00
}
this . show = function ( pos ) {
if ( pos ) {
var pos = getPosition ( pos ) ;
event _quick _view . css ( { "left" : pos . x + "px" , "top" : pos . y + "px" } ) ;
}
event _quick _view . html ( template ) . appendTo ( "body" ) . show ( ) ;
event _quick _view . find ( ".event-close-btn" ) . one ( "click" , function ( ) { _t . dismiss ( ) ; } ) ;
event _quick _view . find ( "a.delete" ) . one ( "click" , function ( ) { calendar . deleteEvent ( _this _event . delete _url , _this _event . _id ) ; return false ; } ) ;
event _quick _view . find ( "a.edit" ) . one ( "click" , function ( ) { calendar . editEvent ( _this _event . edit _url , _this _event . allDay ) ; return false ; } ) ;
}
this . dismiss = function ( ) {
if ( event _quick _view )
event _quick _view . remove ( ) ;
}
var getPosition = function ( pos ) {
var x = pos . x ,
y = pos . y ,
winheight = $ ( window ) . height ( ) ;
if ( ( x + event _quick _view . width ( ) ) > $ ( window ) . width ( ) ) {
x = x - event _quick _view . width ( ) ;
}
if ( ( y + event _quick _view . height ( ) ) > winheight ) {
y = y - event _quick _view . height ( ) ;
}
return { "x" : x , "y" : y } ;
}
if ( event )
_t . inflate ( event ) ;
}
var UserException = function ( message ) {
this . message = message ;
this . name = "UserException" ;
this . toString = function ( ) {
return this . message ;
}
}
var AgendaView = function ( calendar ) {
var av = this ;
var _calendar = calendar ;
var agenda _space = _calendar . agenda _space ;
var today = new Date ( ) ;
var minDifference = 6 ;
var start _month = today . getMonth ( ) ;
var start _year = today . getFullYear ( ) ;
var end _month = ( ( start _month + minDifference ) > 11 ? ( start _month + minDifference ) - 11 : start _month + minDifference ) ;
var end _year = ( ( start _month + minDifference ) > 11 ? start _year + 1 : start _year ) ;
var monthNames = [ 'January' , 'February' , 'March' , 'April' , 'May' , 'June' , 'July' , 'August' , 'September' , 'October' , 'November' , 'December' ] ;
var month _template = '<div class="span4"><h4></h4><div class="tiny_calendar"><table class="table"><tbody><tr><th class="week_title">Sun</th><th class="week_title">Mon</th><th class="week_title">Tue</th><th class="week_title">Wed</th><th class="week_title">Thu</th><th class="week_title">Fri</th><th class="week_title">Sat</th></tr></tbody></table></div></div>' ;
var event _list _template = '<div class="span8"><table class="table event_list"><thead><tr height="0"><th class="span3"></th><th class="span2"></th><th class=""></th></tr></thead><tbody><tr><td colspan="3" class="no_events">No events for this month.</td></tr></tbody></table></div>' ;
var head _template = '<div><label>From</label> <select name="start_month" class="input-small"></select><select name="start_year" class="input-small"></select><label>To</label> <select name="end_month" class="input-small"></select><select name="end_year" class="input-small"></select><button id="show_events" class="btn bt-filter">Show Events</button></div>' ;
var event _template = "<tr><th></th><td class='event_time'></td><td><div class='event'></div></td></tr>" ;
var cache = false ;
var show _event _clicked = false ;
this . refresh = function ( ) {
av . inflate ( true ) ;
}
this . inflate = function ( forceInflation ) {
loading ( true ) ;
_calendar . calendar . hide ( ) ;
_calendar . navigation . hide ( ) ;
if ( ! forceInflation ) {
if ( cache ) {
av . show ( ) ;
loading ( false ) ;
return ;
}
}
agenda _space . empty ( ) ;
if ( ! show _event _clicked ) {
_calendar . rangeSelection . empty ( ) ;
_calendar . rangeSelection . append ( renderHead ( ) . html ( ) ) . show ( ) ;
_calendar . rangeSelection . find ( "button#show_events" ) . click ( function ( ) {
show _event _clicked = true ;
start _month = parseInt ( $ ( "select[name=start_month]" ) . val ( ) ) ;
end _month = parseInt ( $ ( "select[name=end_month]" ) . val ( ) ) ;
start _year = parseInt ( $ ( "select[name=start_year]" ) . val ( ) ) ;
end _year = parseInt ( $ ( "select[name=end_year]" ) . val ( ) ) ;
av . inflate ( true ) ;
} )
}
show _event _clicked = false ;
eventsManager ( ) ;
var s = start _month ,
e = end _month
y = start _year ;
e = ( e > s && start _year == end _year ? e : e + 11 ) ;
if ( end _year > start _year )
e = e + ( ( end _year - start _year - 1 ) * 12 ) ;
else e -- ;
for ( var i = s ; i <= e + 1 ; i ++ ) {
var m = new Month ( s , y ) ;
s ++ ;
if ( s > 11 ) {
s = 0 ;
y ++ ;
}
if ( e == 0 )
agenda _space . text ( "Invalid Range of Dates." )
else
agenda _space . append ( m . monthDom ) ;
}
loading ( false ) ;
}
this . hide = function ( ) {
cache = true ;
_calendar . rangeSelection . hide ( ) ;
agenda _space . hide ( ) ;
_calendar . navigation . show ( ) ;
_calendar . calendar . show ( ) ;
}
this . show = function ( ) {
_calendar . rangeSelection . show ( ) ;
agenda _space . show ( ) ;
}
var copyObject = function ( x ) {
return x . clone ( ) ;
}
var eventsManager = function ( ) {
var url = "/admin/calendars/agenda" ,
sd = new Date ( start _year , start _month , 1 ) ,
ed = new Date ( end _year , end _month + 1 , 0 ) ,
usd = Math . round ( sd / 1000 ) ,
ued = Math . round ( ed / 1000 ) ;
$ . ajax ( {
type : "get" ,
url : url ,
data : { "agenda_start" : sd . toLocaleString ( ) , "agenda_end" : ed . toLocaleString ( ) , "unix_start" : usd , "unix_end" : ued } ,
success : function ( events ) {
$ . each ( events , function ( i , e ) {
var ed = eventDom ( e ) ,
s = new Date ( e . start ) ,
e = new Date ( e . end ) ,
e _m = ( ( e . getMonth ( ) > s . getMonth ( ) || s . getMonth ( ) == e . getMonth ( ) ) && s . getFullYear ( ) == e . getFullYear ( ) ? e . getMonth ( ) : e . getMonth ( ) + 12 )
s _m = s . getMonth ( ) ,
s _y = s . getFullYear ( ) ;
if ( e . getFullYear ( ) > s . getFullYear ( ) )
e _m = e _m + ( ( e . getFullYear ( ) - s . getFullYear ( ) - 1 ) * 12 ) ;
for ( var i = s _m ; i < e _m + 1 ; i ++ ) {
var temp _ed = copyObject ( ed ) ;
var list = agenda _space . find ( "div[data-month=" + s _m + "][data-year=" + s _y + "] table.event_list tbody" ) ;
list . append ( temp _ed ) ;
s _m ++ ;
if ( s _m > 11 ) {
s _m = 0 ;
s _y ++ ;
}
}
if ( s . getDate ( ) == e . getDate ( ) && s . getMonth ( ) == s . getMonth ( ) && e . getFullYear ( ) == e . getFullYear ( ) ) {
var td = agenda _space . find ( "td[data-date-node=" + s . getDate ( ) + "-" + s . getMonth ( ) + "-" + s . getFullYear ( ) + "]" ) ;
td . addClass ( "has_event" ) ;
} else {
var timeDiff = Math . abs ( e . getTime ( ) - s . getTime ( ) ) ,
diffDays = Math . ceil ( timeDiff / ( 1000 * 3600 * 24 ) ) ,
c _m = s . getMonth ( ) ,
c _d = s . getDate ( ) ,
c _y = s . getFullYear ( ) ,
end _of _c _month = new Date ( s . getFullYear ( ) , s . getMonth ( ) + 1 , 0 ) . getDate ( ) ;
for ( var i = 0 ; i <= diffDays ; i ++ ) {
var td = agenda _space . find ( "td[data-date-node=" + c _d + "-" + c _m + "-" + c _y + "]" ) ;
td . addClass ( "has_event" ) ;
c _d ++ ;
if ( c _d > end _of _c _month ) {
c _d = 1 ;
c _m ++ ;
if ( c _m > 11 ) {
c _m = 0 ;
c _y ++ ;
}
}
}
}
} )
agenda _space . find ( "table.event_list tbody" ) . each ( function ( ) {
if ( $ ( this ) . find ( "tr" ) . length > 1 )
$ ( this ) . find ( "td.no_events" ) . parent ( ) . remove ( ) ;
} )
}
} )
var eventDom = function ( event ) {
var e _t = $ ( event _template ) ,
s = new Date ( event . start ) ,
e = new Date ( event . end ) ,
dateFormat = "" ;
if ( s . getDate ( ) == e . getDate ( ) && s . getMonth ( ) == s . getMonth ( ) && e . getFullYear ( ) == e . getFullYear ( ) )
dateFormat = $ . fullCalendar . formatDate ( s , "ddd dd" ) ;
else
dateFormat = $ . fullCalendar . formatDates ( s , e , "ddd dd, MMM - {ddd dd, MMM}" ) ;
e _t . find ( "th" ) . text ( dateFormat ) ;
e _t . find ( "td.event_time" ) . text ( ( event . allDay ? "All Day" : $ . fullCalendar . formatDate ( s , "hh:mm" ) ) ) ;
e _t . find ( "div.event" ) . text ( event . title ) . css ( "color" , event . color ) ;
return e _t ;
}
}
var loading = function ( bool ) {
if ( bool ) _calendar . loading . css ( "left" , ( $ ( window ) . width ( ) / 2 - 60 ) + "px" ) . show ( ) ;
else _calendar . loading . hide ( ) ;
}
var renderHead = function ( ) {
var head = $ ( head _template ) ;
var start _month _select = head . find ( "select[name=start_month]" ) ;
for ( var i = 0 ; i < 12 ; i ++ ) {
var option = $ ( "<option value='" + i + "'>" + monthNames [ i ] + "</option>" ) ;
if ( i == start _month )
option . attr ( "selected" , "selected" ) ;
start _month _select . append ( option ) ;
}
var end _month _select = head . find ( "select[name=end_month]" ) ;
for ( var i = 0 ; i < 12 ; i ++ ) {
var option = $ ( "<option value='" + i + "'>" + monthNames [ i ] + "</option>" ) ;
if ( i == end _month )
option . attr ( "selected" , "selected" ) ;
end _month _select . append ( option ) ;
}
var start _year _select = head . find ( "select[name=start_year]" ) ;
var y = start _year - 5 ;
for ( var i = 0 ; i < 10 ; i ++ ) {
var option = $ ( "<option value='" + y + "'>" + y + "</option>" ) ;
if ( y == start _year )
option . attr ( "selected" , "selected" ) ;
start _year _select . append ( option ) ;
y ++ ;
}
var end _year _select = head . find ( "select[name=end_year]" ) ;
y = start _year - 5 ;
for ( var i = 0 ; i < 10 ; i ++ ) {
var option = $ ( "<option value='" + y + "'>" + y + "</option>" ) ;
if ( y == end _year )
option . attr ( "selected" , "selected" ) ;
end _year _select . append ( option ) ;
y ++ ;
}
return head ;
}
var Month = function ( month , year ) {
_this = this ;
this . monthDom = $ ( "<div class='row-fluid' data-year='" + year + "' data-month='" + month + "'></div>" ) ;
var template = $ ( month _template ) ;
var list _template = $ ( event _list _template ) ;
var firstDay = new Date ( year , month , 1 ) ;
var lastDay = new Date ( year , month + 1 , 0 ) ;
var last _inserted _date = 1 ;
var renderMonth = function ( ) {
var num _of _rows = getNumberOfRows ( year , month )
for ( var i = 0 ; i < num _of _rows ; i ++ ) {
var tr = null ;
if ( i == 0 )
tr = makeRow ( "first" ) ;
else if ( i == ( num _of _rows - 1 ) ) {
tr = makeRow ( "last" ) ;
} else {
tr = makeRow ( "middle" ) ;
}
if ( tr == null ) {
break ;
}
template . find ( "table.table tbody" ) . append ( tr ) ;
template . find ( "h4" ) . text ( monthNames [ firstDay . getMonth ( ) ] + " - " + firstDay . getFullYear ( ) ) ;
}
_this . monthDom . append ( template ) ;
_this . monthDom . append ( list _template ) ;
}
function getNumberOfRows ( year , month ) {
var day = 1 ,
sat _counter = 0 ,
sunday _counter = 0 ,
date = new Date ( year , month , day ) ;
while ( date . getMonth ( ) === month ) {
if ( date . getDay ( ) === 0 ) {
sunday _counter ++ ;
} else if ( date . getDay ( ) === 6 ) {
sat _counter ++ ;
}
day ++ ;
date = new Date ( year , month , day ) ;
}
return ( sunday _counter == 5 && sat _counter == 5 ? 6 : 5 ) ;
}
var makeRow = function ( position ) {
if ( last _inserted _date <= lastDay . getDate ( ) ) {
var row = $ ( "<tr></tr>" ) ;
switch ( position ) {
case "first" :
for ( var i = 0 ; i < 7 ; i ++ ) {
var td = $ ( "<td></td>" ) ;
if ( i >= firstDay . getDay ( ) ) {
td . text ( last _inserted _date ) ;
td . attr ( "data-date-node" , last _inserted _date + "-" + firstDay . getMonth ( ) + "-" + firstDay . getFullYear ( ) ) ;
last _inserted _date ++ ;
}
row . append ( td ) ;
}
break ;
case "middle" :
for ( var i = 0 ; i < 7 ; i ++ ) {
var td = $ ( "<td></td>" ) ;
td . text ( last _inserted _date ) ;
td . attr ( "data-date-node" , last _inserted _date + "-" + firstDay . getMonth ( ) + "-" + firstDay . getFullYear ( ) ) ;
last _inserted _date ++ ;
row . append ( td ) ;
}
break ;
case "last" :
for ( var i = 0 ; i < 7 ; i ++ ) {
var td = $ ( "<td></td>" ) ;
if ( i <= lastDay . getDay ( ) ) {
td . text ( last _inserted _date ) ;
td . attr ( "data-date-node" , last _inserted _date + "-" + firstDay . getMonth ( ) + "-" + firstDay . getFullYear ( ) ) ;
last _inserted _date ++ ;
}
row . append ( td ) ;
}
break ;
}
} else {
var row = null ;
}
return row ;
}
renderMonth ( ) ;
}
}