summaryrefslogtreecommitdiff
path: root/public/javascripts
diff options
context:
space:
mode:
Diffstat (limited to 'public/javascripts')
-rw-r--r--public/javascripts/admin_interface.js46
1 files changed, 44 insertions, 2 deletions
diff --git a/public/javascripts/admin_interface.js b/public/javascripts/admin_interface.js
index 9ce0b9e..3988016 100644
--- a/public/javascripts/admin_interface.js
+++ b/public/javascripts/admin_interface.js
@@ -415,8 +415,10 @@ rrule_builder = {
415 }); 415 });
416 $("#rrule_monthly_ordinal").bind("change", function() { 416 $("#rrule_monthly_ordinal").bind("change", function() {
417 $("#rrule_ordinal_fields").toggle($(this).is(":checked")); 417 $("#rrule_ordinal_fields").toggle($(this).is(":checked"));
418 rrule_builder.toggle_custom_ordinal_fields();
418 rrule_builder.sync(); 419 rrule_builder.sync();
419 }); 420 });
421 $("#rrule_ordinal").bind("change", rrule_builder.toggle_custom_ordinal_fields);
420 $("#rrule_exclude_month").bind("change", function() { 422 $("#rrule_exclude_month").bind("change", function() {
421 $("#rrule_excluded_month").toggle($(this).is(":checked")); 423 $("#rrule_excluded_month").toggle($(this).is(":checked"));
422 rrule_builder.sync(); 424 rrule_builder.sync();
@@ -433,6 +435,12 @@ rrule_builder = {
433 $("#rrule_monthly_options").show(); 435 $("#rrule_monthly_options").show();
434 }, 436 },
435 437
438 toggle_custom_ordinal_fields : function() {
439 $("#rrule_custom_ordinal_fields").toggle(
440 $("#rrule_monthly_ordinal").is(":checked") && $("#rrule_ordinal").val() === "custom"
441 );
442 },
443
436 sync : function() { 444 sync : function() {
437 var freq = $("input[name='rrule_freq']:checked").val(); 445 var freq = $("input[name='rrule_freq']:checked").val();
438 var parts = []; 446 var parts = [];
@@ -448,7 +456,16 @@ rrule_builder = {
448 } else { 456 } else {
449 parts.push("FREQ=MONTHLY"); 457 parts.push("FREQ=MONTHLY");
450 if ($("#rrule_monthly_ordinal").is(":checked")) { 458 if ($("#rrule_monthly_ordinal").is(":checked")) {
451 parts.push("BYDAY=" + $("#rrule_ordinal").val() + $("#rrule_ordinal_day").val()); 459 var ordinal = $("#rrule_ordinal").val();
460 if (ordinal === "custom") {
461 var customDays = [];
462 $("input[id^='rrule_custom_ordinal_']:checked").each(function() {
463 customDays.push($(this).attr("id").replace("rrule_custom_ordinal_", "") + $("#rrule_ordinal_day").val());
464 });
465 if (customDays.length > 0) parts.push("BYDAY=" + customDays.join(","));
466 } else {
467 parts.push("BYDAY=" + ordinal + $("#rrule_ordinal_day").val());
468 }
452 } 469 }
453 } 470 }
454 471
@@ -483,8 +500,33 @@ rrule_builder = {
483 } else if (parts.FREQ === "MONTHLY") { 500 } else if (parts.FREQ === "MONTHLY") {
484 $("input[name='rrule_freq'][value='monthly']").prop("checked", true); 501 $("input[name='rrule_freq'][value='monthly']").prop("checked", true);
485 rrule_builder.show_monthly_options(); 502 rrule_builder.show_monthly_options();
503 var ordinalDays = parts.BYDAY && parts.BYDAY.split(",");
504 var customOrdinalDay = null;
505 var customOrdinals = [];
506 var customOrdinalsValid = ordinalDays && ordinalDays.length > 0;
507 if (customOrdinalsValid) {
508 ordinalDays.forEach(function(value) {
509 var customMatch = value.match(/^([1-5])([A-Z]{2})$/);
510 if (!customMatch || (customOrdinalDay && customOrdinalDay !== customMatch[2])) {
511 customOrdinalsValid = false;
512 return;
513 }
514 customOrdinalDay = customMatch[2];
515 customOrdinals.push(customMatch[1]);
516 });
517 }
518
486 var match = parts.BYDAY && parts.BYDAY.match(/^(-?\d+)([A-Z]{2})$/); 519 var match = parts.BYDAY && parts.BYDAY.match(/^(-?\d+)([A-Z]{2})$/);
487 if (match) { 520 if (customOrdinalsValid && (customOrdinals.length > 1 || customOrdinals[0] === "5")) {
521 $("#rrule_monthly_ordinal").prop("checked", true);
522 $("#rrule_ordinal_fields").show();
523 $("#rrule_ordinal").val("custom");
524 $("#rrule_ordinal_day").val(customOrdinalDay);
525 customOrdinals.forEach(function(ordinal) {
526 $("#rrule_custom_ordinal_" + ordinal).prop("checked", true);
527 });
528 rrule_builder.toggle_custom_ordinal_fields();
529 } else if (match) {
488 $("#rrule_monthly_ordinal").prop("checked", true); 530 $("#rrule_monthly_ordinal").prop("checked", true);
489 $("#rrule_ordinal_fields").show(); 531 $("#rrule_ordinal_fields").show();
490 $("#rrule_ordinal").val(match[1]); 532 $("#rrule_ordinal").val(match[1]);