repeat.js
427 lines
| 1 | jQuery(function(){ |
| 2 | (function($) { |
| 3 | var weekDays = new Array("SU","MO","TU","WE","TH","FR","SA"); |
| 4 | var weekDaysLarge = new Array("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday","Friday", "Saturday"); |
| 5 | var monthsName = new Array("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"); |
| 6 | var prefixes = new Array("first", "second", "third", "fourth", "last"); |
| 7 | var recurring = {"startDate":new Date(),"endDate":new Date(),format:"",dateFormat:"mm/dd/yy"}; |
| 8 | if (!DateAdd || typeof (DateDiff) != "function") { |
| 9 | var DateAdd = function(interval, number, idate) { |
| 10 | number = parseInt(number); |
| 11 | var date; |
| 12 | if (typeof (idate) == "string") { |
| 13 | date = idate.split(/\D/); |
| 14 | eval("var date = new Date(" + date.join(",") + ")"); |
| 15 | } |
| 16 | |
| 17 | if (typeof (idate) == "object") { |
| 18 | date = new Date(idate.toString()); |
| 19 | } |
| 20 | switch (interval) { |
| 21 | case "y": date.setFullYear(date.getFullYear() + number); break; |
| 22 | case "m": date.setMonth(date.getMonth() + number); break; |
| 23 | case "d": date.setDate(date.getDate() + number); break; |
| 24 | case "w": date.setDate(date.getDate() + 7 * number); break; |
| 25 | case "h": date.setHours(date.getHours() + number); break; |
| 26 | case "n": date.setMinutes(date.getMinutes() + number); break; |
| 27 | case "s": date.setSeconds(date.getSeconds() + number); break; |
| 28 | case "l": date.setMilliseconds(date.getMilliseconds() + number); break; |
| 29 | } |
| 30 | return date; |
| 31 | } |
| 32 | } |
| 33 | function weekAndDay(date) { |
| 34 | return (0 | (date.getDate()-1) / 7); |
| 35 | } |
| 36 | timeToUntilString= function(time) { |
| 37 | var date = new Date(time); |
| 38 | var comp, comps = [ |
| 39 | date.getUTCFullYear(), |
| 40 | date.getUTCMonth() + 1, |
| 41 | date.getUTCDate(), |
| 42 | 'T', |
| 43 | date.getUTCHours(), |
| 44 | date.getUTCMinutes(), |
| 45 | date.getUTCSeconds(), |
| 46 | 'Z' |
| 47 | ]; |
| 48 | for (var i = 0; i < comps.length; i++) { |
| 49 | comp = comps[i]; |
| 50 | if (!/[TZ]/.test(comp) && comp < 10) { |
| 51 | comps[i] = '0' + String(comp); |
| 52 | } |
| 53 | } |
| 54 | return comps.join(''); |
| 55 | } |
| 56 | loadRepeatData = function() |
| 57 | { |
| 58 | var data = recurring.format; |
| 59 | var startdate = recurring.startDate; |
| 60 | var enddate = recurring.endDate; |
| 61 | for (var i=1;i<=30;i++) |
| 62 | $("#interval").append('<option value="'+i+'">'+i+'</option>'); |
| 63 | for (var i=2;i<100;i++) |
| 64 | $("#end_after").append('<option value="'+i+'">'+i+'</option>'); |
| 65 | $("#end_after").val(5); |
| 66 | var currentDate = startdate; |
| 67 | $("#starts").html($.datepicker.formatDate(recurring.dateFormat,startdate)+" "+startdate.getHours()+":"+((startdate.getMinutes()<10)?"0":"")+startdate.getMinutes()); |
| 68 | $("#end_until_input").datepicker({dateFormat:recurring.dateFormat,onSelect: function(date) { |
| 69 | $("#end_until").prop( "checked", true ); |
| 70 | $("#end_until").trigger( "change" ); |
| 71 | }}) |
| 72 | $("#end_until_input").val($.datepicker.formatDate(recurring.dateFormat,enddate)); |
| 73 | if (data == "") |
| 74 | data = "FREQ=WEEKLY;BYDAY="+weekDays[currentDate.getDay()]+""; |
| 75 | var v_freq = 10; |
| 76 | var d = data.split(";"); |
| 77 | for (var i=0;i<d.length;i++) |
| 78 | { |
| 79 | var dd = d[i].split("="); |
| 80 | d[i] = {k:dd[0],v:dd[1]}; |
| 81 | } |
| 82 | for (var i=0;i<d.length;i++) |
| 83 | { |
| 84 | switch(d[i].k) |
| 85 | { |
| 86 | case "FREQ": |
| 87 | switch(d[i].v) |
| 88 | { |
| 89 | case "DAILY": |
| 90 | v_freq = 0; |
| 91 | break; |
| 92 | case "WEEKLY": |
| 93 | v_freq = 4; |
| 94 | break; |
| 95 | case "MONTHLY": |
| 96 | v_freq = 5; |
| 97 | break; |
| 98 | case "YEARLY": |
| 99 | v_freq = 6; |
| 100 | break; |
| 101 | } |
| 102 | break; |
| 103 | case "INTERVAL": |
| 104 | $("#interval").val(d[i].v); |
| 105 | break; |
| 106 | case "BYDAY": |
| 107 | var dd = d[i].v.split(","); |
| 108 | var sample1 = ["MO","TU","WE","TH","FR"]; //Every weekday (Monday to Friday) // ["MO","TU","WE","TH","FR"]; |
| 109 | if ($(dd).not(sample1).length == 0 && $(sample1).not(dd).length == 0) |
| 110 | v_freq = 1; |
| 111 | var sample2 = ["MO","WE","FR"]; //Every Monday, Wednesday, and Friday // ["MO","WE","FR"]; |
| 112 | if ($(dd).not(sample2).length == 0 && $(sample2).not(dd).length == 0) |
| 113 | v_freq = 2; |
| 114 | var sample3 = ["TU","TH"]; //Every Tuesday, and Thursday // ["TU","TH"]; |
| 115 | if ($(dd).not(sample3).length == 0 && $(sample3).not(dd).length == 0) |
| 116 | v_freq = 3; |
| 117 | for (j = 0; j < dd.length; j++) { |
| 118 | day = dd[j]; |
| 119 | if (day.length == 2) { // MO, TU, ... instanceof Weekday |
| 120 | $("#byday"+dd[j]).attr("checked","checked"); |
| 121 | } else { // -1MO, +3FR, 1SO, ... instanceof MONTHLY, YEARLY |
| 122 | day = day.match(/^([+-]?\d)([A-Z]{2})$/); |
| 123 | n = Number(day[1]); |
| 124 | wday = day[2]; |
| 125 | $("#byday_w").attr("checked","checked"); |
| 126 | } |
| 127 | } |
| 128 | for (var j=0;j<dd.length;j++) |
| 129 | $("#byday"+dd[j]).attr("checked","checked"); |
| 130 | break; |
| 131 | case "COUNT": |
| 132 | $("#end_count").attr("checked","checked"); |
| 133 | $("#end_after").val(d[i].v); |
| 134 | break; |
| 135 | case "UNTIL": |
| 136 | var day = /(\d{4})(\d{2})(\d{2})T(\d{2})(\d{2})(\d{2})Z/.exec(d[i].v); |
| 137 | var until = new Date(Date.UTC(day[1], day[2] - 1,day[3], day[4], day[5], day[6])); |
| 138 | $("#end_until").attr("checked","checked"); |
| 139 | $("#end_until_input").val((until.getMonth()+1)+"/"+until.getDate()+"/"+until.getFullYear()); |
| 140 | break; |
| 141 | case "BYMONTHDAY": |
| 142 | case "BYMONTH": |
| 143 | $("#byday_m").attr("checked","checked"); |
| 144 | break; |
| 145 | } |
| 146 | } |
| 147 | summaryDisplay = function() |
| 148 | { |
| 149 | var v = parseInt($("#freq").val()); |
| 150 | var summary = ""; |
| 151 | var format = ""; |
| 152 | switch(v) |
| 153 | { |
| 154 | case 0: |
| 155 | format += "FREQ=DAILY"; |
| 156 | if ($("#interval").val()==1) |
| 157 | summary += "Daily"; |
| 158 | else |
| 159 | { |
| 160 | summary += "Every "+$("#interval").val()+" days" ; |
| 161 | format += ";INTERVAL="+$("#interval").val(); |
| 162 | } |
| 163 | break; |
| 164 | case 1: |
| 165 | format += "FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR"; |
| 166 | summary += "Weekly on weekdays"; |
| 167 | break; |
| 168 | case 2: |
| 169 | format += "FREQ=WEEKLY;BYDAY=MO,WE,FR"; |
| 170 | summary += "Weekly on Monday, Wednesday, Friday"; |
| 171 | break; |
| 172 | case 3: |
| 173 | format += "FREQ=WEEKLY;BYDAY=TU,TH"; |
| 174 | summary += "Weekly on Tuesday, Thursday"; |
| 175 | break; |
| 176 | case 4: |
| 177 | format += "FREQ=WEEKLY"; |
| 178 | for (var i=0;i<weekDays.length;i++) |
| 179 | { |
| 180 | if ($("#byday"+weekDays[i]).is(":checked")) |
| 181 | { |
| 182 | if (summary =="") |
| 183 | { |
| 184 | summary += " on "; |
| 185 | format += ";BYDAY="; |
| 186 | } |
| 187 | else |
| 188 | { |
| 189 | summary += ", "; |
| 190 | format += ","; |
| 191 | } |
| 192 | summary += weekDaysLarge[i]; |
| 193 | format += weekDays[i]; |
| 194 | } |
| 195 | } |
| 196 | if ($("#interval").val()==1) |
| 197 | summary = "Weekly"+summary; |
| 198 | else |
| 199 | { |
| 200 | summary = "Every "+$("#interval").val()+" weeks"+summary; |
| 201 | format += ";INTERVAL="+$("#interval").val(); |
| 202 | } |
| 203 | break; |
| 204 | case 5: |
| 205 | format += "FREQ=MONTHLY"; |
| 206 | if ($("#byday_m").is(":checked")) |
| 207 | { |
| 208 | summary += " on day "+currentDate.getDate(); |
| 209 | format += ";BYMONTHDAY="+currentDate.getDate(); |
| 210 | } |
| 211 | else |
| 212 | { |
| 213 | summary += " on the "+prefixes[weekAndDay(currentDate)]+ " " +weekDaysLarge[currentDate.getDay()]; |
| 214 | format += ";BYDAY="+(weekAndDay(currentDate)==4?-1:(weekAndDay(currentDate)+1))+weekDays[currentDate.getDay()]; |
| 215 | } |
| 216 | if ($("#interval").val()==1) |
| 217 | summary = "Monthly"+summary; |
| 218 | else |
| 219 | { |
| 220 | summary = "Every "+$("#interval").val()+" months"+summary; |
| 221 | format += ";INTERVAL="+$("#interval").val(); |
| 222 | } |
| 223 | break; |
| 224 | case 6: |
| 225 | format += "FREQ=YEARLY;BYMONTH="+(currentDate.getMonth()+1); |
| 226 | if ($("#byday_m").is(":checked")) |
| 227 | { |
| 228 | summary += " on " + monthsName[currentDate.getMonth()] + " " + currentDate.getDate(); |
| 229 | } |
| 230 | else |
| 231 | { |
| 232 | summary += " on " + monthsName[currentDate.getMonth()] + ", "+prefixes[weekAndDay(currentDate)]+ " " +weekDaysLarge[currentDate.getDay()]; |
| 233 | format += ";BYDAY="+(weekAndDay(currentDate)+1)+weekDays[currentDate.getDay()]; |
| 234 | } |
| 235 | if ($("#interval").val()==1) |
| 236 | summary = "Annually"+summary; |
| 237 | else |
| 238 | { |
| 239 | summary = "Every "+$("#interval").val()+" years"+summary; |
| 240 | format += ";INTERVAL="+$("#interval").val(); |
| 241 | } |
| 242 | break; |
| 243 | } |
| 244 | if ($("#end_count").is(":checked")) |
| 245 | { |
| 246 | if (parseInt($("#end_after").val())==1) |
| 247 | summary = "Once"; |
| 248 | else |
| 249 | { |
| 250 | summary += ", "+$("#end_after").val()+" times"; |
| 251 | format += ";COUNT="+$("#end_after").val(); |
| 252 | } |
| 253 | } |
| 254 | else if ($("#end_until").is(":checked")) |
| 255 | { |
| 256 | if ($("#end_until_input").val()!="") |
| 257 | { |
| 258 | var endDate = $("#end_until_input").datepicker( "getDate" ); |
| 259 | endDate = new Date(endDate.getTime()+24*60*60*1000-1000) |
| 260 | recurring.endDate = endDate; |
| 261 | summary += ", until " + monthsName[endDate.getMonth()] + " " + endDate.getDate() + ", " + endDate.getFullYear(); |
| 262 | format += ";UNTIL="+timeToUntilString(endDate); |
| 263 | } |
| 264 | } |
| 265 | $("#summary").html(summary); |
| 266 | $("#format").val(format); |
| 267 | if ($("#format").val()=="") |
| 268 | { |
| 269 | $("#repeatspan").html(""); |
| 270 | $("#repeatcheckbox").attr("checked",""); |
| 271 | } |
| 272 | else |
| 273 | { |
| 274 | $("#repeatspan").html(summary); |
| 275 | $("#repeatcheckbox").attr("checked","checked"); |
| 276 | } |
| 277 | |
| 278 | var list = getRepeatList(); |
| 279 | if (!$("#end_count").is(":checked")) |
| 280 | { |
| 281 | $("#end_after").val(list.length+1); |
| 282 | } |
| 283 | else |
| 284 | { |
| 285 | $("#end_until_input").val($.datepicker.formatDate(recurring.dateFormat,list[list.length-1])); |
| 286 | } |
| 287 | |
| 288 | } |
| 289 | changeDisplay = function(v) |
| 290 | { |
| 291 | if (v==10) |
| 292 | { |
| 293 | $("#repeatOptions").css("display","none"); |
| 294 | return; |
| 295 | } |
| 296 | else |
| 297 | $("#repeatOptions").css("display","block"); |
| 298 | if (v==1 || v==2 || v==3) |
| 299 | $("#intervaldiv").css("display","none"); |
| 300 | else |
| 301 | { |
| 302 | $("#intervaldiv").css("display","block"); |
| 303 | if (v==0) $("#interval_label").html("days"); |
| 304 | else if (v==4) $("#interval_label").html("weeks"); |
| 305 | else if (v==5) $("#interval_label").html("months"); |
| 306 | else if (v==6) $("#interval_label").html("years"); |
| 307 | } |
| 308 | if (v==4) |
| 309 | $("#bydayweek").css("display","block"); |
| 310 | else |
| 311 | $("#bydayweek").css("display","none"); //none |
| 312 | if (v==5 || v==6) |
| 313 | $("#bydaymonth").css("display","block"); |
| 314 | else |
| 315 | $("#bydaymonth").css("display","none"); |
| 316 | summaryDisplay(); |
| 317 | |
| 318 | } |
| 319 | getRepeatList = function() |
| 320 | { |
| 321 | var options = RRule.parseString($("#format").val()); |
| 322 | options.dtstart = recurring.startDate; |
| 323 | var r = new RRule(options); |
| 324 | var ne = r.between( recurring.startDate,new Date(3000, 0, 1)); |
| 325 | var str = ""; |
| 326 | for (var i=0;i<ne.length;i++) |
| 327 | { |
| 328 | var hour = ne[i].getHours(); |
| 329 | var timead = ''; |
| 330 | if (cpabc_global_military_time == '0') |
| 331 | { |
| 332 | if (parseInt(hour) > 12) |
| 333 | { |
| 334 | timead = " pm"; |
| 335 | hour = parseInt(hour)-12; |
| 336 | } |
| 337 | else |
| 338 | timead = " am"; |
| 339 | } |
| 340 | var minutes = ne[i].getMinutes(); |
| 341 | if (minutes < 10) |
| 342 | minutes = "0"+minutes; |
| 343 | sel_fdate = " "+hour+":"+minutes+timead; |
| 344 | if (cpabc_global_date_format == '1') |
| 345 | sel_fdate = ne[i].getDate() + "/" + (ne[i].getMonth()+ 1) +"/" + ne[i].getFullYear() + sel_fdate; |
| 346 | else if (cpabc_global_date_format == '2') |
| 347 | sel_fdate = ne[i].getDate() + "." + (ne[i].getMonth()+ 1) +"." + ne[i].getFullYear() + sel_fdate; |
| 348 | else |
| 349 | sel_fdate = (ne[i].getMonth()+ 1) + "/" + ne[i].getDate() +"/" + ne[i].getFullYear() + sel_fdate; |
| 350 | str += "<div>"+(i+1)+". " + sel_fdate+"</div>"; |
| 351 | } |
| 352 | $("#repeatList").html(str); |
| 353 | var str = ""; |
| 354 | for (var i=0;i<ne.length;i++) |
| 355 | { |
| 356 | str += ";"+ne[i].getFullYear() + "," + (ne[i].getMonth()+ 1) +"," + ne[i].getDate() + " " + ne[i].getHours() + ":" + ((ne[i].getMinutes()<10)?"0":"")+ne[i].getMinutes(); |
| 357 | } |
| 358 | $("#selMonthcal"+cpabc_current_calendar_item).val(str); |
| 359 | return ne; |
| 360 | |
| 361 | } |
| 362 | |
| 363 | //$("#freq").val(v_freq); |
| 364 | //changeDisplay(v_freq); |
| 365 | |
| 366 | $("#freq").change(function(){ |
| 367 | if ($(this).val()==10) |
| 368 | { |
| 369 | $("#repeatOptions").css("display","none"); |
| 370 | $("#repeatList").html(""); |
| 371 | } |
| 372 | else |
| 373 | { |
| 374 | $("#repeatOptions").css("display","block"); |
| 375 | changeDisplay($(this).val()); |
| 376 | } |
| 377 | |
| 378 | }); |
| 379 | $("#interval").change(function(){ |
| 380 | summaryDisplay(); |
| 381 | }); |
| 382 | $("#end_never").change(function(){ |
| 383 | summaryDisplay(); |
| 384 | }); |
| 385 | $("#end_count").change(function(){ |
| 386 | summaryDisplay(); |
| 387 | }); |
| 388 | $("#end_until").change(function(){ |
| 389 | summaryDisplay(); |
| 390 | }); |
| 391 | $("#end_after").change(function(){ |
| 392 | summaryDisplay(); |
| 393 | }); |
| 394 | $("#end_until_input").change(function(){ |
| 395 | summaryDisplay(); |
| 396 | }); |
| 397 | $(".bydayw").change(function(){ |
| 398 | summaryDisplay(); |
| 399 | }); |
| 400 | $(".bydaym").click(function(){ |
| 401 | summaryDisplay(); |
| 402 | }); |
| 403 | } |
| 404 | $("#selDaycal"+cpabc_current_calendar_item).change(function(){ |
| 405 | if ($(this).val()!="") |
| 406 | { |
| 407 | var v = $(this).val(); |
| 408 | v = v.split(";"); |
| 409 | if (v.length>1) |
| 410 | { |
| 411 | var d0 = v[1].split(","); |
| 412 | var d1 = d0[2].split(" "); |
| 413 | var d2 = d1[1].split(":"); |
| 414 | var d = new Date(parseInt(d0[0]),parseInt(d0[1])-1,parseInt(d1[0]),parseInt(d2[0]),parseInt(d2[1])); |
| 415 | $("#repeat").css("display","block"); |
| 416 | recurring = {"startDate":d,"endDate":DateAdd("m", 1, d),format:$("#format").val(),dateFormat:recurring.dateFormat}; |
| 417 | loadRepeatData(); |
| 418 | summaryDisplay(); |
| 419 | return; |
| 420 | } |
| 421 | } |
| 422 | $("#repeat").css("display","none"); |
| 423 | $("#selMonthcal"+cpabc_current_calendar_item).val(""); |
| 424 | |
| 425 | }); |
| 426 | })(jQuery); |
| 427 | }); |