2011-08-03 14:09:14 +00:00
/ *
This software is allowed to use under GPL or you need to obtain Commercial or Enterise License
to use it in not GPL project . Please contact sales @ dhtmlx . com for details
* /
2011-04-07 16:41:06 +00:00
scheduler . templates . calendar _month = scheduler . date . date _to _str ( "%F %Y" ) ;
scheduler . templates . calendar _scale _date = scheduler . date . date _to _str ( "%D" ) ;
scheduler . templates . calendar _date = scheduler . date . date _to _str ( "%d" ) ;
scheduler . renderCalendar = function ( obj , _prev ) {
var cal = null ;
var date = obj . date || ( new Date ( ) ) ;
if ( typeof date == "string" )
date = this . templates . api _date ( date ) ;
if ( ! _prev ) {
var cont = obj . container ;
var pos = obj . position ;
if ( typeof cont == "string" )
cont = document . getElementById ( cont ) ;
if ( typeof pos == "string" )
pos = document . getElementById ( pos ) ;
if ( pos && ( typeof pos . left == "undefined" ) ) {
var tpos = getOffset ( pos ) ;
pos = {
top : tpos . top + pos . offsetHeight ,
left : tpos . left
} ;
2011-08-03 14:09:14 +00:00
}
2011-04-07 16:41:06 +00:00
if ( ! cont )
cont = scheduler . _get _def _cont ( pos ) ;
cal = this . _render _calendar ( cont , date , obj ) ;
cal . onclick = function ( e ) {
e = e || event ;
var src = e . target || e . srcElement ;
if ( src . className . indexOf ( "dhx_month_head" ) != - 1 ) {
var pname = src . parentNode . className ;
if ( pname . indexOf ( "dhx_after" ) == - 1 && pname . indexOf ( "dhx_before" ) == - 1 ) {
var newdate = scheduler . templates . xml _date ( this . getAttribute ( "date" ) ) ;
newdate . setDate ( parseInt ( src . innerHTML , 10 ) ) ;
scheduler . unmarkCalendar ( this ) ;
scheduler . markCalendar ( this , newdate , "dhx_calendar_click" ) ;
this . _last _date = newdate ;
if ( this . conf . handler ) this . conf . handler . call ( scheduler , newdate , this ) ;
}
}
} ;
} else {
cal = this . _render _calendar ( _prev . parentNode , date , obj , _prev ) ;
scheduler . unmarkCalendar ( cal ) ;
}
2011-08-03 14:09:14 +00:00
2011-04-07 16:41:06 +00:00
var start = scheduler . date . month _start ( date ) ;
var end = scheduler . date . add ( start , 1 , "month" ) ;
var evs = this . getEvents ( start , end ) ;
for ( var i = 0 ; i < evs . length ; i ++ ) {
var ev = evs [ i ] ;
var d = ev . start _date ;
if ( d . valueOf ( ) < start . valueOf ( ) )
d = start ;
2011-08-03 14:09:14 +00:00
d = scheduler . date . date _part ( new Date ( d . valueOf ( ) ) ) ;
while ( d < ev . end _date ) {
2011-04-07 16:41:06 +00:00
this . markCalendar ( cal , d , "dhx_year_event" ) ;
d = this . date . add ( d , 1 , "day" ) ;
if ( d . valueOf ( ) >= end . valueOf ( ) )
break ;
}
}
2011-08-03 14:09:14 +00:00
this . _markCalendarCurrentDate ( cal ) ;
2011-04-07 16:41:06 +00:00
cal . conf = obj ;
return cal ;
} ;
scheduler . _get _def _cont = function ( pos ) {
if ( ! this . _def _count ) {
this . _def _count = document . createElement ( "DIV" ) ;
this . _def _count . style . cssText = "position:absolute;z-index:10100;width:251px; height:175px;" ;
this . _def _count . onclick = function ( e ) { ( e || event ) . cancelBubble = true ; } ;
document . body . appendChild ( this . _def _count ) ;
}
this . _def _count . style . left = pos . left + "px" ;
this . _def _count . style . top = pos . top + "px" ;
this . _def _count . _created = new Date ( ) ;
return this . _def _count ;
} ;
scheduler . _locateCalendar = function ( cal , date ) {
var table = cal . childNodes [ 2 ] . childNodes [ 0 ] ;
if ( typeof date == "string" )
date = scheduler . templates . api _date ( date ) ;
var d = cal . week _start + date . getDate ( ) - 1 ;
return table . rows [ Math . floor ( d / 7 ) ] . cells [ d % 7 ] . firstChild ;
} ;
scheduler . markCalendar = function ( cal , date , css ) {
this . _locateCalendar ( cal , date ) . className += " " + css ;
} ;
scheduler . unmarkCalendar = function ( cal , date , css ) {
date = date || cal . _last _date ;
css = css || "dhx_calendar_click" ;
if ( ! date ) return ;
var el = this . _locateCalendar ( cal , date ) ;
el . className = ( el . className || "" ) . replace ( RegExp ( css , "g" ) ) ;
} ;
scheduler . _week _template = function ( width ) {
var summ = ( width || 250 ) ;
var left = 0 ;
var week _template = document . createElement ( "div" ) ;
var dummy _date = this . date . week _start ( new Date ( ) ) ;
for ( var i = 0 ; i < 7 ; i ++ ) {
this . _cols [ i ] = Math . floor ( summ / ( 7 - i ) ) ;
this . _render _x _header ( i , left , dummy _date , week _template ) ;
dummy _date = this . date . add ( dummy _date , 1 , "day" ) ;
summ -= this . _cols [ i ] ;
left += this . _cols [ i ] ;
}
week _template . lastChild . className += " dhx_scale_bar_last" ;
return week _template ;
} ;
scheduler . updateCalendar = function ( obj , sd ) {
obj . conf . date = sd ;
this . renderCalendar ( obj . conf , obj ) ;
} ;
scheduler . _mini _cal _arrows = [ " " , " " ] ;
scheduler . _render _calendar = function ( obj , sd , conf , previous ) {
/*store*/
var ts = scheduler . templates ;
var temp = this . _cols ; this . _cols = [ ] ;
var temp2 = this . _mode ; this . _mode = "calendar" ;
var temp3 = this . _colsS ; this . _colsS = { height : 0 } ;
var temp4 = new Date ( this . _min _date ) ;
var temp5 = new Date ( this . _max _date ) ;
var temp6 = new Date ( scheduler . _date ) ;
var temp7 = ts . month _day ; ts . month _day = ts . calendar _date ;
sd = this . date . month _start ( sd ) ;
var week _template = this . _week _template ( obj . offsetWidth - 1 ) ;
var d ;
if ( previous )
d = previous ;
else {
2011-08-03 14:09:14 +00:00
d = document . createElement ( "DIV" ) ;
2011-04-07 16:41:06 +00:00
d . className = "dhx_cal_container dhx_mini_calendar" ;
}
d . setAttribute ( "date" , this . templates . xml _format ( sd ) ) ;
d . innerHTML = "<div class='dhx_year_month'></div><div class='dhx_year_week'>" + week _template . innerHTML + "</div><div class='dhx_year_body'></div>" ;
d . childNodes [ 0 ] . innerHTML = this . templates . calendar _month ( sd ) ;
if ( conf . navigation ) {
var arrow = document . createElement ( "DIV" ) ;
arrow . className = "dhx_cal_prev_button" ;
arrow . style . cssText = "left:1px;top:2px;position:absolute;" ;
arrow . innerHTML = this . _mini _cal _arrows [ 0 ] ;
d . firstChild . appendChild ( arrow ) ;
arrow . onclick = function ( ) {
scheduler . updateCalendar ( d , scheduler . date . add ( d . _date , - 1 , "month" ) ) ;
2011-08-03 14:09:14 +00:00
if ( scheduler . _date . getMonth ( ) == d . _date . getMonth ( ) && scheduler . _date . getFullYear ( ) == d . _date . getFullYear ( ) ) {
scheduler . _markCalendarCurrentDate ( d ) ;
}
2011-04-07 16:41:06 +00:00
} ;
arrow = document . createElement ( "DIV" ) ;
arrow . className = "dhx_cal_next_button" ;
arrow . style . cssText = "left:auto; right:1px;top:2px;position:absolute;" ;
arrow . innerHTML = this . _mini _cal _arrows [ 1 ] ;
d . firstChild . appendChild ( arrow ) ;
arrow . onclick = function ( ) {
scheduler . updateCalendar ( d , scheduler . date . add ( d . _date , 1 , "month" ) ) ;
2011-08-03 14:09:14 +00:00
if ( scheduler . _date . getMonth ( ) == d . _date . getMonth ( ) && scheduler . _date . getFullYear ( ) == d . _date . getFullYear ( ) ) {
scheduler . _markCalendarCurrentDate ( d ) ;
}
2011-04-07 16:41:06 +00:00
} ;
2011-08-03 14:09:14 +00:00
2011-04-07 16:41:06 +00:00
}
2011-08-03 14:09:14 +00:00
d . _date = new Date ( sd ) ;
2011-04-07 16:41:06 +00:00
d . week _start = ( sd . getDay ( ) - ( this . config . start _on _monday ? 1 : 0 ) + 7 ) % 7 ;
var dd = this . date . week _start ( sd ) ;
this . _reset _month _scale ( d . childNodes [ 2 ] , sd , dd ) ;
var r = d . childNodes [ 2 ] . firstChild . rows ;
for ( var k = r . length ; k < 6 ; k ++ ) {
2011-08-03 14:09:14 +00:00
var last _row = r [ r . length - 1 ] ;
r [ 0 ] . parentNode . appendChild ( last _row . cloneNode ( true ) ) ;
var last _day _number = parseInt ( last _row . childNodes [ last _row . childNodes . length - 1 ] . childNodes [ 0 ] . innerHTML ) ;
last _day _number = ( last _day _number < 10 ) ? last _day _number : 0 ; // previous week could end on 28-31, so we should start with 0
2011-04-07 16:41:06 +00:00
for ( var ri = 0 ; ri < r [ k ] . childNodes . length ; ri ++ ) {
r [ k ] . childNodes [ ri ] . className = "dhx_after" ;
2011-08-03 14:09:14 +00:00
r [ k ] . childNodes [ ri ] . childNodes [ 0 ] . innerHTML = scheduler . date . to _fixed ( ++ last _day _number ) ;
}
2011-04-07 16:41:06 +00:00
}
if ( ! previous )
obj . appendChild ( d ) ;
2011-08-03 14:09:14 +00:00
2012-03-29 11:32:34 +00:00
d . childNodes [ 1 ] . style . height = d . childNodes [ 1 ] . childNodes [ 0 ] . offsetHeight <= 0 ? "0px" : ( d . childNodes [ 1 ] . childNodes [ 0 ] . offsetHeight - 1 ) + "px" ; // dhx_year_week should have height property so that day dates would get correct position. dhx_year_week height = height of it's child (with the day name)
2011-04-07 16:41:06 +00:00
/*restore*/ this . _cols = temp ; this . _mode = temp2 ; this . _colsS = temp3 ; this . _min _date = temp4 ; this . _max _date = temp5 ; scheduler . _date = temp6 ; ts . month _day = temp7 ;
return d ;
} ;
scheduler . destroyCalendar = function ( cal , force ) {
if ( ! cal && this . _def _count && this . _def _count . firstChild ) {
if ( force || ( new Date ( ) ) . valueOf ( ) - this . _def _count . _created . valueOf ( ) > 500 )
cal = this . _def _count . firstChild ;
}
if ( ! cal ) return ;
cal . onclick = null ;
cal . innerHTML = "" ;
if ( cal . parentNode )
cal . parentNode . removeChild ( cal ) ;
if ( this . _def _count )
this . _def _count . style . top = "-1000px" ;
} ;
scheduler . isCalendarVisible = function ( ) {
if ( this . _def _count && parseInt ( this . _def _count . style . top , 10 ) > 0 )
return this . _def _count ;
return false ;
} ;
scheduler . attachEvent ( "onTemplatesReady" , function ( ) {
dhtmlxEvent ( document . body , "click" , function ( ) { scheduler . destroyCalendar ( ) ; } ) ;
} ) ;
scheduler . templates . calendar _time = scheduler . date . date _to _str ( "%d-%m-%Y" ) ;
scheduler . form _blocks . calendar _time = {
render : function ( ) {
var html = "<input class='dhx_readonly' type='text' readonly='true'>" ;
var cfg = scheduler . config ;
var dt = this . date . date _part ( new Date ( ) ) ;
if ( cfg . first _hour )
dt . setHours ( cfg . first _hour ) ;
html += " <select>" ;
for ( var i = 60 * cfg . first _hour ; i < 60 * cfg . last _hour ; i += this . config . time _step * 1 ) {
var time = this . templates . time _picker ( dt ) ;
html += "<option value='" + i + "'>" + time + "</option>" ;
dt = this . date . add ( dt , this . config . time _step , "minute" ) ;
}
html += "</select>" ;
var full _day = scheduler . config . full _day ;
2011-08-03 14:09:14 +00:00
return "<div style='height:30px;padding-top:0; font-size:inherit;' class='dhx_section_time'>" + html + "<span style='font-weight:normal; font-size:10pt;'> – </span>" + html + "</div>" ;
2011-04-07 16:41:06 +00:00
} ,
set _value : function ( node , value , ev ) {
var inputs = node . getElementsByTagName ( "input" ) ;
var selects = node . getElementsByTagName ( "select" ) ;
var _init _once = function ( inp , date , number ) {
inp . onclick = function ( ) {
scheduler . destroyCalendar ( null , true ) ;
scheduler . renderCalendar ( {
position : inp ,
date : new Date ( this . _date ) ,
navigation : true ,
handler : function ( new _date ) {
inp . value = scheduler . templates . calendar _time ( new _date ) ;
inp . _date = new Date ( new _date ) ;
scheduler . destroyCalendar ( ) ;
2011-08-03 14:09:14 +00:00
if ( scheduler . config . event _duration && scheduler . config . auto _end _date && number == 0 ) { //first element = start date
2011-04-07 16:41:06 +00:00
_update _minical _select ( ) ;
}
}
} ) ;
} ;
} ;
if ( scheduler . config . full _day ) {
if ( ! node . _full _day ) {
2011-08-03 14:09:14 +00:00
var html = "<label class='dhx_fullday'><input type='checkbox' name='full_day' value='true'> " + scheduler . locale . labels . full _day + " </label></input>" ;
if ( ! scheduler . config . wide _form )
html = node . previousSibling . innerHTML + html ;
node . previousSibling . innerHTML = html ;
2011-04-07 16:41:06 +00:00
node . _full _day = true ;
}
var input = node . previousSibling . getElementsByTagName ( "input" ) [ 0 ] ;
var isFulldayEvent = ( scheduler . date . time _part ( ev . start _date ) == 0 && scheduler . date . time _part ( ev . end _date ) == 0 && ev . end _date . valueOf ( ) - ev . start _date . valueOf ( ) < 2 * 24 * 60 * 60 * 1000 ) ;
input . checked = isFulldayEvent ;
for ( var i in selects )
selects [ i ] . disabled = input . checked ;
2011-08-03 14:09:14 +00:00
for ( var i = 0 ; i < inputs . length ; i ++ )
2011-04-07 16:41:06 +00:00
inputs [ i ] . disabled = input . checked ;
input . onclick = function ( ) {
if ( input . checked == true ) {
var start _date = new Date ( ev . start _date ) ;
var end _date = new Date ( ev . end _date ) ;
scheduler . date . date _part ( start _date ) ;
end _date = scheduler . date . add ( start _date , 1 , "day" ) ;
}
var start = start _date || ev . start _date ;
var end = end _date || ev . end _date ;
_attach _action ( inputs [ 0 ] , start ) ;
_attach _action ( inputs [ 1 ] , end ) ;
selects [ 0 ] . value = start . getHours ( ) * 60 + start . getMinutes ( ) ;
selects [ 1 ] . value = end . getHours ( ) * 60 + end . getMinutes ( ) ;
for ( var i in selects )
selects [ i ] . disabled = input . checked ;
2011-08-03 14:09:14 +00:00
for ( var i = 0 ; i < inputs . length ; i ++ )
2011-04-07 16:41:06 +00:00
inputs [ i ] . disabled = input . checked ;
} ;
2011-08-03 14:09:14 +00:00
}
2011-04-07 16:41:06 +00:00
2011-08-03 14:09:14 +00:00
if ( scheduler . config . event _duration && scheduler . config . auto _end _date ) {
2011-04-07 16:41:06 +00:00
function _update _minical _select ( ) {
ev . start _date = scheduler . date . add ( inputs [ 0 ] . _date , selects [ 0 ] . value , "minute" ) ;
ev . end _date . setTime ( ev . start _date . getTime ( ) + ( scheduler . config . event _duration * 60 * 1000 ) ) ;
inputs [ 1 ] . value = scheduler . templates . calendar _time ( ev . end _date ) ;
inputs [ 1 ] . _date = scheduler . date . date _part ( new Date ( ev . end _date ) ) ;
selects [ 1 ] . value = ev . end _date . getHours ( ) * 60 + ev . end _date . getMinutes ( ) ;
}
2011-08-03 14:09:14 +00:00
selects [ 0 ] . onchange = _update _minical _select ; // only update on first select should trigger update so user could define other end date if he wishes too
2011-04-07 16:41:06 +00:00
}
function _attach _action ( inp , date , number ) {
_init _once ( inp , date , number ) ;
inp . value = scheduler . templates . calendar _time ( date ) ;
inp . _date = scheduler . date . date _part ( new Date ( date ) ) ;
} ;
_attach _action ( inputs [ 0 ] , ev . start _date , 0 ) ;
_attach _action ( inputs [ 1 ] , ev . end _date , 1 ) ;
_init _once = function ( ) { } ;
selects [ 0 ] . value = ev . start _date . getHours ( ) * 60 + ev . start _date . getMinutes ( ) ;
selects [ 1 ] . value = ev . end _date . getHours ( ) * 60 + ev . end _date . getMinutes ( ) ;
} ,
get _value : function ( node , ev ) {
var inputs = node . getElementsByTagName ( "input" ) ;
var selects = node . getElementsByTagName ( "select" ) ;
ev . start _date = scheduler . date . add ( inputs [ 0 ] . _date , selects [ 0 ] . value , "minute" ) ;
ev . end _date = scheduler . date . add ( inputs [ 1 ] . _date , selects [ 1 ] . value , "minute" ) ;
if ( ev . end _date <= ev . start _date )
ev . end _date = scheduler . date . add ( ev . start _date , scheduler . config . time _step , "minute" ) ;
} ,
focus : function ( node ) {
}
} ;
scheduler . linkCalendar = function ( calendar , datediff ) {
var action = function ( ) {
var date = scheduler . _date ;
var dateNew = new Date ( date . valueOf ( ) ) ;
if ( datediff ) dateNew = datediff ( dateNew ) ;
dateNew . setDate ( 1 ) ;
scheduler . updateCalendar ( calendar , dateNew ) ;
return true ;
} ;
scheduler . attachEvent ( "onViewChange" , action ) ;
scheduler . attachEvent ( "onXLE" , action ) ;
scheduler . attachEvent ( "onEventAdded" , action ) ;
scheduler . attachEvent ( "onEventChanged" , action ) ;
scheduler . attachEvent ( "onAfterEventDelete" , action ) ;
action ( ) ;
2011-08-03 14:09:14 +00:00
} ;
scheduler . _markCalendarCurrentDate = function ( calendar ) {
var date = scheduler . _date ;
var mode = scheduler . _mode ;
if ( calendar . _date . getMonth ( ) == date . getMonth ( ) && calendar . _date . getFullYear ( ) == date . getFullYear ( ) ) {
if ( mode == 'day' || ( this . _props && ! ! this . _props [ mode ] ) ) {
scheduler . markCalendar ( calendar , date , "dhx_calendar_click" ) ;
} else if ( mode == 'week' ) {
var dateNew = scheduler . date . week _start ( new Date ( date . valueOf ( ) ) ) ;
for ( var i = 0 ; i < 7 ; i ++ ) {
var diff = dateNew . getMonth ( ) + dateNew . getYear ( ) * 12 - date . getMonth ( ) - date . getYear ( ) * 12 ;
if ( ! diff )
scheduler . markCalendar ( calendar , dateNew , "dhx_calendar_click" ) ;
dateNew = scheduler . date . add ( dateNew , 1 , "day" ) ;
}
}
}
} ;