From e2dbcaf15d58e79af8c1f5f6b4253e8e7f528622 Mon Sep 17 00:00:00 2001 From: Adam Shaw Date: Sat, 18 Sep 2010 22:54:35 -0700 Subject: [PATCH] refactored js, split into more files (much more manageable). tested --- Makefile | 126 +- build/externs.js | 1 + {examples => demos}/agenda-views.html | 28 +- {examples => demos}/basic-views.html | 28 +- {examples => demos}/default.html | 28 +- {examples => demos}/external-dragging.html | 28 +- demos/gcal.html | 67 + {examples => demos}/json-events.php | 0 demos/json.html | 63 + .../images/ui-bg_flat_0_aaaaaa_40x100.png | Bin .../images/ui-bg_flat_55_fbec88_40x100.png | Bin 0 -> 182 bytes .../images/ui-bg_glass_75_d0e5f5_1x400.png | Bin .../images/ui-bg_glass_85_dfeffc_1x400.png | Bin .../images/ui-bg_glass_95_fef1ec_1x400.png | Bin .../ui-bg_gloss-wave_55_5c9ccc_500x100.png | Bin .../ui-bg_inset-hard_100_f5f8f9_1x100.png | Bin .../ui-bg_inset-hard_100_fcfdfd_1x100.png | Bin .../images/ui-icons_217bc0_256x240.png | Bin 4369 -> 4369 bytes .../images/ui-icons_2e83ff_256x240.png | Bin 4369 -> 4369 bytes .../images/ui-icons_469bdd_256x240.png | Bin 4369 -> 4369 bytes .../images/ui-icons_6da8d5_256x240.png | Bin 4369 -> 4369 bytes .../images/ui-icons_cd0a0a_256x240.png | Bin 4369 -> 4369 bytes .../images/ui-icons_d8e7f3_256x240.png | Bin 4369 -> 4369 bytes .../images/ui-icons_f9bd01_256x240.png | Bin 0 -> 4369 bytes {examples => demos}/redmond/theme.css | 221 +-- {examples => demos}/selectable.html | 28 +- {examples => demos}/theme.html | 28 +- examples/gcal.html | 79 -- examples/json.html | 77 - .../images/ui-bg_flat_55_fbec88_40x100.png | Bin 213 -> 0 bytes .../images/ui-icons_f9bd01_256x240.png | Bin 5355 -> 0 bytes .../jquery-legacy => lib}/jquery-1.3.2.min.js | 0 .../jquery.js => lib/jquery-1.4.2.min.js | 0 .../jquery-ui-1.7.3.custom.min.js | 0 .../jquery-ui-1.8.4.custom.min.js | 128 +- src/Calendar.js | 480 +++++++ src/EventManager.js | 288 ++++ src/Header.js | 164 +++ src/_loader.js | 132 ++ src/agenda.js | 1249 ----------------- src/agenda/AgendaDayView.js | 36 + src/agenda/AgendaEventRenderer.js | 595 ++++++++ src/agenda/AgendaView.js | 702 +++++++++ src/agenda/AgendaWeekView.js | 46 + src/{css => agenda}/agenda.css | 0 src/basic/BasicDayView.js | 37 + src/basic/BasicEventRenderer.js | 149 ++ src/basic/BasicView.js | 453 ++++++ src/basic/BasicWeekView.js | 46 + src/basic/MonthView.js | 52 + src/{css/grid.css => basic/basic.css} | 0 src/common/CoordinateGrid.js | 43 + src/common/DayEventRenderer.js | 232 +++ src/common/HorizontalPositionCache.js | 27 + src/common/HoverListener.js | 44 + src/common/OverlayManager.js | 37 + src/common/SelectionManager.js | 98 ++ src/common/View.js | 213 +++ src/common/common.css | 129 ++ src/{util.js => common/date.js} | 331 +---- src/common/util.js | 285 ++++ src/defaults.js | 92 ++ src/gcal/_loader.js | 6 + src/{ => gcal}/gcal.js | 7 +- src/grid.js | 792 ----------- src/intro.js | 19 + src/{css => }/main.css | 129 +- src/main.js | 902 +----------- src/misc/head.txt | 20 - src/{misc/foot.txt => outro.js} | 0 src/selection_util.js | 45 - src/view.js | 375 ----- tests/dbclick.html | 5 +- tests/droppable.html | 5 +- tests/fullheight.html | 5 +- tests/gcal.html | 5 +- tests/iframe.html | 42 +- tests/issue_206_parseDate_dst.html | 5 +- tests/issue_220_buttons_ie6.html | 5 +- tests/issue_221_quick_remove_source.html | 3 +- tests/issue_230_height_json_events.html | 13 +- tests/issue_244_aspectRatio_0.html | 5 +- tests/issue_251_empty_end_date.html | 5 +- tests/issue_333_blinking.html | 4 +- tests/issue_429_gotoDate.html | 5 +- tests/issue_477_event_width.html | 5 +- tests/jquery-ui/jquery.ui.tabs.js | 721 ---------- tests/{ => lib}/fancybox/fancy_closebox.png | Bin tests/{ => lib}/fancybox/fancy_left.png | Bin tests/{ => lib}/fancybox/fancy_progress.png | Bin tests/{ => lib}/fancybox/fancy_right.png | Bin tests/{ => lib}/fancybox/fancy_shadow_e.png | Bin tests/{ => lib}/fancybox/fancy_shadow_n.png | Bin tests/{ => lib}/fancybox/fancy_shadow_ne.png | Bin tests/{ => lib}/fancybox/fancy_shadow_nw.png | Bin tests/{ => lib}/fancybox/fancy_shadow_s.png | Bin tests/{ => lib}/fancybox/fancy_shadow_se.png | Bin tests/{ => lib}/fancybox/fancy_shadow_sw.png | Bin tests/{ => lib}/fancybox/fancy_shadow_w.png | Bin tests/{ => lib}/fancybox/fancy_title_left.png | Bin tests/{ => lib}/fancybox/fancy_title_main.png | Bin .../{ => lib}/fancybox/fancy_title_right.png | Bin .../fancybox/jquery.fancybox-1.2.6.css | 0 .../fancybox/jquery.fancybox-1.2.6.js | 0 .../fancybox/jquery.fancybox-1.2.6.pack.js | 0 tests/{ => lib}/firebug-lite/ChangeLog | 0 tests/{ => lib}/firebug-lite/errorIcon.png | Bin .../firebug-lite/firebug-lite-compressed.js | 0 tests/{ => lib}/firebug-lite/firebug-lite.css | 0 tests/{ => lib}/firebug-lite/firebug-lite.js | 0 tests/{ => lib}/firebug-lite/firebug.gif | Bin tests/{ => lib}/firebug-lite/firebug_logo.png | Bin tests/{ => lib}/firebug-lite/infoIcon.png | Bin tests/{ => lib}/firebug-lite/progress.gif | Bin tests/{ => lib}/firebug-lite/spacer.gif | Bin tests/{ => lib}/firebug-lite/tree_close.gif | Bin tests/{ => lib}/firebug-lite/tree_open.gif | Bin tests/{ => lib}/firebug-lite/warningIcon.png | Bin tests/lib/jquery.ui.tabs.min.js | 35 + tests/liquidwidth.html | 5 +- tests/loader.js | 105 -- tests/locale.html | 3 +- tests/many_agenda_events.html | 6 +- tests/many_events.html | 6 +- tests/method_destroy.html | 5 +- tests/methods.html | 5 +- tests/options.html | 11 +- tests/plain.html | 5 +- tests/selectable.html | 7 +- tests/skip-redraw-test.html | 6 +- tests/sources.html | 13 +- tests/tabs.html | 8 +- tests/theming.html | 8 +- tests/triggers.html | 14 +- version.txt | 2 +- 135 files changed, 5005 insertions(+), 5257 deletions(-) create mode 100644 build/externs.js rename {examples => demos}/agenda-views.html (57%) rename {examples => demos}/basic-views.html (59%) rename {examples => demos}/default.html (55%) rename {examples => demos}/external-dragging.html (73%) create mode 100644 demos/gcal.html rename {examples => demos}/json-events.php (100%) create mode 100644 demos/json.html rename {examples => demos}/redmond/images/ui-bg_flat_0_aaaaaa_40x100.png (100%) create mode 100644 demos/redmond/images/ui-bg_flat_55_fbec88_40x100.png rename {examples => demos}/redmond/images/ui-bg_glass_75_d0e5f5_1x400.png (100%) rename {examples => demos}/redmond/images/ui-bg_glass_85_dfeffc_1x400.png (100%) rename {examples => demos}/redmond/images/ui-bg_glass_95_fef1ec_1x400.png (100%) rename {examples => demos}/redmond/images/ui-bg_gloss-wave_55_5c9ccc_500x100.png (100%) rename {examples => demos}/redmond/images/ui-bg_inset-hard_100_f5f8f9_1x100.png (100%) rename {examples => demos}/redmond/images/ui-bg_inset-hard_100_fcfdfd_1x100.png (100%) rename {examples => demos}/redmond/images/ui-icons_217bc0_256x240.png (91%) rename {examples => demos}/redmond/images/ui-icons_2e83ff_256x240.png (91%) rename {examples => demos}/redmond/images/ui-icons_469bdd_256x240.png (91%) rename {examples => demos}/redmond/images/ui-icons_6da8d5_256x240.png (91%) rename {examples => demos}/redmond/images/ui-icons_cd0a0a_256x240.png (91%) rename {examples => demos}/redmond/images/ui-icons_d8e7f3_256x240.png (91%) create mode 100644 demos/redmond/images/ui-icons_f9bd01_256x240.png rename {examples => demos}/redmond/theme.css (57%) rename {examples => demos}/selectable.html (62%) rename {examples => demos}/theme.html (60%) delete mode 100644 examples/gcal.html delete mode 100644 examples/json.html delete mode 100644 examples/redmond/images/ui-bg_flat_55_fbec88_40x100.png delete mode 100644 examples/redmond/images/ui-icons_f9bd01_256x240.png rename {tests/jquery-legacy => lib}/jquery-1.3.2.min.js (100%) rename src/jquery/jquery.js => lib/jquery-1.4.2.min.js (100%) rename {tests/jquery-legacy => lib}/jquery-ui-1.7.3.custom.min.js (100%) rename src/jquery/jquery-ui-custom.js => lib/jquery-ui-1.8.4.custom.min.js (60%) create mode 100644 src/Calendar.js create mode 100644 src/EventManager.js create mode 100644 src/Header.js create mode 100644 src/_loader.js delete mode 100644 src/agenda.js create mode 100644 src/agenda/AgendaDayView.js create mode 100644 src/agenda/AgendaEventRenderer.js create mode 100644 src/agenda/AgendaView.js create mode 100644 src/agenda/AgendaWeekView.js rename src/{css => agenda}/agenda.css (100%) create mode 100644 src/basic/BasicDayView.js create mode 100644 src/basic/BasicEventRenderer.js create mode 100644 src/basic/BasicView.js create mode 100644 src/basic/BasicWeekView.js create mode 100644 src/basic/MonthView.js rename src/{css/grid.css => basic/basic.css} (100%) create mode 100644 src/common/CoordinateGrid.js create mode 100644 src/common/DayEventRenderer.js create mode 100644 src/common/HorizontalPositionCache.js create mode 100644 src/common/HoverListener.js create mode 100644 src/common/OverlayManager.js create mode 100644 src/common/SelectionManager.js create mode 100644 src/common/View.js create mode 100644 src/common/common.css rename src/{util.js => common/date.js} (52%) create mode 100644 src/common/util.js create mode 100644 src/defaults.js create mode 100644 src/gcal/_loader.js rename src/{ => gcal}/gcal.js (90%) delete mode 100644 src/grid.js create mode 100644 src/intro.js rename src/{css => }/main.css (60%) delete mode 100644 src/misc/head.txt rename src/{misc/foot.txt => outro.js} (100%) delete mode 100644 src/selection_util.js delete mode 100644 src/view.js delete mode 100644 tests/jquery-ui/jquery.ui.tabs.js rename tests/{ => lib}/fancybox/fancy_closebox.png (100%) rename tests/{ => lib}/fancybox/fancy_left.png (100%) rename tests/{ => lib}/fancybox/fancy_progress.png (100%) rename tests/{ => lib}/fancybox/fancy_right.png (100%) rename tests/{ => lib}/fancybox/fancy_shadow_e.png (100%) rename tests/{ => lib}/fancybox/fancy_shadow_n.png (100%) rename tests/{ => lib}/fancybox/fancy_shadow_ne.png (100%) rename tests/{ => lib}/fancybox/fancy_shadow_nw.png (100%) rename tests/{ => lib}/fancybox/fancy_shadow_s.png (100%) rename tests/{ => lib}/fancybox/fancy_shadow_se.png (100%) rename tests/{ => lib}/fancybox/fancy_shadow_sw.png (100%) rename tests/{ => lib}/fancybox/fancy_shadow_w.png (100%) rename tests/{ => lib}/fancybox/fancy_title_left.png (100%) rename tests/{ => lib}/fancybox/fancy_title_main.png (100%) rename tests/{ => lib}/fancybox/fancy_title_right.png (100%) rename tests/{ => lib}/fancybox/jquery.fancybox-1.2.6.css (100%) rename tests/{ => lib}/fancybox/jquery.fancybox-1.2.6.js (100%) rename tests/{ => lib}/fancybox/jquery.fancybox-1.2.6.pack.js (100%) rename tests/{ => lib}/firebug-lite/ChangeLog (100%) rename tests/{ => lib}/firebug-lite/errorIcon.png (100%) rename tests/{ => lib}/firebug-lite/firebug-lite-compressed.js (100%) rename tests/{ => lib}/firebug-lite/firebug-lite.css (100%) rename tests/{ => lib}/firebug-lite/firebug-lite.js (100%) rename tests/{ => lib}/firebug-lite/firebug.gif (100%) rename tests/{ => lib}/firebug-lite/firebug_logo.png (100%) rename tests/{ => lib}/firebug-lite/infoIcon.png (100%) rename tests/{ => lib}/firebug-lite/progress.gif (100%) rename tests/{ => lib}/firebug-lite/spacer.gif (100%) rename tests/{ => lib}/firebug-lite/tree_close.gif (100%) rename tests/{ => lib}/firebug-lite/tree_open.gif (100%) rename tests/{ => lib}/firebug-lite/warningIcon.png (100%) create mode 100644 tests/lib/jquery.ui.tabs.min.js delete mode 100644 tests/loader.js diff --git a/Makefile b/Makefile index 151b964..18bf987 100644 --- a/Makefile +++ b/Makefile @@ -1,69 +1,95 @@ SRC_DIR = src -EXAMPLES_DIR = examples BUILD_DIR = build DIST_DIR = dist - -JS_SRC_FILES = \ - ${SRC_DIR}/main.js \ - ${SRC_DIR}/grid.js \ - ${SRC_DIR}/agenda.js \ - ${SRC_DIR}/view.js \ - ${SRC_DIR}/selection_util.js \ - ${SRC_DIR}/util.js - -CSS_SRC_FILES = \ - ${SRC_DIR}/css/main.css \ - ${SRC_DIR}/css/grid.css \ - ${SRC_DIR}/css/agenda.css - +DEMOS_DIR = demos OTHER_FILES = \ - ${SRC_DIR}/jquery \ - changelog.txt - -VER = `cat version.txt` + changelog.txt \ + MIT-LICENSE.txt \ + GPL-LICENSE.txt + +VER = $$(cat version.txt) VER_SED = sed s/@VERSION/"${VER}"/ -DATE = `git log -1 | grep Date: | sed 's/[^:]*: *//'` +DATE = $$(git log -1 --pretty=format:%ad) DATE_SED = sed s/@DATE/"${DATE}"/ +JQ = $$(sed -n "s/.*JQUERY\s*=\s*[\"']\(.*\)[\"'].*/\1/p" "${SRC_DIR}/_loader.js") +JQUI = $$(sed -n "s/.*JQUERY_UI\s*=\s*[\"']\(.*\)[\"'].*/\1/p" "${SRC_DIR}/_loader.js") + +DEMO_FILES = $$(cd ${DEMOS_DIR}; find . -mindepth 1 -maxdepth 1 -type f) +DEMO_SUBDIRS = $$(cd ${DEMOS_DIR}; find . -mindepth 1 -maxdepth 1 -type d) +DEMO_RE = \(]*_loader\.js[^>]*><\/script>\|\)\s* +DEMO_SED = sed -n "1h;1!H;\$${;g;s/${DEMO_RE}//g;p;}" + +JS_SED = sed -n "s/\s*js([\"']\(.*\)[\"']).*/\1/p" +CSS_SED = sed -n "s/\s*css([\"']\(.*\)[\"']).*/\1/p" + +concat_js = \ + files=$$(cat "$(1)/_loader.js" | ${JS_SED}); \ + if [ -f "$(1)/intro.js" ]; then \ + files="intro.js $$files"; \ + fi; \ + if [ -f "$(1)/outro.js" ]; then \ + files="$$files outro.js"; \ + fi; \ + old=$$PWD; \ + (cd "$(1)"; cat $$files; cd "$$old") \ + | ${VER_SED} \ + | ${DATE_SED} \ + > "$(2)" + +concat_css = \ + files=$$(cat "$(1)/_loader.js" | ${CSS_SED}); \ + if [ "$$files" ]; then \ + old=$$PWD; \ + (cd "$(1)"; cat $$files; cd "$$old") \ + | ${VER_SED} \ + | ${DATE_SED} \ + > "$(2)"; \ + fi + zip: @rm -rf ${BUILD_DIR}/fullcalendar @rm -rf ${BUILD_DIR}/fullcalendar-* - @mkdir -p ${BUILD_DIR}/fullcalendar + @mkdir -p ${BUILD_DIR}/fullcalendar/fullcalendar/ - @echo "building js..." - @cat ${SRC_DIR}/misc/head.txt ${JS_SRC_FILES} ${SRC_DIR}/misc/foot.txt \ - | ${VER_SED} | ${DATE_SED} \ - > ${BUILD_DIR}/fullcalendar/fullcalendar.js - @cat ${SRC_DIR}/gcal.js \ - | ${VER_SED} | ${DATE_SED} \ - > ${BUILD_DIR}/fullcalendar/gcal.js + @echo "building core..." + @$(call concat_js,${SRC_DIR},"${BUILD_DIR}/fullcalendar/fullcalendar/fullcalendar.js") + @$(call concat_css,${SRC_DIR},"${BUILD_DIR}/fullcalendar/fullcalendar/fullcalendar.css") + + @echo "compressing core js..." + @java -jar ${BUILD_DIR}/compiler.jar --warning_level VERBOSE --jscomp_off checkTypes --externs build/externs.js \ + --js ${BUILD_DIR}/fullcalendar/fullcalendar/fullcalendar.js \ + > ${BUILD_DIR}/fullcalendar/fullcalendar/fullcalendar.min.js; \ - @echo "compressing js..." - @java -jar ${BUILD_DIR}/compiler.jar --js ${BUILD_DIR}/fullcalendar/fullcalendar.js \ - > ${BUILD_DIR}/fullcalendar/fullcalendar.min.js - - @echo "building css..." - @cat ${CSS_SRC_FILES} \ - | ${VER_SED} | ${DATE_SED} \ - > ${BUILD_DIR}/fullcalendar/fullcalendar.css - - @echo "building examples..." - @mkdir -p ${BUILD_DIR}/fullcalendar/examples - @for f in `cd ${EXAMPLES_DIR}; find . -mindepth 1 -maxdepth 1 -type f`; do \ - cat ${EXAMPLES_DIR}/$$f \ - | sed -n '1h;1!H;$${;g;s/\s*//g;p;}' \ - | sed -n '1h;1!H;$${;g;s/\s*//g;p;}' \ - > ${BUILD_DIR}/fullcalendar/examples/$$f; \ + @echo "building plugins..." + @for loader in ${SRC_DIR}/*/_loader.js; do \ + dir=`dirname $$loader`; \ + name=`basename $$dir`; \ + $(call concat_js,$$dir,"${BUILD_DIR}/fullcalendar/fullcalendar/$$name.js"); \ done - @for d in `cd ${EXAMPLES_DIR}; find . -mindepth 1 -maxdepth 1 -type d`; do \ - cp -r ${EXAMPLES_DIR}/$$d ${BUILD_DIR}/fullcalendar/examples/$$d; \ + + @echo "copying jquery..." + @mkdir -p ${BUILD_DIR}/fullcalendar/jquery + @cp lib/${JQ} ${BUILD_DIR}/fullcalendar/jquery + @cp lib/${JQUI} ${BUILD_DIR}/fullcalendar/jquery + + @echo "building demos..." + @mkdir -p ${BUILD_DIR}/fullcalendar/demos + @for f in ${DEMO_FILES}; do \ + cat ${DEMOS_DIR}/$$f \ + | ${DEMO_SED} \ + | sed "s/jquery\.js/${JQ}/" \ + | sed "s/jquery-ui\.js/${JQUI}/" \ + > ${BUILD_DIR}/fullcalendar/demos/$$f; \ done - + @for d in ${DEMO_SUBDIRS}; do \ + cp -r ${DEMOS_DIR}/$$d ${BUILD_DIR}/fullcalendar/demos/$$d; \ + done + @echo "copying other files..." @cp -r ${OTHER_FILES} ${BUILD_DIR}/fullcalendar - + @echo "zipping..." @mv ${BUILD_DIR}/fullcalendar ${BUILD_DIR}/fullcalendar-${VER} @cd ${BUILD_DIR}; for f in fullcalendar-*; do \ @@ -74,7 +100,7 @@ zip: @mkdir -p ${DIST_DIR} @mv ${BUILD_DIR}/fullcalendar-${VER}.zip ${DIST_DIR} @echo "done." - + clean: @rm -rf ${BUILD_DIR}/fullcalendar @rm -rf ${BUILD_DIR}/fullcalendar-* diff --git a/build/externs.js b/build/externs.js new file mode 100644 index 0000000..30f6635 --- /dev/null +++ b/build/externs.js @@ -0,0 +1 @@ +var jQuery; diff --git a/examples/agenda-views.html b/demos/agenda-views.html similarity index 57% rename from examples/agenda-views.html rename to demos/agenda-views.html index 424b084..19be2b7 100644 --- a/examples/agenda-views.html +++ b/demos/agenda-views.html @@ -1,27 +1,13 @@ - + - - - - - - - - - - - - - - + + +]]--> - - - - - - - - - + + +]]--> - - - - - - - - - + + +]]--> - - - - - - - - - + + +]]--> + + + + + + + +
+ + diff --git a/examples/json-events.php b/demos/json-events.php similarity index 100% rename from examples/json-events.php rename to demos/json-events.php diff --git a/demos/json.html b/demos/json.html new file mode 100644 index 0000000..dd0507e --- /dev/null +++ b/demos/json.html @@ -0,0 +1,63 @@ + + + + + + + + + + +
+

json-events.php needs to be running in the same directory.

+ + diff --git a/examples/redmond/images/ui-bg_flat_0_aaaaaa_40x100.png b/demos/redmond/images/ui-bg_flat_0_aaaaaa_40x100.png similarity index 100% rename from examples/redmond/images/ui-bg_flat_0_aaaaaa_40x100.png rename to demos/redmond/images/ui-bg_flat_0_aaaaaa_40x100.png diff --git a/demos/redmond/images/ui-bg_flat_55_fbec88_40x100.png b/demos/redmond/images/ui-bg_flat_55_fbec88_40x100.png new file mode 100644 index 0000000000000000000000000000000000000000..47acaadd737478ddb090f47f618810712163317b GIT binary patch literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^8bF-F!3HG1q!d*Fsaj7L$B>N1x91EQ8x$BA993)+ za~~)OO5|O5sDCi_{N8&XlRv*c;OQ6|AR59NN?mFzWBXJVGojypu|S6~c)I$ztaD0e F0syyrGF|`x literal 0 HcmV?d00001 diff --git a/examples/redmond/images/ui-bg_glass_75_d0e5f5_1x400.png b/demos/redmond/images/ui-bg_glass_75_d0e5f5_1x400.png similarity index 100% rename from examples/redmond/images/ui-bg_glass_75_d0e5f5_1x400.png rename to demos/redmond/images/ui-bg_glass_75_d0e5f5_1x400.png diff --git a/examples/redmond/images/ui-bg_glass_85_dfeffc_1x400.png b/demos/redmond/images/ui-bg_glass_85_dfeffc_1x400.png similarity index 100% rename from examples/redmond/images/ui-bg_glass_85_dfeffc_1x400.png rename to demos/redmond/images/ui-bg_glass_85_dfeffc_1x400.png diff --git a/examples/redmond/images/ui-bg_glass_95_fef1ec_1x400.png b/demos/redmond/images/ui-bg_glass_95_fef1ec_1x400.png similarity index 100% rename from examples/redmond/images/ui-bg_glass_95_fef1ec_1x400.png rename to demos/redmond/images/ui-bg_glass_95_fef1ec_1x400.png diff --git a/examples/redmond/images/ui-bg_gloss-wave_55_5c9ccc_500x100.png b/demos/redmond/images/ui-bg_gloss-wave_55_5c9ccc_500x100.png similarity index 100% rename from examples/redmond/images/ui-bg_gloss-wave_55_5c9ccc_500x100.png rename to demos/redmond/images/ui-bg_gloss-wave_55_5c9ccc_500x100.png diff --git a/examples/redmond/images/ui-bg_inset-hard_100_f5f8f9_1x100.png b/demos/redmond/images/ui-bg_inset-hard_100_f5f8f9_1x100.png similarity index 100% rename from examples/redmond/images/ui-bg_inset-hard_100_f5f8f9_1x100.png rename to demos/redmond/images/ui-bg_inset-hard_100_f5f8f9_1x100.png diff --git a/examples/redmond/images/ui-bg_inset-hard_100_fcfdfd_1x100.png b/demos/redmond/images/ui-bg_inset-hard_100_fcfdfd_1x100.png similarity index 100% rename from examples/redmond/images/ui-bg_inset-hard_100_fcfdfd_1x100.png rename to demos/redmond/images/ui-bg_inset-hard_100_fcfdfd_1x100.png diff --git a/examples/redmond/images/ui-icons_217bc0_256x240.png b/demos/redmond/images/ui-icons_217bc0_256x240.png similarity index 91% rename from examples/redmond/images/ui-icons_217bc0_256x240.png rename to demos/redmond/images/ui-icons_217bc0_256x240.png index fef3aaa3e13f6269cac6dd6ae8adcbcd95b32f03..6f4bd87c041453ef037c4a9a1a698f0105d02eba 100644 GIT binary patch delta 267 ucmbQJG*M}SX1z+)k%2_@^tJxp*_@9I3=DoHL4Lsu5&}jno7EX#@dE&hB6mvw delta 267 ucmbQJG*M}SX1!wdfq_Kz^tJxW*2zT-3=DoHL4Lsu5&}jno7EX#@dE&U+;tZK diff --git a/examples/redmond/images/ui-icons_2e83ff_256x240.png b/demos/redmond/images/ui-icons_2e83ff_256x240.png similarity index 91% rename from examples/redmond/images/ui-icons_2e83ff_256x240.png rename to demos/redmond/images/ui-icons_2e83ff_256x240.png index 45e8928e5284adacea3f9ec07b9b50667d2ac65f..09d1cdc856c292c4ab6dd818c7543ac0828bd616 100644 GIT binary patch delta 267 ucmbQJG*M}SX1z|+pMga6^tJx~OP&FYM=_yM*_j$Z%( diff --git a/examples/redmond/images/ui-icons_469bdd_256x240.png b/demos/redmond/images/ui-icons_469bdd_256x240.png similarity index 91% rename from examples/redmond/images/ui-icons_469bdd_256x240.png rename to demos/redmond/images/ui-icons_469bdd_256x240.png index 22952e3127c2429121e9c42a76a2289335a535c8..bd2cf079add1ca236adeb509698adabbffb08acb 100644 GIT binary patch delta 267 ucmbQJG*M}SX1&X-I|GU8>1+L|h02Q<7#RFYg8YIRBm|6DHmftf;s*eME|Hr6 delta 267 ucmbQJG*M}SX1&|&y90^p>1(~$lkOD^3=DoHL4Lsu5&}jno7EX#@dE%eQ1)06?uI-D1_r;9AirP+2>~OP&FYM=_yM>+pa%c| delta 267 tcmbQJG*M}SW_|98s{@JZ>1%z=R@poT1_r;9AirP+2>~OP&FYM=_yM%*pVt5Y diff --git a/examples/redmond/images/ui-icons_cd0a0a_256x240.png b/demos/redmond/images/ui-icons_cd0a0a_256x240.png similarity index 91% rename from examples/redmond/images/ui-icons_cd0a0a_256x240.png rename to demos/redmond/images/ui-icons_cd0a0a_256x240.png index 7930a558099bc8d92b4264eb67a0f040460f4a4f..2ab019b73ec11a485fa09378f3a0e155194f6a5d 100644 GIT binary patch delta 267 tcmbQJG*M}SX8jp1o`FR5^tJvqpIb5m1A|{lkY6x^gn$vtW_89_`~U=?PGtZ9 delta 267 ucmbQJG*M}SX8l<%u7O1L^tJw#`HVjd3=DoHL4Lsu5&}jno7EX#@dE(v+)pV0 diff --git a/examples/redmond/images/ui-icons_d8e7f3_256x240.png b/demos/redmond/images/ui-icons_d8e7f3_256x240.png similarity index 91% rename from examples/redmond/images/ui-icons_d8e7f3_256x240.png rename to demos/redmond/images/ui-icons_d8e7f3_256x240.png index b708adf93dba691909d058d142dc7cf8bd0ebb55..ad2dc6f9dbeeabbda9ae6917659b6df07817ec35 100644 GIT binary patch delta 267 ucmbQJG*M}SX8oOKUj`D@)7N@6LE}pd3=DoHL4Lsu5&}jno7EX#@dE&q|K4i= delta 267 tcmbQJG*M}SX8n!lp9d1v)7N@#UM7161_r;9AirP+2>~OP&FYM=_yN=C+)Mxf diff --git a/demos/redmond/images/ui-icons_f9bd01_256x240.png b/demos/redmond/images/ui-icons_f9bd01_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..78625024d94a74eb1aceb327f45059faf439fece GIT binary patch literal 4369 zcmd^?`8O2a|Ho&{n6VqizD}0xTeiwJq#_zil8OvzQT8S4Fe6L$N@a^7L}X2}W+ZDu zBx9K|nn+{p4952D{r-GEf5qoz8}Z>v>-H+~-ZSMV;s75aR#<0Nj=q=Jo&p z@NWuOWdr?PiIx|3|87gR)(&U)KZ5^v;+yyRze)g5LH4Li01?;;Fq>`r!)$dK2S4O( zv>5+aE`*_wnZ*UEYsWS1RpWFLaGm%1hI&q#OSCmbR=h7seN*{P@c=Kk!U17PFLHlg zSnV~Fch1-+>dD=^BNhh$0B@Y7xv4|w%O#go_o)UxNS{UdTWLdovnjIle_c@`qr-{w4^-**dwY9SjEc|->VONl!*JVy9K!B@Y z{1jZ87X~t8E?h5>E5IU<4wNy^W{WY6U$gELC8wBr8OI8vov0T6X!EnhJ<9fjfEUVio$MWc`%&Rpf6}ZkZ;VJ#N+ohe;4ldm;dHVD5 z!4h=+x(||0v=MeqKXC}3)Mw(>)0ye*3>nB+TcckP- zW|4Y>A7VF!Iby9qP_$V80myi`y#;~1ix?}K+vm4}!yK_be1iO4GH$PBD$+T3J6U+If^3DmE3u)fV8VC z;n3QiDF5R=eJhkug-`G6{RiUxX}XIuM44_kL6FMjRvk%5W*u2Hi!ayF;heN_vicgy zniLi@c;{hL2Ta8kez90l2(;%l{PAo)k4-ES$ARE-l-qOAGIQG60zL)0zfwzzG(jT1 z-`*HAn{f)DFys}GBTc3(&drwfvrQLNG4WV4vzxOU&JahAwf=zAj?yBwyNV+&L6*Jr z8|9)Ke1(|lo-R?}!SUC=TpurKKV+9NC>q*^_GiPI>EAlsG1L5cGBY*oFy71wr3iPq zCvC5VfF<41KdI+KU?HTBDgV%ty8dFOm&GmNCD~nuysE@l8FfJV<;0zHy%nGbyYOJR ztc+!r!P6n*y+E#fdr_?e@1egz(|a}?imk4W{ZgaHGFoB)?xn|RRF5+<=qWI?u~h)r z*7-9-sKyoCII(ymI7Lf7W6DO5=@4_Vu5v-W7SjZNu?n!0)}CjhtzjF~#Zkm}&|g#x zpn^}LP^m3*)fl_Yy7%i)?PmxMotaL{bbGi1%j^_tR|yQ0qhfyn`-3DCb~2TwQE%O& z&;6zQ!0gt~*n7K7UWgd44@x?z(9uUHWo$>4uc^ZnuDq4)wDwbZum_|I5vhO{8&6Pe zlM~9%&&Sc+I2#^nvrCO_!B`_0zGjcOlaCt;Y(BHT&RP1IjJm0woL$-3Fzsn1(uoF8 zfp*A5kC^KB+#FxyEz7#pEh`qAy$Ecgd@L{!+Bt}F-4Fp@I3w*DRH$>3m$0kTrv?E9 z5P)21=_&;9!0mTL`jc8njM-!C88d{)=r_nk3mm(rKyfTyWHSuF1;k{kK2-Kc*L4#TM+TiNs0G5;k{7sfJD_jGfDWVfp0Ff5o3@1F%l8iqe zB~eg!IKzidOOGe!bnb#^R+K(?B>TWKV^(I{RAF7UjU0h^v`XKIV&P~o^;JqLVkyz| z3lHaL!vG{aA@v7YfW1*Zw1KHPp=n}of7<(`&*_evw|OQ_`H_M8%^m!!tWx+aYiZhc zb2@;GkhoR=(NI?>w3Mx4X?IV4_dVpV2`~W)b5C-2iJ*F@r&89m%@+7a#G`y&iDaMx zn!pD5355Gb$6}ZLY}B&8aGz#rggTrTS{7gzwU##6?9mrX?IF3K>66lMmKw9C*zfY# zFS*7w%gP~Ohx)c-GAF<-r?TkA5iF_-_P&6bL75E4~(% zzZO#Y94?_6WO+qFA@Y`l&-cTB$K0sr-JP{{`vGrw)^*f+!=>GzZL5e}=18J<9chl3 z;g}z^r&riFJ5pyKjb?uTwwE*5fFd5pOfk&ZFVBgJWGk)*7;gIa;vB;QhFJqlm6h8` z#A+BQ{0>NO)Lb^VmYp^8MefG8tG2o5D*EzL$?Suep+AAx-vd!_#k}yni(ceg?UBKa zYy$%OcI{Gbamtu{6$ktPcO3}J%xJcc?%rK;;=C!NqKxN4J@(qfqxJ;AcW<_z3*t#I zM5!34VHSufPC*mT<*+541vg&)J?lYQe5&%&OcX)kEWwph&D8w_p^a!|_^%fRQh~~N zd)6s5*=F!5BmWfN7DzT!XG}up6HdJL)Piim5^L+*p~D$U_7#h%^mzJ+)arBQwF45b zl8Yv9BU;L@!?57}OkRgr4yyc%@70JIoe}-K7`^PCCQz0!VJh=DrE6C>fhpL~p88!2 zC{MIgP>5!op^clo^qTA(Z+xzDyeJ^z;9eu@37k^bQpH;^ud}bjHTk6zU4{bwPENt9 zw{cF*R6Z&IBX;)}dy0CF_N$(!PtWpXW|VHymHgT3PYB^nw(Hgod|I_Fu3;rKwf1hYxVrC+eOU?K*55t6rGomp<$8`G9N$1v zq?zL!;1Bmzc_^J^YaR^9+B!dAZ`a#aH@P{oHjgiKA*lqam2xv~FDVpZZt7m}@2p6o zA3v($k9;{jT?lC z={~QvIB_38DtF$1eo&uydTzI-7>_F)(%4qPr#aRmR^$cO0dY#D;+egRu8<=};evY^ zuclz%#Vdoa?@dU1uhSM6hHFRq((n>q9FYOHSg5S6^HlDn-U=AnOszhlmUQ?)P~CH3 zcRtnLmmG?T=b$O&Pt1ZJ%gdsnMZ+-(_PS>TC4tT5qUomK))RrjjU91rZRr4t7+c`g zFzuG#M)%xq`9@nV>f@uH?#qdAu z!weN2aJT61J~Jl|^|a25;fG%ye0{VC`uKiyXtkljcHATSWFp+}?UA9LNfq%V5r%pK zg&in|ZqXLTB-C3#AN3|v_09vfvC@_Fb92}B+HlmkE+rBP{@UhGUmyFif?cn!OR0ee zqkO}6-z_YG<^uzP6x8aL-^od|0$V+=CPTvz)P0y!TohQe@@59J#-`2(nn(7OO$9#G zAN*KqGlh3thL|&%ST|k#kXxE4;DPw`rVFJ>G;52w`rTVAdk3gO0@3gz+JIl32Vo0( zt5XGAY{~h?$eCbWO(6dwAHjAq@MyXVh|`TJ25A{}FY+6eLj4Y2A(U~StQ;ZFMMo;8 zV^YVcSQ2%I)N)e}B`sQ|15H(AIyD8Hkd>9asm8TNTX=`J7Ty@07_6T#CWBg6V(~83 zdmB8ulj`{*f%y7QR|9*rR>;uXnw`m9~tV;9)N#?N<3y9TIX})&W=K z)jJspY>J6rh;j2S;Zx45q3ImA-%T)NTzqTB6@vMPe^tEC3re~lL3m(bx(N7sM*By6 zNIo{C%syJ$Rd&19sf8EDMOF+g-5yES@Rx6Z^DpdP5pU!yJM3c1?HLfCzU#O2`M#?q z1L%~r+oRxK+Q-zm?Ic7#th172c-G7O)lF8G8gF;Ty492Li1kF!p9O9T1>3Ki{)*45e@g%IOel{1TC)d=5n#*iyrEux#qLQKU z@G}qv(7~wMOgy|fpVW(-!-a7(bXqGXgEuk{xl&8fj#C-X5EzhA@hwSq`ykvFX_v)~ zGCrYkbP(~{*;grz@eHsC6uYvMk{jiQ(+;&Jgm9l0cC{lLq|lB0l76%B1LIS%wDp$osuk^)azc^+6{|V!RHM9<6@n}_jj?+288V@m8&Po%>f+$ zmYLuFTizL-^%Bk2D0aSl<9%E3oZQX^PPYZA&4H8&4C3`-Cp=mYZTJg+7vD2w+E4PKUOd^w9TIV+|7_x+u4 z9inuJmg|f#1*qw@Ju*mrtd7C)6#*k5u%F{s+E# zTxV)u1TW(VG`cP+2lxplW@cg-OCIO2KaV#3+P_80A2atj2W$LboPDs@f;rE?M$AB` zw_A|^xY56U^tIh|z6GL*gTH)CxLJsP1X|MOcs?A=&a$)n@gl?b6R5H6Lw^(v_#mtW zQ|K+Y7ZPqr)ZY?(zTzWoduk`3`^x>Jr8QizQNf$)n#c;e>o~}#?O>728cuJ2he5KC q52vUgOI|0|ZlCSkC$+zKO#0>nC8Q05ZU27t0hVV`=2d3snEwN&^J`52 literal 0 HcmV?d00001 diff --git a/examples/redmond/theme.css b/demos/redmond/theme.css similarity index 57% rename from examples/redmond/theme.css rename to demos/redmond/theme.css index 2d4947c..a13e5a7 100644 --- a/examples/redmond/theme.css +++ b/demos/redmond/theme.css @@ -1,8 +1,12 @@ /* -* jQuery UI CSS Framework -* Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about) -* Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses. -*/ + * jQuery UI CSS Framework @VERSION + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Theming/API + */ /* Layout helpers ----------------------------------*/ @@ -37,18 +41,23 @@ .ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } - /* -* jQuery UI CSS Framework -* Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about) -* Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses. -* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Lucida%20Grande,%20Lucida%20Sans,%20Arial,%20sans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=5px&bgColorHeader=5c9ccc&bgTextureHeader=12_gloss_wave.png&bgImgOpacityHeader=55&borderColorHeader=4297d7&fcHeader=ffffff&iconColorHeader=d8e7f3&bgColorContent=fcfdfd&bgTextureContent=06_inset_hard.png&bgImgOpacityContent=100&borderColorContent=a6c9e2&fcContent=222222&iconColorContent=469bdd&bgColorDefault=dfeffc&bgTextureDefault=02_glass.png&bgImgOpacityDefault=85&borderColorDefault=c5dbec&fcDefault=2e6e9e&iconColorDefault=6da8d5&bgColorHover=d0e5f5&bgTextureHover=02_glass.png&bgImgOpacityHover=75&borderColorHover=79b7e7&fcHover=1d5987&iconColorHover=217bc0&bgColorActive=f5f8f9&bgTextureActive=06_inset_hard.png&bgImgOpacityActive=100&borderColorActive=79b7e7&fcActive=e17009&iconColorActive=f9bd01&bgColorHighlight=fbec88&bgTextureHighlight=01_flat.png&bgImgOpacityHighlight=55&borderColorHighlight=fad42e&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=02_glass.png&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=01_flat.png&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=01_flat.png&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px -*/ + * jQuery UI CSS Framework @VERSION + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Theming/API + * + * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Lucida%20Grande,%20Lucida%20Sans,%20Arial,%20sans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=5px&bgColorHeader=5c9ccc&bgTextureHeader=12_gloss_wave.png&bgImgOpacityHeader=55&borderColorHeader=4297d7&fcHeader=ffffff&iconColorHeader=d8e7f3&bgColorContent=fcfdfd&bgTextureContent=06_inset_hard.png&bgImgOpacityContent=100&borderColorContent=a6c9e2&fcContent=222222&iconColorContent=469bdd&bgColorDefault=dfeffc&bgTextureDefault=02_glass.png&bgImgOpacityDefault=85&borderColorDefault=c5dbec&fcDefault=2e6e9e&iconColorDefault=6da8d5&bgColorHover=d0e5f5&bgTextureHover=02_glass.png&bgImgOpacityHover=75&borderColorHover=79b7e7&fcHover=1d5987&iconColorHover=217bc0&bgColorActive=f5f8f9&bgTextureActive=06_inset_hard.png&bgImgOpacityActive=100&borderColorActive=79b7e7&fcActive=e17009&iconColorActive=f9bd01&bgColorHighlight=fbec88&bgTextureHighlight=01_flat.png&bgImgOpacityHighlight=55&borderColorHighlight=fad42e&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=02_glass.png&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=01_flat.png&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=01_flat.png&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px + */ /* Component containers ----------------------------------*/ .ui-widget { font-family: Lucida Grande, Lucida Sans, Arial, sans-serif; font-size: 1.1em; } +.ui-widget .ui-widget { font-size: 1em; } .ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Lucida Grande, Lucida Sans, Arial, sans-serif; font-size: 1em; } .ui-widget-content { border: 1px solid #a6c9e2; background: #fcfdfd url(images/ui-bg_inset-hard_100_fcfdfd_1x100.png) 50% bottom repeat-x; color: #222222; } .ui-widget-content a { color: #222222; } @@ -57,23 +66,24 @@ /* Interaction states ----------------------------------*/ -.ui-state-default, .ui-widget-content .ui-state-default { border: 1px solid #c5dbec; background: #dfeffc url(images/ui-bg_glass_85_dfeffc_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #2e6e9e; outline: none; } -.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #2e6e9e; text-decoration: none; outline: none; } -.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus { border: 1px solid #79b7e7; background: #d0e5f5 url(images/ui-bg_glass_75_d0e5f5_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #1d5987; outline: none; } -.ui-state-hover a, .ui-state-hover a:hover { color: #1d5987; text-decoration: none; outline: none; } -.ui-state-active, .ui-widget-content .ui-state-active { border: 1px solid #79b7e7; background: #f5f8f9 url(images/ui-bg_inset-hard_100_f5f8f9_1x100.png) 50% 50% repeat-x; font-weight: bold; color: #e17009; outline: none; } -.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #e17009; outline: none; text-decoration: none; } +.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #c5dbec; background: #dfeffc url(images/ui-bg_glass_85_dfeffc_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #2e6e9e; } +.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #2e6e9e; text-decoration: none; } +.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #79b7e7; background: #d0e5f5 url(images/ui-bg_glass_75_d0e5f5_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #1d5987; } +.ui-state-hover a, .ui-state-hover a:hover { color: #1d5987; text-decoration: none; } +.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #79b7e7; background: #f5f8f9 url(images/ui-bg_inset-hard_100_f5f8f9_1x100.png) 50% 50% repeat-x; font-weight: bold; color: #e17009; } +.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #e17009; text-decoration: none; } +.ui-widget :active { outline: none; } /* Interaction Cues ----------------------------------*/ -.ui-state-highlight, .ui-widget-content .ui-state-highlight {border: 1px solid #fad42e; background: #fbec88 url(images/ui-bg_flat_55_fbec88_40x100.png) 50% 50% repeat-x; color: #363636; } -.ui-state-highlight a, .ui-widget-content .ui-state-highlight a { color: #363636; } -.ui-state-error, .ui-widget-content .ui-state-error {border: 1px solid #cd0a0a; background: #fef1ec url(images/ui-bg_glass_95_fef1ec_1x400.png) 50% 50% repeat-x; color: #cd0a0a; } -.ui-state-error a, .ui-widget-content .ui-state-error a { color: #cd0a0a; } -.ui-state-error-text, .ui-widget-content .ui-state-error-text { color: #cd0a0a; } -.ui-state-disabled, .ui-widget-content .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; } -.ui-priority-primary, .ui-widget-content .ui-priority-primary { font-weight: bold; } -.ui-priority-secondary, .ui-widget-content .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; } +.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight {border: 1px solid #fad42e; background: #fbec88 url(images/ui-bg_flat_55_fbec88_40x100.png) 50% 50% repeat-x; color: #363636; } +.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636; } +.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a; background: #fef1ec url(images/ui-bg_glass_95_fef1ec_1x400.png) 50% 50% repeat-x; color: #cd0a0a; } +.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #cd0a0a; } +.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #cd0a0a; } +.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; } +.ui-priority-secondary, .ui-widget-content .ui-priority-secondary, .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; } +.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; } /* Icons ----------------------------------*/ @@ -224,6 +234,8 @@ .ui-icon-seek-next { background-position: -32px -160px; } .ui-icon-seek-prev { background-position: -48px -160px; } .ui-icon-seek-end { background-position: -64px -160px; } +.ui-icon-seek-start { background-position: -80px -160px; } +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */ .ui-icon-seek-first { background-position: -80px -160px; } .ui-icon-stop { background-position: -96px -160px; } .ui-icon-eject { background-position: -112px -160px; } @@ -268,139 +280,52 @@ ----------------------------------*/ /* Corner radius */ -.ui-corner-tl { -moz-border-radius-topleft: 5px; -webkit-border-top-left-radius: 5px; } -.ui-corner-tr { -moz-border-radius-topright: 5px; -webkit-border-top-right-radius: 5px; } -.ui-corner-bl { -moz-border-radius-bottomleft: 5px; -webkit-border-bottom-left-radius: 5px; } -.ui-corner-br { -moz-border-radius-bottomright: 5px; -webkit-border-bottom-right-radius: 5px; } -.ui-corner-top { -moz-border-radius-topleft: 5px; -webkit-border-top-left-radius: 5px; -moz-border-radius-topright: 5px; -webkit-border-top-right-radius: 5px; } -.ui-corner-bottom { -moz-border-radius-bottomleft: 5px; -webkit-border-bottom-left-radius: 5px; -moz-border-radius-bottomright: 5px; -webkit-border-bottom-right-radius: 5px; } -.ui-corner-right { -moz-border-radius-topright: 5px; -webkit-border-top-right-radius: 5px; -moz-border-radius-bottomright: 5px; -webkit-border-bottom-right-radius: 5px; } -.ui-corner-left { -moz-border-radius-topleft: 5px; -webkit-border-top-left-radius: 5px; -moz-border-radius-bottomleft: 5px; -webkit-border-bottom-left-radius: 5px; } -.ui-corner-all { -moz-border-radius: 5px; -webkit-border-radius: 5px; } +.ui-corner-tl { -moz-border-radius-topleft: 5px; -webkit-border-top-left-radius: 5px; border-top-left-radius: 5px; } +.ui-corner-tr { -moz-border-radius-topright: 5px; -webkit-border-top-right-radius: 5px; border-top-right-radius: 5px; } +.ui-corner-bl { -moz-border-radius-bottomleft: 5px; -webkit-border-bottom-left-radius: 5px; border-bottom-left-radius: 5px; } +.ui-corner-br { -moz-border-radius-bottomright: 5px; -webkit-border-bottom-right-radius: 5px; border-bottom-right-radius: 5px; } +.ui-corner-top { -moz-border-radius-topleft: 5px; -webkit-border-top-left-radius: 5px; border-top-left-radius: 5px; -moz-border-radius-topright: 5px; -webkit-border-top-right-radius: 5px; border-top-right-radius: 5px; } +.ui-corner-bottom { -moz-border-radius-bottomleft: 5px; -webkit-border-bottom-left-radius: 5px; border-bottom-left-radius: 5px; -moz-border-radius-bottomright: 5px; -webkit-border-bottom-right-radius: 5px; border-bottom-right-radius: 5px; } +.ui-corner-right { -moz-border-radius-topright: 5px; -webkit-border-top-right-radius: 5px; border-top-right-radius: 5px; -moz-border-radius-bottomright: 5px; -webkit-border-bottom-right-radius: 5px; border-bottom-right-radius: 5px; } +.ui-corner-left { -moz-border-radius-topleft: 5px; -webkit-border-top-left-radius: 5px; border-top-left-radius: 5px; -moz-border-radius-bottomleft: 5px; -webkit-border-bottom-left-radius: 5px; border-bottom-left-radius: 5px; } +.ui-corner-all { -moz-border-radius: 5px; -webkit-border-radius: 5px; border-radius: 5px; } /* Overlays */ .ui-widget-overlay { background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); } -.ui-widget-shadow { margin: -8px 0 0 -8px; padding: 8px; background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); -moz-border-radius: 8px; -webkit-border-radius: 8px; }/* Accordion -----------------------------------*/ -.ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; } -.ui-accordion .ui-accordion-li-fix { display: inline; } -.ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; } -.ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em 2.2em; } -.ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; } -.ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; } -.ui-accordion .ui-accordion-content-active { display: block; }/* Datepicker -----------------------------------*/ -.ui-datepicker { width: 17em; padding: .2em .2em 0; } -.ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; } -.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; } -.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; } -.ui-datepicker .ui-datepicker-prev { left:2px; } -.ui-datepicker .ui-datepicker-next { right:2px; } -.ui-datepicker .ui-datepicker-prev-hover { left:1px; } -.ui-datepicker .ui-datepicker-next-hover { right:1px; } -.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px; } -.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; } -.ui-datepicker .ui-datepicker-title select { float:left; font-size:1em; margin:1px 0; } -.ui-datepicker select.ui-datepicker-month-year {width: 100%;} -.ui-datepicker select.ui-datepicker-month, -.ui-datepicker select.ui-datepicker-year { width: 49%;} -.ui-datepicker .ui-datepicker-title select.ui-datepicker-year { float: right; } -.ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; } -.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0; } -.ui-datepicker td { border: 0; padding: 1px; } -.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; } -.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; } -.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; } -.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; } - -/* with multiple calendars */ -.ui-datepicker.ui-datepicker-multi { width:auto; } -.ui-datepicker-multi .ui-datepicker-group { float:left; } -.ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; } -.ui-datepicker-multi-2 .ui-datepicker-group { width:50%; } -.ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; } -.ui-datepicker-multi-4 .ui-datepicker-group { width:25%; } -.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; } -.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; } -.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; } -.ui-datepicker-row-break { clear:both; width:100%; } - -/* RTL support */ -.ui-datepicker-rtl { direction: rtl; } -.ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; } -.ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; } -.ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; } -.ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; } -.ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; } -.ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; } -.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; } -.ui-datepicker-rtl .ui-datepicker-group { float:right; } -.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; } -.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; } - -/* IE6 IFRAME FIX (taken from datepicker 1.5.3 */ -.ui-datepicker-cover { - display: none; /*sorry for IE5*/ - display/**/: block; /*sorry for IE5*/ - position: absolute; /*must have*/ - z-index: -1; /*must have*/ - filter: mask(); /*must have*/ - top: -4px; /*must have*/ - left: -4px; /*must have*/ - width: 200px; /*must have*/ - height: 200px; /*must have*/ -}/* Dialog -----------------------------------*/ -.ui-dialog { position: relative; padding: .2em; width: 300px; } -.ui-dialog .ui-dialog-titlebar { padding: .5em .3em .3em 1em; position: relative; } -.ui-dialog .ui-dialog-title { float: left; margin: .1em 0 .2em; } -.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; } -.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; } -.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; } -.ui-dialog .ui-dialog-content { border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; } -.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; } -.ui-dialog .ui-dialog-buttonpane button { float: right; margin: .5em .4em .5em 0; cursor: pointer; padding: .2em .6em .3em .6em; line-height: 1.4em; width:auto; overflow:visible; } -.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; } -.ui-draggable .ui-dialog-titlebar { cursor: move; } -/* Progressbar -----------------------------------*/ -.ui-progressbar { height:2em; text-align: left; } -.ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; }/* Resizable -----------------------------------*/ +.ui-widget-shadow { margin: -8px 0 0 -8px; padding: 8px; background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); -moz-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px; }/* + * jQuery UI Resizable @VERSION + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Resizable#theming + */ .ui-resizable { position: relative;} .ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block;} .ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; } -.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0px; } -.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0px; } -.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0px; height: 100%; } -.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0px; height: 100%; } +.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; } +.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; } +.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; } +.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; } .ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; } .ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; } .ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; } -.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}/* Slider -----------------------------------*/ -.ui-slider { position: relative; text-align: left; } -.ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; } -.ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; } - -.ui-slider-horizontal { height: .8em; } -.ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; } -.ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; } -.ui-slider-horizontal .ui-slider-range-min { left: 0; } -.ui-slider-horizontal .ui-slider-range-max { right: 0; } - -.ui-slider-vertical { width: .8em; height: 100px; } -.ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; } -.ui-slider-vertical .ui-slider-range { left: 0; width: 100%; } -.ui-slider-vertical .ui-slider-range-min { bottom: 0; } -.ui-slider-vertical .ui-slider-range-max { top: 0; }/* Tabs -----------------------------------*/ -.ui-tabs { padding: .2em; zoom: 1; } -.ui-tabs .ui-tabs-nav { list-style: none; position: relative; padding: .2em .2em 0; } -.ui-tabs .ui-tabs-nav li { position: relative; float: left; border-bottom-width: 0 !important; margin: 0 .2em -1px 0; padding: 0; } -.ui-tabs .ui-tabs-nav li a { float: left; text-decoration: none; padding: .5em 1em; } -.ui-tabs .ui-tabs-nav li.ui-tabs-selected { padding-bottom: 1px; border-bottom-width: 0; } +.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}/* + * jQuery UI Tabs @VERSION + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Tabs#theming + */ +.ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */ +.ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; } +.ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 1px; margin: 0 .2em 1px 0; border-bottom: 0 !important; padding: 0; white-space: nowrap; } +.ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em; text-decoration: none; } +.ui-tabs .ui-tabs-nav li.ui-tabs-selected { margin-bottom: 0; padding-bottom: 1px; } .ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; } .ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */ -.ui-tabs .ui-tabs-panel { padding: 1em 1.4em; display: block; border-width: 0; background: none; } +.ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; } .ui-tabs .ui-tabs-hide { display: none !important; } diff --git a/examples/selectable.html b/demos/selectable.html similarity index 62% rename from examples/selectable.html rename to demos/selectable.html index 4c7ab19..4d9d244 100644 --- a/examples/selectable.html +++ b/demos/selectable.html @@ -1,27 +1,13 @@ - + - - - - - - - - - - - - - - + + +]]--> - - - - - - - - - + + +]]--> - - - - - - - - - - - - - - -
- - diff --git a/examples/json.html b/examples/json.html deleted file mode 100644 index 2a6b639..0000000 --- a/examples/json.html +++ /dev/null @@ -1,77 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - -
-

json-events.php needs to be running in the same directory.

- - diff --git a/examples/redmond/images/ui-bg_flat_55_fbec88_40x100.png b/examples/redmond/images/ui-bg_flat_55_fbec88_40x100.png deleted file mode 100644 index 8ff0d2968ba10a10c610de6e497835621fdeeee5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 213 zcmeAS@N?(olHy`uVBq!ia0vp^8bF-F!N$PA*qrS22FRJ?>EalY(fIbdAy>152*br0 zm#ZW46DD2}OQd?|dl`6%zR*h0hjTUWDGop5hSu?eF zsn~n``urWwxz3Bv{qEfNtNS`HjSRFX$=S#O008A9ZFLg>fao6r_DDhhsKy}F`=9u0 zq=(cvZzKBuvod+>;{S{r1eh3@0$6AyiAjyxW8aE#BYhBV4s3KdD3>CWs7rO*V z`!%kUY?$@F^U#NQ7eGTC&q5qfsCvy@&_afecnAuXds*)fHGQ6?);D3<*SN;EzXHox z9-CY>QKY3eW*w^5T<3zD9$%*ZB;;$mu?X`wg`5@yESPGDYV9wcrO9q9Z>yB$J)fy` zNh&?xq2h|P=Gk3uBl4%2o2Yp>EU+_D>t>Kw5m)p}kn&4WG)#i8v5Ut~P~DQ=QkSXB zI9BhQolYKzL5Q_ZHo<*@60>hSaGvIE#~GVBDG956c~C=Ay`xNHA=>iE zx?EP3O?zY(mYg)5EzBE9V5sb^Y6c3sen{E-#BwetB-eAxs>3FdwM!ocE!d+vD4jXX24Ws$g=8ZlSx-%- zDmhbdJfjdDxt$&Es2l3Le_mtGbq2ulLoS)T31XC8QV1_|*Pwz`zPCXu$~^ShL?bBd z8tujqwQ0`=>JSQ9`cVH7`jfLIibuqi?zq7gN#T1f-oKa?-tN4BUp>u1PgFR)V|VlM z*0o9A25QKBbmNZx5d8{~UUcDMID!F%fm8$ko&4z)O z&RjHCrEZ9qYHV_h*(o1-vXF{qlERuu=S)36%Gqyp(6Y&^ZG3}?tRZ)nR}&jq%Qo9| zeD`6)|2k03Rz{J=RYs(>RhsPM>{$Q8&zebAGe)Y^i7uE0bN)xsw--3IcBZ2~luU7F zATo?ksJ%|^e2jZ|t=&9sXFT*~$*@Z^Kf$btlmRTeG@5)5U=`Ua%(}?8Z24K5V2X6K zP@glUvKa4keHIAGq_rC#ee;NgfYYabB5uz{rQhc5%00th8Oi#bD^_5c-2cMxP2#x4 ze==1!_V9*-ksBUa*ya!0HVGuq80hD+vDY#4pd$Lb+ zfT$U<8be|9?Pn_TaK|)#$#z~X-xsRFneOyN32I>FfHYToLn7IZFMC**vy^g)AS2HP zjWh==<*|xNe@t)Z<1Mj5Y;JletxLTlz`P4R&SSVL&3{P3^k>}T2tK}f)niWFfWBTP zPfjH{ICHQ?&-@28s$}Icc%dU><;3jTEAv_er2UwAlTEWcO0t1i+SRJEWy=)MM1y}B z{$7=zzTQ@Mm&RoK)j%m-RCfbZg_#<8WV(WT2+!Sh58DP_cht#!>xG_jci2=DP>mSK zPpqGuSr})W?_X4<2gesoc?vC%gYZfmBLR!CSo|RjFWKH;ob|2c*0LBV&&^$P2*Q21 z+_q>}Sy^h?*w9=T#nCu8j&D~1T&rvgytqeL-a6^4+P3-#KPa7VCyL6yrj*LpvNi2| zEp{Jd^LE;WO=QX>^Yja$Z~pyt1qWRs zy7-1#o65vv{L^O+oUV%t93Vd{%nx>20P|0|5Xae(3i5Kjl5oiIyL%A5$F)$Tj8+M0 z*`HfR?DtcXD|+m)5r)R7`8DtAXK{%+rjm0ZlM(Olj{&Er&95uP~gzgsy|paVthW}w~IEZC;`qaW;^nh?QX z*8%8<=oUDjb=%)`>xB&!fY3p4erayl+1Or6U%iL2KsOPQ9CUEMG5j@BLfI$C|wf6FrT1NdzB<5VyTB1HnV34&vT;7SllV86M|1a;d-`oZ*;SCcYORTn%5m!?wv83e5>yDoO zW5D4Z_Cov?SA)*{^M*E1&MKKt9=f!;% zFWmQqzB3X`7n4e{Scy(U|`kXsQTr4KD1`0 zIhwJXu;>TjHlH#@N6{#FUcE5yKxe#=?P_$t#MH(v6siXn3Dj)9q6=sp&<$~q zp*g0Hc(yX*;^)S@hLifOsB&K-p|>y$%E02QT)3S$C9mdElq;6qW7d&5(-t@b-ox1+%YUjX7XwipteIWoJ@7YeYS(t>3ET#>{2 zYw%hJH4Xy~9jDlaaH&jqO|v9z9=i662{KnMQmtR>_phv3f{N$NWt6kL9LEhG<8i`2 z(TpAagm!6IlC~yYWu6^7q?!^m^&&d!=(5MK#=xzuwyhKC6Y6*Y-eaTaL7O8C#l_p1 z4n|D>4%?bW%?+ni1qHVwz3{Wq)Rop+D?FqIH{3H2Y&*`;)<3#FX(E5K;lxsge88dS zx`b+S|3WJawR85PE`AG+F|XdLv#{?-8Pc@ERXi2`X(o__; zPw97;uaZdv6g}wHzYrct;JO zWH#$^J#cHLbjjIZ@A?jK9y(c2dM8^_Dkm#NUDc#3{cH~fsokZ$ErW$%>7SN{vm#Iu z&IXL}v4ba6p4F0!GM6GgKhWH|o5 zJ@N98UeMqz$DYIBMM%l#5dUx-}VezXKVV=#{h(?m@>RRQ}c@e{xmQKqxH%WDb zw88?i!pc9+LP2LE&n>*7cUAb%P+04gI=f&}r*GOmz!-LUbM*Oqd+vj6`BWd1-D<3k z`mRIqnu^4MAXjkXfAOKTjdzy%JApBMDlfz0M3M^oXNA!@=ulx6@}hr5p2C6n1P>0T zR}5zE`!}1t^O=j+m5Rz#K9BQg(@7PZy#=nx868m(ZuLgG`3Y~x5CN;5#lddRx@3!J zB7yL5_h}y^qGYVVJXlgv@{W9i9cn=`)&cc9Ou!))Pkc?bM;T+s8X<>BAJ;}oafrWT@ zR^FE^zL6P?(p9FTdHLJBw{3(N#A`EhK1~|mGpxC$`O0vJ8}&9D*anU3grwg3WJpQu zq|u@^KZe3&N%YYCl0MX03Ce9N66TSXvBn)8z*xhtXP+WtYVHzi?2$9nfot=i5&`VI zvwdMn)a0ZwomVVTSLB*>60gI+G@3&z=;Y*7wy?h)(Qlos?}^xy2`aYGIiOdt5{Fyf zwaN3$7{268oq4Reiqh#VkIrP_!VBo>Td*F5G$1CiB?Iuz(~yEl{CAa8S7ie9_@$sF z`ehw}A6*;2^Sk;S^wy!^-5d+6WiO}o0V`Y35p~|bC|^@8wM;4tsXt-DEZ>VIV=uhj z-;hXPocr>dHhx;@t9PJ|pwhS18U3v+J1Q>OM__ZV2$9cjae$b!8(_ThXW_d5jB<1) zJQu?Cq8U-w_U6p>>Y3_lwz}-W4Y7~mu;UY#aF|gqvfB4x=*a=^=+wZ{fsrY6>`rl{)L4$Z!cvBiKWv4HnWRk!(^JD5@~M-M*P@s((#hY$8L3BZ6Ls0 zsVLXuwPWfXhA&PSfXgvFXvye;Ebye%1d4KFIQ>W+7v_P>l$Wym$7z+7yFTI!`VC&IL<`eGk%sFox#*QT67RhVIlVjak;fK6X4y>qU|RKpdM|tT(BeB{+1^pZBAI{b z&!0d<=V*CxzN=b`!Jm!#?+z`Opf{2$wl{bi+O^$w!m2%p*_~%{OGE0NFu`hwN zXm5>GY>Il?hDwlGGYt|jC!4HYiD^nlO^kW-`Fq*WY3GOV_SFGyKD)zSWri-UN&B{$ zH154o2nl>34~L%;BZxnm3y8f#MR`U$XL=IJ$jt5J+YQfdSnOaZS~E(FpPV+~tVNlk z_~ReU*>9->-o?T+ZcEteW^J&zD2dKu?5@|rEeU(jh!ok`uwTHT61NpXZBu++LM9Y6Kk0#7Py+xoXKUf9+GK2pi?% z<5?Le8Jynfvgexv-BCK&>Jk4ewh{~R1#UcRJZ}1snYrX}c*%R9v8wvNE!FewAzW6QvDKE$~9SJ-h`=OV~ z#6H&h!UW^B->cbL{QZpuv(x&53g4^BH;0c-pG;LO!G^Yew0-FKC~zPpXM(f)bEX`j-^J}XmJR@Oq&vk3Iv3#KhRZZmKI zpLGY=PQ6DYl4dTh+VbG2AgSgDL4-1&seg}J>`LuxI8ob@-+4y-W!=z^xv5Q1T1x|& zwVlG{n1m0Qf8~uk_cCO^BNg74iuI1kl8N;8{NYIC0}=6T^0PO~U2>cq9@f+*CAIlf zhYoeWe%`4&__;~IHQ@EkN XNb-jjZ9>-m@0a;V!$7@S)gk78x^YM$ diff --git a/tests/jquery-legacy/jquery-1.3.2.min.js b/lib/jquery-1.3.2.min.js similarity index 100% rename from tests/jquery-legacy/jquery-1.3.2.min.js rename to lib/jquery-1.3.2.min.js diff --git a/src/jquery/jquery.js b/lib/jquery-1.4.2.min.js similarity index 100% rename from src/jquery/jquery.js rename to lib/jquery-1.4.2.min.js diff --git a/tests/jquery-legacy/jquery-ui-1.7.3.custom.min.js b/lib/jquery-ui-1.7.3.custom.min.js similarity index 100% rename from tests/jquery-legacy/jquery-ui-1.7.3.custom.min.js rename to lib/jquery-ui-1.7.3.custom.min.js diff --git a/src/jquery/jquery-ui-custom.js b/lib/jquery-ui-1.8.4.custom.min.js similarity index 60% rename from src/jquery/jquery-ui-custom.js rename to lib/jquery-ui-1.8.4.custom.min.js index 5670a4a..6b1e8d7 100644 --- a/src/jquery/jquery-ui-custom.js +++ b/lib/jquery-ui-1.8.4.custom.min.js @@ -1,39 +1,41 @@ /*! - * jQuery UI 1.8.1 + * jQuery UI 1.8.4 * - * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT (MIT-LICENSE.txt) - * and GPL (GPL-LICENSE.txt) licenses. + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license * * http://docs.jquery.com/UI */ -jQuery.ui||function(c){c.ui={version:"1.8.1",plugin:{add:function(a,b,d){a=c.ui[a].prototype;for(var e in d){a.plugins[e]=a.plugins[e]||[];a.plugins[e].push([b,d[e]])}},call:function(a,b,d){if((b=a.plugins[b])&&a.element[0].parentNode)for(var e=0;e0)return true;a[b]=1;d=a[b]>0;a[b]=0;return d},isOverAxis:function(a,b,d){return a>b&&a=0)&&c(a).is(":focusable")}})}(jQuery); +(function(c,j){function k(a){return!c(a).parents().andSelf().filter(function(){return c.curCSS(this,"visibility")==="hidden"||c.expr.filters.hidden(this)}).length}c.ui=c.ui||{};if(!c.ui.version){c.extend(c.ui,{version:"1.8.4",plugin:{add:function(a,b,d){a=c.ui[a].prototype;for(var e in d){a.plugins[e]=a.plugins[e]||[];a.plugins[e].push([b,d[e]])}},call:function(a,b,d){if((b=a.plugins[b])&&a.element[0].parentNode)for(var e=0;e0)return true;a[b]=1;d=a[b]>0;a[b]=0;return d},isOverAxis:function(a,b,d){return a>b&&a=0)&&c(a).is(":focusable")}})}})(jQuery); ;/*! - * jQuery UI Widget 1.8.1 + * jQuery UI Widget 1.8.4 * - * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT (MIT-LICENSE.txt) - * and GPL (GPL-LICENSE.txt) licenses. + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license * * http://docs.jquery.com/UI/Widget */ -(function(b){var j=b.fn.remove;b.fn.remove=function(a,c){return this.each(function(){if(!c)if(!a||b.filter(a,[this]).length)b("*",this).add(this).each(function(){b(this).triggerHandler("remove")});return j.call(b(this),a,c)})};b.widget=function(a,c,d){var e=a.split(".")[0],f;a=a.split(".")[1];f=e+"-"+a;if(!d){d=c;c=b.Widget}b.expr[":"][f]=function(h){return!!b.data(h,a)};b[e]=b[e]||{};b[e][a]=function(h,g){arguments.length&&this._createWidget(h,g)};c=new c;c.options=b.extend({},c.options);b[e][a].prototype= -b.extend(true,c,{namespace:e,widgetName:a,widgetEventPrefix:b[e][a].prototype.widgetEventPrefix||a,widgetBaseClass:f},d);b.widget.bridge(a,b[e][a])};b.widget.bridge=function(a,c){b.fn[a]=function(d){var e=typeof d==="string",f=Array.prototype.slice.call(arguments,1),h=this;d=!e&&f.length?b.extend.apply(null,[true,d].concat(f)):d;if(e&&d.substring(0,1)==="_")return h;e?this.each(function(){var g=b.data(this,a),i=g&&b.isFunction(g[d])?g[d].apply(g,f):g;if(i!==g&&i!==undefined){h=i;return false}}):this.each(function(){var g= -b.data(this,a);if(g){d&&g.option(d);g._init()}else b.data(this,a,new c(d,this))});return h}};b.Widget=function(a,c){arguments.length&&this._createWidget(a,c)};b.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",options:{disabled:false},_createWidget:function(a,c){this.element=b(c).data(this.widgetName,this);this.options=b.extend(true,{},this.options,b.metadata&&b.metadata.get(c)[this.widgetName],a);var d=this;this.element.bind("remove."+this.widgetName,function(){d.destroy()});this._create(); -this._init()},_create:function(){},_init:function(){},destroy:function(){this.element.unbind("."+this.widgetName).removeData(this.widgetName);this.widget().unbind("."+this.widgetName).removeAttr("aria-disabled").removeClass(this.widgetBaseClass+"-disabled ui-state-disabled")},widget:function(){return this.element},option:function(a,c){var d=a,e=this;if(arguments.length===0)return b.extend({},e.options);if(typeof a==="string"){if(c===undefined)return this.options[a];d={};d[a]=c}b.each(d,function(f, +(function(b,j){var k=b.fn.remove;b.fn.remove=function(a,c){return this.each(function(){if(!c)if(!a||b.filter(a,[this]).length)b("*",this).add([this]).each(function(){b(this).triggerHandler("remove")});return k.call(b(this),a,c)})};b.widget=function(a,c,d){var e=a.split(".")[0],f;a=a.split(".")[1];f=e+"-"+a;if(!d){d=c;c=b.Widget}b.expr[":"][f]=function(h){return!!b.data(h,a)};b[e]=b[e]||{};b[e][a]=function(h,g){arguments.length&&this._createWidget(h,g)};c=new c;c.options=b.extend(true,{},c.options); +b[e][a].prototype=b.extend(true,c,{namespace:e,widgetName:a,widgetEventPrefix:b[e][a].prototype.widgetEventPrefix||a,widgetBaseClass:f},d);b.widget.bridge(a,b[e][a])};b.widget.bridge=function(a,c){b.fn[a]=function(d){var e=typeof d==="string",f=Array.prototype.slice.call(arguments,1),h=this;d=!e&&f.length?b.extend.apply(null,[true,d].concat(f)):d;if(e&&d.substring(0,1)==="_")return h;e?this.each(function(){var g=b.data(this,a),i=g&&b.isFunction(g[d])?g[d].apply(g,f):g;if(i!==g&&i!==j){h=i;return false}}): +this.each(function(){var g=b.data(this,a);if(g){d&&g.option(d);g._init()}else b.data(this,a,new c(d,this))});return h}};b.Widget=function(a,c){arguments.length&&this._createWidget(a,c)};b.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",options:{disabled:false},_createWidget:function(a,c){b.data(c,this.widgetName,this);this.element=b(c);this.options=b.extend(true,{},this.options,b.metadata&&b.metadata.get(c)[this.widgetName],a);var d=this;this.element.bind("remove."+this.widgetName,function(){d.destroy()}); +this._create();this._init()},_create:function(){},_init:function(){},destroy:function(){this.element.unbind("."+this.widgetName).removeData(this.widgetName);this.widget().unbind("."+this.widgetName).removeAttr("aria-disabled").removeClass(this.widgetBaseClass+"-disabled ui-state-disabled")},widget:function(){return this.element},option:function(a,c){var d=a,e=this;if(arguments.length===0)return b.extend({},e.options);if(typeof a==="string"){if(c===j)return this.options[a];d={};d[a]=c}b.each(d,function(f, h){e._setOption(f,h)});return e},_setOption:function(a,c){this.options[a]=c;if(a==="disabled")this.widget()[c?"addClass":"removeClass"](this.widgetBaseClass+"-disabled ui-state-disabled").attr("aria-disabled",c);return this},enable:function(){return this._setOption("disabled",false)},disable:function(){return this._setOption("disabled",true)},_trigger:function(a,c,d){var e=this.options[a];c=b.Event(c);c.type=(a===this.widgetEventPrefix?a:this.widgetEventPrefix+a).toLowerCase();d=d||{};if(c.originalEvent){a= b.event.props.length;for(var f;a;){f=b.event.props[--a];c[f]=c.originalEvent[f]}}this.element.trigger(c,d);return!(b.isFunction(e)&&e.call(this.element[0],c,d)===false||c.isDefaultPrevented())}}})(jQuery); ;/*! - * jQuery UI Mouse 1.8.1 + * jQuery UI Mouse 1.8.4 * - * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT (MIT-LICENSE.txt) - * and GPL (GPL-LICENSE.txt) licenses. + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license * * http://docs.jquery.com/UI/Mouse * @@ -46,11 +48,11 @@ return true}}this._mouseMoveDelegate=function(d){return b._mouseMove(d)};this._m this._mouseDelayMet(a))(this._mouseStarted=this._mouseStart(this._mouseDownEvent,a)!==false)?this._mouseDrag(a):this._mouseUp(a);return!this._mouseStarted},_mouseUp:function(a){c(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=false;this._preventClickEvent=a.target==this._mouseDownEvent.target;this._mouseStop(a)}return false},_mouseDistanceMet:function(a){return Math.max(Math.abs(this._mouseDownEvent.pageX- a.pageX),Math.abs(this._mouseDownEvent.pageY-a.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return true}})})(jQuery); ;/* - * jQuery UI Draggable 1.8.1 + * jQuery UI Draggable 1.8.4 * - * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT (MIT-LICENSE.txt) - * and GPL (GPL-LICENSE.txt) licenses. + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license * * http://docs.jquery.com/UI/Draggables * @@ -78,7 +80,7 @@ f?0:c.scrollLeft())*a)}},_generatePosition:function(a){var b=this.options,c=this this.offset.click.top;if(a.pageX-this.offset.click.left>this.containment[2])e=this.containment[2]+this.offset.click.left;if(a.pageY-this.offset.click.top>this.containment[3])g=this.containment[3]+this.offset.click.top}if(b.grid){g=this.originalPageY+Math.round((g-this.originalPageY)/b.grid[1])*b.grid[1];g=this.containment?!(g-this.offset.click.topthis.containment[3])?g:!(g-this.offset.click.topthis.containment[2])?e:!(e-this.offset.click.left').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(), +(function(e){e.widget("ui.resizable",e.ui.mouse,{widgetEventPrefix:"resize",options:{alsoResize:false,animate:false,animateDuration:"slow",animateEasing:"swing",aspectRatio:false,autoHide:false,containment:false,ghost:false,grid:false,handles:"e,s,se",helper:false,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1E3},_create:function(){var b=this,a=this.options;this.element.addClass("ui-resizable");e.extend(this,{_aspectRatio:!!a.aspectRatio,aspectRatio:a.aspectRatio,originalElement:this.element, +_proportionallyResizeElements:[],_helper:a.helper||a.ghost||a.animate?a.helper||"ui-resizable-helper":null});if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)){/relative/.test(this.element.css("position"))&&e.browser.opera&&this.element.css({position:"relative",top:"auto",left:"auto"});this.element.wrap(e('
').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(), top:this.element.css("top"),left:this.element.css("left")}));this.element=this.element.parent().data("resizable",this.element.data("resizable"));this.elementIsWrapper=true;this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")});this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0});this.originalResizeStyle= -this.originalElement.css("resize");this.originalElement.css("resize","none");this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"}));this.originalElement.css({margin:this.originalElement.css("margin")});this._proportionallyResize()}this.handles=a.handles||(!d(".ui-resizable-handle",this.element).length?"e,s,se":{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne", -nw:".ui-resizable-nw"});if(this.handles.constructor==String){if(this.handles=="all")this.handles="n,e,s,w,se,sw,ne,nw";var c=this.handles.split(",");this.handles={};for(var e=0;e');/sw|se|ne|nw/.test(g)&&f.css({zIndex:++a.zIndex});"se"==g&&f.addClass("ui-icon ui-icon-gripsmall-diagonal-se");this.handles[g]=".ui-resizable-"+g;this.element.append(f)}}this._renderAxis=function(h){h=h||this.element;for(var i in this.handles){if(this.handles[i].constructor== -String)this.handles[i]=d(this.handles[i],this.element).show();if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var j=d(this.handles[i],this.element),l=0;l=/sw|ne|nw|se|n|s/.test(i)?j.outerHeight():j.outerWidth();j=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join("");h.css(j,l);this._proportionallyResize()}d(this.handles[i])}};this._renderAxis(this.element);this._handles=d(".ui-resizable-handle",this.element).disableSelection(); -this._handles.mouseover(function(){if(!b.resizing){if(this.className)var h=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);b.axis=h&&h[1]?h[1]:"se"}});if(a.autoHide){this._handles.hide();d(this.element).addClass("ui-resizable-autohide").hover(function(){d(this).removeClass("ui-resizable-autohide");b._handles.show()},function(){if(!b.resizing){d(this).addClass("ui-resizable-autohide");b._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy();var b=function(c){d(c).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()}; -if(this.elementIsWrapper){b(this.element);var a=this.element;a.after(this.originalElement.css({position:a.css("position"),width:a.outerWidth(),height:a.outerHeight(),top:a.css("top"),left:a.css("left")})).remove()}this.originalElement.css("resize",this.originalResizeStyle);b(this.originalElement);return this},_mouseCapture:function(b){var a=false;for(var c in this.handles)if(d(this.handles[c])[0]==b.target)a=true;return!this.options.disabled&&a},_mouseStart:function(b){var a=this.options,c=this.element.position(), -e=this.element;this.resizing=true;this.documentScroll={top:d(document).scrollTop(),left:d(document).scrollLeft()};if(e.is(".ui-draggable")||/absolute/.test(e.css("position")))e.css({position:"absolute",top:c.top,left:c.left});d.browser.opera&&/relative/.test(e.css("position"))&&e.css({position:"relative",top:"auto",left:"auto"});this._renderProxy();c=m(this.helper.css("left"));var g=m(this.helper.css("top"));if(a.containment){c+=d(a.containment).scrollLeft()||0;g+=d(a.containment).scrollTop()||0}this.offset= -this.helper.offset();this.position={left:c,top:g};this.size=this._helper?{width:e.outerWidth(),height:e.outerHeight()}:{width:e.width(),height:e.height()};this.originalSize=this._helper?{width:e.outerWidth(),height:e.outerHeight()}:{width:e.width(),height:e.height()};this.originalPosition={left:c,top:g};this.sizeDiff={width:e.outerWidth()-e.width(),height:e.outerHeight()-e.height()};this.originalMousePosition={left:b.pageX,top:b.pageY};this.aspectRatio=typeof a.aspectRatio=="number"?a.aspectRatio: -this.originalSize.width/this.originalSize.height||1;a=d(".ui-resizable-"+this.axis).css("cursor");d("body").css("cursor",a=="auto"?this.axis+"-resize":a);e.addClass("ui-resizable-resizing");this._propagate("start",b);return true},_mouseDrag:function(b){var a=this.helper,c=this.originalMousePosition,e=this._change[this.axis];if(!e)return false;c=e.apply(this,[b,b.pageX-c.left||0,b.pageY-c.top||0]);if(this._aspectRatio||b.shiftKey)c=this._updateRatio(c,b);c=this._respectSize(c,b);this._propagate("resize", -b);a.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"});!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize();this._updateCache(c);this._trigger("resize",b,this.ui());return false},_mouseStop:function(b){this.resizing=false;var a=this.options,c=this;if(this._helper){var e=this._proportionallyResizeElements,g=e.length&&/textarea/i.test(e[0].nodeName);e=g&&d.ui.hasScroll(e[0],"left")?0:c.sizeDiff.height; -g={width:c.size.width-(g?0:c.sizeDiff.width),height:c.size.height-e};e=parseInt(c.element.css("left"),10)+(c.position.left-c.originalPosition.left)||null;var f=parseInt(c.element.css("top"),10)+(c.position.top-c.originalPosition.top)||null;a.animate||this.element.css(d.extend(g,{top:f,left:e}));c.helper.height(c.size.height);c.helper.width(c.size.width);this._helper&&!a.animate&&this._proportionallyResize()}d("body").css("cursor","auto");this.element.removeClass("ui-resizable-resizing");this._propagate("stop", -b);this._helper&&this.helper.remove();return false},_updateCache:function(b){this.offset=this.helper.offset();if(k(b.left))this.position.left=b.left;if(k(b.top))this.position.top=b.top;if(k(b.height))this.size.height=b.height;if(k(b.width))this.size.width=b.width},_updateRatio:function(b){var a=this.position,c=this.size,e=this.axis;if(b.height)b.width=c.height*this.aspectRatio;else if(b.width)b.height=c.width/this.aspectRatio;if(e=="sw"){b.left=a.left+(c.width-b.width);b.top=null}if(e=="nw"){b.top= -a.top+(c.height-b.height);b.left=a.left+(c.width-b.width)}return b},_respectSize:function(b){var a=this.options,c=this.axis,e=k(b.width)&&a.maxWidth&&a.maxWidthb.width,h=k(b.height)&&a.minHeight&&a.minHeight>b.height;if(f)b.width=a.minWidth;if(h)b.height=a.minHeight;if(e)b.width=a.maxWidth;if(g)b.height=a.maxHeight;var i=this.originalPosition.left+this.originalSize.width,j=this.position.top+this.size.height, -l=/sw|nw|w/.test(c);c=/nw|ne|n/.test(c);if(f&&l)b.left=i-a.minWidth;if(e&&l)b.left=i-a.maxWidth;if(h&&c)b.top=j-a.minHeight;if(g&&c)b.top=j-a.maxHeight;if((a=!b.width&&!b.height)&&!b.left&&b.top)b.top=null;else if(a&&!b.top&&b.left)b.left=null;return b},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var b=this.helper||this.element,a=0;a');var a=d.browser.msie&&d.browser.version<7,c=a?1:0;a=a?2:-1;this.helper.addClass(this._helper).css({width:this.element.outerWidth()+a,height:this.element.outerHeight()+a,position:"absolute",left:this.elementOffset.left-c+"px",top:this.elementOffset.top-c+"px",zIndex:++b.zIndex});this.helper.appendTo("body").disableSelection()}else this.helper=this.element},_change:{e:function(b,a){return{width:this.originalSize.width+ -a}},w:function(b,a){return{left:this.originalPosition.left+a,width:this.originalSize.width-a}},n:function(b,a,c){return{top:this.originalPosition.top+c,height:this.originalSize.height-c}},s:function(b,a,c){return{height:this.originalSize.height+c}},se:function(b,a,c){return d.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[b,a,c]))},sw:function(b,a,c){return d.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[b,a,c]))},ne:function(b,a,c){return d.extend(this._change.n.apply(this, -arguments),this._change.e.apply(this,[b,a,c]))},nw:function(b,a,c){return d.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[b,a,c]))}},_propagate:function(b,a){d.ui.plugin.call(this,b,[a,this.ui()]);b!="resize"&&this._trigger(b,a,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}});d.extend(d.ui.resizable, -{version:"1.8.1"});d.ui.plugin.add("resizable","alsoResize",{start:function(){var b=d(this).data("resizable").options,a=function(c){d(c).each(function(){d(this).data("resizable-alsoresize",{width:parseInt(d(this).width(),10),height:parseInt(d(this).height(),10),left:parseInt(d(this).css("left"),10),top:parseInt(d(this).css("top"),10)})})};if(typeof b.alsoResize=="object"&&!b.alsoResize.parentNode)if(b.alsoResize.length){b.alsoResize=b.alsoResize[0];a(b.alsoResize)}else d.each(b.alsoResize,function(c){a(c)}); -else a(b.alsoResize)},resize:function(){var b=d(this).data("resizable"),a=b.options,c=b.originalSize,e=b.originalPosition,g={height:b.size.height-c.height||0,width:b.size.width-c.width||0,top:b.position.top-e.top||0,left:b.position.left-e.left||0},f=function(h,i){d(h).each(function(){var j=d(this),l=d(this).data("resizable-alsoresize"),p={};d.each((i&&i.length?i:["width","height","top","left"])||["width","height","top","left"],function(n,o){if((n=(l[o]||0)+(g[o]||0))&&n>=0)p[o]=n||null});if(/relative/.test(j.css("position"))&& -d.browser.opera){b._revertToRelativePosition=true;j.css({position:"absolute",top:"auto",left:"auto"})}j.css(p)})};typeof a.alsoResize=="object"&&!a.alsoResize.nodeType?d.each(a.alsoResize,function(h,i){f(h,i)}):f(a.alsoResize)},stop:function(){var b=d(this).data("resizable");if(b._revertToRelativePosition&&d.browser.opera){b._revertToRelativePosition=false;el.css({position:"relative"})}d(this).removeData("resizable-alsoresize-start")}});d.ui.plugin.add("resizable","animate",{stop:function(b){var a= -d(this).data("resizable"),c=a.options,e=a._proportionallyResizeElements,g=e.length&&/textarea/i.test(e[0].nodeName),f=g&&d.ui.hasScroll(e[0],"left")?0:a.sizeDiff.height;g={width:a.size.width-(g?0:a.sizeDiff.width),height:a.size.height-f};f=parseInt(a.element.css("left"),10)+(a.position.left-a.originalPosition.left)||null;var h=parseInt(a.element.css("top"),10)+(a.position.top-a.originalPosition.top)||null;a.element.animate(d.extend(g,h&&f?{top:h,left:f}:{}),{duration:c.animateDuration,easing:c.animateEasing, -step:function(){var i={width:parseInt(a.element.css("width"),10),height:parseInt(a.element.css("height"),10),top:parseInt(a.element.css("top"),10),left:parseInt(a.element.css("left"),10)};e&&e.length&&d(e[0]).css({width:i.width,height:i.height});a._updateCache(i);a._propagate("resize",b)}})}});d.ui.plugin.add("resizable","containment",{start:function(){var b=d(this).data("resizable"),a=b.element,c=b.options.containment;if(a=c instanceof d?c.get(0):/parent/.test(c)?a.parent().get(0):c){b.containerElement= -d(a);if(/document/.test(c)||c==document){b.containerOffset={left:0,top:0};b.containerPosition={left:0,top:0};b.parentData={element:d(document),left:0,top:0,width:d(document).width(),height:d(document).height()||document.body.parentNode.scrollHeight}}else{var e=d(a),g=[];d(["Top","Right","Left","Bottom"]).each(function(i,j){g[i]=m(e.css("padding"+j))});b.containerOffset=e.offset();b.containerPosition=e.position();b.containerSize={height:e.innerHeight()-g[3],width:e.innerWidth()-g[1]};c=b.containerOffset; -var f=b.containerSize.height,h=b.containerSize.width;h=d.ui.hasScroll(a,"left")?a.scrollWidth:h;f=d.ui.hasScroll(a)?a.scrollHeight:f;b.parentData={element:a,left:c.left,top:c.top,width:h,height:f}}}},resize:function(b){var a=d(this).data("resizable"),c=a.options,e=a.containerOffset,g=a.position;b=a._aspectRatio||b.shiftKey;var f={top:0,left:0},h=a.containerElement;if(h[0]!=document&&/static/.test(h.css("position")))f=e;if(g.left<(a._helper?e.left:0)){a.size.width+=a._helper?a.position.left-e.left: -a.position.left-f.left;if(b)a.size.height=a.size.width/c.aspectRatio;a.position.left=c.helper?e.left:0}if(g.top<(a._helper?e.top:0)){a.size.height+=a._helper?a.position.top-e.top:a.position.top;if(b)a.size.width=a.size.height*c.aspectRatio;a.position.top=a._helper?e.top:0}a.offset.left=a.parentData.left+a.position.left;a.offset.top=a.parentData.top+a.position.top;c=Math.abs((a._helper?a.offset.left-f.left:a.offset.left-f.left)+a.sizeDiff.width);e=Math.abs((a._helper?a.offset.top-f.top:a.offset.top- -e.top)+a.sizeDiff.height);g=a.containerElement.get(0)==a.element.parent().get(0);f=/relative|absolute/.test(a.containerElement.css("position"));if(g&&f)c-=a.parentData.left;if(c+a.size.width>=a.parentData.width){a.size.width=a.parentData.width-c;if(b)a.size.height=a.size.width/a.aspectRatio}if(e+a.size.height>=a.parentData.height){a.size.height=a.parentData.height-e;if(b)a.size.width=a.size.height*a.aspectRatio}},stop:function(){var b=d(this).data("resizable"),a=b.options,c=b.containerOffset,e=b.containerPosition, -g=b.containerElement,f=d(b.helper),h=f.offset(),i=f.outerWidth()-b.sizeDiff.width;f=f.outerHeight()-b.sizeDiff.height;b._helper&&!a.animate&&/relative/.test(g.css("position"))&&d(this).css({left:h.left-e.left-c.left,width:i,height:f});b._helper&&!a.animate&&/static/.test(g.css("position"))&&d(this).css({left:h.left-e.left-c.left,width:i,height:f})}});d.ui.plugin.add("resizable","ghost",{start:function(){var b=d(this).data("resizable"),a=b.options,c=b.size;b.ghost=b.originalElement.clone();b.ghost.css({opacity:0.25, -display:"block",position:"relative",height:c.height,width:c.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof a.ghost=="string"?a.ghost:"");b.ghost.appendTo(b.helper)},resize:function(){var b=d(this).data("resizable");b.ghost&&b.ghost.css({position:"relative",height:b.size.height,width:b.size.width})},stop:function(){var b=d(this).data("resizable");b.ghost&&b.helper&&b.helper.get(0).removeChild(b.ghost.get(0))}});d.ui.plugin.add("resizable","grid",{resize:function(){var b= -d(this).data("resizable"),a=b.options,c=b.size,e=b.originalSize,g=b.originalPosition,f=b.axis;a.grid=typeof a.grid=="number"?[a.grid,a.grid]:a.grid;var h=Math.round((c.width-e.width)/(a.grid[0]||1))*(a.grid[0]||1);a=Math.round((c.height-e.height)/(a.grid[1]||1))*(a.grid[1]||1);if(/^(se|s|e)$/.test(f)){b.size.width=e.width+h;b.size.height=e.height+a}else if(/^(ne)$/.test(f)){b.size.width=e.width+h;b.size.height=e.height+a;b.position.top=g.top-a}else{if(/^(sw)$/.test(f)){b.size.width=e.width+h;b.size.height= -e.height+a}else{b.size.width=e.width+h;b.size.height=e.height+a;b.position.top=g.top-a}b.position.left=g.left-h}}});var m=function(b){return parseInt(b,10)||0},k=function(b){return!isNaN(parseInt(b,10))}})(jQuery); +this.originalElement.css("resize");this.originalElement.css("resize","none");this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"}));this.originalElement.css({margin:this.originalElement.css("margin")});this._proportionallyResize()}this.handles=a.handles||(!e(".ui-resizable-handle",this.element).length?"e,s,se":{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne", +nw:".ui-resizable-nw"});if(this.handles.constructor==String){if(this.handles=="all")this.handles="n,e,s,w,se,sw,ne,nw";var c=this.handles.split(",");this.handles={};for(var d=0;d');/sw|se|ne|nw/.test(f)&&g.css({zIndex:++a.zIndex});"se"==f&&g.addClass("ui-icon ui-icon-gripsmall-diagonal-se");this.handles[f]=".ui-resizable-"+f;this.element.append(g)}}this._renderAxis=function(h){h=h||this.element;for(var i in this.handles){if(this.handles[i].constructor== +String)this.handles[i]=e(this.handles[i],this.element).show();if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var j=e(this.handles[i],this.element),k=0;k=/sw|ne|nw|se|n|s/.test(i)?j.outerHeight():j.outerWidth();j=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join("");h.css(j,k);this._proportionallyResize()}e(this.handles[i])}};this._renderAxis(this.element);this._handles=e(".ui-resizable-handle",this.element).disableSelection(); +this._handles.mouseover(function(){if(!b.resizing){if(this.className)var h=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);b.axis=h&&h[1]?h[1]:"se"}});if(a.autoHide){this._handles.hide();e(this.element).addClass("ui-resizable-autohide").hover(function(){e(this).removeClass("ui-resizable-autohide");b._handles.show()},function(){if(!b.resizing){e(this).addClass("ui-resizable-autohide");b._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy();var b=function(c){e(c).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()}; +if(this.elementIsWrapper){b(this.element);var a=this.element;a.after(this.originalElement.css({position:a.css("position"),width:a.outerWidth(),height:a.outerHeight(),top:a.css("top"),left:a.css("left")})).remove()}this.originalElement.css("resize",this.originalResizeStyle);b(this.originalElement);return this},_mouseCapture:function(b){var a=false;for(var c in this.handles)if(e(this.handles[c])[0]==b.target)a=true;return!this.options.disabled&&a},_mouseStart:function(b){var a=this.options,c=this.element.position(), +d=this.element;this.resizing=true;this.documentScroll={top:e(document).scrollTop(),left:e(document).scrollLeft()};if(d.is(".ui-draggable")||/absolute/.test(d.css("position")))d.css({position:"absolute",top:c.top,left:c.left});e.browser.opera&&/relative/.test(d.css("position"))&&d.css({position:"relative",top:"auto",left:"auto"});this._renderProxy();c=m(this.helper.css("left"));var f=m(this.helper.css("top"));if(a.containment){c+=e(a.containment).scrollLeft()||0;f+=e(a.containment).scrollTop()||0}this.offset= +this.helper.offset();this.position={left:c,top:f};this.size=this._helper?{width:d.outerWidth(),height:d.outerHeight()}:{width:d.width(),height:d.height()};this.originalSize=this._helper?{width:d.outerWidth(),height:d.outerHeight()}:{width:d.width(),height:d.height()};this.originalPosition={left:c,top:f};this.sizeDiff={width:d.outerWidth()-d.width(),height:d.outerHeight()-d.height()};this.originalMousePosition={left:b.pageX,top:b.pageY};this.aspectRatio=typeof a.aspectRatio=="number"?a.aspectRatio: +this.originalSize.width/this.originalSize.height||1;a=e(".ui-resizable-"+this.axis).css("cursor");e("body").css("cursor",a=="auto"?this.axis+"-resize":a);d.addClass("ui-resizable-resizing");this._propagate("start",b);return true},_mouseDrag:function(b){var a=this.helper,c=this.originalMousePosition,d=this._change[this.axis];if(!d)return false;c=d.apply(this,[b,b.pageX-c.left||0,b.pageY-c.top||0]);if(this._aspectRatio||b.shiftKey)c=this._updateRatio(c,b);c=this._respectSize(c,b);this._propagate("resize", +b);a.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"});!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize();this._updateCache(c);this._trigger("resize",b,this.ui());return false},_mouseStop:function(b){this.resizing=false;var a=this.options,c=this;if(this._helper){var d=this._proportionallyResizeElements,f=d.length&&/textarea/i.test(d[0].nodeName);d=f&&e.ui.hasScroll(d[0],"left")?0:c.sizeDiff.height; +f={width:c.size.width-(f?0:c.sizeDiff.width),height:c.size.height-d};d=parseInt(c.element.css("left"),10)+(c.position.left-c.originalPosition.left)||null;var g=parseInt(c.element.css("top"),10)+(c.position.top-c.originalPosition.top)||null;a.animate||this.element.css(e.extend(f,{top:g,left:d}));c.helper.height(c.size.height);c.helper.width(c.size.width);this._helper&&!a.animate&&this._proportionallyResize()}e("body").css("cursor","auto");this.element.removeClass("ui-resizable-resizing");this._propagate("stop", +b);this._helper&&this.helper.remove();return false},_updateCache:function(b){this.offset=this.helper.offset();if(l(b.left))this.position.left=b.left;if(l(b.top))this.position.top=b.top;if(l(b.height))this.size.height=b.height;if(l(b.width))this.size.width=b.width},_updateRatio:function(b){var a=this.position,c=this.size,d=this.axis;if(b.height)b.width=c.height*this.aspectRatio;else if(b.width)b.height=c.width/this.aspectRatio;if(d=="sw"){b.left=a.left+(c.width-b.width);b.top=null}if(d=="nw"){b.top= +a.top+(c.height-b.height);b.left=a.left+(c.width-b.width)}return b},_respectSize:function(b){var a=this.options,c=this.axis,d=l(b.width)&&a.maxWidth&&a.maxWidthb.width,h=l(b.height)&&a.minHeight&&a.minHeight>b.height;if(g)b.width=a.minWidth;if(h)b.height=a.minHeight;if(d)b.width=a.maxWidth;if(f)b.height=a.maxHeight;var i=this.originalPosition.left+this.originalSize.width,j=this.position.top+this.size.height, +k=/sw|nw|w/.test(c);c=/nw|ne|n/.test(c);if(g&&k)b.left=i-a.minWidth;if(d&&k)b.left=i-a.maxWidth;if(h&&c)b.top=j-a.minHeight;if(f&&c)b.top=j-a.maxHeight;if((a=!b.width&&!b.height)&&!b.left&&b.top)b.top=null;else if(a&&!b.top&&b.left)b.left=null;return b},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var b=this.helper||this.element,a=0;a');var a=e.browser.msie&&e.browser.version<7,c=a?1:0;a=a?2:-1;this.helper.addClass(this._helper).css({width:this.element.outerWidth()+a,height:this.element.outerHeight()+a,position:"absolute",left:this.elementOffset.left-c+"px",top:this.elementOffset.top-c+"px",zIndex:++b.zIndex});this.helper.appendTo("body").disableSelection()}else this.helper=this.element},_change:{e:function(b,a){return{width:this.originalSize.width+ +a}},w:function(b,a){return{left:this.originalPosition.left+a,width:this.originalSize.width-a}},n:function(b,a,c){return{top:this.originalPosition.top+c,height:this.originalSize.height-c}},s:function(b,a,c){return{height:this.originalSize.height+c}},se:function(b,a,c){return e.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[b,a,c]))},sw:function(b,a,c){return e.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[b,a,c]))},ne:function(b,a,c){return e.extend(this._change.n.apply(this, +arguments),this._change.e.apply(this,[b,a,c]))},nw:function(b,a,c){return e.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[b,a,c]))}},_propagate:function(b,a){e.ui.plugin.call(this,b,[a,this.ui()]);b!="resize"&&this._trigger(b,a,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}});e.extend(e.ui.resizable, +{version:"1.8.4"});e.ui.plugin.add("resizable","alsoResize",{start:function(){var b=e(this).data("resizable").options,a=function(c){e(c).each(function(){var d=e(this);d.data("resizable-alsoresize",{width:parseInt(d.width(),10),height:parseInt(d.height(),10),left:parseInt(d.css("left"),10),top:parseInt(d.css("top"),10),position:d.css("position")})})};if(typeof b.alsoResize=="object"&&!b.alsoResize.parentNode)if(b.alsoResize.length){b.alsoResize=b.alsoResize[0];a(b.alsoResize)}else e.each(b.alsoResize, +function(c){a(c)});else a(b.alsoResize)},resize:function(b,a){var c=e(this).data("resizable");b=c.options;var d=c.originalSize,f=c.originalPosition,g={height:c.size.height-d.height||0,width:c.size.width-d.width||0,top:c.position.top-f.top||0,left:c.position.left-f.left||0},h=function(i,j){e(i).each(function(){var k=e(this),q=e(this).data("resizable-alsoresize"),p={},r=j&&j.length?j:k.parents(a.originalElement[0]).length?["width","height"]:["width","height","top","left"];e.each(r,function(n,o){if((n= +(q[o]||0)+(g[o]||0))&&n>=0)p[o]=n||null});if(e.browser.opera&&/relative/.test(k.css("position"))){c._revertToRelativePosition=true;k.css({position:"absolute",top:"auto",left:"auto"})}k.css(p)})};typeof b.alsoResize=="object"&&!b.alsoResize.nodeType?e.each(b.alsoResize,function(i,j){h(i,j)}):h(b.alsoResize)},stop:function(){var b=e(this).data("resizable"),a=b.options,c=function(d){e(d).each(function(){var f=e(this);f.css({position:f.data("resizable-alsoresize").position})})};if(b._revertToRelativePosition){b._revertToRelativePosition= +false;typeof a.alsoResize=="object"&&!a.alsoResize.nodeType?e.each(a.alsoResize,function(d){c(d)}):c(a.alsoResize)}e(this).removeData("resizable-alsoresize")}});e.ui.plugin.add("resizable","animate",{stop:function(b){var a=e(this).data("resizable"),c=a.options,d=a._proportionallyResizeElements,f=d.length&&/textarea/i.test(d[0].nodeName),g=f&&e.ui.hasScroll(d[0],"left")?0:a.sizeDiff.height;f={width:a.size.width-(f?0:a.sizeDiff.width),height:a.size.height-g};g=parseInt(a.element.css("left"),10)+(a.position.left- +a.originalPosition.left)||null;var h=parseInt(a.element.css("top"),10)+(a.position.top-a.originalPosition.top)||null;a.element.animate(e.extend(f,h&&g?{top:h,left:g}:{}),{duration:c.animateDuration,easing:c.animateEasing,step:function(){var i={width:parseInt(a.element.css("width"),10),height:parseInt(a.element.css("height"),10),top:parseInt(a.element.css("top"),10),left:parseInt(a.element.css("left"),10)};d&&d.length&&e(d[0]).css({width:i.width,height:i.height});a._updateCache(i);a._propagate("resize", +b)}})}});e.ui.plugin.add("resizable","containment",{start:function(){var b=e(this).data("resizable"),a=b.element,c=b.options.containment;if(a=c instanceof e?c.get(0):/parent/.test(c)?a.parent().get(0):c){b.containerElement=e(a);if(/document/.test(c)||c==document){b.containerOffset={left:0,top:0};b.containerPosition={left:0,top:0};b.parentData={element:e(document),left:0,top:0,width:e(document).width(),height:e(document).height()||document.body.parentNode.scrollHeight}}else{var d=e(a),f=[];e(["Top", +"Right","Left","Bottom"]).each(function(i,j){f[i]=m(d.css("padding"+j))});b.containerOffset=d.offset();b.containerPosition=d.position();b.containerSize={height:d.innerHeight()-f[3],width:d.innerWidth()-f[1]};c=b.containerOffset;var g=b.containerSize.height,h=b.containerSize.width;h=e.ui.hasScroll(a,"left")?a.scrollWidth:h;g=e.ui.hasScroll(a)?a.scrollHeight:g;b.parentData={element:a,left:c.left,top:c.top,width:h,height:g}}}},resize:function(b){var a=e(this).data("resizable"),c=a.options,d=a.containerOffset, +f=a.position;b=a._aspectRatio||b.shiftKey;var g={top:0,left:0},h=a.containerElement;if(h[0]!=document&&/static/.test(h.css("position")))g=d;if(f.left<(a._helper?d.left:0)){a.size.width+=a._helper?a.position.left-d.left:a.position.left-g.left;if(b)a.size.height=a.size.width/c.aspectRatio;a.position.left=c.helper?d.left:0}if(f.top<(a._helper?d.top:0)){a.size.height+=a._helper?a.position.top-d.top:a.position.top;if(b)a.size.width=a.size.height*c.aspectRatio;a.position.top=a._helper?d.top:0}a.offset.left= +a.parentData.left+a.position.left;a.offset.top=a.parentData.top+a.position.top;c=Math.abs((a._helper?a.offset.left-g.left:a.offset.left-g.left)+a.sizeDiff.width);d=Math.abs((a._helper?a.offset.top-g.top:a.offset.top-d.top)+a.sizeDiff.height);f=a.containerElement.get(0)==a.element.parent().get(0);g=/relative|absolute/.test(a.containerElement.css("position"));if(f&&g)c-=a.parentData.left;if(c+a.size.width>=a.parentData.width){a.size.width=a.parentData.width-c;if(b)a.size.height=a.size.width/a.aspectRatio}if(d+ +a.size.height>=a.parentData.height){a.size.height=a.parentData.height-d;if(b)a.size.width=a.size.height*a.aspectRatio}},stop:function(){var b=e(this).data("resizable"),a=b.options,c=b.containerOffset,d=b.containerPosition,f=b.containerElement,g=e(b.helper),h=g.offset(),i=g.outerWidth()-b.sizeDiff.width;g=g.outerHeight()-b.sizeDiff.height;b._helper&&!a.animate&&/relative/.test(f.css("position"))&&e(this).css({left:h.left-d.left-c.left,width:i,height:g});b._helper&&!a.animate&&/static/.test(f.css("position"))&& +e(this).css({left:h.left-d.left-c.left,width:i,height:g})}});e.ui.plugin.add("resizable","ghost",{start:function(){var b=e(this).data("resizable"),a=b.options,c=b.size;b.ghost=b.originalElement.clone();b.ghost.css({opacity:0.25,display:"block",position:"relative",height:c.height,width:c.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof a.ghost=="string"?a.ghost:"");b.ghost.appendTo(b.helper)},resize:function(){var b=e(this).data("resizable");b.ghost&&b.ghost.css({position:"relative", +height:b.size.height,width:b.size.width})},stop:function(){var b=e(this).data("resizable");b.ghost&&b.helper&&b.helper.get(0).removeChild(b.ghost.get(0))}});e.ui.plugin.add("resizable","grid",{resize:function(){var b=e(this).data("resizable"),a=b.options,c=b.size,d=b.originalSize,f=b.originalPosition,g=b.axis;a.grid=typeof a.grid=="number"?[a.grid,a.grid]:a.grid;var h=Math.round((c.width-d.width)/(a.grid[0]||1))*(a.grid[0]||1);a=Math.round((c.height-d.height)/(a.grid[1]||1))*(a.grid[1]||1);if(/^(se|s|e)$/.test(g)){b.size.width= +d.width+h;b.size.height=d.height+a}else if(/^(ne)$/.test(g)){b.size.width=d.width+h;b.size.height=d.height+a;b.position.top=f.top-a}else{if(/^(sw)$/.test(g)){b.size.width=d.width+h;b.size.height=d.height+a}else{b.size.width=d.width+h;b.size.height=d.height+a;b.position.top=f.top-a}b.position.left=f.left-h}}});var m=function(b){return parseInt(b,10)||0},l=function(b){return!isNaN(parseInt(b,10))}})(jQuery); ; \ No newline at end of file diff --git a/src/Calendar.js b/src/Calendar.js new file mode 100644 index 0000000..e5f8842 --- /dev/null +++ b/src/Calendar.js @@ -0,0 +1,480 @@ + + +function Calendar(element, options, eventSources) { + var t = this; + + + // exports + t.options = options; + t.render = render; + t.destroy = destroy; + t.changeView = changeView; + t.select = select; + t.unselect = unselect; + t.rerenderEvents = rerenderEvents; // todo: seems liks an EventManager thing + t.prev = prev; + t.next = next; + t.prevYear = prevYear; + t.nextYear = nextYear; + t.today = today; + t.gotoDate = gotoDate; + t.incrementDate = incrementDate; + t.formatDate = function(format, date) { return formatDate(format, date, options) }; + t.formatDates = function(format, date1, date2) { return formatDates(format, date1, date2, options) }; + t.getDate = getDate; + t.getView = getView; + t.option = option; + t.trigger = trigger; + + + // imports + EventManager.call(t, options, eventSources); + var fetchEvents = t.fetchEvents; + var isFetchNeeded = t.isFetchNeeded; + var clientEvents = t.clientEvents; + + + // locals + var _element = element[0]; + var header; + var headerElement; + var content; + var tm; // for making theme classes + var currentView; + var viewInstances = {}; + var elementOuterWidth; + var suggestedViewHeight; + var absoluteViewElement; + var resizeUID = 0; + var ignoreWindowResize = 0; + var date = new Date(); + + + + /* Main Rendering + -----------------------------------------------------------------------------*/ + + + setYMD(date, options.year, options.month, options.date); + + + function render(inc) { + if (!content) { + initialRender(); + }else{ + calcSize(); + sizesDirty(); + eventsDirty(); + renderView(inc); + } + } + + + function initialRender() { + tm = options.theme ? 'ui' : 'fc'; + element.addClass('fc'); + if (options.isRTL) { + element.addClass('fc-rtl'); + } + if (options.theme) { + element.addClass('ui-widget'); + } + content = $("
") + .prependTo(element); + header = new Header(t, options); + headerElement = header.render(); + if (headerElement) { + element.prepend(headerElement); + } + changeView(options.defaultView); + $(window).resize(windowResize); + // needed for IE in a 0x0 iframe, b/c when it is resized, never triggers a windowResize + if (!bodyVisible()) { + lateRender(); + } + } + + + // called when we know the calendar couldn't be rendered when it was initialized, + // but we think it's ready now + function lateRender() { + setTimeout(function() { // IE7 needs this so dimensions are calculated correctly + if (!currentView.start && bodyVisible()) { // !currentView.start makes sure this never happens more than once + renderView(); + } + },0); + } + + + function destroy() { + $(window).unbind('resize', windowResize); + header.destroy(); + content.remove(); + element.removeClass('fc fc-rtl fc-ui-widget'); + } + + + + function elementVisible() { + return _element.offsetWidth !== 0; + } + + + function bodyVisible() { + return $('body')[0].offsetWidth !== 0; + } + + + + /* View Rendering + -----------------------------------------------------------------------------*/ + + + function changeView(newViewName) { + if (!currentView || newViewName != currentView.name) { + ignoreWindowResize++; // because setMinHeight might change the height before render (and subsequently setSize) is reached + + unselect(); + + var oldView = currentView; + var newViewElement; + + if (oldView) { + if (oldView.eventsChanged) { + eventsDirty(); + oldView.eventDirty = oldView.eventsChanged = false; + } + (oldView.beforeHide || noop)(); // called before changing min-height. if called after, scroll state is reset (in Opera) + setMinHeight(content, content.height()); + oldView.element.hide(); + }else{ + setMinHeight(content, 1); // needs to be 1 (not 0) for IE7, or else view dimensions miscalculated + } + content.css('overflow', 'hidden'); + + currentView = viewInstances[newViewName]; + if (currentView) { + currentView.element.show(); + }else{ + currentView = viewInstances[newViewName] = new fcViews[newViewName]( + newViewElement = absoluteViewElement = + $("
") + .appendTo(content), + t // the calendar object + ); + } + + if (oldView) { + header.deactivateButton(oldView.name); + } + header.activateButton(newViewName); + + renderView(); // after height has been set, will make absoluteViewElement's position=relative, then set to null + + content.css('overflow', ''); + if (oldView) { + setMinHeight(content, 1); + } + + if (!newViewElement) { + (currentView.afterShow || noop)(); // called after setting min-height/overflow, so in final scroll state (for Opera) + } + + ignoreWindowResize--; + } + } + + + + function renderView(inc) { + if (elementVisible()) { + ignoreWindowResize++; // because renderEvents might temporarily change the height before setSize is reached + + unselect(); + + if (suggestedViewHeight === undefined) { + calcSize(); + } + + if (!currentView.start || inc || date < currentView.start || date >= currentView.end) { + currentView.render(date, inc || 0); // responsible for clearing events + setSize(true); + if (!options.lazyFetching || isFetchNeeded()) { + fetchAndRenderEvents(); + }else{ + currentView.renderEvents(clientEvents()); // don't refetch + } + } + else if (currentView.sizeDirty || currentView.eventsDirty || !options.lazyFetching) { + currentView.clearEvents(); + if (currentView.sizeDirty) { + setSize(); + } + if (!options.lazyFetching || isFetchNeeded()) { + fetchAndRenderEvents(); + }else{ + currentView.renderEvents(clientEvents()); // don't refetch + } + } + elementOuterWidth = element.outerWidth(); + currentView.sizeDirty = false; + currentView.eventsDirty = false; + + header.updateTitle(currentView.title); + var today = new Date(); + if (today >= currentView.start && today < currentView.end) { + header.disableButton('today'); + }else{ + header.enableButton('today'); + } + + ignoreWindowResize--; + currentView.trigger('viewDisplay', _element); + } + } + + + + /* Resizing + -----------------------------------------------------------------------------*/ + + + function calcSize() { + if (options.contentHeight) { + suggestedViewHeight = options.contentHeight; + } + else if (options.height) { + suggestedViewHeight = options.height - (headerElement ? headerElement.height() : 0) - vsides(content[0]); + } + else { + suggestedViewHeight = Math.round(content.width() / Math.max(options.aspectRatio, .5)); + } + } + + + function setSize(dateChanged) { // todo: dateChanged? + ignoreWindowResize++; + currentView.setHeight(suggestedViewHeight, dateChanged); + if (absoluteViewElement) { + absoluteViewElement.css('position', 'relative'); + absoluteViewElement = null; + } + currentView.setWidth(content.width(), dateChanged); + ignoreWindowResize--; + } + + + function windowResize() { + if (!ignoreWindowResize) { + if (currentView.start) { // view has already been rendered + var uid = ++resizeUID; + setTimeout(function() { // add a delay + if (uid == resizeUID && !ignoreWindowResize && elementVisible()) { + if (elementOuterWidth != (elementOuterWidth = element.outerWidth())) { + ignoreWindowResize++; // in case the windowResize callback changes the height + sizeChanged(); + currentView.trigger('windowResize', _element); + ignoreWindowResize--; + } + } + }, 200); + }else{ + // calendar must have been initialized in a 0x0 iframe that has just been resized + lateRender(); + } + } + } + + + // called when we know the element size has changed + function sizeChanged() { + sizesDirty(); + if (elementVisible()) { + calcSize(); + setSize(); + unselect(); + currentView.rerenderEvents(); + currentView.sizeDirty = false; + } + } + + + // marks other views' sizes as dirty + function sizesDirty() { + $.each(viewInstances, function(i, inst) { + inst.sizeDirty = true; + }); + } + + + + /* Event Rendering + -----------------------------------------------------------------------------*/ + + + // called when any event objects have been added/removed/changed, rerenders + function rerenderEvents() { + eventsDirty(); + if (elementVisible()) { + currentView.clearEvents(); + currentView.renderEvents(clientEvents()); + currentView.eventsDirty = false; + } + } + + + // marks every views' events as dirty + function eventsDirty() { + $.each(viewInstances, function(i, inst) { + inst.eventsDirty = true; + }); + } + + + // for convenience + function fetchAndRenderEvents() { + fetchEvents(function(events) { + currentView.renderEvents(events); // maintain `this` in view + }); + } + + + + /* Selection + -----------------------------------------------------------------------------*/ + + + function select(start, end, allDay) { + currentView.select(start, end, allDay===undefined ? true : allDay); + } + + + function unselect() { // safe to be called before renderView + if (currentView) { + currentView.unselect(); + } + } + + + + /* Date + -----------------------------------------------------------------------------*/ + + + function prev() { + renderView(-1); + } + + + function next() { + renderView(1); + } + + + function prevYear() { + addYears(date, -1); + renderView(); + } + + + function nextYear() { + addYears(date, 1); + renderView(); + } + + + function today() { + date = new Date(); + renderView(); + } + + + function gotoDate(year, month, dateOfMonth) { + if (year instanceof Date) { + date = cloneDate(year); // provided 1 argument, a Date + }else{ + setYMD(date, year, month, dateOfMonth); + } + renderView(); + } + + + function incrementDate(years, months, days) { + if (years !== undefined) { + addYears(date, years); + } + if (months !== undefined) { + addMonths(date, months); + } + if (days !== undefined) { + addDays(date, days); + } + renderView(); + } + + + function getDate() { + return cloneDate(date); + } + + + + /* Misc + -----------------------------------------------------------------------------*/ + + + function getView() { + return currentView; + } + + + function option(name, value) { + if (value === undefined) { + return options[name]; + } + if (name == 'height' || name == 'contentHeight' || name == 'aspectRatio') { + options[name] = value; + sizeChanged(); + } + } + + + function trigger(name, thisObj) { + if (options[name]) { + return options[name].apply( + thisObj || _element, + Array.prototype.slice.call(arguments, 2) + ); + } + } + + + + /* External Dragging + ------------------------------------------------------------------------*/ + + var _dragElement; + + if (options.droppable) { + $(document) + .bind('dragstart', function(ev, ui) { + var _e = ev.target; + var e = $(_e); + if (!e.parents('.fc').length) { // not already inside a calendar + var accept = options.dropAccept; + if ($.isFunction(accept) ? accept.call(_e, e) : e.is(accept)) { + _dragElement = _e; + currentView.dragStart(_dragElement, ev, ui); + } + } + }) + .bind('dragstop', function(ev, ui) { + if (_dragElement) { + currentView.dragStop(_dragElement, ev, ui); + _dragElement = null; + } + }); + } + + +} diff --git a/src/EventManager.js b/src/EventManager.js new file mode 100644 index 0000000..bbf2bb0 --- /dev/null +++ b/src/EventManager.js @@ -0,0 +1,288 @@ + +var eventGUID = 1; + +function EventManager(options, eventSources) { + var t = this; + + + // exports + t.fetchEvents = fetchEvents; + t.refetchEvents = refetchEvents; + t.isFetchNeeded = isFetchNeeded; + t.addEventSource = addEventSource; + t.removeEventSource = removeEventSource; + t.updateEvent = updateEvent; + t.renderEvent = renderEvent; + t.removeEvents = removeEvents; + t.clientEvents = clientEvents; + t.normalizeEvent = normalizeEvent; + + + // imports + var getDate = t.getDate; + var getView = t.getView; + var trigger = t.trigger; + var rerenderEvents = t.rerenderEvents; + + + // locals + var eventStart, eventEnd; + var events = []; + var loadingLevel = 0; + + + + /* Sources + -----------------------------------------------------------------------------*/ + + + eventSources.unshift([]); // first event source reserved for 'sticky' events + + + function addEventSource(source) { + eventSources.push(source); + fetchEventSource(source, rerenderEvents); + } + + + function removeEventSource(source) { + eventSources = $.grep(eventSources, function(src) { + return src != source; + }); + // remove all client events from that source + events = $.grep(events, function(e) { + return e.source != source; + }); + rerenderEvents(); + } + + + + /* Fetching + -----------------------------------------------------------------------------*/ + + + // Fetch from ALL sources. Clear 'events' array and populate + function fetchEvents(callback) { + var view = getView(); + events = []; + eventStart = cloneDate(view.visStart); + eventEnd = cloneDate(view.visEnd); + var queued = eventSources.length, + sourceDone = function() { + if (!--queued) { + if (callback) { + callback(events); + } + } + }, i=0; + for (; i eventEnd; + } + + + + /* Manipulation + -----------------------------------------------------------------------------*/ + + + function updateEvent(event) { // update an existing event + var i, len = events.length, e, + defaultEventEnd = getView().defaultEventEnd, + startDelta = event.start - event._start, + endDelta = event.end ? + (event.end - (event._end || defaultEventEnd(event))) // event._end would be null if event.end + : 0; // was null and event was just resized + for (i=0; i") + .append($("") + .append($("") + .append(renderSection(sections.left))) + .append($("") + .append(renderSection(sections.center))) + .append($("") + .append(renderSection(sections.right)))); + return element; + } + } + + + function destroy() { + element.remove(); + } + + + function renderSection(buttonStr) { + if (buttonStr) { + var tr = $(""); + $.each(buttonStr.split(' '), function(i) { + if (i > 0) { + tr.append(""); + } + var prevButton; + $.each(this.split(','), function(j, buttonName) { + if (buttonName == 'title') { + tr.append("

 

"); + if (prevButton) { + prevButton.addClass(tm + '-corner-right'); + } + prevButton = null; + }else{ + var buttonClick; + if (calendar[buttonName]) { + buttonClick = calendar[buttonName]; // calendar method + } + else if (fcViews[buttonName]) { + buttonClick = function() { + button.removeClass(tm + '-state-hover'); // forget why + calendar.changeView(buttonName); + }; + } + if (buttonClick) { + if (prevButton) { + prevButton.addClass(tm + '-no-right'); + } + var button; + var icon = options.theme ? smartProperty(options.buttonIcons, buttonName) : null; + var text = smartProperty(options.buttonText, buttonName); + if (icon) { + button = $("
" + + "
"); + } + else if (text) { + button = $(""); + } + if (button) { + button + .click(function() { + if (!button.hasClass(tm + '-state-disabled')) { + buttonClick(); + } + }) + .mousedown(function() { + button + .not('.' + tm + '-state-active') + .not('.' + tm + '-state-disabled') + .addClass(tm + '-state-down'); + }) + .mouseup(function() { + button.removeClass(tm + '-state-down'); + }) + .hover( + function() { + button + .not('.' + tm + '-state-active') + .not('.' + tm + '-state-disabled') + .addClass(tm + '-state-hover'); + }, + function() { + button + .removeClass(tm + '-state-hover') + .removeClass(tm + '-state-down'); + } + ) + .appendTo($("").appendTo(tr)); + if (prevButton) { + prevButton.addClass(tm + '-no-right'); + }else{ + button.addClass(tm + '-corner-left'); + } + prevButton = button; + } + } + } + }); + if (prevButton) { + prevButton.addClass(tm + '-corner-right'); + } + }); + return $("").append(tr); + } + } + + + function updateTitle(html) { + element.find('h2.fc-header-title') + .html(html); + } + + + function activateButton(buttonName) { + element.find('div.fc-button-' + buttonName) + .addClass(tm + '-state-active'); + } + + + function deactivateButton(buttonName) { + element.find('div.fc-button-' + buttonName) + .removeClass(tm + '-state-active'); + } + + + function disableButton(buttonName) { + element.find('div.fc-button-' + buttonName) + .addClass(tm + '-state-disabled'); + } + + + function enableButton(buttonName) { + element.find('div.fc-button-' + buttonName) + .removeClass(tm + '-state-disabled'); + } + + +} diff --git a/src/_loader.js b/src/_loader.js new file mode 100644 index 0000000..2cdc3f2 --- /dev/null +++ b/src/_loader.js @@ -0,0 +1,132 @@ +(function() { + +var JQUERY = 'jquery-1.4.2.min.js'; +var JQUERY_UI = 'jquery-ui-1.8.4.custom.min.js'; +var JQUERY_LEGACY = 'jquery-1.3.2.min.js'; +var JQUERY_UI_LEGACY = 'jquery-ui-1.7.3.custom.min.js'; + +var qs = window.location.href.match(/(\?.*)?$/)[0]; +var legacy = qs.indexOf('legacy') != -1; +var noui = qs.indexOf('noui') != -1; +var debug; +var prefix; +var tags; + + +startload(); + +css('main.css'); +css('common/common.css'); +css('basic/basic.css'); +css('agenda/agenda.css'); + +if (!legacy) { + jslib('../lib/' + JQUERY); + if (!noui) { + jslib('../lib/' + JQUERY_UI); + } +}else{ + jslib('../lib/' + JQUERY_LEGACY); + if (!noui) { + jslib('../lib/' + JQUERY_UI_LEGACY); + } +} + +if (debug && (!window.console || !window.console.log)) { + jslib('../tests/lib/firebug-lite/firebug-lite-compressed.js'); +} + +js('defaults.js'); +js('main.js'); +js('Calendar.js'); +js('Header.js'); +js('EventManager.js'); + +js('basic/MonthView.js'); +js('basic/BasicWeekView.js'); +js('basic/BasicDayView.js'); +js('basic/BasicView.js'); +js('basic/BasicEventRenderer.js'); + +js('agenda/AgendaWeekView.js'); +js('agenda/AgendaDayView.js'); +js('agenda/AgendaView.js'); +js('agenda/AgendaEventRenderer.js'); + +js('common/View.js'); +js('common/DayEventRenderer.js'); +js('common/SelectionManager.js'); +js('common/OverlayManager.js'); +js('common/CoordinateGrid.js'); +js('common/HoverListener.js'); +js('common/HorizontalPositionCache.js'); +js('common/date.js'); +js('common/util.js'); + +endload(); + + +if (debug) { + window.onload = function() { + $('body').append( + "" + + " " + + "" + + "
" + + " " + + "" + + "" + ); + }; +} + + +window.startload = startload; +window.endload = endload; +window.css = css; +window.js = js; +window.jslib = jslib; + + +function startload() { + debug = false; + prefix = ''; + tags = []; + var scripts = document.getElementsByTagName('script'); + for (var i=0, script; script=scripts[i++];) { + if (!script._checked) { + script._checked = true; + var m = (script.getAttribute('src') || '').match(/^(.*)_loader\.js(\?.*)?$/); + if (m) { + prefix = m[1]; + debug = (m[2] || '').indexOf('debug') != -1; + break; + } + } + } +} + + +function endload() { + document.write(tags.join("\n")); +} + + +function css(file) { + tags.push(""); +} + + +function js(file) { + tags.push(""); +} + + +function jslib(file) { + js(file); +} + + +})(); diff --git a/src/agenda.js b/src/agenda.js deleted file mode 100644 index b91c07f..0000000 --- a/src/agenda.js +++ /dev/null @@ -1,1249 +0,0 @@ - -/* Agenda Views: agendaWeek/agendaDay ------------------------------------------------------------------------------*/ - -setDefaults({ - allDaySlot: true, - allDayText: 'all-day', - firstHour: 6, - slotMinutes: 30, - defaultEventMinutes: 120, - axisFormat: 'h(:mm)tt', - timeFormat: { - agenda: 'h:mm{ - h:mm}' - }, - dragOpacity: { - agenda: .5 - }, - minTime: 0, - maxTime: 24 -}); - -views.agendaWeek = function(element, options, viewName) { - return new Agenda(element, options, { - render: function(date, delta) { - if (delta) { - addDays(date, delta * 7); - } - var visStart = this.visStart = cloneDate( - this.start = addDays(cloneDate(date), -((date.getDay() - options.firstDay + 7) % 7)) - ), - visEnd = this.visEnd = cloneDate( - this.end = addDays(cloneDate(visStart), 7) - ); - if (!options.weekends) { - skipWeekend(visStart); - skipWeekend(visEnd, -1, true); - } - this.title = formatDates( - visStart, - addDays(cloneDate(visEnd), -1), - this.option('titleFormat'), - options - ); - this.renderAgenda( - options.weekends ? 7 : 5, - this.option('columnFormat') - ); - } - }, viewName); -}; - -views.agendaDay = function(element, options, viewName) { - return new Agenda(element, options, { - render: function(date, delta) { - if (delta) { - addDays(date, delta); - if (!options.weekends) { - skipWeekend(date, delta < 0 ? -1 : 1); - } - } - this.title = formatDate(date, this.option('titleFormat'), options); - this.start = this.visStart = cloneDate(date, true); - this.end = this.visEnd = addDays(cloneDate(this.start), 1); - this.renderAgenda( - 1, - this.option('columnFormat') - ); - } - }, viewName); -}; - -function Agenda(element, options, methods, viewName) { - - var head, body, bodyContent, bodyTable, bg, - colCnt, - slotCnt=0, // spanning all the way across - axisWidth, colWidth, slotHeight, - viewWidth, viewHeight, - savedScrollTop, - cachedEvents=[], - daySegmentContainer, - slotSegmentContainer, - tm, firstDay, - nwe, // no weekends (int) - rtl, dis, dit, // day index sign / translate - minMinute, maxMinute, - colContentPositions = new HorizontalPositionCache(function(col) { - return bg.find('td:eq(' + col + ') div div'); - }), - slotTopCache = {}, - // ... - - view = $.extend(this, viewMethods, methods, { - renderAgenda: renderAgenda, - renderEvents: renderEvents, - rerenderEvents: rerenderEvents, - clearEvents: clearEvents, - setHeight: setHeight, - setWidth: setWidth, - beforeHide: function() { - savedScrollTop = body.scrollTop(); - }, - afterShow: function() { - body.scrollTop(savedScrollTop); - }, - defaultEventEnd: function(event) { - var start = cloneDate(event.start); - if (event.allDay) { - return start; - } - return addMinutes(start, options.defaultEventMinutes); - } - }); - view.name = viewName; - view.init(element, options); - - - - /* Time-slot rendering - -----------------------------------------------------------------------------*/ - - - disableTextSelection(element.addClass('fc-agenda')); - - - function renderAgenda(c, colFormat) { - - colCnt = c; - - // update option-derived variables - tm = options.theme ? 'ui' : 'fc'; - nwe = options.weekends ? 0 : 1; - firstDay = options.firstDay; - if (rtl = options.isRTL) { - dis = -1; - dit = colCnt - 1; - }else{ - dis = 1; - dit = 0; - } - minMinute = parseTime(options.minTime); - maxMinute = parseTime(options.maxTime); - - var d0 = rtl ? addDays(cloneDate(view.visEnd), -1) : cloneDate(view.visStart), - d = cloneDate(d0), - today = clearTime(new Date()); - - if (!head) { // first time rendering, build from scratch - - var i, - minutes, - slotNormal = options.slotMinutes % 15 == 0, //... - - // head - s = "
" + - "
" + - "" + - ""; - for (i=0; i" + formatDate(d, colFormat, options) + ""; - addDays(d, dis); - if (nwe) { - skipWeekend(d, dis); - } - } - s += ""; - if (options.allDaySlot) { - s += "" + - "" + - "" + - "" + - ""; - } - s+= "
  
" + options.allDayText + "" + - "
 
 
"; - head = $(s).appendTo(element); - dayBind(head.find('td')); - - // all-day event container - daySegmentContainer = $("
").appendTo(head); - - // body - d = zeroDate(); - var maxd = addMinutes(cloneDate(d), maxMinute); - addMinutes(d, minMinute); - s = ""; - for (i=0; d < maxd; i++) { - minutes = d.getMinutes(); - s += ""; - addMinutes(d, options.slotMinutes); - slotCnt++; - } - s += "
" + - ((!slotNormal || !minutes) ? formatDate(d, options.axisFormat) : ' ') + - "
 
"; - body = $("
") - .append(bodyContent = $("
") - .append(bodyTable = $(s))) - .appendTo(element); - slotBind(body.find('td')); - - // slot event container - slotSegmentContainer = $("
").appendTo(bodyContent); - - // background stripes - d = cloneDate(d0); - s = "
" + - ""; - for (i=0; i
 
"; - addDays(d, dis); - if (nwe) { - skipWeekend(d, dis); - } - } - s += "
"; - bg = $(s).appendTo(element); - - }else{ // skeleton already built, just modify it - - clearEvents(); - - // redo column header text and class - head.find('tr:first th').slice(1, -1).each(function() { - $(this).text(formatDate(d, colFormat, options)); - this.className = this.className.replace(/^fc-\w+(?= )/, 'fc-' + dayIDs[d.getDay()]); - addDays(d, dis); - if (nwe) { - skipWeekend(d, dis); - } - }); - - // change classes of background stripes - d = cloneDate(d0); - bg.find('td').each(function() { - this.className = this.className.replace(/^fc-\w+(?= )/, 'fc-' + dayIDs[d.getDay()]); - if (+d == +today) { - $(this) - .removeClass('fc-not-today') - .addClass('fc-today') - .addClass(tm + '-state-highlight'); - }else{ - $(this) - .addClass('fc-not-today') - .removeClass('fc-today') - .removeClass(tm + '-state-highlight'); - } - addDays(d, dis); - if (nwe) { - skipWeekend(d, dis); - } - }); - - } - - } - - - function resetScroll() { - var d0 = zeroDate(), - scrollDate = cloneDate(d0); - scrollDate.setHours(options.firstHour); - var top = timePosition(d0, scrollDate) + 1, // +1 for the border - scroll = function() { - body.scrollTop(top); - }; - scroll(); - setTimeout(scroll, 0); // overrides any previous scroll state made by the browser - } - - - function setHeight(height, dateChanged) { - viewHeight = height; - slotTopCache = {}; - - body.height(height - head.height()); - - slotHeight = body.find('tr:first div').height() + 1; - - bg.css({ - top: head.find('tr').height(), - height: height - }); - - if (dateChanged) { - resetScroll(); - } - } - - - function setWidth(width) { - viewWidth = width; - colContentPositions.clear(); - - body.width(width); - bodyTable.width(''); - - var topTDs = head.find('tr:first th'), - stripeTDs = bg.find('td'), - clientWidth = body[0].clientWidth; - - bodyTable.width(clientWidth); - - // time-axis width - axisWidth = 0; - setOuterWidth( - head.find('tr:lt(2) th:first').add(body.find('tr:first th')) - .width('') - .each(function() { - axisWidth = Math.max(axisWidth, $(this).outerWidth()); - }), - axisWidth - ); - - // column width - colWidth = Math.floor((clientWidth - axisWidth) / colCnt); - setOuterWidth(stripeTDs.slice(0, -1), colWidth); - setOuterWidth(topTDs.slice(1, -2), colWidth); - setOuterWidth(topTDs.slice(-2, -1), clientWidth - axisWidth - colWidth*(colCnt-1)); - - bg.css({ - left: axisWidth, - width: clientWidth - axisWidth - }); - } - - - - /* Slot/Day clicking and binding - -----------------------------------------------------------------------*/ - - - function dayBind(tds) { - tds.click(slotClick) - .mousedown(daySelectionMousedown); - } - - - function slotBind(tds) { - tds.click(slotClick) - .mousedown(slotSelectionMousedown); - } - - - function slotClick(ev) { - if (!view.option('selectable')) { // SelectionManager will worry about dayClick - var col = Math.min(colCnt-1, Math.floor((ev.pageX - bg.offset().left) / colWidth)), - date = addDays(cloneDate(view.visStart), col*dis+dit), - rowMatch = this.className.match(/fc-slot(\d+)/); - if (rowMatch) { - var mins = parseInt(rowMatch[1]) * options.slotMinutes, - hours = Math.floor(mins/60); - date.setHours(hours); - date.setMinutes(mins%60 + minMinute); - view.trigger('dayClick', this, date, false, ev); - }else{ - view.trigger('dayClick', this, date, true, ev); - } - } - } - - - - /* Event Rendering - -----------------------------------------------------------------------------*/ - - function renderEvents(events, modifiedEventId) { - view.reportEvents(cachedEvents = events); - var i, len=events.length, - dayEvents=[], - slotEvents=[]; - for (i=0; i" + - "" + - "" + - "" + htmlEscape(formatDates(event.start, event.end, view.option('timeFormat'))) + "" + - "" + htmlEscape(event.title) + "" + - "" + - ((event.editable || event.editable === undefined && options.editable) && !options.disableResizing && $.fn.resizable ? - "
=
" - : '') + - "
"; - } - - - - function daySegBind(event, eventElement, seg) { - view.eventElementHandlers(event, eventElement); - if (event.editable || event.editable === undefined && options.editable) { - draggableDayEvent(event, eventElement, seg.isStart); - if (seg.isEnd) { - view.resizableDayEvent(event, eventElement, colWidth); - } - } - } - - - - function slotSegBind(event, eventElement, seg) { - view.eventElementHandlers(event, eventElement); - if (event.editable || event.editable === undefined && options.editable) { - var timeElement = eventElement.find('span.fc-event-time'); - draggableSlotEvent(event, eventElement, timeElement); - if (seg.isEnd) { - resizableSlotEvent(event, eventElement, timeElement); - } - } - } - - - - - /* Event Dragging - -----------------------------------------------------------------------------*/ - - - - // when event starts out FULL-DAY - - function draggableDayEvent(event, eventElement, isStart) { - if (!options.disableDragging && eventElement.draggable) { - var origWidth; - var allDay=true; - var dayDelta; - eventElement.draggable({ - zIndex: 9, - opacity: view.option('dragOpacity', 'month'), // use whatever the month view was using - revertDuration: options.dragRevertDuration, - start: function(ev, ui) { - view.trigger('eventDragStart', eventElement, event, ev, ui); - view.hideEvents(event, eventElement); - origWidth = eventElement.width(); - hoverListener.start(function(cell, origCell, rowDelta, colDelta) { - eventElement.draggable('option', 'revert', !cell || !rowDelta && !colDelta); - clearOverlay(); - if (cell) { - dayDelta = colDelta * dis; - if (!cell.row) { - // on full-days - renderDayOverlay( - addDays(cloneDate(event.start), dayDelta), - addDays(exclEndDay(event), dayDelta) - ); - resetElement(); - }else{ - // mouse is over bottom slots - if (isStart && allDay) { - // convert event to temporary slot-event - setOuterHeight( - eventElement.width(colWidth - 10), // don't use entire width - slotHeight * Math.round( - (event.end ? ((event.end - event.start) / MINUTE_MS) : options.defaultEventMinutes) - / options.slotMinutes - ) - ); - eventElement.draggable('option', 'grid', [colWidth, 1]); - allDay = false; - } - } - } - }, ev, 'drag'); - }, - stop: function(ev, ui) { - var cell = hoverListener.stop(); - clearOverlay(); - view.trigger('eventDragStop', eventElement, event, ev, ui); - if (cell && (!allDay || dayDelta)) { - // changed! - eventElement.find('a').removeAttr('href'); // prevents safari from visiting the link - var minuteDelta = 0; - if (!allDay) { - minuteDelta = Math.round((eventElement.offset().top - bodyContent.offset().top) / slotHeight) - * options.slotMinutes - + minMinute - - (event.start.getHours() * 60 + event.start.getMinutes()); - } - view.eventDrop(this, event, dayDelta, minuteDelta, allDay, ev, ui); - }else{ - // hasn't moved or is out of bounds (draggable has already reverted) - resetElement(); - if ($.browser.msie) { - eventElement.css('filter', ''); // clear IE opacity side-effects - } - view.showEvents(event, eventElement); - } - } - }); - function resetElement() { - if (!allDay) { - eventElement - .width(origWidth) - .height('') - .draggable('option', 'grid', null); - allDay = true; - } - } - } - } - - - - // when event starts out IN TIMESLOTS - - function draggableSlotEvent(event, eventElement, timeElement) { - if (!options.disableDragging && eventElement.draggable) { - var origPosition; - var allDay=false; - var dayDelta; - var minuteDelta; - var prevMinuteDelta; - eventElement.draggable({ - zIndex: 9, - scroll: false, - grid: [colWidth, slotHeight], - axis: colCnt==1 ? 'y' : false, - opacity: view.option('dragOpacity'), - revertDuration: options.dragRevertDuration, - start: function(ev, ui) { - view.trigger('eventDragStart', eventElement, event, ev, ui); - view.hideEvents(event, eventElement); - if ($.browser.msie) { - eventElement.find('span.fc-event-bg').hide(); // nested opacities mess up in IE, just hide - } - origPosition = eventElement.position(); - minuteDelta = prevMinuteDelta = 0; - hoverListener.start(function(cell, origCell, rowDelta, colDelta) { - eventElement.draggable('option', 'revert', !cell); - clearOverlay(); - if (cell) { - dayDelta = colDelta * dis; - if (options.allDaySlot && !cell.row) { - // over full days - if (!allDay) { - // convert to temporary all-day event - allDay = true; - timeElement.hide(); - eventElement.draggable('option', 'grid', null); - } - renderDayOverlay( - addDays(cloneDate(event.start), dayDelta), - addDays(exclEndDay(event), dayDelta) - ); - }else{ - // on slots - resetElement(); - } - } - }, ev, 'drag'); - }, - drag: function(ev, ui) { - minuteDelta = Math.round((ui.position.top - origPosition.top) / slotHeight) * options.slotMinutes; - if (minuteDelta != prevMinuteDelta) { - if (!allDay) { - updateTimeText(minuteDelta); - } - prevMinuteDelta = minuteDelta; - } - }, - stop: function(ev, ui) { - var cell = hoverListener.stop(); - clearOverlay(); - view.trigger('eventDragStop', eventElement, event, ev, ui); - if (cell && (dayDelta || minuteDelta || allDay)) { - // changed! - view.eventDrop(this, event, dayDelta, allDay ? 0 : minuteDelta, allDay, ev, ui); - }else{ - // either no change or out-of-bounds (draggable has already reverted) - resetElement(); - eventElement.css(origPosition); // sometimes fast drags make event revert to wrong position - updateTimeText(0); - if ($.browser.msie) { - eventElement - .css('filter', '') // clear IE opacity side-effects - .find('span.fc-event-bg') - .css('display', ''); // .show() made display=inline - } - view.showEvents(event, eventElement); - } - } - }); - function updateTimeText(minuteDelta) { - var newStart = addMinutes(cloneDate(event.start), minuteDelta); - var newEnd; - if (event.end) { - newEnd = addMinutes(cloneDate(event.end), minuteDelta); - } - timeElement.text(formatDates(newStart, newEnd, view.option('timeFormat'))); - } - function resetElement() { - // convert back to original slot-event - if (allDay) { - timeElement.css('display', ''); // show() was causing display=inline - eventElement.draggable('option', 'grid', [colWidth, slotHeight]); - allDay = false; - } - } - } - } - - - - - /* Event Resizing - -----------------------------------------------------------------------------*/ - - // for TIMESLOT events - - function resizableSlotEvent(event, eventElement, timeElement) { - if (!options.disableResizing && eventElement.resizable) { - var slotDelta, prevSlotDelta; - eventElement.resizable({ - handles: { - s: 'div.ui-resizable-s' - }, - grid: slotHeight, - start: function(ev, ui) { - slotDelta = prevSlotDelta = 0; - view.hideEvents(event, eventElement); - if ($.browser.msie && $.browser.version == '6.0') { - eventElement.css('overflow', 'hidden'); - } - eventElement.css('z-index', 9); - view.trigger('eventResizeStart', this, event, ev, ui); - }, - resize: function(ev, ui) { - // don't rely on ui.size.height, doesn't take grid into account - slotDelta = Math.round((Math.max(slotHeight, eventElement.height()) - ui.originalSize.height) / slotHeight); - if (slotDelta != prevSlotDelta) { - timeElement.text( - formatDates( - event.start, - (!slotDelta && !event.end) ? null : // no change, so don't display time range - addMinutes(view.eventEnd(event), options.slotMinutes*slotDelta), - view.option('timeFormat') - ) - ); - prevSlotDelta = slotDelta; - } - }, - stop: function(ev, ui) { - view.trigger('eventResizeStop', this, event, ev, ui); - if (slotDelta) { - view.eventResize(this, event, 0, options.slotMinutes*slotDelta, ev, ui); - }else{ - eventElement.css('z-index', 8); - view.showEvents(event, eventElement); - // BUG: if event was really short, need to put title back in span - } - } - }); - } - } - - - - - /* Coordinate Utilities - -----------------------------------------------------------------------------*/ - - var coordinateGrid = new CoordinateGrid(function(rows, cols) { - var e, n, p; - bg.find('td').each(function(i, _e) { - e = $(_e); - n = e.offset().left; - if (i) { - p[1] = n; - } - p = [n]; - cols[i] = p; - }); - p[1] = n + e.outerWidth(); - if (options.allDaySlot) { - e = head.find('td'); - n = e.offset().top; - rows[0] = [n, n+e.outerHeight()]; - } - var bodyContentTop = bodyContent.offset().top; - var bodyTop = body.offset().top; - var bodyBottom = bodyTop + body.outerHeight(); - function constrain(n) { - return Math.max(bodyTop, Math.min(bodyBottom, n)); - } - for (var i=0; i= addMinutes(cloneDate(day), maxMinute)) { - return bodyContent.height(); - } - var slotMinutes = options.slotMinutes, - minutes = time.getHours()*60 + time.getMinutes() - minMinute, - slotI = Math.floor(minutes / slotMinutes), - slotTop = slotTopCache[slotI]; - if (slotTop === undefined) { - slotTop = slotTopCache[slotI] = body.find('tr:eq(' + slotI + ') td div')[0].offsetTop; - } - return Math.max(0, Math.round( - slotTop - 1 + slotHeight * ((minutes % slotMinutes) / slotMinutes) - )); - } - - - - - /* Selecting - -----------------------------------------------------------------------------*/ - - var selected = false; - var daySelectionMousedown = selection_dayMousedown( - view, hoverListener, cellDate, cellIsAllDay, renderDayOverlay, clearOverlay, reportSelection, unselect - ); - - function slotSelectionMousedown(ev) { - if (view.option('selectable')) { - unselect(ev); - var _mousedownElement = this; - var dates; - hoverListener.start(function(cell, origCell) { - clearSelection(); - if (cell && cell.col == origCell.col && !cellIsAllDay(cell)) { - var d1 = cellDate(origCell); - var d2 = cellDate(cell); - dates = [ - d1, - addMinutes(cloneDate(d1), options.slotMinutes), - d2, - addMinutes(cloneDate(d2), options.slotMinutes) - ].sort(cmp); - renderSlotSelection(dates[0], dates[3]); - }else{ - dates = null; - } - }, ev); - $(document).one('mouseup', function(ev) { - hoverListener.stop(); - if (dates) { - if (+dates[0] == +dates[1]) { - view.trigger('dayClick', _mousedownElement, dates[0], false, ev); - // BUG: _mousedownElement will sometimes be the overlay - } - reportSelection(dates[0], dates[3], false, ev); - } - }); - } - } - - view.select = function(startDate, endDate, allDay) { - coordinateGrid.build(); - unselect(); - if (allDay) { - if (options.allDaySlot) { - if (!endDate) { - endDate = cloneDate(startDate); - } - renderDayOverlay(startDate, addDays(cloneDate(endDate), 1)); - } - }else{ - if (!endDate) { - endDate = addMinutes(cloneDate(startDate), options.slotMinutes); - } - renderSlotSelection(startDate, endDate); - } - reportSelection(startDate, endDate, allDay); - }; - - function reportSelection(startDate, endDate, allDay, ev) { - selected = true; - view.trigger('select', view, startDate, endDate, allDay, ev); - } - - function unselect(ev) { - if (selected) { - clearSelection(); - selected = false; - view.trigger('unselect', view, ev); - } - } - view.unselect = unselect; - - selection_unselectAuto(view, unselect); - - - - - /* Selecting drawing utils - -----------------------------------------------------------------------------*/ - - var selectionHelper; - - function renderSlotSelection(startDate, endDate) { - var helperOption = view.option('selectHelper'); - if (helperOption) { - var col = dayDiff(startDate, view.visStart) * dis + dit; - if (col >= 0 && col < colCnt) { // only works when times are on same day - var rect = coordinateGrid.rect(0, col, 0, col, bodyContent); // only for horizontal coords - var top = timePosition(startDate, startDate); - var bottom = timePosition(startDate, endDate); - if (bottom > top) { // protect against selections that are entirely before or after visible range - rect.top = top; - rect.height = bottom - top; - rect.left += 2; - rect.width -= 5; - if ($.isFunction(helperOption)) { - var helperRes = helperOption(startDate, endDate); - if (helperRes) { - rect.position = 'absolute'; - rect.zIndex = 8; - selectionHelper = $(helperRes) - .css(rect) - .appendTo(bodyContent); - } - }else{ - selectionHelper = $(slotSegHtml( - { - title: '', - start: startDate, - end: endDate, - className: [], - editable: false - }, - rect, - 'fc-event fc-event-vert fc-corner-top fc-corner-bottom ' - )); - if ($.browser.msie) { - selectionHelper.find('span.fc-event-bg').hide(); // nested opacities mess up in IE, just hide - } - selectionHelper.css('opacity', view.option('dragOpacity')); - } - if (selectionHelper) { - slotBind(selectionHelper); - bodyContent.append(selectionHelper); - setOuterWidth(selectionHelper, rect.width, true); // needs to be after appended - setOuterHeight(selectionHelper, rect.height, true); - } - } - } - }else{ - renderSlotOverlay(startDate, endDate); - } - } - - function clearSelection() { - clearOverlay(); - if (selectionHelper) { - selectionHelper.remove(); - selectionHelper = null; - } - } - - - - - /* Semi-transparent Overlay Helpers - -----------------------------------------------------*/ - - function renderDayOverlay(startDate, endDate) { - var startCol, endCol; - if (rtl) { - startCol = dayDiff(endDate, view.visStart)*dis+dit+1; - endCol = dayDiff(startDate, view.visStart)*dis+dit+1; - }else{ - startCol = dayDiff(startDate, view.visStart); - endCol = dayDiff(endDate, view.visStart); - } - startCol = Math.max(0, startCol); - endCol = Math.min(colCnt, endCol); - if (startCol < endCol) { - dayBind( - _renderDayOverlay(0, startCol, 0, endCol-1) - ); - } - } - - function _renderDayOverlay(col0, row0, col1, row1) { - var rect = coordinateGrid.rect(col0, row0, col1, row1, head); - return view.renderOverlay(rect, head); - } - - function renderSlotOverlay(overlayStart, overlayEnd) { - var dayStart = cloneDate(view.visStart); - var dayEnd = addDays(cloneDate(dayStart), 1); - for (var i=0; i= 0) { - addMinutes(d, minMinute + slotIndex*options.slotMinutes); - } - return d; - } - - function cellIsAllDay(cell) { - return options.allDaySlot && !cell.row; - } - - - -} - - -// count the number of colliding, higher-level segments (for event squishing) - -function countForwardSegs(levels) { - var i, j, k, level, segForward, segBack; - for (i=levels.length-1; i>0; i--) { - level = levels[i]; - for (j=0; j" + + "" + + "" + + "" + htmlEscape(formatDates(event.start, event.end, opt('timeFormat'))) + "" + + "" + htmlEscape(event.title) + "" + + "" + + ((event.editable || event.editable === undefined && opt('editable')) && !opt('disableResizing') && $.fn.resizable ? + "
=
" + : '') + + "
"; + } + + + function bindDaySeg(event, eventElement, seg) { + eventElementHandlers(event, eventElement); + if (event.editable || event.editable === undefined && opt('editable')) { + draggableDayEvent(event, eventElement, seg.isStart); + if (seg.isEnd) { + resizableDayEvent(event, eventElement, getColWidth()); + } + } + } + + + function bindSlotSeg(event, eventElement, seg) { + eventElementHandlers(event, eventElement); + if (event.editable || event.editable === undefined && opt('editable')) { + var timeElement = eventElement.find('span.fc-event-time'); + draggableSlotEvent(event, eventElement, timeElement); + if (seg.isEnd) { + resizableSlotEvent(event, eventElement, timeElement); + } + } + } + + + + /* Dragging + -----------------------------------------------------------------------------------*/ + + + // when event starts out FULL-DAY + + function draggableDayEvent(event, eventElement, isStart) { + if (!opt('disableDragging') && eventElement.draggable) { + var origWidth; + var allDay=true; + var dayDelta; + var dis = opt('isRTL') ? -1 : 1; + var hoverListener = getHoverListener(); + var colWidth = getColWidth(); + var slotHeight = getSlotHeight(); + var minMinute = getMinMinute(); + eventElement.draggable({ + zIndex: 9, + opacity: opt('dragOpacity', 'month'), // use whatever the month view was using + revertDuration: opt('dragRevertDuration'), + start: function(ev, ui) { + trigger('eventDragStart', eventElement, event, ev, ui); + hideEvents(event, eventElement); + origWidth = eventElement.width(); + hoverListener.start(function(cell, origCell, rowDelta, colDelta) { + eventElement.draggable('option', 'revert', !cell || !rowDelta && !colDelta); + clearOverlays(); + if (cell) { + dayDelta = colDelta * dis; + if (!cell.row) { + // on full-days + renderDayOverlay( + addDays(cloneDate(event.start), dayDelta), + addDays(exclEndDay(event), dayDelta) + ); + resetElement(); + }else{ + // mouse is over bottom slots + if (isStart && allDay) { + // convert event to temporary slot-event + setOuterHeight( + eventElement.width(colWidth - 10), // don't use entire width + slotHeight * Math.round( + (event.end ? ((event.end - event.start) / MINUTE_MS) : opt('defaultEventMinutes')) + / opt('slotMinutes') + ) + ); + eventElement.draggable('option', 'grid', [colWidth, 1]); + allDay = false; + } + } + } + }, ev, 'drag'); + }, + stop: function(ev, ui) { + var cell = hoverListener.stop(); + clearOverlays(); + trigger('eventDragStop', eventElement, event, ev, ui); + if (cell && (!allDay || dayDelta)) { + // changed! + eventElement.find('a').removeAttr('href'); // prevents safari from visiting the link + var minuteDelta = 0; + if (!allDay) { + minuteDelta = Math.round((eventElement.offset().top - getBodyContent().offset().top) / slotHeight) + * opt('slotMinutes') + + minMinute + - (event.start.getHours() * 60 + event.start.getMinutes()); + } + eventDrop(this, event, dayDelta, minuteDelta, allDay, ev, ui); + }else{ + // hasn't moved or is out of bounds (draggable has already reverted) + resetElement(); + if ($.browser.msie) { + eventElement.css('filter', ''); // clear IE opacity side-effects + } + showEvents(event, eventElement); + } + } + }); + function resetElement() { + if (!allDay) { + eventElement + .width(origWidth) + .height('') + .draggable('option', 'grid', null); + allDay = true; + } + } + } + } + + + // when event starts out IN TIMESLOTS + + function draggableSlotEvent(event, eventElement, timeElement) { + if (!opt('disableDragging') && eventElement.draggable) { + var origPosition; + var allDay=false; + var dayDelta; + var minuteDelta; + var prevMinuteDelta; + var dis = opt('isRTL') ? -1 : 1; + var hoverListener = getHoverListener(); + var colCnt = getColCnt(); + var colWidth = getColWidth(); + var slotHeight = getSlotHeight(); + eventElement.draggable({ + zIndex: 9, + scroll: false, + grid: [colWidth, slotHeight], + axis: colCnt==1 ? 'y' : false, + opacity: opt('dragOpacity'), + revertDuration: opt('dragRevertDuration'), + start: function(ev, ui) { + trigger('eventDragStart', eventElement, event, ev, ui); + hideEvents(event, eventElement); + if ($.browser.msie) { + eventElement.find('span.fc-event-bg').hide(); // nested opacities mess up in IE, just hide + } + origPosition = eventElement.position(); + minuteDelta = prevMinuteDelta = 0; + hoverListener.start(function(cell, origCell, rowDelta, colDelta) { + eventElement.draggable('option', 'revert', !cell); + clearOverlays(); + if (cell) { + dayDelta = colDelta * dis; + if (opt('allDaySlot') && !cell.row) { + // over full days + if (!allDay) { + // convert to temporary all-day event + allDay = true; + timeElement.hide(); + eventElement.draggable('option', 'grid', null); + } + renderDayOverlay( + addDays(cloneDate(event.start), dayDelta), + addDays(exclEndDay(event), dayDelta) + ); + }else{ + // on slots + resetElement(); + } + } + }, ev, 'drag'); + }, + drag: function(ev, ui) { + minuteDelta = Math.round((ui.position.top - origPosition.top) / slotHeight) * opt('slotMinutes'); + if (minuteDelta != prevMinuteDelta) { + if (!allDay) { + updateTimeText(minuteDelta); + } + prevMinuteDelta = minuteDelta; + } + }, + stop: function(ev, ui) { + var cell = hoverListener.stop(); + clearOverlays(); + trigger('eventDragStop', eventElement, event, ev, ui); + if (cell && (dayDelta || minuteDelta || allDay)) { + // changed! + eventDrop(this, event, dayDelta, allDay ? 0 : minuteDelta, allDay, ev, ui); + }else{ + // either no change or out-of-bounds (draggable has already reverted) + resetElement(); + eventElement.css(origPosition); // sometimes fast drags make event revert to wrong position + updateTimeText(0); + if ($.browser.msie) { + eventElement + .css('filter', '') // clear IE opacity side-effects + .find('span.fc-event-bg') + .css('display', ''); // .show() made display=inline + } + showEvents(event, eventElement); + } + } + }); + function updateTimeText(minuteDelta) { + var newStart = addMinutes(cloneDate(event.start), minuteDelta); + var newEnd; + if (event.end) { + newEnd = addMinutes(cloneDate(event.end), minuteDelta); + } + timeElement.text(formatDates(newStart, newEnd, opt('timeFormat'))); + } + function resetElement() { + // convert back to original slot-event + if (allDay) { + timeElement.css('display', ''); // show() was causing display=inline + eventElement.draggable('option', 'grid', [colWidth, slotHeight]); + allDay = false; + } + } + } + } + + + + /* Resizing + --------------------------------------------------------------------------------------*/ + + + function resizableSlotEvent(event, eventElement, timeElement) { + if (!opt('disableResizing') && eventElement.resizable) { + var slotDelta, prevSlotDelta; + var slotHeight = getSlotHeight(); + eventElement.resizable({ + handles: { + s: 'div.ui-resizable-s' + }, + grid: slotHeight, + start: function(ev, ui) { + slotDelta = prevSlotDelta = 0; + hideEvents(event, eventElement); + if ($.browser.msie && $.browser.version == '6.0') { + eventElement.css('overflow', 'hidden'); + } + eventElement.css('z-index', 9); + trigger('eventResizeStart', this, event, ev, ui); + }, + resize: function(ev, ui) { + // don't rely on ui.size.height, doesn't take grid into account + slotDelta = Math.round((Math.max(slotHeight, eventElement.height()) - ui.originalSize.height) / slotHeight); + if (slotDelta != prevSlotDelta) { + timeElement.text( + formatDates( + event.start, + (!slotDelta && !event.end) ? null : // no change, so don't display time range + addMinutes(eventEnd(event), opt('slotMinutes')*slotDelta), + opt('timeFormat') + ) + ); + prevSlotDelta = slotDelta; + } + }, + stop: function(ev, ui) { + trigger('eventResizeStop', this, event, ev, ui); + if (slotDelta) { + eventResize(this, event, 0, opt('slotMinutes')*slotDelta, ev, ui); + }else{ + eventElement.css('z-index', 8); + showEvents(event, eventElement); + // BUG: if event was really short, need to put title back in span + } + } + }); + } + } + + +} + + +function countForwardSegs(levels) { + var i, j, k, level, segForward, segBack; + for (i=levels.length-1; i>0; i--) { + level = levels[i]; + for (j=0; j" + + "" + + " "; + for (i=0; i" + formatDate(d, colFormat) + ""; + addDays(d, dis); + if (nwe) { + skipWeekend(d, dis); + } + } + s += " "; + if (opt('allDaySlot')) { + s += "" + + "" + opt('allDayText') + "" + + "" + + "
 
" + + " " + + "
"; + } + s+= "
"; + head = $(s).appendTo(element); + dayBind(head.find('td')); + + // all-day event container + daySegmentContainer = $("
").appendTo(head); + + // body + d = zeroDate(); + var maxd = addMinutes(cloneDate(d), maxMinute); + addMinutes(d, minMinute); + s = ""; + for (i=0; d < maxd; i++) { + minutes = d.getMinutes(); + s += ""; + addMinutes(d, opt('slotMinutes')); + slotCnt++; + } + s += "
" + + ((!slotNormal || !minutes) ? formatDate(d, opt('axisFormat')) : ' ') + + "
 
"; + body = $("
") + .append(bodyContent = $("
") + .append(bodyTable = $(s))) + .appendTo(element); + slotBind(body.find('td')); + + // slot event container + slotSegmentContainer = $("
").appendTo(bodyContent); + + // background stripes + d = cloneDate(d0); + s = "
" + + ""; + for (i=0; i
 
"; + addDays(d, dis); + if (nwe) { + skipWeekend(d, dis); + } + } + s += "
"; + bg = $(s).appendTo(element); + + }else{ // skeleton already built, just modify it + + clearEvents(); + + // redo column header text and class + head.find('tr:first th').slice(1, -1).each(function(i, th) { + $(th).text(formatDate(d, colFormat)); + th.className = th.className.replace(/^fc-\w+(?= )/, 'fc-' + dayIDs[d.getDay()]); + addDays(d, dis); + if (nwe) { + skipWeekend(d, dis); + } + }); + + // change classes of background stripes + d = cloneDate(d0); + bg.find('td').each(function(i, td) { + td.className = td.className.replace(/^fc-\w+(?= )/, 'fc-' + dayIDs[d.getDay()]); + if (+d == +today) { + $(td) + .removeClass('fc-not-today') + .addClass('fc-today') + .addClass(tm + '-state-highlight'); + }else{ + $(td) + .addClass('fc-not-today') + .removeClass('fc-today') + .removeClass(tm + '-state-highlight'); + } + addDays(d, dis); + if (nwe) { + skipWeekend(d, dis); + } + }); + + } + + } + + + + function setHeight(height, dateChanged) { + + if (height === undefined) { + height = viewHeight; + } + + viewHeight = height; + slotTopCache = {}; + + body.height(height - head.height()); + + slotHeight = body.find('tr:first div').height() + 1; + + bg.css({ + top: head.find('tr').height(), + height: height + }); + + if (dateChanged) { + resetScroll(); + } + } + + + + function setWidth(width) { + viewWidth = width; + colContentPositions.clear(); + + body.width(width); + bodyTable.width(''); + + var topTDs = head.find('tr:first th'), + stripeTDs = bg.find('td'), + clientWidth = body[0].clientWidth; + + bodyTable.width(clientWidth); + + // time-axis width + axisWidth = 0; + setOuterWidth( + head.find('tr:lt(2) th:first').add(body.find('tr:first th')) + .width('') + .each(function() { + axisWidth = Math.max(axisWidth, $(this).outerWidth()); + }), + axisWidth + ); + axisWidth = axisWidth; + + // column width + colWidth = Math.floor((clientWidth - axisWidth) / colCnt); + setOuterWidth(stripeTDs.slice(0, -1), colWidth); + setOuterWidth(topTDs.slice(1, -2), colWidth); + setOuterWidth(topTDs.slice(-2, -1), clientWidth - axisWidth - colWidth*(colCnt-1)); + + bg.css({ + left: axisWidth, + width: clientWidth - axisWidth + }); + } + + + function resetScroll() { + var d0 = zeroDate(), + scrollDate = cloneDate(d0); + scrollDate.setHours(opt('firstHour')); + var top = timePosition(d0, scrollDate) + 1, // +1 for the border + scroll = function() { + body.scrollTop(top); + }; + scroll(); + setTimeout(scroll, 0); // overrides any previous scroll state made by the browser + } + + + function beforeHide() { + savedScrollTop = body.scrollTop(); + } + + + function afterShow() { + body.scrollTop(savedScrollTop); + } + + + + /* Slot/Day clicking and binding + -----------------------------------------------------------------------*/ + + + function dayBind(tds) { + tds.click(slotClick) + .mousedown(daySelectionMousedown); + } + + + function slotBind(tds) { + tds.click(slotClick) + .mousedown(slotSelectionMousedown); + } + + + function slotClick(ev) { + if (!opt('selectable')) { // SelectionManager will worry about dayClick + var col = Math.min(colCnt-1, Math.floor((ev.pageX - bg.offset().left) / colWidth)), + date = addDays(cloneDate(t.visStart), col*dis+dit), + rowMatch = this.className.match(/fc-slot(\d+)/); + if (rowMatch) { + var mins = parseInt(rowMatch[1]) * opt('slotMinutes'), + hours = Math.floor(mins/60); + date.setHours(hours); + date.setMinutes(mins%60 + minMinute); + trigger('dayClick', this, date, false, ev); + }else{ + trigger('dayClick', this, date, true, ev); + } + } + } + + + + /* Semi-transparent Overlay Helpers + -----------------------------------------------------*/ + + + function renderDayOverlay(startDate, endDate, refreshCoordinateGrid) { // endDate is exclusive + if (refreshCoordinateGrid) { + coordinateGrid.build(); + } + var visStart = cloneDate(t.visStart); + var startCol, endCol; + if (rtl) { + startCol = dayDiff(endDate, visStart)*dis+dit+1; + endCol = dayDiff(startDate, visStart)*dis+dit+1; + }else{ + startCol = dayDiff(startDate, visStart); + endCol = dayDiff(endDate, visStart); + } + startCol = Math.max(0, startCol); + endCol = Math.min(colCnt, endCol); + if (startCol < endCol) { + dayBind( + renderCellOverlay(0, startCol, 0, endCol-1) + ); + } + } + + + function renderCellOverlay(col0, row0, col1, row1) { + var rect = coordinateGrid.rect(col0, row0, col1, row1, head); + return renderOverlay(rect, head); + } + + + function renderSlotOverlay(overlayStart, overlayEnd) { + var dayStart = cloneDate(t.visStart); + var dayEnd = addDays(cloneDate(dayStart), 1); + for (var i=0; i= addMinutes(cloneDate(day), maxMinute)) { + return bodyContent.height(); + } + var slotMinutes = opt('slotMinutes'), + minutes = time.getHours()*60 + time.getMinutes() - minMinute, + slotI = Math.floor(minutes / slotMinutes), + slotTop = slotTopCache[slotI]; + if (slotTop === undefined) { + slotTop = slotTopCache[slotI] = body.find('tr:eq(' + slotI + ') td div')[0].offsetTop; + } + return Math.max(0, Math.round( + slotTop - 1 + slotHeight * ((minutes % slotMinutes) / slotMinutes) + )); + } + + + function cellDate(cell) { + var d = addDays(cloneDate(t.visStart), cell.col*dis+dit); + var slotIndex = cell.row; + if (opt('allDaySlot')) { + slotIndex--; + } + if (slotIndex >= 0) { + addMinutes(d, minMinute + slotIndex*opt('slotMinutes')); + } + return d; + } + + + function cellIsAllDay(cell) { + return opt('allDaySlot') && !cell.row; + } + + + function allDayBounds() { + return { + left: axisWidth, + right: viewWidth + } + } + + + function allDayTR(index) { + return head.find('tr.fc-all-day'); + } + + + function defaultEventEnd(event) { + var start = cloneDate(event.start); + if (event.allDay) { + return start; + } + return addMinutes(start, opt('defaultEventMinutes')); + } + + + + /* Selection + ---------------------------------------------------------------------------------*/ + + + function defaultSelectionEnd(startDate, allDay) { + if (allDay) { + return cloneDate(startDate); + } + return addMinutes(cloneDate(startDate), opt('slotMinutes')); + } + + + function renderSelection(startDate, endDate, allDay) { + if (allDay) { + if (opt('allDaySlot')) { + renderDayOverlay(startDate, addDays(cloneDate(endDate), 1), true); + } + }else{ + renderSlotSelection(startDate, endDate); + } + } + + + function renderSlotSelection(startDate, endDate) { + var helperOption = opt('selectHelper'); + coordinateGrid.build(); + if (helperOption) { + var col = dayDiff(startDate, t.visStart) * dis + dit; + if (col >= 0 && col < colCnt) { // only works when times are on same day + var rect = coordinateGrid.rect(0, col, 0, col, bodyContent); // only for horizontal coords + var top = timePosition(startDate, startDate); + var bottom = timePosition(startDate, endDate); + if (bottom > top) { // protect against selections that are entirely before or after visible range + rect.top = top; + rect.height = bottom - top; + rect.left += 2; + rect.width -= 5; + if ($.isFunction(helperOption)) { + var helperRes = helperOption(startDate, endDate); + if (helperRes) { + rect.position = 'absolute'; + rect.zIndex = 8; + selectionHelper = $(helperRes) + .css(rect) + .appendTo(bodyContent); + } + }else{ + selectionHelper = $(slotSegHtml( + { + title: '', + start: startDate, + end: endDate, + className: [], + editable: false + }, + rect, + 'fc-event fc-event-vert fc-corner-top fc-corner-bottom ' + )); + if ($.browser.msie) { + selectionHelper.find('span.fc-event-bg').hide(); // nested opacities mess up in IE, just hide + } + selectionHelper.css('opacity', opt('dragOpacity')); + } + if (selectionHelper) { + slotBind(selectionHelper); + bodyContent.append(selectionHelper); + setOuterWidth(selectionHelper, rect.width, true); // needs to be after appended + setOuterHeight(selectionHelper, rect.height, true); + } + } + } + }else{ + renderSlotOverlay(startDate, endDate); + } + } + + + function clearSelection() { + clearOverlays(); + if (selectionHelper) { + selectionHelper.remove(); + selectionHelper = null; + } + } + + + function slotSelectionMousedown(ev) { + if (opt('selectable')) { + unselect(ev); + var _mousedownElement = this; + var dates; + hoverListener.start(function(cell, origCell) { + clearSelection(); + if (cell && cell.col == origCell.col && !cellIsAllDay(cell)) { + var d1 = cellDate(origCell); + var d2 = cellDate(cell); + dates = [ + d1, + addMinutes(cloneDate(d1), opt('slotMinutes')), + d2, + addMinutes(cloneDate(d2), opt('slotMinutes')) + ].sort(cmp); + renderSlotSelection(dates[0], dates[3]); + }else{ + dates = null; + } + }, ev); + $(document).one('mouseup', function(ev) { + hoverListener.stop(); + if (dates) { + if (+dates[0] == +dates[1]) { + trigger('dayClick', _mousedownElement, dates[0], false, ev); + // BUG: _mousedownElement will sometimes be the overlay + } + reportSelection(dates[0], dates[3], false, ev); + } + }); + } + } + + + + /* External Dragging + --------------------------------------------------------------------------------*/ + + + function dragStart(_dragElement, ev, ui) { + hoverListener.start(function(cell) { + clearOverlays(); + if (cell) { + if (cellIsAllDay(cell)) { + renderCellOverlay(cell.row, cell.col, cell.row, cell.col); + }else{ + var d1 = cellDate(cell); + var d2 = addMinutes(cloneDate(d1), opt('defaultEventMinutes')); + renderSlotOverlay(d1, d2); + } + } + }, ev); + } + + + function dragStop(_dragElement, ev, ui) { + var cell = hoverListener.stop(); + clearOverlays(); + if (cell) { + trigger('drop', _dragElement, cellDate(cell), cellIsAllDay(cell), ev, ui); + } + } + + +} diff --git a/src/agenda/AgendaWeekView.js b/src/agenda/AgendaWeekView.js new file mode 100644 index 0000000..03d0f7e --- /dev/null +++ b/src/agenda/AgendaWeekView.js @@ -0,0 +1,46 @@ + +fcViews.agendaWeek = AgendaWeekView; + +function AgendaWeekView(element, calendar) { + var t = this; + + + // exports + t.render = render; + + + // imports + AgendaView.call(t, element, calendar, 'agendaWeek'); + var opt = t.opt; + var renderAgenda = t.renderAgenda; + var formatDates = calendar.formatDates; + + + + function render(date, delta) { + if (delta) { + addDays(date, delta * 7); + } + var start = addDays(cloneDate(date), -((date.getDay() - opt('firstDay') + 7) % 7)); + var end = addDays(cloneDate(start), 7); + var visStart = cloneDate(start); + var visEnd = cloneDate(end); + var weekends = opt('weekends'); + if (!weekends) { + skipWeekend(visStart); + skipWeekend(visEnd, -1, true); + } + t.title = formatDates( + visStart, + addDays(cloneDate(visEnd), -1), + opt('titleFormat') + ); + t.start = start; + t.end = end; + t.visStart = visStart; + t.visEnd = visEnd; + renderAgenda(weekends ? 7 : 5); + } + + +} diff --git a/src/css/agenda.css b/src/agenda/agenda.css similarity index 100% rename from src/css/agenda.css rename to src/agenda/agenda.css diff --git a/src/basic/BasicDayView.js b/src/basic/BasicDayView.js new file mode 100644 index 0000000..1f49c84 --- /dev/null +++ b/src/basic/BasicDayView.js @@ -0,0 +1,37 @@ + +fcViews.basicDay = BasicDayView; + +//TODO: when calendar's date starts out on a weekend, shouldn't happen + + +function BasicDayView(element, calendar) { + var t = this; + + + // exports + t.render = render; + + + // imports + BasicView.call(t, element, calendar, 'basicDay'); + var opt = t.opt; + var renderBasic = t.renderBasic; + var formatDate = calendar.formatDate; + + + + function render(date, delta) { + if (delta) { + addDays(date, delta); + if (!opt('weekends')) { + skipWeekend(date, delta < 0 ? -1 : 1); + } + } + t.title = formatDate(date, opt('titleFormat')); + t.start = t.visStart = cloneDate(date, true); + t.end = t.visEnd = addDays(cloneDate(t.start), 1); + renderBasic(1, 1, false); + } + + +} diff --git a/src/basic/BasicEventRenderer.js b/src/basic/BasicEventRenderer.js new file mode 100644 index 0000000..4c5df5d --- /dev/null +++ b/src/basic/BasicEventRenderer.js @@ -0,0 +1,149 @@ + +function BasicEventRenderer() { + var t = this; + + + // exports + t.renderEvents = renderEvents; + t.rerenderEvents = rerenderEvents; + t.clearEvents = clearEvents; + t.bindDaySeg = bindDaySeg; + + + // imports + DayEventRenderer.call(t); + var opt = t.opt; + var trigger = t.trigger; + var reportEvents = t.reportEvents; + var clearEventData = t.clearEventData; + var eventElementHandlers = t.eventElementHandlers; + var showEvents = t.showEvents; + var hideEvents = t.hideEvents; + var eventDrop = t.eventDrop; + var getDaySegmentContainer = t.getDaySegmentContainer; + var getHoverListener = t.getHoverListener; + var renderDayOverlay = t.renderDayOverlay; + var clearOverlays = t.clearOverlays; + var getRowCnt = t.getRowCnt; + var getColCnt = t.getColCnt; + var renderDaySegs = t.renderDaySegs; + var resizableDayEvent = t.resizableDayEvent; + + + // locals + var cachedEvents=[]; + + + + /* Rendering + --------------------------------------------------------------------*/ + + + function renderEvents(events) { + reportEvents(cachedEvents = events); + renderDaySegs(compileSegs(events)); + } + + + function rerenderEvents(modifiedEventId) { + clearEvents(); + renderDaySegs(compileSegs(cachedEvents), modifiedEventId); + } + + + function clearEvents() { + clearEventData(); + getDaySegmentContainer().empty(); + } + + + function compileSegs(events) { + var rowCnt = getRowCnt(), + colCnt = getColCnt(), + d1 = cloneDate(t.visStart), + d2 = addDays(cloneDate(d1), colCnt), + visEventsEnds = $.map(events, exclEndDay), + i, row, + j, level, + k, seg, + segs=[]; + for (i=0; i").appendTo(element); + + s = ""; + for (i=0; i" + formatDate(d, colFormat) + ""; + addDays(d, 1); + if (nwe) { + skipWeekend(d); + } + } + thead = $(s + "").appendTo(table); + + s = ""; + d = cloneDate(t.visStart); + for (i=0; i"; + for (j=0; j1 && d.getMonth() != month ? ' fc-other-month' : '') + + (+d == +today ? + ' fc-today '+tm+'-state-highlight' : + ' fc-not-today') + "'>" + + (showNumbers ? "
" + d.getDate() + "
" : '') + + "
 
"; + addDays(d, 1); + if (nwe) { + skipWeekend(d); + } + } + s += ""; + } + tbody = $(s + "").appendTo(table); + dayBind(tbody.find('td')); + + daySegmentContainer = $("
").appendTo(element); + + }else{ // NOT first time, reuse as many cells as possible + + clearEvents(); + + var prevRowCnt = tbody.find('tr').length; + if (rowCnt < prevRowCnt) { + tbody.find('tr:gt(' + (rowCnt-1) + ')').remove(); // remove extra rows + } + else if (rowCnt > prevRowCnt) { // needs to create new rows... + s = ''; + for (i=prevRowCnt; i"; + for (j=0; j" + + (showNumbers ? "
" : '') + + "
 
" + + ""; + addDays(d, 1); + if (nwe) { + skipWeekend(d); + } + } + s += ""; + } + tbody.append(s); + } + dayBind(tbody.find('td.fc-new').removeClass('fc-new')); + + // re-label and re-class existing cells + d = cloneDate(t.visStart); + tbody.find('td').each(function() { + var td = $(this); + if (rowCnt > 1) { + if (d.getMonth() == month) { + td.removeClass('fc-other-month'); + }else{ + td.addClass('fc-other-month'); + } + } + if (+d == +today) { + td.removeClass('fc-not-today') + .addClass('fc-today') + .addClass(tm + '-state-highlight'); + }else{ + td.addClass('fc-not-today') + .removeClass('fc-today') + .removeClass(tm + '-state-highlight'); + } + td.find('div.fc-day-number').text(d.getDate()); + addDays(d, 1); + if (nwe) { + skipWeekend(d); + } + }); + + if (rowCnt == 1) { // more changes likely (week or day view) + + // redo column header text and class + d = cloneDate(t.visStart); + thead.find('th').each(function(i, th) { + $(th).text(formatDate(d, colFormat)); + th.className = th.className.replace(/^fc-\w+(?= )/, 'fc-' + dayIDs[d.getDay()]); + addDays(d, 1); + if (nwe) { + skipWeekend(d); + } + }); + + // redo cell day-of-weeks + d = cloneDate(t.visStart); + tbody.find('td').each(function(i, td) { + td.className = td.className.replace(/^fc-\w+(?= )/, 'fc-' + dayIDs[d.getDay()]); + addDays(d, 1); + if (nwe) { + skipWeekend(d); + } + }); + + } + + } + + } + + + function setHeight(height) { + viewHeight = height; + var leftTDs = tbody.find('tr td:first-child'), + tbodyHeight = viewHeight - thead.height(), + rowHeight1, rowHeight2; + if (opt('weekMode') == 'variable') { + rowHeight1 = rowHeight2 = Math.floor(tbodyHeight / (rowCnt==1 ? 2 : 6)); + }else{ + rowHeight1 = Math.floor(tbodyHeight / rowCnt); + rowHeight2 = tbodyHeight - rowHeight1*(rowCnt-1); + } + if (tdHeightBug === undefined) { + // bug in firefox where cell height includes padding + var tr = tbody.find('tr:first'), + td = tr.find('td:first'); + td.height(rowHeight1); + tdHeightBug = rowHeight1 != td.height(); + } + if (tdHeightBug) { + leftTDs.slice(0, -1).height(rowHeight1); + leftTDs.slice(-1).height(rowHeight2); + }else{ + setOuterHeight(leftTDs.slice(0, -1), rowHeight1); + setOuterHeight(leftTDs.slice(-1), rowHeight2); + } + } + + + function setWidth(width) { + viewWidth = width; + colContentPositions.clear(); + colWidth = Math.floor(viewWidth / colCnt); + setOuterWidth(thead.find('th').slice(0, -1), colWidth); + } + + + + /* Day clicking and binding + -----------------------------------------------------------*/ + + + function dayBind(days) { + days.click(dayClick) + .mousedown(daySelectionMousedown); + } + + + function dayClick(ev) { + if (!opt('selectable')) { // SelectionManager will worry about dayClick + var n = parseInt(this.className.match(/fc\-day(\d+)/)[1]), + date = addDays( + cloneDate(t.visStart), + Math.floor(n/colCnt) * 7 + n % colCnt + ); + // TODO: what about weekends in middle of week? + trigger('dayClick', this, date, true, ev); + } + } + + + + /* Semi-transparent Overlay Helpers + ------------------------------------------------------*/ + + + function renderDayOverlay(overlayStart, overlayEnd, refreshCoordinateGrid) { // overlayEnd is exclusive + if (refreshCoordinateGrid) { + coordinateGrid.build(); + } + var rowStart = cloneDate(t.visStart); + var rowEnd = addDays(cloneDate(rowStart), colCnt); + for (var i=0; i= rows[i][0] && y < rows[i][1]) { + r = i; + break; + } + } + for (i=0; i= cols[i][0] && x < cols[i][1]) { + c = i; + break; + } + } + return (r>=0 && c>=0) ? { row:r, col:c } : null; + }; + + t.rect = function(row0, col0, row1, col1, originElement) { // row1,col1 is inclusive + var origin = originElement.offset(); + return { + top: rows[row0][0] - origin.top, + left: cols[col0][0] - origin.left, + width: cols[col1][1] - cols[col0][0], + height: rows[row1][1] - rows[row0][0] + }; + }; + +} diff --git a/src/common/DayEventRenderer.js b/src/common/DayEventRenderer.js new file mode 100644 index 0000000..75eac0a --- /dev/null +++ b/src/common/DayEventRenderer.js @@ -0,0 +1,232 @@ + +function DayEventRenderer() { + var t = this; + + + // exports + t.renderDaySegs = renderDaySegs; + t.resizableDayEvent = resizableDayEvent; + + + // imports + var opt = t.opt; + var trigger = t.trigger; + var reportEventElement = t.reportEventElement; + var showEvents = t.showEvents; + var hideEvents = t.hideEvents; + var eventResize = t.eventResize; + var getRowCnt = t.getRowCnt; + var getColCnt = t.getColCnt; + var getColWidth = t.getColWidth; + var allDayTR = t.allDayTR; + var allDayBounds = t.allDayBounds; + var colContentLeft = t.colContentLeft; + var colContentRight = t.colContentRight; + var dayOfWeekCol = t.dayOfWeekCol; + var getDaySegmentContainer = t.getDaySegmentContainer; + var bindDaySeg = t.bindDaySeg; //TODO: streamline this + var formatDates = t.calendar.formatDates; + + + + /* Rendering + -----------------------------------------------------------------------------*/ + + + function renderDaySegs(segs, modifiedEventId) { + + var rtl=opt('isRTL'), + i, segCnt=segs.length, seg, + event, + className, + left, right, + html='', + eventElements, + eventElement, + triggerRes, + hsideCache={}, + vmarginCache={}, + key, val, + rowI, top, levelI, levelHeight, + rowDivs=[], + rowDivTops=[], + bounds = allDayBounds(), + minLeft = bounds.left, + maxLeft = bounds.right, + rowCnt = getRowCnt(), + colCnt = getColCnt(), + segmentContainer = getDaySegmentContainer(); + + // calculate desired position/dimensions, create html + for (i=0; i" + + "" + + (!event.allDay && seg.isStart ? + "" + + htmlEscape(formatDates(event.start, event.end, opt('timeFormat'))) + + "" + :'') + + "" + htmlEscape(event.title) + "" + + "" + + ((event.editable || event.editable === undefined && opt('editable')) && !opt('disableResizing') && $.fn.resizable ? + "
" + : '') + + "
"; + seg.left = left; + seg.outerWidth = right - left; + } + segmentContainer[0].innerHTML = html; // faster than html() + eventElements = segmentContainer.children(); + + // retrieve elements, run through eventRender callback, bind handlers + for (i=0; i div') // optimal selector? + .height(top + levelHeight); + } + + // calculate row tops + for (rowI=0; rowI"); + } + if (e[0].parentNode != parent[0]) { + e.appendTo(parent); + } + usedOverlays.push(e.css(rect).show()); + return e; + } + + + function clearOverlays() { + var e; + while (e = usedOverlays.shift()) { + unusedOverlays.push(e.hide().unbind()); + } + } + + +} diff --git a/src/common/SelectionManager.js b/src/common/SelectionManager.js new file mode 100644 index 0000000..c461990 --- /dev/null +++ b/src/common/SelectionManager.js @@ -0,0 +1,98 @@ + +//BUG: unselect needs to be triggered when events are dragged+dropped + +function SelectionManager() { + var t = this; + + + // exports + t.select = select; + t.unselect = unselect; + t.reportSelection = reportSelection; + t.daySelectionMousedown = daySelectionMousedown; + + + // imports + var opt = t.opt; + var trigger = t.trigger; + var defaultSelectionEnd = t.defaultSelectionEnd; + var renderSelection = t.renderSelection; + var clearSelection = t.clearSelection; + + + // locals + var selected = false; + + + + // unselectAuto + if (opt('selectable') && opt('unselectAuto')) { + $(document).mousedown(function(ev) { + var ignore = opt('unselectCancel'); + if (ignore) { + if ($(ev.target).parents(ignore).length) { // could be optimized to stop after first match + return; + } + } + unselect(ev); + }); + } + + + function select(startDate, endDate, allDay) { + unselect(); + if (!endDate) { + endDate = defaultSelectionEnd(startDate, allDay); + } + renderSelection(startDate, endDate, allDay); + reportSelection(startDate, endDate, allDay); + } + + + function unselect(ev) { + if (selected) { + selected = false; + clearSelection(); + trigger('unselect', null, ev); + } + } + + + function reportSelection(startDate, endDate, allDay, ev) { + selected = true; + trigger('select', null, startDate, endDate, allDay, ev); + } + + + function daySelectionMousedown(ev) { // not really a generic manager method, oh well + var cellDate = t.cellDate; + var cellIsAllDay = t.cellIsAllDay; + var hoverListener = t.getHoverListener(); + if (opt('selectable')) { + unselect(ev); + var _mousedownElement = this; + var dates; + hoverListener.start(function(cell, origCell) { // TODO: maybe put cellDate/cellIsAllDay info in cell + clearSelection(); + if (cell && cellIsAllDay(cell)) { + dates = [ cellDate(origCell), cellDate(cell) ].sort(cmp); + renderSelection(dates[0], dates[1], true); + }else{ + dates = null; + } + }, ev); + $(document).one('mouseup', function(ev) { + hoverListener.stop(); + if (dates) { + if (+dates[0] == +dates[1]) { + trigger('dayClick', _mousedownElement, dates[0], true, ev); + // BUG: _mousedownElement will sometimes be the overlay + } + reportSelection(dates[0], dates[1], true, ev); + } + }); + } + } + + +} diff --git a/src/common/View.js b/src/common/View.js new file mode 100644 index 0000000..8b8f1df --- /dev/null +++ b/src/common/View.js @@ -0,0 +1,213 @@ + + +function View(element, calendar, viewName) { + var t = this; + + + // exports + t.element = element; + t.calendar = calendar; + t.name = viewName; + t.opt = opt; + t.trigger = trigger; + t.reportEvents = reportEvents; + t.clearEventData = clearEventData; + t.eventEnd = eventEnd; + t.reportEventElement = reportEventElement; + t.eventElementHandlers = eventElementHandlers; + t.showEvents = showEvents; + t.hideEvents = hideEvents; + t.eventDrop = eventDrop; + t.eventResize = eventResize; + // t.title + // t.start, t.end + // t.visStart, t.visEnd + // t.eventsChanged // todo: maybe report to calendar instead + + + // imports + var defaultEventEnd = t.defaultEventEnd; + var normalizeEvent = calendar.normalizeEvent; // in EventManager + var rerenderEvents = calendar.rerenderEvents; + + + // locals + var eventsByID = {}; + var eventElements = []; + var eventElementsByID = {}; + var options = calendar.options; + + + + function opt(name, viewNameOverride) { + var v = options[name]; + if (typeof v == 'object') { + return smartProperty(v, viewNameOverride || viewName); + } + return v; + } + + + function trigger(name, thisObj) { + return calendar.trigger.apply( + calendar, + [name, thisObj || t].concat(Array.prototype.slice.call(arguments, 2), [t]) + ); + } + + + + /* Event Data + ------------------------------------------------------------------------------*/ + + + // report when view receives new events + function reportEvents(events) { // events are already normalized at this point + eventsByID = {}; + var i, len=events.length, event; + for (i=0; i)), return null instead return null; -}; +} -var parseISO8601 = fc.parseISO8601 = function(s, ignoreTimezone) { + +function parseISO8601(s, ignoreTimezone) { // derived from http://delete.me.uk/2005/03/iso8601.html // TODO: for a know glitch/feature, read tests/issue_206_parseDate_dst.html var m = s.match(/^([0-9]{4})(-([0-9]{2})(-([0-9]{2})([T ]([0-9]{2}):([0-9]{2})(:([0-9]{2})(\.([0-9]+))?)?(Z|(([-+])([0-9]{2}):([0-9]{2})))?)?)?)?$/); @@ -173,9 +196,10 @@ var parseISO8601 = fc.parseISO8601 = function(s, ignoreTimezone) { offset -= date.getTimezoneOffset(); } return new Date(+date + (offset * 60 * 1000)); -}; +} -var parseTime = fc.parseTime = function(s) { // returns minutes since start of day + +function parseTime(s) { // returns minutes since start of day if (typeof s == 'number') { // an hour return s * 60; } @@ -193,18 +217,21 @@ var parseTime = fc.parseTime = function(s) { // returns minutes since start of d } return h * 60 + (m[2] ? parseInt(m[2]) : 0); } -}; +} /* Date Formatting -----------------------------------------------------------------------------*/ +// TODO: use same function formatDate(date, [date2], format, [options]) -var formatDate = fc.formatDate = function(date, format, options) { + +function formatDate(date, format, options) { return formatDates(date, null, format, options); -}; +} -var formatDates = fc.formatDates = function(date1, date2, format, options) { + +function formatDates(date1, date2, format, options) { options = options || defaults; var date = date1, otherDate = date2, @@ -281,6 +308,7 @@ var formatDates = fc.formatDates = function(date1, date2, format, options) { return res; }; + var dateFormatters = { s : function(d) { return d.getSeconds() }, ss : function(d) { return zeroPad(d.getSeconds()) }, @@ -315,282 +343,3 @@ var dateFormatters = { }; - -/* Element Dimensions ------------------------------------------------------------------------------*/ - -function setOuterWidth(element, width, includeMargins) { - element.each(function(i, _element) { - _element.style.width = width - hsides(_element, includeMargins) + 'px'; - }); -} - -function setOuterHeight(element, height, includeMargins) { - element.each(function(i, _element) { - _element.style.height = height - vsides(_element, includeMargins) + 'px'; - }); -} - - -function hsides(_element, includeMargins) { - return (parseFloat(jQuery.curCSS(_element, 'paddingLeft', true)) || 0) + - (parseFloat(jQuery.curCSS(_element, 'paddingRight', true)) || 0) + - (parseFloat(jQuery.curCSS(_element, 'borderLeftWidth', true)) || 0) + - (parseFloat(jQuery.curCSS(_element, 'borderRightWidth', true)) || 0) + - (includeMargins ? hmargins(_element) : 0); -} - -function hmargins(_element) { - return (parseFloat(jQuery.curCSS(_element, 'marginLeft', true)) || 0) + - (parseFloat(jQuery.curCSS(_element, 'marginRight', true)) || 0); -} - -function vsides(_element, includeMargins) { - return (parseFloat(jQuery.curCSS(_element, 'paddingTop', true)) || 0) + - (parseFloat(jQuery.curCSS(_element, 'paddingBottom', true)) || 0) + - (parseFloat(jQuery.curCSS(_element, 'borderTopWidth', true)) || 0) + - (parseFloat(jQuery.curCSS(_element, 'borderBottomWidth', true)) || 0) + - (includeMargins ? vmargins(_element) : 0); -} - -function vmargins(_element) { - return (parseFloat(jQuery.curCSS(_element, 'marginTop', true)) || 0) + - (parseFloat(jQuery.curCSS(_element, 'marginBottom', true)) || 0); -} - - - - -function setMinHeight(element, h) { - h = typeof h == 'number' ? h + 'px' : h; - element[0].style.cssText += ';min-height:' + h + ';_height:' + h; -} - - - -/* Position Calculation ------------------------------------------------------------------------------*/ -// nasty bugs in opera 9.25 -// position()'s top returning incorrectly with TR/TD or elements within TD - -var topBug; - -function topCorrect(tr) { // tr/th/td or anything else - if (topBug !== false) { - var cell; - if (tr.is('th,td')) { - tr = (cell = tr).parent(); - } - if (topBug === undefined && tr.is('tr')) { - topBug = tr.position().top != tr.children().position().top; - } - if (topBug) { - return tr.parent().position().top + (cell ? tr.position().top - cell.position().top : 0); - } - } - return 0; -} - - - -/* Coordinate Grid ------------------------------------------------------------------------------*/ - -function CoordinateGrid(buildFunc) { - - var t = this; - var rows; - var cols; - - t.build = function() { - rows = []; - cols = []; - buildFunc(rows, cols); - }; - - t.cell = function(x, y) { - var rowCnt = rows.length; - var colCnt = cols.length; - var i, r=-1, c=-1; - for (i=0; i= rows[i][0] && y < rows[i][1]) { - r = i; - break; - } - } - for (i=0; i= cols[i][0] && x < cols[i][1]) { - c = i; - break; - } - } - return (r>=0 && c>=0) ? { row:r, col:c } : null; - }; - - t.rect = function(row0, col0, row1, col1, originElement) { // row1,col1 is inclusive - var origin = originElement.offset(); - return { - top: rows[row0][0] - origin.top, - left: cols[col0][0] - origin.left, - width: cols[col1][1] - cols[col0][0], - height: rows[row1][1] - rows[row0][0] - }; - }; - -} - - - -/* Hover Listener ------------------------------------------------------------------------------*/ - -function HoverListener(coordinateGrid) { - - var t = this; - var bindType; - var change; - var firstCell; - var cell; - - t.start = function(_change, ev, _bindType) { - change = _change; - firstCell = cell = null; - coordinateGrid.build(); - mouse(ev); - bindType = _bindType || 'mousemove'; - $(document).bind(bindType, mouse); - }; - - function mouse(ev) { - var newCell = coordinateGrid.cell(ev.pageX, ev.pageY); - if (!newCell != !cell || newCell && (newCell.row != cell.row || newCell.col != cell.col)) { - if (newCell) { - if (!firstCell) { - firstCell = newCell; - } - change(newCell, firstCell, newCell.row-firstCell.row, newCell.col-firstCell.col); - }else{ - change(newCell, firstCell); - } - cell = newCell; - } - } - - t.stop = function() { - $(document).unbind(bindType, mouse); - return cell; - }; - -} - - - -/* Misc Utils ------------------------------------------------------------------------------*/ - -var dayIDs = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat']; - -function zeroPad(n) { - return (n < 10 ? '0' : '') + n; -} - -function smartProperty(obj, name) { // get a camel-cased/namespaced property of an object - if (obj[name] !== undefined) { - return obj[name]; - } - var parts = name.split(/(?=[A-Z])/), - i=parts.length-1, res; - for (; i>=0; i--) { - res = obj[parts[i].toLowerCase()]; - if (res !== undefined) { - return res; - } - } - return obj['']; -} - -function htmlEscape(s) { - return s.replace(/&/g, '&') - .replace(//g, '>') - .replace(/'/g, ''') - .replace(/"/g, '"') - .replace(/\n/g, '
'); -} - - - -function HorizontalPositionCache(getElement) { - - var t = this, - elements = {}, - lefts = {}, - rights = {}; - - function e(i) { - return elements[i] = elements[i] || getElement(i); - } - - t.left = function(i) { - return lefts[i] = lefts[i] === undefined ? e(i).position().left : lefts[i]; - }; - - t.right = function(i) { - return rights[i] = rights[i] === undefined ? t.left(i) + e(i).width() : rights[i]; - }; - - t.clear = function() { - elements = {}; - lefts = {}; - rights = {}; - }; - -} - - - -function cssKey(_element) { - return _element.id + '/' + _element.className + '/' + _element.style.cssText.replace(/(^|;)\s*(top|left|width|height)\s*:[^;]*/ig, ''); -} - - - -function cmp(a, b) { - return a - b; -} - - - -function exclEndDay(event) { - if (event.end) { - return _exclEndDay(event.end, event.allDay); - }else{ - return addDays(cloneDate(event.start), 1); - } -} - -function _exclEndDay(end, allDay) { - end = cloneDate(end); - return allDay || end.getHours() || end.getMinutes() ? addDays(end, 1) : clearTime(end); -} - - - -function disableTextSelection(element) { - element - .attr('unselectable', 'on') - .css('MozUserSelect', 'none') - .bind('selectstart.ui', function() { return false; }); -} - -/* -function enableTextSelection(element) { - element - .attr('unselectable', 'off') - .css('MozUserSelect', '') - .unbind('selectstart.ui'); -} -*/ - - - diff --git a/src/common/util.js b/src/common/util.js new file mode 100644 index 0000000..3c29870 --- /dev/null +++ b/src/common/util.js @@ -0,0 +1,285 @@ + + +/* Event Date Math +-----------------------------------------------------------------------------*/ + + +function exclEndDay(event) { + if (event.end) { + return _exclEndDay(event.end, event.allDay); + }else{ + return addDays(cloneDate(event.start), 1); + } +} + + +function _exclEndDay(end, allDay) { + end = cloneDate(end); + return allDay || end.getHours() || end.getMinutes() ? addDays(end, 1) : clearTime(end); +} + + +function segCmp(a, b) { + return (b.msLength - a.msLength) * 100 + (a.event.start - b.event.start); +} + + +function segsCollide(seg1, seg2) { + return seg1.end > seg2.start && seg1.start < seg2.end; +} + + + +/* Event Sorting +-----------------------------------------------------------------------------*/ + + +// event rendering utilities +function sliceSegs(events, visEventEnds, start, end) { + var segs = [], + i, len=events.length, event, + eventStart, eventEnd, + segStart, segEnd, + isStart, isEnd; + for (i=0; i start && eventStart < end) { + if (eventStart < start) { + segStart = cloneDate(start); + isStart = false; + }else{ + segStart = eventStart; + isStart = true; + } + if (eventEnd > end) { + segEnd = cloneDate(end); + isEnd = false; + }else{ + segEnd = eventEnd; + isEnd = true; + } + segs.push({ + event: event, + start: segStart, + end: segEnd, + isStart: isStart, + isEnd: isEnd, + msLength: segEnd - segStart + }); + } + } + return segs.sort(segCmp); +} + + +// event rendering calculation utilities +function stackSegs(segs) { + var levels = [], + i, len = segs.length, seg, + j, collide, k; + for (i=0; i=0; i--) { + res = obj[parts[i].toLowerCase()]; + if (res !== undefined) { + return res; + } + } + return obj['']; +} + + +function htmlEscape(s) { + return s.replace(/&/g, '&') + .replace(//g, '>') + .replace(/'/g, ''') + .replace(/"/g, '"') + .replace(/\n/g, '
'); +} + + +function cssKey(_element) { + return _element.id + '/' + _element.className + '/' + _element.style.cssText.replace(/(^|;)\s*(top|left|width|height)\s*:[^;]*/ig, ''); +} + + +function disableTextSelection(element) { + element + .attr('unselectable', 'on') + .css('MozUserSelect', 'none') + .bind('selectstart.ui', function() { return false; }); +} + + +/* +function enableTextSelection(element) { + element + .attr('unselectable', 'off') + .css('MozUserSelect', '') + .unbind('selectstart.ui'); +} +*/ + + diff --git a/src/defaults.js b/src/defaults.js new file mode 100644 index 0000000..193df06 --- /dev/null +++ b/src/defaults.js @@ -0,0 +1,92 @@ + +var defaults = { + + // display + defaultView: 'month', + aspectRatio: 1.35, + header: { + left: 'title', + center: '', + right: 'today prev,next' + }, + weekends: true, + + // editing + //editable: false, + //disableDragging: false, + //disableResizing: false, + + allDayDefault: true, + + // event ajax + lazyFetching: true, + startParam: 'start', + endParam: 'end', + + // time formats + titleFormat: { + month: 'MMMM yyyy', + week: "MMM d[ yyyy]{ '—'[ MMM] d yyyy}", + day: 'dddd, MMM d, yyyy' + }, + columnFormat: { + month: 'ddd', + week: 'ddd M/d', + day: 'dddd M/d' + }, + timeFormat: { // for event elements + '': 'h(:mm)t' // default + }, + + // locale + isRTL: false, + firstDay: 0, + monthNames: ['January','February','March','April','May','June','July','August','September','October','November','December'], + monthNamesShort: ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'], + dayNames: ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'], + dayNamesShort: ['Sun','Mon','Tue','Wed','Thu','Fri','Sat'], + buttonText: { + prev: ' ◄ ', + next: ' ► ', + prevYear: ' << ', + nextYear: ' >> ', + today: 'today', + month: 'month', + week: 'week', + day: 'day' + }, + + // jquery-ui theming + theme: false, + buttonIcons: { + prev: 'circle-triangle-w', + next: 'circle-triangle-e' + }, + + //selectable: false, + unselectAuto: true, + + dropAccept: '*' + +}; + +// right-to-left defaults +var rtlDefaults = { + header: { + left: 'next,prev today', + center: '', + right: 'title' + }, + buttonText: { + prev: ' ► ', + next: ' ◄ ', + prevYear: ' >> ', + nextYear: ' << ' + }, + buttonIcons: { + prev: 'circle-triangle-e', + next: 'circle-triangle-w' + } +}; + + diff --git a/src/gcal/_loader.js b/src/gcal/_loader.js new file mode 100644 index 0000000..a02657a --- /dev/null +++ b/src/gcal/_loader.js @@ -0,0 +1,6 @@ + +startload(); + +js('gcal.js'); + +endload(); diff --git a/src/gcal.js b/src/gcal/gcal.js similarity index 90% rename from src/gcal.js rename to src/gcal/gcal.js index fc6a49f..71b62f9 100644 --- a/src/gcal.js +++ b/src/gcal/gcal.js @@ -1,10 +1,9 @@ /* * FullCalendar v@VERSION Google Calendar Extension * - * Copyright (c) 2009 Adam Shaw - * Dual licensed under the MIT and GPL licenses: - * http://www.opensource.org/licenses/mit-license.php - * http://www.gnu.org/licenses/gpl.html + * Copyright (c) 2010 Adam Shaw + * Dual licensed under the MIT and GPL licenses, located in + * MIT-LICENSE.txt and GPL-LICENSE.txt respectively. * * Date: @DATE * diff --git a/src/grid.js b/src/grid.js deleted file mode 100644 index 4dd76bd..0000000 --- a/src/grid.js +++ /dev/null @@ -1,792 +0,0 @@ - -/* Grid-based Views: month, basicWeek, basicDay ------------------------------------------------------------------------------*/ - -setDefaults({ - weekMode: 'fixed' -}); - -views.month = function(element, options, viewName) { - return new Grid(element, options, { - render: function(date, delta) { - if (delta) { - addMonths(date, delta); - date.setDate(1); - } - // start/end - var start = this.start = cloneDate(date, true); - start.setDate(1); - this.end = addMonths(cloneDate(start), 1); - // visStart/visEnd - var visStart = this.visStart = cloneDate(start), - visEnd = this.visEnd = cloneDate(this.end), - nwe = options.weekends ? 0 : 1; - if (nwe) { - skipWeekend(visStart); - skipWeekend(visEnd, -1, true); - } - addDays(visStart, -((visStart.getDay() - Math.max(options.firstDay, nwe) + 7) % 7)); - addDays(visEnd, (7 - visEnd.getDay() + Math.max(options.firstDay, nwe)) % 7); - // row count - var rowCnt = Math.round((visEnd - visStart) / (DAY_MS * 7)); - if (options.weekMode == 'fixed') { - addDays(visEnd, (6 - rowCnt) * 7); - rowCnt = 6; - } - // title - this.title = formatDate( - start, - this.option('titleFormat'), - options - ); - // render - this.renderGrid( - rowCnt, options.weekends ? 7 : 5, - this.option('columnFormat'), - true - ); - } - }, viewName); -}; - -views.basicWeek = function(element, options, viewName) { - return new Grid(element, options, { - render: function(date, delta) { - if (delta) { - addDays(date, delta * 7); - } - var visStart = this.visStart = cloneDate( - this.start = addDays(cloneDate(date), -((date.getDay() - options.firstDay + 7) % 7)) - ), - visEnd = this.visEnd = cloneDate( - this.end = addDays(cloneDate(visStart), 7) - ); - if (!options.weekends) { - skipWeekend(visStart); - skipWeekend(visEnd, -1, true); - } - this.title = formatDates( - visStart, - addDays(cloneDate(visEnd), -1), - this.option('titleFormat'), - options - ); - this.renderGrid( - 1, options.weekends ? 7 : 5, - this.option('columnFormat'), - false - ); - } - }, viewName); -}; - -views.basicDay = function(element, options, viewName) { - return new Grid(element, options, { - render: function(date, delta) { - if (delta) { - addDays(date, delta); - if (!options.weekends) { - skipWeekend(date, delta < 0 ? -1 : 1); - } - } - this.title = formatDate(date, this.option('titleFormat'), options); - this.start = this.visStart = cloneDate(date, true); - this.end = this.visEnd = addDays(cloneDate(this.start), 1); - this.renderGrid( - 1, 1, - this.option('columnFormat'), - false - ); - } - }, viewName); -}; - - -// rendering bugs - -var tdHeightBug; - - -function Grid(element, options, methods, viewName) { - - var tm, firstDay, - nwe, // no weekends (int) - rtl, dis, dit, // day index sign / translate - viewWidth, viewHeight, - rowCnt, colCnt, - colWidth, - thead, tbody, - cachedEvents=[], - segmentContainer, - dayContentPositions = new HorizontalPositionCache(function(dayOfWeek) { - return tbody.find('td:eq(' + ((dayOfWeek - Math.max(firstDay,nwe)+colCnt) % colCnt) + ') div div'); - }), - // ... - - // initialize superclass - view = $.extend(this, viewMethods, methods, { - renderGrid: renderGrid, - renderEvents: renderEvents, - rerenderEvents: rerenderEvents, - clearEvents: clearEvents, - setHeight: setHeight, - setWidth: setWidth, - defaultEventEnd: function(event) { // calculates an end if event doesnt have one, mostly for resizing - return cloneDate(event.start); - } - }); - view.name = viewName; - view.init(element, options); - - - - /* Grid Rendering - -----------------------------------------------------------------------------*/ - - - disableTextSelection(element.addClass('fc-grid')); - - - function renderGrid(r, c, colFormat, showNumbers) { - - rowCnt = r; - colCnt = c; - - // update option-derived variables - tm = options.theme ? 'ui' : 'fc'; - nwe = options.weekends ? 0 : 1; - firstDay = options.firstDay; - if (rtl = options.isRTL) { - dis = -1; - dit = colCnt - 1; - }else{ - dis = 1; - dit = 0; - } - - var month = view.start.getMonth(), - today = clearTime(new Date()), - s, i, j, d = cloneDate(view.visStart); - - if (!tbody) { // first time, build all cells from scratch - - var table = $("").appendTo(element); - - s = ""; - for (i=0; i" + formatDate(d, colFormat, options) + ""; - addDays(d, 1); - if (nwe) { - skipWeekend(d); - } - } - thead = $(s + "").appendTo(table); - - s = ""; - d = cloneDate(view.visStart); - for (i=0; i"; - for (j=0; j1 && d.getMonth() != month ? ' fc-other-month' : '') + - (+d == +today ? - ' fc-today '+tm+'-state-highlight' : - ' fc-not-today') + "'>" + - (showNumbers ? "
" + d.getDate() + "
" : '') + - "
 
"; - addDays(d, 1); - if (nwe) { - skipWeekend(d); - } - } - s += ""; - } - tbody = $(s + "
").appendTo(table); - dayBind(tbody.find('td')); - - segmentContainer = $("
").appendTo(element); - - }else{ // NOT first time, reuse as many cells as possible - - clearEvents(); - - var prevRowCnt = tbody.find('tr').length; - if (rowCnt < prevRowCnt) { - tbody.find('tr:gt(' + (rowCnt-1) + ')').remove(); // remove extra rows - } - else if (rowCnt > prevRowCnt) { // needs to create new rows... - s = ''; - for (i=prevRowCnt; i"; - for (j=0; j" + - (showNumbers ? "
" : '') + - "
 
" + - ""; - addDays(d, 1); - if (nwe) { - skipWeekend(d); - } - } - s += ""; - } - tbody.append(s); - } - dayBind(tbody.find('td.fc-new').removeClass('fc-new')); - - // re-label and re-class existing cells - d = cloneDate(view.visStart); - tbody.find('td').each(function() { - var td = $(this); - if (rowCnt > 1) { - if (d.getMonth() == month) { - td.removeClass('fc-other-month'); - }else{ - td.addClass('fc-other-month'); - } - } - if (+d == +today) { - td.removeClass('fc-not-today') - .addClass('fc-today') - .addClass(tm + '-state-highlight'); - }else{ - td.addClass('fc-not-today') - .removeClass('fc-today') - .removeClass(tm + '-state-highlight'); - } - td.find('div.fc-day-number').text(d.getDate()); - addDays(d, 1); - if (nwe) { - skipWeekend(d); - } - }); - - if (rowCnt == 1) { // more changes likely (week or day view) - - // redo column header text and class - d = cloneDate(view.visStart); - thead.find('th').each(function() { - $(this).text(formatDate(d, colFormat, options)); - this.className = this.className.replace(/^fc-\w+(?= )/, 'fc-' + dayIDs[d.getDay()]); - addDays(d, 1); - if (nwe) { - skipWeekend(d); - } - }); - - // redo cell day-of-weeks - d = cloneDate(view.visStart); - tbody.find('td').each(function() { - this.className = this.className.replace(/^fc-\w+(?= )/, 'fc-' + dayIDs[d.getDay()]); - addDays(d, 1); - if (nwe) { - skipWeekend(d); - } - }); - - } - - } - - } - - - - function setHeight(height) { - viewHeight = height; - var leftTDs = tbody.find('tr td:first-child'), - tbodyHeight = viewHeight - thead.height(), - rowHeight1, rowHeight2; - if (options.weekMode == 'variable') { - rowHeight1 = rowHeight2 = Math.floor(tbodyHeight / (rowCnt==1 ? 2 : 6)); - }else{ - rowHeight1 = Math.floor(tbodyHeight / rowCnt); - rowHeight2 = tbodyHeight - rowHeight1*(rowCnt-1); - } - if (tdHeightBug === undefined) { - // bug in firefox where cell height includes padding - var tr = tbody.find('tr:first'), - td = tr.find('td:first'); - td.height(rowHeight1); - tdHeightBug = rowHeight1 != td.height(); - } - if (tdHeightBug) { - leftTDs.slice(0, -1).height(rowHeight1); - leftTDs.slice(-1).height(rowHeight2); - }else{ - setOuterHeight(leftTDs.slice(0, -1), rowHeight1); - setOuterHeight(leftTDs.slice(-1), rowHeight2); - } - } - - - function setWidth(width) { - viewWidth = width; - dayContentPositions.clear(); - setOuterWidth( - thead.find('th').slice(0, -1), - colWidth = Math.floor(viewWidth / colCnt) - ); - } - - - - /* Event Rendering - -----------------------------------------------------------------------------*/ - - - function renderEvents(events) { - view.reportEvents(cachedEvents = events); - renderSegs(compileSegs(events)); - } - - - function rerenderEvents(modifiedEventId) { - clearEvents(); - renderSegs(compileSegs(cachedEvents), modifiedEventId); - } - - - function clearEvents() { - view._clearEvents(); // only clears the hashes - segmentContainer.empty(); - } - - - function compileSegs(events) { - var d1 = cloneDate(view.visStart), - d2 = addDays(cloneDate(d1), colCnt), - visEventsEnds = $.map(events, exclEndDay), - i, row, - j, level, - k, seg, - segs=[]; - for (i=0; i" + - "" + - (!event.allDay && seg.isStart ? - "" + - htmlEscape(formatDates(event.start, event.end, view.option('timeFormat'), options)) + - "" - :'') + - "" + htmlEscape(event.title) + "" + - "" + - ((event.editable || event.editable === undefined && options.editable) && !options.disableResizing && $.fn.resizable ? - "
" - : '') + - "
"; - seg.left = left; - seg.outerWidth = right - left; - } - segmentContainer[0].innerHTML = html; // faster than html() - eventElements = segmentContainer.children(); - - // retrieve elements, run through eventRender callback, bind handlers - for (i=0; i div') // optimal selector? - .height(top + levelHeight); - } - - // calculate row tops - for (rowI=0; rowI").prependTo(_element), - suggestedViewHeight, - resizeUID = 0, - ignoreWindowResize = 0, - date = new Date(), - viewName, // the current view name (TODO: look into getting rid of) - view, // the current view - viewInstances = {}, - absoluteViewElement; - - - - if (options.isRTL) { - element.addClass('fc-rtl'); - } - if (options.theme) { - element.addClass('ui-widget'); - } - - setYMD(date, options.year, options.month, options.date); - - - - /* View Rendering - -----------------------------------------------------------------------------*/ - - function changeView(v) { - if (v != viewName) { - ignoreWindowResize++; // because setMinHeight might change the height before render (and subsequently setSize) is reached - - viewUnselect(); - - var oldView = view, - newViewElement; - - if (oldView) { - if (oldView.eventsChanged) { - eventsDirty(); - oldView.eventDirty = oldView.eventsChanged = false; - } - if (oldView.beforeHide) { - oldView.beforeHide(); // called before changing min-height. if called after, scroll state is reset (in Opera) - } - setMinHeight(content, content.height()); - oldView.element.hide(); - }else{ - setMinHeight(content, 1); // needs to be 1 (not 0) for IE7, or else view dimensions miscalculated - } - content.css('overflow', 'hidden'); - - if (viewInstances[v]) { - (view = viewInstances[v]).element.show(); - }else{ - view = viewInstances[v] = fc.views[v]( - newViewElement = absoluteViewElement = - $("
") - .appendTo(content), - options, - v // the view's name - ); - } - - if (header) { - // update 'active' view button - header.find('div.fc-button-' + viewName).removeClass(tm + '-state-active'); - header.find('div.fc-button-' + v).addClass(tm + '-state-active'); - } - - viewName = v; - render(); // after height has been set, will make absoluteViewElement's position=relative, then set to null - content.css('overflow', ''); - if (oldView) { - setMinHeight(content, 1); - } - if (!newViewElement && view.afterShow) { - view.afterShow(); // called after setting min-height/overflow, so in final scroll state (for Opera) - } - - ignoreWindowResize--; - } - } - - - function render(inc) { - if (elementVisible()) { - ignoreWindowResize++; // because view.renderEvents might temporarily change the height before setSize is reached - - viewUnselect(); - - if (suggestedViewHeight === undefined) { - calcSize(); - } - - if (!view.start || inc || date < view.start || date >= view.end) { - view.render(date, inc || 0); // responsible for clearing events - setSize(true); - if (!eventStart || !options.lazyFetching || view.visStart < eventStart || view.visEnd > eventEnd) { - fetchAndRenderEvents(); - }else{ - view.renderEvents(events); // don't refetch - } - } - else if (view.sizeDirty || view.eventsDirty || !options.lazyFetching) { - view.clearEvents(); - if (view.sizeDirty) { - setSize(); - } - if (options.lazyFetching) { - view.renderEvents(events); // don't refetch - }else{ - fetchAndRenderEvents(); - } - } - elementOuterWidth = element.outerWidth(); - view.sizeDirty = false; - view.eventsDirty = false; - - if (header) { - // update title text - header.find('h2.fc-header-title').html(view.title); - // enable/disable 'today' button - var today = new Date(); - if (today >= view.start && today < view.end) { - header.find('div.fc-button-today').addClass(tm + '-state-disabled'); - }else{ - header.find('div.fc-button-today').removeClass(tm + '-state-disabled'); - } - } - - ignoreWindowResize--; - view.trigger('viewDisplay', _element); - } - } - - - function elementVisible() { - return _element.offsetWidth !== 0; - } - - function bodyVisible() { - return $('body')[0].offsetWidth !== 0; - } - - function viewUnselect() { - if (view) { - view.unselect(); - } - } - - - // called when any event objects have been added/removed/changed, rerenders - function eventsChanged() { - eventsDirty(); - if (elementVisible()) { - view.clearEvents(); - view.renderEvents(events); - view.eventsDirty = false; - } - } - - // marks other views' events as dirty - function eventsDirty() { - $.each(viewInstances, function() { - this.eventsDirty = true; - }); - } - - // called when we know the element size has changed - function sizeChanged() { - sizesDirty(); - if (elementVisible()) { - calcSize(); - setSize(); - viewUnselect(); - view.rerenderEvents(); - view.sizeDirty = false; - } - } - - // marks other views' sizes as dirty - function sizesDirty() { - $.each(viewInstances, function() { - this.sizeDirty = true; - }); - } - - - - - /* Event Sources and Fetching - -----------------------------------------------------------------------------*/ - - var events = [], - eventStart, eventEnd; - - // Fetch from ALL sources. Clear 'events' array and populate - function fetchEvents(callback) { - events = []; - eventStart = cloneDate(view.visStart); - eventEnd = cloneDate(view.visEnd); - var queued = eventSources.length, - sourceDone = function() { - if (!--queued) { - if (callback) { - callback(events); - } - } - }, i=0; - for (; i") - .append($("
") - .append($(""); - $.each(buttonStr.split(' '), function(i) { - if (i > 0) { - tr.append(""); - } - var prevButton; - $.each(this.split(','), function(j, buttonName) { - if (buttonName == 'title') { - tr.append(""); - if (prevButton) { - prevButton.addClass(tm + '-corner-right'); - } - prevButton = null; - }else{ - var buttonClick; - if (publicMethods[buttonName]) { - buttonClick = publicMethods[buttonName]; - } - else if (views[buttonName]) { - buttonClick = function() { - button.removeClass(tm + '-state-hover'); - changeView(buttonName); - }; - } - if (buttonClick) { - if (prevButton) { - prevButton.addClass(tm + '-no-right'); - } - var button, - icon = options.theme ? smartProperty(options.buttonIcons, buttonName) : null, - text = smartProperty(options.buttonText, buttonName); - if (icon) { - button = $("
" + - "
"); - } - else if (text) { - button = $(""); - } - if (button) { - button - .click(function() { - if (!button.hasClass(tm + '-state-disabled')) { - buttonClick(); - } - }) - .mousedown(function() { - button - .not('.' + tm + '-state-active') - .not('.' + tm + '-state-disabled') - .addClass(tm + '-state-down'); - }) - .mouseup(function() { - button.removeClass(tm + '-state-down'); - }) - .hover( - function() { - button - .not('.' + tm + '-state-active') - .not('.' + tm + '-state-disabled') - .addClass(tm + '-state-hover'); - }, - function() { - button - .removeClass(tm + '-state-hover') - .removeClass(tm + '-state-down'); - } - ) - .appendTo($("
").append(buildSection(sections.left))) - .append($("").append(buildSection(sections.center))) - .append($("").append(buildSection(sections.right)))) - .prependTo(element); - } - function buildSection(buttonStr) { - if (buttonStr) { - var tr = $("

 

").appendTo(tr)); - if (prevButton) { - prevButton.addClass(tm + '-no-right'); - }else{ - button.addClass(tm + '-corner-left'); - } - prevButton = button; - } - } - } - }); - if (prevButton) { - prevButton.addClass(tm + '-corner-right'); - } - }); - return $("").append(tr); - } - } - - - - /* Resizing - -----------------------------------------------------------------------------*/ - - - function calcSize() { - if (options.contentHeight) { - suggestedViewHeight = options.contentHeight; - } - else if (options.height) { - suggestedViewHeight = options.height - (header ? header.height() : 0) - vsides(content[0]); - } - else { - suggestedViewHeight = Math.round(content.width() / Math.max(options.aspectRatio, .5)); - } - } - - - function setSize(dateChanged) { - ignoreWindowResize++; - view.setHeight(suggestedViewHeight, dateChanged); - if (absoluteViewElement) { - absoluteViewElement.css('position', 'relative'); - absoluteViewElement = null; - } - view.setWidth(content.width(), dateChanged); - ignoreWindowResize--; - } - - - function windowResize() { - if (!ignoreWindowResize) { - if (view.start) { // view has already been rendered - var uid = ++resizeUID; - setTimeout(function() { // add a delay - if (uid == resizeUID && !ignoreWindowResize && elementVisible()) { - if (elementOuterWidth != (elementOuterWidth = element.outerWidth())) { - ignoreWindowResize++; // in case the windowResize callback changes the height - sizeChanged(); - view.trigger('windowResize', _element); - ignoreWindowResize--; - } - } - }, 200); - }else{ - // calendar must have been initialized in a 0x0 iframe that has just been resized - lateRender(); - } - } - } - $(window).resize(windowResize); - - - - /* External event dropping - --------------------------------------------------------*/ - - if (options.droppable) { - var _dragElement; - $(document) - .bind('dragstart', function(ev, ui) { - var _e = ev.target; - var e = $(_e); - if (!e.parents('.fc').length) { // not already inside a calendar - var accept = options.dropAccept; - if ($.isFunction(accept) ? accept.call(_e, e) : e.is(accept)) { - _dragElement = _e; - view.dragStart(_dragElement, ev, ui); - } - } - }) - .bind('dragstop', function(ev, ui) { - if (_dragElement) { - view.dragStop(_dragElement, ev, ui); - _dragElement = null; - } - }); - } - - - - // let's begin... - changeView(options.defaultView); - - - // needed for IE in a 0x0 iframe, b/c when it is resized, never triggers a windowResize - if (!bodyVisible()) { - lateRender(); - } - - - // called when we know the calendar couldn't be rendered when it was initialized, - // but we think it's ready now - function lateRender() { - setTimeout(function() { // IE7 needs this so dimensions are calculated correctly - if (!view.start && bodyVisible()) { // !view.start makes sure this never happens more than once - render(); - } - },0); - } - - + this.each(function(i, _element) { + var element = $(_element); + var calendar = new Calendar(element, options, eventSources); + element.data('fullCalendar', calendar); // TODO: look into memory leak implications + calendar.render(); }); + return this; }; - -/* Important Event Utilities ------------------------------------------------------------------------------*/ - -var fakeID = 0; - -function normalizeEvent(event, options) { - event._id = event._id || (event.id === undefined ? '_fc' + fakeID++ : event.id + ''); - if (event.date) { - if (!event.start) { - event.start = event.date; - } - delete event.date; - } - event._start = cloneDate(event.start = parseDate(event.start)); - event.end = parseDate(event.end); - if (event.end && event.end <= event.start) { - event.end = null; - } - event._end = event.end ? cloneDate(event.end) : null; - if (event.allDay === undefined) { - event.allDay = options.allDayDefault; - } - if (event.className) { - if (typeof event.className == 'string') { - event.className = event.className.split(/\s+/); - } - }else{ - event.className = []; - } +// function for adding/overriding defaults +function setDefaults(d) { + $.extend(true, defaults, d); } -// TODO: if there is no start date, return false to indicate an invalid event + diff --git a/src/misc/head.txt b/src/misc/head.txt deleted file mode 100644 index c60a8c8..0000000 --- a/src/misc/head.txt +++ /dev/null @@ -1,20 +0,0 @@ -/** - * @preserve - * FullCalendar v@VERSION - * http://arshaw.com/fullcalendar/ - * - * Use fullcalendar.css for basic styling. - * For event drag & drop, required jQuery UI draggable. - * For event resizing, requires jQuery UI resizable. - * - * Copyright (c) 2009 Adam Shaw - * Dual licensed under the MIT and GPL licenses: - * http://www.opensource.org/licenses/mit-license.php - * http://www.gnu.org/licenses/gpl.html - * - * Date: @DATE - * - */ - -(function($, undefined) { - diff --git a/src/misc/foot.txt b/src/outro.js similarity index 100% rename from src/misc/foot.txt rename to src/outro.js diff --git a/src/selection_util.js b/src/selection_util.js deleted file mode 100644 index 8531a50..0000000 --- a/src/selection_util.js +++ /dev/null @@ -1,45 +0,0 @@ - - -function selection_dayMousedown(view, hoverListener, cellDate, cellIsAllDay, renderSelection, clearSelection, reportSelection, unselect) { - return function(ev) { - if (view.option('selectable')) { - unselect(ev); - var _mousedownElement = this; - var dates; - hoverListener.start(function(cell, origCell) { - clearSelection(); - if (cell && cellIsAllDay(cell)) { - dates = [ cellDate(origCell), cellDate(cell) ].sort(cmp); - renderSelection(dates[0], addDays(cloneDate(dates[1]), 1), true); - }else{ - dates = null; - } - }, ev); - $(document).one('mouseup', function(ev) { - hoverListener.stop(); - if (dates) { - if (+dates[0] == +dates[1]) { - view.trigger('dayClick', _mousedownElement, dates[0], true, ev); - // BUG: _mousedownElement will sometimes be the overlay - } - reportSelection(dates[0], dates[1], true, ev); - } - }); - } - } -} - - -function selection_unselectAuto(view, unselect) { - if (view.option('selectable') && view.option('unselectAuto')) { - $(document).mousedown(function(ev) { - var ignore = view.option('unselectCancel'); - if (ignore) { - if ($(ev.target).parents(ignore).length) { // could be optimized to stop after first match - return; - } - } - unselect(ev); - }); - } -} diff --git a/src/view.js b/src/view.js deleted file mode 100644 index fa1be36..0000000 --- a/src/view.js +++ /dev/null @@ -1,375 +0,0 @@ - -/* Methods & Utilities for All Views ------------------------------------------------------------------------------*/ - -var viewMethods = { - - /* - * Objects inheriting these methods must implement the following properties/methods: - * - title - * - start - * - end - * - visStart - * - visEnd - * - defaultEventEnd(event) - * - render(events) - * - rerenderEvents() - * - * - * z-index reservations: - * 3 - day-overlay - * 8 - events - * 9 - dragging/resizing events - * - */ - - - - init: function(element, options) { - this.element = element; - this.options = options; - this.eventsByID = {}; - this.eventElements = []; - this.eventElementsByID = {}; - this.usedOverlays = []; - this.unusedOverlays = []; - }, - - - - // triggers an event handler, always append view as last arg - - trigger: function(name, thisObj) { - if (this.options[name]) { - return this.options[name].apply(thisObj || this, Array.prototype.slice.call(arguments, 2).concat([this])); - } - }, - - - - // returns a Date object for an event's end - - eventEnd: function(event) { - return event.end ? cloneDate(event.end) : this.defaultEventEnd(event); // TODO: make sure always using copies - }, - - - - // report when view receives new events - - reportEvents: function(events) { // events are already normalized at this point - var i, len=events.length, event, - eventsByID = this.eventsByID = {}; - for (i=0; i"); - } - if (e[0].parentNode != parent[0]) { - e.appendTo(parent); - } - this.usedOverlays.push(e.css(rect).show()); - return e; - }, - - clearOverlays: function() { - var e; - while (e = this.usedOverlays.shift()) { - this.unusedOverlays.push(e.hide().unbind()); - } - }, - - - - - // common horizontal event resizing - - resizableDayEvent: function(event, eventElement, colWidth) { - var view = this; - if (!view.options.disableResizing && eventElement.resizable) { - eventElement.resizable({ - handles: view.options.isRTL ? {w:'div.ui-resizable-w'} : {e:'div.ui-resizable-e'}, - grid: colWidth, - minWidth: colWidth/2, // need this or else IE throws errors when too small - containment: view.element.parent().parent(), // the main element... - // ... a fix. wouldn't allow extending to last column in agenda views (jq ui bug?) - start: function(ev, ui) { - eventElement.css('z-index', 9); - view.hideEvents(event, eventElement); - view.trigger('eventResizeStart', this, event, ev, ui); - }, - stop: function(ev, ui) { - view.trigger('eventResizeStop', this, event, ev, ui); - // ui.size.width wasn't working with grid correctly, use .width() - var dayDelta = Math.round((eventElement.width() - ui.originalSize.width) / colWidth); - if (dayDelta) { - view.eventResize(this, event, dayDelta, 0, ev, ui); - }else{ - eventElement.css('z-index', 8); - view.showEvents(event, eventElement); - } - } - }); - } - }, - - - - // attaches eventClick, eventMouseover, eventMouseout - - eventElementHandlers: function(event, eventElement) { - var view = this; - eventElement - .click(function(ev) { - if (!eventElement.hasClass('ui-draggable-dragging') && - !eventElement.hasClass('ui-resizable-resizing')) { - return view.trigger('eventClick', this, event, ev); - } - }) - .hover( - function(ev) { - view.trigger('eventMouseover', this, event, ev); - }, - function(ev) { - view.trigger('eventMouseout', this, event, ev); - } - ); - }, - - - - // get a property from the 'options' object, using smart view naming - - option: function(name, viewName) { - var v = this.options[name]; - if (typeof v == 'object') { - return smartProperty(v, viewName || this.name); - } - return v; - }, - - - - // event rendering utilities - - sliceSegs: function(events, visEventEnds, start, end) { - var segs = [], - i, len=events.length, event, - eventStart, eventEnd, - segStart, segEnd, - isStart, isEnd; - for (i=0; i start && eventStart < end) { - if (eventStart < start) { - segStart = cloneDate(start); - isStart = false; - }else{ - segStart = eventStart; - isStart = true; - } - if (eventEnd > end) { - segEnd = cloneDate(end); - isEnd = false; - }else{ - segEnd = eventEnd; - isEnd = true; - } - segs.push({ - event: event, - start: segStart, - end: segEnd, - isStart: isStart, - isEnd: isEnd, - msLength: segEnd - segStart - }); - } - } - return segs.sort(segCmp); - } - - -}; - - - -function lazySegBind(container, segs, bindHandlers) { - container.unbind('mouseover').mouseover(function(ev) { - var parent=ev.target, e, - i, seg; - while (parent != this) { - e = parent; - parent = parent.parentNode; - } - if ((i = e._fci) !== undefined) { - e._fci = undefined; - seg = segs[i]; - bindHandlers(seg.event, seg.element, seg); - $(ev.target).trigger(ev); - } - ev.stopPropagation(); - }); -} - - - -// event rendering calculation utilities - -function stackSegs(segs) { - var levels = [], - i, len = segs.length, seg, - j, collide, k; - for (i=0; i seg2.start && seg1.start < seg2.end; -} - - - diff --git a/tests/dbclick.html b/tests/dbclick.html index 96b3577..acbea3e 100644 --- a/tests/dbclick.html +++ b/tests/dbclick.html @@ -1,8 +1,7 @@ - + - - + + + + + - - - + + + + -
+
-

FancyBox v1.2.6

- -

- Open a FullCalendar -

+

FancyBox v1.2.6

+ +

+Open a FullCalendar +

diff --git a/tests/issue_206_parseDate_dst.html b/tests/issue_206_parseDate_dst.html index f228c65..1955e90 100644 --- a/tests/issue_206_parseDate_dst.html +++ b/tests/issue_206_parseDate_dst.html @@ -1,8 +1,7 @@ - + - - + - + + + + + + + + + + + - + - + + + + - + + + - + + + + + +