Commits

Anonymous committed d09daa5

Adding jsdate file which should have been added previously. Removing old jquery-ui files.

Comments (0)

Files changed (2)

examples/jquery-ui/css/ui-lightness/jquery-ui-1.8.1.custom.css

-/*
-* jQuery UI CSS Framework
-* Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
-* Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses.
-*/
-
-/* Layout helpers
-----------------------------------*/
-.ui-helper-hidden { display: none; }
-.ui-helper-hidden-accessible { position: absolute; left: -99999999px; }
-.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; }
-.ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; }
-.ui-helper-clearfix { display: inline-block; }
-/* required comment for clearfix to work in Opera \*/
-* html .ui-helper-clearfix { height:1%; }
-.ui-helper-clearfix { display:block; }
-/* end clearfix */
-.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); }
-
-
-/* Interaction Cues
-----------------------------------*/
-.ui-state-disabled { cursor: default !important; }
-
-
-/* Icons
-----------------------------------*/
-
-/* states and images */
-.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; }
-
-
-/* Misc visuals
-----------------------------------*/
-
-/* Overlays */
-.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }
-
-
-/*
-* jQuery UI CSS Framework
-* Copyright (c) 2010 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=Trebuchet%20MS,%20Tahoma,%20Verdana,%20Arial,%20sans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=f6a828&bgTextureHeader=12_gloss_wave.png&bgImgOpacityHeader=35&borderColorHeader=e78f08&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=eeeeee&bgTextureContent=03_highlight_soft.png&bgImgOpacityContent=100&borderColorContent=dddddd&fcContent=333333&iconColorContent=222222&bgColorDefault=f6f6f6&bgTextureDefault=02_glass.png&bgImgOpacityDefault=100&borderColorDefault=cccccc&fcDefault=1c94c4&iconColorDefault=ef8c08&bgColorHover=fdf5ce&bgTextureHover=02_glass.png&bgImgOpacityHover=100&borderColorHover=fbcb09&fcHover=c77405&iconColorHover=ef8c08&bgColorActive=ffffff&bgTextureActive=02_glass.png&bgImgOpacityActive=65&borderColorActive=fbd850&fcActive=eb8f00&iconColorActive=ef8c08&bgColorHighlight=ffe45c&bgTextureHighlight=03_highlight_soft.png&bgImgOpacityHighlight=75&borderColorHighlight=fed22f&fcHighlight=363636&iconColorHighlight=228ef1&bgColorError=b81900&bgTextureError=08_diagonals_thick.png&bgImgOpacityError=18&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffd27a&bgColorOverlay=666666&bgTextureOverlay=08_diagonals_thick.png&bgImgOpacityOverlay=20&opacityOverlay=50&bgColorShadow=000000&bgTextureShadow=01_flat.png&bgImgOpacityShadow=10&opacityShadow=20&thicknessShadow=5px&offsetTopShadow=-5px&offsetLeftShadow=-5px&cornerRadiusShadow=5px
-*/
-
-
-/* Component containers
-----------------------------------*/
-.ui-widget { font-family: Trebuchet MS, Tahoma, Verdana, 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: Trebuchet MS, Tahoma, Verdana, Arial, sans-serif; font-size: 1em; }
-.ui-widget-content { border: 1px solid #dddddd; background: #eeeeee url(images/ui-bg_highlight-soft_100_eeeeee_1x100.png) 50% top repeat-x; color: #333333; }
-.ui-widget-content a { color: #333333; }
-.ui-widget-header { border: 1px solid #e78f08; background: #f6a828 url(images/ui-bg_gloss-wave_35_f6a828_500x100.png) 50% 50% repeat-x; color: #ffffff; font-weight: bold; }
-.ui-widget-header a { color: #ffffff; }
-
-/* Interaction states
-----------------------------------*/
-.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #cccccc; background: #f6f6f6 url(images/ui-bg_glass_100_f6f6f6_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #1c94c4; }
-.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #1c94c4; 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 #fbcb09; background: #fdf5ce url(images/ui-bg_glass_100_fdf5ce_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #c77405; }
-.ui-state-hover a, .ui-state-hover a:hover { color: #c77405; text-decoration: none; }
-.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #fbd850; background: #ffffff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #eb8f00; }
-.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #eb8f00; text-decoration: none; }
-.ui-widget :active { outline: none; }
-
-/* Interaction Cues
-----------------------------------*/
-.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight  {border: 1px solid #fed22f; background: #ffe45c url(images/ui-bg_highlight-soft_75_ffe45c_1x100.png) 50% top 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: #b81900 url(images/ui-bg_diagonals-thick_18_b81900_40x40.png) 50% 50% repeat; color: #ffffff; }
-.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #ffffff; }
-.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #ffffff; }
-.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
-----------------------------------*/
-
-/* states and images */
-.ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_222222_256x240.png); }
-.ui-widget-content .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); }
-.ui-widget-header .ui-icon {background-image: url(images/ui-icons_ffffff_256x240.png); }
-.ui-state-default .ui-icon { background-image: url(images/ui-icons_ef8c08_256x240.png); }
-.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_ef8c08_256x240.png); }
-.ui-state-active .ui-icon {background-image: url(images/ui-icons_ef8c08_256x240.png); }
-.ui-state-highlight .ui-icon {background-image: url(images/ui-icons_228ef1_256x240.png); }
-.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_ffd27a_256x240.png); }
-
-/* positioning */
-.ui-icon-carat-1-n { background-position: 0 0; }
-.ui-icon-carat-1-ne { background-position: -16px 0; }
-.ui-icon-carat-1-e { background-position: -32px 0; }
-.ui-icon-carat-1-se { background-position: -48px 0; }
-.ui-icon-carat-1-s { background-position: -64px 0; }
-.ui-icon-carat-1-sw { background-position: -80px 0; }
-.ui-icon-carat-1-w { background-position: -96px 0; }
-.ui-icon-carat-1-nw { background-position: -112px 0; }
-.ui-icon-carat-2-n-s { background-position: -128px 0; }
-.ui-icon-carat-2-e-w { background-position: -144px 0; }
-.ui-icon-triangle-1-n { background-position: 0 -16px; }
-.ui-icon-triangle-1-ne { background-position: -16px -16px; }
-.ui-icon-triangle-1-e { background-position: -32px -16px; }
-.ui-icon-triangle-1-se { background-position: -48px -16px; }
-.ui-icon-triangle-1-s { background-position: -64px -16px; }
-.ui-icon-triangle-1-sw { background-position: -80px -16px; }
-.ui-icon-triangle-1-w { background-position: -96px -16px; }
-.ui-icon-triangle-1-nw { background-position: -112px -16px; }
-.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
-.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
-.ui-icon-arrow-1-n { background-position: 0 -32px; }
-.ui-icon-arrow-1-ne { background-position: -16px -32px; }
-.ui-icon-arrow-1-e { background-position: -32px -32px; }
-.ui-icon-arrow-1-se { background-position: -48px -32px; }
-.ui-icon-arrow-1-s { background-position: -64px -32px; }
-.ui-icon-arrow-1-sw { background-position: -80px -32px; }
-.ui-icon-arrow-1-w { background-position: -96px -32px; }
-.ui-icon-arrow-1-nw { background-position: -112px -32px; }
-.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
-.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
-.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
-.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
-.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
-.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
-.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
-.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
-.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
-.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
-.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
-.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
-.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
-.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
-.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
-.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
-.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
-.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
-.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
-.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
-.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
-.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
-.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
-.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
-.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
-.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
-.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
-.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
-.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
-.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
-.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
-.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
-.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
-.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
-.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
-.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
-.ui-icon-arrow-4 { background-position: 0 -80px; }
-.ui-icon-arrow-4-diag { background-position: -16px -80px; }
-.ui-icon-extlink { background-position: -32px -80px; }
-.ui-icon-newwin { background-position: -48px -80px; }
-.ui-icon-refresh { background-position: -64px -80px; }
-.ui-icon-shuffle { background-position: -80px -80px; }
-.ui-icon-transfer-e-w { background-position: -96px -80px; }
-.ui-icon-transferthick-e-w { background-position: -112px -80px; }
-.ui-icon-folder-collapsed { background-position: 0 -96px; }
-.ui-icon-folder-open { background-position: -16px -96px; }
-.ui-icon-document { background-position: -32px -96px; }
-.ui-icon-document-b { background-position: -48px -96px; }
-.ui-icon-note { background-position: -64px -96px; }
-.ui-icon-mail-closed { background-position: -80px -96px; }
-.ui-icon-mail-open { background-position: -96px -96px; }
-.ui-icon-suitcase { background-position: -112px -96px; }
-.ui-icon-comment { background-position: -128px -96px; }
-.ui-icon-person { background-position: -144px -96px; }
-.ui-icon-print { background-position: -160px -96px; }
-.ui-icon-trash { background-position: -176px -96px; }
-.ui-icon-locked { background-position: -192px -96px; }
-.ui-icon-unlocked { background-position: -208px -96px; }
-.ui-icon-bookmark { background-position: -224px -96px; }
-.ui-icon-tag { background-position: -240px -96px; }
-.ui-icon-home { background-position: 0 -112px; }
-.ui-icon-flag { background-position: -16px -112px; }
-.ui-icon-calendar { background-position: -32px -112px; }
-.ui-icon-cart { background-position: -48px -112px; }
-.ui-icon-pencil { background-position: -64px -112px; }
-.ui-icon-clock { background-position: -80px -112px; }
-.ui-icon-disk { background-position: -96px -112px; }
-.ui-icon-calculator { background-position: -112px -112px; }
-.ui-icon-zoomin { background-position: -128px -112px; }
-.ui-icon-zoomout { background-position: -144px -112px; }
-.ui-icon-search { background-position: -160px -112px; }
-.ui-icon-wrench { background-position: -176px -112px; }
-.ui-icon-gear { background-position: -192px -112px; }
-.ui-icon-heart { background-position: -208px -112px; }
-.ui-icon-star { background-position: -224px -112px; }
-.ui-icon-link { background-position: -240px -112px; }
-.ui-icon-cancel { background-position: 0 -128px; }
-.ui-icon-plus { background-position: -16px -128px; }
-.ui-icon-plusthick { background-position: -32px -128px; }
-.ui-icon-minus { background-position: -48px -128px; }
-.ui-icon-minusthick { background-position: -64px -128px; }
-.ui-icon-close { background-position: -80px -128px; }
-.ui-icon-closethick { background-position: -96px -128px; }
-.ui-icon-key { background-position: -112px -128px; }
-.ui-icon-lightbulb { background-position: -128px -128px; }
-.ui-icon-scissors { background-position: -144px -128px; }
-.ui-icon-clipboard { background-position: -160px -128px; }
-.ui-icon-copy { background-position: -176px -128px; }
-.ui-icon-contact { background-position: -192px -128px; }
-.ui-icon-image { background-position: -208px -128px; }
-.ui-icon-video { background-position: -224px -128px; }
-.ui-icon-script { background-position: -240px -128px; }
-.ui-icon-alert { background-position: 0 -144px; }
-.ui-icon-info { background-position: -16px -144px; }
-.ui-icon-notice { background-position: -32px -144px; }
-.ui-icon-help { background-position: -48px -144px; }
-.ui-icon-check { background-position: -64px -144px; }
-.ui-icon-bullet { background-position: -80px -144px; }
-.ui-icon-radio-off { background-position: -96px -144px; }
-.ui-icon-radio-on { background-position: -112px -144px; }
-.ui-icon-pin-w { background-position: -128px -144px; }
-.ui-icon-pin-s { background-position: -144px -144px; }
-.ui-icon-play { background-position: 0 -160px; }
-.ui-icon-pause { background-position: -16px -160px; }
-.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; }
-.ui-icon-volume-off { background-position: -128px -160px; }
-.ui-icon-volume-on { background-position: -144px -160px; }
-.ui-icon-power { background-position: 0 -176px; }
-.ui-icon-signal-diag { background-position: -16px -176px; }
-.ui-icon-signal { background-position: -32px -176px; }
-.ui-icon-battery-0 { background-position: -48px -176px; }
-.ui-icon-battery-1 { background-position: -64px -176px; }
-.ui-icon-battery-2 { background-position: -80px -176px; }
-.ui-icon-battery-3 { background-position: -96px -176px; }
-.ui-icon-circle-plus { background-position: 0 -192px; }
-.ui-icon-circle-minus { background-position: -16px -192px; }
-.ui-icon-circle-close { background-position: -32px -192px; }
-.ui-icon-circle-triangle-e { background-position: -48px -192px; }
-.ui-icon-circle-triangle-s { background-position: -64px -192px; }
-.ui-icon-circle-triangle-w { background-position: -80px -192px; }
-.ui-icon-circle-triangle-n { background-position: -96px -192px; }
-.ui-icon-circle-arrow-e { background-position: -112px -192px; }
-.ui-icon-circle-arrow-s { background-position: -128px -192px; }
-.ui-icon-circle-arrow-w { background-position: -144px -192px; }
-.ui-icon-circle-arrow-n { background-position: -160px -192px; }
-.ui-icon-circle-zoomin { background-position: -176px -192px; }
-.ui-icon-circle-zoomout { background-position: -192px -192px; }
-.ui-icon-circle-check { background-position: -208px -192px; }
-.ui-icon-circlesmall-plus { background-position: 0 -208px; }
-.ui-icon-circlesmall-minus { background-position: -16px -208px; }
-.ui-icon-circlesmall-close { background-position: -32px -208px; }
-.ui-icon-squaresmall-plus { background-position: -48px -208px; }
-.ui-icon-squaresmall-minus { background-position: -64px -208px; }
-.ui-icon-squaresmall-close { background-position: -80px -208px; }
-.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
-.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
-.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
-.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
-.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
-.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
-
-
-/* Misc visuals
-----------------------------------*/
-
-/* Corner radius */
-.ui-corner-tl { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; }
-.ui-corner-tr { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; }
-.ui-corner-bl { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; }
-.ui-corner-br { -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; }
-.ui-corner-top { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; }
-.ui-corner-bottom { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; }
-.ui-corner-right {  -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; }
-.ui-corner-left { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; }
-.ui-corner-all { -moz-border-radius: 4px; -webkit-border-radius: 4px; border-radius: 4px; }
-
-/* Overlays */
-.ui-widget-overlay { background: #666666 url(images/ui-bg_diagonals-thick_20_666666_40x40.png) 50% 50% repeat; opacity: .50;filter:Alpha(Opacity=50); }
-.ui-widget-shadow { margin: -5px 0 0 -5px; padding: 5px; background: #000000 url(images/ui-bg_flat_10_000000_40x100.png) 50% 50% repeat-x; opacity: .20;filter:Alpha(Opacity=20); -moz-border-radius: 5px; -webkit-border-radius: 5px; border-radius: 5px; }/* Resizable
-----------------------------------*/
-.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: 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;}/* 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 .7em; }
-/* IE7-/Win - Fix extra vertical space in lists */
-.ui-accordion a { zoom: 1; }
-.ui-accordion-icons .ui-accordion-header a { padding-left: 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; zoom: 1; }
-.ui-accordion .ui-accordion-content-active { display: block; }/* Autocomplete
-----------------------------------*/
-.ui-autocomplete { position: absolute; cursor: default; }	
-.ui-autocomplete-loading { background: white url('images/ui-anim_basic_16x16.gif') right center no-repeat; }
-
-/* workarounds */
-* html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */
-
-/* Menu
-----------------------------------*/
-.ui-menu {
-	list-style:none;
-	padding: 2px;
-	margin: 0;
-	display:block;
-}
-.ui-menu .ui-menu {
-	margin-top: -3px;
-}
-.ui-menu .ui-menu-item {
-	margin:0;
-	padding: 0;
-	zoom: 1;
-	float: left;
-	clear: left;
-	width: 100%;
-}
-.ui-menu .ui-menu-item a {
-	text-decoration:none;
-	display:block;
-	padding:.2em .4em;
-	line-height:1.5;
-	zoom:1;
-}
-.ui-menu .ui-menu-item a.ui-state-hover,
-.ui-menu .ui-menu-item a.ui-state-active {
-	font-weight: normal;
-	margin: -1px;
-}
-/* Button
-----------------------------------*/
-
-.ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; text-decoration: none !important; cursor: pointer; text-align: center; zoom: 1; overflow: visible; } /* the overflow property removes extra width in IE */
-.ui-button-icon-only { width: 2.2em; } /* to make room for the icon, a width needs to be set here */
-button.ui-button-icon-only { width: 2.4em; } /* button elements seem to need a little more width */
-.ui-button-icons-only { width: 3.4em; } 
-button.ui-button-icons-only { width: 3.7em; } 
-
-/*button text element */
-.ui-button .ui-button-text { display: block; line-height: 1.4;  }
-.ui-button-text-only .ui-button-text { padding: .4em 1em; }
-.ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: .4em; text-indent: -9999999px; }
-.ui-button-text-icon .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 1em .4em 2.1em; }
-.ui-button-text-icons .ui-button-text { padding-left: 2.1em; padding-right: 2.1em; }
-/* no icon support for input elements, provide padding by default */
-input.ui-button { padding: .4em 1em; }
-
-/*button icon element(s) */
-.ui-button-icon-only .ui-icon, .ui-button-text-icon .ui-icon, .ui-button-text-icons .ui-icon, .ui-button-icons-only .ui-icon { position: absolute; top: 50%; margin-top: -8px; }
-.ui-button-icon-only .ui-icon { left: 50%; margin-left: -8px; }
-.ui-button-text-icon .ui-button-icon-primary, .ui-button-text-icons .ui-button-icon-primary, .ui-button-icons-only .ui-button-icon-primary { left: .5em; }
-.ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; }
-
-/*button sets*/
-.ui-buttonset { margin-right: 7px; }
-.ui-buttonset .ui-button { margin-left: 0; margin-right: -.3em; }
-
-/* workarounds */
-button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */
-
-
-
-
-
-/* Dialog
-----------------------------------*/
-.ui-dialog { position: absolute; padding: .2em; width: 300px; overflow: hidden; }
-.ui-dialog .ui-dialog-titlebar { padding: .5em 1em .3em; position: relative;  }
-.ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .2em 0; } 
-.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; }
-/* 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; background-position: 0 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 { 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 { display: block; border-width: 0; padding: 1em 1.4em; background: none; }
-.ui-tabs .ui-tabs-hide { display: none !important; }
-/* 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 { 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 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*/
-}/* Progressbar
-----------------------------------*/
-.ui-progressbar { height:2em; text-align: left; }
-.ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; }
+
+/**
+ * @fileOverview Date parsing and formatting operations without extending the Date built-in object.
+ * @author Chris Leonello
+ * @version #VERSION#
+ * @date #DATE#
+ */
+ 
+(function() {
+
+	/** 
+	 * @description
+	 * <p>Object with extended date parsing and formatting capabilities.
+	 * This library borrows many concepts and ideas from the Date Instance 
+	 * Methods by Ken Snyder along with some parts of Ken's actual code.</p>
+	 *
+	 * <p>jsDate takes a different approach by not extending the built-in 
+	 * Date Object, improving date parsing, allowing for multiple formatting 
+	 * syntaxes and multiple and more easily expandable localization.</p>
+	 * 
+	 * @author Chris Leonello
+	 * @date #date#
+	 * @version #VERSION#
+	 * @copyright (c) 2010 Chris Leonello
+ 	 * jsDate is currently available for use in all personal or commercial projects 
+	 * under both the MIT and GPL version 2.0 licenses. This means that you can 
+	 * choose the license that best suits your project and use it accordingly.
+	 * 
+	 * <p>Ken's origianl Date Instance Methods and copyright notice:</p>
+     * <pre>
+     * Ken Snyder (ken d snyder at gmail dot com)
+     * 2008-09-10
+     * version 2.0.2 (http://kendsnyder.com/sandbox/date/)     
+     * Creative Commons Attribution License 3.0 (http://creativecommons.org/licenses/by/3.0/)
+	 * </pre>
+	 * 
+	 * @class
+	 * @name jsDate
+	 * @param  {String | Number | Array | Date&nbsp;Object | Options&nbsp;Object} arguments Optional arguments, either a parsable date/time string,
+	 * a JavaScript timestamp, an array of numbers of form [year, month, day, hours, minutes, seconds, milliseconds],
+	 * a Date object, or an options object of form {syntax: "perl", date:some Date} where all options are optional.
+	 */
+	 
+    var jsDate = function () {
+	
+    	this.syntax = jsDate.config.syntax;
+		this._type = "jsDate";
+        this.utcOffset = new Date().getTimezoneOffset * 60000;
+        this.proxy = new Date();
+		this.options = {};
+		this.locale = jsDate.regional.getLocale();
+		this.formatString = '';
+
+        switch ( arguments.length ) {
+            case 0:
+                break;
+            case 1:
+				// other objects either won't have a _type property or,
+				// if they do, it shouldn't be set to "jsDate", so
+				// assume it is an options argument.
+				if (get_type(arguments[0]) == "[object Object]" && arguments[0]._type != "jsDate") {
+					var opts = this.options = arguments[0];
+					this.syntax= opts.syntax;
+					this.proxy = jsDate.createDate(opts.date);
+				}
+				else {
+					this.proxy = jsDate.createDate(arguments[0]);
+				}
+                break;
+            default:
+                var a = [];
+                for ( var i=0; i<arguments.length; i++ ) {
+                    a.push(arguments[i]);
+                }
+                this.proxy = new Date( this.utcOffset );
+                this.proxy.setFullYear.apply( this.proxy, a.slice(0,3) );
+                if ( a.slice(3).length ) {
+                    this.proxy.setHours.apply( this.proxy, a.slice(3) );
+                }
+                break;
+        }
+    };
+	
+	/**
+	 * @namespace Configuration options that will be used as defaults for all instances on the page.
+	 * @property {String} defaultLocale The default locale to use [en].
+	 * @property {String} syntax The default syntax to use [perl].
+	 */
+	jsDate.config = {
+		defaultLocale: 'en',
+		syntax: 'perl'
+	};
+		
+	/**
+	 * Add an arbitrary amount to the currently stored date
+	 * 
+	 * @param {Number} number      
+	 * @param {String} unit
+	 * @returns {jsDate}       
+	 */
+	 
+	jsDate.prototype.add = function(number, unit) {
+		var factor = multipliers[unit] || multipliers.day;
+		if (typeof factor == 'number') {
+			this.proxy.setTime(this.proxy.getTime() + (factor * number));
+		} else {
+			factor.add(this, number);
+		}
+		return this;
+	};
+		
+	/**
+	 * Create a new jqplot.date object with the same date
+	 * 
+	 * @returns {jsDate}
+	 */  
+	 
+	jsDate.prototype.clone = function() {
+			return new jsDate(this.proxy.getTime());
+	};
+
+	/**
+	 * Find the difference between this jsDate and another date.
+	 * 
+	 * @param {String| Number| Array| jsDate&nbsp;Object| Date&nbsp;Object} dateObj
+	 * @param {String} unit
+	 * @param {Boolean} allowDecimal
+	 * @returns {Number} Number of units difference between dates.
+	 */
+	 
+	jsDate.prototype.diff = function(dateObj, unit, allowDecimal) {
+		// ensure we have a Date object
+		dateObj = new jsDate(dateObj);
+		if (dateObj === null) {
+			return null;
+		}
+		// get the multiplying factor integer or factor function
+		var factor = multipliers[unit] || multipliers.day;
+		if (typeof factor == 'number') {
+			// multiply
+			var unitDiff = (this.proxy.getTime() - dateObj.proxy.getTime()) / factor;
+		} else {
+			// run function
+			var unitDiff = factor.diff(this.proxy, dateObj.proxy);
+		}
+		// if decimals are not allowed, round toward zero
+		return (allowDecimal ? unitDiff : Math[unitDiff > 0 ? 'floor' : 'ceil'](unitDiff));          
+	};
+	
+	/**
+	 * Get the abbreviated name of the current week day
+	 * 
+	 * @returns {String}
+	 */   
+	 
+	jsDate.prototype.getAbbrDayName = function() {
+		return jsDate.regional[this.locale]["dayNamesShort"][this.proxy.getDay()];
+	};
+	
+	/**
+	 * Get the abbreviated name of the current month
+	 * 
+	 * @returns {String}
+	 */
+	 
+	jsDate.prototype.getAbbrMonthName = function() {
+		return jsDate.regional[this.locale]["monthNamesShort"][this.proxy.getMonth()];
+	};
+	
+	/**
+	 * Get UPPER CASE AM or PM for the current time
+	 * 
+	 * @returns {String}
+	 */
+	 
+	jsDate.prototype.getAMPM = function() {
+		return this.proxy.getHours() >= 12 ? 'PM' : 'AM';
+	};
+	
+	/**
+	 * Get lower case am or pm for the current time
+	 * 
+	 * @returns {String}
+	 */
+	 
+	jsDate.prototype.getAmPm = function() {
+		return this.proxy.getHours() >= 12 ? 'pm' : 'am';
+	};
+	
+	/**
+	 * Get the century (19 for 20th Century)
+	 *
+	 * @returns {Integer} Century (19 for 20th century).
+	 */
+	jsDate.prototype.getCentury = function() { 
+		return parseInt(this.proxy.getFullYear()/100, 10);
+	};
+	
+	/**
+	 * Implements Date functionality
+	 */
+	jsDate.prototype.getDate = function() {
+		return this.proxy.getDate();
+	};
+	
+	/**
+	 * Implements Date functionality
+	 */
+	jsDate.prototype.getDay = function() {
+		return this.proxy.getDay();
+	};
+	
+	/**
+	 * Get the Day of week 1 (Monday) thru 7 (Sunday)
+	 * 
+	 * @returns {Integer} Day of week 1 (Monday) thru 7 (Sunday)
+	 */
+	jsDate.prototype.getDayOfWeek = function() { 
+		var dow = this.proxy.getDay(); 
+		return dow===0?7:dow; 
+	};
+	
+	/**
+	 * Get the day of the year
+	 * 
+	 * @returns {Integer} 1 - 366, day of the year
+	 */
+	jsDate.prototype.getDayOfYear = function() {
+		var d = this.proxy;
+		var ms = d - new Date('' + d.getFullYear() + '/1/1 GMT');
+		ms += d.getTimezoneOffset()*60000;
+		d = null;
+		return parseInt(ms/60000/60/24, 10)+1;
+	};
+	
+	/**
+	 * Get the name of the current week day
+	 * 
+	 * @returns {String}
+	 */  
+	 
+	jsDate.prototype.getDayName = function() {
+		return jsDate.regional[this.locale]["dayNames"][this.proxy.getDay()];
+	};
+	
+	/**
+	 * Get the week number of the given year, starting with the first Sunday as the first week
+	 * @returns {Integer} Week number (13 for the 13th full week of the year).
+	 */
+	jsDate.prototype.getFullWeekOfYear = function() {
+		var d = this.proxy;
+		var doy = this.getDayOfYear();
+		var rdow = 6-d.getDay();
+		var woy = parseInt((doy+rdow)/7, 10);
+		return woy;
+	};
+	
+	/**
+	 * Implements Date functionality
+	 */
+	jsDate.prototype.getFullYear = function() {
+		return this.proxy.getFullYear();
+	};
+	
+	/**
+	 * Get the GMT offset in hours and minutes (e.g. +06:30)
+	 * 
+	 * @returns {String}
+	 */
+	 
+	jsDate.prototype.getGmtOffset = function() {
+		// divide the minutes offset by 60
+		var hours = this.proxy.getTimezoneOffset() / 60;
+		// decide if we are ahead of or behind GMT
+		var prefix = hours < 0 ? '+' : '-';
+		// remove the negative sign if any
+		hours = Math.abs(hours);
+		// add the +/- to the padded number of hours to : to the padded minutes
+		return prefix + addZeros(Math.floor(hours), 2) + ':' + addZeros((hours % 1) * 60, 2);
+	};
+	
+	/**
+	 * Implements Date functionality
+	 */
+	jsDate.prototype.getHours = function() {
+		return this.proxy.getHours();
+	};
+	
+	/**
+	 * Get the current hour on a 12-hour scheme
+	 * 
+	 * @returns {Integer}
+	 */
+	 
+	jsDate.prototype.getHours12  = function() {
+		var hours = this.proxy.getHours();
+		return hours > 12 ? hours - 12 : (hours == 0 ? 12 : hours);
+	};
+	
+	
+	jsDate.prototype.getIsoWeek = function() {
+		var d = this.proxy;
+		var woy = d.getWeekOfYear();
+		var dow1_1 = (new Date('' + d.getFullYear() + '/1/1')).getDay();
+		// First week is 01 and not 00 as in the case of %U and %W,
+		// so we add 1 to the final result except if day 1 of the year
+		// is a Monday (then %W returns 01).
+		// We also need to subtract 1 if the day 1 of the year is 
+		// Friday-Sunday, so the resulting equation becomes:
+		var idow = woy + (dow1_1 > 4 || dow1_1 <= 1 ? 0 : 1);
+		if(idow == 53 && (new Date('' + d.getFullYear() + '/12/31')).getDay() < 4)
+		{
+			idow = 1;
+		}
+		else if(idow === 0)
+		{
+			d = new jsDate(new Date('' + (d.getFullYear()-1) + '/12/31'));
+			idow = d.getIsoWeek();
+		}
+		d = null;
+		return idow;
+	};
+	
+	/**
+	 * Implements Date functionality
+	 */
+	jsDate.prototype.getMilliseconds = function() {
+		return this.proxy.getMilliseconds();
+	};
+	
+	/**
+	 * Implements Date functionality
+	 */
+	jsDate.prototype.getMinutes = function() {
+		return this.proxy.getMinutes();
+	};
+	
+	/**
+	 * Implements Date functionality
+	 */
+	jsDate.prototype.getMonth = function() {
+		return this.proxy.getMonth();
+	};
+	
+	/**
+	 * Get the name of the current month
+	 * 
+	 * @returns {String}
+	 */
+	 
+	jsDate.prototype.getMonthName = function() {
+		return jsDate.regional[this.locale]["monthNames"][this.proxy.getMonth()];
+	};
+	
+	/**
+	 * Get the number of the current month, 1-12
+	 * 
+	 * @returns {Integer}
+	 */
+	 
+	jsDate.prototype.getMonthNumber = function() {
+		return this.proxy.getMonth() + 1;
+	};
+	
+	/**
+	 * Implements Date functionality
+	 */
+	jsDate.prototype.getSeconds = function() {
+		return this.proxy.getSeconds();
+	};
+	
+	/**
+	 * Return a proper two-digit year integer
+	 * 
+	 * @returns {Integer}
+	 */
+	 
+	jsDate.prototype.getShortYear = function() {
+		return this.proxy.getYear() % 100;
+	};
+	
+	/**
+	 * Implements Date functionality
+	 */
+	jsDate.prototype.getTime = function() {
+		return this.proxy.getTime();
+	};
+	
+	/**
+	 * Get the timezone abbreviation
+	 *
+	 * @returns {String} Abbreviation for the timezone
+	 */
+	jsDate.prototype.getTimezoneAbbr = function() {
+		return this.proxy.toString().replace(/^.*\(([^)]+)\)$/, '$1'); 
+	};
+	
+	/**
+	 * Get the browser-reported name for the current timezone (e.g. MDT, Mountain Daylight Time)
+	 * 
+	 * @returns {String}
+	 */
+	jsDate.prototype.getTimezoneName = function() {
+		var match = /(?:\((.+)\)$| ([A-Z]{3}) )/.exec(this.toString());
+		return match[1] || match[2] || 'GMT' + this.getGmtOffset();
+	}; 
+	
+	/**
+	 * Implements Date functionality
+	 */
+	jsDate.prototype.getTimezoneOffset = function() {
+		return this.proxy.getTimezoneOffset();
+	};
+	
+	
+	/**
+	 * Get the week number of the given year, starting with the first Monday as the first week
+	 * @returns {Integer} Week number (13 for the 13th week of the year).
+	 */
+	jsDate.prototype.getWeekOfYear = function() {
+		var doy = this.getDayOfYear();
+		var rdow = 7 - this.getDayOfWeek();
+		var woy = parseInt((doy+rdow)/7, 10);
+		return woy;
+	};
+	
+	/**
+	 * Get the current date as a Unix timestamp
+	 * 
+	 * @returns {Integer}
+	 */
+	 
+	jsDate.prototype.getUnix = function() {
+		return Math.round(this.proxy.getTime() / 1000, 0);
+	}; 
+	
+	/**
+	 * Implements Date functionality
+	 */
+	jsDate.prototype.getYear = function() {
+		return this.proxy.getYear();
+	};
+	
+	/**
+	 * Return a date one day ahead (or any other unit)
+	 * 
+	 * @param {String} unit Optional, year | month | day | week | hour | minute | second | millisecond
+	 * @returns {jsDate}
+	 */
+	 
+	jsDate.prototype.next = function(unit) {
+		unit = unit || 'day'
+		return this.clone().add(1, unit);
+	};
+	
+	/**
+	 * Set the jsDate instance to a new date.
+	 *
+	 * @param  {String | Number | Array | Date Object | jsDate Object | Options Object} arguments Optional arguments, 
+	 * either a parsable date/time string,
+	 * a JavaScript timestamp, an array of numbers of form [year, month, day, hours, minutes, seconds, milliseconds],
+	 * a Date object, jsDate Object or an options object of form {syntax: "perl", date:some Date} where all options are optional.
+	 */
+	jsDate.prototype.set = function() {
+        switch ( arguments.length ) {
+            case 0:
+                this.proxy = new Date();
+            case 1:
+				// other objects either won't have a _type property or,
+				// if they do, it shouldn't be set to "jsDate", so
+				// assume it is an options argument.
+				if (get_type(arguments[0]) == "[object Object]" && arguments[0]._type != "jsDate") {
+					var opts = this.options = arguments[0];
+					this.syntax= opts.syntax;
+					this.proxy = jsDate.createDate(opts.date);
+				}
+				else {
+					this.proxy = jsDate.createDate(arguments[0]);
+				}
+                break;
+            default:
+                var a = [];
+                for ( var i=0; i<arguments.length; i++ ) {
+                    a.push(arguments[i]);
+                }
+                this.proxy = new Date( this.utcOffset );
+                this.proxy.setFullYear.apply( this.proxy, a.slice(0,3) );
+                if ( a.slice(3).length ) {
+                    this.proxy.setHours.apply( this.proxy, a.slice(3) );
+                }
+                break;
+        }
+	};
+	
+	/**
+	 * Sets the day of the month for a specified date according to local time.
+	 * @param {Integer} dayValue An integer from 1 to 31, representing the day of the month. 
+	 */
+	jsDate.prototype.setDate = function(n) {
+		this.proxy.setDate(n);
+	};
+	
+	/**
+	 * Sets the full year for a specified date according to local time.
+	 * @param {Integer} yearValue The numeric value of the year, for example, 1995.  
+	 * @param {Integer} monthValue Optional, between 0 and 11 representing the months January through December.  
+	 * @param {Integer} dayValue Optional, between 1 and 31 representing the day of the month. If you specify the dayValue parameter, you must also specify the monthValue. 
+	 */
+	jsDate.prototype.setFullYear = function() {
+		this.proxy.setFullYear.apply(this.proxy, arguments);
+	};
+	
+	/**
+	 * Sets the hours for a specified date according to local time.
+	 * 
+	 * @param {Integer} hoursValue An integer between 0 and 23, representing the hour.  
+	 * @param {Integer} minutesValue Optional, An integer between 0 and 59, representing the minutes.  
+	 * @param {Integer} secondsValue Optional, An integer between 0 and 59, representing the seconds. 
+	 * If you specify the secondsValue parameter, you must also specify the minutesValue.  
+	 * @param {Integer} msValue Optional, A number between 0 and 999, representing the milliseconds. 
+	 * If you specify the msValue parameter, you must also specify the minutesValue and secondsValue. 
+	 */
+	jsDate.prototype.setHours = function() {
+		this.proxy.setHours.apply(this.proxy, arguments);
+	};
+	
+	/**
+	 * Implements Date functionality
+	 */	
+	jsDate.prototype.setMilliseconds = function(n) {
+		this.proxy.setMilliseconds(n);
+	};
+	
+	/**
+	 * Implements Date functionality
+	 */	
+	jsDate.prototype.setMinutes = function() {
+		this.proxy.setMinutes.apply(this.proxy, arguments);
+	};
+	
+	/**
+	 * Implements Date functionality
+	 */	
+	jsDate.prototype.setMonth = function() {
+		this.proxy.setMonth.apply(this.proxy, arguments);
+	};
+	
+	/**
+	 * Implements Date functionality
+	 */	
+	jsDate.prototype.setSeconds = function() {
+		this.proxy.setSeconds.apply(this.proxy, arguments);
+	};
+	
+	/**
+	 * Implements Date functionality
+	 */	
+	jsDate.prototype.setTime = function(n) {
+		this.proxy.setTime(n);
+	};
+	
+	/**
+	 * Implements Date functionality
+	 */	
+	jsDate.prototype.setYear = function() {
+		this.proxy.setYear.apply(this.proxy, arguments);
+	};
+	
+	/**
+	 * Provide a formatted string representation of this date.
+	 * 
+	 * @param {String} formatString A format string.  
+	 * See: {@link jsDate.formats}.
+	 * @returns {String} Date String.
+	 */
+			
+	jsDate.prototype.strftime = function(formatString) {
+		formatString = formatString || this.formatString || jsDate.regional[this.locale]['formatString'];
+		return jsDate.strftime(this, formatString, this.syntax);
+	};
+        
+	/**
+	 * Return a String representation of this jsDate object.
+	 * @returns {String} Date string.
+	 */
+	
+	jsDate.prototype.toString = function() {
+		return this.proxy.toString();
+	};
+		
+	/**
+	 * Convert the current date to an 8-digit integer (%Y%m%d)
+	 * 
+	 * @returns {Integer}
+	 */
+	 
+	jsDate.prototype.toYmdInt = function() {
+		return (this.proxy.getFullYear() * 10000) + (this.getMonthNumber() * 100) + this.proxy.getDate();
+	};
+	
+	/**
+	 * @namespace Holds localizations for month/day names.
+	 * <p>jsDate attempts to detect locale when loaded and defaults to 'en'.
+	 * If a localization is detected which is not available, jsDate defaults to 'en'.
+	 * Additional localizations can be added after jsDate loads.  After adding a localization,
+	 * call the jsDate.regional.getLocale() method.  Currently, en, fr and de are defined.</p>
+	 * 
+	 * <p>Localizations must be an object and have the following properties defined:  monthNames, monthNamesShort, dayNames, dayNamesShort and Localizations are added like:</p>
+	 * <pre class="code">
+	 * jsDate.regional['en'] = {
+	 * monthNames      : 'January February March April May June July August September October November December'.split(' '),
+	 * monthNamesShort : 'Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec'.split(' '),
+	 * dayNames        : 'Sunday Monday Tuesday Wednesday Thursday Friday Saturday'.split(' '),
+	 * dayNamesShort   : 'Sun Mon Tue Wed Thu Fri Sat'.split(' ')
+	 * };
+	 * </pre>
+	 * <p>After adding localizations, call <code>jsDate.regional.getLocale();</code> to update the locale setting with the
+	 * new localizations.</p>
+	 */
+	 
+	jsDate.regional = {
+		'en': {
+			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'],
+			formatString: '%Y-%m-%d %H:%M:%S'
+		},
+		
+		'fr': {
+			monthNames: ['Janvier','Février','Mars','Avril','Mai','Juin','Juillet','Août','Septembre','Octobre','Novembre','Décembre'],
+			monthNamesShort: ['Jan','Fév','Mar','Avr','Mai','Jun','Jul','Aoû','Sep','Oct','Nov','Déc'],
+			dayNames: ['Dimanche','Lundi','Mardi','Mercredi','Jeudi','Vendredi','Samedi'],
+			dayNamesShort: ['Dim','Lun','Mar','Mer','Jeu','Ven','Sam'],
+			formatString: '%Y-%m-%d %H:%M:%S'
+		},
+		
+		'de': {
+			monthNames: ['Januar','Februar','März','April','Mai','Juni','Juli','August','September','Oktober','November','Dezember'],
+			monthNamesShort: ['Jan','Feb','Mär','Apr','Mai','Jun','Jul','Aug','Sep','Okt','Nov','Dez'],
+			dayNames: ['Sonntag','Montag','Dienstag','Mittwoch','Donnerstag','Freitag','Samstag'],
+			dayNamesShort: ['So','Mo','Di','Mi','Do','Fr','Sa'],
+			formatString: '%Y-%m-%d %H:%M:%S'
+		},
+		
+		'es': {
+			monthNames: ['Enero','Febrero','Marzo','Abril','Mayo','Junio', 'Julio','Agosto','Septiembre','Octubre','Noviembre','Diciembre'],
+			monthNamesShort: ['Ene','Feb','Mar','Abr','May','Jun', 'Jul','Ago','Sep','Oct','Nov','Dic'],
+			dayNames: ['Domingo','Lunes','Martes','Mi&eacute;rcoles','Jueves','Viernes','S&aacute;bado'],
+			dayNamesShort: ['Dom','Lun','Mar','Mi&eacute;','Juv','Vie','S&aacute;b'],
+			formatString: '%Y-%m-%d %H:%M:%S'
+		},
+		
+		'ru': {
+			monthNames: ['Январь','Февраль','Март','Апрель','Май','Июнь','Июль','Август','Сентябрь','Октябрь','Ноябрь','Декабрь'],
+			monthNamesShort: ['Янв','Фев','Мар','Апр','Май','Июн','Июл','Авг','Сен','Окт','Ноя','Дек'],
+			dayNames: ['воскресенье','понедельник','вторник','среда','четверг','пятница','суббота'],
+			dayNamesShort: ['вск','пнд','втр','срд','чтв','птн','сбт'],
+			formatString: '%Y-%m-%d %H:%M:%S'
+		},
+		
+		'ar': {
+			monthNames: ['كانون الثاني', 'شباط', 'آذار', 'نيسان', 'آذار', 'حزيران','تموز', 'آب', 'أيلول',	'تشرين الأول', 'تشرين الثاني', 'كانون الأول'],
+			monthNamesShort: ['1','2','3','4','5','6','7','8','9','10','11','12'],
+			dayNames: ['السبت', 'الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة'],
+			dayNamesShort: ['سبت', 'أحد', 'اثنين', 'ثلاثاء', 'أربعاء', 'خميس', 'جمعة'],
+			formatString: '%Y-%m-%d %H:%M:%S'
+		},
+		
+		'pt': {
+			monthNames: ['Janeiro','Fevereiro','Mar&ccedil;o','Abril','Maio','Junho','Julho','Agosto','Setembro','Outubro','Novembro','Dezembro'],
+			monthNamesShort: ['Jan','Fev','Mar','Abr','Mai','Jun','Jul','Ago','Set','Out','Nov','Dez'],
+			dayNames: ['Domingo','Segunda-feira','Ter&ccedil;a-feira','Quarta-feira','Quinta-feira','Sexta-feira','S&aacute;bado'],
+			dayNamesShort: ['Dom','Seg','Ter','Qua','Qui','Sex','S&aacute;b'],
+			formatString: '%Y-%m-%d %H:%M:%S'	
+		},
+		
+		'pt-BR': {
+			monthNames: ['Janeiro','Fevereiro','Mar&ccedil;o','Abril','Maio','Junho', 'Julho','Agosto','Setembro','Outubro','Novembro','Dezembro'],
+			monthNamesShort: ['Jan','Fev','Mar','Abr','Mai','Jun','Jul','Ago','Set','Out','Nov','Dez'],
+			dayNames: ['Domingo','Segunda-feira','Ter&ccedil;a-feira','Quarta-feira','Quinta-feira','Sexta-feira','S&aacute;bado'],
+			dayNamesShort: ['Dom','Seg','Ter','Qua','Qui','Sex','S&aacute;b'],
+			formatString: '%Y-%m-%d %H:%M:%S'
+		}
+		
+	
+	};
+	
+	// Set english variants to 'en'
+	jsDate.regional['en-US'] = jsDate.regional['en-GB'] = jsDate.regional['en'];
+	
+	/**
+	 * Try to determine the users locale based on the lang attribute of the html page.  Defaults to 'en'
+	 * if it cannot figure out a locale of if the locale does not have a localization defined.
+	 * @returns {String} locale
+	 */
+	 
+	jsDate.regional.getLocale = function () {
+		var l = jsDate.config.defaultLocale;
+		
+		if ( document && document.getElementsByTagName('html') && document.getElementsByTagName('html')[0].lang ) {
+			l = document.getElementsByTagName('html')[0].lang;
+			if (!jsDate.regional.hasOwnProperty(l)) {
+				l = jsDate.config.defaultLocale;
+			}
+		}
+		
+		return l;
+	};
+	
+	// ms in day
+    var day = 24 * 60 * 60 * 1000;
+	
+    // padd a number with zeros
+    var addZeros = function(num, digits) {
+        num = String(num);
+		var i = digits - num.length;
+		var s = String(Math.pow(10, i)).slice(1);
+		return s.concat(num);
+    };
+
+	// representations used for calculating differences between dates.
+	// This borrows heavily from Ken Snyder's work.
+    var multipliers = {
+        millisecond: 1,
+        second: 1000,
+        minute: 60 * 1000,
+        hour: 60 * 60 * 1000,
+        day: day,
+        week: 7 * day,
+        month: {
+            // add a number of months
+            add: function(d, number) {
+                // add any years needed (increments of 12)
+                multipliers.year.add(d, Math[number > 0 ? 'floor' : 'ceil'](number / 12));
+                // ensure that we properly wrap betwen December and January
+                var prevMonth = d.getMonth() + (number % 12);
+                if (prevMonth == 12) {
+                    prevMonth = 0;
+                    d.setYear(d.getFullYear() + 1);
+                } else if (prevMonth == -1) {
+                    prevMonth = 11;
+                    d.setYear(d.getFullYear() - 1);
+                }
+                d.setMonth(prevMonth);
+            },
+            // get the number of months between two Date objects (decimal to the nearest day)
+            diff: function(d1, d2) {
+                // get the number of years
+                var diffYears = d1.getFullYear() - d2.getFullYear();
+                // get the number of remaining months
+                var diffMonths = d1.getMonth() - d2.getMonth() + (diffYears * 12);
+                // get the number of remaining days
+                var diffDays = d1.getDate() - d2.getDate();
+                // return the month difference with the days difference as a decimal
+                return diffMonths + (diffDays / 30);
+            }
+        },
+        year: {
+            // add a number of years
+            add: function(d, number) {
+                d.setYear(d.getFullYear() + Math[number > 0 ? 'floor' : 'ceil'](number));
+            },
+            // get the number of years between two Date objects (decimal to the nearest day)
+            diff: function(d1, d2) {
+                return multipliers.month.diff(d1, d2) / 12;
+            }
+        }        
+    };
+    //
+    // Alias each multiplier with an 's' to allow 'year' and 'years' for example.
+	// This comes from Ken Snyders work.
+    //
+    for (var unit in multipliers) {
+        if (unit.substring(unit.length - 1) != 's') { // IE will iterate newly added properties :|
+            multipliers[unit + 's'] = multipliers[unit];
+        }
+    }
+	
+    //
+    // take a jsDate instance and a format code and return the formatted value.
+	// This is a somewhat modified version of Ken Snyder's method.
+    //
+    var format = function(d, code, syntax) {
+		// if shorcut codes are used, recursively expand those.
+		if (jsDate.formats[syntax]["shortcuts"][code]) {
+			return jsDate.strftime(d, jsDate.formats[syntax]["shortcuts"][code], syntax);
+		} else {
+			// get the format code function and addZeros() argument
+			var getter = (jsDate.formats[syntax]["codes"][code] || '').split('.');
+			var nbr = d['get' + getter[0]] ? d['get' + getter[0]]() : '';
+			if (getter[1]) {
+				nbr = addZeros(nbr, getter[1]);
+			}
+			return nbr;
+		}       
+    };
+    
+    /**
+	 * @static
+	 * Static function for convert a date to a string according to a given format.  Also acts as namespace for strftime format codes.
+	 * <p>strftime formatting can be accomplished without creating a jsDate object by calling jsDate.strftime():</p>
+	 * <pre class="code">
+	 * var formattedDate = jsDate.strftime('Feb 8, 2006 8:48:32', '%Y-%m-%d %H:%M:%S');
+	 * </pre>
+	 * @param {String | Number | Array | jsDate&nbsp;Object | Date&nbsp;Object} date A parsable date string, JavaScript time stamp, Array of form [year, month, day, hours, minutes, seconds, milliseconds], jsDate Object or Date object.
+	 * @param {String} formatString String with embedded date formatting codes.  
+	 * See: {@link jsDate.formats}. 
+	 * @param {String} syntax Optional syntax to use [default perl].
+	 * @param {String} locale Optional locale to use.
+	 * @returns {String} Formatted representation of the date.
+    */
+    //
+	// Logic as implemented here is very similar to Ken Snyder's Date Instance Methods.
+	//
+    jsDate.strftime = function(d, formatString, syntax, locale) {
+		var syn = 'perl';
+		var loc = jsDate.regional.getLocale();
+		
+		// check if syntax and locale are available or reversed
+		if (syntax && jsDate.formats.hasOwnProperty(syntax)) {
+			syn = syntax;
+		}
+		else if (syntax && jsDate.regional.hasOwnProperty(syntax)) {
+			loc = syntax;
+		}
+		
+		if (locale && jsDate.formats.hasOwnProperty(locale)) {
+			syn = locale;
+		}
+		else if (locale && jsDate.regional.hasOwnProperty(locale)) {
+			loc = locale;
+		}
+		
+        if (get_type(d) != "[object Object]" || d._type != "jsDate") {
+            d = new jsDate(d);
+			d.locale = loc;
+        }
+		if (!formatString) {
+			formatString = d.formatString || jsDate.regional[loc]['formatString'];
+		}
+        // default the format string to year-month-day
+        var source = formatString || '%Y-%m-%d', 
+			result = '', 
+			match;
+        // replace each format code
+        while (source.length > 0) {
+            if (match = source.match(jsDate.formats[syn].codes.matcher)) {
+                result += source.slice(0, match.index);
+                result += (match[1] || '') + format(d, match[2], syn);
+                source = source.slice(match.index + match[0].length);
+            } else {
+                result += source;
+                source = '';
+            }
+        }
+        return result;
+    };
+	
+	/**
+	 * @namespace
+	 * Namespace to hold format codes and format shortcuts.  "perl" and "php" format codes 
+	 * and shortcuts are defined by default.  Additional codes and shortcuts can be
+	 * added like:
+	 * 
+	 * <pre class="code">
+	 * jsDate.formats["perl"] = {
+	 *     "codes": {
+	 *         matcher: /someregex/,
+	 *         Y: "fullYear",  // name of "get" method without the "get",
+	 *         ...,            // more codes
+	 *     },
+	 *     "shortcuts": {
+	 *         F: '%Y-%m-%d',
+	 *         ...,            // more shortcuts
+	 *     }
+	 * };
+	 * </pre>
+	 * 
+	 * <p>Additionally, ISO and SQL shortcuts are defined and can be accesses via:
+	 * <code>jsDate.formats.ISO</code> and <code>jsDate.formats.SQL</code>
+	 */
+	
+	jsDate.formats = {
+		ISO:'%Y-%m-%dT%H:%M:%S.%N%G',
+		SQL:'%Y-%m-%d %H:%M:%S'
+	};
+	
+	/**
+	 * Perl format codes and shortcuts for strftime.
+	 * 
+	 * A hash (object) of codes where each code must be an array where the first member is 
+	 * the name of a Date.prototype or jsDate.prototype function to call
+	 * and optionally a second member indicating the number to pass to addZeros()
+	 * 
+	 * <p>The following format codes are defined:</p>
+	 * 
+	 * <pre class="code">
+	 * Code    Result                    Description
+	 * == Years ==           
+	 * %Y      2008                      Four-digit year
+	 * %y      08                        Two-digit year
+	 * 
+	 * == Months ==          
+	 * %m      09                        Two-digit month
+	 * %#m     9                         One or two-digit month
+	 * %B      September                 Full month name
+	 * %b      Sep                       Abbreviated month name
+	 * 
+	 * == Days ==            
+	 * %d      05                        Two-digit day of month
+	 * %#d     5                         One or two-digit day of month
+	 * %e      5                         One or two-digit day of month
+	 * %A      Sunday                    Full name of the day of the week
+	 * %a      Sun                       Abbreviated name of the day of the week
+	 * %w      0                         Number of the day of the week (0 = Sunday, 6 = Saturday)
+	 * 
+	 * == Hours ==           
+	 * %H      23                        Hours in 24-hour format (two digits)
+	 * %#H     3                         Hours in 24-hour integer format (one or two digits)
+	 * %I      11                        Hours in 12-hour format (two digits)
+	 * %#I     3                         Hours in 12-hour integer format (one or two digits)
+	 * %p      PM                        AM or PM
+	 * 
+	 * == Minutes ==         
+	 * %M      09                        Minutes (two digits)
+	 * %#M     9                         Minutes (one or two digits)
+	 * 
+	 * == Seconds ==         
+	 * %S      02                        Seconds (two digits)
+	 * %#S     2                         Seconds (one or two digits)
+	 * %s      1206567625723             Unix timestamp (Seconds past 1970-01-01 00:00:00)
+	 * 
+	 * == Milliseconds ==    
+	 * %N      008                       Milliseconds (three digits)
+	 * %#N     8                         Milliseconds (one to three digits)
+	 * 
+	 * == Timezone ==        
+	 * %O      360                       difference in minutes between local time and GMT
+	 * %Z      Mountain Standard Time    Name of timezone as reported by browser
+	 * %G      06:00                     Hours and minutes between GMT
+	 * 
+	 * == Shortcuts ==       
+	 * %F      2008-03-26                %Y-%m-%d
+	 * %T      05:06:30                  %H:%M:%S
+	 * %X      05:06:30                  %H:%M:%S
+	 * %x      03/26/08                  %m/%d/%y
+	 * %D      03/26/08                  %m/%d/%y
+	 * %#c     Wed Mar 26 15:31:00 2008  %a %b %e %H:%M:%S %Y
+	 * %v      3-Sep-2008                %e-%b-%Y
+	 * %R      15:31                     %H:%M
+	 * %r      03:31:00 PM               %I:%M:%S %p
+	 * 
+	 * == Characters ==      
+	 * %n      \n                        Newline
+	 * %t      \t                        Tab
+	 * %%      %                         Percent Symbol
+	 * </pre>
+	 * 
+	 * <p>Formatting shortcuts that will be translated into their longer version.
+	 * Be sure that format shortcuts do not refer to themselves: this will cause an infinite loop.</p>
+	 * 
+	 * <p>Format codes and format shortcuts can be redefined after the jsDate
+	 * module is imported.</p>
+	 * 
+	 * <p>Note that if you redefine the whole hash (object), you must supply a "matcher"
+	 * regex for the parser.  The default matcher is:</p>
+	 * 
+	 * <code>/()%(#?(%|[a-z]))/i</code>
+	 * 
+	 * <p>which corresponds to the Perl syntax used by default.</p>
+	 * 
+	 * <p>By customizing the matcher and format codes, nearly any strftime functionality is possible.</p>
+	 */
+	 
+	jsDate.formats.perl = {
+		codes: {
+			//
+			// 2-part regex matcher for format codes
+			//
+			// first match must be the character before the code (to account for escaping)
+			// second match must be the format code character(s)
+			//
+			matcher: /()%(#?(%|[a-z]))/i,
+			// year
+			Y: 'FullYear',
+			y: 'ShortYear.2',
+			// month
+			m: 'MonthNumber.2',
+			'#m': 'MonthNumber',
+			B: 'MonthName',
+			b: 'AbbrMonthName',
+			// day
+			d: 'Date.2',
+			'#d': 'Date',
+			e: 'Date',
+			A: 'DayName',
+			a: 'AbbrDayName',
+			w: 'Day',
+			// hours
+			H: 'Hours.2',
+			'#H': 'Hours',
+			I: 'Hours12.2',
+			'#I': 'Hours12',
+			p: 'AMPM',
+			// minutes
+			M: 'Minutes.2',
+			'#M': 'Minutes',
+			// seconds
+			S: 'Seconds.2',
+			'#S': 'Seconds',
+			s: 'Unix',
+			// milliseconds
+			N: 'Milliseconds.3',
+			'#N': 'Milliseconds',
+			// timezone
+			O: 'TimezoneOffset',
+			Z: 'TimezoneName',
+			G: 'GmtOffset'  
+		},
+		
+		shortcuts: {
+			// date
+			F: '%Y-%m-%d',
+			// time
+			T: '%H:%M:%S',
+			X: '%H:%M:%S',
+			// local format date
+			x: '%m/%d/%y',
+			D: '%m/%d/%y',
+			// local format extended
+			'#c': '%a %b %e %H:%M:%S %Y',
+			// local format short
+			v: '%e-%b-%Y',
+			R: '%H:%M',
+			r: '%I:%M:%S %p',
+			// tab and newline
+			t: '\t',
+			n: '\n',
+			'%': '%'
+		}
+	};
+	
+	/**
+	 * PHP format codes and shortcuts for strftime.
+	 * 
+	 * A hash (object) of codes where each code must be an array where the first member is 
+	 * the name of a Date.prototype or jsDate.prototype function to call
+	 * and optionally a second member indicating the number to pass to addZeros()
+	 * 
+	 * <p>The following format codes are defined:</p>
+	 * 
+	 * <pre class="code">
+	 * Code    Result                    Description
+	 * === Days ===        
+	 * %a      Sun through Sat           An abbreviated textual representation of the day
+	 * %A      Sunday - Saturday         A full textual representation of the day
+	 * %d      01 to 31                  Two-digit day of the month (with leading zeros)
+	 * %e      1 to 31                   Day of the month, with a space preceding single digits.
+	 * %j      001 to 366                Day of the year, 3 digits with leading zeros
+	 * %u      1 - 7 (Mon - Sun)         ISO-8601 numeric representation of the day of the week
+	 * %w      0 - 6 (Sun - Sat)         Numeric representation of the day of the week
+	 *                                  
+	 * === Week ===                     
+	 * %U      13                        Full Week number, starting with the first Sunday as the first week
+	 * %V      01 through 53             ISO-8601:1988 week number, starting with the first week of the year 
+	 *                                   with at least 4 weekdays, with Monday being the start of the week
+	 * %W      46                        A numeric representation of the week of the year, 
+	 *                                   starting with the first Monday as the first week
+	 * === Month ===                    
+	 * %b      Jan through Dec           Abbreviated month name, based on the locale
+	 * %B      January - December        Full month name, based on the locale
+	 * %h      Jan through Dec           Abbreviated month name, based on the locale (an alias of %b)
+	 * %m      01 - 12 (Jan - Dec)       Two digit representation of the month
+	 * 
+	 * === Year ===                     
+	 * %C      19                        Two digit century (year/100, truncated to an integer)
+	 * %y      09 for 2009               Two digit year
+	 * %Y      2038                      Four digit year
+	 * 
+	 * === Time ===                     
+	 * %H      00 through 23             Two digit representation of the hour in 24-hour format
+	 * %I      01 through 12             Two digit representation of the hour in 12-hour format
+	 * %l      1 through 12              Hour in 12-hour format, with a space preceeding single digits
+	 * %M      00 through 59             Two digit representation of the minute
+	 * %p      AM/PM                     UPPER-CASE 'AM' or 'PM' based on the given time
+	 * %P      am/pm                     lower-case 'am' or 'pm' based on the given time
+	 * %r      09:34:17 PM               Same as %I:%M:%S %p
+	 * %R      00:35                     Same as %H:%M
+	 * %S      00 through 59             Two digit representation of the second
+	 * %T      21:34:17                  Same as %H:%M:%S
+	 * %X      03:59:16                  Preferred time representation based on locale, without the date
+	 * %z      -0500 or EST              Either the time zone offset from UTC or the abbreviation
+	 * %Z      -0500 or EST              The time zone offset/abbreviation option NOT given by %z
+	 * 
+	 * === Time and Date ===            
+	 * %D      02/05/09                  Same as %m/%d/%y
+	 * %F      2009-02-05                Same as %Y-%m-%d (commonly used in database datestamps)
+	 * %s      305815200                 Unix Epoch Time timestamp (same as the time() function)
+	 * %x      02/05/09                  Preferred date representation, without the time
+	 * 
+	 * === Miscellaneous ===            
+	 * %n        ---                     A newline character (\n)
+	 * %t        ---                     A Tab character (\t)
+	 * %%        ---                     A literal percentage character (%)
+	 * </pre>
+	 */
+ 
+	jsDate.formats.php = {
+		codes: {
+			//
+			// 2-part regex matcher for format codes
+			//
+			// first match must be the character before the code (to account for escaping)
+			// second match must be the format code character(s)
+			//
+			matcher: /()%((%|[a-z]))/i,
+			// day
+			a: 'AbbrDayName',
+			A: 'DayName',
+			d: 'Date.2',
+			e: 'Date',
+			j: 'DayOfYear.3',
+			u: 'DayOfWeek',
+			w: 'Day',
+			// week
+			U: 'FullWeekOfYear.2',
+			V: 'IsoWeek.2',
+			W: 'WeekOfYear.2',
+			// month
+			b: 'AbbrMonthName',
+			B: 'MonthName',
+			m: 'MonthNumber.2',
+			h: 'AbbrMonthName',
+			// year
+			C: 'Century.2',
+			y: 'ShortYear.2',
+			Y: 'FullYear',
+			// time
+			H: 'Hours.2',
+			I: 'Hours12.2',
+			l: 'Hours12',
+			p: 'AMPM',
+			P: 'AmPm',
+			M: 'Minutes.2',
+			S: 'Seconds.2',
+			s: 'Unix',
+			O: 'TimezoneOffset',
+			z: 'GmtOffset',
+			Z: 'TimezoneAbbr',
+		},
+		
+		shortcuts: {
+			D: '%m/%d/%y',
+			F: '%Y-%m-%d',
+			T: '%H:%M:%S',
+			X: '%H:%M:%S',
+			x: '%m/%d/%y',
+			R: '%H:%M',
+			r: '%I:%M:%S %p',
+			t: '\t',
+			n: '\n',
+			'%': '%'
+		}
+	};   
+	//
+	// Conceptually, the logic implemented here is similar to Ken Snyder's Date Instance Methods.
+	// I use his idea of a set of parsers which can be regular expressions or functions,
+	// iterating through those, and then seeing if Date.parse() will create a date.
+	// The parser expressions and functions are a little different and some bugs have been
+	// worked out.  Also, a lot of "pre-parsing" is done to fix implementation
+	// variations of Date.parse() between browsers.
+	//
+    jsDate.createDate = function(date) {
+        // if passing in multiple arguments, try Date constructor
+        if (date == null) {
+            return new Date();
+        }
+        // If the passed value is already a date object, return it
+        if (date instanceof Date) {
+            return date;
+        }
+        // if (typeof date == 'number') return new Date(date * 1000);
+        // If the passed value is an integer, interpret it as a javascript timestamp
+        if (typeof date == 'number') {
+            return new Date(date);
+        }
+        
+		// Before passing strings into Date.parse(), have to normalize them for certain conditions.
+		// If strings are not formatted staccording to the EcmaScript spec, results from Date parse will be implementation dependent.  
+		// 
+		// For example: 
+		//  * FF and Opera assume 2 digit dates are pre y2k, Chome assumes <50 is pre y2k, 50+ is 21st century.  
+		//  * Chrome will correctly parse '1984-1-25' into localtime, FF and Opera will not parse.
+		//  * Both FF, Chrome and Opera will parse '1984/1/25' into localtime.
+        
+        // remove leading and trailing spaces
+        var parsable = String(date).replace(/^\s*(.+)\s*$/g, '$1');
+        
+        // replace dahses (-) with slashes (/) in dates like n[nnn]/n[n]/n[nnn]
+        parsable = parsable.replace(/^([0-9]{1,4})-([0-9]{1,2})-([0-9]{1,4})/, "$1/$2/$3");
+        
+        /////////
+        // Need to check for '15-Dec-09' also.
+        // FF will not parse, but Chrome will.
+        // Chrome will set date to 2009 as well.
+        /////////
+        
+        // first check for 'dd-mmm-yyyy' or 'dd/mmm/yyyy' like '15-Dec-2010'
+        parsable = parsable.replace(/^(3[01]|[0-2]?\d)[-\/]([a-z]{3,})[-\/](\d{4})/i, "$1 $2 $3");
+        
+        // Now check for 'dd-mmm-yy' or 'dd/mmm/yy' and normalize years to 1900.
+        var match = parsable.match(/^(3[01]|[0-2]?\d)[-\/]([a-z]{3,})[-\/](\d{2})\D*/i);
+        if (match && match.length > 3) {
+            var m3 = parseFloat(match[3]);
+            var ny = 1900 + m3;
+            ny = String(ny);
+            
+            // now replace 2 digit year with 4 digit year
+            parsable = parsable.replace(/^(3[01]|[0-2]?\d)[-\/]([a-z]{3,})[-\/](\d{2})\D*/i, match[1] +' '+ match[2] +' '+ ny);
+            
+        }
+        
+        // Check for '1/19/70 8:14PM'
+        // where starts with mm/dd/yy or yy/mm/dd and have something after
+        // Check if 1st postiion is greater than 12, assume it is year.
+        // Assme all 2 digit years are 1900's.
+        // Finally, change them into US style mm/dd/yyyy representations.
+        match = parsable.match(/^([0-9]{1,2})[-\/]([0-9]{1,2})[-\/]([0-9]{1,2})[^0-9]/);
+        
+        function h1(parsable, match) {
+            var m1 = parseFloat(match[1]);
+            var m2 = parseFloat(match[2]);
+            var m3 = parseFloat(match[3]);
+            var cent = 1900;
+            var ny, nd, nm, str;
+            
+            if (m1 > 31) { // first number is a year
+                nd = m3;
+                nm = m2;
+                ny = cent + m1;
+            }
+            
+            else { // last number is the year
+                nd = m2;
+                nm = m1;
+                ny = cent + m3;
+            }
+            
+            str = nm+'/'+nd+'/'+ny;
+            
+            // now replace 2 digit year with 4 digit year
+            return  parsable.replace(/^([0-9]{1,2})[-\/]([0-9]{1,2})[-\/]([0-9]{1,2})/, str);
+        
+        }
+        
+        if (match && match.length > 3) {
+            parsable = h1(parsable, match);
+        }
+        
+        // Now check for '1/19/70' with nothing after and do as above
+        var match = parsable.match(/^([0-9]{1,2})[-\/]([0-9]{1,2})[-\/]([0-9]{1,2})$/);
+        
+        if (match && match.length > 3) {
+            parsable = h1(parsable, match);
+        }
+                
+        
+        var i = 0;
+        var length = jsDate.matchers.length;
+        var pattern;
+        var current = parsable;
+        while (i < length) {
+            ms = Date.parse(current);
+            if (!isNaN(ms)) {
+                return new Date(ms);
+            }
+            pattern = jsDate.matchers[i];
+            if (typeof pattern == 'function') {
+                obj = pattern.call(jsDate, current);
+                if (obj instanceof Date) {
+                    return obj;
+                }
+            } else {
+                current = parsable.replace(pattern[0], pattern[1]);
+            }
+            i++;
+        }
+        return NaN;
+    };
+    
+
+    /**
+	 * @static
+	 * Handy static utility function to return the number of days in a given month.
+	 * @param {Integer} year Year
+	 * @param {Integer} month Month (1-12)
+	 * @returns {Integer} Number of days in the month.
+    */
+	//
+	// handy utility method Borrowed right from Ken Snyder's Date Instance Mehtods.
+	// 
+    jsDate.daysInMonth = function(year, month) {
+        if (month == 2) {
+            return new Date(year, 1, 29).getDate() == 29 ? 29 : 28;
+        }
+        return [undefined,31,undefined,31,30,31,30,31,31,30,31,30,31][month];
+    };
+
+
+	//
+	// An Array of regular expressions or functions that will attempt to match the date string.
+	// Functions are called with scope of a jsDate instance.
+    //
+    jsDate.matchers = [
+		// convert dd.mmm.yyyy to mm/dd/yyyy (world date to US date).
+        [/(3[01]|[0-2]\d)\s*\.\s*(1[0-2]|0\d)\s*\.\s*([1-9]\d{3})/, '$2/$1/$3'],
+		// convert yyyy-mm-dd to mm/dd/yyyy (ISO date to US date).
+        [/([1-9]\d{3})\s*-\s*(1[0-2]|0\d)\s*-\s*(3[01]|[0-2]\d)/, '$2/$3/$1'],
+		// Handle 12 hour or 24 hour time with milliseconds am/pm and optional date part.
+        function(str) { 
+            var match = str.match(/^(?:(.+)\s+)?([012]?\d)(?:\s*\:\s*(\d\d))?(?:\s*\:\s*(\d\d(\.\d*)?))?\s*(am|pm)?\s*$/i);
+            //                   opt. date      hour       opt. minute     opt. second       opt. msec   opt. am or pm
+            if (match) {
+                if (match[1]) {
+                    var d = this.createDate(match[1]);
+                    if (isNaN(d)) {
+                        return;
+                    }
+                } else {
+                    var d = new Date();
+                    d.setMilliseconds(0);
+                }
+                var hour = parseFloat(match[2]);
+                if (match[6]) {
+                    hour = match[6].toLowerCase() == 'am' ? (hour == 12 ? 0 : hour) : (hour == 12 ? 12 : hour + 12);
+                }
+                d.setHours(hour, parseInt(match[3] || 0, 10), parseInt(match[4] || 0, 10), ((parseFloat(match[5] || 0)) || 0)*1000);
+                return d;
+            }
+            else {
+                return str;
+            }
+        },
+		// Handle ISO timestamp with time zone.
+        function(str) {
+            var match = str.match(/^(?:(.+))[T|\s+]([012]\d)(?:\:(\d\d))(?:\:(\d\d))(?:\.\d+)([\+\-]\d\d\:\d\d)$/i);
+            if (match) {
+                if (match[1]) {
+                    var d = this.createDate(match[1]);
+                    if (isNaN(d)) {
+                        return;
+                    }
+                } else {
+                    var d = new Date();
+                    d.setMilliseconds(0);
+                }
+                var hour = parseFloat(match[2]);
+                d.setHours(hour, parseInt(match[3], 10), parseInt(match[4], 10), parseFloat(match[5])*1000);
+                return d;
+            }
+            else {
+                    return str;
+            }
+        },
+        // Try to match ambiguous strings like 12/8/22.
+        // Use FF date assumption that 2 digit years are 20th century (i.e. 1900's).
+		// This may be redundant with pre processing of date already performed.
+        function(str) {
+            var match = str.match(/^([0-3]?\d)\s*[-\/.\s]{1}\s*([a-zA-Z]{3,9})\s*[-\/.\s]{1}\s*([0-3]?\d)$/);
+            if (match) {
+                var d = new Date();
+                var cent = 1900;
+                var m1 = parseFloat(match[1]);
+                var m3 = parseFloat(match[3]);
+                var ny, nd, nm;
+                if (m1 > 31) { // first number is a year
+                    nd = m3;
+                    ny = cent + m1;
+                }
+                
+                else { // last number is the year
+                    nd = m1;
+                    ny = cent + m3;
+                }
+                
+                var nm = inArray(match[2], jsDate.regional[this.locale]["monthNamesShort"]);
+                
+                if (nm == -1) {
+                    nm = inArray(match[2], jsDate.regional[this.locale]["monthNames"]);
+                }
+            
+                d.setFullYear(ny, nm, nd);
+                d.setHours(0,0,0,0);
+                return d;
+            }
+            
+            else {
+                return str;
+            }
+        }      
+    ];
+
+	//
+	// I think John Reisig published this method on his blog, ejohn.
+	//
+    function inArray( elem, array ) {
+        if ( array.indexOf ) {
+            return array.indexOf( elem );
+        }
+
+        for ( var i = 0, length = array.length; i < length; i++ ) {
+            if ( array[ i ] === elem ) {
+                return i;
+            }
+        }
+
+        return -1;
+    }
+	
+	//
+	// Thanks to Kangax, Christian Sciberras and Stack Overflow for this method.
+	//
+	function get_type(thing){
+		if(thing===null)return "[object Null]"; // special case
+		return Object.prototype.toString.call(thing);
+	}
+
+    
+    // Make sure window is defined for headless operations like 
+    // jsdoc-toolkit and some unit testing frameworks.
+    window = window || {};
+    
+    if (window.jQuery !== undefined) {
+    	window.jQuery.jsDate = jsDate;
+    }
+    
+    else {
+    	window.jsDate = jsDate;
+    }
+
+})();