diff --git a/Examples/Ajax/MooToolsExample/.classpath b/Examples/Ajax/MooToolsExample/.classpath
new file mode 100644
index 00000000000..ff18e5cf09c
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/.classpath
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Examples/Ajax/MooToolsExample/.project b/Examples/Ajax/MooToolsExample/.project
new file mode 100644
index 00000000000..c76e8cf72ce
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/.project
@@ -0,0 +1,23 @@
+
+
+ MooToolsExample
+
+
+
+
+
+ org.eclipse.jdt.core.javabuilder
+
+
+
+
+ org.objectstyle.wolips.incrementalbuilder
+
+
+
+
+
+ org.eclipse.jdt.core.javanature
+ org.objectstyle.wolips.incrementalapplicationnature
+
+
diff --git a/Examples/Ajax/MooToolsExample/.settings/org.eclipse.core.resources.prefs b/Examples/Ajax/MooToolsExample/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 00000000000..a6a0fefecb6
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding//Components=UTF-8
diff --git a/Examples/Ajax/MooToolsExample/Components/HomePage.wo/HomePage.html b/Examples/Ajax/MooToolsExample/Components/HomePage.wo/HomePage.html
new file mode 100644
index 00000000000..0679d14ef06
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/Components/HomePage.wo/HomePage.html
@@ -0,0 +1,6 @@
+
+ Project Wonder's Ajax Framework with MooTools
+ The purpose of this framework is to replace the ProtoType/Scriptaculous javascript used in Wonder's Ajax Framework with the MooTools JavaScript library.
+ Please use the navigation to the left to see the current collection of components.
+ This code is available on Wonder's Github
+
\ No newline at end of file
diff --git a/Examples/Ajax/MooToolsExample/Components/HomePage.wo/HomePage.wod b/Examples/Ajax/MooToolsExample/Components/HomePage.wo/HomePage.wod
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/Examples/Ajax/MooToolsExample/Components/HomePage.wo/HomePage.woo b/Examples/Ajax/MooToolsExample/Components/HomePage.wo/HomePage.woo
new file mode 100644
index 00000000000..a076a051a7e
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/Components/HomePage.wo/HomePage.woo
@@ -0,0 +1,4 @@
+{
+ "WebObjects Release" = "WebObjects 5.0";
+ encoding = "UTF-8";
+}
\ No newline at end of file
diff --git a/Examples/Ajax/MooToolsExample/Components/MTASBTestPage.wo/MTASBTestPage.html b/Examples/Ajax/MooToolsExample/Components/MTASBTestPage.wo/MTASBTestPage.html
new file mode 100644
index 00000000000..9494db748bb
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/Components/MTASBTestPage.wo/MTASBTestPage.html
@@ -0,0 +1,74 @@
+
+
+
+
+
+
Ajax Submit Button
+
+
+ This page tests submitting a form via an AjaxSubmitButton.
+
+
+
+
+
+
+
+ The Highlight Form
+ Wife's Name
+
+
+ The Slide In/Out Form
+ Kid's Name
+
+
+ The Morph Form
+ Dog's Name
+
+
+ The Spinner Form
+ Cat's Name
+
+
+
+
+
+
+
Wife's Name
+
+
+
+ Kid's Name
+
+
+
+ Dog's Name
+
+
+
+ Cat's Name
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Examples/Ajax/MooToolsExample/Components/MTASBTestPage.wo/MTASBTestPage.wod b/Examples/Ajax/MooToolsExample/Components/MTASBTestPage.wo/MTASBTestPage.wod
new file mode 100644
index 00000000000..24f2d7793dc
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/Components/MTASBTestPage.wo/MTASBTestPage.wod
@@ -0,0 +1,57 @@
+HighlighSubmitButton : MTAjaxSubmitButton {
+ action = updateNames;
+ afterEffect = "highlight";
+ class = "btn btn-primary";
+ updateContainerID = "WifeNameUpdateContainer";
+ value = "Update Wife's Name";
+}
+
+HighlightAjaxUpdateContainer : MTAjaxUpdateContainer {
+ id = "WifeNameUpdateContainer";
+}
+
+MorphButton : MTAjaxSubmitButton {
+ action = updateNames;
+ class = "btn btn-primary";
+ beforeEffect = "morph";
+ beforeEffectStart = "darkened";
+ effect = "morph";
+ effectDuration = "long";
+ effectStart = "plain";
+ updateContainerID = "DogNameUpdateContainer";
+ value = "Update Dog's Name";
+}
+
+MorphUpdateContainer : MTAjaxUpdateContainer {
+ id = "DogNameUpdateContainer";
+}
+
+SlideInOutButton : MTAjaxSubmitButton {
+ action = updateNames;
+ class = "btn btn-primary";
+ beforeEffect = "slide";
+ beforeEffectDuration = "long";
+ beforeEffectProperty = "out";
+ beforeEffectTransition = "Fx.Transitions.Bounce.easeOut";
+ effect = "slide";
+ effectDuration = "long";
+ effectProperty = "in";
+ updateContainerID = "KidNameUpdateContainer";
+ value = "Update Kid's Name";
+}
+
+SlideInOutUpdateContainer : MTAjaxUpdateContainer {
+ id = "KidNameUpdateContainer";
+}
+
+SpinnerButton : MTAjaxSubmitButton {
+ action = updateNamesSlowly;
+ class = "btn btn-primary";
+ useSpinner = true;
+ updateContainerID = "SpinnerContainer";
+ value = "Update Cat's Name";
+}
+
+SpinnerUpdateContainer : MTAjaxUpdateContainer {
+ id = "SpinnerContainer";
+}
\ No newline at end of file
diff --git a/Examples/Ajax/MooToolsExample/Components/MTASBTestPage.wo/MTASBTestPage.woo b/Examples/Ajax/MooToolsExample/Components/MTASBTestPage.wo/MTASBTestPage.woo
new file mode 100644
index 00000000000..a076a051a7e
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/Components/MTASBTestPage.wo/MTASBTestPage.woo
@@ -0,0 +1,4 @@
+{
+ "WebObjects Release" = "WebObjects 5.0";
+ encoding = "UTF-8";
+}
\ No newline at end of file
diff --git a/Examples/Ajax/MooToolsExample/Components/MTAUCPeriodicalTestPage.wo/MTAUCPeriodicalTestPage.html b/Examples/Ajax/MooToolsExample/Components/MTAUCPeriodicalTestPage.wo/MTAUCPeriodicalTestPage.html
new file mode 100644
index 00000000000..13e37c92d5f
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/Components/MTAUCPeriodicalTestPage.wo/MTAUCPeriodicalTestPage.html
@@ -0,0 +1,8 @@
+
+ Ajax Update Container - Periodical Update Functionality
+
+ This demonstrates applying the frequency binding (4s) to the MTAjaxUpdateContainer
+
+
+
+
\ No newline at end of file
diff --git a/Examples/Ajax/MooToolsExample/Components/MTAUCPeriodicalTestPage.wo/MTAUCPeriodicalTestPage.wod b/Examples/Ajax/MooToolsExample/Components/MTAUCPeriodicalTestPage.wo/MTAUCPeriodicalTestPage.wod
new file mode 100644
index 00000000000..8463320e667
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/Components/MTAUCPeriodicalTestPage.wo/MTAUCPeriodicalTestPage.wod
@@ -0,0 +1,6 @@
+MTAUC : MTAjaxUpdateContainer {
+ action = updateTime;
+ frequency = 4;
+ id = "MTPeriodicalUpdateContainer";
+ onSuccess = "$('MTPeriodicalUpdateContainer').highlight();";
+}
\ No newline at end of file
diff --git a/Examples/Ajax/MooToolsExample/Components/MTAUCPeriodicalTestPage.wo/MTAUCPeriodicalTestPage.woo b/Examples/Ajax/MooToolsExample/Components/MTAUCPeriodicalTestPage.wo/MTAUCPeriodicalTestPage.woo
new file mode 100644
index 00000000000..a076a051a7e
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/Components/MTAUCPeriodicalTestPage.wo/MTAUCPeriodicalTestPage.woo
@@ -0,0 +1,4 @@
+{
+ "WebObjects Release" = "WebObjects 5.0";
+ encoding = "UTF-8";
+}
\ No newline at end of file
diff --git a/Examples/Ajax/MooToolsExample/Components/MTAULTestPage.wo/MTAULTestPage.html b/Examples/Ajax/MooToolsExample/Components/MTAULTestPage.wo/MTAULTestPage.html
new file mode 100644
index 00000000000..3c70c1712bd
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/Components/MTAULTestPage.wo/MTAULTestPage.html
@@ -0,0 +1,48 @@
+
+
+
+
+ Ajax Update Link - Various Examples of Ajax Update Link
+
+ These examples demonstrate AUL and the differences between Scriptaculous Effects and Various MooTools Fx
+ Check out the MooTools demo effects and documentation.
+
+
+ Update Time (simple)
+
+
+ Update Time (confirm)
+
+
+ Update Time (highlight effect)
+
+
+ Update Time (slide effect)
+
+
+ Update Time (tween - fade out/in)
+
+
+ Update Time (css morph)
+
+
+ Update Time (spinner)
+
+
+
+
\ No newline at end of file
diff --git a/Examples/Ajax/MooToolsExample/Components/MTAULTestPage.wo/MTAULTestPage.wod b/Examples/Ajax/MooToolsExample/Components/MTAULTestPage.wo/MTAULTestPage.wod
new file mode 100644
index 00000000000..f61c8304c40
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/Components/MTAULTestPage.wo/MTAULTestPage.wod
@@ -0,0 +1,90 @@
+ConfirmMTAUC : MTAjaxUpdateContainer {
+ id = "ConfirmMTAUC";
+}
+
+ConfirmMTAUL : MTAjaxUpdateLink {
+ action = updateTime;
+ effect = "highlight";
+ updateContainerID = "ConfirmMTAUC";
+ onClickBefore = "confirm('Update Time?')";
+}
+
+HighlighMTAUC : MTAjaxUpdateContainer {
+ id = "HighlightAUC";
+}
+
+HighlightMTAUL : MTAjaxUpdateLink {
+ action = updateTime;
+ effect = "highlight";
+ updateContainerID = "HighlightAUC";
+}
+
+MorphMTAUC : MTAjaxUpdateContainer {
+ class = "redBackground";
+ id = "MorphMTAUC";
+
+}
+
+MorphMTAUL : MTAjaxUpdateLink {
+ action = updateTime;
+ beforeEffect = "morph";
+ beforeEffectDuration = "long";
+ beforeEffectStart = "greenBackground";
+ effect = "morph";
+ effectDuration = "long";
+ effectStart = "redBackground";
+ updateContainerID = "MorphMTAUC";
+}
+
+SimpleMTAUC : MTAjaxUpdateContainer {
+ id = "SimpleMTAUC";
+}
+
+SimpleMTAUL : MTAjaxUpdateLink {
+ action = updateTime;
+ updateContainerID = "SimpleMTAUC";
+}
+
+SlideMTAUC : MTAjaxUpdateContainer {
+ id = "SlideMTAUC";
+}
+
+SlideMTAUL : MTAjaxUpdateLink {
+ action = updateTime;
+ beforeEffect = "slide";
+ beforeEffectDuration = "long";
+ beforeEffectProperty = "out";
+ effect = "slide";
+ effectDuration = "long";
+ effectProperty = "in";
+ effectSlideMode = "horizontal";
+ updateContainerID = "SlideMTAUC";
+}
+
+SpinnerMTAUC : MTAjaxUpdateContainer {
+ id = "SpinnerMTAUC";
+}
+
+SpinnerMTAUL : MTAjaxUpdateLink {
+ action = updateTimeSlow;
+ useSpinner = true;
+ spinnerTarget = "links";
+ spinnerOptions = "{ containerPosition: { position: 'center', offset: { y: -100 } }}";
+ updateContainerID = "SpinnerMTAUC";
+}
+
+TweenMTAUC : MTAjaxUpdateContainer {
+ id = "TweenMTAUC";
+}
+
+TweenMTAUL : MTAjaxUpdateLink {
+ action = updateTime;
+ beforeEffect = "tween";
+ beforeEffectProperty = "opacity";
+ beforeEffectStart = "1, 0";
+ afterEffect = "tween";
+ afterEffectDuration = "long";
+ afterEffectProperty = "opacity";
+ afterEffectStart = "1";
+ updateContainerID = "TweenMTAUC";
+}
\ No newline at end of file
diff --git a/Examples/Ajax/MooToolsExample/Components/MTAULTestPage.wo/MTAULTestPage.woo b/Examples/Ajax/MooToolsExample/Components/MTAULTestPage.wo/MTAULTestPage.woo
new file mode 100644
index 00000000000..a076a051a7e
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/Components/MTAULTestPage.wo/MTAULTestPage.woo
@@ -0,0 +1,4 @@
+{
+ "WebObjects Release" = "WebObjects 5.0";
+ encoding = "UTF-8";
+}
\ No newline at end of file
diff --git a/Examples/Ajax/MooToolsExample/Components/MTAccordionTestPage.wo/MTAccordionTestPage.html b/Examples/Ajax/MooToolsExample/Components/MTAccordionTestPage.wo/MTAccordionTestPage.html
new file mode 100644
index 00000000000..1c6eddba4bc
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/Components/MTAccordionTestPage.wo/MTAccordionTestPage.html
@@ -0,0 +1,69 @@
+
+
+
+
+
+ MooTools Accordion
+
+
+ A basic accordion.
+
+
+
+
+ Project WONDER is a collection of frameworks and tools for the WebObjects application server. It aims to fill some of the gaps
+ left in the packaged product, as well as add some useful and powerful utilities for WebObjects developers. Amongst a host of
+ other things, we provides a rich set of tools and additions for use in WebObjects and EOF and many extensions and enhancements
+ to WebObjects' DirectToWeb functionality.
+
+ Project WONDER is a collection of frameworks and tools for the WebObjects application server. It aims to fill some of the gaps
+ left in the packaged product, as well as add some useful and powerful utilities for WebObjects developers. Amongst a host of
+ other things, we provides a rich set of tools and additions for use in WebObjects and EOF and many extensions and enhancements
+ to WebObjects' DirectToWeb functionality.
+
+ Project WONDER is a collection of frameworks and tools for the WebObjects application server. It aims to fill some of the gaps
+ left in the packaged product, as well as add some useful and powerful utilities for WebObjects developers. Amongst a host of
+ other things, we provides a rich set of tools and additions for use in WebObjects and EOF and many extensions and enhancements
+ to WebObjects' DirectToWeb functionality.
+
+ Project WONDER is a collection of frameworks and tools for the WebObjects application server. It aims to fill some of the gaps
+ left in the packaged product, as well as add some useful and powerful utilities for WebObjects developers. Amongst a host of
+ other things, we provides a rich set of tools and additions for use in WebObjects and EOF and many extensions and enhancements
+ to WebObjects' DirectToWeb functionality.
+
+
+
+ Project WONDER is a collection of frameworks and tools for the WebObjects application server. It aims to fill some of the gaps
+ left in the packaged product, as well as add some useful and powerful utilities for WebObjects developers. Amongst a host of
+ other things, we provides a rich set of tools and additions for use in WebObjects and EOF and many extensions and enhancements
+ to WebObjects' DirectToWeb functionality.
+
+
+ This is the third tab.
+
+
+ This is the fourth tab.
+
+
+
+
\ No newline at end of file
diff --git a/Examples/Ajax/MooToolsExample/Components/MTAccordionTestPage.wo/MTAccordionTestPage.wod b/Examples/Ajax/MooToolsExample/Components/MTAccordionTestPage.wo/MTAccordionTestPage.wod
new file mode 100644
index 00000000000..7de04ea4861
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/Components/MTAccordionTestPage.wo/MTAccordionTestPage.wod
@@ -0,0 +1,23 @@
+Accordion : MTAccordionContainer {
+ fixedHeight = "200";
+ onActive = "AccordionStateChange.onActive";
+ onBackground = "AccordionStateChange.onBackground";
+ elementClassName = "els";
+ togglerClassName = "togs";
+}
+
+Tab1 : MTAccordionComponent {
+ label = "Tab 1";
+}
+
+Tab2 : MTAccordionComponent {
+ label = "Tab 2";
+}
+
+Tab3 : MTAccordionComponent {
+ label = "Tab 3";
+}
+
+Tab4 : MTAccordionComponent {
+ label = "Tab 4";
+}
\ No newline at end of file
diff --git a/Examples/Ajax/MooToolsExample/Components/MTAccordionTestPage.wo/MTAccordionTestPage.woo b/Examples/Ajax/MooToolsExample/Components/MTAccordionTestPage.wo/MTAccordionTestPage.woo
new file mode 100644
index 00000000000..a076a051a7e
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/Components/MTAccordionTestPage.wo/MTAccordionTestPage.woo
@@ -0,0 +1,4 @@
+{
+ "WebObjects Release" = "WebObjects 5.0";
+ encoding = "UTF-8";
+}
\ No newline at end of file
diff --git a/Examples/Ajax/MooToolsExample/Components/MTAjaxDragDropTestPage.wo/MTAjaxDragDropTestPage.html b/Examples/Ajax/MooToolsExample/Components/MTAjaxDragDropTestPage.wo/MTAjaxDragDropTestPage.html
new file mode 100644
index 00000000000..34fa918d992
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/Components/MTAjaxDragDropTestPage.wo/MTAjaxDragDropTestPage.html
@@ -0,0 +1,19 @@
+
+
+
+
Ajax Draggable - Drag & Drop Example.
+
+
+
+
+ This is draggable #1, Item (I move around freely)
+
+
Drop Items Here
+
Drop Items Here
+
+
+
\ No newline at end of file
diff --git a/Examples/Ajax/MooToolsExample/Components/MTAjaxDragDropTestPage.wo/MTAjaxDragDropTestPage.wod b/Examples/Ajax/MooToolsExample/Components/MTAjaxDragDropTestPage.wo/MTAjaxDragDropTestPage.wod
new file mode 100644
index 00000000000..47643464962
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/Components/MTAjaxDragDropTestPage.wo/MTAjaxDragDropTestPage.wod
@@ -0,0 +1,23 @@
+DraggableExample1 : MTAjaxDraggable {
+ class = "alert alert-success";
+ droppables = ".droppable";
+ draggableObject = o1;
+ droppedDraggableID = droppedDraggableID;
+ droppedObject = droppedObject;
+ droppedArea = droppedArea;
+ action = droppedDraggable1;
+ ghost = true;
+ updateContainerID = "statusMessage";
+ elementName = "div";
+ onDrop = "function(draggable, droppable) { droppable.removeClass('alert-error'); droppable.addClass('alert-info'); $('statusMessage').highlight(); } ";
+ onEnter = "function(draggable, droppable) { droppable.removeClass('alert-info'); droppable.addClass('alert-error'); } ";
+ onLeave = "function(draggable, droppable) { droppable.removeClass('alert-error'); droppable.addClass('alert-info'); } ";
+}
+
+FirstItem : WOString {
+ value = o1;
+}
+
+StatusMessage : MTAjaxUpdateContainer {
+ id = "statusMessage";
+}
\ No newline at end of file
diff --git a/Examples/Ajax/MooToolsExample/Components/MTAjaxDragDropTestPage.wo/MTAjaxDragDropTestPage.woo b/Examples/Ajax/MooToolsExample/Components/MTAjaxDragDropTestPage.wo/MTAjaxDragDropTestPage.woo
new file mode 100644
index 00000000000..a076a051a7e
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/Components/MTAjaxDragDropTestPage.wo/MTAjaxDragDropTestPage.woo
@@ -0,0 +1,4 @@
+{
+ "WebObjects Release" = "WebObjects 5.0";
+ encoding = "UTF-8";
+}
\ No newline at end of file
diff --git a/Examples/Ajax/MooToolsExample/Components/MTAjaxModalContainerTestPage.wo/MTAjaxModalContainerTestPage.html b/Examples/Ajax/MooToolsExample/Components/MTAjaxModalContainerTestPage.wo/MTAjaxModalContainerTestPage.html
new file mode 100644
index 00000000000..0eb75d39149
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/Components/MTAjaxModalContainerTestPage.wo/MTAjaxModalContainerTestPage.html
@@ -0,0 +1,46 @@
+
+
+
+ Various Modal Container Tests
+
+ Simple No Ajax Modal Container
+
+ Some Text Content
+
+
+ Modal container with internal href
+
+
+ Ajax Modal Container
+ See example. You may need to stylize the content like this to get your buttons and form elements placed nicely. See bindings autoWrapContent, showFooter, showTitle.
+
+
+
+
+
+ (
+
+
+
+
+
+
+
+ )
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Examples/Ajax/MooToolsExample/Components/MTAjaxModalContainerTestPage.wo/MTAjaxModalContainerTestPage.wod b/Examples/Ajax/MooToolsExample/Components/MTAjaxModalContainerTestPage.wo/MTAjaxModalContainerTestPage.wod
new file mode 100644
index 00000000000..a61315d4028
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/Components/MTAjaxModalContainerTestPage.wo/MTAjaxModalContainerTestPage.wod
@@ -0,0 +1,47 @@
+ContentBox : MTAjaxModalContainer {
+ label = "Click me to Show";
+ title = "Some Title";
+}
+
+InteralHrefBox : MTAjaxModalContainer {
+ href = "/";
+ showFooter = false;
+ label = "Click me to show";
+ showTitle = true;
+ title = "Loading from an Internal Href";
+}
+
+RepetitionBox: MTAjaxModalContainer {
+ ajax = true;
+ autoWrapContent = false;
+ id = wordID;
+ label = "edit";
+ showFooter = false;
+ showTitle = false;
+ varName = wordID;
+}
+
+
+RepetitionWordName : WOString {
+ value = repetitionWord.name;
+}
+
+WordsContainer : MTAjaxUpdateContainer {
+ id = "repetitionContainer";
+}
+
+WordsRepetition : WORepetition {
+ list = words;
+ item = repetitionWord;
+}
+
+WordNameField : WOTextField {
+ value = repetitionWord.name;
+}
+
+WordSubmitButton : MTAjaxSubmitButton {
+ class = "dismiss btn btn-primary";
+ updateContainerID = "repetitionContainer";
+ value = "Save";
+}
+
diff --git a/Examples/Ajax/MooToolsExample/Components/MTAjaxModalContainerTestPage.wo/MTAjaxModalContainerTestPage.woo b/Examples/Ajax/MooToolsExample/Components/MTAjaxModalContainerTestPage.wo/MTAjaxModalContainerTestPage.woo
new file mode 100644
index 00000000000..a076a051a7e
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/Components/MTAjaxModalContainerTestPage.wo/MTAjaxModalContainerTestPage.woo
@@ -0,0 +1,4 @@
+{
+ "WebObjects Release" = "WebObjects 5.0";
+ encoding = "UTF-8";
+}
\ No newline at end of file
diff --git a/Examples/Ajax/MooToolsExample/Components/MTAjaxObserveFieldTestPage.wo/MTAjaxObserveFieldTestPage.html b/Examples/Ajax/MooToolsExample/Components/MTAjaxObserveFieldTestPage.wo/MTAjaxObserveFieldTestPage.html
new file mode 100644
index 00000000000..3e872d8d369
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/Components/MTAjaxObserveFieldTestPage.wo/MTAjaxObserveFieldTestPage.html
@@ -0,0 +1,23 @@
+
+ Ajax Observe Field - Dependent PopUp List Example
+
+
+ AjaxUpdateContainer has an optional 'observeFieldID' binding. You can set this binding to the id of the element to observe. When the element changes,
+ the observed value will be sent back to the server (as a "partial form submission"), and the AjaxUpdateContainer will be updated. This feature
+ requires that you use the ERExtensions framework (due to required changes to WOForm). With partial form submission, only the
+ observed field's value is submitted back to the server so that you can attempt to avoid validation failures that might occur
+ if the entire form was submitted.
+
+
+ This can be used to create dependent PopUpButtons like in the following example:
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Examples/Ajax/MooToolsExample/Components/MTAjaxObserveFieldTestPage.wo/MTAjaxObserveFieldTestPage.wod b/Examples/Ajax/MooToolsExample/Components/MTAjaxObserveFieldTestPage.wo/MTAjaxObserveFieldTestPage.wod
new file mode 100644
index 00000000000..a6ae3b0486c
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/Components/MTAjaxObserveFieldTestPage.wo/MTAjaxObserveFieldTestPage.wod
@@ -0,0 +1,33 @@
+ColorObserveField : MTAjaxObserveField {
+ observeFieldID = "PrimaryColorID";
+ updateContainerID = "SecondaryColorDiv";
+ fullSubmit = false;
+ useSpinner = true;
+ spinnerOptions = "{ containerPosition: { position: 'leftCenter' }}";
+}
+
+DependentListForm : WOForm {
+ action = doStuff;
+ multipleSubmit = true;
+}
+
+PrimaryColorField : WOPopUpButton {
+ id = "PrimaryColorID";
+ list = primaryColors;
+ item = primaryColor;
+ selection = selectedPrimaryColor;
+ noSelectionString = "No Color Selected";
+}
+
+SecondaryColorField : WOPopUpButton {
+ id = "SecondaryColors";
+ list = secondaryColors;
+ item = secondaryColor;
+ selection = selectedSecondaryColor;
+ noSelectionString = "No secondary Color Selected";
+}
+
+SecondaryColorUpdateComponent : MTAjaxUpdateContainer {
+ id = "SecondaryColorDiv";
+}
+
diff --git a/Examples/Ajax/MooToolsExample/Components/MTAjaxObserveFieldTestPage.wo/MTAjaxObserveFieldTestPage.woo b/Examples/Ajax/MooToolsExample/Components/MTAjaxObserveFieldTestPage.wo/MTAjaxObserveFieldTestPage.woo
new file mode 100644
index 00000000000..a076a051a7e
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/Components/MTAjaxObserveFieldTestPage.wo/MTAjaxObserveFieldTestPage.woo
@@ -0,0 +1,4 @@
+{
+ "WebObjects Release" = "WebObjects 5.0";
+ encoding = "UTF-8";
+}
\ No newline at end of file
diff --git a/Examples/Ajax/MooToolsExample/Components/MTAjaxSortablesTestPage.wo/MTAjaxSortablesTestPage.html b/Examples/Ajax/MooToolsExample/Components/MTAjaxSortablesTestPage.wo/MTAjaxSortablesTestPage.html
new file mode 100644
index 00000000000..294c65c1182
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/Components/MTAjaxSortablesTestPage.wo/MTAjaxSortablesTestPage.html
@@ -0,0 +1,22 @@
+
+ Sortable List Test
+
+
+ Port from the original.
+
+
+
+
+
+
+
+
+
+ Stored order:
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Examples/Ajax/MooToolsExample/Components/MTAjaxSortablesTestPage.wo/MTAjaxSortablesTestPage.wod b/Examples/Ajax/MooToolsExample/Components/MTAjaxSortablesTestPage.wo/MTAjaxSortablesTestPage.wod
new file mode 100644
index 00000000000..2e6588cd59e
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/Components/MTAjaxSortablesTestPage.wo/MTAjaxSortablesTestPage.wod
@@ -0,0 +1,28 @@
+ASB : MTAjaxSubmitButton {
+ action = saveChanges;
+ class = "btn btn-primary";
+ updateContainerID = "UpdateContainer";
+ spinnerOptions = "{ containerPosition: { position: 'leftCenter' }}";
+ useSpinner = true;
+ value = "Update List"
+}
+
+SortableListA : MTAjaxSortableList {
+ action = saveChanges;
+ clone = "true";
+ id = "exampleListA";
+ listClass = "unstyled";
+ listElementName = "ul";
+ listItemElementName = "li";
+ list = listA;
+ item = repetitionListItemA;
+ listItemIDKeyPath = "id";
+ opacity = "0.8";
+ updateContainerID = "UpdateContainer";
+ var = "MySortables";
+}
+
+ListItemNameA : WOImage {
+ class = "thumbnail";
+ src = repetitionListItemA.url;
+}
diff --git a/Examples/Ajax/MooToolsExample/Components/MTAjaxSortablesTestPage.wo/MTAjaxSortablesTestPage.woo b/Examples/Ajax/MooToolsExample/Components/MTAjaxSortablesTestPage.wo/MTAjaxSortablesTestPage.woo
new file mode 100644
index 00000000000..a076a051a7e
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/Components/MTAjaxSortablesTestPage.wo/MTAjaxSortablesTestPage.woo
@@ -0,0 +1,4 @@
+{
+ "WebObjects Release" = "WebObjects 5.0";
+ encoding = "UTF-8";
+}
\ No newline at end of file
diff --git a/Examples/Ajax/MooToolsExample/Components/MTAjaxTabbedPanelTestPage.wo/MTAjaxTabbedPanelTestPage.html b/Examples/Ajax/MooToolsExample/Components/MTAjaxTabbedPanelTestPage.wo/MTAjaxTabbedPanelTestPage.html
new file mode 100644
index 00000000000..14a8c0a1b6e
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/Components/MTAjaxTabbedPanelTestPage.wo/MTAjaxTabbedPanelTestPage.html
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+ This is tab # 1.
+
+
+ This is inline content on the same page as the panel and tabs are declared.
+ It does not refresh when the tab is selected:
+
+
+ Form Value A:
+
+
+ This is inline content on the same page as the panel and tabs are declared.
+ This tab refreshs when the tab is selected, the time will change:
+
+
+ Form Value B:
+
+
+ This tab is simply not visible and is not rendered in the HTML.
+
+
+
+
+
+
+
+
+ Loading...
+
+ The selected tab is saved in the session, so if you come back to this page, the last tab selected will be remembered. If you have the
+ Slow Loading Context tab selected and go away and come back, this page will load slowly.
+ The form values should be preserved across all tab changes and repeated clicking of save.
+
+
+
\ No newline at end of file
diff --git a/Examples/Ajax/MooToolsExample/Components/MTAjaxTabbedPanelTestPage.wo/MTAjaxTabbedPanelTestPage.wod b/Examples/Ajax/MooToolsExample/Components/MTAjaxTabbedPanelTestPage.wo/MTAjaxTabbedPanelTestPage.wod
new file mode 100644
index 00000000000..62f3c6a107b
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/Components/MTAjaxTabbedPanelTestPage.wo/MTAjaxTabbedPanelTestPage.wod
@@ -0,0 +1,59 @@
+Form: WOForm {
+ multipleSubmit = true;
+}
+
+FormValueA: WOTextField {
+ value = formValueA;
+}
+
+FormValueB: WOTextField {
+ value = formValueB;
+}
+
+SubmitButton: WOSubmitButton {
+ action = save;
+ class = "btn";
+ value = "Save";
+}
+
+TabbedPanel : MTAjaxTabbedPanel {
+ class = "nav nav-tabs";
+ id = "tabbedPanel";
+ busyDiv = "busyDiv";
+ onLoad = "alert('Tabbed Panel onLoad event')";
+}
+
+Tab1 : MTAjaxTabbedPanelTab {
+ id = "panel1";
+ name = "Slow Loading Content";
+ isSelected = isSlowLoadingContentSelected;
+}
+
+Tab2: MTAjaxTabbedPanelTab {
+ id = "panel2";
+ name = "Inline Content";
+ isSelected = isInlineContentSelected;
+}
+
+Tab3: MTAjaxTabbedPanelTab {
+ id = "panel3";
+ name = "Refreshing Content";
+ isSelected = isRefreshingContentSelected;
+ refreshOnSelect = true;
+ onLoad = "alert('Refreshing Content tab onLoad event')";
+}
+
+Tab4: MTAjaxTabbedPanelTab {
+ name = "Invisible";
+ isVisible = false;
+ isSelected = true; // or false, it does not have any effect
+}
+
+CurrentTime: WOString {
+ value = now;
+}
+
+BusyImage : WOImage {
+ framework = "Ajax";
+ filename = "wait30.gif";
+}
\ No newline at end of file
diff --git a/Examples/Ajax/MooToolsExample/Components/MTAjaxTabbedPanelTestPage.wo/MTAjaxTabbedPanelTestPage.woo b/Examples/Ajax/MooToolsExample/Components/MTAjaxTabbedPanelTestPage.wo/MTAjaxTabbedPanelTestPage.woo
new file mode 100644
index 00000000000..a076a051a7e
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/Components/MTAjaxTabbedPanelTestPage.wo/MTAjaxTabbedPanelTestPage.woo
@@ -0,0 +1,4 @@
+{
+ "WebObjects Release" = "WebObjects 5.0";
+ encoding = "UTF-8";
+}
\ No newline at end of file
diff --git a/Examples/Ajax/MooToolsExample/Components/MTAjaxTreeExamplePage.wo/MTAjaxTreeExamplePage.html b/Examples/Ajax/MooToolsExample/Components/MTAjaxTreeExamplePage.wo/MTAjaxTreeExamplePage.html
new file mode 100644
index 00000000000..6df444e2dee
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/Components/MTAjaxTreeExamplePage.wo/MTAjaxTreeExamplePage.html
@@ -0,0 +1,45 @@
+
+
+ Test Ajax Tree
+
+
+ Port from the original. The only difference is that we use MT versions of AUL and AUC.
+
+
+
+
+
+ two-line label
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Examples/Ajax/MooToolsExample/Components/MTAjaxTreeExamplePage.wo/MTAjaxTreeExamplePage.wod b/Examples/Ajax/MooToolsExample/Components/MTAjaxTreeExamplePage.wo/MTAjaxTreeExamplePage.wod
new file mode 100644
index 00000000000..63bdf05e191
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/Components/MTAjaxTreeExamplePage.wo/MTAjaxTreeExamplePage.wod
@@ -0,0 +1,18 @@
+AjaxTree : MTAjaxTree {
+ id = "exampleTree";
+ class = "nav nav-list";
+ root = rootTreeNode;
+ item = treeNode;
+ delegate = delegate;
+ rootExpanded = true;
+}
+
+TreeNodeAction : MTAjaxUpdateLink {
+ action = nodeSelected;
+ string = treeNode.toString; //VALID
+ updateContainerID = "workarea";
+}
+
+Workarea : MTAjaxUpdateContainer {
+ id = "workarea";
+}
\ No newline at end of file
diff --git a/Examples/Ajax/MooToolsExample/Components/MTAjaxTreeExamplePage.wo/MTAjaxTreeExamplePage.woo b/Examples/Ajax/MooToolsExample/Components/MTAjaxTreeExamplePage.wo/MTAjaxTreeExamplePage.woo
new file mode 100644
index 00000000000..a076a051a7e
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/Components/MTAjaxTreeExamplePage.wo/MTAjaxTreeExamplePage.woo
@@ -0,0 +1,4 @@
+{
+ "WebObjects Release" = "WebObjects 5.0";
+ encoding = "UTF-8";
+}
\ No newline at end of file
diff --git a/Examples/Ajax/MooToolsExample/Components/MTFileUploadTestPage.wo/MTFileUploadTestPage.html b/Examples/Ajax/MooToolsExample/Components/MTFileUploadTestPage.wo/MTFileUploadTestPage.html
new file mode 100644
index 00000000000..12ea7127e96
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/Components/MTFileUploadTestPage.wo/MTFileUploadTestPage.html
@@ -0,0 +1,39 @@
+
+ AjaxFileUpload
+
+ This AjaxFileUpload does not bind to anything, so its file is just immediately deleted. It allows all of the same binding options
+ as WOFileUpload. This demo has a maximum file upload size of 2M (change this in Properties if you want to try a local file upload).
+
+
+
+ I changed the progress bar's HTML around a little bit to make it easier to style.
+ Instead of a table it now uses a layout like this:
+
+ <div class = "value of binding progressBarContainerClass" >
+ <div class = "bar" style = "calculated width percentage"></div>
+ </div>
+
+
+ There is also a new binding for "linkClass" that allows you to stylize the upload button
+
+
+
+
+
+ Your upload succeeded.
+
+
+ Your upload was canceled.
+
+
+ Your upload failed:
+
+
+
+
+
+
+ Here's a progress bar attached to a thread that is just incrementing the progress value.
+
+
+
\ No newline at end of file
diff --git a/Examples/Ajax/MooToolsExample/Components/MTFileUploadTestPage.wo/MTFileUploadTestPage.wod b/Examples/Ajax/MooToolsExample/Components/MTFileUploadTestPage.wo/MTFileUploadTestPage.wod
new file mode 100644
index 00000000000..3351fc9e1e8
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/Components/MTFileUploadTestPage.wo/MTFileUploadTestPage.wod
@@ -0,0 +1,41 @@
+FinishedImage : WOResourceURL {
+ filename = "img/progress-bar.gif";
+}
+
+UnfinishedImage : WOResourceURL {
+ filename = "img/progress-remainder.gif";
+}
+
+CanceledConditional : WOConditional {
+ condition = uploadProgress.canceled;
+}
+
+FailedConditional : WOConditional {
+ condition = uploadProgress.failed;
+}
+
+SucceededConditional : WOConditional {
+ condition = uploadProgress.succeeded;
+}
+
+UploadDoneConditional : WOConditional {
+ condition = uploadProgress.done;
+}
+
+AjaxFileUpload : MTAjaxFileUpload {
+ allowCancel = true;
+ formClass = "well form-inline";
+ linkClass = "btn btn-warning";
+ uploadProgress = uploadProgress;
+ finishedAction = uploadFinished;
+}
+
+AjaxProgress : MTAjaxProgressBar {
+ progress = progress;
+ progressBarContainerClass = "progress progress-info progress-striped active";
+ finishedFunction = "alert('Done!')";
+}
+
+FailureMessage : WOString {
+ value = uploadProgress.failure.message;
+}
\ No newline at end of file
diff --git a/Examples/Ajax/MooToolsExample/Components/MTFileUploadTestPage.wo/MTFileUploadTestPage.woo b/Examples/Ajax/MooToolsExample/Components/MTFileUploadTestPage.wo/MTFileUploadTestPage.woo
new file mode 100644
index 00000000000..a076a051a7e
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/Components/MTFileUploadTestPage.wo/MTFileUploadTestPage.woo
@@ -0,0 +1,4 @@
+{
+ "WebObjects Release" = "WebObjects 5.0";
+ encoding = "UTF-8";
+}
\ No newline at end of file
diff --git a/Examples/Ajax/MooToolsExample/Components/MTJSDatePickerTestPage.wo/MTJSDatePickerTestPage.html b/Examples/Ajax/MooToolsExample/Components/MTJSDatePickerTestPage.wo/MTJSDatePickerTestPage.html
new file mode 100644
index 00000000000..bfc645983ad
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/Components/MTJSDatePickerTestPage.wo/MTJSDatePickerTestPage.html
@@ -0,0 +1,26 @@
+
+ Date Picker Test
+
+ Original can be found here: http://www.monkeyphysics.com/mootools/script/2/datepicker
+ Nice thing about this one is you just set the dateformat like you would with a regular wotextfield.
+
+
+ Warning I ported this script to MooTools 1.4. It should work but if you come across any issues please let me know.
+
+
+
+
+
+
+
+
+
+
+
+
Selected Date
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Examples/Ajax/MooToolsExample/Components/MTJSDatePickerTestPage.wo/MTJSDatePickerTestPage.wod b/Examples/Ajax/MooToolsExample/Components/MTJSDatePickerTestPage.wo/MTJSDatePickerTestPage.wod
new file mode 100644
index 00000000000..136bedc654e
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/Components/MTJSDatePickerTestPage.wo/MTJSDatePickerTestPage.wod
@@ -0,0 +1,27 @@
+ASB : MTAjaxSubmitButton {
+ action = updateTime;
+ class = "btn btn-primary";
+ beforeEffect = "slide";
+ beforeEffectDuration = "long";
+ beforeEffectProperty = "out";
+ beforeEffectTransition = "Fx.Transitions.Bounce.easeOut";
+ effect = "slide";
+ effectDuration = "long";
+ effectProperty = "in";
+ updateContainerID = "AUC";
+ value = "Update Time";
+}
+
+AUC : MTAjaxUpdateContainer {
+ id = "AUC";
+}
+
+DatePicker : MTJSDatePicker {
+ dateformat = "%Y-%m-%d";
+ pickerClass = "datepicker_dashboard";
+ onClose = "function() {console.log('close'); }";
+ onSelect = "function() {console.log('select'); }";
+ onShow = "function() {console.log('show');}";
+ useDefaultCSS = "false";
+ value = today;
+}
\ No newline at end of file
diff --git a/Examples/Ajax/MooToolsExample/Components/MTJSDatePickerTestPage.wo/MTJSDatePickerTestPage.woo b/Examples/Ajax/MooToolsExample/Components/MTJSDatePickerTestPage.wo/MTJSDatePickerTestPage.woo
new file mode 100644
index 00000000000..a076a051a7e
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/Components/MTJSDatePickerTestPage.wo/MTJSDatePickerTestPage.woo
@@ -0,0 +1,4 @@
+{
+ "WebObjects Release" = "WebObjects 5.0";
+ encoding = "UTF-8";
+}
\ No newline at end of file
diff --git a/Examples/Ajax/MooToolsExample/Components/MTJSSliderTestPage.wo/MTJSSliderTestPage.html b/Examples/Ajax/MooToolsExample/Components/MTJSSliderTestPage.wo/MTJSSliderTestPage.html
new file mode 100644
index 00000000000..f1eb4b54b46
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/Components/MTJSSliderTestPage.wo/MTJSSliderTestPage.html
@@ -0,0 +1,41 @@
+
+
+
+
+ JavaScript Slider Example
+
+
+
+
+
+
+ Slider Value 1 - 50. If you enter the value here into the textfield it will update the slider on change. See bindings observer and observerevent.
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Examples/Ajax/MooToolsExample/Components/MTJSSliderTestPage.wo/MTJSSliderTestPage.wod b/Examples/Ajax/MooToolsExample/Components/MTJSSliderTestPage.wo/MTJSSliderTestPage.wod
new file mode 100644
index 00000000000..0252ff8291e
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/Components/MTJSSliderTestPage.wo/MTJSSliderTestPage.wod
@@ -0,0 +1,11 @@
+Slider : MTJSSlider {
+ elementClass = "element";
+ knobClass = "knob";
+ id = "slider";
+ mode = "vertical";
+ observer = "SliderValue";
+ onChange = "function(pos) { $('SliderValue').value = pos; }";
+ range = "[1, 50]";
+ value = sliderValue;
+ wheel = true;
+}
\ No newline at end of file
diff --git a/Examples/Ajax/MooToolsExample/Components/MTJSSliderTestPage.wo/MTJSSliderTestPage.woo b/Examples/Ajax/MooToolsExample/Components/MTJSSliderTestPage.wo/MTJSSliderTestPage.woo
new file mode 100644
index 00000000000..a076a051a7e
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/Components/MTJSSliderTestPage.wo/MTJSSliderTestPage.woo
@@ -0,0 +1,4 @@
+{
+ "WebObjects Release" = "WebObjects 5.0";
+ encoding = "UTF-8";
+}
\ No newline at end of file
diff --git a/Examples/Ajax/MooToolsExample/Components/Main.api b/Examples/Ajax/MooToolsExample/Components/Main.api
new file mode 100644
index 00000000000..12535ad8d04
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/Components/Main.api
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/Examples/Ajax/MooToolsExample/Components/Main.wo/Main.html b/Examples/Ajax/MooToolsExample/Components/Main.wo/Main.html
new file mode 100644
index 00000000000..38ac5dd0976
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/Components/Main.wo/Main.html
@@ -0,0 +1,77 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Home
+
+
+
+ Periodical Updater
+
+
+
+ Update Links
+
+
+
+ Ajax Submit Button
+
+
+
+ Accordion Example
+
+
+
+ Tabbed Panel Example
+
+
+
+ Drag and Drop Example
+
+
+
+ Ajax Observe Field
+
+
+
+ JavaScript Slider
+
+
+
+ Sortable List
+
+
+
+ File Upload
+
+
+
+ Ajax Tree
+
+
+
+ Modal Containers
+
+
+
+ Date Picker
+
+
+
+
+
+
+
+
+
+
diff --git a/Examples/Ajax/MooToolsExample/Components/Main.wo/Main.wod b/Examples/Ajax/MooToolsExample/Components/Main.wo/Main.wod
new file mode 100644
index 00000000000..b2870e09935
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/Components/Main.wo/Main.wod
@@ -0,0 +1,3 @@
+PageTitle : WOString {
+ value = pageTitle;
+}
\ No newline at end of file
diff --git a/Examples/Ajax/MooToolsExample/Components/Main.wo/Main.woo b/Examples/Ajax/MooToolsExample/Components/Main.wo/Main.woo
new file mode 100644
index 00000000000..1f6e847c167
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/Components/Main.wo/Main.woo
@@ -0,0 +1,4 @@
+{
+ "WebObjects Release" = "WebObjects 5.0";
+ encoding = "UTF-8";
+}
\ No newline at end of file
diff --git a/Examples/Ajax/MooToolsExample/Resources/Properties b/Examples/Ajax/MooToolsExample/Resources/Properties
new file mode 100644
index 00000000000..7fac8817a35
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/Resources/Properties
@@ -0,0 +1,68 @@
+# OGNL
+ognl.helperFunctions=true
+ognl.inlineBindings=true
+
+# Misc
+er.extensions.stackTrace.cleanup=true
+
+# EOF
+er.extensions.ERXEC.safeLocking=true
+er.extensions.ERXEC.useSharedEditingContext=false
+er.extensions.ERXEnterpriseObject.applyRestrictingQualifierOnInsert=true
+er.extensions.ERXEnterpriseObject.updateInverseRelationships=true
+#dbConnectURLGLOBAL=
+#dbConnectUserGLOBAL=
+#dbConnectPasswordGLOBAL=
+
+# Migrations
+#er.migration.migrateAtStartup=true
+#er.migration.createTablesIfNecessary=true
+#er.migration.modelNames=YourModel
+
+# Misc Components
+#er.extensions.ERXWOForm.multipleSubmitDefault=true
+#er.extensions.ERXWORepetition.checkHashCodes=true
+#er.extensions.ERXWORepetition.raiseOnUnmatchedObject=true
+#er.extensions.ERXWORepetition.eoSupport=true
+#er.component.clickToOpen=true
+#wolips.password=wo
+
+# ERJavaMail
+er.javamail.centralize=true
+er.javamail.adminEmail=admin@yourhost.com
+er.javamail.debugEnabled=false
+er.javamail.smtpHost=your.smtpserver.com
+er.javamail.smtpAuth=false
+er.javamail.smtpUser=
+er.javamail.smtpPassword=
+
+# Log4j Configuration
+log4j.loggerFactory=er.extensions.logging.ERXLogger$Factory
+log4j.rootCategory=INFO,A1
+log4j.appender.A1=er.extensions.logging.ERXConsoleAppender
+log4j.appender.A1.layout=er.extensions.logging.ERXPatternLayout
+log4j.appender.A1.layout.ConversionPattern=%d{MMM dd HH:mm:ss} %$[%#] %-5p %c %x - %m%n
+
+# Log4j Categories
+# Here are a few log4j sub-categories that are interesting.
+# Don't forget that in developement mode this file will get reloaded
+# everytime it changes, so if you say want to turn adaptor debugging
+# on in the middle of the app simply set the below category to debug.
+# Very handy.
+# Base Category
+log4j.logger.er=INFO
+
+# ERExtensions
+# Transaction - Switching this to debug will start the sql ouputting.
+log4j.logger.er.transaction.adaptor.EOAdaptorDebugEnabled=DEBUG
+
+# Fixes - Turning this on will show all the models that are loaded
+log4j.logger.er.extensions.fixes.ERSharedEOLoader=INFO
+
+er.extensions.ERXNSLogLog4jBridge=INFO
+#log4j.logger.er.eo.ERXGenericRecord=DEBUG
+#log4j.logger.er.validation.ERXEntityClassDescription=DEBUG
+#log4j.logger.er.default.ERXEntityClassDescription=DEBUG
+log4j.logger.er.extensions.ERXDatabaseContextDelegate=WARN
+log4j.logger.er.extensions.ERXConfigurationManager=INFO
+#log4j.logger.er.extensions.ERXApplication.RequestHandling=DEBUG
diff --git a/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/app/Application.java b/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/app/Application.java
new file mode 100644
index 00000000000..67fae999d77
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/app/Application.java
@@ -0,0 +1,16 @@
+package er.ajax.mootools.example.app;
+
+import er.extensions.appserver.ERXApplication;
+
+public class Application extends ERXApplication {
+ public static void main(String[] argv) {
+ ERXApplication.main(argv, Application.class);
+ }
+
+ public Application() {
+ ERXApplication.log.info("Welcome to " + name() + " !");
+ /* ** put your initialization code in here ** */
+ setAllowsConcurrentRequestHandling(true);
+ setDefaultRequestHandler(requestHandlerForKey(directActionRequestHandlerKey()));
+ }
+}
diff --git a/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/app/DirectAction.java b/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/app/DirectAction.java
new file mode 100644
index 00000000000..2a3fa66f2a0
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/app/DirectAction.java
@@ -0,0 +1,19 @@
+package er.ajax.mootools.example.app;
+
+import com.webobjects.appserver.WOActionResults;
+import com.webobjects.appserver.WORequest;
+
+import er.ajax.mootools.example.components.HomePage;
+import er.extensions.appserver.ERXDirectAction;
+
+
+public class DirectAction extends ERXDirectAction {
+ public DirectAction(WORequest request) {
+ super(request);
+ }
+
+ @Override
+ public WOActionResults defaultAction() {
+ return pageWithName(HomePage.class);
+ }
+}
diff --git a/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/app/PageAction.java b/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/app/PageAction.java
new file mode 100644
index 00000000000..7f13deb1a64
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/app/PageAction.java
@@ -0,0 +1,19 @@
+package er.ajax.mootools.example.app;
+
+import com.webobjects.appserver.WOActionResults;
+import com.webobjects.appserver.WORequest;
+
+import er.extensions.appserver.ERXDirectAction;
+
+public class PageAction extends ERXDirectAction {
+
+ public PageAction(WORequest request) {
+ super(request);
+ }
+
+ @Override
+ public WOActionResults performActionNamed(String actionName) {
+ return pageWithName(actionName);
+ }
+
+}
diff --git a/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/app/Session.java b/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/app/Session.java
new file mode 100644
index 00000000000..85cdc537b9e
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/app/Session.java
@@ -0,0 +1,11 @@
+package er.ajax.mootools.example.app;
+
+import er.extensions.appserver.ERXSession;
+
+public class Session extends ERXSession {
+ private static final long serialVersionUID = 1L;
+
+ public String selectedTab = "InlineContent";
+ public Session() {
+ }
+}
diff --git a/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/components/Comment.java b/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/components/Comment.java
new file mode 100644
index 00000000000..e0bed1ef07d
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/components/Comment.java
@@ -0,0 +1,16 @@
+package er.ajax.mootools.example.components;
+
+public class Comment {
+ private String _text;
+
+ public Comment() {
+ }
+
+ public void setText(String text) {
+ _text = text;
+ }
+
+ public String text() {
+ return _text;
+ }
+}
diff --git a/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/components/Company.java b/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/components/Company.java
new file mode 100644
index 00000000000..255d8f28c17
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/components/Company.java
@@ -0,0 +1,7 @@
+package er.ajax.mootools.example.components;
+
+import org.apache.log4j.Logger;
+
+public class Company extends _Company {
+ private static Logger log = Logger.getLogger(Company.class);
+}
diff --git a/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/components/ComplexPerson.java b/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/components/ComplexPerson.java
new file mode 100644
index 00000000000..14a1fc1075d
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/components/ComplexPerson.java
@@ -0,0 +1,63 @@
+package er.ajax.mootools.example.components;
+
+import com.webobjects.foundation.NSArray;
+import com.webobjects.foundation.NSMutableArray;
+
+public class ComplexPerson extends SimplePerson {
+
+ private ComplexPerson _spouse;
+ private NSMutableArray _children = new NSMutableArray();
+
+ public ComplexPerson(String name, int age) {
+ super(name, age);
+ }
+
+ public ComplexPerson() {
+ }
+
+ public boolean simpleEquals(ComplexPerson person) {
+ return super.equals(person);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ boolean equals = (obj instanceof ComplexPerson);
+ if (equals) {
+ ComplexPerson other = (ComplexPerson)obj;
+ equals = simpleEquals(other);
+ if (equals) {
+ if (_spouse == null) {
+ equals = (other._spouse == null);
+ }
+ else {
+ equals = _spouse.simpleEquals(other._spouse);
+ }
+ }
+ if (equals) {
+ equals = (_children.count() == other._children.count());
+ }
+ if (equals) {
+ for (int i = 0; i < _children.count(); i ++) {
+ equals &= _children.objectAtIndex(i).simpleEquals(other._children.objectAtIndex(i));
+ }
+ }
+ }
+ return equals;
+ }
+
+ public ComplexPerson getSpouse() {
+ return _spouse;
+ }
+
+ public void setSpouse(ComplexPerson spouse) {
+ _spouse = spouse;
+ }
+
+ public NSArray getChildren() {
+ return _children;
+ }
+
+ public void setChildren(NSArray children) {
+ _children = children != null ? children.mutableClone() : null;
+ }
+}
\ No newline at end of file
diff --git a/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/components/Employee.java b/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/components/Employee.java
new file mode 100644
index 00000000000..9503e5fbb56
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/components/Employee.java
@@ -0,0 +1,7 @@
+package er.ajax.mootools.example.components;
+
+import org.apache.log4j.Logger;
+
+public class Employee extends _Employee {
+ private static Logger log = Logger.getLogger(Employee.class);
+}
diff --git a/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/components/ExampleDataFactory.java b/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/components/ExampleDataFactory.java
new file mode 100644
index 00000000000..09a86bea64d
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/components/ExampleDataFactory.java
@@ -0,0 +1,139 @@
+package er.ajax.mootools.example.components;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Random;
+
+import com.webobjects.eocontrol.EOEditingContext;
+import com.webobjects.eocontrol.EOSortOrdering;
+import com.webobjects.foundation.NSArray;
+import com.webobjects.foundation.NSMutableArray;
+
+import er.extensions.components.ERXLoremIpsumGenerator;
+import er.extensions.foundation.ERXFileUtilities;
+
+public class ExampleDataFactory {
+
+ private static NSMutableArray _exampleData;
+
+ public static NSMutableArray randomWords(int count) {
+ NSMutableArray words = new NSMutableArray();
+ Random rand = new Random();
+ for (int i = 0; i < count; i++) {
+ String s = "";
+ int max = 6 + rand.nextInt(6);
+ for (int j = 0; j < max; j++) {
+ int c = rand.nextInt(26);
+ s += Character.toString((char) ('A' + c));
+ }
+ Word example = new Word(s);
+ words.addObject(example);
+ }
+ return words;
+ }
+
+ public static synchronized NSArray someWords(int count) {
+ NSArray allWords = allWords();
+ NSMutableArray someWords = new NSMutableArray();
+ for (int i = 0; i < count; i ++) {
+ someWords.addObject(allWords.objectAtIndex((int)(Math.random() * allWords.count())));
+ }
+ return someWords;
+ }
+
+ public static synchronized NSArray allWords() {
+ // some sample data. if we don't find the file, just create random strings
+ if (_exampleData == null) {
+ _exampleData = new NSMutableArray();
+ File f = new File("/usr/share/dict/words");
+ if (f.exists()) {
+ try {
+ String words = ERXFileUtilities.stringFromFile(f);
+ String splitWords[] = words.split("\\n");
+ for (int i = 0; i < splitWords.length; i++) {
+ String word = splitWords[i];
+ // we don't want all words, that just takes too long
+ if (word.length() > 0 && ((i % 20) == 0)) {
+ Word example = new Word(word);
+ _exampleData.addObject(example);
+ }
+ }
+ }
+ catch (IOException e) {
+ System.out.println("ExampleUtils.exampleValues: Can't read " + f + ": " + e);
+ }
+ }
+ if (_exampleData.count() == 0) {
+ _exampleData.addObjectsFromArray(ExampleDataFactory.randomWords(1000));
+ }
+ EOSortOrdering.sortArrayUsingKeyOrderArray(_exampleData, new NSArray(EOSortOrdering.sortOrderingWithKey("name", EOSortOrdering.CompareAscending)));
+
+ }
+ return _exampleData.immutableClone();
+ }
+
+ public static NSMutableArray products(int count) {
+ NSMutableArray products = new NSMutableArray();
+ for (int i = 0; i < count; i++) {
+ String title = ERXLoremIpsumGenerator.words(1, 5);
+ String summary = ERXLoremIpsumGenerator.paragraph();
+ Product product = new Product(title, summary);
+ products.addObject(product);
+ }
+ return products;
+ }
+
+ public static NSMutableArray family() {
+ NSMutableArray people = new NSMutableArray();
+ ComplexPerson mike = new ComplexPerson("Mike", 29);
+ ComplexPerson kirsten = new ComplexPerson("Kirsten", 29);
+ ComplexPerson andrew = new ComplexPerson("Andrew", 2);
+ mike.setSpouse(kirsten);
+ kirsten.setSpouse(mike);
+ mike.setChildren(new NSArray(andrew));
+ kirsten.setChildren(new NSArray(andrew));
+ people.add(mike);
+ people.add(kirsten);
+ people.add(andrew);
+ return people;
+ }
+
+ public static NSArray companies(EOEditingContext editingContext) {
+ NSArray companies = Company.fetchAllCompanies(editingContext);
+ if (companies.count() == 0) {
+ Company.createCompany(editingContext, "Company 1");
+ Company.createCompany(editingContext, "Company 2");
+ Company.createCompany(editingContext, "Company 3");
+ Company.createCompany(editingContext, "Company 4");
+ editingContext.saveChanges();
+ companies = Company.fetchAllCompanies(editingContext);
+ }
+ return companies;
+ }
+
+ public static NSMutableArray comments(int count) {
+ NSMutableArray comments = new NSMutableArray();
+ for (int i = 1; i < count; i++) {
+ Comment comment = new Comment();
+ comment.setText("This is comment #" + i);
+ comments.addObject(comment);
+ }
+ return comments;
+ }
+
+ public static NSMutableArray values(String prefix, int count) {
+ NSMutableArray values = new NSMutableArray();
+ for (int i = 0; i < count; i++) {
+ values.addObject(prefix + i);
+ }
+ return values;
+ }
+
+ public static NSMutableArray- items(String idSuffix, String prefix, int count) {
+ NSMutableArray
- items = new NSMutableArray
- ();
+ for (int i = 0; i < count; i++) {
+ items.addObject(new Item(String.valueOf(i) + idSuffix, prefix + i));
+ }
+ return items;
+ }
+}
diff --git a/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/components/HomePage.java b/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/components/HomePage.java
new file mode 100644
index 00000000000..219abf4bae9
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/components/HomePage.java
@@ -0,0 +1,13 @@
+package er.ajax.mootools.example.components;
+
+import com.webobjects.appserver.WOContext;
+
+public class HomePage extends Main {
+ public HomePage(WOContext context) {
+ super(context);
+ }
+
+ public String pageTitle() {
+ return "MooTools meets Project Wonder's Ajax Framework version 3";
+ }
+}
\ No newline at end of file
diff --git a/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/components/InfiniteTreeNode.java b/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/components/InfiniteTreeNode.java
new file mode 100644
index 00000000000..43dbd96d471
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/components/InfiniteTreeNode.java
@@ -0,0 +1,58 @@
+package er.ajax.mootools.example.components;
+
+import com.webobjects.foundation.NSArray;
+import com.webobjects.foundation.NSMutableArray;
+
+import er.ajax.AjaxTreeModel;
+
+public class InfiniteTreeNode {
+ private Object _parentTreeNode;
+ private NSMutableArray
_children;
+ private String _name;
+ private int _depth;
+
+ public InfiniteTreeNode(Object parentTreeNode, String name, int depth) {
+ _parentTreeNode = parentTreeNode;
+ _name = name;
+ _depth = depth;
+ }
+
+ public synchronized NSArray childrenTreeNodes() {
+ if (_children == null && _depth < 2) {
+ _children = new NSMutableArray();
+ for (int i = 0; i < 5; i++) {
+ _children.addObject(new InfiniteTreeNode(this, _name + " Child " + i, _depth + 1));
+ }
+ }
+ return _children;
+ }
+
+ public Object parentTreeNode() {
+ return _parentTreeNode;
+ }
+
+ @Override
+ public String toString() {
+ return _name;
+ }
+
+ public static class Delegate implements AjaxTreeModel.Delegate {
+ public NSArray childrenTreeNodes(Object node) {
+ InfiniteTreeNode treeNode = (InfiniteTreeNode) node;
+ return treeNode.childrenTreeNodes();
+ }
+
+ public boolean isLeaf(Object node) {
+ InfiniteTreeNode treeNode = (InfiniteTreeNode) node;
+ return treeNode.childrenTreeNodes() == null;
+ }
+
+ public Object parentTreeNode(Object node) {
+ InfiniteTreeNode treeNode = (InfiniteTreeNode) node;
+ if (treeNode == null) {
+ return null;
+ }
+ return treeNode.parentTreeNode();
+ }
+ }
+}
diff --git a/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/components/Item.java b/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/components/Item.java
new file mode 100644
index 00000000000..facbed25a6f
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/components/Item.java
@@ -0,0 +1,24 @@
+package er.ajax.mootools.example.components;
+
+public class Item {
+ private String _id;
+ private String _name;
+
+ public Item(String id, String name) {
+ _id = id;
+ _name = name;
+ }
+
+ public String name() {
+ return _name;
+ }
+
+ public String id() {
+ return _id;
+ }
+
+ @Override
+public String toString() {
+ return "[Item: id = " + _id + "]";
+ }
+}
diff --git a/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/components/MTASBTestPage.java b/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/components/MTASBTestPage.java
new file mode 100644
index 00000000000..a9441a09818
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/components/MTASBTestPage.java
@@ -0,0 +1,33 @@
+package er.ajax.mootools.example.components;
+
+import com.webobjects.appserver.WOComponent;
+import com.webobjects.appserver.WOContext;
+
+public class MTASBTestPage extends Main {
+
+ public String _wifeName = "Honey";
+ public String _kidName = "Gisele";
+ public String _dogName = "Astro Nut";
+ public String _catName = "Brazil Nut";
+
+ public MTASBTestPage(WOContext context) {
+ super(context);
+ }
+
+
+ public WOComponent updateNames() {
+ return null;
+ }
+
+ public WOComponent updateNamesSlowly() {
+
+ setTask(new Task());
+ task().start();
+ do {
+ System.out.println(task().getStatus());
+ } while(! task().getStatus().equals("Finished"));
+
+ return null;
+ }
+
+}
\ No newline at end of file
diff --git a/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/components/MTAUCPeriodicalTestPage.java b/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/components/MTAUCPeriodicalTestPage.java
new file mode 100644
index 00000000000..0092e64ff86
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/components/MTAUCPeriodicalTestPage.java
@@ -0,0 +1,29 @@
+package er.ajax.mootools.example.components;
+
+import com.webobjects.appserver.WOActionResults;
+import com.webobjects.appserver.WOContext;
+import com.webobjects.foundation.NSTimestamp;
+
+public class MTAUCPeriodicalTestPage extends Main {
+
+ public NSTimestamp _now;
+
+ public MTAUCPeriodicalTestPage(WOContext context) {
+ super(context);
+ _updateTime();
+ }
+
+ private void _updateTime() {
+ _now = new NSTimestamp();
+ }
+
+ public WOActionResults updateTime() {
+ _updateTime();
+ return null;
+ }
+
+ public String pageTitle() {
+ return "This demonstrates applying the frequency binding (4s) to the MTAjaxUpdateContainer";
+ }
+
+}
\ No newline at end of file
diff --git a/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/components/MTAULTestPage.java b/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/components/MTAULTestPage.java
new file mode 100644
index 00000000000..abf855606a9
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/components/MTAULTestPage.java
@@ -0,0 +1,34 @@
+package er.ajax.mootools.example.components;
+
+import com.webobjects.appserver.WOActionResults;
+import com.webobjects.appserver.WOContext;
+import com.webobjects.foundation.NSTimestamp;
+
+public class MTAULTestPage extends Main {
+
+ public NSTimestamp _now;
+
+ public MTAULTestPage(WOContext context) {
+ super(context);
+ _updateTime();
+ }
+
+ public void _updateTime() {
+ _now = new NSTimestamp();
+ }
+
+ public WOActionResults updateTime() {
+ _updateTime();
+ return null;
+ }
+
+ public WOActionResults updateTimeSlow() {
+ setTask(new Task());
+ task().start();
+ do {
+ System.out.println(task().getStatus());
+ } while(! task().getStatus().equals("Finished"));
+ return updateTime();
+ }
+
+}
diff --git a/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/components/MTAccordionTestPage.java b/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/components/MTAccordionTestPage.java
new file mode 100644
index 00000000000..88083cbaa86
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/components/MTAccordionTestPage.java
@@ -0,0 +1,9 @@
+package er.ajax.mootools.example.components;
+
+import com.webobjects.appserver.WOContext;
+
+public class MTAccordionTestPage extends Main {
+ public MTAccordionTestPage(WOContext context) {
+ super(context);
+ }
+}
\ No newline at end of file
diff --git a/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/components/MTAjaxDragDropTestPage.java b/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/components/MTAjaxDragDropTestPage.java
new file mode 100644
index 00000000000..fbbce6b9a8f
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/components/MTAjaxDragDropTestPage.java
@@ -0,0 +1,52 @@
+package er.ajax.mootools.example.components;
+
+import com.webobjects.appserver.WOActionResults;
+import com.webobjects.appserver.WOContext;
+import com.webobjects.foundation.NSMutableArray;
+
+public class MTAjaxDragDropTestPage extends Main {
+
+ public Object o1 = "Object 0";
+ public String droppedDraggableID;
+ public String droppedArea;
+ public NSMutableArray objects = new NSMutableArray();
+ public Object item;
+ public Object droppedObject;
+
+ public String statusMessage;
+
+ public MTAjaxDragDropTestPage(WOContext context) {
+ super(context);
+ for (int i = 1; i < 10; i++) {
+ objects.addObject("Object " + i);
+ }
+ statusMessage = "Drag one of the green draggable items onto one of the blue droppable items.";
+ }
+
+
+ public String draggableExample2() {
+ String id = "draggableExample_" + context().elementID().replace('.', '_');
+ return id;
+ }
+
+ public WOActionResults droppedDraggable1() {
+ statusMessage = "DragAndDropExample.droppedDraggableID: draggable ID '" + droppedObject
+ + "' dropped onto : " + droppedArea;
+ /*
+ setTask(new Task());
+ task().start();
+ do {
+ System.out.println(task().getStatus());
+ } while(! task().getStatus().equals("Finished"));
+ */
+ return null;
+ }
+
+ public WOActionResults droppedDraggable2() {
+ System.out.println("DragAndDropExample.droppedDraggableID: draggable ID '" + droppedDraggableID
+ + "' dropped onto 2: " + droppedObject);
+ System.out.println("DragAndDropExample.droppedDraggable2: draggable object = " + droppedObject);
+ return null;
+ }
+
+}
\ No newline at end of file
diff --git a/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/components/MTAjaxModalContainerTestPage.java b/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/components/MTAjaxModalContainerTestPage.java
new file mode 100644
index 00000000000..ffa4eec84da
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/components/MTAjaxModalContainerTestPage.java
@@ -0,0 +1,26 @@
+package er.ajax.mootools.example.components;
+
+import com.webobjects.appserver.WOContext;
+import com.webobjects.foundation.NSArray;
+
+import er.extensions.foundation.ERXStringUtilities;
+
+public class MTAjaxModalContainerTestPage extends Main {
+
+ public NSArray _words;
+ public Word _repetitionWord;
+
+ public MTAjaxModalContainerTestPage(WOContext context) {
+ super(context);
+ _words = ExampleDataFactory.randomWords(10);
+ }
+
+ public String wordID() {
+ return ERXStringUtilities.safeIdentifierName(String.valueOf(_words.indexOf(_repetitionWord)));
+ }
+
+ public String onSuccessFunction() {
+ return wordID() + ".hide().destroy();";
+ }
+
+}
\ No newline at end of file
diff --git a/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/components/MTAjaxObserveFieldTestPage.java b/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/components/MTAjaxObserveFieldTestPage.java
new file mode 100644
index 00000000000..8d2f62dd0d0
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/components/MTAjaxObserveFieldTestPage.java
@@ -0,0 +1,53 @@
+package er.ajax.mootools.example.components;
+
+import com.webobjects.appserver.WOActionResults;
+import com.webobjects.appserver.WOContext;
+import com.webobjects.foundation.NSArray;
+
+public class MTAjaxObserveFieldTestPage extends Main {
+
+ public String primaryColor, selectedPrimaryColor, secondaryColor, selectedSecondaryColor;
+ private NSArray _secondaryColors;
+
+ public MTAjaxObserveFieldTestPage(WOContext context) {
+ super(context);
+ }
+
+ public WOActionResults doStuff() {
+ wasteTime();
+ return null;
+ }
+
+ public NSArray primaryColors() {
+ return new NSArray(new String[] {
+ "Red", "Yellow", "Green"
+ });
+ }
+
+ public NSArray secondaryColors() {
+
+ int index = selectedPrimaryColor != null ? primaryColors().indexOf(selectedPrimaryColor) : -1;
+ switch (index) {
+ case 0:
+ setSecondaryColors(new NSArray(new String[] { "light red", "red", "dark red"}));
+ break;
+ case 1:
+ setSecondaryColors(new NSArray(new String[] { "light yellow", "yellow", "dark yellow" }));
+ break;
+ case 2:
+ setSecondaryColors(new NSArray(new String[] { "light green", "green", "dark green" }));
+ break;
+ default:
+ _secondaryColors = null;
+ }
+
+ return _secondaryColors;
+
+ }
+
+ public void setSecondaryColors(NSArray secondaryColors) {
+ wasteTime();
+ _secondaryColors = secondaryColors;
+ }
+
+}
\ No newline at end of file
diff --git a/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/components/MTAjaxSortablesTestPage.java b/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/components/MTAjaxSortablesTestPage.java
new file mode 100644
index 00000000000..64349252959
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/components/MTAjaxSortablesTestPage.java
@@ -0,0 +1,67 @@
+package er.ajax.mootools.example.components;
+
+import com.webobjects.appserver.WOActionResults;
+import com.webobjects.appserver.WOContext;
+import com.webobjects.appserver.WOResourceManager;
+import com.webobjects.foundation.NSDictionary;
+import com.webobjects.foundation.NSMutableArray;
+import com.webobjects.foundation.NSMutableDictionary;
+
+public class MTAjaxSortablesTestPage extends Main {
+
+ private NSMutableArray> _listA;
+
+ public MTAjaxSortablesTestPage(WOContext context) {
+ super(context);
+ _listA = new NSMutableArray>();
+ NSMutableDictionary red = new NSMutableDictionary();
+ red.takeValueForKey(redSquareSrc(), "url");
+ red.takeValueForKey("Red", "title");
+ red.takeValueForKey(1, "id");
+ _listA.addObject(red);
+ NSMutableDictionary yellow = new NSMutableDictionary();
+ yellow.takeValueForKey(yellowSquareSrc(), "url");
+ yellow.takeValueForKey("Yellow", "title");
+ yellow.takeValueForKey(2, "id");
+ _listA.addObject(yellow);
+ NSMutableDictionary green = new NSMutableDictionary();
+ green.takeValueForKey(greenSquareSrc(), "url");
+ green.takeValueForKey("Green", "title");
+ green.takeValueForKey(3, "id");
+ _listA.addObject(green);
+
+ }
+
+
+ public String redSquareSrc() {
+ WOResourceManager rm = application().resourceManager();
+ return rm.urlForResourceNamed("img/Red_Thumb.png", "app", null, context().request());
+ }
+
+ public String yellowSquareSrc() {
+ WOResourceManager rm = application().resourceManager();
+ return rm.urlForResourceNamed("img/Yellow_Thumb.png", "app", null, context().request());
+ }
+
+ public String greenSquareSrc() {
+ WOResourceManager rm = application().resourceManager();
+ return rm.urlForResourceNamed("img/Green_Thumb.png", "app", null, context().request());
+ }
+
+ public NSMutableArray> listA() {
+ return _listA;
+ }
+
+ public WOActionResults orderChanged() {
+ System.out.println("Hello?");
+ return null;
+ }
+
+ public NSDictionary repetitionListItemA;
+
+ public WOActionResults saveChanges() {
+ return null;
+ }
+
+
+}
\ No newline at end of file
diff --git a/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/components/MTAjaxTabbedPanelTestPage.java b/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/components/MTAjaxTabbedPanelTestPage.java
new file mode 100644
index 00000000000..aaf3122853b
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/components/MTAjaxTabbedPanelTestPage.java
@@ -0,0 +1,59 @@
+package er.ajax.mootools.example.components;
+
+import com.webobjects.appserver.WOComponent;
+import com.webobjects.appserver.WOContext;
+import com.webobjects.foundation.NSTimestamp;
+
+import er.ajax.mootools.example.app.Session;
+
+public class MTAjaxTabbedPanelTestPage extends Main {
+
+ public String formValueA;
+ public String formValueB;
+ public String formValueC;
+
+ public MTAjaxTabbedPanelTestPage(WOContext context) {
+ super(context);
+ }
+
+ public boolean isSlowLoadingContentSelected() {
+ System.out.println(theSession().selectedTab);
+ return "SlowLoadingContent".equals(theSession().selectedTab);
+ }
+
+ public void setIsSlowLoadingContentSelected(boolean isSelected) {
+ if (isSelected) theSession().selectedTab = "SlowLoadingContent";
+ }
+
+ public boolean isInlineContentSelected() {
+ return "InlineContent".equals(theSession().selectedTab);
+ }
+
+ public void setIsInlineContentSelected(boolean isSelected) {
+ if (isSelected) theSession().selectedTab = "InlineContent";
+ }
+
+ public boolean isRefreshingContentSelected() {
+ return "RefreshingContent".equals(theSession().selectedTab);
+ }
+
+ public void setIsRefreshingContentSelected(boolean isSelected) {
+ if (isSelected) theSession().selectedTab = "RefreshingContent";
+ }
+
+ public Session theSession() {
+ return (Session)session();
+ }
+
+ public NSTimestamp now() {
+ return new NSTimestamp();
+ }
+
+ public WOComponent save() {
+ System.out.println("formValueA " + formValueA);
+ System.out.println("formValueB " + formValueB);
+ System.out.println("formValueB " + formValueC);
+ return context().page();
+ }
+
+}
\ No newline at end of file
diff --git a/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/components/MTAjaxTreeExamplePage.java b/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/components/MTAjaxTreeExamplePage.java
new file mode 100644
index 00000000000..dddeef8d7c7
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/components/MTAjaxTreeExamplePage.java
@@ -0,0 +1,41 @@
+package er.ajax.mootools.example.components;
+
+import com.webobjects.appserver.WOActionResults;
+import com.webobjects.appserver.WOContext;
+
+public class MTAjaxTreeExamplePage extends Main {
+
+ public Object _rootTreeNode;
+ public Object _rootTreeNode2;
+ private Object _treeNode;
+ private Object _delegate;
+ public String selectedNode;
+
+ public MTAjaxTreeExamplePage(WOContext context) {
+ super(context);
+ _rootTreeNode = new InfiniteTreeNode(null, "Root", 0);
+ _rootTreeNode2 = new InfiniteTreeNode(null, "Root2", 0);
+ }
+
+ public void setTreeNode(Object treeNode) {
+ _treeNode = treeNode;
+ }
+
+ public Object getTreeNode() {
+ return _treeNode;
+ }
+
+ public WOActionResults nodeSelected() {
+ selectedNode = _treeNode.toString();
+ System.out.println("AjaxTreeExample.nodeSelected: selected " + _treeNode);
+ return null;
+ }
+
+ public Object delegate() {
+ if (_delegate == null) {
+ _delegate = new InfiniteTreeNode.Delegate();
+ }
+ return _delegate;
+
+ }
+}
\ No newline at end of file
diff --git a/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/components/MTFileUploadTestPage.java b/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/components/MTFileUploadTestPage.java
new file mode 100644
index 00000000000..ea0ea07072d
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/components/MTFileUploadTestPage.java
@@ -0,0 +1,52 @@
+package er.ajax.mootools.example.components;
+
+import com.webobjects.appserver.WOActionResults;
+import com.webobjects.appserver.WOContext;
+import com.webobjects.foundation.NSData;
+
+import er.ajax.AjaxProgress;
+import er.ajax.AjaxUploadProgress;
+
+public class MTFileUploadTestPage extends Main {
+
+ public NSData _data;
+ public AjaxUploadProgress _uploadProgress;
+ public AjaxProgress _progress;
+
+ public MTFileUploadTestPage(WOContext context) {
+ super(context);
+ _progress = new AjaxProgress(100);
+ Thread progressThread = new Thread(new Runnable() {
+
+ public void run() {
+ // TODO Auto-generated method stub
+ for(int i = 0; i < _progress.maximum(); i++) {
+ _progress.setValue(i);
+ _progress.setStatus("Performing operation #" + i + " ...");
+ try {
+ Thread.sleep(100);
+ } catch (Throwable t) {
+
+ }
+ }
+ _progress.setDone(true);
+ }
+
+ });
+
+ progressThread.start();
+
+ }
+
+ public long now() {
+ return System.currentTimeMillis();
+ }
+
+ public WOActionResults uploadFinished() {
+ System.out.println("FileUploadExample.uploadFinished: FINISHED!");
+ if (_data != null) {
+ System.out.println("FileUploadExample.uploadFinished: Data Size = " + _data.length());
+ }
+ return null;
+ }
+}
\ No newline at end of file
diff --git a/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/components/MTJSDatePickerTestPage.java b/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/components/MTJSDatePickerTestPage.java
new file mode 100644
index 00000000000..db2449e7ac1
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/components/MTJSDatePickerTestPage.java
@@ -0,0 +1,33 @@
+package er.ajax.mootools.example.components;
+
+import com.webobjects.appserver.WOActionResults;
+import com.webobjects.appserver.WOContext;
+import com.webobjects.appserver.WOResponse;
+import com.webobjects.foundation.NSTimestamp;
+
+import er.ajax.mootools.MTAjaxUtils;
+
+public class MTJSDatePickerTestPage extends Main {
+
+ public NSTimestamp _today;
+
+ public MTJSDatePickerTestPage(WOContext context) {
+ super(context);
+ _updateTime();
+ }
+
+ public void appendToResponse(WOResponse response, WOContext context) {
+ super.appendToResponse(response, context);
+ MTAjaxUtils.addStylesheetResourceInHead(context, response, "app", "datepicker_dashboard/datepicker_dashboard.css");
+ }
+
+ private void _updateTime() {
+ _today = new NSTimestamp();
+ }
+
+ public WOActionResults updateTime() {
+ return null;
+ }
+
+
+}
\ No newline at end of file
diff --git a/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/components/MTJSSliderTestPage.java b/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/components/MTJSSliderTestPage.java
new file mode 100644
index 00000000000..b34de074042
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/components/MTJSSliderTestPage.java
@@ -0,0 +1,25 @@
+package er.ajax.mootools.example.components;
+
+import com.webobjects.appserver.WOContext;
+
+public class MTJSSliderTestPage extends Main {
+ private int sliderValue;
+
+ public MTJSSliderTestPage(WOContext context) {
+ super(context);
+ }
+
+ /**
+ * @return the sliderValue
+ */
+ public int sliderValue() {
+ return sliderValue;
+ }
+
+ /**
+ * @param sliderValue the sliderValue to set
+ */
+ public void setSliderValue(int sliderValue) {
+ this.sliderValue = sliderValue;
+ }
+}
\ No newline at end of file
diff --git a/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/components/Main.java b/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/components/Main.java
new file mode 100644
index 00000000000..cf9348ab14d
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/components/Main.java
@@ -0,0 +1,62 @@
+package er.ajax.mootools.example.components;
+
+import com.webobjects.appserver.WOContext;
+
+import er.extensions.components.ERXComponent;
+
+public class Main extends ERXComponent {
+
+ public String _pageTitle;
+ private Task _task;
+
+ public Main(WOContext context) {
+ super(context);
+ }
+
+ public void setTask(Task task) {
+ this._task = task;
+ }
+
+ public Task task() {
+ return _task;
+ }
+
+ public static class Task extends Thread {
+ int stage = 0;
+ String status = "Idle";
+
+ @Override
+ public void run() {
+
+ try {
+ setStatus("Starting up");
+ while (stage < 3) {
+ sleep(1000);
+ stage++;
+ setStatus("Currently at stage: " + stage);
+ }
+ setStatus("Finished");
+ }
+ catch (InterruptedException e) {
+ status = "Interrupted";
+ }
+ }
+
+ private void setStatus(String value) {
+ status = value;
+ }
+
+ public String getStatus() {
+ return status;
+ }
+ }
+
+ public void wasteTime() {
+ setTask(new Task());
+ task().start();
+ do {
+ System.out.println(task().getStatus());
+ } while(! task().getStatus().equals("Finished"));
+ }
+
+}
diff --git a/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/components/Product.java b/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/components/Product.java
new file mode 100644
index 00000000000..23cda40fbaa
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/components/Product.java
@@ -0,0 +1,28 @@
+package er.ajax.mootools.example.components;
+public class Product {
+ private String _title;
+ private String _summary;
+
+ public Product(String title, String summary) {
+ _title = title;
+ _summary = summary;
+ }
+
+ public String title() {
+ return _title;
+ }
+
+ public String summary() {
+ return _summary;
+ }
+
+ public String partialSummary() {
+ int length = Math.min(30, _summary.length());
+ return _summary.substring(0, 30) + " ...";
+ }
+
+ @Override
+ public String toString() {
+ return "[Product: " + _title + "]";
+ }
+}
diff --git a/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/components/SimplePerson.java b/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/components/SimplePerson.java
new file mode 100644
index 00000000000..6a618b1e5f1
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/components/SimplePerson.java
@@ -0,0 +1,41 @@
+package er.ajax.mootools.example.components;
+
+public class SimplePerson {
+ private String _name;
+ private int _age;
+
+ public SimplePerson(String name, int age) {
+ _name = name;
+ _age = age;
+ }
+
+ public SimplePerson() {
+
+ }
+
+ public String getName() {
+ return _name;
+ }
+
+ public void setName(String name) {
+ _name = name;
+ }
+
+ public int getAge() {
+ return _age;
+ }
+
+ public void setAge(int age) {
+ _age = age;
+ }
+
+ @Override
+ public int hashCode() {
+ return _name.hashCode();
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ return obj instanceof SimplePerson && ((SimplePerson)obj)._name.equals(_name);
+ }
+}
\ No newline at end of file
diff --git a/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/components/Word.java b/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/components/Word.java
new file mode 100644
index 00000000000..b5ba9b7549a
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/components/Word.java
@@ -0,0 +1,20 @@
+package er.ajax.mootools.example.components;
+
+/**
+ * Just some example data.
+ */
+
+public class Word {
+ public String name;
+ public int value;
+
+ public Word(String name) {
+ this.name = name;
+ this.value = name.length();
+ }
+
+ @Override
+ public String toString() {
+ return "<" + name + ": " + value + ">";
+ }
+}
\ No newline at end of file
diff --git a/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/components/_Company.java b/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/components/_Company.java
new file mode 100644
index 00000000000..2560b8f5cfa
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/components/_Company.java
@@ -0,0 +1,215 @@
+// $LastChangedRevision: 4733 $ DO NOT EDIT. Make changes to Company.java instead.
+package er.ajax.mootools.example.components;
+
+import java.util.Enumeration;
+import java.util.NoSuchElementException;
+
+import org.apache.log4j.Logger;
+
+import com.webobjects.eoaccess.EOUtilities;
+import com.webobjects.eocontrol.EOAndQualifier;
+import com.webobjects.eocontrol.EOClassDescription;
+import com.webobjects.eocontrol.EOEditingContext;
+import com.webobjects.eocontrol.EOEnterpriseObject;
+import com.webobjects.eocontrol.EOFetchSpecification;
+import com.webobjects.eocontrol.EOKeyValueQualifier;
+import com.webobjects.eocontrol.EOQualifier;
+import com.webobjects.eocontrol.EOSortOrdering;
+import com.webobjects.foundation.NSArray;
+import com.webobjects.foundation.NSMutableArray;
+
+import er.extensions.eof.ERXGenericRecord;
+import er.extensions.eof.ERXKey;
+
+@SuppressWarnings("all")
+public abstract class _Company extends ERXGenericRecord {
+ public static final String ENTITY_NAME = "Company";
+
+ // Attribute Keys
+ public static final ERXKey NAME = new ERXKey("name");
+ // Relationship Keys
+ public static final ERXKey EMPLOYEES = new ERXKey("employees");
+
+ // Attributes
+ public static final String NAME_KEY = NAME.key();
+ // Relationships
+ public static final String EMPLOYEES_KEY = EMPLOYEES.key();
+
+ private static Logger LOG = Logger.getLogger(_Company.class);
+
+ public Company localInstanceIn(EOEditingContext editingContext) {
+ Company localInstance = (Company)EOUtilities.localInstanceOfObject(editingContext, this);
+ if (localInstance == null) {
+ throw new IllegalStateException("You attempted to localInstance " + this + ", which has not yet committed.");
+ }
+ return localInstance;
+ }
+
+ public String name() {
+ return (String) storedValueForKey("name");
+ }
+
+ public void setName(String value) {
+ if (_Company.LOG.isDebugEnabled()) {
+ _Company.LOG.debug( "updating name from " + name() + " to " + value);
+ }
+ takeStoredValueForKey(value, "name");
+ }
+
+ public NSArray employees() {
+ return (NSArray)storedValueForKey("employees");
+ }
+
+ public NSArray employees(EOQualifier qualifier) {
+ return employees(qualifier, null, false);
+ }
+
+ public NSArray employees(EOQualifier qualifier, boolean fetch) {
+ return employees(qualifier, null, fetch);
+ }
+
+ public NSArray employees(EOQualifier qualifier, NSArray sortOrderings, boolean fetch) {
+ NSArray results;
+ if (fetch) {
+ EOQualifier fullQualifier;
+ EOQualifier inverseQualifier = new EOKeyValueQualifier(er.ajax.mootools.example.components.Employee.COMPANY_KEY, EOQualifier.QualifierOperatorEqual, this);
+
+ if (qualifier == null) {
+ fullQualifier = inverseQualifier;
+ }
+ else {
+ NSMutableArray qualifiers = new NSMutableArray();
+ qualifiers.addObject(qualifier);
+ qualifiers.addObject(inverseQualifier);
+ fullQualifier = new EOAndQualifier(qualifiers);
+ }
+
+ results = er.ajax.mootools.example.components.Employee.fetchEmployees(editingContext(), fullQualifier, sortOrderings);
+ }
+ else {
+ results = employees();
+ if (qualifier != null) {
+ results = (NSArray)EOQualifier.filteredArrayWithQualifier(results, qualifier);
+ }
+ if (sortOrderings != null) {
+ results = (NSArray)EOSortOrdering.sortedArrayUsingKeyOrderArray(results, sortOrderings);
+ }
+ }
+ return results;
+ }
+
+ public void addToEmployees(er.ajax.mootools.example.components.Employee object) {
+ includeObjectIntoPropertyWithKey(object, "employees");
+ }
+
+ public void removeFromEmployees(er.ajax.mootools.example.components.Employee object) {
+ excludeObjectFromPropertyWithKey(object, "employees");
+ }
+
+ public void addToEmployeesRelationship(er.ajax.mootools.example.components.Employee object) {
+ if (_Company.LOG.isDebugEnabled()) {
+ _Company.LOG.debug("adding " + object + " to employees relationship");
+ }
+ if (er.extensions.eof.ERXGenericRecord.InverseRelationshipUpdater.updateInverseRelationships()) {
+ addToEmployees(object);
+ }
+ else {
+ addObjectToBothSidesOfRelationshipWithKey(object, "employees");
+ }
+ }
+
+ public void removeFromEmployeesRelationship(er.ajax.mootools.example.components.Employee object) {
+ if (_Company.LOG.isDebugEnabled()) {
+ _Company.LOG.debug("removing " + object + " from employees relationship");
+ }
+ if (er.extensions.eof.ERXGenericRecord.InverseRelationshipUpdater.updateInverseRelationships()) {
+ removeFromEmployees(object);
+ }
+ else {
+ removeObjectFromBothSidesOfRelationshipWithKey(object, "employees");
+ }
+ }
+
+ public er.ajax.mootools.example.components.Employee createEmployeesRelationship() {
+ EOClassDescription eoClassDesc = EOClassDescription.classDescriptionForEntityName("Employee");
+ EOEnterpriseObject eo = eoClassDesc.createInstanceWithEditingContext(editingContext(), null);
+ editingContext().insertObject(eo);
+ addObjectToBothSidesOfRelationshipWithKey(eo, "employees");
+ return (er.ajax.mootools.example.components.Employee) eo;
+ }
+
+ public void deleteEmployeesRelationship(er.ajax.mootools.example.components.Employee object) {
+ removeObjectFromBothSidesOfRelationshipWithKey(object, "employees");
+ editingContext().deleteObject(object);
+ }
+
+ public void deleteAllEmployeesRelationships() {
+ Enumeration objects = employees().immutableClone().objectEnumerator();
+ while (objects.hasMoreElements()) {
+ deleteEmployeesRelationship((er.ajax.mootools.example.components.Employee)objects.nextElement());
+ }
+ }
+
+
+ public static Company createCompany(EOEditingContext editingContext, String name
+) {
+ Company eo = (Company) EOUtilities.createAndInsertInstance(editingContext, _Company.ENTITY_NAME);
+ eo.setName(name);
+ return eo;
+ }
+
+ public static NSArray fetchAllCompanies(EOEditingContext editingContext) {
+ return _Company.fetchAllCompanies(editingContext, null);
+ }
+
+ public static NSArray fetchAllCompanies(EOEditingContext editingContext, NSArray sortOrderings) {
+ return _Company.fetchCompanies(editingContext, null, sortOrderings);
+ }
+
+ public static NSArray fetchCompanies(EOEditingContext editingContext, EOQualifier qualifier, NSArray sortOrderings) {
+ EOFetchSpecification fetchSpec = new EOFetchSpecification(_Company.ENTITY_NAME, qualifier, sortOrderings);
+ fetchSpec.setIsDeep(true);
+ NSArray eoObjects = (NSArray)editingContext.objectsWithFetchSpecification(fetchSpec);
+ return eoObjects;
+ }
+
+ public static Company fetchCompany(EOEditingContext editingContext, String keyName, Object value) {
+ return _Company.fetchCompany(editingContext, new EOKeyValueQualifier(keyName, EOQualifier.QualifierOperatorEqual, value));
+ }
+
+ public static Company fetchCompany(EOEditingContext editingContext, EOQualifier qualifier) {
+ NSArray eoObjects = _Company.fetchCompanies(editingContext, qualifier, null);
+ Company eoObject;
+ int count = eoObjects.count();
+ if (count == 0) {
+ eoObject = null;
+ }
+ else if (count == 1) {
+ eoObject = (Company)eoObjects.objectAtIndex(0);
+ }
+ else {
+ throw new IllegalStateException("There was more than one Company that matched the qualifier '" + qualifier + "'.");
+ }
+ return eoObject;
+ }
+
+ public static Company fetchRequiredCompany(EOEditingContext editingContext, String keyName, Object value) {
+ return _Company.fetchRequiredCompany(editingContext, new EOKeyValueQualifier(keyName, EOQualifier.QualifierOperatorEqual, value));
+ }
+
+ public static Company fetchRequiredCompany(EOEditingContext editingContext, EOQualifier qualifier) {
+ Company eoObject = _Company.fetchCompany(editingContext, qualifier);
+ if (eoObject == null) {
+ throw new NoSuchElementException("There was no Company that matched the qualifier '" + qualifier + "'.");
+ }
+ return eoObject;
+ }
+
+ public static Company localInstanceIn(EOEditingContext editingContext, Company eo) {
+ Company localInstance = (eo == null) ? null : (Company)EOUtilities.localInstanceOfObject(editingContext, eo);
+ if (localInstance == null && eo != null) {
+ throw new IllegalStateException("You attempted to localInstance " + eo + ", which has not yet committed.");
+ }
+ return localInstance;
+ }
+}
diff --git a/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/components/_Employee.java b/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/components/_Employee.java
new file mode 100644
index 00000000000..fd0a617f7eb
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/Sources/er/ajax/mootools/example/components/_Employee.java
@@ -0,0 +1,157 @@
+// $LastChangedRevision: 4733 $ DO NOT EDIT. Make changes to Employee.java instead.
+package er.ajax.mootools.example.components;
+
+import java.util.NoSuchElementException;
+
+import org.apache.log4j.Logger;
+
+import com.webobjects.eoaccess.EOUtilities;
+import com.webobjects.eocontrol.EOEditingContext;
+import com.webobjects.eocontrol.EOFetchSpecification;
+import com.webobjects.eocontrol.EOKeyValueQualifier;
+import com.webobjects.eocontrol.EOQualifier;
+import com.webobjects.eocontrol.EOSortOrdering;
+import com.webobjects.foundation.NSArray;
+
+import er.extensions.eof.ERXGenericRecord;
+import er.extensions.eof.ERXKey;
+
+@SuppressWarnings("all")
+public abstract class _Employee extends ERXGenericRecord {
+ public static final String ENTITY_NAME = "Employee";
+
+ // Attribute Keys
+ public static final ERXKey FIRST_NAME = new ERXKey("firstName");
+ public static final ERXKey LAST_NAME = new ERXKey("lastName");
+ // Relationship Keys
+ public static final ERXKey COMPANY = new ERXKey("company");
+
+ // Attributes
+ public static final String FIRST_NAME_KEY = FIRST_NAME.key();
+ public static final String LAST_NAME_KEY = LAST_NAME.key();
+ // Relationships
+ public static final String COMPANY_KEY = COMPANY.key();
+
+ private static Logger LOG = Logger.getLogger(_Employee.class);
+
+ public Employee localInstanceIn(EOEditingContext editingContext) {
+ Employee localInstance = (Employee)EOUtilities.localInstanceOfObject(editingContext, this);
+ if (localInstance == null) {
+ throw new IllegalStateException("You attempted to localInstance " + this + ", which has not yet committed.");
+ }
+ return localInstance;
+ }
+
+ public String firstName() {
+ return (String) storedValueForKey("firstName");
+ }
+
+ public void setFirstName(String value) {
+ if (_Employee.LOG.isDebugEnabled()) {
+ _Employee.LOG.debug( "updating firstName from " + firstName() + " to " + value);
+ }
+ takeStoredValueForKey(value, "firstName");
+ }
+
+ public String lastName() {
+ return (String) storedValueForKey("lastName");
+ }
+
+ public void setLastName(String value) {
+ if (_Employee.LOG.isDebugEnabled()) {
+ _Employee.LOG.debug( "updating lastName from " + lastName() + " to " + value);
+ }
+ takeStoredValueForKey(value, "lastName");
+ }
+
+ public Company company() {
+ return (Company)storedValueForKey("company");
+ }
+
+ public void setCompany(er.ajax.mootools.example.components.Company value) {
+ takeStoredValueForKey(value, "company");
+ }
+
+ public void setCompanyRelationship(er.ajax.mootools.example.components.Company value) {
+ if (_Employee.LOG.isDebugEnabled()) {
+ _Employee.LOG.debug("updating company from " + company() + " to " + value);
+ }
+ if (er.extensions.eof.ERXGenericRecord.InverseRelationshipUpdater.updateInverseRelationships()) {
+ setCompany(value);
+ }
+ else if (value == null) {
+ er.ajax.mootools.example.components.Company oldValue = company();
+ if (oldValue != null) {
+ removeObjectFromBothSidesOfRelationshipWithKey(oldValue, "company");
+ }
+ } else {
+ addObjectToBothSidesOfRelationshipWithKey(value, "company");
+ }
+ }
+
+
+ public static Employee createEmployee(EOEditingContext editingContext, String firstName
+, String lastName
+, er.ajax.mootools.example.components.Company company) {
+ Employee eo = (Employee) EOUtilities.createAndInsertInstance(editingContext, _Employee.ENTITY_NAME);
+ eo.setFirstName(firstName);
+ eo.setLastName(lastName);
+ eo.setCompanyRelationship(company);
+ return eo;
+ }
+
+ public static NSArray fetchAllEmployees(EOEditingContext editingContext) {
+ return _Employee.fetchAllEmployees(editingContext, null);
+ }
+
+ public static NSArray fetchAllEmployees(EOEditingContext editingContext, NSArray sortOrderings) {
+ return _Employee.fetchEmployees(editingContext, null, sortOrderings);
+ }
+
+ public static NSArray fetchEmployees(EOEditingContext editingContext, EOQualifier qualifier, NSArray sortOrderings) {
+ EOFetchSpecification fetchSpec = new EOFetchSpecification(_Employee.ENTITY_NAME, qualifier, sortOrderings);
+ fetchSpec.setIsDeep(true);
+ NSArray eoObjects = (NSArray)editingContext.objectsWithFetchSpecification(fetchSpec);
+ return eoObjects;
+ }
+
+ public static Employee fetchEmployee(EOEditingContext editingContext, String keyName, Object value) {
+ return _Employee.fetchEmployee(editingContext, new EOKeyValueQualifier(keyName, EOQualifier.QualifierOperatorEqual, value));
+ }
+
+ public static Employee fetchEmployee(EOEditingContext editingContext, EOQualifier qualifier) {
+ NSArray eoObjects = _Employee.fetchEmployees(editingContext, qualifier, null);
+ Employee eoObject;
+ int count = eoObjects.count();
+ if (count == 0) {
+ eoObject = null;
+ }
+ else if (count == 1) {
+ eoObject = (Employee)eoObjects.objectAtIndex(0);
+ }
+ else {
+ throw new IllegalStateException("There was more than one Employee that matched the qualifier '" + qualifier + "'.");
+ }
+ return eoObject;
+ }
+
+ public static Employee fetchRequiredEmployee(EOEditingContext editingContext, String keyName, Object value) {
+ return _Employee.fetchRequiredEmployee(editingContext, new EOKeyValueQualifier(keyName, EOQualifier.QualifierOperatorEqual, value));
+ }
+
+ public static Employee fetchRequiredEmployee(EOEditingContext editingContext, EOQualifier qualifier) {
+ Employee eoObject = _Employee.fetchEmployee(editingContext, qualifier);
+ if (eoObject == null) {
+ throw new NoSuchElementException("There was no Employee that matched the qualifier '" + qualifier + "'.");
+ }
+ return eoObject;
+ }
+
+ public static Employee localInstanceIn(EOEditingContext editingContext, Employee eo) {
+ Employee localInstance = (eo == null) ? null : (Employee)EOUtilities.localInstanceOfObject(editingContext, eo);
+ if (localInstance == null && eo != null) {
+ throw new IllegalStateException("You attempted to localInstance " + eo + ", which has not yet committed.");
+ }
+ return localInstance;
+ }
+}
diff --git a/Examples/Ajax/MooToolsExample/WebServerResources/css/bootstrap-responsive.css b/Examples/Ajax/MooToolsExample/WebServerResources/css/bootstrap-responsive.css
new file mode 100644
index 00000000000..4b032cdb558
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/WebServerResources/css/bootstrap-responsive.css
@@ -0,0 +1,567 @@
+/*!
+ * Bootstrap Responsive v2.0.0
+ *
+ * Copyright 2012 Twitter, Inc
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Designed and built with all the love in the world @twitter by @mdo and @fat.
+ */
+.hidden {
+ display: none;
+ visibility: hidden;
+}
+@media (max-width: 480px) {
+ .nav-collapse {
+ -webkit-transform: translate3d(0, 0, 0);
+ }
+ .page-header h1 small {
+ display: block;
+ line-height: 18px;
+ }
+ input[class*="span"],
+ select[class*="span"],
+ textarea[class*="span"],
+ .uneditable-input {
+ display: block;
+ width: 100%;
+ height: 28px;
+ /* Make inputs at least the height of their button counterpart */
+
+ /* Makes inputs behave like true block-level elements */
+
+ -webkit-box-sizing: border-box;
+ /* Older Webkit */
+
+ -moz-box-sizing: border-box;
+ /* Older FF */
+
+ -ms-box-sizing: border-box;
+ /* IE8 */
+
+ box-sizing: border-box;
+ /* CSS3 spec*/
+
+ }
+ .input-prepend input[class*="span"], .input-append input[class*="span"] {
+ width: auto;
+ }
+ input[type="checkbox"], input[type="radio"] {
+ border: 1px solid #ccc;
+ }
+ .form-horizontal .control-group > label {
+ float: none;
+ width: auto;
+ padding-top: 0;
+ text-align: left;
+ }
+ .form-horizontal .controls {
+ margin-left: 0;
+ }
+ .form-horizontal .control-list {
+ padding-top: 0;
+ }
+ .form-horizontal .form-actions {
+ padding-left: 10px;
+ padding-right: 10px;
+ }
+ .modal {
+ position: absolute;
+ top: 10px;
+ left: 10px;
+ right: 10px;
+ width: auto;
+ margin: 0;
+ }
+ .modal.fade.in {
+ top: auto;
+ }
+ .modal-header .close {
+ padding: 10px;
+ margin: -10px;
+ }
+ .carousel-caption {
+ position: static;
+ }
+}
+@media (max-width: 768px) {
+ .container {
+ width: auto;
+ padding: 0 20px;
+ }
+ .row-fluid {
+ width: 100%;
+ }
+ .row {
+ margin-left: 0;
+ }
+ .row > [class*="span"], .row-fluid > [class*="span"] {
+ float: none;
+ display: block;
+ width: auto;
+ margin: 0;
+ }
+}
+@media (min-width: 768px) and (max-width: 980px) {
+ .row {
+ margin-left: -20px;
+ *zoom: 1;
+ }
+ .row:before, .row:after {
+ display: table;
+ content: "";
+ }
+ .row:after {
+ clear: both;
+ }
+ [class*="span"] {
+ float: left;
+ margin-left: 20px;
+ }
+ .span1 {
+ width: 42px;
+ }
+ .span2 {
+ width: 104px;
+ }
+ .span3 {
+ width: 166px;
+ }
+ .span4 {
+ width: 228px;
+ }
+ .span5 {
+ width: 290px;
+ }
+ .span6 {
+ width: 352px;
+ }
+ .span7 {
+ width: 414px;
+ }
+ .span8 {
+ width: 476px;
+ }
+ .span9 {
+ width: 538px;
+ }
+ .span10 {
+ width: 600px;
+ }
+ .span11 {
+ width: 662px;
+ }
+ .span12, .container {
+ width: 724px;
+ }
+ .offset1 {
+ margin-left: 82px;
+ }
+ .offset2 {
+ margin-left: 144px;
+ }
+ .offset3 {
+ margin-left: 206px;
+ }
+ .offset4 {
+ margin-left: 268px;
+ }
+ .offset5 {
+ margin-left: 330px;
+ }
+ .offset6 {
+ margin-left: 392px;
+ }
+ .offset7 {
+ margin-left: 454px;
+ }
+ .offset8 {
+ margin-left: 516px;
+ }
+ .offset9 {
+ margin-left: 578px;
+ }
+ .offset10 {
+ margin-left: 640px;
+ }
+ .offset11 {
+ margin-left: 702px;
+ }
+ .row-fluid {
+ width: 100%;
+ *zoom: 1;
+ }
+ .row-fluid:before, .row-fluid:after {
+ display: table;
+ content: "";
+ }
+ .row-fluid:after {
+ clear: both;
+ }
+ .row-fluid > [class*="span"] {
+ float: left;
+ margin-left: 2.762430939%;
+ }
+ .row-fluid > [class*="span"]:first-child {
+ margin-left: 0;
+ }
+ .row-fluid .span1 {
+ width: 5.801104972%;
+ }
+ .row-fluid .span2 {
+ width: 14.364640883%;
+ }
+ .row-fluid .span3 {
+ width: 22.928176794%;
+ }
+ .row-fluid .span4 {
+ width: 31.491712705%;
+ }
+ .row-fluid .span5 {
+ width: 40.055248616%;
+ }
+ .row-fluid .span6 {
+ width: 48.618784527%;
+ }
+ .row-fluid .span7 {
+ width: 57.182320438000005%;
+ }
+ .row-fluid .span8 {
+ width: 65.74585634900001%;
+ }
+ .row-fluid .span9 {
+ width: 74.30939226%;
+ }
+ .row-fluid .span10 {
+ width: 82.87292817100001%;
+ }
+ .row-fluid .span11 {
+ width: 91.436464082%;
+ }
+ .row-fluid .span12 {
+ width: 99.999999993%;
+ }
+ input.span1, textarea.span1, .uneditable-input.span1 {
+ width: 32px;
+ }
+ input.span2, textarea.span2, .uneditable-input.span2 {
+ width: 94px;
+ }
+ input.span3, textarea.span3, .uneditable-input.span3 {
+ width: 156px;
+ }
+ input.span4, textarea.span4, .uneditable-input.span4 {
+ width: 218px;
+ }
+ input.span5, textarea.span5, .uneditable-input.span5 {
+ width: 280px;
+ }
+ input.span6, textarea.span6, .uneditable-input.span6 {
+ width: 342px;
+ }
+ input.span7, textarea.span7, .uneditable-input.span7 {
+ width: 404px;
+ }
+ input.span8, textarea.span8, .uneditable-input.span8 {
+ width: 466px;
+ }
+ input.span9, textarea.span9, .uneditable-input.span9 {
+ width: 528px;
+ }
+ input.span10, textarea.span10, .uneditable-input.span10 {
+ width: 590px;
+ }
+ input.span11, textarea.span11, .uneditable-input.span11 {
+ width: 652px;
+ }
+ input.span12, textarea.span12, .uneditable-input.span12 {
+ width: 714px;
+ }
+}
+@media (max-width: 980px) {
+ body {
+ padding-top: 0;
+ }
+ .navbar-fixed-top {
+ position: static;
+ margin-bottom: 18px;
+ }
+ .navbar-fixed-top .navbar-inner {
+ padding: 5px;
+ }
+ .navbar .container {
+ width: auto;
+ padding: 0;
+ }
+ .navbar .brand {
+ padding-left: 10px;
+ padding-right: 10px;
+ margin: 0 0 0 -5px;
+ }
+ .navbar .nav-collapse {
+ clear: left;
+ }
+ .navbar .nav {
+ float: none;
+ margin: 0 0 9px;
+ }
+ .navbar .nav > li {
+ float: none;
+ }
+ .navbar .nav > li > a {
+ margin-bottom: 2px;
+ }
+ .navbar .nav > .divider-vertical {
+ display: none;
+ }
+ .navbar .nav > li > a, .navbar .dropdown-menu a {
+ padding: 6px 15px;
+ font-weight: bold;
+ color: #999999;
+ -webkit-border-radius: 3px;
+ -moz-border-radius: 3px;
+ border-radius: 3px;
+ }
+ .navbar .dropdown-menu li + li a {
+ margin-bottom: 2px;
+ }
+ .navbar .nav > li > a:hover, .navbar .dropdown-menu a:hover {
+ background-color: #222222;
+ }
+ .navbar .dropdown-menu {
+ position: static;
+ top: auto;
+ left: auto;
+ float: none;
+ display: block;
+ max-width: none;
+ margin: 0 15px;
+ padding: 0;
+ background-color: transparent;
+ border: none;
+ -webkit-border-radius: 0;
+ -moz-border-radius: 0;
+ border-radius: 0;
+ -webkit-box-shadow: none;
+ -moz-box-shadow: none;
+ box-shadow: none;
+ }
+ .navbar .dropdown-menu:before, .navbar .dropdown-menu:after {
+ display: none;
+ }
+ .navbar .dropdown-menu .divider {
+ display: none;
+ }
+ .navbar-form, .navbar-search {
+ float: none;
+ padding: 9px 15px;
+ margin: 9px 0;
+ border-top: 1px solid #222222;
+ border-bottom: 1px solid #222222;
+ -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
+ -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
+ }
+ .navbar .nav.pull-right {
+ float: none;
+ margin-left: 0;
+ }
+ .navbar-static .navbar-inner {
+ padding-left: 10px;
+ padding-right: 10px;
+ }
+ .btn-navbar {
+ display: block;
+ }
+ .nav-collapse {
+ overflow: hidden;
+ height: 0;
+ }
+}
+@media (min-width: 980px) {
+ .nav-collapse.collapse {
+ height: auto !important;
+ }
+}
+@media (min-width: 1200px) {
+ .row {
+ margin-left: -30px;
+ *zoom: 1;
+ }
+ .row:before, .row:after {
+ display: table;
+ content: "";
+ }
+ .row:after {
+ clear: both;
+ }
+ [class*="span"] {
+ float: left;
+ margin-left: 30px;
+ }
+ .span1 {
+ width: 70px;
+ }
+ .span2 {
+ width: 170px;
+ }
+ .span3 {
+ width: 270px;
+ }
+ .span4 {
+ width: 370px;
+ }
+ .span5 {
+ width: 470px;
+ }
+ .span6 {
+ width: 570px;
+ }
+ .span7 {
+ width: 670px;
+ }
+ .span8 {
+ width: 770px;
+ }
+ .span9 {
+ width: 870px;
+ }
+ .span10 {
+ width: 970px;
+ }
+ .span11 {
+ width: 1070px;
+ }
+ .span12, .container {
+ width: 1170px;
+ }
+ .offset1 {
+ margin-left: 130px;
+ }
+ .offset2 {
+ margin-left: 230px;
+ }
+ .offset3 {
+ margin-left: 330px;
+ }
+ .offset4 {
+ margin-left: 430px;
+ }
+ .offset5 {
+ margin-left: 530px;
+ }
+ .offset6 {
+ margin-left: 630px;
+ }
+ .offset7 {
+ margin-left: 730px;
+ }
+ .offset8 {
+ margin-left: 830px;
+ }
+ .offset9 {
+ margin-left: 930px;
+ }
+ .offset10 {
+ margin-left: 1030px;
+ }
+ .offset11 {
+ margin-left: 1130px;
+ }
+ .row-fluid {
+ width: 100%;
+ *zoom: 1;
+ }
+ .row-fluid:before, .row-fluid:after {
+ display: table;
+ content: "";
+ }
+ .row-fluid:after {
+ clear: both;
+ }
+ .row-fluid > [class*="span"] {
+ float: left;
+ margin-left: 2.564102564%;
+ }
+ .row-fluid > [class*="span"]:first-child {
+ margin-left: 0;
+ }
+ .row-fluid .span1 {
+ width: 5.982905983%;
+ }
+ .row-fluid .span2 {
+ width: 14.529914530000001%;
+ }
+ .row-fluid .span3 {
+ width: 23.076923077%;
+ }
+ .row-fluid .span4 {
+ width: 31.623931624%;
+ }
+ .row-fluid .span5 {
+ width: 40.170940171000005%;
+ }
+ .row-fluid .span6 {
+ width: 48.717948718%;
+ }
+ .row-fluid .span7 {
+ width: 57.264957265%;
+ }
+ .row-fluid .span8 {
+ width: 65.81196581200001%;
+ }
+ .row-fluid .span9 {
+ width: 74.358974359%;
+ }
+ .row-fluid .span10 {
+ width: 82.905982906%;
+ }
+ .row-fluid .span11 {
+ width: 91.45299145300001%;
+ }
+ .row-fluid .span12 {
+ width: 100%;
+ }
+ input.span1, textarea.span1, .uneditable-input.span1 {
+ width: 60px;
+ }
+ input.span2, textarea.span2, .uneditable-input.span2 {
+ width: 160px;
+ }
+ input.span3, textarea.span3, .uneditable-input.span3 {
+ width: 260px;
+ }
+ input.span4, textarea.span4, .uneditable-input.span4 {
+ width: 360px;
+ }
+ input.span5, textarea.span5, .uneditable-input.span5 {
+ width: 460px;
+ }
+ input.span6, textarea.span6, .uneditable-input.span6 {
+ width: 560px;
+ }
+ input.span7, textarea.span7, .uneditable-input.span7 {
+ width: 660px;
+ }
+ input.span8, textarea.span8, .uneditable-input.span8 {
+ width: 760px;
+ }
+ input.span9, textarea.span9, .uneditable-input.span9 {
+ width: 860px;
+ }
+ input.span10, textarea.span10, .uneditable-input.span10 {
+ width: 960px;
+ }
+ input.span11, textarea.span11, .uneditable-input.span11 {
+ width: 1060px;
+ }
+ input.span12, textarea.span12, .uneditable-input.span12 {
+ width: 1160px;
+ }
+ .thumbnails {
+ margin-left: -30px;
+ }
+ .thumbnails > li {
+ margin-left: 30px;
+ }
+}
diff --git a/Examples/Ajax/MooToolsExample/WebServerResources/css/bootstrap-responsive.min.css b/Examples/Ajax/MooToolsExample/WebServerResources/css/bootstrap-responsive.min.css
new file mode 100644
index 00000000000..bc3f2ab71a8
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/WebServerResources/css/bootstrap-responsive.min.css
@@ -0,0 +1,3 @@
+
+.hidden{display:none;visibility:hidden;}
+@media (max-width:480px){.nav-collapse{-webkit-transform:translate3d(0, 0, 0);} .page-header h1 small{display:block;line-height:18px;} input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{display:block;width:100%;height:28px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box;} .input-prepend input[class*="span"],.input-append input[class*="span"]{width:auto;} input[type="checkbox"],input[type="radio"]{border:1px solid #ccc;} .form-horizontal .control-group>label{float:none;width:auto;padding-top:0;text-align:left;} .form-horizontal .controls{margin-left:0;} .form-horizontal .control-list{padding-top:0;} .form-horizontal .form-actions{padding-left:10px;padding-right:10px;} .modal{position:absolute;top:10px;left:10px;right:10px;width:auto;margin:0;}.modal.fade.in{top:auto;} .modal-header .close{padding:10px;margin:-10px;} .carousel-caption{position:static;}}@media (max-width:768px){.container{width:auto;padding:0 20px;} .row-fluid{width:100%;} .row{margin-left:0;} .row>[class*="span"],.row-fluid>[class*="span"]{float:none;display:block;width:auto;margin:0;}}@media (min-width:768px) and (max-width:980px){.row{margin-left:-20px;*zoom:1;}.row:before,.row:after{display:table;content:"";} .row:after{clear:both;} [class*="span"]{float:left;margin-left:20px;} .span1{width:42px;} .span2{width:104px;} .span3{width:166px;} .span4{width:228px;} .span5{width:290px;} .span6{width:352px;} .span7{width:414px;} .span8{width:476px;} .span9{width:538px;} .span10{width:600px;} .span11{width:662px;} .span12,.container{width:724px;} .offset1{margin-left:82px;} .offset2{margin-left:144px;} .offset3{margin-left:206px;} .offset4{margin-left:268px;} .offset5{margin-left:330px;} .offset6{margin-left:392px;} .offset7{margin-left:454px;} .offset8{margin-left:516px;} .offset9{margin-left:578px;} .offset10{margin-left:640px;} .offset11{margin-left:702px;} .row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";} .row-fluid:after{clear:both;} .row-fluid>[class*="span"]{float:left;margin-left:2.762430939%;} .row-fluid>[class*="span"]:first-child{margin-left:0;} .row-fluid .span1{width:5.801104972%;} .row-fluid .span2{width:14.364640883%;} .row-fluid .span3{width:22.928176794%;} .row-fluid .span4{width:31.491712705%;} .row-fluid .span5{width:40.055248616%;} .row-fluid .span6{width:48.618784527%;} .row-fluid .span7{width:57.182320438000005%;} .row-fluid .span8{width:65.74585634900001%;} .row-fluid .span9{width:74.30939226%;} .row-fluid .span10{width:82.87292817100001%;} .row-fluid .span11{width:91.436464082%;} .row-fluid .span12{width:99.999999993%;} input.span1,textarea.span1,.uneditable-input.span1{width:32px;} input.span2,textarea.span2,.uneditable-input.span2{width:94px;} input.span3,textarea.span3,.uneditable-input.span3{width:156px;} input.span4,textarea.span4,.uneditable-input.span4{width:218px;} input.span5,textarea.span5,.uneditable-input.span5{width:280px;} input.span6,textarea.span6,.uneditable-input.span6{width:342px;} input.span7,textarea.span7,.uneditable-input.span7{width:404px;} input.span8,textarea.span8,.uneditable-input.span8{width:466px;} input.span9,textarea.span9,.uneditable-input.span9{width:528px;} input.span10,textarea.span10,.uneditable-input.span10{width:590px;} input.span11,textarea.span11,.uneditable-input.span11{width:652px;} input.span12,textarea.span12,.uneditable-input.span12{width:714px;}}@media (max-width:980px){body{padding-top:0;} .navbar-fixed-top{position:static;margin-bottom:18px;} .navbar-fixed-top .navbar-inner{padding:5px;} .navbar .container{width:auto;padding:0;} .navbar .brand{padding-left:10px;padding-right:10px;margin:0 0 0 -5px;} .navbar .nav-collapse{clear:left;} .navbar .nav{float:none;margin:0 0 9px;} .navbar .nav>li{float:none;} .navbar .nav>li>a{margin-bottom:2px;} .navbar .nav>.divider-vertical{display:none;} .navbar .nav>li>a,.navbar .dropdown-menu a{padding:6px 15px;font-weight:bold;color:#999999;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} .navbar .dropdown-menu li+li a{margin-bottom:2px;} .navbar .nav>li>a:hover,.navbar .dropdown-menu a:hover{background-color:#222222;} .navbar .dropdown-menu{position:static;top:auto;left:auto;float:none;display:block;max-width:none;margin:0 15px;padding:0;background-color:transparent;border:none;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} .navbar .dropdown-menu:before,.navbar .dropdown-menu:after{display:none;} .navbar .dropdown-menu .divider{display:none;} .navbar-form,.navbar-search{float:none;padding:9px 15px;margin:9px 0;border-top:1px solid #222222;border-bottom:1px solid #222222;-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.1);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.1);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.1);} .navbar .nav.pull-right{float:none;margin-left:0;} .navbar-static .navbar-inner{padding-left:10px;padding-right:10px;} .btn-navbar{display:block;} .nav-collapse{overflow:hidden;height:0;}}@media (min-width:980px){.nav-collapse.collapse{height:auto !important;}}@media (min-width:1200px){.row{margin-left:-30px;*zoom:1;}.row:before,.row:after{display:table;content:"";} .row:after{clear:both;} [class*="span"]{float:left;margin-left:30px;} .span1{width:70px;} .span2{width:170px;} .span3{width:270px;} .span4{width:370px;} .span5{width:470px;} .span6{width:570px;} .span7{width:670px;} .span8{width:770px;} .span9{width:870px;} .span10{width:970px;} .span11{width:1070px;} .span12,.container{width:1170px;} .offset1{margin-left:130px;} .offset2{margin-left:230px;} .offset3{margin-left:330px;} .offset4{margin-left:430px;} .offset5{margin-left:530px;} .offset6{margin-left:630px;} .offset7{margin-left:730px;} .offset8{margin-left:830px;} .offset9{margin-left:930px;} .offset10{margin-left:1030px;} .offset11{margin-left:1130px;} .row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";} .row-fluid:after{clear:both;} .row-fluid>[class*="span"]{float:left;margin-left:2.564102564%;} .row-fluid>[class*="span"]:first-child{margin-left:0;} .row-fluid .span1{width:5.982905983%;} .row-fluid .span2{width:14.529914530000001%;} .row-fluid .span3{width:23.076923077%;} .row-fluid .span4{width:31.623931624%;} .row-fluid .span5{width:40.170940171000005%;} .row-fluid .span6{width:48.717948718%;} .row-fluid .span7{width:57.264957265%;} .row-fluid .span8{width:65.81196581200001%;} .row-fluid .span9{width:74.358974359%;} .row-fluid .span10{width:82.905982906%;} .row-fluid .span11{width:91.45299145300001%;} .row-fluid .span12{width:100%;} input.span1,textarea.span1,.uneditable-input.span1{width:60px;} input.span2,textarea.span2,.uneditable-input.span2{width:160px;} input.span3,textarea.span3,.uneditable-input.span3{width:260px;} input.span4,textarea.span4,.uneditable-input.span4{width:360px;} input.span5,textarea.span5,.uneditable-input.span5{width:460px;} input.span6,textarea.span6,.uneditable-input.span6{width:560px;} input.span7,textarea.span7,.uneditable-input.span7{width:660px;} input.span8,textarea.span8,.uneditable-input.span8{width:760px;} input.span9,textarea.span9,.uneditable-input.span9{width:860px;} input.span10,textarea.span10,.uneditable-input.span10{width:960px;} input.span11,textarea.span11,.uneditable-input.span11{width:1060px;} input.span12,textarea.span12,.uneditable-input.span12{width:1160px;} .thumbnails{margin-left:-30px;} .thumbnails>li{margin-left:30px;}}
diff --git a/Examples/Ajax/MooToolsExample/WebServerResources/css/bootstrap.css b/Examples/Ajax/MooToolsExample/WebServerResources/css/bootstrap.css
new file mode 100644
index 00000000000..a90e31930bc
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/WebServerResources/css/bootstrap.css
@@ -0,0 +1,3365 @@
+/*!
+ * Bootstrap v2.0.0
+ *
+ * Copyright 2012 Twitter, Inc
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Designed and built with all the love in the world @twitter by @mdo and @fat.
+ */
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+nav,
+section {
+ display: block;
+}
+audio, canvas, video {
+ display: inline-block;
+ *display: inline;
+ *zoom: 1;
+}
+audio:not([controls]) {
+ display: none;
+}
+html {
+ font-size: 100%;
+ -webkit-text-size-adjust: 100%;
+ -ms-text-size-adjust: 100%;
+}
+a:focus {
+ outline: thin dotted;
+ outline: 5px auto -webkit-focus-ring-color;
+ outline-offset: -2px;
+}
+a:hover, a:active {
+ outline: 0;
+}
+sub, sup {
+ position: relative;
+ font-size: 75%;
+ line-height: 0;
+ vertical-align: baseline;
+}
+sup {
+ top: -0.5em;
+}
+sub {
+ bottom: -0.25em;
+}
+img {
+ max-width: 100%;
+ height: auto;
+ border: 0;
+ -ms-interpolation-mode: bicubic;
+}
+button,
+input,
+select,
+textarea {
+ margin: 0;
+ font-size: 100%;
+ vertical-align: middle;
+}
+button, input {
+ *overflow: visible;
+ line-height: normal;
+}
+button::-moz-focus-inner, input::-moz-focus-inner {
+ padding: 0;
+ border: 0;
+}
+button,
+input[type="button"],
+input[type="reset"],
+input[type="submit"] {
+ cursor: pointer;
+ -webkit-appearance: button;
+}
+input[type="search"] {
+ -webkit-appearance: textfield;
+ -webkit-box-sizing: content-box;
+ -moz-box-sizing: content-box;
+ box-sizing: content-box;
+}
+input[type="search"]::-webkit-search-decoration, input[type="search"]::-webkit-search-cancel-button {
+ -webkit-appearance: none;
+}
+textarea {
+ overflow: auto;
+ vertical-align: top;
+}
+body {
+ margin: 0;
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+ font-size: 13px;
+ line-height: 18px;
+ color: #333333;
+ background-color: #ffffff;
+}
+a {
+ color: #0088cc;
+ text-decoration: none;
+}
+a:hover {
+ color: #005580;
+ text-decoration: underline;
+}
+.row {
+ margin-left: -20px;
+ *zoom: 1;
+}
+.row:before, .row:after {
+ display: table;
+ content: "";
+}
+.row:after {
+ clear: both;
+}
+[class*="span"] {
+ float: left;
+ margin-left: 20px;
+}
+.span1 {
+ width: 60px;
+}
+.span2 {
+ width: 140px;
+}
+.span3 {
+ width: 220px;
+}
+.span4 {
+ width: 300px;
+}
+.span5 {
+ width: 380px;
+}
+.span6 {
+ width: 460px;
+}
+.span7 {
+ width: 540px;
+}
+.span8 {
+ width: 620px;
+}
+.span9 {
+ width: 700px;
+}
+.span10 {
+ width: 780px;
+}
+.span11 {
+ width: 860px;
+}
+.span12, .container {
+ width: 940px;
+}
+.offset1 {
+ margin-left: 100px;
+}
+.offset2 {
+ margin-left: 180px;
+}
+.offset3 {
+ margin-left: 260px;
+}
+.offset4 {
+ margin-left: 340px;
+}
+.offset5 {
+ margin-left: 420px;
+}
+.offset6 {
+ margin-left: 500px;
+}
+.offset7 {
+ margin-left: 580px;
+}
+.offset8 {
+ margin-left: 660px;
+}
+.offset9 {
+ margin-left: 740px;
+}
+.offset10 {
+ margin-left: 820px;
+}
+.offset11 {
+ margin-left: 900px;
+}
+.row-fluid {
+ width: 100%;
+ *zoom: 1;
+}
+.row-fluid:before, .row-fluid:after {
+ display: table;
+ content: "";
+}
+.row-fluid:after {
+ clear: both;
+}
+.row-fluid > [class*="span"] {
+ float: left;
+ margin-left: 2.127659574%;
+}
+.row-fluid > [class*="span"]:first-child {
+ margin-left: 0;
+}
+.row-fluid .span1 {
+ width: 6.382978723%;
+}
+.row-fluid .span2 {
+ width: 14.89361702%;
+}
+.row-fluid .span3 {
+ width: 23.404255317%;
+}
+.row-fluid .span4 {
+ width: 31.914893614%;
+}
+.row-fluid .span5 {
+ width: 40.425531911%;
+}
+.row-fluid .span6 {
+ width: 48.93617020799999%;
+}
+.row-fluid .span7 {
+ width: 57.446808505%;
+}
+.row-fluid .span8 {
+ width: 65.95744680199999%;
+}
+.row-fluid .span9 {
+ width: 74.468085099%;
+}
+.row-fluid .span10 {
+ width: 82.97872339599999%;
+}
+.row-fluid .span11 {
+ width: 91.489361693%;
+}
+.row-fluid .span12 {
+ width: 99.99999998999999%;
+}
+.container {
+ width: 940px;
+ margin-left: auto;
+ margin-right: auto;
+ *zoom: 1;
+}
+.container:before, .container:after {
+ display: table;
+ content: "";
+}
+.container:after {
+ clear: both;
+}
+.container-fluid {
+ padding-left: 20px;
+ padding-right: 20px;
+ *zoom: 1;
+}
+.container-fluid:before, .container-fluid:after {
+ display: table;
+ content: "";
+}
+.container-fluid:after {
+ clear: both;
+}
+p {
+ margin: 0 0 9px;
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+ font-size: 13px;
+ line-height: 18px;
+}
+p small {
+ font-size: 11px;
+ color: #999999;
+}
+.lead {
+ margin-bottom: 18px;
+ font-size: 20px;
+ font-weight: 200;
+ line-height: 27px;
+}
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+ margin: 0;
+ font-weight: bold;
+ color: #333333;
+ text-rendering: optimizelegibility;
+}
+h1 small,
+h2 small,
+h3 small,
+h4 small,
+h5 small,
+h6 small {
+ font-weight: normal;
+ color: #999999;
+}
+h1 {
+ font-size: 30px;
+ line-height: 36px;
+}
+h1 small {
+ font-size: 18px;
+}
+h2 {
+ font-size: 24px;
+ line-height: 36px;
+}
+h2 small {
+ font-size: 18px;
+}
+h3 {
+ line-height: 27px;
+ font-size: 18px;
+}
+h3 small {
+ font-size: 14px;
+}
+h4, h5, h6 {
+ line-height: 18px;
+}
+h4 {
+ font-size: 14px;
+}
+h4 small {
+ font-size: 12px;
+}
+h5 {
+ font-size: 12px;
+}
+h6 {
+ font-size: 11px;
+ color: #999999;
+ text-transform: uppercase;
+}
+.page-header {
+ padding-bottom: 17px;
+ margin: 18px 0;
+ border-bottom: 1px solid #eeeeee;
+}
+.page-header h1 {
+ line-height: 1;
+}
+ul, ol {
+ padding: 0;
+ margin: 0 0 9px 25px;
+}
+ul ul,
+ul ol,
+ol ol,
+ol ul {
+ margin-bottom: 0;
+}
+ul {
+ list-style: disc;
+}
+ol {
+ list-style: decimal;
+}
+li {
+ line-height: 18px;
+}
+ul.unstyled {
+ margin-left: 0;
+ list-style: none;
+}
+dl {
+ margin-bottom: 18px;
+}
+dt, dd {
+ line-height: 18px;
+}
+dt {
+ font-weight: bold;
+}
+dd {
+ margin-left: 9px;
+}
+hr {
+ margin: 18px 0;
+ border: 0;
+ border-top: 1px solid #e5e5e5;
+ border-bottom: 1px solid #ffffff;
+}
+strong {
+ font-weight: bold;
+}
+em {
+ font-style: italic;
+}
+.muted {
+ color: #999999;
+}
+abbr {
+ font-size: 90%;
+ text-transform: uppercase;
+ border-bottom: 1px dotted #ddd;
+ cursor: help;
+}
+blockquote {
+ padding: 0 0 0 15px;
+ margin: 0 0 18px;
+ border-left: 5px solid #eeeeee;
+}
+blockquote p {
+ margin-bottom: 0;
+ font-size: 16px;
+ font-weight: 300;
+ line-height: 22.5px;
+}
+blockquote small {
+ display: block;
+ line-height: 18px;
+ color: #999999;
+}
+blockquote small:before {
+ content: '\2014 \00A0';
+}
+blockquote.pull-right {
+ float: right;
+ padding-left: 0;
+ padding-right: 15px;
+ border-left: 0;
+ border-right: 5px solid #eeeeee;
+}
+blockquote.pull-right p, blockquote.pull-right small {
+ text-align: right;
+}
+q:before,
+q:after,
+blockquote:before,
+blockquote:after {
+ content: "";
+}
+address {
+ display: block;
+ margin-bottom: 18px;
+ line-height: 18px;
+ font-style: normal;
+}
+small {
+ font-size: 100%;
+}
+cite {
+ font-style: normal;
+}
+code, pre {
+ padding: 0 3px 2px;
+ font-family: Menlo, Monaco, "Courier New", monospace;
+ font-size: 12px;
+ color: #333333;
+ -webkit-border-radius: 3px;
+ -moz-border-radius: 3px;
+ border-radius: 3px;
+}
+code {
+ padding: 3px 4px;
+ color: #d14;
+ background-color: #f7f7f9;
+ border: 1px solid #e1e1e8;
+}
+pre {
+ display: block;
+ padding: 8.5px;
+ margin: 0 0 9px;
+ font-size: 12px;
+ line-height: 18px;
+ background-color: #f5f5f5;
+ border: 1px solid #ccc;
+ border: 1px solid rgba(0, 0, 0, 0.15);
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ border-radius: 4px;
+ white-space: pre;
+ white-space: pre-wrap;
+ word-break: break-all;
+}
+pre.prettyprint {
+ margin-bottom: 18px;
+}
+pre code {
+ padding: 0;
+ background-color: transparent;
+}
+form {
+ margin: 0 0 18px;
+}
+fieldset {
+ padding: 0;
+ margin: 0;
+ border: 0;
+}
+legend {
+ display: block;
+ width: 100%;
+ padding: 0;
+ margin-bottom: 27px;
+ font-size: 19.5px;
+ line-height: 36px;
+ color: #333333;
+ border: 0;
+ border-bottom: 1px solid #eee;
+}
+label,
+input,
+button,
+select,
+textarea {
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+ font-size: 13px;
+ font-weight: normal;
+ line-height: 18px;
+}
+label {
+ display: block;
+ margin-bottom: 5px;
+ color: #333333;
+}
+input,
+textarea,
+select,
+.uneditable-input {
+ display: inline-block;
+ width: 210px;
+ height: 18px;
+ padding: 4px;
+ margin-bottom: 9px;
+ font-size: 13px;
+ line-height: 18px;
+ color: #555555;
+ border: 1px solid #ccc;
+ -webkit-border-radius: 3px;
+ -moz-border-radius: 3px;
+ border-radius: 3px;
+}
+.uneditable-textarea {
+ width: auto;
+ height: auto;
+}
+label input, label textarea, label select {
+ display: block;
+}
+input[type="image"], input[type="checkbox"], input[type="radio"] {
+ width: auto;
+ height: auto;
+ padding: 0;
+ margin: 3px 0;
+ *margin-top: 0;
+ /* IE7 */
+
+ line-height: normal;
+ border: 0;
+ cursor: pointer;
+ -webkit-border-radius: 0;
+ -moz-border-radius: 0;
+ border-radius: 0;
+}
+input[type="file"] {
+ padding: initial;
+ line-height: initial;
+ border: initial;
+ background-color: #ffffff;
+ background-color: initial;
+ -webkit-box-shadow: none;
+ -moz-box-shadow: none;
+ box-shadow: none;
+}
+input[type="button"], input[type="reset"], input[type="submit"] {
+ width: auto;
+ height: auto;
+}
+select, input[type="file"] {
+ height: 28px;
+ /* In IE7, the height of the select element cannot be changed by height, only font-size */
+
+ *margin-top: 4px;
+ /* For IE7, add top margin to align select with labels */
+
+ line-height: 28px;
+}
+select {
+ width: 220px;
+ background-color: #ffffff;
+}
+select[multiple], select[size] {
+ height: auto;
+}
+input[type="image"] {
+ -webkit-box-shadow: none;
+ -moz-box-shadow: none;
+ box-shadow: none;
+}
+textarea {
+ height: auto;
+}
+input[type="hidden"] {
+ display: none;
+}
+.radio, .checkbox {
+ padding-left: 18px;
+}
+.radio input[type="radio"], .checkbox input[type="checkbox"] {
+ float: left;
+ margin-left: -18px;
+}
+.controls > .radio:first-child, .controls > .checkbox:first-child {
+ padding-top: 5px;
+}
+.radio.inline, .checkbox.inline {
+ display: inline-block;
+ margin-bottom: 0;
+ vertical-align: middle;
+}
+.radio.inline + .radio.inline, .checkbox.inline + .checkbox.inline {
+ margin-left: 10px;
+}
+.controls > .radio.inline:first-child, .controls > .checkbox.inline:first-child {
+ padding-top: 0;
+}
+input, textarea {
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+ -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+ -webkit-transition: border linear 0.2s, box-shadow linear 0.2s;
+ -moz-transition: border linear 0.2s, box-shadow linear 0.2s;
+ -ms-transition: border linear 0.2s, box-shadow linear 0.2s;
+ -o-transition: border linear 0.2s, box-shadow linear 0.2s;
+ transition: border linear 0.2s, box-shadow linear 0.2s;
+}
+input:focus, textarea:focus {
+ border-color: rgba(82, 168, 236, 0.8);
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
+ -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
+ outline: 0;
+ outline: thin dotted \9;
+ /* IE6-8 */
+
+}
+input[type="file"]:focus, input[type="checkbox"]:focus, select:focus {
+ -webkit-box-shadow: none;
+ -moz-box-shadow: none;
+ box-shadow: none;
+ outline: thin dotted;
+ outline: 5px auto -webkit-focus-ring-color;
+ outline-offset: -2px;
+}
+.input-mini {
+ width: 60px;
+}
+.input-small {
+ width: 90px;
+}
+.input-medium {
+ width: 150px;
+}
+.input-large {
+ width: 210px;
+}
+.input-xlarge {
+ width: 270px;
+}
+.input-xxlarge {
+ width: 530px;
+}
+input[class*="span"],
+select[class*="span"],
+textarea[class*="span"],
+.uneditable-input {
+ float: none;
+ margin-left: 0;
+}
+input.span1, textarea.span1, .uneditable-input.span1 {
+ width: 50px;
+}
+input.span2, textarea.span2, .uneditable-input.span2 {
+ width: 130px;
+}
+input.span3, textarea.span3, .uneditable-input.span3 {
+ width: 210px;
+}
+input.span4, textarea.span4, .uneditable-input.span4 {
+ width: 290px;
+}
+input.span5, textarea.span5, .uneditable-input.span5 {
+ width: 370px;
+}
+input.span6, textarea.span6, .uneditable-input.span6 {
+ width: 450px;
+}
+input.span7, textarea.span7, .uneditable-input.span7 {
+ width: 530px;
+}
+input.span8, textarea.span8, .uneditable-input.span8 {
+ width: 610px;
+}
+input.span9, textarea.span9, .uneditable-input.span9 {
+ width: 690px;
+}
+input.span10, textarea.span10, .uneditable-input.span10 {
+ width: 770px;
+}
+input.span11, textarea.span11, .uneditable-input.span11 {
+ width: 850px;
+}
+input.span12, textarea.span12, .uneditable-input.span12 {
+ width: 930px;
+}
+input[disabled],
+select[disabled],
+textarea[disabled],
+input[readonly],
+select[readonly],
+textarea[readonly] {
+ background-color: #f5f5f5;
+ border-color: #ddd;
+ cursor: not-allowed;
+}
+.control-group.warning > label, .control-group.warning .help-block, .control-group.warning .help-inline {
+ color: #c09853;
+}
+.control-group.warning input, .control-group.warning select, .control-group.warning textarea {
+ color: #c09853;
+ border-color: #c09853;
+}
+.control-group.warning input:focus, .control-group.warning select:focus, .control-group.warning textarea:focus {
+ border-color: #a47e3c;
+ -webkit-box-shadow: 0 0 6px #dbc59e;
+ -moz-box-shadow: 0 0 6px #dbc59e;
+ box-shadow: 0 0 6px #dbc59e;
+}
+.control-group.warning .input-prepend .add-on, .control-group.warning .input-append .add-on {
+ color: #c09853;
+ background-color: #fcf8e3;
+ border-color: #c09853;
+}
+.control-group.error > label, .control-group.error .help-block, .control-group.error .help-inline {
+ color: #b94a48;
+}
+.control-group.error input, .control-group.error select, .control-group.error textarea {
+ color: #b94a48;
+ border-color: #b94a48;
+}
+.control-group.error input:focus, .control-group.error select:focus, .control-group.error textarea:focus {
+ border-color: #953b39;
+ -webkit-box-shadow: 0 0 6px #d59392;
+ -moz-box-shadow: 0 0 6px #d59392;
+ box-shadow: 0 0 6px #d59392;
+}
+.control-group.error .input-prepend .add-on, .control-group.error .input-append .add-on {
+ color: #b94a48;
+ background-color: #f2dede;
+ border-color: #b94a48;
+}
+.control-group.success > label, .control-group.success .help-block, .control-group.success .help-inline {
+ color: #468847;
+}
+.control-group.success input, .control-group.success select, .control-group.success textarea {
+ color: #468847;
+ border-color: #468847;
+}
+.control-group.success input:focus, .control-group.success select:focus, .control-group.success textarea:focus {
+ border-color: #356635;
+ -webkit-box-shadow: 0 0 6px #7aba7b;
+ -moz-box-shadow: 0 0 6px #7aba7b;
+ box-shadow: 0 0 6px #7aba7b;
+}
+.control-group.success .input-prepend .add-on, .control-group.success .input-append .add-on {
+ color: #468847;
+ background-color: #dff0d8;
+ border-color: #468847;
+}
+input:focus:required:invalid, textarea:focus:required:invalid, select:focus:required:invalid {
+ color: #b94a48;
+ border-color: #ee5f5b;
+}
+input:focus:required:invalid:focus, textarea:focus:required:invalid:focus, select:focus:required:invalid:focus {
+ border-color: #e9322d;
+ -webkit-box-shadow: 0 0 6px #f8b9b7;
+ -moz-box-shadow: 0 0 6px #f8b9b7;
+ box-shadow: 0 0 6px #f8b9b7;
+}
+.form-actions {
+ padding: 17px 20px 18px;
+ margin-top: 18px;
+ margin-bottom: 18px;
+ background-color: #f5f5f5;
+ border-top: 1px solid #ddd;
+}
+.uneditable-input {
+ display: block;
+ background-color: #ffffff;
+ border-color: #eee;
+ -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
+ -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
+ box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
+ cursor: not-allowed;
+}
+:-moz-placeholder {
+ color: #999999;
+}
+::-webkit-input-placeholder {
+ color: #999999;
+}
+.help-block {
+ margin-top: 5px;
+ margin-bottom: 0;
+ color: #999999;
+}
+.help-inline {
+ display: inline-block;
+ *display: inline;
+ /* IE7 inline-block hack */
+
+ *zoom: 1;
+ margin-bottom: 9px;
+ vertical-align: middle;
+ padding-left: 5px;
+}
+.input-prepend, .input-append {
+ margin-bottom: 5px;
+ *zoom: 1;
+}
+.input-prepend:before,
+.input-append:before,
+.input-prepend:after,
+.input-append:after {
+ display: table;
+ content: "";
+}
+.input-prepend:after, .input-append:after {
+ clear: both;
+}
+.input-prepend input,
+.input-append input,
+.input-prepend .uneditable-input,
+.input-append .uneditable-input {
+ -webkit-border-radius: 0 3px 3px 0;
+ -moz-border-radius: 0 3px 3px 0;
+ border-radius: 0 3px 3px 0;
+}
+.input-prepend input:focus,
+.input-append input:focus,
+.input-prepend .uneditable-input:focus,
+.input-append .uneditable-input:focus {
+ position: relative;
+ z-index: 2;
+}
+.input-prepend .uneditable-input, .input-append .uneditable-input {
+ border-left-color: #ccc;
+}
+.input-prepend .add-on, .input-append .add-on {
+ float: left;
+ display: block;
+ width: auto;
+ min-width: 16px;
+ height: 18px;
+ margin-right: -1px;
+ padding: 4px 5px;
+ font-weight: normal;
+ line-height: 18px;
+ color: #999999;
+ text-align: center;
+ text-shadow: 0 1px 0 #ffffff;
+ background-color: #f5f5f5;
+ border: 1px solid #ccc;
+ -webkit-border-radius: 3px 0 0 3px;
+ -moz-border-radius: 3px 0 0 3px;
+ border-radius: 3px 0 0 3px;
+}
+.input-prepend .active, .input-append .active {
+ background-color: #a9dba9;
+ border-color: #46a546;
+}
+.input-prepend .add-on {
+ *margin-top: 1px;
+ /* IE6-7 */
+
+}
+.input-append input, .input-append .uneditable-input {
+ float: left;
+ -webkit-border-radius: 3px 0 0 3px;
+ -moz-border-radius: 3px 0 0 3px;
+ border-radius: 3px 0 0 3px;
+}
+.input-append .uneditable-input {
+ border-right-color: #ccc;
+}
+.input-append .add-on {
+ margin-right: 0;
+ margin-left: -1px;
+ -webkit-border-radius: 0 3px 3px 0;
+ -moz-border-radius: 0 3px 3px 0;
+ border-radius: 0 3px 3px 0;
+}
+.input-append input:first-child {
+ *margin-left: -160px;
+}
+.input-append input:first-child + .add-on {
+ *margin-left: -21px;
+}
+.search-query {
+ padding-left: 14px;
+ padding-right: 14px;
+ margin-bottom: 0;
+ -webkit-border-radius: 14px;
+ -moz-border-radius: 14px;
+ border-radius: 14px;
+}
+.form-search input,
+.form-inline input,
+.form-horizontal input,
+.form-search textarea,
+.form-inline textarea,
+.form-horizontal textarea,
+.form-search select,
+.form-inline select,
+.form-horizontal select,
+.form-search .help-inline,
+.form-inline .help-inline,
+.form-horizontal .help-inline,
+.form-search .uneditable-input,
+.form-inline .uneditable-input,
+.form-horizontal .uneditable-input {
+ display: inline-block;
+ margin-bottom: 0;
+}
+.form-search label,
+.form-inline label,
+.form-search .input-append,
+.form-inline .input-append,
+.form-search .input-prepend,
+.form-inline .input-prepend {
+ display: inline-block;
+}
+.form-search .input-append .add-on,
+.form-inline .input-prepend .add-on,
+.form-search .input-append .add-on,
+.form-inline .input-prepend .add-on {
+ vertical-align: middle;
+}
+.control-group {
+ margin-bottom: 9px;
+}
+.form-horizontal legend + .control-group {
+ margin-top: 18px;
+ -webkit-margin-top-collapse: separate;
+}
+.form-horizontal .control-group {
+ margin-bottom: 18px;
+ *zoom: 1;
+}
+.form-horizontal .control-group:before, .form-horizontal .control-group:after {
+ display: table;
+ content: "";
+}
+.form-horizontal .control-group:after {
+ clear: both;
+}
+.form-horizontal .control-group > label {
+ float: left;
+ width: 140px;
+ padding-top: 5px;
+ text-align: right;
+}
+.form-horizontal .controls {
+ margin-left: 160px;
+}
+.form-horizontal .form-actions {
+ padding-left: 160px;
+}
+table {
+ max-width: 100%;
+ border-collapse: collapse;
+ border-spacing: 0;
+}
+.table {
+ width: 100%;
+ margin-bottom: 18px;
+}
+.table th, .table td {
+ padding: 8px;
+ line-height: 18px;
+ text-align: left;
+ border-top: 1px solid #ddd;
+}
+.table th {
+ font-weight: bold;
+ vertical-align: bottom;
+}
+.table td {
+ vertical-align: top;
+}
+.table thead:first-child tr th, .table thead:first-child tr td {
+ border-top: 0;
+}
+.table tbody + tbody {
+ border-top: 2px solid #ddd;
+}
+.table-condensed th, .table-condensed td {
+ padding: 4px 5px;
+}
+.table-bordered {
+ border: 1px solid #ddd;
+ border-collapse: separate;
+ *border-collapse: collapsed;
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ border-radius: 4px;
+}
+.table-bordered th + th,
+.table-bordered td + td,
+.table-bordered th + td,
+.table-bordered td + th {
+ border-left: 1px solid #ddd;
+}
+.table-bordered thead:first-child tr:first-child th, .table-bordered tbody:first-child tr:first-child th, .table-bordered tbody:first-child tr:first-child td {
+ border-top: 0;
+}
+.table-bordered thead:first-child tr:first-child th:first-child, .table-bordered tbody:first-child tr:first-child td:first-child {
+ -webkit-border-radius: 4px 0 0 0;
+ -moz-border-radius: 4px 0 0 0;
+ border-radius: 4px 0 0 0;
+}
+.table-bordered thead:first-child tr:first-child th:last-child, .table-bordered tbody:first-child tr:first-child td:last-child {
+ -webkit-border-radius: 0 4px 0 0;
+ -moz-border-radius: 0 4px 0 0;
+ border-radius: 0 4px 0 0;
+}
+.table-bordered thead:last-child tr:last-child th:first-child, .table-bordered tbody:last-child tr:last-child td:first-child {
+ -webkit-border-radius: 0 0 0 4px;
+ -moz-border-radius: 0 0 0 4px;
+ border-radius: 0 0 0 4px;
+}
+.table-bordered thead:last-child tr:last-child th:last-child, .table-bordered tbody:last-child tr:last-child td:last-child {
+ -webkit-border-radius: 0 0 4px 0;
+ -moz-border-radius: 0 0 4px 0;
+ border-radius: 0 0 4px 0;
+}
+.table-striped tbody tr:nth-child(odd) td, .table-striped tbody tr:nth-child(odd) th {
+ background-color: #f9f9f9;
+}
+table .span1 {
+ float: none;
+ width: 44px;
+ margin-left: 0;
+}
+table .span2 {
+ float: none;
+ width: 124px;
+ margin-left: 0;
+}
+table .span3 {
+ float: none;
+ width: 204px;
+ margin-left: 0;
+}
+table .span4 {
+ float: none;
+ width: 284px;
+ margin-left: 0;
+}
+table .span5 {
+ float: none;
+ width: 364px;
+ margin-left: 0;
+}
+table .span6 {
+ float: none;
+ width: 444px;
+ margin-left: 0;
+}
+table .span7 {
+ float: none;
+ width: 524px;
+ margin-left: 0;
+}
+table .span8 {
+ float: none;
+ width: 604px;
+ margin-left: 0;
+}
+table .span9 {
+ float: none;
+ width: 684px;
+ margin-left: 0;
+}
+table .span10 {
+ float: none;
+ width: 764px;
+ margin-left: 0;
+}
+table .span11 {
+ float: none;
+ width: 844px;
+ margin-left: 0;
+}
+table .span12 {
+ float: none;
+ width: 924px;
+ margin-left: 0;
+}
+[class^="icon-"] {
+ display: inline-block;
+ width: 14px;
+ height: 14px;
+ vertical-align: text-top;
+ background-image: url(../img/glyphicons-halflings.png);
+ background-position: 14px 14px;
+ background-repeat: no-repeat;
+ *margin-right: .3em;
+}
+[class^="icon-"]:last-child {
+ *margin-left: 0;
+}
+.icon-white {
+ background-image: url(../img/glyphicons-halflings-white.png);
+}
+.icon-glass {
+ background-position: 0 0;
+}
+.icon-music {
+ background-position: -24px 0;
+}
+.icon-search {
+ background-position: -48px 0;
+}
+.icon-envelope {
+ background-position: -72px 0;
+}
+.icon-heart {
+ background-position: -96px 0;
+}
+.icon-star {
+ background-position: -120px 0;
+}
+.icon-star-empty {
+ background-position: -144px 0;
+}
+.icon-user {
+ background-position: -168px 0;
+}
+.icon-film {
+ background-position: -192px 0;
+}
+.icon-th-large {
+ background-position: -216px 0;
+}
+.icon-th {
+ background-position: -240px 0;
+}
+.icon-th-list {
+ background-position: -264px 0;
+}
+.icon-ok {
+ background-position: -288px 0;
+}
+.icon-remove {
+ background-position: -312px 0;
+}
+.icon-zoom-in {
+ background-position: -336px 0;
+}
+.icon-zoom-out {
+ background-position: -360px 0;
+}
+.icon-off {
+ background-position: -384px 0;
+}
+.icon-signal {
+ background-position: -408px 0;
+}
+.icon-cog {
+ background-position: -432px 0;
+}
+.icon-trash {
+ background-position: -456px 0;
+}
+.icon-home {
+ background-position: 0 -24px;
+}
+.icon-file {
+ background-position: -24px -24px;
+}
+.icon-time {
+ background-position: -48px -24px;
+}
+.icon-road {
+ background-position: -72px -24px;
+}
+.icon-download-alt {
+ background-position: -96px -24px;
+}
+.icon-download {
+ background-position: -120px -24px;
+}
+.icon-upload {
+ background-position: -144px -24px;
+}
+.icon-inbox {
+ background-position: -168px -24px;
+}
+.icon-play-circle {
+ background-position: -192px -24px;
+}
+.icon-repeat {
+ background-position: -216px -24px;
+}
+.icon-refresh {
+ background-position: -240px -24px;
+}
+.icon-list-alt {
+ background-position: -264px -24px;
+}
+.icon-lock {
+ background-position: -287px -24px;
+}
+.icon-flag {
+ background-position: -312px -24px;
+}
+.icon-headphones {
+ background-position: -336px -24px;
+}
+.icon-volume-off {
+ background-position: -360px -24px;
+}
+.icon-volume-down {
+ background-position: -384px -24px;
+}
+.icon-volume-up {
+ background-position: -408px -24px;
+}
+.icon-qrcode {
+ background-position: -432px -24px;
+}
+.icon-barcode {
+ background-position: -456px -24px;
+}
+.icon-tag {
+ background-position: 0 -48px;
+}
+.icon-tags {
+ background-position: -25px -48px;
+}
+.icon-book {
+ background-position: -48px -48px;
+}
+.icon-bookmark {
+ background-position: -72px -48px;
+}
+.icon-print {
+ background-position: -96px -48px;
+}
+.icon-camera {
+ background-position: -120px -48px;
+}
+.icon-font {
+ background-position: -144px -48px;
+}
+.icon-bold {
+ background-position: -167px -48px;
+}
+.icon-italic {
+ background-position: -192px -48px;
+}
+.icon-text-height {
+ background-position: -216px -48px;
+}
+.icon-text-width {
+ background-position: -240px -48px;
+}
+.icon-align-left {
+ background-position: -264px -48px;
+}
+.icon-align-center {
+ background-position: -288px -48px;
+}
+.icon-align-right {
+ background-position: -312px -48px;
+}
+.icon-align-justify {
+ background-position: -336px -48px;
+}
+.icon-list {
+ background-position: -360px -48px;
+}
+.icon-indent-left {
+ background-position: -384px -48px;
+}
+.icon-indent-right {
+ background-position: -408px -48px;
+}
+.icon-facetime-video {
+ background-position: -432px -48px;
+}
+.icon-picture {
+ background-position: -456px -48px;
+}
+.icon-pencil {
+ background-position: 0 -72px;
+}
+.icon-map-marker {
+ background-position: -24px -72px;
+}
+.icon-adjust {
+ background-position: -48px -72px;
+}
+.icon-tint {
+ background-position: -72px -72px;
+}
+.icon-edit {
+ background-position: -96px -72px;
+}
+.icon-share {
+ background-position: -120px -72px;
+}
+.icon-check {
+ background-position: -144px -72px;
+}
+.icon-move {
+ background-position: -168px -72px;
+}
+.icon-step-backward {
+ background-position: -192px -72px;
+}
+.icon-fast-backward {
+ background-position: -216px -72px;
+}
+.icon-backward {
+ background-position: -240px -72px;
+}
+.icon-play {
+ background-position: -264px -72px;
+}
+.icon-pause {
+ background-position: -288px -72px;
+}
+.icon-stop {
+ background-position: -312px -72px;
+}
+.icon-forward {
+ background-position: -336px -72px;
+}
+.icon-fast-forward {
+ background-position: -360px -72px;
+}
+.icon-step-forward {
+ background-position: -384px -72px;
+}
+.icon-eject {
+ background-position: -408px -72px;
+}
+.icon-chevron-left {
+ background-position: -432px -72px;
+}
+.icon-chevron-right {
+ background-position: -456px -72px;
+}
+.icon-plus-sign {
+ background-position: 0 -96px;
+}
+.icon-minus-sign {
+ background-position: -24px -96px;
+}
+.icon-remove-sign {
+ background-position: -48px -96px;
+}
+.icon-ok-sign {
+ background-position: -72px -96px;
+}
+.icon-question-sign {
+ background-position: -96px -96px;
+}
+.icon-info-sign {
+ background-position: -120px -96px;
+}
+.icon-screenshot {
+ background-position: -144px -96px;
+}
+.icon-remove-circle {
+ background-position: -168px -96px;
+}
+.icon-ok-circle {
+ background-position: -192px -96px;
+}
+.icon-ban-circle {
+ background-position: -216px -96px;
+}
+.icon-arrow-left {
+ background-position: -240px -96px;
+}
+.icon-arrow-right {
+ background-position: -264px -96px;
+}
+.icon-arrow-up {
+ background-position: -289px -96px;
+}
+.icon-arrow-down {
+ background-position: -312px -96px;
+}
+.icon-share-alt {
+ background-position: -336px -96px;
+}
+.icon-resize-full {
+ background-position: -360px -96px;
+}
+.icon-resize-small {
+ background-position: -384px -96px;
+}
+.icon-plus {
+ background-position: -408px -96px;
+}
+.icon-minus {
+ background-position: -433px -96px;
+}
+.icon-asterisk {
+ background-position: -456px -96px;
+}
+.icon-exclamation-sign {
+ background-position: 0 -120px;
+}
+.icon-gift {
+ background-position: -24px -120px;
+}
+.icon-leaf {
+ background-position: -48px -120px;
+}
+.icon-fire {
+ background-position: -72px -120px;
+}
+.icon-eye-open {
+ background-position: -96px -120px;
+}
+.icon-eye-close {
+ background-position: -120px -120px;
+}
+.icon-warning-sign {
+ background-position: -144px -120px;
+}
+.icon-plane {
+ background-position: -168px -120px;
+}
+.icon-calendar {
+ background-position: -192px -120px;
+}
+.icon-random {
+ background-position: -216px -120px;
+}
+.icon-comment {
+ background-position: -240px -120px;
+}
+.icon-magnet {
+ background-position: -264px -120px;
+}
+.icon-chevron-up {
+ background-position: -288px -120px;
+}
+.icon-chevron-down {
+ background-position: -313px -119px;
+}
+.icon-retweet {
+ background-position: -336px -120px;
+}
+.icon-shopping-cart {
+ background-position: -360px -120px;
+}
+.icon-folder-close {
+ background-position: -384px -120px;
+}
+.icon-folder-open {
+ background-position: -408px -120px;
+}
+.icon-resize-vertical {
+ background-position: -432px -119px;
+}
+.icon-resize-horizontal {
+ background-position: -456px -118px;
+}
+.dropdown {
+ position: relative;
+}
+.dropdown-toggle {
+ *margin-bottom: -3px;
+}
+.dropdown-toggle:active, .open .dropdown-toggle {
+ outline: 0;
+}
+.caret {
+ display: inline-block;
+ width: 0;
+ height: 0;
+ text-indent: -99999px;
+ *text-indent: 0;
+ vertical-align: top;
+ border-left: 4px solid transparent;
+ border-right: 4px solid transparent;
+ border-top: 4px solid #000000;
+ opacity: 0.3;
+ filter: alpha(opacity=30);
+ content: "\2193";
+}
+.dropdown .caret {
+ margin-top: 8px;
+ margin-left: 2px;
+}
+.dropdown:hover .caret, .open.dropdown .caret {
+ opacity: 1;
+ filter: alpha(opacity=100);
+}
+.dropdown-menu {
+ position: absolute;
+ top: 100%;
+ left: 0;
+ z-index: 1000;
+ float: left;
+ display: none;
+ min-width: 160px;
+ max-width: 220px;
+ _width: 160px;
+ padding: 4px 0;
+ margin: 0;
+ list-style: none;
+ background-color: #ffffff;
+ border-color: #ccc;
+ border-color: rgba(0, 0, 0, 0.2);
+ border-style: solid;
+ border-width: 1px;
+ -webkit-border-radius: 0 0 5px 5px;
+ -moz-border-radius: 0 0 5px 5px;
+ border-radius: 0 0 5px 5px;
+ -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+ -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+ box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+ -webkit-background-clip: padding-box;
+ -moz-background-clip: padding;
+ background-clip: padding-box;
+ *border-right-width: 2px;
+ *border-bottom-width: 2px;
+}
+.dropdown-menu.bottom-up {
+ top: auto;
+ bottom: 100%;
+ margin-bottom: 2px;
+}
+.dropdown-menu .divider {
+ height: 1px;
+ margin: 5px 1px;
+ overflow: hidden;
+ background-color: #e5e5e5;
+ border-bottom: 1px solid #ffffff;
+ *width: 100%;
+ *margin: -5px 0 5px;
+}
+.dropdown-menu a {
+ display: block;
+ padding: 3px 15px;
+ clear: both;
+ font-weight: normal;
+ line-height: 18px;
+ color: #555555;
+ white-space: nowrap;
+}
+.dropdown-menu li > a:hover, .dropdown-menu .active > a, .dropdown-menu .active > a:hover {
+ color: #ffffff;
+ text-decoration: none;
+ background-color: #0088cc;
+}
+.dropdown.open {
+ *z-index: 1000;
+}
+.dropdown.open .dropdown-toggle {
+ color: #ffffff;
+ background: #ccc;
+ background: rgba(0, 0, 0, 0.3);
+}
+.dropdown.open .dropdown-menu {
+ display: block;
+}
+.typeahead {
+ margin-top: 2px;
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ border-radius: 4px;
+}
+.well {
+ min-height: 20px;
+ padding: 19px;
+ margin-bottom: 20px;
+ background-color: #f5f5f5;
+ border: 1px solid #eee;
+ border: 1px solid rgba(0, 0, 0, 0.05);
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ border-radius: 4px;
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
+ -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
+}
+.well blockquote {
+ border-color: #ddd;
+ border-color: rgba(0, 0, 0, 0.15);
+}
+.fade {
+ -webkit-transition: opacity 0.15s linear;
+ -moz-transition: opacity 0.15s linear;
+ -ms-transition: opacity 0.15s linear;
+ -o-transition: opacity 0.15s linear;
+ transition: opacity 0.15s linear;
+ opacity: 0;
+}
+.fade.in {
+ opacity: 1;
+}
+.collapse {
+ -webkit-transition: height 0.35s ease;
+ -moz-transition: height 0.35s ease;
+ -ms-transition: height 0.35s ease;
+ -o-transition: height 0.35s ease;
+ transition: height 0.35s ease;
+ position: relative;
+ overflow: hidden;
+ height: 0;
+}
+.collapse.in {
+ height: auto;
+}
+.close {
+ float: right;
+ font-size: 20px;
+ font-weight: bold;
+ line-height: 18px;
+ color: #000000;
+ text-shadow: 0 1px 0 #ffffff;
+ opacity: 0.2;
+ filter: alpha(opacity=20);
+}
+.close:hover {
+ color: #000000;
+ text-decoration: none;
+ opacity: 0.4;
+ filter: alpha(opacity=40);
+ cursor: pointer;
+}
+.btn {
+ display: inline-block;
+ padding: 4px 10px 4px;
+ font-size: 13px;
+ line-height: 18px;
+ color: #333333;
+ text-align: center;
+ text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);
+ background-color: #fafafa;
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6));
+ background-image: -webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
+ background-image: -moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6);
+ background-image: -ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
+ background-image: -o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
+ background-image: linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
+ background-repeat: no-repeat;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0);
+ border: 1px solid #ccc;
+ border-bottom-color: #bbb;
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ border-radius: 4px;
+ -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+ -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+ cursor: pointer;
+ *margin-left: .3em;
+}
+.btn:first-child {
+ *margin-left: 0;
+}
+.btn:hover {
+ color: #333333;
+ text-decoration: none;
+ background-color: #e6e6e6;
+ background-position: 0 -15px;
+ -webkit-transition: background-position 0.1s linear;
+ -moz-transition: background-position 0.1s linear;
+ -ms-transition: background-position 0.1s linear;
+ -o-transition: background-position 0.1s linear;
+ transition: background-position 0.1s linear;
+}
+.btn:focus {
+ outline: thin dotted;
+ outline: 5px auto -webkit-focus-ring-color;
+ outline-offset: -2px;
+}
+.btn.active, .btn:active {
+ background-image: none;
+ -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+ -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+ box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+ background-color: #e6e6e6;
+ background-color: #d9d9d9 \9;
+ color: rgba(0, 0, 0, 0.5);
+ outline: 0;
+}
+.btn.disabled, .btn[disabled] {
+ cursor: default;
+ background-image: none;
+ background-color: #e6e6e6;
+ opacity: 0.65;
+ filter: alpha(opacity=65);
+ -webkit-box-shadow: none;
+ -moz-box-shadow: none;
+ box-shadow: none;
+}
+.btn-large {
+ padding: 9px 14px;
+ font-size: 15px;
+ line-height: normal;
+ -webkit-border-radius: 5px;
+ -moz-border-radius: 5px;
+ border-radius: 5px;
+}
+.btn-large .icon {
+ margin-top: 1px;
+}
+.btn-small {
+ padding: 5px 9px;
+ font-size: 11px;
+ line-height: 16px;
+}
+.btn-small .icon {
+ margin-top: -1px;
+}
+.btn-primary,
+.btn-primary:hover,
+.btn-warning,
+.btn-warning:hover,
+.btn-danger,
+.btn-danger:hover,
+.btn-success,
+.btn-success:hover,
+.btn-info,
+.btn-info:hover {
+ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+ color: #ffffff;
+}
+.btn-primary.active,
+.btn-warning.active,
+.btn-danger.active,
+.btn-success.active,
+.btn-info.active {
+ color: rgba(255, 255, 255, 0.75);
+}
+.btn-primary {
+ background-color: #006dcc;
+ background-image: -moz-linear-gradient(top, #0088cc, #0044cc);
+ background-image: -ms-linear-gradient(top, #0088cc, #0044cc);
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));
+ background-image: -webkit-linear-gradient(top, #0088cc, #0044cc);
+ background-image: -o-linear-gradient(top, #0088cc, #0044cc);
+ background-image: linear-gradient(top, #0088cc, #0044cc);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0);
+ border-color: #0044cc #0044cc #002a80;
+ border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+}
+.btn-primary:hover,
+.btn-primary:active,
+.btn-primary.active,
+.btn-primary.disabled,
+.btn-primary[disabled] {
+ background-color: #0044cc;
+}
+.btn-primary:active, .btn-primary.active {
+ background-color: #003399 \9;
+}
+.btn-warning {
+ background-color: #faa732;
+ background-image: -moz-linear-gradient(top, #fbb450, #f89406);
+ background-image: -ms-linear-gradient(top, #fbb450, #f89406);
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));
+ background-image: -webkit-linear-gradient(top, #fbb450, #f89406);
+ background-image: -o-linear-gradient(top, #fbb450, #f89406);
+ background-image: linear-gradient(top, #fbb450, #f89406);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fbb450', endColorstr='#f89406', GradientType=0);
+ border-color: #f89406 #f89406 #ad6704;
+ border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+}
+.btn-warning:hover,
+.btn-warning:active,
+.btn-warning.active,
+.btn-warning.disabled,
+.btn-warning[disabled] {
+ background-color: #f89406;
+}
+.btn-warning:active, .btn-warning.active {
+ background-color: #c67605 \9;
+}
+.btn-danger {
+ background-color: #da4f49;
+ background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f);
+ background-image: -ms-linear-gradient(top, #ee5f5b, #bd362f);
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));
+ background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f);
+ background-image: -o-linear-gradient(top, #ee5f5b, #bd362f);
+ background-image: linear-gradient(top, #ee5f5b, #bd362f);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#bd362f', GradientType=0);
+ border-color: #bd362f #bd362f #802420;
+ border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+}
+.btn-danger:hover,
+.btn-danger:active,
+.btn-danger.active,
+.btn-danger.disabled,
+.btn-danger[disabled] {
+ background-color: #bd362f;
+}
+.btn-danger:active, .btn-danger.active {
+ background-color: #942a25 \9;
+}
+.btn-success {
+ background-color: #5bb75b;
+ background-image: -moz-linear-gradient(top, #62c462, #51a351);
+ background-image: -ms-linear-gradient(top, #62c462, #51a351);
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351));
+ background-image: -webkit-linear-gradient(top, #62c462, #51a351);
+ background-image: -o-linear-gradient(top, #62c462, #51a351);
+ background-image: linear-gradient(top, #62c462, #51a351);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#51a351', GradientType=0);
+ border-color: #51a351 #51a351 #387038;
+ border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+}
+.btn-success:hover,
+.btn-success:active,
+.btn-success.active,
+.btn-success.disabled,
+.btn-success[disabled] {
+ background-color: #51a351;
+}
+.btn-success:active, .btn-success.active {
+ background-color: #408140 \9;
+}
+.btn-info {
+ background-color: #49afcd;
+ background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4);
+ background-image: -ms-linear-gradient(top, #5bc0de, #2f96b4);
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));
+ background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4);
+ background-image: -o-linear-gradient(top, #5bc0de, #2f96b4);
+ background-image: linear-gradient(top, #5bc0de, #2f96b4);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#2f96b4', GradientType=0);
+ border-color: #2f96b4 #2f96b4 #1f6377;
+ border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+}
+.btn-info:hover,
+.btn-info:active,
+.btn-info.active,
+.btn-info.disabled,
+.btn-info[disabled] {
+ background-color: #2f96b4;
+}
+.btn-info:active, .btn-info.active {
+ background-color: #24748c \9;
+}
+button.btn, input[type="submit"].btn {
+ *padding-top: 2px;
+ *padding-bottom: 2px;
+}
+button.btn::-moz-focus-inner, input[type="submit"].btn::-moz-focus-inner {
+ padding: 0;
+ border: 0;
+}
+button.btn.large, input[type="submit"].btn.large {
+ *padding-top: 7px;
+ *padding-bottom: 7px;
+}
+button.btn.small, input[type="submit"].btn.small {
+ *padding-top: 3px;
+ *padding-bottom: 3px;
+}
+.btn-group {
+ position: relative;
+ *zoom: 1;
+ *margin-left: .3em;
+}
+.btn-group:before, .btn-group:after {
+ display: table;
+ content: "";
+}
+.btn-group:after {
+ clear: both;
+}
+.btn-group:first-child {
+ *margin-left: 0;
+}
+.btn-group + .btn-group {
+ margin-left: 5px;
+}
+.btn-toolbar {
+ margin-top: 9px;
+ margin-bottom: 9px;
+}
+.btn-toolbar .btn-group {
+ display: inline-block;
+ *display: inline;
+ /* IE7 inline-block hack */
+
+ *zoom: 1;
+}
+.btn-group .btn {
+ position: relative;
+ float: left;
+ margin-left: -1px;
+ -webkit-border-radius: 0;
+ -moz-border-radius: 0;
+ border-radius: 0;
+}
+.btn-group .btn:first-child {
+ margin-left: 0;
+ -webkit-border-top-left-radius: 4px;
+ -moz-border-radius-topleft: 4px;
+ border-top-left-radius: 4px;
+ -webkit-border-bottom-left-radius: 4px;
+ -moz-border-radius-bottomleft: 4px;
+ border-bottom-left-radius: 4px;
+}
+.btn-group .btn:last-child, .btn-group .dropdown-toggle {
+ -webkit-border-top-right-radius: 4px;
+ -moz-border-radius-topright: 4px;
+ border-top-right-radius: 4px;
+ -webkit-border-bottom-right-radius: 4px;
+ -moz-border-radius-bottomright: 4px;
+ border-bottom-right-radius: 4px;
+}
+.btn-group .btn.large:first-child {
+ margin-left: 0;
+ -webkit-border-top-left-radius: 6px;
+ -moz-border-radius-topleft: 6px;
+ border-top-left-radius: 6px;
+ -webkit-border-bottom-left-radius: 6px;
+ -moz-border-radius-bottomleft: 6px;
+ border-bottom-left-radius: 6px;
+}
+.btn-group .btn.large:last-child, .btn-group .large.dropdown-toggle {
+ -webkit-border-top-right-radius: 6px;
+ -moz-border-radius-topright: 6px;
+ border-top-right-radius: 6px;
+ -webkit-border-bottom-right-radius: 6px;
+ -moz-border-radius-bottomright: 6px;
+ border-bottom-right-radius: 6px;
+}
+.btn-group .btn:hover,
+.btn-group .btn:focus,
+.btn-group .btn:active,
+.btn-group .btn.active {
+ z-index: 2;
+}
+.btn-group .dropdown-toggle:active, .btn-group.open .dropdown-toggle {
+ outline: 0;
+}
+.btn-group .dropdown-toggle {
+ padding-left: 8px;
+ padding-right: 8px;
+ -webkit-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+ -moz-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+ box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+ *padding-top: 5px;
+ *padding-bottom: 5px;
+}
+.btn-group.open {
+ *z-index: 1000;
+}
+.btn-group.open .dropdown-menu {
+ display: block;
+ margin-top: 1px;
+ -webkit-border-radius: 5px;
+ -moz-border-radius: 5px;
+ border-radius: 5px;
+}
+.btn-group.open .dropdown-toggle {
+ background-image: none;
+ -webkit-box-shadow: inset 0 1px 6px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+ -moz-box-shadow: inset 0 1px 6px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+ box-shadow: inset 0 1px 6px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+}
+.btn .caret {
+ margin-top: 7px;
+ margin-left: 0;
+}
+.btn:hover .caret, .open.btn-group .caret {
+ opacity: 1;
+ filter: alpha(opacity=100);
+}
+.btn-primary .caret,
+.btn-danger .caret,
+.btn-info .caret,
+.btn-success .caret {
+ border-top-color: #ffffff;
+ opacity: 0.75;
+ filter: alpha(opacity=75);
+}
+.btn-small .caret {
+ margin-top: 4px;
+}
+.alert {
+ padding: 8px 35px 8px 14px;
+ margin-bottom: 18px;
+ text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
+ background-color: #fcf8e3;
+ border: 1px solid #fbeed5;
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ border-radius: 4px;
+}
+.alert, .alert-heading {
+ color: #c09853;
+}
+.alert .close {
+ position: relative;
+ top: -2px;
+ right: -21px;
+ line-height: 18px;
+}
+.alert-success {
+ background-color: #dff0d8;
+ border-color: #d6e9c6;
+}
+.alert-success, .alert-success .alert-heading {
+ color: #468847;
+}
+.alert-danger, .alert-error {
+ background-color: #f2dede;
+ border-color: #eed3d7;
+}
+.alert-danger,
+.alert-error,
+.alert-danger .alert-heading,
+.alert-error .alert-heading {
+ color: #b94a48;
+}
+.alert-info {
+ background-color: #d9edf7;
+ border-color: #bce8f1;
+}
+.alert-info, .alert-info .alert-heading {
+ color: #3a87ad;
+}
+.alert-block {
+ padding-top: 14px;
+ padding-bottom: 14px;
+}
+.alert-block > p, .alert-block > ul {
+ margin-bottom: 0;
+}
+.alert-block p + p {
+ margin-top: 5px;
+}
+.nav {
+ margin-left: 0;
+ margin-bottom: 18px;
+ list-style: none;
+}
+.nav > li > a {
+ display: block;
+}
+.nav > li > a:hover {
+ text-decoration: none;
+ background-color: #eeeeee;
+}
+.nav-list {
+ padding-left: 14px;
+ padding-right: 14px;
+ margin-bottom: 0;
+}
+.nav-list > li > a, .nav-list .nav-header {
+ display: block;
+ padding: 3px 15px;
+ margin-left: -15px;
+ margin-right: -15px;
+ text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
+}
+.nav-list .nav-header {
+ font-size: 11px;
+ font-weight: bold;
+ line-height: 18px;
+ color: #999999;
+ text-transform: uppercase;
+}
+.nav-list > li + .nav-header {
+ margin-top: 9px;
+}
+.nav-list .active > a, .nav-list .active > a:hover {
+ color: #ffffff;
+ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);
+ background-color: #0088cc;
+}
+.nav-list [class^="icon-"] {
+ margin-right: 2px;
+}
+.nav-tabs, .nav-pills {
+ *zoom: 1;
+}
+.nav-tabs:before,
+.nav-pills:before,
+.nav-tabs:after,
+.nav-pills:after {
+ display: table;
+ content: "";
+}
+.nav-tabs:after, .nav-pills:after {
+ clear: both;
+}
+.nav-tabs > li, .nav-pills > li {
+ float: left;
+}
+.nav-tabs > li > a, .nav-pills > li > a {
+ padding-right: 12px;
+ padding-left: 12px;
+ margin-right: 2px;
+ line-height: 14px;
+}
+.nav-tabs {
+ border-bottom: 1px solid #ddd;
+}
+.nav-tabs > li {
+ margin-bottom: -1px;
+}
+.nav-tabs > li > a {
+ padding-top: 9px;
+ padding-bottom: 9px;
+ border: 1px solid transparent;
+ -webkit-border-radius: 4px 4px 0 0;
+ -moz-border-radius: 4px 4px 0 0;
+ border-radius: 4px 4px 0 0;
+}
+.nav-tabs > li > a:hover {
+ border-color: #eeeeee #eeeeee #dddddd;
+}
+.nav-tabs > .active > a, .nav-tabs > .active > a:hover {
+ color: #555555;
+ background-color: #ffffff;
+ border: 1px solid #ddd;
+ border-bottom-color: transparent;
+ cursor: default;
+}
+.nav-pills > li > a {
+ padding-top: 8px;
+ padding-bottom: 8px;
+ margin-top: 2px;
+ margin-bottom: 2px;
+ -webkit-border-radius: 5px;
+ -moz-border-radius: 5px;
+ border-radius: 5px;
+}
+.nav-pills .active > a, .nav-pills .active > a:hover {
+ color: #ffffff;
+ background-color: #0088cc;
+}
+.nav-stacked > li {
+ float: none;
+}
+.nav-stacked > li > a {
+ margin-right: 0;
+}
+.nav-tabs.nav-stacked {
+ border-bottom: 0;
+}
+.nav-tabs.nav-stacked > li > a {
+ border: 1px solid #ddd;
+ -webkit-border-radius: 0;
+ -moz-border-radius: 0;
+ border-radius: 0;
+}
+.nav-tabs.nav-stacked > li:first-child > a {
+ -webkit-border-radius: 4px 4px 0 0;
+ -moz-border-radius: 4px 4px 0 0;
+ border-radius: 4px 4px 0 0;
+}
+.nav-tabs.nav-stacked > li:last-child > a {
+ -webkit-border-radius: 0 0 4px 4px;
+ -moz-border-radius: 0 0 4px 4px;
+ border-radius: 0 0 4px 4px;
+}
+.nav-tabs.nav-stacked > li > a:hover {
+ border-color: #ddd;
+ z-index: 2;
+}
+.nav-pills.nav-stacked > li > a {
+ margin-bottom: 3px;
+}
+.nav-pills.nav-stacked > li:last-child > a {
+ margin-bottom: 1px;
+}
+.nav-tabs .dropdown-menu, .nav-pills .dropdown-menu {
+ margin-top: 1px;
+ border-width: 1px;
+}
+.nav-pills .dropdown-menu {
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ border-radius: 4px;
+}
+.nav-tabs .dropdown-toggle .caret, .nav-pills .dropdown-toggle .caret {
+ border-top-color: #0088cc;
+ margin-top: 6px;
+}
+.nav-tabs .dropdown-toggle:hover .caret, .nav-pills .dropdown-toggle:hover .caret {
+ border-top-color: #005580;
+}
+.nav-tabs .active .dropdown-toggle .caret, .nav-pills .active .dropdown-toggle .caret {
+ border-top-color: #333333;
+}
+.nav > .dropdown.active > a:hover {
+ color: #000000;
+ cursor: pointer;
+}
+.nav-tabs .open .dropdown-toggle, .nav-pills .open .dropdown-toggle, .nav > .open.active > a:hover {
+ color: #ffffff;
+ background-color: #999999;
+ border-color: #999999;
+}
+.nav .open .caret, .nav .open.active .caret, .nav .open a:hover .caret {
+ border-top-color: #ffffff;
+ opacity: 1;
+ filter: alpha(opacity=100);
+}
+.tabs-stacked .open > a:hover {
+ border-color: #999999;
+}
+.tabbable {
+ *zoom: 1;
+}
+.tabbable:before, .tabbable:after {
+ display: table;
+ content: "";
+}
+.tabbable:after {
+ clear: both;
+}
+.tabs-below .nav-tabs, .tabs-right .nav-tabs, .tabs-left .nav-tabs {
+ border-bottom: 0;
+}
+.tab-content > .tab-pane, .pill-content > .pill-pane {
+ display: none;
+}
+.tab-content > .active, .pill-content > .active {
+ display: block;
+}
+.tabs-below .nav-tabs {
+ border-top: 1px solid #ddd;
+}
+.tabs-below .nav-tabs > li {
+ margin-top: -1px;
+ margin-bottom: 0;
+}
+.tabs-below .nav-tabs > li > a {
+ -webkit-border-radius: 0 0 4px 4px;
+ -moz-border-radius: 0 0 4px 4px;
+ border-radius: 0 0 4px 4px;
+}
+.tabs-below .nav-tabs > li > a:hover {
+ border-bottom-color: transparent;
+ border-top-color: #ddd;
+}
+.tabs-below .nav-tabs .active > a, .tabs-below .nav-tabs .active > a:hover {
+ border-color: transparent #ddd #ddd #ddd;
+}
+.tabs-left .nav-tabs > li, .tabs-right .nav-tabs > li {
+ float: none;
+}
+.tabs-left .nav-tabs > li > a, .tabs-right .nav-tabs > li > a {
+ min-width: 74px;
+ margin-right: 0;
+ margin-bottom: 3px;
+}
+.tabs-left .nav-tabs {
+ float: left;
+ margin-right: 19px;
+ border-right: 1px solid #ddd;
+}
+.tabs-left .nav-tabs > li > a {
+ margin-right: -1px;
+ -webkit-border-radius: 4px 0 0 4px;
+ -moz-border-radius: 4px 0 0 4px;
+ border-radius: 4px 0 0 4px;
+}
+.tabs-left .nav-tabs > li > a:hover {
+ border-color: #eeeeee #dddddd #eeeeee #eeeeee;
+}
+.tabs-left .nav-tabs .active > a, .tabs-left .nav-tabs .active > a:hover {
+ border-color: #ddd transparent #ddd #ddd;
+ *border-right-color: #ffffff;
+}
+.tabs-right .nav-tabs {
+ float: right;
+ margin-left: 19px;
+ border-left: 1px solid #ddd;
+}
+.tabs-right .nav-tabs > li > a {
+ margin-left: -1px;
+ -webkit-border-radius: 0 4px 4px 0;
+ -moz-border-radius: 0 4px 4px 0;
+ border-radius: 0 4px 4px 0;
+}
+.tabs-right .nav-tabs > li > a:hover {
+ border-color: #eeeeee #eeeeee #eeeeee #dddddd;
+}
+.tabs-right .nav-tabs .active > a, .tabs-right .nav-tabs .active > a:hover {
+ border-color: #ddd #ddd #ddd transparent;
+ *border-left-color: #ffffff;
+}
+.navbar {
+ overflow: visible;
+ margin-bottom: 18px;
+}
+.navbar-inner {
+ padding-left: 20px;
+ padding-right: 20px;
+ background-color: #2c2c2c;
+ background-image: -moz-linear-gradient(top, #333333, #222222);
+ background-image: -ms-linear-gradient(top, #333333, #222222);
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222));
+ background-image: -webkit-linear-gradient(top, #333333, #222222);
+ background-image: -o-linear-gradient(top, #333333, #222222);
+ background-image: linear-gradient(top, #333333, #222222);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0);
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ border-radius: 4px;
+ -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1);
+ -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1);
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1);
+}
+.btn-navbar {
+ display: none;
+ float: right;
+ padding: 7px 10px;
+ margin-left: 5px;
+ margin-right: 5px;
+ background-color: #2c2c2c;
+ background-image: -moz-linear-gradient(top, #333333, #222222);
+ background-image: -ms-linear-gradient(top, #333333, #222222);
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222));
+ background-image: -webkit-linear-gradient(top, #333333, #222222);
+ background-image: -o-linear-gradient(top, #333333, #222222);
+ background-image: linear-gradient(top, #333333, #222222);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0);
+ border-color: #222222 #222222 #000000;
+ border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+ -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);
+ -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);
+}
+.btn-navbar:hover,
+.btn-navbar:active,
+.btn-navbar.active,
+.btn-navbar.disabled,
+.btn-navbar[disabled] {
+ background-color: #222222;
+}
+.btn-navbar:active, .btn-navbar.active {
+ background-color: #080808 \9;
+}
+.btn-navbar .icon-bar {
+ display: block;
+ width: 18px;
+ height: 2px;
+ background-color: #f5f5f5;
+ -webkit-border-radius: 1px;
+ -moz-border-radius: 1px;
+ border-radius: 1px;
+ -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
+ -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
+ box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
+}
+.btn-navbar .icon-bar + .icon-bar {
+ margin-top: 3px;
+}
+.nav-collapse.collapse {
+ height: auto;
+}
+.navbar .brand:hover {
+ text-decoration: none;
+}
+.navbar .brand {
+ float: left;
+ display: block;
+ padding: 8px 20px 12px;
+ margin-left: -20px;
+ font-size: 20px;
+ font-weight: 200;
+ line-height: 1;
+ color: #ffffff;
+}
+.navbar .navbar-text {
+ margin-bottom: 0;
+ line-height: 40px;
+ color: #999999;
+}
+.navbar .navbar-text a:hover {
+ color: #ffffff;
+ background-color: transparent;
+}
+.navbar .btn, .navbar .btn-group {
+ margin-top: 5px;
+}
+.navbar .btn-group .btn {
+ margin-top: 0;
+}
+.navbar-form {
+ margin-bottom: 0;
+ *zoom: 1;
+}
+.navbar-form:before, .navbar-form:after {
+ display: table;
+ content: "";
+}
+.navbar-form:after {
+ clear: both;
+}
+.navbar-form input, .navbar-form select {
+ display: inline-block;
+ margin-top: 5px;
+ margin-bottom: 0;
+}
+.navbar-form .radio, .navbar-form .checkbox {
+ margin-top: 5px;
+}
+.navbar-form input[type="image"], .navbar-form input[type="checkbox"], .navbar-form input[type="radio"] {
+ margin-top: 3px;
+}
+.navbar-search {
+ position: relative;
+ float: left;
+ margin-top: 6px;
+ margin-bottom: 0;
+}
+.navbar-search .search-query {
+ padding: 4px 9px;
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+ font-size: 13px;
+ font-weight: normal;
+ line-height: 1;
+ color: #ffffff;
+ color: rgba(255, 255, 255, 0.75);
+ background: #666;
+ background: rgba(255, 255, 255, 0.3);
+ border: 1px solid #111;
+ -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0px rgba(255, 255, 255, 0.15);
+ -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0px rgba(255, 255, 255, 0.15);
+ box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0px rgba(255, 255, 255, 0.15);
+ -webkit-transition: none;
+ -moz-transition: none;
+ -ms-transition: none;
+ -o-transition: none;
+ transition: none;
+}
+.navbar-search .search-query :-moz-placeholder {
+ color: #eeeeee;
+}
+.navbar-search .search-query::-webkit-input-placeholder {
+ color: #eeeeee;
+}
+.navbar-search .search-query:hover {
+ color: #ffffff;
+ background-color: #999999;
+ background-color: rgba(255, 255, 255, 0.5);
+}
+.navbar-search .search-query:focus, .navbar-search .search-query.focused {
+ padding: 5px 10px;
+ color: #333333;
+ text-shadow: 0 1px 0 #ffffff;
+ background-color: #ffffff;
+ border: 0;
+ -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
+ -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
+ box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
+ outline: 0;
+}
+.navbar-fixed-top {
+ position: fixed;
+ top: 0;
+ right: 0;
+ left: 0;
+ z-index: 1030;
+}
+.navbar-fixed-top .navbar-inner {
+ padding-left: 0;
+ padding-right: 0;
+ -webkit-border-radius: 0;
+ -moz-border-radius: 0;
+ border-radius: 0;
+}
+.navbar .nav {
+ position: relative;
+ left: 0;
+ display: block;
+ float: left;
+ margin: 0 10px 0 0;
+}
+.navbar .nav.pull-right {
+ float: right;
+}
+.navbar .nav > li {
+ display: block;
+ float: left;
+}
+.navbar .nav > li > a {
+ float: none;
+ padding: 10px 10px 11px;
+ line-height: 19px;
+ color: #999999;
+ text-decoration: none;
+ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+}
+.navbar .nav > li > a:hover {
+ background-color: transparent;
+ color: #ffffff;
+ text-decoration: none;
+}
+.navbar .nav .active > a, .navbar .nav .active > a:hover {
+ color: #ffffff;
+ text-decoration: none;
+ background-color: #222222;
+ background-color: rgba(0, 0, 0, 0.5);
+}
+.navbar .divider-vertical {
+ height: 40px;
+ width: 1px;
+ margin: 0 9px;
+ overflow: hidden;
+ background-color: #222222;
+ border-right: 1px solid #333333;
+}
+.navbar .nav.pull-right {
+ margin-left: 10px;
+ margin-right: 0;
+}
+.navbar .dropdown-menu {
+ margin-top: 1px;
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ border-radius: 4px;
+}
+.navbar .dropdown-menu:before {
+ content: '';
+ display: inline-block;
+ border-left: 7px solid transparent;
+ border-right: 7px solid transparent;
+ border-bottom: 7px solid #ccc;
+ border-bottom-color: rgba(0, 0, 0, 0.2);
+ position: absolute;
+ top: -7px;
+ left: 9px;
+}
+.navbar .dropdown-menu:after {
+ content: '';
+ display: inline-block;
+ border-left: 6px solid transparent;
+ border-right: 6px solid transparent;
+ border-bottom: 6px solid #ffffff;
+ position: absolute;
+ top: -6px;
+ left: 10px;
+}
+.navbar .nav .dropdown-toggle .caret, .navbar .nav .open.dropdown .caret {
+ border-top-color: #ffffff;
+}
+.navbar .nav .active .caret {
+ opacity: 1;
+ filter: alpha(opacity=100);
+}
+.navbar .nav .open > .dropdown-toggle, .navbar .nav .active > .dropdown-toggle, .navbar .nav .open.active > .dropdown-toggle {
+ background-color: transparent;
+}
+.navbar .nav .active > .dropdown-toggle:hover {
+ color: #ffffff;
+}
+.navbar .nav.pull-right .dropdown-menu {
+ left: auto;
+ right: 0;
+}
+.navbar .nav.pull-right .dropdown-menu:before {
+ left: auto;
+ right: 12px;
+}
+.navbar .nav.pull-right .dropdown-menu:after {
+ left: auto;
+ right: 13px;
+}
+.breadcrumb {
+ padding: 7px 14px;
+ margin: 0 0 18px;
+ background-color: #fbfbfb;
+ background-image: -moz-linear-gradient(top, #ffffff, #f5f5f5);
+ background-image: -ms-linear-gradient(top, #ffffff, #f5f5f5);
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f5f5f5));
+ background-image: -webkit-linear-gradient(top, #ffffff, #f5f5f5);
+ background-image: -o-linear-gradient(top, #ffffff, #f5f5f5);
+ background-image: linear-gradient(top, #ffffff, #f5f5f5);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#f5f5f5', GradientType=0);
+ border: 1px solid #ddd;
+ -webkit-border-radius: 3px;
+ -moz-border-radius: 3px;
+ border-radius: 3px;
+ -webkit-box-shadow: inset 0 1px 0 #ffffff;
+ -moz-box-shadow: inset 0 1px 0 #ffffff;
+ box-shadow: inset 0 1px 0 #ffffff;
+}
+.breadcrumb li {
+ display: inline;
+ text-shadow: 0 1px 0 #ffffff;
+}
+.breadcrumb .divider {
+ padding: 0 5px;
+ color: #999999;
+}
+.breadcrumb .active a {
+ color: #333333;
+}
+.pagination {
+ height: 36px;
+ margin: 18px 0;
+}
+.pagination ul {
+ display: inline-block;
+ *display: inline;
+ /* IE7 inline-block hack */
+
+ *zoom: 1;
+ margin-left: 0;
+ margin-bottom: 0;
+ -webkit-border-radius: 3px;
+ -moz-border-radius: 3px;
+ border-radius: 3px;
+ -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
+ -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
+}
+.pagination li {
+ display: inline;
+}
+.pagination a {
+ float: left;
+ padding: 0 14px;
+ line-height: 34px;
+ text-decoration: none;
+ border: 1px solid #ddd;
+ border-left-width: 0;
+}
+.pagination a:hover, .pagination .active a {
+ background-color: #f5f5f5;
+}
+.pagination .active a {
+ color: #999999;
+ cursor: default;
+}
+.pagination .disabled a, .pagination .disabled a:hover {
+ color: #999999;
+ background-color: transparent;
+ cursor: default;
+}
+.pagination li:first-child a {
+ border-left-width: 1px;
+ -webkit-border-radius: 3px 0 0 3px;
+ -moz-border-radius: 3px 0 0 3px;
+ border-radius: 3px 0 0 3px;
+}
+.pagination li:last-child a {
+ -webkit-border-radius: 0 3px 3px 0;
+ -moz-border-radius: 0 3px 3px 0;
+ border-radius: 0 3px 3px 0;
+}
+.pagination-centered {
+ text-align: center;
+}
+.pagination-right {
+ text-align: right;
+}
+.pager {
+ margin-left: 0;
+ margin-bottom: 18px;
+ list-style: none;
+ text-align: center;
+ *zoom: 1;
+}
+.pager:before, .pager:after {
+ display: table;
+ content: "";
+}
+.pager:after {
+ clear: both;
+}
+.pager li {
+ display: inline;
+}
+.pager a {
+ display: inline-block;
+ padding: 5px 14px;
+ background-color: #fff;
+ border: 1px solid #ddd;
+ -webkit-border-radius: 15px;
+ -moz-border-radius: 15px;
+ border-radius: 15px;
+}
+.pager a:hover {
+ text-decoration: none;
+ background-color: #f5f5f5;
+}
+.pager .next a {
+ float: right;
+}
+.pager .previous a {
+ float: left;
+}
+.modal-open .dropdown-menu {
+ z-index: 2050;
+}
+.modal-open .dropdown.open {
+ *z-index: 2050;
+}
+.modal-open .popover {
+ z-index: 2060;
+}
+.modal-open .tooltip {
+ z-index: 2070;
+}
+.modal-backdrop {
+ position: fixed;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 1040;
+ background-color: #000000;
+}
+.modal-backdrop.fade {
+ opacity: 0;
+}
+.modal-backdrop, .modal-backdrop.fade.in {
+ opacity: 0.8;
+ filter: alpha(opacity=80);
+}
+.modal {
+ position: fixed;
+ top: 50%;
+ left: 50%;
+ z-index: 1050;
+ max-height: 500px;
+ overflow: auto;
+ width: 560px;
+ margin: -250px 0 0 -280px;
+ background-color: #ffffff;
+ border: 1px solid #999;
+ border: 1px solid rgba(0, 0, 0, 0.3);
+ *border: 1px solid #999;
+ /* IE6-7 */
+
+ -webkit-border-radius: 6px;
+ -moz-border-radius: 6px;
+ border-radius: 6px;
+ -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
+ -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
+ box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
+ -webkit-background-clip: padding-box;
+ -moz-background-clip: padding-box;
+ background-clip: padding-box;
+}
+.modal.fade {
+ -webkit-transition: opacity .3s linear, top .3s ease-out;
+ -moz-transition: opacity .3s linear, top .3s ease-out;
+ -ms-transition: opacity .3s linear, top .3s ease-out;
+ -o-transition: opacity .3s linear, top .3s ease-out;
+ transition: opacity .3s linear, top .3s ease-out;
+ top: -25%;
+}
+.modal.fade.in {
+ top: 50%;
+}
+.modal-header {
+ padding: 9px 15px;
+ border-bottom: 1px solid #eee;
+}
+.modal-header .close {
+ margin-top: 2px;
+}
+.modal-body {
+ padding: 15px;
+}
+.modal-footer {
+ padding: 14px 15px 15px;
+ margin-bottom: 0;
+ background-color: #f5f5f5;
+ border-top: 1px solid #ddd;
+ -webkit-border-radius: 0 0 6px 6px;
+ -moz-border-radius: 0 0 6px 6px;
+ border-radius: 0 0 6px 6px;
+ -webkit-box-shadow: inset 0 1px 0 #ffffff;
+ -moz-box-shadow: inset 0 1px 0 #ffffff;
+ box-shadow: inset 0 1px 0 #ffffff;
+ *zoom: 1;
+}
+.modal-footer:before, .modal-footer:after {
+ display: table;
+ content: "";
+}
+.modal-footer:after {
+ clear: both;
+}
+.modal-footer .btn {
+ float: right;
+ margin-left: 5px;
+ margin-bottom: 0;
+}
+.tooltip {
+ position: absolute;
+ z-index: 1020;
+ display: block;
+ visibility: visible;
+ padding: 5px;
+ font-size: 11px;
+ opacity: 0;
+ filter: alpha(opacity=0);
+}
+.tooltip.in {
+ opacity: 0.8;
+ filter: alpha(opacity=80);
+}
+.tooltip.top {
+ margin-top: -2px;
+}
+.tooltip.right {
+ margin-left: 2px;
+}
+.tooltip.bottom {
+ margin-top: 2px;
+}
+.tooltip.left {
+ margin-left: -2px;
+}
+.tooltip.top .tooltip-arrow {
+ bottom: 0;
+ left: 50%;
+ margin-left: -5px;
+ border-left: 5px solid transparent;
+ border-right: 5px solid transparent;
+ border-top: 5px solid #000000;
+}
+.tooltip.left .tooltip-arrow {
+ top: 50%;
+ right: 0;
+ margin-top: -5px;
+ border-top: 5px solid transparent;
+ border-bottom: 5px solid transparent;
+ border-left: 5px solid #000000;
+}
+.tooltip.bottom .tooltip-arrow {
+ top: 0;
+ left: 50%;
+ margin-left: -5px;
+ border-left: 5px solid transparent;
+ border-right: 5px solid transparent;
+ border-bottom: 5px solid #000000;
+}
+.tooltip.right .tooltip-arrow {
+ top: 50%;
+ left: 0;
+ margin-top: -5px;
+ border-top: 5px solid transparent;
+ border-bottom: 5px solid transparent;
+ border-right: 5px solid #000000;
+}
+.tooltip-inner {
+ max-width: 200px;
+ padding: 3px 8px;
+ color: #ffffff;
+ text-align: center;
+ text-decoration: none;
+ background-color: #000000;
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ border-radius: 4px;
+}
+.tooltip-arrow {
+ position: absolute;
+ width: 0;
+ height: 0;
+}
+.popover {
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1010;
+ display: none;
+ padding: 5px;
+}
+.popover.top {
+ margin-top: -5px;
+}
+.popover.right {
+ margin-left: 5px;
+}
+.popover.bottom {
+ margin-top: 5px;
+}
+.popover.left {
+ margin-left: -5px;
+}
+.popover.top .arrow {
+ bottom: 0;
+ left: 50%;
+ margin-left: -5px;
+ border-left: 5px solid transparent;
+ border-right: 5px solid transparent;
+ border-top: 5px solid #000000;
+}
+.popover.right .arrow {
+ top: 50%;
+ left: 0;
+ margin-top: -5px;
+ border-top: 5px solid transparent;
+ border-bottom: 5px solid transparent;
+ border-right: 5px solid #000000;
+}
+.popover.bottom .arrow {
+ top: 0;
+ left: 50%;
+ margin-left: -5px;
+ border-left: 5px solid transparent;
+ border-right: 5px solid transparent;
+ border-bottom: 5px solid #000000;
+}
+.popover.left .arrow {
+ top: 50%;
+ right: 0;
+ margin-top: -5px;
+ border-top: 5px solid transparent;
+ border-bottom: 5px solid transparent;
+ border-left: 5px solid #000000;
+}
+.popover .arrow {
+ position: absolute;
+ width: 0;
+ height: 0;
+}
+.popover-inner {
+ padding: 3px;
+ width: 280px;
+ overflow: hidden;
+ background: #000000;
+ background: rgba(0, 0, 0, 0.8);
+ -webkit-border-radius: 6px;
+ -moz-border-radius: 6px;
+ border-radius: 6px;
+ -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
+ -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
+ box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
+}
+.popover-title {
+ padding: 9px 15px;
+ line-height: 1;
+ background-color: #f5f5f5;
+ border-bottom: 1px solid #eee;
+ -webkit-border-radius: 3px 3px 0 0;
+ -moz-border-radius: 3px 3px 0 0;
+ border-radius: 3px 3px 0 0;
+}
+.popover-content {
+ padding: 14px;
+ background-color: #ffffff;
+ -webkit-border-radius: 0 0 3px 3px;
+ -moz-border-radius: 0 0 3px 3px;
+ border-radius: 0 0 3px 3px;
+ -webkit-background-clip: padding-box;
+ -moz-background-clip: padding-box;
+ background-clip: padding-box;
+}
+.popover-content p, .popover-content ul, .popover-content ol {
+ margin-bottom: 0;
+}
+.thumbnails {
+ margin-left: -20px;
+ list-style: none;
+ *zoom: 1;
+}
+.thumbnails:before, .thumbnails:after {
+ display: table;
+ content: "";
+}
+.thumbnails:after {
+ clear: both;
+}
+.thumbnails > li {
+ float: left;
+ margin: 0 0 18px 20px;
+}
+.thumbnail {
+ display: block;
+ padding: 4px;
+ line-height: 1;
+ border: 1px solid #ddd;
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ border-radius: 4px;
+ -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075);
+ -moz-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075);
+ box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075);
+}
+a.thumbnail:hover {
+ border-color: #0088cc;
+ -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
+ -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
+ box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
+}
+.thumbnail > img {
+ display: block;
+ max-width: 100%;
+ margin-left: auto;
+ margin-right: auto;
+}
+.thumbnail .caption {
+ padding: 9px;
+}
+.label {
+ padding: 1px 3px 2px;
+ font-size: 9.75px;
+ font-weight: bold;
+ color: #ffffff;
+ text-transform: uppercase;
+ background-color: #999999;
+ -webkit-border-radius: 3px;
+ -moz-border-radius: 3px;
+ border-radius: 3px;
+}
+.label-important {
+ background-color: #b94a48;
+}
+.label-warning {
+ background-color: #f89406;
+}
+.label-success {
+ background-color: #468847;
+}
+.label-info {
+ background-color: #3a87ad;
+}
+@-webkit-keyframes progress-bar-stripes {
+ from {
+ background-position: 0 0;
+ }
+ to {
+ background-position: 40px 0;
+ }
+}
+@-moz-keyframes progress-bar-stripes {
+ from {
+ background-position: 0 0;
+ }
+ to {
+ background-position: 40px 0;
+ }
+}
+@keyframes progress-bar-stripes {
+ from {
+ background-position: 0 0;
+ }
+ to {
+ background-position: 40px 0;
+ }
+}
+.progress {
+ overflow: hidden;
+ height: 18px;
+ margin-bottom: 18px;
+ background-color: #f7f7f7;
+ background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9);
+ background-image: -ms-linear-gradient(top, #f5f5f5, #f9f9f9);
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9));
+ background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9);
+ background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9);
+ background-image: linear-gradient(top, #f5f5f5, #f9f9f9);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5', endColorstr='#f9f9f9', GradientType=0);
+ -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
+ -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
+ box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ border-radius: 4px;
+}
+.progress .bar {
+ width: 0%;
+ height: 18px;
+ color: #ffffff;
+ font-size: 12px;
+ text-align: center;
+ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+ background-color: #0e90d2;
+ background-image: -moz-linear-gradient(top, #149bdf, #0480be);
+ background-image: -ms-linear-gradient(top, #149bdf, #0480be);
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be));
+ background-image: -webkit-linear-gradient(top, #149bdf, #0480be);
+ background-image: -o-linear-gradient(top, #149bdf, #0480be);
+ background-image: linear-gradient(top, #149bdf, #0480be);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#149bdf', endColorstr='#0480be', GradientType=0);
+ -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
+ -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
+ box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+ -webkit-transition: width 0.6s ease;
+ -moz-transition: width 0.6s ease;
+ -ms-transition: width 0.6s ease;
+ -o-transition: width 0.6s ease;
+ transition: width 0.6s ease;
+}
+.progress-striped .bar {
+ background-color: #62c462;
+ background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
+ background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+ background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+ background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+ background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+ background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+ -webkit-background-size: 40px 40px;
+ -moz-background-size: 40px 40px;
+ -o-background-size: 40px 40px;
+ background-size: 40px 40px;
+}
+.progress.active .bar {
+ -webkit-animation: progress-bar-stripes 2s linear infinite;
+ -moz-animation: progress-bar-stripes 2s linear infinite;
+ animation: progress-bar-stripes 2s linear infinite;
+}
+.progress-danger .bar {
+ background-color: #dd514c;
+ background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);
+ background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35);
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35));
+ background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);
+ background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);
+ background-image: linear-gradient(top, #ee5f5b, #c43c35);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0);
+}
+.progress-danger.progress-striped .bar {
+ background-color: #ee5f5b;
+ background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
+ background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+ background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+ background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+ background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+ background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+}
+.progress-success .bar {
+ background-color: #5eb95e;
+ background-image: -moz-linear-gradient(top, #62c462, #57a957);
+ background-image: -ms-linear-gradient(top, #62c462, #57a957);
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957));
+ background-image: -webkit-linear-gradient(top, #62c462, #57a957);
+ background-image: -o-linear-gradient(top, #62c462, #57a957);
+ background-image: linear-gradient(top, #62c462, #57a957);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0);
+}
+.progress-success.progress-striped .bar {
+ background-color: #62c462;
+ background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
+ background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+ background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+ background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+ background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+ background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+}
+.progress-info .bar {
+ background-color: #4bb1cf;
+ background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);
+ background-image: -ms-linear-gradient(top, #5bc0de, #339bb9);
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9));
+ background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);
+ background-image: -o-linear-gradient(top, #5bc0de, #339bb9);
+ background-image: linear-gradient(top, #5bc0de, #339bb9);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0);
+}
+.progress-info.progress-striped .bar {
+ background-color: #5bc0de;
+ background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
+ background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+ background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+ background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+ background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+ background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+}
+.accordion {
+ margin-bottom: 18px;
+}
+.accordion-group {
+ margin-bottom: 2px;
+ border: 1px solid #e5e5e5;
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ border-radius: 4px;
+}
+.accordion-heading {
+ border-bottom: 0;
+}
+.accordion-heading .accordion-toggle {
+ display: block;
+ padding: 8px 15px;
+}
+.accordion-inner {
+ padding: 9px 15px;
+ border-top: 1px solid #e5e5e5;
+}
+.carousel {
+ position: relative;
+ margin-bottom: 18px;
+ line-height: 1;
+}
+.carousel-inner {
+ overflow: hidden;
+ width: 100%;
+ position: relative;
+}
+.carousel .item {
+ display: none;
+ position: relative;
+ -webkit-transition: 0.6s ease-in-out left;
+ -moz-transition: 0.6s ease-in-out left;
+ -ms-transition: 0.6s ease-in-out left;
+ -o-transition: 0.6s ease-in-out left;
+ transition: 0.6s ease-in-out left;
+}
+.carousel .item > img {
+ display: block;
+ line-height: 1;
+}
+.carousel .active, .carousel .next, .carousel .prev {
+ display: block;
+}
+.carousel .active {
+ left: 0;
+}
+.carousel .next, .carousel .prev {
+ position: absolute;
+ top: 0;
+ width: 100%;
+}
+.carousel .next {
+ left: 100%;
+}
+.carousel .prev {
+ left: -100%;
+}
+.carousel .next.left, .carousel .prev.right {
+ left: 0;
+}
+.carousel .active.left {
+ left: -100%;
+}
+.carousel .active.right {
+ left: 100%;
+}
+.carousel-control {
+ position: absolute;
+ top: 40%;
+ left: 15px;
+ width: 40px;
+ height: 40px;
+ margin-top: -20px;
+ font-size: 60px;
+ font-weight: 100;
+ line-height: 30px;
+ color: #ffffff;
+ text-align: center;
+ background: #222222;
+ border: 3px solid #ffffff;
+ -webkit-border-radius: 23px;
+ -moz-border-radius: 23px;
+ border-radius: 23px;
+ opacity: 0.5;
+ filter: alpha(opacity=50);
+}
+.carousel-control.right {
+ left: auto;
+ right: 15px;
+}
+.carousel-control:hover {
+ color: #ffffff;
+ text-decoration: none;
+ opacity: 0.9;
+ filter: alpha(opacity=90);
+}
+.carousel-caption {
+ position: absolute;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ padding: 10px 15px 5px;
+ background: #333333;
+ background: rgba(0, 0, 0, 0.75);
+}
+.carousel-caption h4, .carousel-caption p {
+ color: #ffffff;
+}
+.hero-unit {
+ padding: 60px;
+ margin-bottom: 30px;
+ background-color: #f5f5f5;
+ -webkit-border-radius: 6px;
+ -moz-border-radius: 6px;
+ border-radius: 6px;
+}
+.hero-unit h1 {
+ margin-bottom: 0;
+ font-size: 60px;
+ line-height: 1;
+ letter-spacing: -1px;
+}
+.hero-unit p {
+ font-size: 18px;
+ font-weight: 200;
+ line-height: 27px;
+}
+.pull-right {
+ float: right;
+}
+.pull-left {
+ float: left;
+}
+.hide {
+ display: none;
+}
+.show {
+ display: block;
+}
+.invisible {
+ visibility: hidden;
+}
diff --git a/Examples/Ajax/MooToolsExample/WebServerResources/css/bootstrap.min.css b/Examples/Ajax/MooToolsExample/WebServerResources/css/bootstrap.min.css
new file mode 100644
index 00000000000..b01f92e6ecb
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/WebServerResources/css/bootstrap.min.css
@@ -0,0 +1,610 @@
+article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block;}
+audio,canvas,video{display:inline-block;*display:inline;*zoom:1;}
+audio:not([controls]){display:none;}
+html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;}
+a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;}
+a:hover,a:active{outline:0;}
+sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline;}
+sup{top:-0.5em;}
+sub{bottom:-0.25em;}
+img{max-width:100%;height:auto;border:0;-ms-interpolation-mode:bicubic;}
+button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle;}
+button,input{*overflow:visible;line-height:normal;}
+button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0;}
+button,input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button;}
+input[type="search"]{-webkit-appearance:textfield;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;}
+input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none;}
+textarea{overflow:auto;vertical-align:top;}
+body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;line-height:18px;color:#333333;background-color:#ffffff;}
+a{color:#0088cc;text-decoration:none;}
+a:hover{color:#005580;text-decoration:underline;}
+.row{margin-left:-20px;*zoom:1;}.row:before,.row:after{display:table;content:"";}
+.row:after{clear:both;}
+[class*="span"]{float:left;margin-left:20px;}
+.span1{width:60px;}
+.span2{width:140px;}
+.span3{width:220px;}
+.span4{width:300px;}
+.span5{width:380px;}
+.span6{width:460px;}
+.span7{width:540px;}
+.span8{width:620px;}
+.span9{width:700px;}
+.span10{width:780px;}
+.span11{width:860px;}
+.span12,.container{width:940px;}
+.offset1{margin-left:100px;}
+.offset2{margin-left:180px;}
+.offset3{margin-left:260px;}
+.offset4{margin-left:340px;}
+.offset5{margin-left:420px;}
+.offset6{margin-left:500px;}
+.offset7{margin-left:580px;}
+.offset8{margin-left:660px;}
+.offset9{margin-left:740px;}
+.offset10{margin-left:820px;}
+.offset11{margin-left:900px;}
+.row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";}
+.row-fluid:after{clear:both;}
+.row-fluid>[class*="span"]{float:left;margin-left:2.127659574%;}
+.row-fluid>[class*="span"]:first-child{margin-left:0;}
+.row-fluid .span1{width:6.382978723%;}
+.row-fluid .span2{width:14.89361702%;}
+.row-fluid .span3{width:23.404255317%;}
+.row-fluid .span4{width:31.914893614%;}
+.row-fluid .span5{width:40.425531911%;}
+.row-fluid .span6{width:48.93617020799999%;}
+.row-fluid .span7{width:57.446808505%;}
+.row-fluid .span8{width:65.95744680199999%;}
+.row-fluid .span9{width:74.468085099%;}
+.row-fluid .span10{width:82.97872339599999%;}
+.row-fluid .span11{width:91.489361693%;}
+.row-fluid .span12{width:99.99999998999999%;}
+.container{width:940px;margin-left:auto;margin-right:auto;*zoom:1;}.container:before,.container:after{display:table;content:"";}
+.container:after{clear:both;}
+.container-fluid{padding-left:20px;padding-right:20px;*zoom:1;}.container-fluid:before,.container-fluid:after{display:table;content:"";}
+.container-fluid:after{clear:both;}
+p{margin:0 0 9px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;line-height:18px;}p small{font-size:11px;color:#999999;}
+.lead{margin-bottom:18px;font-size:20px;font-weight:200;line-height:27px;}
+h1,h2,h3,h4,h5,h6{margin:0;font-weight:bold;color:#333333;text-rendering:optimizelegibility;}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;color:#999999;}
+h1{font-size:30px;line-height:36px;}h1 small{font-size:18px;}
+h2{font-size:24px;line-height:36px;}h2 small{font-size:18px;}
+h3{line-height:27px;font-size:18px;}h3 small{font-size:14px;}
+h4,h5,h6{line-height:18px;}
+h4{font-size:14px;}h4 small{font-size:12px;}
+h5{font-size:12px;}
+h6{font-size:11px;color:#999999;text-transform:uppercase;}
+.page-header{padding-bottom:17px;margin:18px 0;border-bottom:1px solid #eeeeee;}
+.page-header h1{line-height:1;}
+ul,ol{padding:0;margin:0 0 9px 25px;}
+ul ul,ul ol,ol ol,ol ul{margin-bottom:0;}
+ul{list-style:disc;}
+ol{list-style:decimal;}
+li{line-height:18px;}
+ul.unstyled{margin-left:0;list-style:none;}
+dl{margin-bottom:18px;}
+dt,dd{line-height:18px;}
+dt{font-weight:bold;}
+dd{margin-left:9px;}
+hr{margin:18px 0;border:0;border-top:1px solid #e5e5e5;border-bottom:1px solid #ffffff;}
+strong{font-weight:bold;}
+em{font-style:italic;}
+.muted{color:#999999;}
+abbr{font-size:90%;text-transform:uppercase;border-bottom:1px dotted #ddd;cursor:help;}
+blockquote{padding:0 0 0 15px;margin:0 0 18px;border-left:5px solid #eeeeee;}blockquote p{margin-bottom:0;font-size:16px;font-weight:300;line-height:22.5px;}
+blockquote small{display:block;line-height:18px;color:#999999;}blockquote small:before{content:'\2014 \00A0';}
+blockquote.pull-right{float:right;padding-left:0;padding-right:15px;border-left:0;border-right:5px solid #eeeeee;}blockquote.pull-right p,blockquote.pull-right small{text-align:right;}
+q:before,q:after,blockquote:before,blockquote:after{content:"";}
+address{display:block;margin-bottom:18px;line-height:18px;font-style:normal;}
+small{font-size:100%;}
+cite{font-style:normal;}
+code,pre{padding:0 3px 2px;font-family:Menlo,Monaco,"Courier New",monospace;font-size:12px;color:#333333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}
+code{padding:3px 4px;color:#d14;background-color:#f7f7f9;border:1px solid #e1e1e8;}
+pre{display:block;padding:8.5px;margin:0 0 9px;font-size:12px;line-height:18px;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;white-space:pre;white-space:pre-wrap;word-break:break-all;}pre.prettyprint{margin-bottom:18px;}
+pre code{padding:0;background-color:transparent;}
+form{margin:0 0 18px;}
+fieldset{padding:0;margin:0;border:0;}
+legend{display:block;width:100%;padding:0;margin-bottom:27px;font-size:19.5px;line-height:36px;color:#333333;border:0;border-bottom:1px solid #eee;}
+label,input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:18px;}
+label{display:block;margin-bottom:5px;color:#333333;}
+input,textarea,select,.uneditable-input{display:inline-block;width:210px;height:18px;padding:4px;margin-bottom:9px;font-size:13px;line-height:18px;color:#555555;border:1px solid #ccc;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}
+.uneditable-textarea{width:auto;height:auto;}
+label input,label textarea,label select{display:block;}
+input[type="image"],input[type="checkbox"],input[type="radio"]{width:auto;height:auto;padding:0;margin:3px 0;*margin-top:0;line-height:normal;border:0;cursor:pointer;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
+input[type="file"]{padding:initial;line-height:initial;border:initial;background-color:#ffffff;background-color:initial;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;}
+input[type="button"],input[type="reset"],input[type="submit"]{width:auto;height:auto;}
+select,input[type="file"]{height:28px;*margin-top:4px;line-height:28px;}
+select{width:220px;background-color:#ffffff;}
+select[multiple],select[size]{height:auto;}
+input[type="image"]{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;}
+textarea{height:auto;}
+input[type="hidden"]{display:none;}
+.radio,.checkbox{padding-left:18px;}
+.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-18px;}
+.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px;}
+.radio.inline,.checkbox.inline{display:inline-block;margin-bottom:0;vertical-align:middle;}
+.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px;}
+.controls>.radio.inline:first-child,.controls>.checkbox.inline:first-child{padding-top:0;}
+input,textarea{-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-webkit-transition:border linear 0.2s,box-shadow linear 0.2s;-moz-transition:border linear 0.2s,box-shadow linear 0.2s;-ms-transition:border linear 0.2s,box-shadow linear 0.2s;-o-transition:border linear 0.2s,box-shadow linear 0.2s;transition:border linear 0.2s,box-shadow linear 0.2s;}
+input:focus,textarea:focus{border-color:rgba(82, 168, 236, 0.8);-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 8px rgba(82, 168, 236, 0.6);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 8px rgba(82, 168, 236, 0.6);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 8px rgba(82, 168, 236, 0.6);outline:0;outline:thin dotted \9;}
+input[type="file"]:focus,input[type="checkbox"]:focus,select:focus{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;}
+.input-mini{width:60px;}
+.input-small{width:90px;}
+.input-medium{width:150px;}
+.input-large{width:210px;}
+.input-xlarge{width:270px;}
+.input-xxlarge{width:530px;}
+input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{float:none;margin-left:0;}
+input.span1,textarea.span1,.uneditable-input.span1{width:50px;}
+input.span2,textarea.span2,.uneditable-input.span2{width:130px;}
+input.span3,textarea.span3,.uneditable-input.span3{width:210px;}
+input.span4,textarea.span4,.uneditable-input.span4{width:290px;}
+input.span5,textarea.span5,.uneditable-input.span5{width:370px;}
+input.span6,textarea.span6,.uneditable-input.span6{width:450px;}
+input.span7,textarea.span7,.uneditable-input.span7{width:530px;}
+input.span8,textarea.span8,.uneditable-input.span8{width:610px;}
+input.span9,textarea.span9,.uneditable-input.span9{width:690px;}
+input.span10,textarea.span10,.uneditable-input.span10{width:770px;}
+input.span11,textarea.span11,.uneditable-input.span11{width:850px;}
+input.span12,textarea.span12,.uneditable-input.span12{width:930px;}
+input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{background-color:#f5f5f5;border-color:#ddd;cursor:not-allowed;}
+.control-group.warning>label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853;}
+.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853;border-color:#c09853;}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:0 0 6px #dbc59e;-moz-box-shadow:0 0 6px #dbc59e;box-shadow:0 0 6px #dbc59e;}
+.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853;}
+.control-group.error>label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48;}
+.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48;border-color:#b94a48;}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:0 0 6px #d59392;-moz-box-shadow:0 0 6px #d59392;box-shadow:0 0 6px #d59392;}
+.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48;}
+.control-group.success>label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847;}
+.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847;border-color:#468847;}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:0 0 6px #7aba7b;-moz-box-shadow:0 0 6px #7aba7b;box-shadow:0 0 6px #7aba7b;}
+.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847;}
+input:focus:required:invalid,textarea:focus:required:invalid,select:focus:required:invalid{color:#b94a48;border-color:#ee5f5b;}input:focus:required:invalid:focus,textarea:focus:required:invalid:focus,select:focus:required:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7;}
+.form-actions{padding:17px 20px 18px;margin-top:18px;margin-bottom:18px;background-color:#f5f5f5;border-top:1px solid #ddd;}
+.uneditable-input{display:block;background-color:#ffffff;border-color:#eee;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);cursor:not-allowed;}
+:-moz-placeholder{color:#999999;}
+::-webkit-input-placeholder{color:#999999;}
+.help-block{margin-top:5px;margin-bottom:0;color:#999999;}
+.help-inline{display:inline-block;*display:inline;*zoom:1;margin-bottom:9px;vertical-align:middle;padding-left:5px;}
+.input-prepend,.input-append{margin-bottom:5px;*zoom:1;}.input-prepend:before,.input-append:before,.input-prepend:after,.input-append:after{display:table;content:"";}
+.input-prepend:after,.input-append:after{clear:both;}
+.input-prepend input,.input-append input,.input-prepend .uneditable-input,.input-append .uneditable-input{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;}.input-prepend input:focus,.input-append input:focus,.input-prepend .uneditable-input:focus,.input-append .uneditable-input:focus{position:relative;z-index:2;}
+.input-prepend .uneditable-input,.input-append .uneditable-input{border-left-color:#ccc;}
+.input-prepend .add-on,.input-append .add-on{float:left;display:block;width:auto;min-width:16px;height:18px;margin-right:-1px;padding:4px 5px;font-weight:normal;line-height:18px;color:#999999;text-align:center;text-shadow:0 1px 0 #ffffff;background-color:#f5f5f5;border:1px solid #ccc;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;}
+.input-prepend .active,.input-append .active{background-color:#a9dba9;border-color:#46a546;}
+.input-prepend .add-on{*margin-top:1px;}
+.input-append input,.input-append .uneditable-input{float:left;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;}
+.input-append .uneditable-input{border-right-color:#ccc;}
+.input-append .add-on{margin-right:0;margin-left:-1px;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;}
+.input-append input:first-child{*margin-left:-160px;}.input-append input:first-child+.add-on{*margin-left:-21px;}
+.search-query{padding-left:14px;padding-right:14px;margin-bottom:0;-webkit-border-radius:14px;-moz-border-radius:14px;border-radius:14px;}
+.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input{display:inline-block;margin-bottom:0;}
+.form-search label,.form-inline label,.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{display:inline-block;}
+.form-search .input-append .add-on,.form-inline .input-prepend .add-on,.form-search .input-append .add-on,.form-inline .input-prepend .add-on{vertical-align:middle;}
+.control-group{margin-bottom:9px;}
+.form-horizontal legend+.control-group{margin-top:18px;-webkit-margin-top-collapse:separate;}
+.form-horizontal .control-group{margin-bottom:18px;*zoom:1;}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;content:"";}
+.form-horizontal .control-group:after{clear:both;}
+.form-horizontal .control-group>label{float:left;width:140px;padding-top:5px;text-align:right;}
+.form-horizontal .controls{margin-left:160px;}
+.form-horizontal .form-actions{padding-left:160px;}
+table{max-width:100%;border-collapse:collapse;border-spacing:0;}
+.table{width:100%;margin-bottom:18px;}.table th,.table td{padding:8px;line-height:18px;text-align:left;border-top:1px solid #ddd;}
+.table th{font-weight:bold;vertical-align:bottom;}
+.table td{vertical-align:top;}
+.table thead:first-child tr th,.table thead:first-child tr td{border-top:0;}
+.table tbody+tbody{border-top:2px solid #ddd;}
+.table-condensed th,.table-condensed td{padding:4px 5px;}
+.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapsed;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.table-bordered th+th,.table-bordered td+td,.table-bordered th+td,.table-bordered td+th{border-left:1px solid #ddd;}
+.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0;}
+.table-bordered thead:first-child tr:first-child th:first-child,.table-bordered tbody:first-child tr:first-child td:first-child{-webkit-border-radius:4px 0 0 0;-moz-border-radius:4px 0 0 0;border-radius:4px 0 0 0;}
+.table-bordered thead:first-child tr:first-child th:last-child,.table-bordered tbody:first-child tr:first-child td:last-child{-webkit-border-radius:0 4px 0 0;-moz-border-radius:0 4px 0 0;border-radius:0 4px 0 0;}
+.table-bordered thead:last-child tr:last-child th:first-child,.table-bordered tbody:last-child tr:last-child td:first-child{-webkit-border-radius:0 0 0 4px;-moz-border-radius:0 0 0 4px;border-radius:0 0 0 4px;}
+.table-bordered thead:last-child tr:last-child th:last-child,.table-bordered tbody:last-child tr:last-child td:last-child{-webkit-border-radius:0 0 4px 0;-moz-border-radius:0 0 4px 0;border-radius:0 0 4px 0;}
+.table-striped tbody tr:nth-child(odd) td,.table-striped tbody tr:nth-child(odd) th{background-color:#f9f9f9;}
+table .span1{float:none;width:44px;margin-left:0;}
+table .span2{float:none;width:124px;margin-left:0;}
+table .span3{float:none;width:204px;margin-left:0;}
+table .span4{float:none;width:284px;margin-left:0;}
+table .span5{float:none;width:364px;margin-left:0;}
+table .span6{float:none;width:444px;margin-left:0;}
+table .span7{float:none;width:524px;margin-left:0;}
+table .span8{float:none;width:604px;margin-left:0;}
+table .span9{float:none;width:684px;margin-left:0;}
+table .span10{float:none;width:764px;margin-left:0;}
+table .span11{float:none;width:844px;margin-left:0;}
+table .span12{float:none;width:924px;margin-left:0;}
+[class^="icon-"]{display:inline-block;width:14px;height:14px;vertical-align:text-top;background-image:url(../img/glyphicons-halflings.png);background-position:14px 14px;background-repeat:no-repeat;*margin-right:.3em;}[class^="icon-"]:last-child{*margin-left:0;}
+.icon-white{background-image:url(../img/glyphicons-halflings-white.png);}
+.icon-glass{background-position:0 0;}
+.icon-music{background-position:-24px 0;}
+.icon-search{background-position:-48px 0;}
+.icon-envelope{background-position:-72px 0;}
+.icon-heart{background-position:-96px 0;}
+.icon-star{background-position:-120px 0;}
+.icon-star-empty{background-position:-144px 0;}
+.icon-user{background-position:-168px 0;}
+.icon-film{background-position:-192px 0;}
+.icon-th-large{background-position:-216px 0;}
+.icon-th{background-position:-240px 0;}
+.icon-th-list{background-position:-264px 0;}
+.icon-ok{background-position:-288px 0;}
+.icon-remove{background-position:-312px 0;}
+.icon-zoom-in{background-position:-336px 0;}
+.icon-zoom-out{background-position:-360px 0;}
+.icon-off{background-position:-384px 0;}
+.icon-signal{background-position:-408px 0;}
+.icon-cog{background-position:-432px 0;}
+.icon-trash{background-position:-456px 0;}
+.icon-home{background-position:0 -24px;}
+.icon-file{background-position:-24px -24px;}
+.icon-time{background-position:-48px -24px;}
+.icon-road{background-position:-72px -24px;}
+.icon-download-alt{background-position:-96px -24px;}
+.icon-download{background-position:-120px -24px;}
+.icon-upload{background-position:-144px -24px;}
+.icon-inbox{background-position:-168px -24px;}
+.icon-play-circle{background-position:-192px -24px;}
+.icon-repeat{background-position:-216px -24px;}
+.icon-refresh{background-position:-240px -24px;}
+.icon-list-alt{background-position:-264px -24px;}
+.icon-lock{background-position:-287px -24px;}
+.icon-flag{background-position:-312px -24px;}
+.icon-headphones{background-position:-336px -24px;}
+.icon-volume-off{background-position:-360px -24px;}
+.icon-volume-down{background-position:-384px -24px;}
+.icon-volume-up{background-position:-408px -24px;}
+.icon-qrcode{background-position:-432px -24px;}
+.icon-barcode{background-position:-456px -24px;}
+.icon-tag{background-position:0 -48px;}
+.icon-tags{background-position:-25px -48px;}
+.icon-book{background-position:-48px -48px;}
+.icon-bookmark{background-position:-72px -48px;}
+.icon-print{background-position:-96px -48px;}
+.icon-camera{background-position:-120px -48px;}
+.icon-font{background-position:-144px -48px;}
+.icon-bold{background-position:-167px -48px;}
+.icon-italic{background-position:-192px -48px;}
+.icon-text-height{background-position:-216px -48px;}
+.icon-text-width{background-position:-240px -48px;}
+.icon-align-left{background-position:-264px -48px;}
+.icon-align-center{background-position:-288px -48px;}
+.icon-align-right{background-position:-312px -48px;}
+.icon-align-justify{background-position:-336px -48px;}
+.icon-list{background-position:-360px -48px;}
+.icon-indent-left{background-position:-384px -48px;}
+.icon-indent-right{background-position:-408px -48px;}
+.icon-facetime-video{background-position:-432px -48px;}
+.icon-picture{background-position:-456px -48px;}
+.icon-pencil{background-position:0 -72px;}
+.icon-map-marker{background-position:-24px -72px;}
+.icon-adjust{background-position:-48px -72px;}
+.icon-tint{background-position:-72px -72px;}
+.icon-edit{background-position:-96px -72px;}
+.icon-share{background-position:-120px -72px;}
+.icon-check{background-position:-144px -72px;}
+.icon-move{background-position:-168px -72px;}
+.icon-step-backward{background-position:-192px -72px;}
+.icon-fast-backward{background-position:-216px -72px;}
+.icon-backward{background-position:-240px -72px;}
+.icon-play{background-position:-264px -72px;}
+.icon-pause{background-position:-288px -72px;}
+.icon-stop{background-position:-312px -72px;}
+.icon-forward{background-position:-336px -72px;}
+.icon-fast-forward{background-position:-360px -72px;}
+.icon-step-forward{background-position:-384px -72px;}
+.icon-eject{background-position:-408px -72px;}
+.icon-chevron-left{background-position:-432px -72px;}
+.icon-chevron-right{background-position:-456px -72px;}
+.icon-plus-sign{background-position:0 -96px;}
+.icon-minus-sign{background-position:-24px -96px;}
+.icon-remove-sign{background-position:-48px -96px;}
+.icon-ok-sign{background-position:-72px -96px;}
+.icon-question-sign{background-position:-96px -96px;}
+.icon-info-sign{background-position:-120px -96px;}
+.icon-screenshot{background-position:-144px -96px;}
+.icon-remove-circle{background-position:-168px -96px;}
+.icon-ok-circle{background-position:-192px -96px;}
+.icon-ban-circle{background-position:-216px -96px;}
+.icon-arrow-left{background-position:-240px -96px;}
+.icon-arrow-right{background-position:-264px -96px;}
+.icon-arrow-up{background-position:-289px -96px;}
+.icon-arrow-down{background-position:-312px -96px;}
+.icon-share-alt{background-position:-336px -96px;}
+.icon-resize-full{background-position:-360px -96px;}
+.icon-resize-small{background-position:-384px -96px;}
+.icon-plus{background-position:-408px -96px;}
+.icon-minus{background-position:-433px -96px;}
+.icon-asterisk{background-position:-456px -96px;}
+.icon-exclamation-sign{background-position:0 -120px;}
+.icon-gift{background-position:-24px -120px;}
+.icon-leaf{background-position:-48px -120px;}
+.icon-fire{background-position:-72px -120px;}
+.icon-eye-open{background-position:-96px -120px;}
+.icon-eye-close{background-position:-120px -120px;}
+.icon-warning-sign{background-position:-144px -120px;}
+.icon-plane{background-position:-168px -120px;}
+.icon-calendar{background-position:-192px -120px;}
+.icon-random{background-position:-216px -120px;}
+.icon-comment{background-position:-240px -120px;}
+.icon-magnet{background-position:-264px -120px;}
+.icon-chevron-up{background-position:-288px -120px;}
+.icon-chevron-down{background-position:-313px -119px;}
+.icon-retweet{background-position:-336px -120px;}
+.icon-shopping-cart{background-position:-360px -120px;}
+.icon-folder-close{background-position:-384px -120px;}
+.icon-folder-open{background-position:-408px -120px;}
+.icon-resize-vertical{background-position:-432px -119px;}
+.icon-resize-horizontal{background-position:-456px -118px;}
+.dropdown{position:relative;}
+.dropdown-toggle{*margin-bottom:-3px;}
+.dropdown-toggle:active,.open .dropdown-toggle{outline:0;}
+.caret{display:inline-block;width:0;height:0;text-indent:-99999px;*text-indent:0;vertical-align:top;border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid #000000;opacity:0.3;filter:alpha(opacity=30);content:"\2193";}
+.dropdown .caret{margin-top:8px;margin-left:2px;}
+.dropdown:hover .caret,.open.dropdown .caret{opacity:1;filter:alpha(opacity=100);}
+.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;float:left;display:none;min-width:160px;max-width:220px;_width:160px;padding:4px 0;margin:0;list-style:none;background-color:#ffffff;border-color:#ccc;border-color:rgba(0, 0, 0, 0.2);border-style:solid;border-width:1px;-webkit-border-radius:0 0 5px 5px;-moz-border-radius:0 0 5px 5px;border-radius:0 0 5px 5px;-webkit-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-moz-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box;*border-right-width:2px;*border-bottom-width:2px;}.dropdown-menu.bottom-up{top:auto;bottom:100%;margin-bottom:2px;}
+.dropdown-menu .divider{height:1px;margin:5px 1px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #ffffff;*width:100%;*margin:-5px 0 5px;}
+.dropdown-menu a{display:block;padding:3px 15px;clear:both;font-weight:normal;line-height:18px;color:#555555;white-space:nowrap;}
+.dropdown-menu li>a:hover,.dropdown-menu .active>a,.dropdown-menu .active>a:hover{color:#ffffff;text-decoration:none;background-color:#0088cc;}
+.dropdown.open{*z-index:1000;}.dropdown.open .dropdown-toggle{color:#ffffff;background:#ccc;background:rgba(0, 0, 0, 0.3);}
+.dropdown.open .dropdown-menu{display:block;}
+.typeahead{margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}
+.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #eee;border:1px solid rgba(0, 0, 0, 0.05);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);}.well blockquote{border-color:#ddd;border-color:rgba(0, 0, 0, 0.15);}
+.fade{-webkit-transition:opacity 0.15s linear;-moz-transition:opacity 0.15s linear;-ms-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear;opacity:0;}.fade.in{opacity:1;}
+.collapse{-webkit-transition:height 0.35s ease;-moz-transition:height 0.35s ease;-ms-transition:height 0.35s ease;-o-transition:height 0.35s ease;transition:height 0.35s ease;position:relative;overflow:hidden;height:0;}.collapse.in{height:auto;}
+.close{float:right;font-size:20px;font-weight:bold;line-height:18px;color:#000000;text-shadow:0 1px 0 #ffffff;opacity:0.2;filter:alpha(opacity=20);}.close:hover{color:#000000;text-decoration:none;opacity:0.4;filter:alpha(opacity=40);cursor:pointer;}
+.btn{display:inline-block;padding:4px 10px 4px;font-size:13px;line-height:18px;color:#333333;text-align:center;text-shadow:0 1px 1px rgba(255, 255, 255, 0.75);background-color:#fafafa;background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6));background-image:-webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-image:-moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6);background-image:-ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-image:-o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-image:linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0);border:1px solid #ccc;border-bottom-color:#bbb;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);cursor:pointer;*margin-left:.3em;}.btn:first-child{*margin-left:0;}
+.btn:hover{color:#333333;text-decoration:none;background-color:#e6e6e6;background-position:0 -15px;-webkit-transition:background-position 0.1s linear;-moz-transition:background-position 0.1s linear;-ms-transition:background-position 0.1s linear;-o-transition:background-position 0.1s linear;transition:background-position 0.1s linear;}
+.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;}
+.btn.active,.btn:active{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);background-color:#e6e6e6;background-color:#d9d9d9 \9;color:rgba(0, 0, 0, 0.5);outline:0;}
+.btn.disabled,.btn[disabled]{cursor:default;background-image:none;background-color:#e6e6e6;opacity:0.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;}
+.btn-large{padding:9px 14px;font-size:15px;line-height:normal;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;}
+.btn-large .icon{margin-top:1px;}
+.btn-small{padding:5px 9px;font-size:11px;line-height:16px;}
+.btn-small .icon{margin-top:-1px;}
+.btn-primary,.btn-primary:hover,.btn-warning,.btn-warning:hover,.btn-danger,.btn-danger:hover,.btn-success,.btn-success:hover,.btn-info,.btn-info:hover{text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);color:#ffffff;}
+.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active{color:rgba(255, 255, 255, 0.75);}
+.btn-primary{background-color:#006dcc;background-image:-moz-linear-gradient(top, #0088cc, #0044cc);background-image:-ms-linear-gradient(top, #0088cc, #0044cc);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));background-image:-webkit-linear-gradient(top, #0088cc, #0044cc);background-image:-o-linear-gradient(top, #0088cc, #0044cc);background-image:linear-gradient(top, #0088cc, #0044cc);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0);border-color:#0044cc #0044cc #002a80;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-primary:hover,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{background-color:#0044cc;}
+.btn-primary:active,.btn-primary.active{background-color:#003399 \9;}
+.btn-warning{background-color:#faa732;background-image:-moz-linear-gradient(top, #fbb450, #f89406);background-image:-ms-linear-gradient(top, #fbb450, #f89406);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));background-image:-webkit-linear-gradient(top, #fbb450, #f89406);background-image:-o-linear-gradient(top, #fbb450, #f89406);background-image:linear-gradient(top, #fbb450, #f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fbb450', endColorstr='#f89406', GradientType=0);border-color:#f89406 #f89406 #ad6704;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-warning:hover,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{background-color:#f89406;}
+.btn-warning:active,.btn-warning.active{background-color:#c67605 \9;}
+.btn-danger{background-color:#da4f49;background-image:-moz-linear-gradient(top, #ee5f5b, #bd362f);background-image:-ms-linear-gradient(top, #ee5f5b, #bd362f);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));background-image:-webkit-linear-gradient(top, #ee5f5b, #bd362f);background-image:-o-linear-gradient(top, #ee5f5b, #bd362f);background-image:linear-gradient(top, #ee5f5b, #bd362f);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#bd362f', GradientType=0);border-color:#bd362f #bd362f #802420;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-danger:hover,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{background-color:#bd362f;}
+.btn-danger:active,.btn-danger.active{background-color:#942a25 \9;}
+.btn-success{background-color:#5bb75b;background-image:-moz-linear-gradient(top, #62c462, #51a351);background-image:-ms-linear-gradient(top, #62c462, #51a351);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351));background-image:-webkit-linear-gradient(top, #62c462, #51a351);background-image:-o-linear-gradient(top, #62c462, #51a351);background-image:linear-gradient(top, #62c462, #51a351);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#51a351', GradientType=0);border-color:#51a351 #51a351 #387038;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-success:hover,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{background-color:#51a351;}
+.btn-success:active,.btn-success.active{background-color:#408140 \9;}
+.btn-info{background-color:#49afcd;background-image:-moz-linear-gradient(top, #5bc0de, #2f96b4);background-image:-ms-linear-gradient(top, #5bc0de, #2f96b4);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));background-image:-webkit-linear-gradient(top, #5bc0de, #2f96b4);background-image:-o-linear-gradient(top, #5bc0de, #2f96b4);background-image:linear-gradient(top, #5bc0de, #2f96b4);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#2f96b4', GradientType=0);border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-info:hover,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{background-color:#2f96b4;}
+.btn-info:active,.btn-info.active{background-color:#24748c \9;}
+button.btn,input[type="submit"].btn{*padding-top:2px;*padding-bottom:2px;}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0;}
+button.btn.large,input[type="submit"].btn.large{*padding-top:7px;*padding-bottom:7px;}
+button.btn.small,input[type="submit"].btn.small{*padding-top:3px;*padding-bottom:3px;}
+.btn-group{position:relative;*zoom:1;*margin-left:.3em;}.btn-group:before,.btn-group:after{display:table;content:"";}
+.btn-group:after{clear:both;}
+.btn-group:first-child{*margin-left:0;}
+.btn-group+.btn-group{margin-left:5px;}
+.btn-toolbar{margin-top:9px;margin-bottom:9px;}.btn-toolbar .btn-group{display:inline-block;*display:inline;*zoom:1;}
+.btn-group .btn{position:relative;float:left;margin-left:-1px;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
+.btn-group .btn:first-child{margin-left:0;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px;}
+.btn-group .btn:last-child,.btn-group .dropdown-toggle{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;}
+.btn-group .btn.large:first-child{margin-left:0;-webkit-border-top-left-radius:6px;-moz-border-radius-topleft:6px;border-top-left-radius:6px;-webkit-border-bottom-left-radius:6px;-moz-border-radius-bottomleft:6px;border-bottom-left-radius:6px;}
+.btn-group .btn.large:last-child,.btn-group .large.dropdown-toggle{-webkit-border-top-right-radius:6px;-moz-border-radius-topright:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;-moz-border-radius-bottomright:6px;border-bottom-right-radius:6px;}
+.btn-group .btn:hover,.btn-group .btn:focus,.btn-group .btn:active,.btn-group .btn.active{z-index:2;}
+.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0;}
+.btn-group .dropdown-toggle{padding-left:8px;padding-right:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255, 255, 255, 0.125),inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 1px 0 0 rgba(255, 255, 255, 0.125),inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 1px 0 0 rgba(255, 255, 255, 0.125),inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);*padding-top:5px;*padding-bottom:5px;}
+.btn-group.open{*z-index:1000;}.btn-group.open .dropdown-menu{display:block;margin-top:1px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;}
+.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 1px 6px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 6px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 6px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);}
+.btn .caret{margin-top:7px;margin-left:0;}
+.btn:hover .caret,.open.btn-group .caret{opacity:1;filter:alpha(opacity=100);}
+.btn-primary .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret{border-top-color:#ffffff;opacity:0.75;filter:alpha(opacity=75);}
+.btn-small .caret{margin-top:4px;}
+.alert{padding:8px 35px 8px 14px;margin-bottom:18px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}
+.alert,.alert-heading{color:#c09853;}
+.alert .close{position:relative;top:-2px;right:-21px;line-height:18px;}
+.alert-success{background-color:#dff0d8;border-color:#d6e9c6;}
+.alert-success,.alert-success .alert-heading{color:#468847;}
+.alert-danger,.alert-error{background-color:#f2dede;border-color:#eed3d7;}
+.alert-danger,.alert-error,.alert-danger .alert-heading,.alert-error .alert-heading{color:#b94a48;}
+.alert-info{background-color:#d9edf7;border-color:#bce8f1;}
+.alert-info,.alert-info .alert-heading{color:#3a87ad;}
+.alert-block{padding-top:14px;padding-bottom:14px;}
+.alert-block>p,.alert-block>ul{margin-bottom:0;}
+.alert-block p+p{margin-top:5px;}
+.nav{margin-left:0;margin-bottom:18px;list-style:none;}
+.nav>li>a{display:block;}
+.nav>li>a:hover{text-decoration:none;background-color:#eeeeee;}
+.nav-list{padding-left:14px;padding-right:14px;margin-bottom:0;}
+.nav-list>li>a,.nav-list .nav-header{display:block;padding:3px 15px;margin-left:-15px;margin-right:-15px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);}
+.nav-list .nav-header{font-size:11px;font-weight:bold;line-height:18px;color:#999999;text-transform:uppercase;}
+.nav-list>li+.nav-header{margin-top:9px;}
+.nav-list .active>a,.nav-list .active>a:hover{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.2);background-color:#0088cc;}
+.nav-list [class^="icon-"]{margin-right:2px;}
+.nav-tabs,.nav-pills{*zoom:1;}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;content:"";}
+.nav-tabs:after,.nav-pills:after{clear:both;}
+.nav-tabs>li,.nav-pills>li{float:left;}
+.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px;}
+.nav-tabs{border-bottom:1px solid #ddd;}
+.nav-tabs>li{margin-bottom:-1px;}
+.nav-tabs>li>a{padding-top:9px;padding-bottom:9px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;}.nav-tabs>li>a:hover{border-color:#eeeeee #eeeeee #dddddd;}
+.nav-tabs>.active>a,.nav-tabs>.active>a:hover{color:#555555;background-color:#ffffff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default;}
+.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;}
+.nav-pills .active>a,.nav-pills .active>a:hover{color:#ffffff;background-color:#0088cc;}
+.nav-stacked>li{float:none;}
+.nav-stacked>li>a{margin-right:0;}
+.nav-tabs.nav-stacked{border-bottom:0;}
+.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
+.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;}
+.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;}
+.nav-tabs.nav-stacked>li>a:hover{border-color:#ddd;z-index:2;}
+.nav-pills.nav-stacked>li>a{margin-bottom:3px;}
+.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px;}
+.nav-tabs .dropdown-menu,.nav-pills .dropdown-menu{margin-top:1px;border-width:1px;}
+.nav-pills .dropdown-menu{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}
+.nav-tabs .dropdown-toggle .caret,.nav-pills .dropdown-toggle .caret{border-top-color:#0088cc;margin-top:6px;}
+.nav-tabs .dropdown-toggle:hover .caret,.nav-pills .dropdown-toggle:hover .caret{border-top-color:#005580;}
+.nav-tabs .active .dropdown-toggle .caret,.nav-pills .active .dropdown-toggle .caret{border-top-color:#333333;}
+.nav>.dropdown.active>a:hover{color:#000000;cursor:pointer;}
+.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>.open.active>a:hover{color:#ffffff;background-color:#999999;border-color:#999999;}
+.nav .open .caret,.nav .open.active .caret,.nav .open a:hover .caret{border-top-color:#ffffff;opacity:1;filter:alpha(opacity=100);}
+.tabs-stacked .open>a:hover{border-color:#999999;}
+.tabbable{*zoom:1;}.tabbable:before,.tabbable:after{display:table;content:"";}
+.tabbable:after{clear:both;}
+.tabs-below .nav-tabs,.tabs-right .nav-tabs,.tabs-left .nav-tabs{border-bottom:0;}
+.tab-content>.tab-pane,.pill-content>.pill-pane{display:none;}
+.tab-content>.active,.pill-content>.active{display:block;}
+.tabs-below .nav-tabs{border-top:1px solid #ddd;}
+.tabs-below .nav-tabs>li{margin-top:-1px;margin-bottom:0;}
+.tabs-below .nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;}.tabs-below .nav-tabs>li>a:hover{border-bottom-color:transparent;border-top-color:#ddd;}
+.tabs-below .nav-tabs .active>a,.tabs-below .nav-tabs .active>a:hover{border-color:transparent #ddd #ddd #ddd;}
+.tabs-left .nav-tabs>li,.tabs-right .nav-tabs>li{float:none;}
+.tabs-left .nav-tabs>li>a,.tabs-right .nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px;}
+.tabs-left .nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd;}
+.tabs-left .nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px;}
+.tabs-left .nav-tabs>li>a:hover{border-color:#eeeeee #dddddd #eeeeee #eeeeee;}
+.tabs-left .nav-tabs .active>a,.tabs-left .nav-tabs .active>a:hover{border-color:#ddd transparent #ddd #ddd;*border-right-color:#ffffff;}
+.tabs-right .nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd;}
+.tabs-right .nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;}
+.tabs-right .nav-tabs>li>a:hover{border-color:#eeeeee #eeeeee #eeeeee #dddddd;}
+.tabs-right .nav-tabs .active>a,.tabs-right .nav-tabs .active>a:hover{border-color:#ddd #ddd #ddd transparent;*border-left-color:#ffffff;}
+.navbar{overflow:visible;margin-bottom:18px;}
+.navbar-inner{padding-left:20px;padding-right:20px;background-color:#2c2c2c;background-image:-moz-linear-gradient(top, #333333, #222222);background-image:-ms-linear-gradient(top, #333333, #222222);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222));background-image:-webkit-linear-gradient(top, #333333, #222222);background-image:-o-linear-gradient(top, #333333, #222222);background-image:linear-gradient(top, #333333, #222222);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);-moz-box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);}
+.btn-navbar{display:none;float:right;padding:7px 10px;margin-left:5px;margin-right:5px;background-color:#2c2c2c;background-image:-moz-linear-gradient(top, #333333, #222222);background-image:-ms-linear-gradient(top, #333333, #222222);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222));background-image:-webkit-linear-gradient(top, #333333, #222222);background-image:-o-linear-gradient(top, #333333, #222222);background-image:linear-gradient(top, #333333, #222222);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0);border-color:#222222 #222222 #000000;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.075);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.075);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.075);}.btn-navbar:hover,.btn-navbar:active,.btn-navbar.active,.btn-navbar.disabled,.btn-navbar[disabled]{background-color:#222222;}
+.btn-navbar:active,.btn-navbar.active{background-color:#080808 \9;}
+.btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);-moz-box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);}
+.btn-navbar .icon-bar+.icon-bar{margin-top:3px;}
+.nav-collapse.collapse{height:auto;}
+.navbar .brand:hover{text-decoration:none;}
+.navbar .brand{float:left;display:block;padding:8px 20px 12px;margin-left:-20px;font-size:20px;font-weight:200;line-height:1;color:#ffffff;}
+.navbar .navbar-text{margin-bottom:0;line-height:40px;color:#999999;}.navbar .navbar-text a:hover{color:#ffffff;background-color:transparent;}
+.navbar .btn,.navbar .btn-group{margin-top:5px;}
+.navbar .btn-group .btn{margin-top:0;}
+.navbar-form{margin-bottom:0;*zoom:1;}.navbar-form:before,.navbar-form:after{display:table;content:"";}
+.navbar-form:after{clear:both;}
+.navbar-form input,.navbar-form select{display:inline-block;margin-top:5px;margin-bottom:0;}
+.navbar-form .radio,.navbar-form .checkbox{margin-top:5px;}
+.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px;}
+.navbar-search{position:relative;float:left;margin-top:6px;margin-bottom:0;}.navbar-search .search-query{padding:4px 9px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;color:#ffffff;color:rgba(255, 255, 255, 0.75);background:#666;background:rgba(255, 255, 255, 0.3);border:1px solid #111;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.15);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.15);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.15);-webkit-transition:none;-moz-transition:none;-ms-transition:none;-o-transition:none;transition:none;}.navbar-search .search-query :-moz-placeholder{color:#eeeeee;}
+.navbar-search .search-query::-webkit-input-placeholder{color:#eeeeee;}
+.navbar-search .search-query:hover{color:#ffffff;background-color:#999999;background-color:rgba(255, 255, 255, 0.5);}
+.navbar-search .search-query:focus,.navbar-search .search-query.focused{padding:5px 10px;color:#333333;text-shadow:0 1px 0 #ffffff;background-color:#ffffff;border:0;-webkit-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);-moz-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);box-shadow:0 0 3px rgba(0, 0, 0, 0.15);outline:0;}
+.navbar-fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030;}
+.navbar-fixed-top .navbar-inner{padding-left:0;padding-right:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
+.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0;}
+.navbar .nav.pull-right{float:right;}
+.navbar .nav>li{display:block;float:left;}
+.navbar .nav>li>a{float:none;padding:10px 10px 11px;line-height:19px;color:#999999;text-decoration:none;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);}
+.navbar .nav>li>a:hover{background-color:transparent;color:#ffffff;text-decoration:none;}
+.navbar .nav .active>a,.navbar .nav .active>a:hover{color:#ffffff;text-decoration:none;background-color:#222222;background-color:rgba(0, 0, 0, 0.5);}
+.navbar .divider-vertical{height:40px;width:1px;margin:0 9px;overflow:hidden;background-color:#222222;border-right:1px solid #333333;}
+.navbar .nav.pull-right{margin-left:10px;margin-right:0;}
+.navbar .dropdown-menu{margin-top:1px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.navbar .dropdown-menu:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0, 0, 0, 0.2);position:absolute;top:-7px;left:9px;}
+.navbar .dropdown-menu:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #ffffff;position:absolute;top:-6px;left:10px;}
+.navbar .nav .dropdown-toggle .caret,.navbar .nav .open.dropdown .caret{border-top-color:#ffffff;}
+.navbar .nav .active .caret{opacity:1;filter:alpha(opacity=100);}
+.navbar .nav .open>.dropdown-toggle,.navbar .nav .active>.dropdown-toggle,.navbar .nav .open.active>.dropdown-toggle{background-color:transparent;}
+.navbar .nav .active>.dropdown-toggle:hover{color:#ffffff;}
+.navbar .nav.pull-right .dropdown-menu{left:auto;right:0;}.navbar .nav.pull-right .dropdown-menu:before{left:auto;right:12px;}
+.navbar .nav.pull-right .dropdown-menu:after{left:auto;right:13px;}
+.breadcrumb{padding:7px 14px;margin:0 0 18px;background-color:#fbfbfb;background-image:-moz-linear-gradient(top, #ffffff, #f5f5f5);background-image:-ms-linear-gradient(top, #ffffff, #f5f5f5);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f5f5f5));background-image:-webkit-linear-gradient(top, #ffffff, #f5f5f5);background-image:-o-linear-gradient(top, #ffffff, #f5f5f5);background-image:linear-gradient(top, #ffffff, #f5f5f5);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#f5f5f5', GradientType=0);border:1px solid #ddd;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:inset 0 1px 0 #ffffff;-moz-box-shadow:inset 0 1px 0 #ffffff;box-shadow:inset 0 1px 0 #ffffff;}.breadcrumb li{display:inline;text-shadow:0 1px 0 #ffffff;}
+.breadcrumb .divider{padding:0 5px;color:#999999;}
+.breadcrumb .active a{color:#333333;}
+.pagination{height:36px;margin:18px 0;}
+.pagination ul{display:inline-block;*display:inline;*zoom:1;margin-left:0;margin-bottom:0;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);}
+.pagination li{display:inline;}
+.pagination a{float:left;padding:0 14px;line-height:34px;text-decoration:none;border:1px solid #ddd;border-left-width:0;}
+.pagination a:hover,.pagination .active a{background-color:#f5f5f5;}
+.pagination .active a{color:#999999;cursor:default;}
+.pagination .disabled a,.pagination .disabled a:hover{color:#999999;background-color:transparent;cursor:default;}
+.pagination li:first-child a{border-left-width:1px;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;}
+.pagination li:last-child a{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;}
+.pagination-centered{text-align:center;}
+.pagination-right{text-align:right;}
+.pager{margin-left:0;margin-bottom:18px;list-style:none;text-align:center;*zoom:1;}.pager:before,.pager:after{display:table;content:"";}
+.pager:after{clear:both;}
+.pager li{display:inline;}
+.pager a{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px;}
+.pager a:hover{text-decoration:none;background-color:#f5f5f5;}
+.pager .next a{float:right;}
+.pager .previous a{float:left;}
+.modal-open .dropdown-menu{z-index:2050;}
+.modal-open .dropdown.open{*z-index:2050;}
+.modal-open .popover{z-index:2060;}
+.modal-open .tooltip{z-index:2070;}
+.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000000;}.modal-backdrop.fade{opacity:0;}
+.modal-backdrop,.modal-backdrop.fade.in{opacity:0.8;filter:alpha(opacity=80);}
+.modal{position:fixed;top:50%;left:50%;z-index:1050;max-height:500px;overflow:auto;width:560px;margin:-250px 0 0 -280px;background-color:#ffffff;border:1px solid #999;border:1px solid rgba(0, 0, 0, 0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-moz-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box;}.modal.fade{-webkit-transition:opacity .3s linear, top .3s ease-out;-moz-transition:opacity .3s linear, top .3s ease-out;-ms-transition:opacity .3s linear, top .3s ease-out;-o-transition:opacity .3s linear, top .3s ease-out;transition:opacity .3s linear, top .3s ease-out;top:-25%;}
+.modal.fade.in{top:50%;}
+.modal-header{padding:9px 15px;border-bottom:1px solid #eee;}.modal-header .close{margin-top:2px;}
+.modal-body{padding:15px;}
+.modal-footer{padding:14px 15px 15px;margin-bottom:0;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;-webkit-box-shadow:inset 0 1px 0 #ffffff;-moz-box-shadow:inset 0 1px 0 #ffffff;box-shadow:inset 0 1px 0 #ffffff;*zoom:1;}.modal-footer:before,.modal-footer:after{display:table;content:"";}
+.modal-footer:after{clear:both;}
+.modal-footer .btn{float:right;margin-left:5px;margin-bottom:0;}
+.tooltip{position:absolute;z-index:1020;display:block;visibility:visible;padding:5px;font-size:11px;opacity:0;filter:alpha(opacity=0);}.tooltip.in{opacity:0.8;filter:alpha(opacity=80);}
+.tooltip.top{margin-top:-2px;}
+.tooltip.right{margin-left:2px;}
+.tooltip.bottom{margin-top:2px;}
+.tooltip.left{margin-left:-2px;}
+.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #000000;}
+.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid #000000;}
+.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-bottom:5px solid #000000;}
+.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-right:5px solid #000000;}
+.tooltip-inner{max-width:200px;padding:3px 8px;color:#ffffff;text-align:center;text-decoration:none;background-color:#000000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}
+.tooltip-arrow{position:absolute;width:0;height:0;}
+.popover{position:absolute;top:0;left:0;z-index:1010;display:none;padding:5px;}.popover.top{margin-top:-5px;}
+.popover.right{margin-left:5px;}
+.popover.bottom{margin-top:5px;}
+.popover.left{margin-left:-5px;}
+.popover.top .arrow{bottom:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #000000;}
+.popover.right .arrow{top:50%;left:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-right:5px solid #000000;}
+.popover.bottom .arrow{top:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-bottom:5px solid #000000;}
+.popover.left .arrow{top:50%;right:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid #000000;}
+.popover .arrow{position:absolute;width:0;height:0;}
+.popover-inner{padding:3px;width:280px;overflow:hidden;background:#000000;background:rgba(0, 0, 0, 0.8);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-moz-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);}
+.popover-title{padding:9px 15px;line-height:1;background-color:#f5f5f5;border-bottom:1px solid #eee;-webkit-border-radius:3px 3px 0 0;-moz-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;}
+.popover-content{padding:14px;background-color:#ffffff;-webkit-border-radius:0 0 3px 3px;-moz-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px;-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box;}.popover-content p,.popover-content ul,.popover-content ol{margin-bottom:0;}
+.thumbnails{margin-left:-20px;list-style:none;*zoom:1;}.thumbnails:before,.thumbnails:after{display:table;content:"";}
+.thumbnails:after{clear:both;}
+.thumbnails>li{float:left;margin:0 0 18px 20px;}
+.thumbnail{display:block;padding:4px;line-height:1;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);}
+a.thumbnail:hover{border-color:#0088cc;-webkit-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);-moz-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);}
+.thumbnail>img{display:block;max-width:100%;margin-left:auto;margin-right:auto;}
+.thumbnail .caption{padding:9px;}
+.label{padding:1px 3px 2px;font-size:9.75px;font-weight:bold;color:#ffffff;text-transform:uppercase;background-color:#999999;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}
+.label-important{background-color:#b94a48;}
+.label-warning{background-color:#f89406;}
+.label-success{background-color:#468847;}
+.label-info{background-color:#3a87ad;}
+@-webkit-keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}}@-moz-keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}}@keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}}.progress{overflow:hidden;height:18px;margin-bottom:18px;background-color:#f7f7f7;background-image:-moz-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-ms-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9));background-image:-webkit-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-o-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:linear-gradient(top, #f5f5f5, #f9f9f9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5', endColorstr='#f9f9f9', GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}
+.progress .bar{width:0%;height:18px;color:#ffffff;font-size:12px;text-align:center;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top, #149bdf, #0480be);background-image:-ms-linear-gradient(top, #149bdf, #0480be);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be));background-image:-webkit-linear-gradient(top, #149bdf, #0480be);background-image:-o-linear-gradient(top, #149bdf, #0480be);background-image:linear-gradient(top, #149bdf, #0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#149bdf', endColorstr='#0480be', GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width 0.6s ease;-moz-transition:width 0.6s ease;-ms-transition:width 0.6s ease;-o-transition:width 0.6s ease;transition:width 0.6s ease;}
+.progress-striped .bar{background-color:#62c462;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px;}
+.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite;}
+.progress-danger .bar{background-color:#dd514c;background-image:-moz-linear-gradient(top, #ee5f5b, #c43c35);background-image:-ms-linear-gradient(top, #ee5f5b, #c43c35);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35));background-image:-webkit-linear-gradient(top, #ee5f5b, #c43c35);background-image:-o-linear-gradient(top, #ee5f5b, #c43c35);background-image:linear-gradient(top, #ee5f5b, #c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0);}
+.progress-danger.progress-striped .bar{background-color:#ee5f5b;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);}
+.progress-success .bar{background-color:#5eb95e;background-image:-moz-linear-gradient(top, #62c462, #57a957);background-image:-ms-linear-gradient(top, #62c462, #57a957);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957));background-image:-webkit-linear-gradient(top, #62c462, #57a957);background-image:-o-linear-gradient(top, #62c462, #57a957);background-image:linear-gradient(top, #62c462, #57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0);}
+.progress-success.progress-striped .bar{background-color:#62c462;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);}
+.progress-info .bar{background-color:#4bb1cf;background-image:-moz-linear-gradient(top, #5bc0de, #339bb9);background-image:-ms-linear-gradient(top, #5bc0de, #339bb9);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9));background-image:-webkit-linear-gradient(top, #5bc0de, #339bb9);background-image:-o-linear-gradient(top, #5bc0de, #339bb9);background-image:linear-gradient(top, #5bc0de, #339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0);}
+.progress-info.progress-striped .bar{background-color:#5bc0de;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);}
+.accordion{margin-bottom:18px;}
+.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}
+.accordion-heading{border-bottom:0;}
+.accordion-heading .accordion-toggle{display:block;padding:8px 15px;}
+.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5;}
+.carousel{position:relative;margin-bottom:18px;line-height:1;}
+.carousel-inner{overflow:hidden;width:100%;position:relative;}
+.carousel .item{display:none;position:relative;-webkit-transition:0.6s ease-in-out left;-moz-transition:0.6s ease-in-out left;-ms-transition:0.6s ease-in-out left;-o-transition:0.6s ease-in-out left;transition:0.6s ease-in-out left;}
+.carousel .item>img{display:block;line-height:1;}
+.carousel .active,.carousel .next,.carousel .prev{display:block;}
+.carousel .active{left:0;}
+.carousel .next,.carousel .prev{position:absolute;top:0;width:100%;}
+.carousel .next{left:100%;}
+.carousel .prev{left:-100%;}
+.carousel .next.left,.carousel .prev.right{left:0;}
+.carousel .active.left{left:-100%;}
+.carousel .active.right{left:100%;}
+.carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#ffffff;text-align:center;background:#222222;border:3px solid #ffffff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:0.5;filter:alpha(opacity=50);}.carousel-control.right{left:auto;right:15px;}
+.carousel-control:hover{color:#ffffff;text-decoration:none;opacity:0.9;filter:alpha(opacity=90);}
+.carousel-caption{position:absolute;left:0;right:0;bottom:0;padding:10px 15px 5px;background:#333333;background:rgba(0, 0, 0, 0.75);}
+.carousel-caption h4,.carousel-caption p{color:#ffffff;}
+.hero-unit{padding:60px;margin-bottom:30px;background-color:#f5f5f5;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;}
+.hero-unit p{font-size:18px;font-weight:200;line-height:27px;}
+.pull-right{float:right;}
+.pull-left{float:left;}
+.hide{display:none;}
+.show{display:block;}
+.invisible{visibility:hidden;}
diff --git a/Examples/Ajax/MooToolsExample/WebServerResources/datepicker_dashboard/buttons.png b/Examples/Ajax/MooToolsExample/WebServerResources/datepicker_dashboard/buttons.png
new file mode 100644
index 00000000000..66e24e37c6c
Binary files /dev/null and b/Examples/Ajax/MooToolsExample/WebServerResources/datepicker_dashboard/buttons.png differ
diff --git a/Examples/Ajax/MooToolsExample/WebServerResources/datepicker_dashboard/datepicker_dashboard.css b/Examples/Ajax/MooToolsExample/WebServerResources/datepicker_dashboard/datepicker_dashboard.css
new file mode 100644
index 00000000000..3b8f06f0acf
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/WebServerResources/datepicker_dashboard/datepicker_dashboard.css
@@ -0,0 +1,245 @@
+.datepicker_dashboard {
+ position: absolute;
+ font-size: 10px;
+ font-family: "Lucida Grande", LucidaGrande, "Lucida Sans", Geneva, Verdana, sans-serif;
+ color: #fff;
+ line-height: normal;
+ width: 172px;
+ height: 135px;
+ padding: 14px;
+ background: url(frame.png) no-repeat;
+}
+
+/* header
+********************************************************/
+.datepicker_dashboard .header {
+ position: relative;
+ height: 15px;
+ margin-bottom: 5px;
+ padding-top: 1px;
+}
+
+.datepicker_dashboard .header .title {
+ text-align: center;
+ margin: 2px 18px 0 18px;
+}
+
+.datepicker_dashboard .header .titleText {
+ color: #ccff00;
+}
+
+.datepicker_dashboard .header .previous,
+.datepicker_dashboard .header .next,
+.datepicker_dashboard .header .closeButton {
+ position: absolute;
+ cursor: pointer;
+ text-indent: -40px;
+ overflow: hidden;
+ width: 12px;
+ height: 12px;
+ top: 2px;
+ background-image: url(buttons.png);
+ background-position: left top;
+ background-repeat: no-repeat;
+}
+
+.datepicker_dashboard .header .previous {
+ left: 4px;
+}
+.datepicker_dashboard .header .previous:hover {
+ background-position: left bottom;
+}
+.datepicker_dashboard .header .next {
+ right: 4px;
+ background-position: -13px top;
+}
+.datepicker_dashboard .header .next:hover {
+ background-position: -13px bottom;
+}
+.datepicker_dashboard .header .closeButton {
+ display: none;
+ right: 0px;
+ top: 0px;
+ background-position: right top;
+}
+.datepicker_dashboard .header .closeButton:hover {
+ background-position: right bottom;
+}
+
+/* body
+********************************************************/
+.datepicker_dashboard .body {
+ position: relative;
+ top: 0px;
+ left: 2px;
+ width: 168px;
+ height: 112px;
+ overflow: hidden;
+}
+
+/* time
+********************************************************/
+.datepicker_dashboard .time {
+ position: relative;
+ width: 100%;
+ height: 100%;
+}
+
+.datepicker_dashboard .time .hour,
+.datepicker_dashboard .time .separator,
+.datepicker_dashboard .time .minutes {
+ background: #333;
+ border: 0px;
+ width: 50px;
+ font-size: 32px;
+ color: #fff;
+ position: absolute;
+ top: 10px;
+ text-align: center;
+ padding: 2px;
+}
+
+.datepicker_dashboard .time .hour {
+ left: 15px;
+}
+.datepicker_dashboard .time .separator {
+ background: transparent;
+ width: 10px;
+ left: 76px;
+}
+
+.datepicker_dashboard .time .minutes {
+ left: 95px;
+}
+.datepicker_dashboard .time .ok {
+ position: absolute;
+ top: 65px;
+ height: 32px;
+ width: 136px;
+ left: 15px;
+ font-size: 20px;
+}
+
+/* days-grid
+********************************************************/
+.datepicker_dashboard .days .day {
+ float: left;
+ text-align: center;
+ overflow: hidden;
+ width: 23px;
+ padding-top: 1px;
+ height: 14px;
+ margin: 0 1px 1px 0;
+}
+.datepicker_dashboard .days .titles {
+ height: 15px;
+ margin-bottom: 2px;
+ text-transform: uppercase;
+ color: #aaa;
+}
+.datepicker_dashboard .days .day0 {
+ margin-right: 0;
+}
+
+.datepicker_dashboard .days .week5 .day {
+ margin-bottom: 0;
+}
+
+/* days-colors
+********************************************************/
+.datepicker_dashboard .days .week .day {
+ cursor: pointer;
+}
+.datepicker_dashboard .days .week .day:hover {
+ color: #ccff00;
+}
+
+.datepicker_dashboard .days .otherMonth {
+ color: #444444;
+}
+
+.datepicker_dashboard .days .selected {
+ color: #ccff00;
+}
+
+/* months-grid
+********************************************************/
+.datepicker_dashboard .months .month {
+ float: left;
+ cursor: pointer;
+ text-align: center;
+ padding-top: 6px;
+ width: 55px;
+ overflow: hidden;
+ height: 21px;
+ margin: 0 1px 1px 0;
+}
+
+.datepicker_dashboard .months .month3,
+.datepicker_dashboard .months .month6,
+.datepicker_dashboard .months .month9,
+.datepicker_dashboard .months .month12 {
+ margin-right: 0;
+}
+
+.datepicker_dashboard .months .month10,
+.datepicker_dashboard .months .month11,
+.datepicker_dashboard .months .month12 {
+ margin-bottom: 0;
+}
+
+/* months-colors
+********************************************************/
+.datepicker_dashboard .months .month:hover {
+ color: #ccff00;
+}
+
+.datepicker_dashboard .months .selected {
+ color: #ccff00;
+}
+
+/* years-grid
+********************************************************/
+.datepicker_dashboard .years .year {
+ float: left;
+ cursor: pointer;
+ text-align: center;
+ padding-top: 6px;
+ width: 32px;
+ overflow: hidden;
+ height: 21px;
+ margin: 0 1px 1px 0;
+}
+
+.datepicker_dashboard .years .year4,
+.datepicker_dashboard .years .year9,
+.datepicker_dashboard .years .year14,
+.datepicker_dashboard .years .year19 {
+ margin-right: 0;
+}
+
+.datepicker_dashboard .years .year15,
+.datepicker_dashboard .years .year16,
+.datepicker_dashboard .years .year17,
+.datepicker_dashboard .years .year18,
+.datepicker_dashboard .years .year19 {
+ margin-bottom: 0;
+}
+
+/* years-colors
+********************************************************/
+.datepicker_dashboard .years .year:hover {
+ color: #ccff00;
+}
+
+.datepicker_dashboard .years .selected {
+ color: #ccff00
+}
+
+/* global
+********************************************************/
+.datepicker_dashboard .unavailable {
+ color: #533 !important;
+ cursor: default !important;
+ text-decoration: line-through;
+}
diff --git a/Examples/Ajax/MooToolsExample/WebServerResources/datepicker_dashboard/frame.png b/Examples/Ajax/MooToolsExample/WebServerResources/datepicker_dashboard/frame.png
new file mode 100644
index 00000000000..04244e52f2d
Binary files /dev/null and b/Examples/Ajax/MooToolsExample/WebServerResources/datepicker_dashboard/frame.png differ
diff --git a/Examples/Ajax/MooToolsExample/WebServerResources/img/Green_Thumb.png b/Examples/Ajax/MooToolsExample/WebServerResources/img/Green_Thumb.png
new file mode 100644
index 00000000000..27a314c8a31
Binary files /dev/null and b/Examples/Ajax/MooToolsExample/WebServerResources/img/Green_Thumb.png differ
diff --git a/Examples/Ajax/MooToolsExample/WebServerResources/img/Red_Thumb.png b/Examples/Ajax/MooToolsExample/WebServerResources/img/Red_Thumb.png
new file mode 100644
index 00000000000..1706fc6e615
Binary files /dev/null and b/Examples/Ajax/MooToolsExample/WebServerResources/img/Red_Thumb.png differ
diff --git a/Examples/Ajax/MooToolsExample/WebServerResources/img/Yellow_Thumb.png b/Examples/Ajax/MooToolsExample/WebServerResources/img/Yellow_Thumb.png
new file mode 100644
index 00000000000..663d6932a09
Binary files /dev/null and b/Examples/Ajax/MooToolsExample/WebServerResources/img/Yellow_Thumb.png differ
diff --git a/Examples/Ajax/MooToolsExample/WebServerResources/img/glyphicons-halflings-white.png b/Examples/Ajax/MooToolsExample/WebServerResources/img/glyphicons-halflings-white.png
new file mode 100644
index 00000000000..a20760bfde5
Binary files /dev/null and b/Examples/Ajax/MooToolsExample/WebServerResources/img/glyphicons-halflings-white.png differ
diff --git a/Examples/Ajax/MooToolsExample/WebServerResources/img/glyphicons-halflings.png b/Examples/Ajax/MooToolsExample/WebServerResources/img/glyphicons-halflings.png
new file mode 100644
index 00000000000..92d4445dfd0
Binary files /dev/null and b/Examples/Ajax/MooToolsExample/WebServerResources/img/glyphicons-halflings.png differ
diff --git a/Examples/Ajax/MooToolsExample/WebServerResources/img/progress-bar.gif b/Examples/Ajax/MooToolsExample/WebServerResources/img/progress-bar.gif
new file mode 100644
index 00000000000..91bc2fedc11
Binary files /dev/null and b/Examples/Ajax/MooToolsExample/WebServerResources/img/progress-bar.gif differ
diff --git a/Examples/Ajax/MooToolsExample/WebServerResources/img/progress-remainder.gif b/Examples/Ajax/MooToolsExample/WebServerResources/img/progress-remainder.gif
new file mode 100644
index 00000000000..4b6356ed202
Binary files /dev/null and b/Examples/Ajax/MooToolsExample/WebServerResources/img/progress-remainder.gif differ
diff --git a/Examples/Ajax/MooToolsExample/build.properties b/Examples/Ajax/MooToolsExample/build.properties
new file mode 100644
index 00000000000..fcfec55a8bc
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/build.properties
@@ -0,0 +1,14 @@
+#Wed Feb 08 12:10:36 HST 2012
+classes.dir=bin
+component.inlineBindingPrefix=$
+component.inlineBindingSuffix=
+component.wellFormedTemplateRequired=false
+customInfoPListContent=
+embed.Local=true
+embed.System=true
+principalClass=er.ajax.mootools.example.app.Application
+project.name=MooToolsExample
+project.name.lowercase=mootoolsexample
+project.type=application
+webXML=false
+webXML_CustomContent=
diff --git a/Examples/Ajax/MooToolsExample/build.xml b/Examples/Ajax/MooToolsExample/build.xml
new file mode 100644
index 00000000000..6b043de9d4f
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/build.xml
@@ -0,0 +1,223 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Examples/Ajax/MooToolsExample/woproject/classes.exclude.patternset b/Examples/Ajax/MooToolsExample/woproject/classes.exclude.patternset
new file mode 100644
index 00000000000..56fb545fa67
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/woproject/classes.exclude.patternset
@@ -0,0 +1 @@
+build.properties
diff --git a/Examples/Ajax/MooToolsExample/woproject/classes.include.patternset b/Examples/Ajax/MooToolsExample/woproject/classes.include.patternset
new file mode 100644
index 00000000000..3179091db39
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/woproject/classes.include.patternset
@@ -0,0 +1,2 @@
+**/*.class
+*.properties
diff --git a/Examples/Ajax/MooToolsExample/woproject/resources.exclude.patternset b/Examples/Ajax/MooToolsExample/woproject/resources.exclude.patternset
new file mode 100644
index 00000000000..905050dfb73
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/woproject/resources.exclude.patternset
@@ -0,0 +1,3 @@
+**/*.eomodeld~/
+**/*.woa/**
+**/*.framework/**
diff --git a/Examples/Ajax/MooToolsExample/woproject/resources.include.patternset b/Examples/Ajax/MooToolsExample/woproject/resources.include.patternset
new file mode 100644
index 00000000000..611978755e2
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/woproject/resources.include.patternset
@@ -0,0 +1,3 @@
+Components/**/*.wo/**/*
+Components/**/*.api
+Resources/**/*
\ No newline at end of file
diff --git a/Examples/Ajax/MooToolsExample/woproject/wsresources.exclude.patternset b/Examples/Ajax/MooToolsExample/woproject/wsresources.exclude.patternset
new file mode 100644
index 00000000000..9435a512320
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/woproject/wsresources.exclude.patternset
@@ -0,0 +1,3 @@
+**/*.woa/**
+**/*.framework/**
+**/*.eomodeld~/**
diff --git a/Examples/Ajax/MooToolsExample/woproject/wsresources.include.patternset b/Examples/Ajax/MooToolsExample/woproject/wsresources.include.patternset
new file mode 100644
index 00000000000..234cdc88bb7
--- /dev/null
+++ b/Examples/Ajax/MooToolsExample/woproject/wsresources.include.patternset
@@ -0,0 +1 @@
+WebServerResources/**/*
diff --git a/Frameworks/Ajax/MooTools/.classpath b/Frameworks/Ajax/MooTools/.classpath
new file mode 100644
index 00000000000..6f63db6ed92
--- /dev/null
+++ b/Frameworks/Ajax/MooTools/.classpath
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Frameworks/Ajax/MooTools/.project b/Frameworks/Ajax/MooTools/.project
new file mode 100644
index 00000000000..60d27b5039e
--- /dev/null
+++ b/Frameworks/Ajax/MooTools/.project
@@ -0,0 +1,23 @@
+
+
+ MooTools
+
+
+
+
+
+ org.eclipse.jdt.core.javabuilder
+
+
+
+
+ org.objectstyle.wolips.incrementalbuilder
+
+
+
+
+
+ org.eclipse.jdt.core.javanature
+ org.objectstyle.wolips.incrementalframeworknature
+
+
diff --git a/Frameworks/Ajax/MooTools/.settings/org.eclipse.core.resources.prefs b/Frameworks/Ajax/MooTools/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 00000000000..a6a0fefecb6
--- /dev/null
+++ b/Frameworks/Ajax/MooTools/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding//Components=UTF-8
diff --git a/Frameworks/Ajax/MooTools/Components/MTAccordionComponent.wo/MTAccordionComponent.html b/Frameworks/Ajax/MooTools/Components/MTAccordionComponent.wo/MTAccordionComponent.html
new file mode 100644
index 00000000000..e62419cd959
--- /dev/null
+++ b/Frameworks/Ajax/MooTools/Components/MTAccordionComponent.wo/MTAccordionComponent.html
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/Frameworks/Ajax/MooTools/Components/MTAccordionComponent.wo/MTAccordionComponent.wod b/Frameworks/Ajax/MooTools/Components/MTAccordionComponent.wo/MTAccordionComponent.wod
new file mode 100644
index 00000000000..b8d5a8f0a67
--- /dev/null
+++ b/Frameworks/Ajax/MooTools/Components/MTAccordionComponent.wo/MTAccordionComponent.wod
@@ -0,0 +1,9 @@
+ElementsContainer : WOGenericContainer {
+ class = "elements";
+ elementName = "div";
+}
+
+TogglerContainer : WOGenericContainer {
+ class = "togglers";
+ elementName = "div";
+}
\ No newline at end of file
diff --git a/Frameworks/Ajax/MooTools/Components/MTAccordionComponent.wo/MTAccordionComponent.woo b/Frameworks/Ajax/MooTools/Components/MTAccordionComponent.wo/MTAccordionComponent.woo
new file mode 100644
index 00000000000..a076a051a7e
--- /dev/null
+++ b/Frameworks/Ajax/MooTools/Components/MTAccordionComponent.wo/MTAccordionComponent.woo
@@ -0,0 +1,4 @@
+{
+ "WebObjects Release" = "WebObjects 5.0";
+ encoding = "UTF-8";
+}
\ No newline at end of file
diff --git a/Frameworks/Ajax/MooTools/Components/MTAccordionContainer.api b/Frameworks/Ajax/MooTools/Components/MTAccordionContainer.api
new file mode 100644
index 00000000000..3264d1b6cea
--- /dev/null
+++ b/Frameworks/Ajax/MooTools/Components/MTAccordionContainer.api
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Frameworks/Ajax/MooTools/Components/MTAccordionContainer.wo/MTAccordionContainer.html b/Frameworks/Ajax/MooTools/Components/MTAccordionContainer.wo/MTAccordionContainer.html
new file mode 100644
index 00000000000..e4bfe014f23
--- /dev/null
+++ b/Frameworks/Ajax/MooTools/Components/MTAccordionContainer.wo/MTAccordionContainer.html
@@ -0,0 +1,8 @@
+
+
+
+
+ window.addEvent('domready', function() {
+ new Fx.Accordion($$('# .togglers'), $$('# .elements'), );
+ });
+
\ No newline at end of file
diff --git a/Frameworks/Ajax/MooTools/Components/MTAccordionContainer.wo/MTAccordionContainer.wod b/Frameworks/Ajax/MooTools/Components/MTAccordionContainer.wo/MTAccordionContainer.wod
new file mode 100644
index 00000000000..36050d9f1fd
--- /dev/null
+++ b/Frameworks/Ajax/MooTools/Components/MTAccordionContainer.wo/MTAccordionContainer.wod
@@ -0,0 +1,12 @@
+AccordionContainerID : WOString {
+ value = accordionID;
+}
+
+AccordionDiv : WOGenericContainer {
+ elementName = "div";
+ id = accordionID;
+}
+
+AjaxOptions : AjaxOptions {
+ options = createAjaxOptions;
+}
\ No newline at end of file
diff --git a/Frameworks/Ajax/MooTools/Components/MTAccordionContainer.wo/MTAccordionContainer.woo b/Frameworks/Ajax/MooTools/Components/MTAccordionContainer.wo/MTAccordionContainer.woo
new file mode 100644
index 00000000000..a076a051a7e
--- /dev/null
+++ b/Frameworks/Ajax/MooTools/Components/MTAccordionContainer.wo/MTAccordionContainer.woo
@@ -0,0 +1,4 @@
+{
+ "WebObjects Release" = "WebObjects 5.0";
+ encoding = "UTF-8";
+}
\ No newline at end of file
diff --git a/Frameworks/Ajax/MooTools/Components/MTAjaxDraggable.api b/Frameworks/Ajax/MooTools/Components/MTAjaxDraggable.api
new file mode 100644
index 00000000000..d39100c81a4
--- /dev/null
+++ b/Frameworks/Ajax/MooTools/Components/MTAjaxDraggable.api
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/Frameworks/Ajax/MooTools/Components/MTAjaxDraggable.wo/MTAjaxDraggable.html b/Frameworks/Ajax/MooTools/Components/MTAjaxDraggable.wo/MTAjaxDraggable.html
new file mode 100644
index 00000000000..c58bc20b1d2
--- /dev/null
+++ b/Frameworks/Ajax/MooTools/Components/MTAjaxDraggable.wo/MTAjaxDraggable.html
@@ -0,0 +1,6 @@
+
+
+ window.addEvent('domready', function() {
+ var = new MTAD( , );
+ });
+
diff --git a/Frameworks/Ajax/MooTools/Components/MTAjaxDraggable.wo/MTAjaxDraggable.wod b/Frameworks/Ajax/MooTools/Components/MTAjaxDraggable.wo/MTAjaxDraggable.wod
new file mode 100644
index 00000000000..dff8f272ab3
--- /dev/null
+++ b/Frameworks/Ajax/MooTools/Components/MTAjaxDraggable.wo/MTAjaxDraggable.wod
@@ -0,0 +1,25 @@
+DraggableContainer : WOGenericContainer {
+ elementName = elementName;
+ id = id;
+ class = ^class;
+ style = ^style;
+ draggableID = draggableID;
+}
+
+Content : WOComponentContent {
+}
+
+AjaxOptions : AjaxOptions {
+ id = quotedID;
+ actionUrl = quotedActionUrl;
+ contextID = quotedContextID;
+ draggableKeyName = quotedDraggableKeyName;
+ elementID = quotedElementID;
+ form = form;
+ options = createAjaxOptions;
+ submit = submit;
+}
+
+ID : WOString {
+ value = variableName;
+}
\ No newline at end of file
diff --git a/Frameworks/Ajax/MooTools/Components/MTAjaxDraggable.wo/MTAjaxDraggable.woo b/Frameworks/Ajax/MooTools/Components/MTAjaxDraggable.wo/MTAjaxDraggable.woo
new file mode 100644
index 00000000000..a076a051a7e
--- /dev/null
+++ b/Frameworks/Ajax/MooTools/Components/MTAjaxDraggable.wo/MTAjaxDraggable.woo
@@ -0,0 +1,4 @@
+{
+ "WebObjects Release" = "WebObjects 5.0";
+ encoding = "UTF-8";
+}
\ No newline at end of file
diff --git a/Frameworks/Ajax/MooTools/Components/MTAjaxFileUpload.api b/Frameworks/Ajax/MooTools/Components/MTAjaxFileUpload.api
new file mode 100644
index 00000000000..2192d1a556a
--- /dev/null
+++ b/Frameworks/Ajax/MooTools/Components/MTAjaxFileUpload.api
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Frameworks/Ajax/MooTools/Components/MTAjaxFileUpload.wo/MTAjaxFileUpload.html b/Frameworks/Ajax/MooTools/Components/MTAjaxFileUpload.wo/MTAjaxFileUpload.html
new file mode 100644
index 00000000000..4f009f095c0
--- /dev/null
+++ b/Frameworks/Ajax/MooTools/Components/MTAjaxFileUpload.wo/MTAjaxFileUpload.html
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Frameworks/Ajax/MooTools/Components/MTAjaxFileUpload.wo/MTAjaxFileUpload.wod b/Frameworks/Ajax/MooTools/Components/MTAjaxFileUpload.wo/MTAjaxFileUpload.wod
new file mode 100644
index 00000000000..42290ec1571
--- /dev/null
+++ b/Frameworks/Ajax/MooTools/Components/MTAjaxFileUpload.wo/MTAjaxFileUpload.wod
@@ -0,0 +1,79 @@
+HiddenFrame : WOIFrame {
+ name = uploadFrameName;
+ src = srcUrl;
+ width = "0";
+ height = "0";
+ style = "border: none;";
+ border = "0";
+}
+
+UploadForm : WOForm {
+ class = ^formClass;
+ multipleSubmit = false;
+ enctype = "multipart/form-data";
+ target = uploadFrameName;
+ href = uploadUrl;
+ name = uploadFormID;
+}
+
+HiddenID : WOGenericElement {
+ elementName = "input";
+ type = "hidden";
+ name = "id";
+ value = id;
+}
+
+HiddenWOSID : WOGenericElement {
+ elementName = "input";
+ type = "hidden";
+ name = "wosid";
+ value = session.sessionID;
+}
+
+UploadField : WOGenericElement {
+ elementName = "input";
+ type = "file";
+ name = "uploadedFile";
+ class = ^class;
+ id = ^id;
+ style = ^style;
+}
+
+UploadAction : MTAjaxUpdateLink {
+ updateContainerID = progressBarID;
+ action = startUpload;
+ button = true;
+ class = ^linkClass;
+ functionName = ^uploadFunctionName;
+ value = uploadLabel;
+ disabled = false;
+}
+
+UploadProgressBar : MTAjaxProgressBar {
+ id = progressBarID;
+ progressID = id;
+ progress = uploadProgress;
+ started = uploadStarted;
+ succeededAction = uploadSucceeded;
+ startedFunction = ^startedFunction;
+ finishedFunction = ^finishedFunction;
+ succeededFunction = ^succeededFunction;
+ failedAction = uploadFailed;
+ failedFunction = ^failedFunction;
+ canceledAction = uploadCanceled;
+ canceledFunction = ^canceledFunction;
+ displayValue = bytesReadSize;
+ displayMaximum = streamLengthSize;
+ allowCancel = ^allowCancel;
+ visibleBeforeStart = progressBarBeforeStart;
+ visibleAfterDone = progressBarAfterDone;
+ cancelText = cancelText;
+ cancelingText = cancelingText;
+ startingText = startingText;
+ refreshTime = ^refreshTime;
+ progressOfText = ^progressOfText;
+ progressBarContainerClass = ^progressBarContainerClass;
+}
+
+Contents : WOComponentContent {
+}
\ No newline at end of file
diff --git a/Frameworks/Ajax/MooTools/Components/MTAjaxFileUpload.wo/MTAjaxFileUpload.woo b/Frameworks/Ajax/MooTools/Components/MTAjaxFileUpload.wo/MTAjaxFileUpload.woo
new file mode 100644
index 00000000000..a076a051a7e
--- /dev/null
+++ b/Frameworks/Ajax/MooTools/Components/MTAjaxFileUpload.wo/MTAjaxFileUpload.woo
@@ -0,0 +1,4 @@
+{
+ "WebObjects Release" = "WebObjects 5.0";
+ encoding = "UTF-8";
+}
\ No newline at end of file
diff --git a/Frameworks/Ajax/MooTools/Components/MTAjaxModalContainer.api b/Frameworks/Ajax/MooTools/Components/MTAjaxModalContainer.api
new file mode 100644
index 00000000000..564ecfb7ce1
--- /dev/null
+++ b/Frameworks/Ajax/MooTools/Components/MTAjaxModalContainer.api
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/Frameworks/Ajax/MooTools/Components/MTAjaxObserveField.api b/Frameworks/Ajax/MooTools/Components/MTAjaxObserveField.api
new file mode 100644
index 00000000000..fb7e890e392
--- /dev/null
+++ b/Frameworks/Ajax/MooTools/Components/MTAjaxObserveField.api
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Frameworks/Ajax/MooTools/Components/MTAjaxProgressBar.api b/Frameworks/Ajax/MooTools/Components/MTAjaxProgressBar.api
new file mode 100644
index 00000000000..694883c172f
--- /dev/null
+++ b/Frameworks/Ajax/MooTools/Components/MTAjaxProgressBar.api
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Frameworks/Ajax/MooTools/Components/MTAjaxProgressBar.wo/MTAjaxProgressBar.html b/Frameworks/Ajax/MooTools/Components/MTAjaxProgressBar.wo/MTAjaxProgressBar.html
new file mode 100644
index 00000000000..eacc3c0c212
--- /dev/null
+++ b/Frameworks/Ajax/MooTools/Components/MTAjaxProgressBar.wo/MTAjaxProgressBar.html
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ,
+
+ ( )
+
+
+
+
+
+
+
+
+
+
+
+
+
+ setTimeout(" Update()", );
+
+
+
+
+
\ No newline at end of file
diff --git a/Frameworks/Ajax/MooTools/Components/MTAjaxProgressBar.wo/MTAjaxProgressBar.wod b/Frameworks/Ajax/MooTools/Components/MTAjaxProgressBar.wo/MTAjaxProgressBar.wod
new file mode 100644
index 00000000000..da16fe46da5
--- /dev/null
+++ b/Frameworks/Ajax/MooTools/Components/MTAjaxProgressBar.wo/MTAjaxProgressBar.wod
@@ -0,0 +1,145 @@
+ProgressUpdateContainer : MTAjaxUpdateContainer {
+ id = id;
+ action = refreshing;
+}
+
+HasStatusConditional : WOConditional {
+ condition = progress.status;
+}
+
+Status : WOString {
+ value = progress.status;
+}
+
+ID : WOString {
+ value = id;
+}
+
+ProgressBarVisible : WOConditional {
+ condition = progressBarVisible;
+}
+
+AllowCancelConditional : WOConditional {
+ condition = ^allowCancel;
+}
+
+ProcedureStartedConditional : WOConditional {
+ condition = started;
+}
+
+NotDoneConditional : WOConditional {
+ condition = done;
+ negate = true;
+}
+
+DoneConditional : WOConditional {
+ condition = done;
+}
+
+CancelAction : MTAjaxUpdateLink {
+ updateContainerID = id;
+ action = cancel;
+ class = "cancelAction";
+ disabled = done;
+}
+
+Finished : WOGenericContainer {
+ elementName = "td";
+ width = percentage;
+ class = finishedClass;
+}
+
+Unfinished : WOGenericContainer {
+ elementName = "td";
+ class = "percentageUnfinished";
+}
+
+Value : WOString {
+ value = displayValue;
+}
+
+Maximum : WOString {
+ value = displayMaximum;
+}
+
+CancelText : WOString {
+ value = cancelText;
+}
+
+StartedFunction : WOString {
+ value = ^startedFunction;
+}
+
+FinishedFunction : WOString {
+ value = ^finishedFunction;
+}
+
+CanceledConditional : WOConditional {
+ condition = progress.canceled;
+}
+
+CancelingText : WOString {
+ value = cancelingText;
+}
+
+NotCanceledConditional : WOConditional {
+ condition = progress.canceled;
+ negate = true;
+}
+
+FailedConditional : WOConditional {
+ condition = progress.failed;
+}
+
+SucceededConditional : WOConditional {
+ condition = progress.succeeded;
+}
+
+CanceledFunction : WOString {
+ value = ^canceledFunction;
+}
+
+FailedFunction : WOString {
+ value = ^failedFunction;
+}
+
+SucceededFunction : WOString {
+ value = ^succeededFunction;
+}
+
+ProgressNotStartedConditional : WOConditional {
+ condition = progress.started;
+ negate = true;
+}
+
+StartingText : WOString {
+ value = startingText;
+}
+
+ProgressStartedConditional : WOConditional {
+ condition = progress.started;
+}
+
+ProgressNotDoneConditional : WOConditional {
+ condition = progress.done;
+ negate = true;
+}
+
+FireStartedJavascriptEventsConditional : WOConditional {
+ condition = fireStartedJavascriptEvent;
+}
+
+FireFinishedJavascriptEventsConditional : WOConditional {
+ condition = fireFinishedJavascriptEvents;
+}
+
+Contents : WOComponentContent {
+}
+
+RefreshTime : WOString {
+ value = refreshTime;
+}
+
+ProgressOfText : WOString {
+ value = progressOfText;
+}
\ No newline at end of file
diff --git a/Frameworks/Ajax/MooTools/Components/MTAjaxProgressBar.wo/MTAjaxProgressBar.woo b/Frameworks/Ajax/MooTools/Components/MTAjaxProgressBar.wo/MTAjaxProgressBar.woo
new file mode 100644
index 00000000000..a076a051a7e
--- /dev/null
+++ b/Frameworks/Ajax/MooTools/Components/MTAjaxProgressBar.wo/MTAjaxProgressBar.woo
@@ -0,0 +1,4 @@
+{
+ "WebObjects Release" = "WebObjects 5.0";
+ encoding = "UTF-8";
+}
\ No newline at end of file
diff --git a/Frameworks/Ajax/MooTools/Components/MTAjaxSortableList.wo/MTAjaxSortableList.html b/Frameworks/Ajax/MooTools/Components/MTAjaxSortableList.wo/MTAjaxSortableList.html
new file mode 100644
index 00000000000..b400d3cfb7b
--- /dev/null
+++ b/Frameworks/Ajax/MooTools/Components/MTAjaxSortableList.wo/MTAjaxSortableList.html
@@ -0,0 +1,10 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Frameworks/Ajax/MooTools/Components/MTAjaxSortableList.wo/MTAjaxSortableList.wod b/Frameworks/Ajax/MooTools/Components/MTAjaxSortableList.wo/MTAjaxSortableList.wod
new file mode 100644
index 00000000000..222c6564824
--- /dev/null
+++ b/Frameworks/Ajax/MooTools/Components/MTAjaxSortableList.wo/MTAjaxSortableList.wod
@@ -0,0 +1,35 @@
+AjaxOptions : AjaxOptions {
+ options = createAjaxOptions;
+ onComplete = onComplete;
+}
+
+ContainerID : WOString {
+ value = id;
+}
+
+Content : WOComponentContent {
+
+}
+
+ListContainer : WOGenericContainer {
+ elementName = listElementName;
+ id = id;
+ class = ^listClass;
+ style = ^listStyle;
+}
+
+ListItemContainer : WOGenericContainer {
+ elementName = listItemElementName;
+ id = listItemID;
+ class = ^listItemClass;
+ style = ^listItemStyle;
+}
+
+ListRepetition : WORepetition {
+ list = ^list;
+ item = ^item;
+}
+
+SortableVariableName : WOString {
+ value = var;
+}
\ No newline at end of file
diff --git a/Frameworks/Ajax/MooTools/Components/MTAjaxSortableList.wo/MTAjaxSortableList.woo b/Frameworks/Ajax/MooTools/Components/MTAjaxSortableList.wo/MTAjaxSortableList.woo
new file mode 100644
index 00000000000..a076a051a7e
--- /dev/null
+++ b/Frameworks/Ajax/MooTools/Components/MTAjaxSortableList.wo/MTAjaxSortableList.woo
@@ -0,0 +1,4 @@
+{
+ "WebObjects Release" = "WebObjects 5.0";
+ encoding = "UTF-8";
+}
\ No newline at end of file
diff --git a/Frameworks/Ajax/MooTools/Components/MTAjaxSubmitButton.api b/Frameworks/Ajax/MooTools/Components/MTAjaxSubmitButton.api
new file mode 100644
index 00000000000..006f0bc6319
--- /dev/null
+++ b/Frameworks/Ajax/MooTools/Components/MTAjaxSubmitButton.api
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Frameworks/Ajax/MooTools/Components/MTAjaxTabbedPanel.api b/Frameworks/Ajax/MooTools/Components/MTAjaxTabbedPanel.api
new file mode 100644
index 00000000000..4d957684e8a
--- /dev/null
+++ b/Frameworks/Ajax/MooTools/Components/MTAjaxTabbedPanel.api
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/Frameworks/Ajax/MooTools/Components/MTAjaxTabbedPanelTab.api b/Frameworks/Ajax/MooTools/Components/MTAjaxTabbedPanelTab.api
new file mode 100644
index 00000000000..f6b87ee4a18
--- /dev/null
+++ b/Frameworks/Ajax/MooTools/Components/MTAjaxTabbedPanelTab.api
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Frameworks/Ajax/MooTools/Components/MTAjaxTree.wo/MTAjaxTree.html b/Frameworks/Ajax/MooTools/Components/MTAjaxTree.wo/MTAjaxTree.html
new file mode 100644
index 00000000000..327bef7c775
--- /dev/null
+++ b/Frameworks/Ajax/MooTools/Components/MTAjaxTree.wo/MTAjaxTree.html
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Frameworks/Ajax/MooTools/Components/MTAjaxTree.wo/MTAjaxTree.wod b/Frameworks/Ajax/MooTools/Components/MTAjaxTree.wo/MTAjaxTree.wod
new file mode 100644
index 00000000000..7f28c52d8b2
--- /dev/null
+++ b/Frameworks/Ajax/MooTools/Components/MTAjaxTree.wo/MTAjaxTree.wod
@@ -0,0 +1,96 @@
+CloseULLI : WOString {
+ value = "";
+ escapeHTML = false;
+}
+
+CloseLI : WOString {
+ value = "";
+ escapeHTML = false;
+}
+
+OpenUL : WOString {
+ value = "";
+ escapeHTML = false;
+}
+
+NodeItem : WOString {
+ value = nodeItem;
+ escapeHTML = false;
+}
+
+ContainerID : WOString {
+ value = id;
+}
+
+ToggleFunctionName : WOString {
+ value = toggleFunctionName;
+}
+
+CloseCountRepetition : WORepetition {
+ count = closeCount;
+}
+
+TreeNodeRepetition : WORepetition {
+ list = nodes;
+ item = item;
+}
+
+CollapsedImage : WOImage {
+ filename = collapsedImage;
+ framework = collapsedImageFramework;
+ class = "nodeControl";
+}
+
+ExpandedImage : WOImage {
+ filename = expandedImage;
+ framework = expandedImageFramework;
+ class = "nodeControl";
+}
+
+LeafImage : WOImage {
+ filename = leafImage;
+ framework = leafImageFramework;
+ class = "nodeControl";
+}
+
+IsCollapsedConditional : WOConditional {
+ condition = expanded;
+ negate = true;
+}
+
+IsExpandedConditional : WOConditional {
+ condition = expanded;
+}
+
+IsLeafConditional : WOConditional {
+ condition = leaf;
+}
+
+IsNotLeafConditional : WOConditional {
+ condition = leaf;
+ negate = true;
+}
+
+CollapseAction : MTAjaxUpdateLink {
+ action = collapse;
+ updateContainerID = id;
+ function = toggleFunctionName;
+ class = imageLinkClass;
+}
+
+ExpandAction : MTAjaxUpdateLink {
+ action = expand;
+ updateContainerID = ^id;
+ function = toggleFunctionName;
+ class = imageLinkClass;
+}
+
+TreeNodeRenderer : WOComponentContent {
+}
+
+TreeNodeUpdater : MTAjaxUpdateContainer {
+ id = ^id;
+ class = ^class;
+ elementName = "ul";
+ skipFunction = false;
+}
\ No newline at end of file
diff --git a/Frameworks/Ajax/MooTools/Components/MTAjaxTree.wo/MTAjaxTree.woo b/Frameworks/Ajax/MooTools/Components/MTAjaxTree.wo/MTAjaxTree.woo
new file mode 100644
index 00000000000..a076a051a7e
--- /dev/null
+++ b/Frameworks/Ajax/MooTools/Components/MTAjaxTree.wo/MTAjaxTree.woo
@@ -0,0 +1,4 @@
+{
+ "WebObjects Release" = "WebObjects 5.0";
+ encoding = "UTF-8";
+}
\ No newline at end of file
diff --git a/Frameworks/Ajax/MooTools/Components/MTAjaxUpdateContainer.api b/Frameworks/Ajax/MooTools/Components/MTAjaxUpdateContainer.api
new file mode 100644
index 00000000000..ed108140287
--- /dev/null
+++ b/Frameworks/Ajax/MooTools/Components/MTAjaxUpdateContainer.api
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Frameworks/Ajax/MooTools/Components/MTAjaxUpdateLink.api b/Frameworks/Ajax/MooTools/Components/MTAjaxUpdateLink.api
new file mode 100644
index 00000000000..9d6bfc4e7e5
--- /dev/null
+++ b/Frameworks/Ajax/MooTools/Components/MTAjaxUpdateLink.api
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Frameworks/Ajax/MooTools/Components/MTJSDatePicker.api b/Frameworks/Ajax/MooTools/Components/MTJSDatePicker.api
new file mode 100644
index 00000000000..a8db7d95416
--- /dev/null
+++ b/Frameworks/Ajax/MooTools/Components/MTJSDatePicker.api
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Frameworks/Ajax/MooTools/Components/MTJSDatePicker.wo/MTJSDatePicker.html b/Frameworks/Ajax/MooTools/Components/MTJSDatePicker.wo/MTJSDatePicker.html
new file mode 100644
index 00000000000..0d0868b542c
--- /dev/null
+++ b/Frameworks/Ajax/MooTools/Components/MTJSDatePicker.wo/MTJSDatePicker.html
@@ -0,0 +1,6 @@
+
+
\ No newline at end of file
diff --git a/Frameworks/Ajax/MooTools/Components/MTJSDatePicker.wo/MTJSDatePicker.wod b/Frameworks/Ajax/MooTools/Components/MTJSDatePicker.wo/MTJSDatePicker.wod
new file mode 100644
index 00000000000..de488791b2c
--- /dev/null
+++ b/Frameworks/Ajax/MooTools/Components/MTJSDatePicker.wo/MTJSDatePicker.wod
@@ -0,0 +1,14 @@
+AjaxOptions : AjaxOptions {
+ options = createAjaxOptions;
+}
+
+DateInput : WOTextField {
+ value = ^value;
+ id = ^id;
+ class = classes;
+ dateformat = ^dateformat;
+ style = ^style;
+ size = ^size;
+ maxlength = ^maxlength;
+ name = ^name;
+}
\ No newline at end of file
diff --git a/Frameworks/Ajax/MooTools/Components/MTJSDatePicker.wo/MTJSDatePicker.woo b/Frameworks/Ajax/MooTools/Components/MTJSDatePicker.wo/MTJSDatePicker.woo
new file mode 100644
index 00000000000..a076a051a7e
--- /dev/null
+++ b/Frameworks/Ajax/MooTools/Components/MTJSDatePicker.wo/MTJSDatePicker.woo
@@ -0,0 +1,4 @@
+{
+ "WebObjects Release" = "WebObjects 5.0";
+ encoding = "UTF-8";
+}
\ No newline at end of file
diff --git a/Frameworks/Ajax/MooTools/Components/MTJSSlider.api b/Frameworks/Ajax/MooTools/Components/MTJSSlider.api
new file mode 100644
index 00000000000..c7dd1d28a46
--- /dev/null
+++ b/Frameworks/Ajax/MooTools/Components/MTJSSlider.api
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Frameworks/Ajax/MooTools/Resources/Properties b/Frameworks/Ajax/MooTools/Resources/Properties
new file mode 100644
index 00000000000..35826a5c1d1
--- /dev/null
+++ b/Frameworks/Ajax/MooTools/Resources/Properties
@@ -0,0 +1 @@
+er.ajax.AjaxFileRequestHandler.maxUploadSize=2000000
\ No newline at end of file
diff --git a/Frameworks/Ajax/MooTools/Sources/er/ajax/mootools/MTAccordionComponent.java b/Frameworks/Ajax/MooTools/Sources/er/ajax/mootools/MTAccordionComponent.java
new file mode 100644
index 00000000000..c76567da733
--- /dev/null
+++ b/Frameworks/Ajax/MooTools/Sources/er/ajax/mootools/MTAccordionComponent.java
@@ -0,0 +1,40 @@
+package er.ajax.mootools;
+
+import com.webobjects.appserver.WOActionResults;
+import com.webobjects.appserver.WOContext;
+import com.webobjects.appserver.WORequest;
+import com.webobjects.appserver.WOResponse;
+
+import er.ajax.AjaxComponent;
+
+public class MTAccordionComponent extends AjaxComponent {
+
+ public MTAccordionComponent(WOContext context) {
+ super(context);
+ }
+
+ public boolean isStateless() {
+ return true;
+ }
+
+ public boolean synchronizesVariablesWithBindings() {
+ return false;
+ }
+
+ @Override
+ public WOActionResults handleRequest(WORequest request, WOContext context) {
+ return null;
+ }
+
+ public String label() {
+ return (String) valueForBinding("label");
+ }
+
+ @Override
+ protected void addRequiredWebResources(WOResponse res) {
+ MTAjaxUtils.addScriptResourceInHead(context(), res, "MooTools", MTAjaxUtils.MOOTOOLS_CORE_JS);
+ MTAjaxUtils.addScriptResourceInHead(context(), res, "MooTools", MTAjaxUtils.MOOTOOLS_MORE_JS);
+ MTAjaxUtils.addScriptResourceInHead(context(), res, "MooTools", MTAjaxUtils.MOOTOOLS_WONDER_JS);
+ }
+
+}
\ No newline at end of file
diff --git a/Frameworks/Ajax/MooTools/Sources/er/ajax/mootools/MTAccordionContainer.java b/Frameworks/Ajax/MooTools/Sources/er/ajax/mootools/MTAccordionContainer.java
new file mode 100644
index 00000000000..54b1b1632a1
--- /dev/null
+++ b/Frameworks/Ajax/MooTools/Sources/er/ajax/mootools/MTAccordionContainer.java
@@ -0,0 +1,99 @@
+package er.ajax.mootools;
+
+import com.webobjects.appserver.WOActionResults;
+import com.webobjects.appserver.WOContext;
+import com.webobjects.appserver.WORequest;
+import com.webobjects.appserver.WOResponse;
+import com.webobjects.foundation.NSDictionary;
+import com.webobjects.foundation.NSMutableArray;
+import com.webobjects.foundation.NSMutableDictionary;
+
+import er.ajax.AjaxComponent;
+import er.ajax.AjaxOption;
+import er.extensions.appserver.ERXWOContext;
+
+/**
+ *
+ * A DHTML accordion based on the Accordion Component found in MooTools: http://mootools.net/docs/more/Fx/Fx.Accordion
+ * The class name of the container that contains the label is always "toggler" and the class name of the container that holds the
+ * content is "elements". If anyone has a suggestion on how to set this programatically please email me at jlmiller@kahalawai.com
+ *
+ * @binding display - (integer: defaults to 0) The index of the element to show at start (with a transition). To force all elements to be closed by default, pass in -1.
+ * @binding show - (integer: defaults to 0) The index of the element to be shown initially.
+ * @binding trigger - (string: defaults to 'click') The event that triggers a change in element display.
+ * @binding height - (boolean: defaults to true) If set to true, a height transition effect will take place when switching between displayed elements.
+ * @binding width - (boolean: defaults to false) If set to true, it will add a width transition to the accordion when switching between displayed elements. Warning: CSS mastery is required to make this work!
+ * @binding opacity - (boolean: defaults to true) If set to true, an opacity transition effect will take place when switching between displayed elements.
+ * @binding fixedHeight - (boolean: defaults to false) If set to true, displayed elements will have a fixed height.
+ * @binding fixedWidth - (boolean: defaults to false) If set to true, displayed elements will have a fixed width.
+ * @binding alwaysHide - (boolean: defaults to false) If set to true, it will be possible to close all displayable elements. Otherwise, one will remain open at all time.
+ * @binding initialDisplayFx - (boolean; defaults to true) If set to false, the initial item displayed will not display with an effect but will just be shown immediately.
+ * @binding resetHeight - (boolean; defaults to true) If set to false, the height of an opened accordion section will be set to an absolute pixel size.
+ * @binding onActive - (function: signature = function(toggler, element) {}) a method that is called on the container that is opened.
+ * @binding onBackground - (function: signature = function(toggler, element) {}) a method that is called on the container that is closed.
+ *
+ */
+
+public class MTAccordionContainer extends AjaxComponent {
+
+ private String _accordionID;
+
+ public MTAccordionContainer(WOContext context) {
+ super(context);
+ }
+
+ public String accordionID() {
+
+ if(_accordionID == null) {
+ _accordionID = (String) valueForBinding("id", ERXWOContext.safeIdentifierName(context(), true) + "Accordion");
+ }
+
+ return _accordionID;
+
+ }
+
+ public boolean isStateless() {
+ return true;
+ }
+
+ public String elementClassName() {
+ return valueForStringBinding("elementClassName", "elements");
+ }
+
+ public String togglerClassName() {
+ return valueForStringBinding("togglerClassName", "toggler");
+ }
+
+ @SuppressWarnings({"unchecked","rawtypes"})
+ public NSDictionary createAjaxOptions() {
+ NSMutableArray ajaxOptionsArray = new NSMutableArray();
+ ajaxOptionsArray.addObject(new AjaxOption("display", AjaxOption.NUMBER));
+ ajaxOptionsArray.addObject(new AjaxOption("show", AjaxOption.NUMBER));
+ ajaxOptionsArray.addObject(new AjaxOption("trigger", AjaxOption.STRING));
+ ajaxOptionsArray.addObject(new AjaxOption("height", AjaxOption.BOOLEAN));
+ ajaxOptionsArray.addObject(new AjaxOption("width", AjaxOption.BOOLEAN));
+ ajaxOptionsArray.addObject(new AjaxOption("opacity", AjaxOption.BOOLEAN));
+ ajaxOptionsArray.addObject(new AjaxOption("fixedHeight", AjaxOption.BOOLEAN));
+ ajaxOptionsArray.addObject(new AjaxOption("fixedWidth", AjaxOption.BOOLEAN));
+ ajaxOptionsArray.addObject(new AjaxOption("alwaysHide", AjaxOption.BOOLEAN));
+ ajaxOptionsArray.addObject(new AjaxOption("initialDisplayFx", AjaxOption.BOOLEAN));
+ ajaxOptionsArray.addObject(new AjaxOption("resetHeight", AjaxOption.BOOLEAN));
+ ajaxOptionsArray.addObject(new AjaxOption("onActive", AjaxOption.SCRIPT));
+ ajaxOptionsArray.addObject(new AjaxOption("onBackground", AjaxOption.SCRIPT));
+ NSMutableDictionary options = AjaxOption.createAjaxOptionsDictionary(ajaxOptionsArray, this);
+ return options;
+ }
+
+ @Override
+ protected void addRequiredWebResources(WOResponse res) {
+ MTAjaxUtils.addScriptResourceInHead(context(), res, "MooTools", MTAjaxUtils.MOOTOOLS_CORE_JS);
+ MTAjaxUtils.addScriptResourceInHead(context(), res, "MooTools", MTAjaxUtils.MOOTOOLS_MORE_JS);
+ MTAjaxUtils.addScriptResourceInHead(context(), res, "MooTools", MTAjaxUtils.MOOTOOLS_WONDER_JS);
+ }
+
+ @Override
+ public WOActionResults handleRequest(WORequest request, WOContext context) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+}
\ No newline at end of file
diff --git a/Frameworks/Ajax/MooTools/Sources/er/ajax/mootools/MTAjaxDraggable.java b/Frameworks/Ajax/MooTools/Sources/er/ajax/mootools/MTAjaxDraggable.java
new file mode 100644
index 00000000000..9f05cd139c4
--- /dev/null
+++ b/Frameworks/Ajax/MooTools/Sources/er/ajax/mootools/MTAjaxDraggable.java
@@ -0,0 +1,329 @@
+package er.ajax.mootools;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.WeakHashMap;
+
+import com.webobjects.appserver.WOActionResults;
+import com.webobjects.appserver.WOComponent;
+import com.webobjects.appserver.WOContext;
+import com.webobjects.appserver.WORequest;
+import com.webobjects.appserver.WOResponse;
+import com.webobjects.foundation.NSDictionary;
+import com.webobjects.foundation.NSMutableArray;
+import com.webobjects.foundation.NSMutableDictionary;
+
+import er.ajax.AjaxComponent;
+import er.ajax.AjaxOption;
+import er.ajax.AjaxUtils;
+import er.extensions.appserver.ERXWOContext;
+import er.extensions.components.ERXComponentUtilities;
+
+/*
+ * AjaxDraggable makes HTML elements draggable. Use in conjunction with
+ * {@link AjaxDroppable}. * @binding onBeforeStart - Executed before the Drag instance attaches the events. Receives the dragged element as an argument.
+ * @binding onStart - Executed when the user starts to drag (on mousedown). Receives the dragged element as an argument.
+ * @binding onSnap - Executed when the user has dragged past the snap option. Receives the dragged element as an argument.
+ * @binding onDrag - Executed on every step of the drag. Receives the dragged element and the event as arguments.
+ * @binding onComplete - Executed when the user completes the drag. Receives the dragged element and the event as arguments.
+ * @binding onCancel - Executed when the user has cancelled the drag. Receives the dragged element as an argument.
+ * @binding onDrop- Executed when the element drops. Passes as argument the element and the element dropped on and the event. If dropped on nothing, the second argument is null.
+ * @binding onLeave - Executed when the element leaves one of the droppables.
+ * @binding onEnter - Executed when the element enters one of the droppables.
+ * Options
+ *
+ * @binding grid - (integer: defaults to false) Distance in pixels for snap-to-grid dragging.
+ * @binding handle - (element: defaults to the element passed in) The Element to act as the handle for the draggable element.
+ * @binding invert - (boolean: defaults to false) Whether or not to invert the values reported on start and drag.
+ * @binding limit - (object: defaults to false) An object with x and y dimensions used to limit the movement of the Element.
+ * @binding modifiers - (object: defaults to {'x': 'left', 'y': 'top'}) An object with x and y properties used to indicate the CSS modifiers (i.e. 'left').
+ * @binding style - (boolean: defaults to true) Whether or not to set the modifier as a style property of the element.
+ * @binding snap - (integer: defaults to 6) The distance to drag before the Element starts to respond to the drag.
+ * @binding unit - (string: defaults to 'px') A string indicating the CSS unit to append to all integer values.
+ * @binding preventDefault - (boolean: defaults to false) Calls preventDefault on the event while dragging. See Event:preventDefault
+ * @binding stopPropagation - (boolean: defaults to false) Prevents the event from "bubbling" up in the DOM tree. See Event:stopPropagation
+ * @binding container - (element) If an Element is passed, drag will be limited to the passed Element's size and position.
+ * @binding droppables - String that contains the class names of the droppable elements.
+ * @binding precalculate - (boolean; defaults to false) If true, the class will calculate the locations and dimensions of the droppables which will increase performance. If the droppables are likely to change shape, size, or location it is best to leave this as false.
+ * @binding includeMargins - (boolean; defaults to true) This option only applies when the container option is set. If true (the default) the margins are included in the calculations for the bounding box of the draggable item. This means that if you have a margin on your draggable then the border of the draggable can never touch the edge of the container. Setting it to false ignores this margin.
+ * @binding checkDroppables - (boolean; defaults to true) Checks against the droppables on drag if true.
+ * @binding useSpinner (boolean) use the Spinner class with this request
+ * @binding defaultSpinnerClass inclue the default spinner css class in the headers - if false provide your own.
+ * @binding spinnerOptions - (object) the options object for the Spinner class
+ * @binding spinnerTarget - (mixed) a string of the id for an Element or an Element reference to use instead of the one specifed in the update option. This is useful if you want to overlay a different area (or, say, the parent of the one being updated).
+ *
+ */
+
+
+
+public class MTAjaxDraggable extends AjaxComponent {
+
+ private static final String COMPONENT_DRAGGABLES_MAP_KEY = "AjaxComponentDraggablesMap";
+ private String _id;
+ private String _variableName;
+ private String _draggableIDKeyName;
+ private String _actionUrl;
+ private String _elementID;
+ private String _droppedArea;
+
+ public MTAjaxDraggable(WOContext context) {
+ super(context);
+ }
+
+ public void reset() {
+ _id = null;
+ super.reset();
+ }
+
+ public void awake() {
+ super.awake();
+ _draggableIDKeyName = safeElementID() + "_draggableID";
+ }
+
+ public boolean isStateless() {
+ return Boolean.TRUE;
+ }
+
+ public boolean synchronizesVariablesWithBindings() {
+ return Boolean.FALSE;
+ }
+
+ @SuppressWarnings("rawtypes")
+ public static Object draggableObjectForPage(WOComponent page, String draggableID) {
+ Object droppedObject = null;
+ Map componentDraggablesMap = (Map)page.context().session().objectForKey(MTAjaxDraggable.COMPONENT_DRAGGABLES_MAP_KEY);
+ if(componentDraggablesMap != null) {
+ Map draggablesMap = (Map)componentDraggablesMap.get(page);
+ if(draggablesMap != null) {
+ droppedObject = draggablesMap.get(draggableID);
+ }
+ }
+ return droppedObject;
+ }
+
+ @SuppressWarnings({ "rawtypes", "unchecked" })
+ public void appendToResponse(WOResponse response, WOContext context) {
+
+ _actionUrl = AjaxUtils.ajaxComponentActionUrl(context());
+ _elementID = context.elementID();
+ if(canGetValueForBinding("draggableObject")) {
+ Object draggableObject = valueForBinding("draggableObject");
+ WOComponent page = context().page();
+ Map componentDraggablesMap = (Map)context.session().objectForKey(MTAjaxDraggable.COMPONENT_DRAGGABLES_MAP_KEY);
+ if(componentDraggablesMap == null) {
+ componentDraggablesMap = new WeakHashMap();
+ context.session().setObjectForKey(componentDraggablesMap, MTAjaxDraggable.COMPONENT_DRAGGABLES_MAP_KEY);
+ }
+ Map draggablesMap = (Map)componentDraggablesMap.get(page);
+ if(draggablesMap == null) {
+ draggablesMap = new HashMap();
+ componentDraggablesMap.put(page, draggablesMap);
+ }
+ String id = draggableID();
+ if(draggableObject == null) {
+ draggablesMap.remove(id);
+ } else {
+ draggablesMap.put(id, draggableObject);
+ }
+ }
+ super.appendToResponse(response, context);
+ }
+
+ @SuppressWarnings({ "rawtypes", "unchecked" })
+ public NSDictionary createAjaxOptions() {
+ NSMutableArray ajaxOptionsArray = new NSMutableArray();
+
+ // PROTOTYPE OPTIONS
+ ajaxOptionsArray.addObject(new AjaxOption("grid", AjaxOption.NUMBER));
+ ajaxOptionsArray.addObject(new AjaxOption("handle", AjaxOption.STRING));
+ ajaxOptionsArray.addObject(new AjaxOption("invert", AjaxOption.BOOLEAN));
+ ajaxOptionsArray.addObject(new AjaxOption("limit", AjaxOption.DICTIONARY));
+ ajaxOptionsArray.addObject(new AjaxOption("modifiers", AjaxOption.DICTIONARY));
+ ajaxOptionsArray.addObject(new AjaxOption("snap", AjaxOption.NUMBER));
+ ajaxOptionsArray.addObject(new AjaxOption("style", AjaxOption.BOOLEAN));
+ ajaxOptionsArray.addObject(new AjaxOption("unit", AjaxOption.STRING));
+ ajaxOptionsArray.addObject(new AjaxOption("preventDefault", AjaxOption.BOOLEAN));
+ ajaxOptionsArray.addObject(new AjaxOption("stopPropagation", AjaxOption.BOOLEAN));
+
+ ajaxOptionsArray.addObject(new AjaxOption("container", AjaxOption.STRING));
+ ajaxOptionsArray.addObject(new AjaxOption("droppables", AjaxOption.STRING));
+ ajaxOptionsArray.addObject(new AjaxOption("precalculate", AjaxOption.BOOLEAN));
+ ajaxOptionsArray.addObject(new AjaxOption("includeMargins", AjaxOption.BOOLEAN));
+ ajaxOptionsArray.addObject(new AjaxOption("checkDroppables", AjaxOption.BOOLEAN));
+
+ ajaxOptionsArray.addObject(new AjaxOption("onBeforeStart", AjaxOption.SCRIPT));
+ ajaxOptionsArray.addObject(new AjaxOption("onStart", AjaxOption.SCRIPT));
+ ajaxOptionsArray.addObject(new AjaxOption("onSnap", AjaxOption.SCRIPT));
+ ajaxOptionsArray.addObject(new AjaxOption("onCancel", AjaxOption.SCRIPT));
+ ajaxOptionsArray.addObject(new AjaxOption("onComplete", AjaxOption.SCRIPT));
+ ajaxOptionsArray.addObject(new AjaxOption("onDrag", AjaxOption.SCRIPT));
+ ajaxOptionsArray.addObject(new AjaxOption("onDrop", AjaxOption.SCRIPT));
+
+ ajaxOptionsArray.addObject(new AjaxOption("onEnter", AjaxOption.SCRIPT));
+ ajaxOptionsArray.addObject(new AjaxOption("onLeave", AjaxOption.SCRIPT));
+
+ ajaxOptionsArray.addObject(new AjaxOption("ghost", Boolean.FALSE, AjaxOption.BOOLEAN));
+ ajaxOptionsArray.addObject(new AjaxOption("useSpinner", AjaxOption.BOOLEAN));
+ ajaxOptionsArray.addObject(new AjaxOption("spinnerTarget", AjaxOption.STRING));
+ ajaxOptionsArray.addObject(new AjaxOption("spinnerOptions", AjaxOption.DICTIONARY));
+
+ NSMutableDictionary options = AjaxOption.createAjaxOptionsDictionary(ajaxOptionsArray, this);
+
+ return options;
+
+ }
+
+ public String draggableID() {
+ String draggableID;
+ if(canGetValueForBinding("draggableID")) {
+ draggableID = (String)valueForBinding("draggableID");
+ } else {
+ draggableID = id();
+ }
+ return draggableID;
+ }
+
+ public String id() {
+ if(_id == null) {
+ if(canGetValueForBinding("id") && valueForBinding("id") != null) {
+ _id = (String) valueForBinding("id");
+ } else {
+ _id = safeElementID();
+ if(canSetValueForBinding("id")) {
+ setValueForBinding(_id, "id");
+ }
+ }
+ }
+ return _id;
+ }
+
+ public String variableName() {
+ if(_variableName == null) {
+ _variableName = (String)valueForStringBinding("variableName", "mtAD" + ERXWOContext.safeIdentifierName(context(), true));
+ }
+ return _variableName;
+ }
+
+ public boolean ghost() {
+ return (Boolean)valueForBinding("ghost", Boolean.FALSE);
+ }
+
+ public String quotedID() {
+ return AjaxUtils.quote(id());
+ }
+
+ public String quotedContextID() {
+ return AjaxUtils.quote(context().contextID());
+ }
+
+ public String quotedElementID() {
+ return AjaxUtils.quote(_elementID);
+ }
+
+ public String elementName() {
+ return (String)valueForBinding("elementName", "div");
+ }
+
+ public String updateContainerID() {
+ return (String) valueForBinding("updateContainerID");
+ }
+
+ public String quotedUpdateContainerID() {
+ return AjaxUtils.quote(updateContainerID());
+ }
+
+ public String quotedActionUrl() {
+ boolean submit = ERXComponentUtilities.booleanValueForBinding(this, "submit", false);
+ String actionUrl = (submit && updateContainerID() == null) ? null : _actionUrl;
+ return actionUrl != null ? AjaxUtils.quote(_actionUrl) : null;
+ }
+
+ public String quotedDraggableKeyName() {
+ return AjaxUtils.quote(_draggableIDKeyName);
+ }
+
+ public boolean submit() {
+ return ERXComponentUtilities.booleanValueForBinding(this, "submit", false);
+ }
+
+ public String form() {
+ return (String) valueForBinding("formName");
+ }
+
+ /*
+ @SuppressWarnings("unused")
+ public String onDrop() {
+
+ boolean submit = ERXComponentUtilities.booleanValueForBinding(this, "submit", false);
+
+ String contextID = AjaxUtils.quote(context().contextID());
+ String elementID = AjaxUtils.quote(_elementID);
+ String droppableElementID = AjaxUtils.quote((String)valueForBinding("id"));
+ String draggableKeyName = AjaxUtils.quote(_draggableIDKeyName);
+ String updateContainerID = AjaxUtils.quote((String) valueForBinding("updateContainerID"));
+ String actionUrl = (submit && updateContainerID == null) ? null : AjaxUtils.quote(_actionUrl);
+ String form = (String) valueForBinding("formName");
+
+ if(submit) {
+ if(form == null) {
+ form = ERXWOForm.formName(context(), null);
+ if(form == null) {
+ throw new IllegalArgumentException("If submit is true, you must provide either a formName or your containing form must have a name.");
+ }
+ }
+ form = "document." + form;
+ }
+
+ return "function(element, droppable) { if(droppable) { element.destroy(); MTAUL.update("+updateContainerID+", { updateUrl: " + actionUrl + "}, " + contextID + " + '.' + " + elementID + ", null); }}";
+ }
+ */
+
+ @Override
+ protected void addRequiredWebResources(WOResponse res) {
+
+ MTAjaxUtils.addScriptResourceInHead(context(), res, "MooTools", MTAjaxUtils.MOOTOOLS_CORE_JS);
+ MTAjaxUtils.addScriptResourceInHead(context(), res, "MooTools", MTAjaxUtils.MOOTOOLS_MORE_JS);
+ Boolean useSpinner = booleanValueForBinding("useSpinner", false);
+ if(useSpinner) {
+ Boolean useDefaultSpinnerClass = booleanValueForBinding("defaultSpinnerClass", true);
+ if(useDefaultSpinnerClass) {
+ MTAjaxUtils.addScriptResourceInHead(context(), res, "MooTools", "scripts/plugins/spinner/spinner.css");
+ }
+ }
+
+ MTAjaxUtils.addScriptResourceInHead(context(), res, "MooTools", MTAjaxUtils.MOOTOOLS_WONDER_JS);
+ }
+
+ @Override
+ public WOActionResults handleRequest(WORequest request, WOContext context) {
+
+ MTAjaxUpdateContainer.setUpdateContainerID(request, (String) valueForBinding("updateContainerID"));
+ String droppedDraggableID = request.stringFormValueForKey(_draggableIDKeyName);
+ _droppedArea = request.stringFormValueForKey("dropAreaID");
+
+ if (canSetValueForBinding("droppedDraggableID")) {
+ setValueForBinding(droppedDraggableID, "droppedDraggableID");
+ }
+
+ if (canSetValueForBinding("droppedObject")) {
+ WOComponent page = context.page();
+ Object droppedObject = MTAjaxDraggable.draggableObjectForPage(page, droppedDraggableID);
+ setValueForBinding(droppedObject, "droppedObject");
+ }
+
+ if(canSetValueForBinding("droppedArea")) {
+ setValueForBinding(_droppedArea, "droppedArea");
+ }
+
+ if (canGetValueForBinding("action")) {
+ WOActionResults results = (WOActionResults) valueForBinding("action");
+ if (results != null) {
+ System.out.println("MTAjaxDroppable.handleRequest: Not quite sure what to do with non-null results yet ...");
+ }
+ }
+ return null;
+ }
+
+
+
+}
\ No newline at end of file
diff --git a/Frameworks/Ajax/MooTools/Sources/er/ajax/mootools/MTAjaxFileUpload.java b/Frameworks/Ajax/MooTools/Sources/er/ajax/mootools/MTAjaxFileUpload.java
new file mode 100644
index 00000000000..5eb0916d875
--- /dev/null
+++ b/Frameworks/Ajax/MooTools/Sources/er/ajax/mootools/MTAjaxFileUpload.java
@@ -0,0 +1,390 @@
+package er.ajax.mootools;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.OutputStream;
+import java.text.NumberFormat;
+
+import com.webobjects.appserver.WOActionResults;
+import com.webobjects.appserver.WOApplication;
+import com.webobjects.appserver.WOComponent;
+import com.webobjects.appserver.WOContext;
+import com.webobjects.appserver.WOResponse;
+import com.webobjects.foundation.NSData;
+
+import er.ajax.AjaxFileUpload;
+import er.ajax.AjaxFileUploadRequestHandler;
+import er.ajax.AjaxResponse;
+import er.ajax.AjaxUploadProgress;
+import er.ajax.AjaxUtils;
+import er.extensions.appserver.ERXRequest;
+import er.extensions.appserver.ERXWOContext;
+import er.extensions.components.ERXComponentUtilities;
+import er.extensions.formatters.ERXUnitAwareDecimalFormat;
+import er.extensions.foundation.ERXFileUtilities;
+
+/**
+ * AjaxFileUpload provides an Ajax wrapper around the file upload process. This works pretty differently than
+ * WOFileUpload. The AjaxFileUpload component itself provides its own form and autosubmits when the user selects a file
+ * to upload. The upload runs in a hidden iframe, with Ajax updates occurring in the main window. When the final ajax
+ * update occurs after the completion of the upload, the appropriate actions fire. This means that if the user navigates
+ * away during the upload, no completion/failure/etc notifications will occur.
+ *
+ * @binding cancelText the text to display for the cancel link
+ * @binding cancelingText the text to display when the progress is being canceled
+ * @binding startingText the text to display when the progress is starting
+ * @binding startedFunction the javascript function to execute when the progress is started
+ * @binding canceledFunction the javascript function to execute when the upload is canceled
+ * @binding succeededFunction the javascript function to execute when the upload succeeds
+ * @binding failedFunction the javascript function to execute when the upload fails
+ * @binding finishedFunction the javascript function to execute when the upload finishes (succeeded, failed, or
+ * canceled)
+ * @binding finishedAction the action to fire when the upload finishes (cancel, failed, or succeeded)
+ * @binding canceledAction the action to fire when the upload is canceled
+ * @binding succeededAction the action to fire when the upload succeeded
+ * @binding failedAction the action to fire when the upload fails
+ * @binding data the NSData that will be bound with the contents of the upload
+ * @binding inputStream will be bound to an input stream on the contents of the upload
+ * @binding outputStream the output stream to write the contents of the upload to
+ * @binding streamToFilePath the path to write the upload to, can be a directory
+ * @binding finalFilePath the final file path of the upload (when streamToFilePath is set or keepTempFile = true)
+ * @binding filePath the name of the uploaded file
+ * @binding allowCancel if true, the cancel link is visible
+ * @binding progressBarBeforeStart if true, the progress bar is visible before the upload is started
+ * @binding progressBarAfterDone if true, the progress bar is visible after the upload is done
+ * @binding refreshTime the number of milliseconds to wait between refreshes
+ * @binding keepTempFile if true, don't delete the temp file that AjaxFileUpload creates
+ * @binding uploadLabel the label to display on the Upload button ("Upload" by default)
+ * @binding uploadFunctionName the upload button will instead be a function with the given name
+ * @binding progressOfText the text to display for the word "of" in the "[size] of [totalsize]" string during upload
+ * @binding mimeType set from the content-type of the upload header if available
+ * @binding class the class attribute of the file input
+ * @binding style the style attribute of the file input
+ * @binding id the id attribute of the file input
+ * @binding onFileSelected optional JS code that is called when the file selection changes. To auto-start the upload when
+ * a file is selected, set uploadFunctionName to e.g. "startUpload" and onFileSelected to "startUpload()"
+ * @binding uploadProgress access to the underlying AjaxUploadProgress object
+ *
+ * @author mschrag
+ */
+
+
+public class MTAjaxFileUpload extends WOComponent {
+
+ private static boolean _requestHandlerRegistered = false;
+
+ private String _id;
+ protected boolean _uploadStarted;
+ protected AjaxUploadProgress _progress;
+ protected boolean _triggerUploadStart;
+ private String _requestHandlerKey;
+
+
+ public MTAjaxFileUpload(WOContext context) {
+ super(context);
+ _requestHandlerKey = AjaxFileUploadRequestHandler.REQUEST_HANDLER_KEY;
+ if (!_requestHandlerRegistered) {
+ synchronized (AjaxFileUpload.class) {
+ if (!_requestHandlerRegistered) {
+ if (WOApplication.application().requestHandlerForKey(AjaxFileUploadRequestHandler.REQUEST_HANDLER_KEY) == null) {
+ WOApplication.application().registerRequestHandler(new AjaxFileUploadRequestHandler(), AjaxFileUploadRequestHandler.REQUEST_HANDLER_KEY);
+ }
+ _requestHandlerRegistered = true;
+ }
+ }
+ }
+ }
+
+ public void setRequestHandlerKey(String requestHandlerKey) {
+ _requestHandlerKey = requestHandlerKey;
+ }
+
+ public String requestHandlerKey() {
+ return _requestHandlerKey;
+ }
+
+ public boolean synchronizesVariablesWithBindings() {
+ return false;
+ }
+
+ public String uploadLabel() {
+ String uploadLabel = (String)valueForBinding("uploadLabel");
+ if (uploadLabel == null) {
+ uploadLabel = "Upload";
+ }
+ return uploadLabel;
+ }
+
+ public boolean progressBarBeforeStart() {
+ boolean progressBarBeforeStart = false;
+ if (hasBinding("progressBarBeforeStart")) {
+ progressBarBeforeStart = ERXComponentUtilities.booleanValueForBinding(this, "progressBarBeforeStart");
+ }
+ return progressBarBeforeStart;
+ }
+
+ public boolean progressBarAfterDone() {
+ boolean progressBarAfterDone = false;
+ if (hasBinding("progressBarAfterDone")) {
+ progressBarAfterDone = ERXComponentUtilities.booleanValueForBinding(this, "progressBarAfterDone");
+ }
+ return progressBarAfterDone;
+ }
+
+ public void setUploadProgress(AjaxUploadProgress progress) {
+ _progress = progress;
+ if (hasBinding("uploadProgress")) {
+ setValueForBinding(progress, "uploadProgress");
+ }
+ if (progress == null && !hasBinding("uploadStarted")) {
+ _uploadStarted = false;
+ }
+ }
+
+ public AjaxUploadProgress uploadProgress() {
+ return _progress;
+ }
+
+ public String id() {
+ String id = _id;
+ if (id == null) {
+ id = (String) valueForBinding("id");
+ if (id == null) {
+ id = ERXWOContext.safeIdentifierName(context(), true);
+ }
+ _id = id;
+ }
+ return id;
+ }
+
+ public String uploadUrl() {
+ String uploadUrl = context().urlWithRequestHandlerKey(_requestHandlerKey, "", null);
+ return uploadUrl;
+ }
+
+ public String bytesReadSize() {
+ String bytesReadSize = null;
+ AjaxUploadProgress progress = uploadProgress();
+ if (progress != null) {
+ NumberFormat formatter = new ERXUnitAwareDecimalFormat(ERXUnitAwareDecimalFormat.BYTE);
+ formatter.setMaximumFractionDigits(2);
+ bytesReadSize = formatter.format(progress.value());
+ }
+ return bytesReadSize;
+ }
+
+ public String streamLengthSize() {
+ String streamLengthSize = null;
+ AjaxUploadProgress progress = uploadProgress();
+ if (progress != null) {
+ NumberFormat formatter = new ERXUnitAwareDecimalFormat(ERXUnitAwareDecimalFormat.BYTE);
+ formatter.setMaximumFractionDigits(2);
+ streamLengthSize = formatter.format(progress.maximum());
+ }
+ return streamLengthSize;
+ }
+
+ public String uploadFrameName() {
+ return id() + "UploadFrame";
+ }
+
+ public String startUploadName() {
+ return id() + "StartUpload";
+ }
+
+ public String startUploadFunctionCall() {
+ return "form.submit(true); " + startUploadName() + "();";
+ }
+
+ public boolean triggerStartUpload() {
+ boolean triggerUploadStart = _triggerUploadStart;
+ if (triggerUploadStart) {
+ _triggerUploadStart = false;
+ }
+ return triggerUploadStart;
+ }
+
+ public String uploadFormID() {
+ return id() + "Form";
+ }
+
+ public String progressBarID() {
+ return id() + "ProgressBar";
+ }
+
+ public String startingText() {
+ String startingText = (String) valueForBinding("startingText");
+ if (startingText == null) {
+ startingText = "Upload Starting ...";
+ }
+ return startingText;
+ }
+
+ public String cancelText() {
+ String cancelText = (String) valueForBinding("cancelText");
+ if (cancelText == null) {
+ cancelText = "cancel";
+ }
+ return cancelText;
+ }
+
+ public String cancelingText() {
+ String cancelingText = (String) valueForBinding("cancelingText");
+ if (cancelingText == null) {
+ cancelingText = "Canceling Upload ...";
+ }
+ return cancelingText;
+ }
+
+ public WOActionResults startUpload() {
+ _triggerUploadStart = true;
+ if (_progress != null) {
+ _progress.reset();
+ }
+ _progress = null;
+ if (hasBinding("uploadProgress")) {
+ setValueForBinding(null, "uploadProgress");
+ }
+
+ _uploadStarted = true;
+ if (hasBinding("uploadStarted")) {
+ setValueForBinding(Boolean.TRUE, "uploadStarted");
+ }
+
+ AjaxResponse response = AjaxUtils.createResponse(context().request(), context());
+ AjaxUtils.appendScriptHeaderIfNecessary(context().request(), response);
+ response.appendContentString("document." + uploadFormID() + ".submit();");
+ AjaxUtils.appendScriptFooterIfNecessary(context().request(), response);
+ return response;
+ }
+
+ public boolean isUploadStarted() {
+ boolean uploadStarted;
+ if (hasBinding("uploadStarted")) {
+ uploadStarted = ERXComponentUtilities.booleanValueForBinding(this, "uploadStarted");
+ }
+ else {
+ AjaxUploadProgress progress = uploadProgress();
+ if (progress != null && progress.shouldReset()) {
+ _uploadStarted = false;
+ setValueForBinding(Boolean.FALSE, "uploadStarted");
+ }
+ uploadStarted = _uploadStarted;
+ }
+ return uploadStarted;
+ }
+
+ public void uploadFinished() {
+ valueForBinding("finishedAction");
+ }
+
+ public WOActionResults uploadCanceled() {
+ uploadFinished();
+ WOActionResults results = (WOActionResults) valueForBinding("canceledAction");
+ return results;
+ }
+
+ public WOActionResults uploadSucceeded() {
+ AjaxUploadProgress progress = uploadProgress();
+ try {
+ boolean deleteFile = true;
+ if (hasBinding("filePath")) {
+ setValueForBinding(progress.fileName(), "filePath");
+ }
+
+ if (hasBinding("data")) {
+ NSData data = new NSData(progress.tempFile().toURL());
+ setValueForBinding(data, "data");
+ }
+
+ if (hasBinding("mimeType")) {
+ String contentType = progress.contentType();
+ if (contentType != null) {
+ setValueForBinding(contentType, "mimeType");
+ }
+ }
+
+ if (hasBinding("inputStream")) {
+ setValueForBinding(new FileInputStream(progress.tempFile()), "inputStream");
+ deleteFile = false;
+ }
+
+ if (hasBinding("outputStream")) {
+ OutputStream outputStream = (OutputStream) valueForBinding("outputStream");
+ if (outputStream != null) {
+ ERXFileUtilities.writeInputStreamToOutputStream(new FileInputStream(progress.tempFile()), true, outputStream, true);
+ }
+ }
+
+ String finalFilePath = progress.tempFile().getAbsolutePath();
+ if (hasBinding("streamToFilePath")) {
+ File streamToFile = new File((String) valueForBinding("streamToFilePath"));
+ boolean renamedFile;
+ boolean renameFile;
+ if (streamToFile.exists()) {
+ boolean overwrite = ERXComponentUtilities.booleanValueForBinding(this, "overwrite");
+ if (streamToFile.isDirectory()) {
+ File parentDir = streamToFile;
+ String fileName = ERXFileUtilities.fileNameFromBrowserSubmittedPath(progress.fileName());
+ streamToFile = ERXFileUtilities.reserveUniqueFile(new File(parentDir, fileName), overwrite);
+ renameFile = true;
+ }
+ else {
+ renameFile = overwrite;
+ }
+ }
+ else {
+ renameFile = true;
+ }
+
+ if (renameFile && !streamToFile.isDirectory()) {
+ ERXFileUtilities.renameTo(progress.tempFile(), streamToFile);
+ renamedFile = true;
+ }
+ else {
+ renamedFile = false;
+ progress.setFailure(new Exception ("Could not rename file."));
+ return this.uploadFailed();
+ }
+
+ if (renamedFile) {
+ finalFilePath = streamToFile.getAbsolutePath();
+ }
+
+ deleteFile = false;
+ }
+ else if (hasBinding("keepTempFile") && deleteFile) {
+ deleteFile = !ERXComponentUtilities.booleanValueForBinding(this, "keepTempFile");
+ }
+
+ if (deleteFile) {
+ progress.dispose();
+ }
+ else if (hasBinding("finalFilePath")) {
+ setValueForBinding(finalFilePath, "finalFilePath");
+ }
+
+ }
+ catch (Throwable t) {
+ t.printStackTrace();
+ progress.setFailure(t);
+ return this.uploadFailed();
+ }
+ finally {
+ uploadFinished();
+ }
+ WOActionResults results = (WOActionResults) valueForBinding("succeededAction");
+ return results;
+ }
+
+ public WOActionResults uploadFailed() {
+ uploadFinished();
+ WOActionResults results = (WOActionResults) valueForBinding("failedAction");
+ return results;
+ }
+
+ public String srcUrl() {
+ return ERXWOContext._directActionURL(context(), "ERXDirectAction/empty", null, ERXRequest.isRequestSecure(context().request()));
+ }
+
+}
\ No newline at end of file
diff --git a/Frameworks/Ajax/MooTools/Sources/er/ajax/mootools/MTAjaxModalContainer.java b/Frameworks/Ajax/MooTools/Sources/er/ajax/mootools/MTAjaxModalContainer.java
new file mode 100644
index 00000000000..4a9865f71d3
--- /dev/null
+++ b/Frameworks/Ajax/MooTools/Sources/er/ajax/mootools/MTAjaxModalContainer.java
@@ -0,0 +1,296 @@
+package er.ajax.mootools;
+
+import java.net.MalformedURLException;
+
+import com.webobjects.appserver.WOActionResults;
+import com.webobjects.appserver.WOAssociation;
+import com.webobjects.appserver.WOComponent;
+import com.webobjects.appserver.WOContext;
+import com.webobjects.appserver.WOElement;
+import com.webobjects.appserver.WORequest;
+import com.webobjects.appserver.WOResponse;
+import com.webobjects.foundation.NSDictionary;
+import com.webobjects.foundation.NSForwardException;
+import com.webobjects.foundation.NSMutableArray;
+import com.webobjects.foundation.NSMutableDictionary;
+
+import er.ajax.AjaxDynamicElement;
+import er.ajax.AjaxOption;
+import er.ajax.AjaxOptions;
+import er.ajax.AjaxUpdateContainer;
+import er.ajax.AjaxUtils;
+import er.extensions.appserver.ERXRequest;
+import er.extensions.appserver.ERXWOContext;
+import er.extensions.foundation.ERXMutableURL;
+
+public class MTAjaxModalContainer extends AjaxDynamicElement {
+
+ private String _updateContainerID = null;
+ private String _url = null;
+
+ public MTAjaxModalContainer(String name, NSDictionary associations, WOElement children) {
+ super(name, associations, children);
+ }
+
+ public void appendToResponse(WOResponse response, WOContext context) {
+
+ WOComponent component = context.component();
+
+ String linkID = (String) valueForBinding("id", component);
+ if(linkID == null) {
+ linkID = ERXWOContext.safeIdentifierName(context, false);
+ }
+ String containerID = (String) valueForBinding("containerID", linkID + "Container", component);
+
+ String linkElementName = (String)valueForBinding("linkElementName", "a", component);
+ String label = (String)valueForBinding("label", "Open", component);
+
+ _url = (String) valueForBinding("href", component);
+ if(_url == null) {
+ String directActionName = stringValueForBinding("directActionName", component);
+
+ if(directActionName != null) {
+ NSDictionary queryDictionary = (NSDictionary)valueForBinding("queryDictionary", component);
+ boolean secure = booleanValueForBinding("secure", ERXRequest.isRequestSecure(context.request()), component);
+ if(secure) {
+ boolean generatingCompleteURLs = (context instanceof ERXWOContext) ? ((ERXWOContext)context)._generatingCompleteURLs() : false;
+ if(!generatingCompleteURLs) {
+ context._generateCompleteURLs();
+ }
+ try {
+ _url = context._directActionURL(directActionName, queryDictionary, secure);
+ ERXMutableURL u = new ERXMutableURL(_url);
+ u.addQueryParameter(String.valueOf(System.currentTimeMillis()), null);
+ _url = u.toExternalForm();
+ } catch (MalformedURLException e) {
+ throw new NSForwardException(e);
+ } finally {
+ if(!generatingCompleteURLs) {
+ context._generateRelativeURLs();
+ }
+ }
+ } else {
+ _url = context.directActionURLForActionNamed(directActionName, queryDictionary);
+ }
+ }
+ }
+
+ boolean isAjax = booleanValueForBinding("ajax", false, component);
+ if(_url == null) {
+ if(isAjax) {
+ if(valueForBinding("id", component) == null) {
+ throw new IllegalArgumentException("If ajax = 'true', you must also bind 'id'");
+ }
+ _url = AjaxUtils.ajaxComponentActionUrl(context);
+ } else if (associations().objectForKey("action") != null) {
+ _url = context.componentActionURL();
+ }
+ if(_url == null) {
+ _url = "#" + containerID;
+ }
+ }
+
+ response.appendContentString("<");
+ response.appendContentString(linkElementName);
+ appendTagAttributeToResponse(response, "id", linkID);
+ appendTagAttributeToResponse(response, "href", _url);
+ appendTagAttributeToResponse(response, "title", valueForBinding("title", component));
+ appendTagAttributeToResponse(response, "value", valueForBinding("value", component));
+ appendTagAttributeToResponse(response, "class", valueForBinding("class", component));
+ appendTagAttributeToResponse(response, "style", valueForBinding("style", component));
+ response.appendContentString(">");
+ response.appendContentString(label);
+ response.appendContentString("");
+ response.appendContentString(linkElementName);
+ response.appendContentString(">");
+
+ Boolean autoWrapContent = (Boolean)valueForBinding("autoWrapContent", true, component);
+ Boolean showFooter = (Boolean)valueForBinding("showFooter", true, component);
+ Boolean showTitle = (Boolean)valueForBinding("showTitle", true, component);
+ String modalClassNames = (String)valueForBinding("modalClassNames", "modal fade", component);
+ _updateContainerID = null;
+ if(_url.startsWith("#")) {
+
+ response.appendContentString("\n");
+
+ String title = stringValueForBinding("title", component);
+ if(showTitle && title != null) {
+ response.appendContentString("\n\t");
+ }
+
+ if(autoWrapContent) {
+ response.appendContentString("\n\t
");
+ }
+
+ appendChildrenToResponse(response, context);
+
+ if(autoWrapContent) {
+ response.appendContentString("\n\t
");
+ }
+
+ if(showFooter) {
+ response.appendContentString("\n\t");
+ }
+
+ response.appendContentString("
");
+
+ } else {
+ _updateContainerID = containerID;
+ response.appendContentString("\n");
+
+ String title = stringValueForBinding("title", component);
+ if(showTitle && title != null) {
+ response.appendContentString("\n\t");
+ }
+
+ if(autoWrapContent) {
+ String modalBodyID = stringValueForBinding("modalBodyID", component);
+ if(modalBodyID == null) {
+ modalBodyID = "modalBody" + ERXWOContext.safeIdentifierName(context, false);
+ }
+ _updateContainerID = modalBodyID;
+ response.appendContentString("\n\t
");
+
+ }
+
+ if(autoWrapContent) {
+ response.appendContentString("\n\t
");
+ }
+
+ if(showFooter) {
+ response.appendContentString("\n\t");
+ }
+
+ response.appendContentString("
");
+
+
+ }
+
+ String varName = stringValueForBinding("varName", component);
+ if(varName == null) {
+ varName = "bsPopUp" + ERXWOContext.safeIdentifierName(context, false);
+ }
+
+ AjaxUtils.appendScriptHeader(response);
+ response.appendContentString("\nwindow.addEvent('domready', function() {");
+ response.appendContentString("\n\tvar ");
+ response.appendContentString(varName);
+ response.appendContentString(" = new Bootstrap.Popup('");
+ response.appendContentString(containerID);
+ response.appendContentString("', {");
+ if(_updateContainerID != null) {
+ response.appendContentString("onShow: function() { ");
+ response.appendContentString("\n\tnew Request.HTML(");
+ AjaxOptions.appendToResponse(createAjaxOptions(component), response, context);
+ response.appendContentString(").send();");
+ response.appendContentString("}");
+ }
+ response.appendContentString("});");
+ response.appendContentString("\n\tdocument.id('");
+ response.appendContentString(linkID);
+ response.appendContentString("').addEvent('click', function(e) { e.preventDefault(); this.show(); }.bind(");
+ response.appendContentString(varName);
+ response.appendContentString("));");
+ response.appendContentString("\n})");
+ AjaxUtils.appendScriptFooter(response);
+ super.appendToResponse(response, context);
+ }
+
+ protected String _containerID(WOContext context) {
+ String id = (String) valueForBinding("id", context.component());
+ return id;
+ }
+
+ @SuppressWarnings({ "rawtypes", "unchecked" })
+ public NSDictionary createAjaxOptions(WOComponent component) {
+
+ NSMutableArray ajaxOptionsArray = new NSMutableArray();
+ ajaxOptionsArray.addObject(new AjaxOption("async", AjaxOption.BOOLEAN));
+ ajaxOptionsArray.addObject(new AjaxOption("onRequest", AjaxOption.FUNCTION));
+ ajaxOptionsArray.addObject(new AjaxOption("onComplete", AjaxOption.FUNCTION));
+ ajaxOptionsArray.addObject(new AjaxOption("onSuccess", AjaxOption.FUNCTION_2));
+ ajaxOptionsArray.addObject(new AjaxOption("onFailure", AjaxOption.FUNCTION));
+ ajaxOptionsArray.addObject(new AjaxOption("onException", AjaxOption.SCRIPT));
+ ajaxOptionsArray.addObject(new AjaxOption("evalScripts", AjaxOption.BOOLEAN));
+ ajaxOptionsArray.addObject(new AjaxOption("useSpinner", AjaxOption.BOOLEAN));
+ ajaxOptionsArray.addObject(new AjaxOption("spinnerTarget", AjaxOption.STRING));
+ ajaxOptionsArray.addObject(new AjaxOption("spinnerOptions", AjaxOption.DICTIONARY));
+
+ NSMutableDictionary options = AjaxOption.createAjaxOptionsDictionary(ajaxOptionsArray, component, associations());
+ options.setObjectForKey("'" + _url + "'", "url");
+ options.setObjectForKey("'" + _updateContainerID + "'", "update");
+ options.setObjectForKey("'get'", "method");
+
+ if (options.objectForKey("async") == null) {
+ options.setObjectForKey("true", "async");
+ }
+ if (options.objectForKey("evalScripts") == null) {
+ options.setObjectForKey("true", "evalScripts");
+ }
+
+ AjaxUpdateContainer.expandInsertionFromOptions(options, this, component);
+ return options;
+
+ }
+
+ @Override
+ protected void addRequiredWebResources(WOResponse response, WOContext context) {
+ MTAjaxUtils.addScriptResourceInHead(context, context.response(), "MooTools", MTAjaxUtils.MOOTOOLS_CORE_JS);
+ MTAjaxUtils.addScriptResourceInHead(context, context.response(), "MooTools", MTAjaxUtils.MOOTOOLS_MORE_JS);
+ MTAjaxUtils.addScriptResourceInHead(context, context.response(), "MooTools", "scripts/plugins/bootstrap/ui/Bootstrap.js");
+ MTAjaxUtils.addScriptResourceInHead(context, context.response(), "MooTools", "scripts/plugins/bootstrap/behaviors/Behavior.js");
+ MTAjaxUtils.addScriptResourceInHead(context, context.response(), "MooTools", "scripts/plugins/bootstrap/behaviors/Behavior.BS.Popup.js");
+ MTAjaxUtils.addScriptResourceInHead(context, context.response(), "MooTools", "scripts/plugins/bootstrap/ui/Bootstrap.Popup.js");
+ MTAjaxUtils.addScriptResourceInHead(context, context.response(), "MooTools", "scripts/plugins/bootstrap/ui/CSSEvents.js");
+ MTAjaxUtils.addScriptResourceInHead(context, context.response(), "MooTools", MTAjaxUtils.MOOTOOLS_WONDER_JS);
+ }
+
+ @Override
+ public WOActionResults handleRequest(WORequest request, WOContext context) {
+ System.out.println("Hello?");
+ WOComponent component = context.component();
+
+ WOResponse response = null;
+ WOAssociation action = (WOAssociation)associations().objectForKey("action");
+ if(action != null) {
+ action.valueInComponent(component);
+ }
+
+ if(booleanValueForBinding("ajax", false, component) && hasChildrenElements()) {
+ response = AjaxUtils.createResponse(request, context);
+ AjaxUtils.setPageReplacementCacheKey(context, _containerID(context));
+ appendChildrenToResponse(response, context);
+ }
+
+ return response;
+
+ }
+
+
+
+
+}
\ No newline at end of file
diff --git a/Frameworks/Ajax/MooTools/Sources/er/ajax/mootools/MTAjaxObserveField.java b/Frameworks/Ajax/MooTools/Sources/er/ajax/mootools/MTAjaxObserveField.java
new file mode 100644
index 00000000000..9e99836e788
--- /dev/null
+++ b/Frameworks/Ajax/MooTools/Sources/er/ajax/mootools/MTAjaxObserveField.java
@@ -0,0 +1,203 @@
+package er.ajax.mootools;
+
+import com.webobjects.appserver.WOActionResults;
+import com.webobjects.appserver.WOComponent;
+import com.webobjects.appserver.WOContext;
+import com.webobjects.appserver.WOElement;
+import com.webobjects.appserver.WORequest;
+import com.webobjects.appserver.WOResponse;
+import com.webobjects.foundation.NSDictionary;
+import com.webobjects.foundation.NSMutableArray;
+import com.webobjects.foundation.NSMutableDictionary;
+
+import er.ajax.AjaxDynamicElement;
+import er.ajax.AjaxOption;
+import er.ajax.AjaxOptions;
+import er.ajax.AjaxSubmitButton;
+import er.ajax.AjaxUpdateContainer;
+import er.ajax.AjaxUtils;
+import er.extensions.appserver.ERXWOContext;
+import er.extensions.appserver.ajax.ERXAjaxApplication;
+
+/**
+ * AjaxObserveField allows you to perform an Ajax submit (and optional update) based
+ * on the state of a form field changing. If you specify an observeFieldID, that
+ * single field will be observed for changes. If you also specify an updateContainerID,
+ * the given container will be refreshed after the field changes. If you do NOT specify
+ * an observeFieldID, all of the form fields contained within this component will be
+ * observed for changes instead. The list of form fields to observe is obtained on
+ * the client side, so you should not put AjaxUpdateContainers INSIDE of this component
+ * or any fields inside of the container will no be observed after an update. Instead,
+ * AjaxObserveFields should be surrounded by a container.
+ *
+ * If you leave of observeFieldID, AjaxObserveField must generate an HTML container, so
+ * that it can find the form fields that correspond to this component from the client
+ * side.
+ *
+ * @binding id the ID of the observe field container (only useful if you leave off observeFieldID).
+ * @binding elementName element to use for the observe field container. Defaults to div
.
+ * (Only used if you leave off observeFieldID)
+ * @binding observeFieldID the ID of the field to observe
+ * @binding updateContainerID the ID of the container to update. Specify "_parent" to use the nearest one.
+ * @binding action the action to call when the observer fires
+ * @binding onBeforeSubmit called prior to submitting the observed content; return false to deny the submit
+ * @binding observeFieldFrequency the polling observe frequency (in seconds)
+ * @binding observeDelay the minimum time between submits (in seconds)
+ * @binding fullSubmit When false, only the value of the field that changed is sent to the server (partial submit),
+ * when true, the whole form is sent. Defaults to false.
+ * Caution: Partial submit doesn't work correctly if you manually set the name on your inputs.
+ * @binding class CSS class to use on the container. (Only used if you leave off observeFieldID)
+ * @binding style CSS style to use on the container. (Only used if you leave off observeFieldID)
+ * @binding onCreate Takes a JavaScript function which is called after the form has been serialized,
+ * but befor the Ajax request is sent to the server. Useful e.g. if you want to disable the
+ * form while the ajax request is running.
+ */
+
+public class MTAjaxObserveField extends AjaxDynamicElement {
+
+ public MTAjaxObserveField(String name, NSDictionary associations, WOElement children) {
+ super(name, associations, children);
+ }
+
+
+
+ @SuppressWarnings({"rawtypes","unchecked"})
+ public NSMutableDictionary createAjaxOptions(WOComponent component) {
+
+ NSMutableArray ajaxOptionsArray = new NSMutableArray();
+ ajaxOptionsArray.addObject(new AjaxOption("observeFieldFrequency", AjaxOption.NUMBER));
+ ajaxOptionsArray.addObject(new AjaxOption("observeDelay", AjaxOption.NUMBER));
+ ajaxOptionsArray.addObject(new AjaxOption("onCancel", AjaxOption.FUNCTION));
+ ajaxOptionsArray.addObject(new AjaxOption("onComplete", AjaxOption.FUNCTION));
+ ajaxOptionsArray.addObject(new AjaxOption("onException", AjaxOption.FUNCTION));
+ ajaxOptionsArray.addObject(new AjaxOption("onFailure", AjaxOption.FUNCTION));
+ ajaxOptionsArray.addObject(new AjaxOption("onRequest", AjaxOption.FUNCTION));
+ ajaxOptionsArray.addObject(new AjaxOption("onSuccess", AjaxOption.FUNCTION_2));
+ ajaxOptionsArray.addObject(new AjaxOption("async", AjaxOption.BOOLEAN));
+ ajaxOptionsArray.addObject(new AjaxOption("evalScripts", AjaxOption.BOOLEAN));
+ ajaxOptionsArray.addObject(new AjaxOption("useSpinner", AjaxOption.BOOLEAN));
+ ajaxOptionsArray.addObject(new AjaxOption("spinnerTarget", AjaxOption.STRING));
+ ajaxOptionsArray.addObject(new AjaxOption("spinnerOptions", AjaxOption.DICTIONARY));
+
+ NSMutableDictionary options = AjaxOption.createAjaxOptionsDictionary(ajaxOptionsArray, component, associations());
+ return options;
+
+ }
+
+ @SuppressWarnings("rawtypes")
+ public void appendToResponse(WOResponse response, WOContext context) {
+
+ super.appendToResponse(response, context);
+
+ WOComponent component = context.component();
+ String observeFieldID = (String) valueForBinding("observeFieldID", component);
+ String updateContainerID = MTAjaxUpdateContainer.updateContainerID(this, component);
+ NSMutableDictionary options = createAjaxOptions(component);
+ boolean fullSubmit = booleanValueForBinding("fullSubmit", false, component);
+ boolean observeFieldDescendents;
+
+ if (observeFieldID != null) {
+ observeFieldDescendents = false;
+ }
+ else {
+ observeFieldDescendents = true;
+ observeFieldID = (String)valueForBinding("id", component);
+ if (observeFieldID == null) {
+ observeFieldID = ERXWOContext.safeIdentifierName(context, false);
+ }
+ String elementName = (String)valueForBinding("elementName", component);
+ if (elementName == null) {
+ elementName = "div";
+ }
+ response.appendContentString("<" + elementName + " id = \"" + observeFieldID + "\"");
+
+ String className = stringValueForBinding("class", component);
+ if (className != null && className.length() > 0) {
+ response.appendContentString(" class=\"" + className + "\"");
+ }
+
+ String style = stringValueForBinding("style", component);
+ if (style != null && style.length() > 0) {
+ response.appendContentString(" style=\"" + style + "\"");
+ }
+
+ response.appendContentString(">");
+ if (hasChildrenElements()) {
+ appendChildrenToResponse(response, context);
+ }
+ response.appendContentString("" + elementName + ">");
+ }
+ AjaxUtils.appendScriptHeader(response);
+ MTAjaxObserveField.appendToResponse(response, context, this, observeFieldID, observeFieldDescendents, updateContainerID, fullSubmit, options);
+ AjaxUtils.appendScriptFooter(response);
+ }
+
+ public static void appendToResponse(WOResponse response, WOContext context, AjaxDynamicElement element, String observeFieldID, boolean observeDescendentFields, String updateContainerID, boolean fullSubmit, NSMutableDictionary options) {
+ WOComponent component = context.component();
+ String submitButtonName = nameInContext(context, component, element);
+ NSMutableDictionary observerOptions = new NSMutableDictionary();
+ if (options != null) {
+ observerOptions.addEntriesFromDictionary(options);
+ }
+ AjaxSubmitButton.fillInAjaxOptions(element, component, submitButtonName, observerOptions);
+
+ Object observeFieldFrequency = observerOptions.removeObjectForKey("observeFieldFrequency");
+ if (observeDescendentFields) {
+ response.appendContentString("MTASB.observeDescendentFields");
+ }
+ else {
+ response.appendContentString("MTASB.observeField");
+ }
+
+ Object observeDelay = observerOptions.removeObjectForKey("observeDelay");
+ response.appendContentString("(" + AjaxUtils.quote(updateContainerID) + ", " + AjaxUtils.quote(observeFieldID) + ", " + observeFieldFrequency + ", " + (!fullSubmit) + ", " + observeDelay + ", ");
+ AjaxOptions.appendToResponse(observerOptions, response, context);
+ response.appendContentString(");");
+ }
+
+
+ @Override
+ protected void addRequiredWebResources(WOResponse response, WOContext context) {
+ MTAjaxUtils.addScriptResourceInHead(context, context.response(), "MooTools", MTAjaxUtils.MOOTOOLS_CORE_JS);
+ MTAjaxUtils.addScriptResourceInHead(context, context.response(), "MooTools", MTAjaxUtils.MOOTOOLS_MORE_JS);
+ Boolean useSpinner = (Boolean)valueForBinding("useSpinner", Boolean.FALSE, context.component());
+ if(useSpinner) {
+ Boolean useDefaultSpinnerClass = (Boolean)valueForBinding("defaultSpinnerClass", Boolean.TRUE, context.component());
+ if(useDefaultSpinnerClass) {
+ MTAjaxUtils.addStylesheetResourceInHead(context, context.response(), "MooTools", "scripts/plugins/spinner/spinner.css");
+ }
+ }
+
+ MTAjaxUtils.addScriptResourceInHead(context, context.response(), "MooTools", MTAjaxUtils.MOOTOOLS_WONDER_JS);
+ }
+
+ public static String nameInContext(WOContext context, WOComponent component, AjaxDynamicElement element) {
+ return (String) element.valueForBinding("name", context.elementID(), component);
+ }
+
+ @Override
+ public WOActionResults invokeAction(WORequest request, WOContext context) {
+ WOActionResults result = null;
+ WOComponent wocomponent = context.component();
+ String nameInContext = nameInContext(context, wocomponent, this);
+ boolean shouldHandleRequest = !context._wasActionInvoked() && context._wasFormSubmitted() && nameInContext.equals(ERXAjaxApplication.ajaxSubmitButtonName(request));
+ if (shouldHandleRequest) {
+ String updateContainerID = MTAjaxUpdateContainer.updateContainerID(this, wocomponent);
+ AjaxUpdateContainer.setUpdateContainerID(request, updateContainerID);
+ context._setActionInvoked(true);
+ result = (WOActionResults)valueForBinding("action", wocomponent);
+ if (result == null) {
+ result = handleRequest(request, context);
+ }
+ AjaxUtils.updateMutableUserInfoWithAjaxInfo(context);
+ } else {
+ result = invokeChildrenAction(request, context);
+ }
+ return result;
+ }
+
+ public WOActionResults handleRequest(WORequest request, WOContext context) {
+ WOResponse response = AjaxUtils.createResponse(request, context);
+ return response;
+ }
+}
\ No newline at end of file
diff --git a/Frameworks/Ajax/MooTools/Sources/er/ajax/mootools/MTAjaxProgressBar.java b/Frameworks/Ajax/MooTools/Sources/er/ajax/mootools/MTAjaxProgressBar.java
new file mode 100644
index 00000000000..9e6319aa253
--- /dev/null
+++ b/Frameworks/Ajax/MooTools/Sources/er/ajax/mootools/MTAjaxProgressBar.java
@@ -0,0 +1,335 @@
+package er.ajax.mootools;
+
+import java.text.NumberFormat;
+
+import com.webobjects.appserver.WOActionResults;
+import com.webobjects.appserver.WOComponent;
+import com.webobjects.appserver.WOContext;
+
+import er.ajax.AjaxProgress;
+import er.ajax.AjaxProgressBar;
+import er.extensions.appserver.ERXWOContext;
+import er.extensions.components.ERXComponentUtilities;
+
+/**
+ * @binding id the id of the update container
+ * @binding progressID the id of the AjaxProgress
+ * @binding progress the progress object for this progress bar (can bind a new progress back out if one is in the
+ * registry)
+ * @binding startedFunction the javascript function to execute when the progress is started
+ * @binding canceledFunction the javascript function to execute when the progress is canceled
+ * @binding succeededFunction the javascript function to execute when the progress succeeds
+ * @binding failedFunction the javascript function to execute when the progress fails
+ * @binding finishedFunction the javascript function to execute when the progress finishes (succeeded, failed, or
+ * canceled)
+ * @binding cancelText the text to display for the cancel link
+ * @binding cancelingText the text to display when the progress is being canceled
+ * @binding startingText the text to display when the progress is starting
+ * @binding progressOfText the text to display for the word "of" in the "[size] of [totalsize]" string during upload
+ * @binding finishedAction the action to fire when the progress finishes (cancel, failed, or succeeded)
+ * @binding canceledAction the action to fire when the progress is canceled
+ * @binding succeededAction the action to fire when the progress succeeded
+ * @binding failedAction the action to fire when the progress fails
+ * @binding started boolean of whether or not the progress has started (i.e. begin polling)
+ * @binding allowCancel if true, the cancel link is visible
+ * @binding visibleBeforeStart if true, the progress bar is visible before the activity is started
+ * @binding visibleAfterDone if true, the progress bar is visible after the activity is done
+ * @binding refreshTime the number of milliseconds to wait between refreshes
+ *
+ * @author mschrag
+ */
+
+public class MTAjaxProgressBar extends WOComponent {
+
+ private String _id;
+ private boolean _running;
+ private AjaxProgress _progress;
+ private boolean _completionEventsFired;
+ private boolean _fireFinishedJavascriptEvents;
+ private boolean _fireStartedJavascriptEvent;
+
+ public MTAjaxProgressBar(WOContext context) {
+ super(context);
+ }
+
+ public boolean synchronizesVariablesWithBindings() {
+ return false;
+ }
+
+ public boolean fireStartedJavascriptEvent() {
+ boolean fireStartedJavascriptEvent = _fireStartedJavascriptEvent;
+ if (fireStartedJavascriptEvent) {
+ _fireStartedJavascriptEvent = false;
+ }
+ return fireStartedJavascriptEvent;
+ }
+
+ public boolean fireFinishedJavascriptEvents() {
+ boolean fireFinishedJavascriptEvents = _fireFinishedJavascriptEvents;
+ if (fireFinishedJavascriptEvents) {
+ _fireFinishedJavascriptEvents = false;
+ }
+ return fireFinishedJavascriptEvents;
+ }
+
+ public boolean progressBarVisible() {
+ boolean visible = true;
+ AjaxProgress progress = progress();
+ if (!isStarted()) {
+ if (hasBinding("visibleBeforeStart")) {
+ visible = ERXComponentUtilities.booleanValueForBinding(this, "visibleBeforeStart");
+ }
+ }
+ else if (done() && !_fireFinishedJavascriptEvents) {
+ if (hasBinding("visibleAfterDone")) {
+ visible = ERXComponentUtilities.booleanValueForBinding(this, "visibleAfterDone");
+ }
+ }
+ return visible;
+ }
+
+ public String startingText() {
+ String startingText = (String) valueForBinding("startingText");
+ if (startingText == null) {
+ startingText = "Starting ...";
+ }
+ return startingText;
+ }
+
+ public String cancelingText() {
+ String cancelingText = (String) valueForBinding("cancelingText");
+ if (cancelingText == null) {
+ cancelingText = "Canceling ...";
+ }
+ return cancelingText;
+ }
+
+ public AjaxProgress progress() {
+ if (_progress != null && _progress.shouldReset()) {
+ _progress = null;
+ setValueForBinding(null, "progress");
+ }
+ if (_progress == null) {
+ _progress = (AjaxProgress) valueForBinding("progress");
+ if (_progress != null && _progress.shouldReset()) {
+ _progress = null;
+ setValueForBinding(null, "progress");
+ }
+ if (_progress == null) {
+ _progress = AjaxProgressBar.progress(session(), progressID());
+ if (_progress != null) {
+ if (_progress.shouldReset()) {
+ AjaxProgressBar.unregisterProgress(session(), _progress);
+ _progress = null;
+ }
+ setValueForBinding(_progress, "progress");
+ }
+ }
+ }
+ return _progress;
+ }
+
+ public String progressID() {
+ String progressID = (String) valueForBinding("progressID");
+ if (progressID == null) {
+ progressID = id();
+ }
+ return progressID;
+ }
+
+ public String id() {
+ String id = _id;
+ if (id == null) {
+ id = (String) valueForBinding("id");
+ if (id == null) {
+ id = ERXWOContext.safeIdentifierName(context(), true);
+ }
+ _id = id;
+ }
+ return id;
+ }
+
+ public String finishedClass() {
+ String finishedClass;
+ String percentage = percentage();
+ if ("0".equals(percentage)) {
+ finishedClass = "percentageUnfinished";
+ }
+ else {
+ AjaxProgress progress = progress();
+ if (progress != null && progress.isDone()) {
+ finishedClass = "percentageFinished done";
+ }
+ else {
+ finishedClass = "percentageFinished";
+ }
+ }
+ return finishedClass;
+ }
+
+ public Object displayValue() {
+ Object displayValue = valueForBinding("displayValue");
+ if (displayValue == null) {
+ AjaxProgress progress = progress();
+ if (progress != null) {
+ displayValue = String.valueOf(progress.value());
+ }
+ else {
+ displayValue = "";
+ }
+ }
+ return displayValue;
+ }
+
+ public Object displayMaximum() {
+ Object displayMaximum = valueForBinding("displayMaximum");
+ if (displayMaximum == null) {
+ AjaxProgress progress = progress();
+ if (progress != null) {
+ displayMaximum = String.valueOf(progress.maximum());
+ }
+ else {
+ displayMaximum = "";
+ }
+ }
+ return displayMaximum;
+ }
+
+ public String percentage() {
+ AjaxProgress progress = progress();
+ String percentageStr;
+ if (progress == null || progress.isSucceeded()) {
+ percentageStr = "0";
+ }
+ else {
+
+ double percentage = progress.percentage() * 100.0;
+ if (percentage < 5) {
+ percentageStr = "0";
+ }
+ else {
+ percentageStr = NumberFormat.getIntegerInstance().format(percentage) + "%";
+ }
+ }
+ return "width: " + percentageStr;
+ }
+
+ public boolean isStarted() {
+ boolean started;
+ if (hasBinding("started")) {
+ started = ERXComponentUtilities.booleanValueForBinding(this, "started");
+ }
+ else {
+ started = (progress() != null || _running);
+ }
+ return started;
+ }
+
+ public String cancelText() {
+ String cancelText = (String) valueForBinding("cancelText");
+ if (cancelText == null) {
+ cancelText = "cancel";
+ }
+ return cancelText;
+ }
+
+ public String progressOfText() {
+ String progressOfText = (String) valueForBinding("progressOfText");
+ if (progressOfText == null) {
+ progressOfText = "of";
+ }
+ return progressOfText;
+ }
+
+ public String onChange() {
+ return id() + "AjaxProgress.start()";
+ }
+
+ protected void _checkForCompletion() {
+ AjaxProgress progress = progress();
+ if (progress != null) {
+ if (progress.isDone()) {
+ if (!progress.completionEventsFired()) {
+ if (progress.isCanceled()) {
+ progressCanceled();
+ }
+ else if (progress.isFailed()) {
+ progressFailed();
+ }
+ else if (progress.isSucceeded()) {
+ progressSucceeded();
+ }
+ progress.setCompletionEventsFired(true);
+ _fireFinishedJavascriptEvents = true;
+ }
+ }
+ }
+ }
+
+ public boolean done() {
+ boolean done = false;
+ AjaxProgress progress = progress();
+ if (progress != null) {
+ done = progress.isDone() && progress.completionEventsFired();
+ }
+ return done;
+ }
+
+ public String refreshTime() {
+ String refreshTimeStr;
+ Object refreshTime = valueForBinding("refreshTime");
+ if (refreshTime == null) {
+ refreshTimeStr = "1000";
+ }
+ else {
+ refreshTimeStr = refreshTime.toString();
+ }
+ return refreshTimeStr;
+ }
+
+ public WOActionResults refreshing() {
+ if (!_running) {
+ _fireStartedJavascriptEvent = true;
+ }
+ _running = true;
+ _checkForCompletion();
+ return null;
+ }
+
+ public WOActionResults cancel() {
+ AjaxProgress progress = progress();
+ if (progress != null) {
+ progress.cancel();
+ }
+ return null;
+ }
+
+ protected void finished() {
+ if (_progress != null) {
+ AjaxProgressBar.unregisterProgress(session(), _progress);
+ }
+ _running = false;
+ valueForBinding("finishedAction");
+ }
+
+ protected void progressCanceled() {
+ finished();
+ valueForBinding("canceledAction");
+ }
+
+ protected void progressSucceeded() {
+ AjaxProgress progress = progress();
+ finished();
+ valueForBinding("succeededAction");
+ }
+
+ protected void progressFailed() {
+ finished();
+ valueForBinding("failedAction");
+ }
+
+ public String progressBarContainerClass() {
+ return valueForStringBinding("progressBarContainerClass", "progress");
+ }
+
+}
\ No newline at end of file
diff --git a/Frameworks/Ajax/MooTools/Sources/er/ajax/mootools/MTAjaxSortableList.java b/Frameworks/Ajax/MooTools/Sources/er/ajax/mootools/MTAjaxSortableList.java
new file mode 100644
index 00000000000..a5d14848c2c
--- /dev/null
+++ b/Frameworks/Ajax/MooTools/Sources/er/ajax/mootools/MTAjaxSortableList.java
@@ -0,0 +1,236 @@
+package er.ajax.mootools;
+
+import java.util.NoSuchElementException;
+
+import com.webobjects.appserver.WOActionResults;
+import com.webobjects.appserver.WOContext;
+import com.webobjects.appserver.WORequest;
+import com.webobjects.appserver.WOResponse;
+import com.webobjects.eocontrol.EOKeyValueQualifier;
+import com.webobjects.eocontrol.EOQualifier;
+import com.webobjects.foundation.NSArray;
+import com.webobjects.foundation.NSDictionary;
+import com.webobjects.foundation.NSKeyValueCodingAdditions;
+import com.webobjects.foundation.NSMutableArray;
+import com.webobjects.foundation.NSMutableDictionary;
+import com.webobjects.foundation.NSRange;
+
+import er.ajax.AjaxComponent;
+import er.ajax.AjaxOption;
+import er.ajax.AjaxUtils;
+
+public class MTAjaxSortableList extends AjaxComponent {
+
+ private String _id;
+ private String _actionUrl;
+ private String _sortOrderKeyName;
+ private String _var;
+
+ public MTAjaxSortableList(WOContext context) {
+ super(context);
+ }
+
+ public void appendToResponse(WOResponse response, WOContext context) {
+
+ _actionUrl = AjaxUtils.ajaxComponentActionUrl(context);
+ _id = hasBinding("id") ? (String) valueForBinding("id") : safeElementID();
+ _var = hasBinding("var") ? (String) valueForBinding("var") : safeElementID();
+
+ _sortOrderKeyName = safeElementID();
+
+ super.appendToResponse(response, context);
+
+ }
+
+ public String listElementName() {
+ return valueForStringBinding("listElementName", "ul");
+ }
+
+ public String listItemElementName() {
+ return valueForStringBinding("listItemElementName", "li");
+ }
+
+ public String listItemID(String itemID) {
+ String listID = (String) valueForBinding("id");
+ String listItemIDWithoutIndex = listID + "_" + itemID;
+ return listItemIDWithoutIndex;
+ }
+
+ public String listItemID() {
+ Object item = valueForBinding("item");
+ String listItemIDKeyPath = (String) valueForBinding("listItemIDKeyPath");
+ String itemID = String.valueOf(NSKeyValueCodingAdditions.Utility.valueForKeyPath(item, listItemIDKeyPath));
+ String listItemID = listItemID(itemID);
+ return listItemID;
+ }
+
+ @Override
+ protected void addRequiredWebResources(WOResponse res) {
+ MTAjaxUtils.addScriptResourceInHead(context(), res, "MooTools", MTAjaxUtils.MOOTOOLS_CORE_JS);
+ MTAjaxUtils.addScriptResourceInHead(context(), res, "MooTools", MTAjaxUtils.MOOTOOLS_MORE_JS);
+ }
+
+ @Override
+ public WOActionResults handleRequest(WORequest request, WOContext context) {
+ if(!canGetValueForBinding("list")) {
+ throw new IllegalArgumentException("You must specify a readable 'list'.");
+ }
+
+ if (!canGetValueForBinding("listItemIDKeyPath")) {
+ throw new IllegalArgumentException("You must specify 'listItemIDKeyPath' if you specify 'list'.");
+ }
+
+ String listItemIDKeyPath = (String) valueForBinding("listItemIDKeyPath");
+ Object listItemIDArrayObj = request.formValues().objectForKey(_sortOrderKeyName + "[]");
+ NSArray listItemIDArray;
+
+ if (listItemIDArrayObj instanceof NSArray) {
+ listItemIDArray = (NSArray) listItemIDArrayObj;
+ }
+ else if (listItemIDArrayObj instanceof String) {
+ String listItemIDStr = (String) listItemIDArrayObj;
+ listItemIDArray = new NSArray(listItemIDStr);
+ }
+ else {
+ throw new IllegalArgumentException("Unknown list item ID array " + listItemIDArrayObj);
+ }
+
+
+ NSArray list = (NSArray) valueForBinding("list");
+ boolean mutableList = (list instanceof NSMutableArray);
+ NSMutableArray reorderedList;
+
+ if(mutableList) {
+ reorderedList = (NSMutableArray) list;
+ } else {
+ reorderedList = new NSMutableArray();
+ }
+
+ int startIndex = 0;
+ if(canGetValueForBinding("startIndex")) {
+ Number startIndexNumber = (Number) valueForBinding("startIndex");
+ startIndex = startIndexNumber.intValue();
+ if(!mutableList) {
+ for(int i = 0; i < startIndex; i++) {
+ reorderedList.addObject(list.objectAtIndex(i));
+ }
+ }
+ }
+
+ int listItemIDCount = listItemIDArray.count();
+ for(int listItemIDIndex = 0; listItemIDIndex < listItemIDCount; listItemIDIndex++) {
+
+ String itemID = (String) listItemIDArray.objectAtIndex(listItemIDIndex);
+ NSRange itemPageRange;
+
+ if(mutableList) {
+ itemPageRange = new NSRange(startIndex + listItemIDIndex, listItemIDCount - listItemIDIndex);
+ } else {
+ itemPageRange = new NSRange(startIndex, listItemIDCount);
+ }
+
+ NSArray itemPageArray = list.subarrayWithRange(itemPageRange);
+ EOQualifier itemIDQualifier = new EOKeyValueQualifier(listItemIDKeyPath, EOQualifier.QualifierOperatorEqual, itemID);
+ NSArray matchingItems = EOQualifier.filteredArrayWithQualifier(itemPageArray, itemIDQualifier);
+
+ if(matchingItems.count() == 0) {
+ throw new NoSuchElementException("There was no item that matched the ID '" + itemID + "' in " + list + ".");
+ } else if(matchingItems.count() > 1) {
+ throw new IllegalStateException("There was more than one item that matched the ID '" + itemID + "' in " + list + ".");
+ }
+
+ Object replacingItem = matchingItems.objectAtIndex(0);
+
+ if(mutableList) {
+ int replacedItemIndex = itemPageRange.location();
+ Object replacedItem = reorderedList.objectAtIndex(replacedItemIndex);
+ if(replacedItem != replacingItem) {
+ int replacingItemIndex = replacedItemIndex + itemPageArray.indexOfObject(replacingItem);
+ reorderedList.replaceObjectAtIndex(replacingItem, replacedItemIndex);
+ reorderedList.replaceObjectAtIndex(replacedItem, replacingItemIndex);
+ }
+ } else {
+ reorderedList.addObject(replacingItem);
+ }
+
+ if(! mutableList) {
+ int listCount = list.count();
+ for(int i = startIndex + reorderedList.count(); i < listCount; i++) {
+ reorderedList.addObject(list.objectAtIndex(i));
+ }
+ setValueForBinding(reorderedList, "list");
+ }
+
+ if(canGetValueForBinding("action")) {
+ WOActionResults results = (WOActionResults) valueForBinding("action");
+ if(results != null) {
+ System.out.println("Not quite sure what to do with non-null results yet ...");
+ }
+ }
+
+ }
+
+ return null;
+ }
+
+
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ public NSDictionary createAjaxOptions() {
+ NSMutableArray ajaxOptionsArray = new NSMutableArray();
+ ajaxOptionsArray.addObject(new AjaxOption("clone", AjaxOption.BOOLEAN));
+ ajaxOptionsArray.addObject(new AjaxOption("constrain", AjaxOption.BOOLEAN));
+ ajaxOptionsArray.addObject(new AjaxOption("handle", AjaxOption.STRING));
+ ajaxOptionsArray.addObject(new AjaxOption("onComplete", AjaxOption.SCRIPT));
+ ajaxOptionsArray.addObject(new AjaxOption("onSort", AjaxOption.SCRIPT));
+ ajaxOptionsArray.addObject(new AjaxOption("onStart", AjaxOption.SCRIPT));
+ ajaxOptionsArray.addObject(new AjaxOption("opacity", AjaxOption.NUMBER));
+ ajaxOptionsArray.addObject(new AjaxOption("revert", AjaxOption.STRING));
+ ajaxOptionsArray.addObject(new AjaxOption("snap", AjaxOption.NUMBER));
+ NSMutableDictionary options = AjaxOption.createAjaxOptionsDictionary(ajaxOptionsArray, this);
+ return options;
+ }
+
+ public String onComplete() {
+ StringBuilder onCompleteBuffer = new StringBuilder();
+ onCompleteBuffer.append("function(container) {");
+ onCompleteBuffer.append("var data = ").append(var()).append(".serialize(false, function(element, index) {\n")
+ .append("return '").append(_sortOrderKeyName).append("[]' + '=' + element.getProperty('id').replace('").append(_sortOrderKeyName).append("_','');}).join('&');");
+ onCompleteBuffer.append("var ajaxRequest = new Request({url: '").append(_actionUrl).append("'}).send( { method: 'get', data: data } );");
+ if(canGetValueForBinding("onComplete")) {
+ String onComplete = (String) valueForBinding("onComplete");
+ onCompleteBuffer.append(" var parentOnComplete = ")
+ .append(onComplete).append(";").append("parentOnUpdate(container);");
+ }
+ onCompleteBuffer.append("}");
+
+ return onCompleteBuffer.toString();
+ }
+
+
+ public boolean synchronizesVariablesWithBindings() {
+ return false;
+ }
+
+ public void setId(String id) {
+ this._id = id;
+ }
+
+ public String getId() {
+ return _id;
+ }
+
+ /**
+ * @return the var
+ */
+ public String var() {
+ return _var;
+ }
+
+ /**
+ * @param var the var to set
+ */
+ public void setVar(String var) {
+ this._var = var;
+ }
+
+}
\ No newline at end of file
diff --git a/Frameworks/Ajax/MooTools/Sources/er/ajax/mootools/MTAjaxSubmitButton.java b/Frameworks/Ajax/MooTools/Sources/er/ajax/mootools/MTAjaxSubmitButton.java
new file mode 100644
index 00000000000..8684dcc9456
--- /dev/null
+++ b/Frameworks/Ajax/MooTools/Sources/er/ajax/mootools/MTAjaxSubmitButton.java
@@ -0,0 +1,407 @@
+package er.ajax.mootools;
+
+import com.webobjects.appserver.WOActionResults;
+import com.webobjects.appserver.WOComponent;
+import com.webobjects.appserver.WOContext;
+import com.webobjects.appserver.WOElement;
+import com.webobjects.appserver.WORequest;
+import com.webobjects.appserver.WOResponse;
+import com.webobjects.appserver._private.WODynamicElementCreationException;
+import com.webobjects.foundation.NSDictionary;
+import com.webobjects.foundation.NSMutableArray;
+import com.webobjects.foundation.NSMutableDictionary;
+
+import er.ajax.AjaxDynamicElement;
+import er.ajax.AjaxOption;
+import er.ajax.AjaxOptions;
+import er.ajax.AjaxSubmitButton;
+import er.ajax.AjaxUpdateContainer;
+import er.ajax.AjaxUtils;
+import er.ajax.IAjaxElement;
+import er.extensions.appserver.ajax.ERXAjaxApplication;
+import er.extensions.components._private.ERXWOForm;
+import er.extensions.foundation.ERXProperties;
+import er.extensions.foundation.ERXStringUtilities;
+
+/**
+ * AjaxSubmitButton behaves just like a WOSubmitButton except that it submits in the background with an Ajax.Request.
+ *
+ * @binding name the HTML name of this submit button (optional)
+ * @binding value the HTML value of this submit button (optional)
+ * @binding action the action to execute when this button is pressed
+ * @binding id the HTML ID of this submit button
+ * @binding class the HTML class of this submit button
+ * @binding style the HTML style of this submit button
+ * @binding title the HTML title of this submit button
+ * @binding onClick arbitrary Javascript to execute when the client clicks the button
+ * @binding onClickBefore if the given function returns true, the onClick is executed. This is to support confirm(..) dialogs.
+ * @binding onClickServer if the action defined in the action binding returns null, the value of this binding will be returned as javascript from the server
+ * @binding async boolean defining if the update request is sent asynchronously or synchronously, defaults to true
+ * @binding accesskey hot key that should trigger the link (optional)
+ * @binding onCancel Fired when a request has been cancelled.
+ * @binding onClickBefore if the given function returns true, the onClick is executed. This is to support confirm(..) dialogs.
+ * @binding onClick JS function, called after the click on the client
+ * @binding onComplete Fired when the Request is completed.
+ * @binding onException Fired when setting a request header fails.
+ * @binding onFailure Fired when the request failed (error status code).
+ * @binding onRequest Fired when the Request is sent.
+ * @binding onSuccess(responseTree, responseElements, responseHTML, responseJavaScript) Fired when the Request is completed successfully.
+ * @binding evalScripts evaluate scripts on the result
+ * @binding button if false, it will display a link
+ * @binding formName if button is false, you must specify the name of the form to submit
+ * @binding functionName if set, the link becomes a javascript function instead
+ * @binding updateContainerID the id of the AjaxUpdateContainer to update after performing this action
+ * @binding showUI if functionName is set, the UI defaults to hidden; showUI re-enables it
+ * @binding formSerializer the name of the javascript function to call to serialize the form
+ * @binding elementName the element name to use (defaults to "a")
+ * @binding async boolean defining if the request is sent asynchronously or synchronously, defaults to true
+ * @binding accesskey hot key that should trigger the button (optional)
+ * @binding disabled if true, the button will be disabled (defaults to false)
+ * @property er.ajax.formSerializer the default form serializer to use for all ajax submits
+ */
+
+
+public class MTAjaxSubmitButton extends AjaxDynamicElement {
+
+ // MS: If you change this value, make sure to change it in ERXAjaxApplication
+ public static final String KEY_AJAX_SUBMIT_BUTTON_NAME = "AJAX_SUBMIT_BUTTON_NAME";
+ // MS: If you change this value, make sure to change it in ERXAjaxApplication and in wonder.js
+ public static final String KEY_PARTIAL_FORM_SENDER_ID = "_partialSenderID";
+
+ public MTAjaxSubmitButton(String name, NSDictionary associations, WOElement children) {
+ super(name, associations, children);
+ }
+
+ public static boolean isAjaxSubmit(WORequest request) {
+ return request.formValueForKey(KEY_AJAX_SUBMIT_BUTTON_NAME) != null;
+ }
+
+ public boolean disabledInComponent(WOComponent component) {
+ return booleanValueForBinding("disabled", false, component);
+ }
+
+ public String nameInContext(WOContext context, WOComponent component) {
+ return (String) valueForBinding("name", context.elementID(), component);
+ }
+
+ @SuppressWarnings({ "rawtypes", "unchecked" })
+ public NSMutableDictionary createAjaxOptions(WOComponent component) {
+
+ NSMutableArray ajaxOptionsArray = new NSMutableArray();
+ ajaxOptionsArray.addObject(new AjaxOption("onCancel", AjaxOption.FUNCTION));
+ ajaxOptionsArray.addObject(new AjaxOption("onComplete", AjaxOption.FUNCTION));
+ ajaxOptionsArray.addObject(new AjaxOption("onException", AjaxOption.FUNCTION));
+ ajaxOptionsArray.addObject(new AjaxOption("onFailure", AjaxOption.FUNCTION));
+ ajaxOptionsArray.addObject(new AjaxOption("onRequest", AjaxOption.FUNCTION));
+ ajaxOptionsArray.addObject(new AjaxOption("onSuccess", AjaxOption.FUNCTION_2));
+ ajaxOptionsArray.addObject(new AjaxOption("evalScripts", AjaxOption.BOOLEAN));
+ ajaxOptionsArray.addObject(new AjaxOption("async", AjaxOption.BOOLEAN));
+ ajaxOptionsArray.addObject(new AjaxOption("useSpinner", AjaxOption.BOOLEAN));
+ ajaxOptionsArray.addObject(new AjaxOption("spinnerTarget", AjaxOption.STRING));
+ ajaxOptionsArray.addObject(new AjaxOption("spinnerOptions", AjaxOption.DICTIONARY));
+
+ String name = nameInContext(component.context(), component);
+ NSMutableDictionary options = AjaxOption.createAjaxOptionsDictionary(ajaxOptionsArray, component, associations());
+ MTAjaxSubmitButton.fillInAjaxOptions(this, component, name, options);
+ return options;
+
+ }
+
+ public void addRequiredWebResources(WOResponse response, WOContext context) {
+ MTAjaxUtils.addScriptResourceInHead(context, context.response(), "MooTools", MTAjaxUtils.MOOTOOLS_CORE_JS);
+ MTAjaxUtils.addScriptResourceInHead(context, context.response(), "MooTools", MTAjaxUtils.MOOTOOLS_MORE_JS);
+ Boolean useSpinner = (Boolean)valueForBinding("useSpinner", Boolean.FALSE, context.component());
+ if(useSpinner) {
+ Boolean useDefaultSpinnerClass = (Boolean)valueForBinding("defaultSpinnerClass", Boolean.TRUE, context.component());
+ if(useDefaultSpinnerClass) {
+ MTAjaxUtils.addStylesheetResourceInHead(context, context.response(), "MooTools", "scripts/plugins/spinner/spinner.css");
+ }
+ }
+
+ MTAjaxUtils.addScriptResourceInHead(context, context.response(), "MooTools", MTAjaxUtils.MOOTOOLS_WONDER_JS);
+ }
+
+
+ @SuppressWarnings("rawtypes")
+ public void appendToResponse(WOResponse response, WOContext context) {
+
+ WOComponent component = context.component();
+ String functionName = (String)valueForBinding("functionName", null, component);
+ String formName = (String)valueForBinding("formName", component);
+
+ boolean showUI = (functionName == null || booleanValueForBinding("showUI", false, component));
+ boolean showButton = showUI && booleanValueForBinding("button", true, component);
+ String formReference;
+
+ if((!showButton || functionName != null) && formName == null) {
+ formName = ERXWOForm.formName(context, null);
+ if(formName == null) {
+ throw new WODynamicElementCreationException("If button = false or functionName is not null, the containing form must have an explicit name.");
+ }
+ }
+
+ if(formName == null) {
+ formReference = "this.form";
+ } else {
+ formReference = "document." + formName;
+ }
+
+ StringBuffer onClickBuffer = new StringBuffer();
+
+ // JavaScript function to be fired before submit is sent i.e. confirm();
+ String onClickBefore = (String)valueForBinding("onClickBefore", component);
+ if(onClickBefore != null) {
+ onClickBuffer.append("if(")
+ .append(onClickBefore)
+ .append(") {");
+ }
+
+ String updateContainerID = (String)valueForBinding("updateContainerID", component);
+
+ // Needs to be refactored. Same function as MoAjaxUpdateLink
+ // Maybe create a helper class with a static function that takes the component as an argument?
+ // Could add it to MoAjaxUpdateLink like addEffect.
+ String beforeEffect = (String)valueForBinding("beforeEffect", component);
+ if(beforeEffect != null) {
+
+ String beforeEffectID = (String)valueForBinding("beforeEffectID", component);
+ String beforeEffectDuration = (String) valueForBinding("beforeEffectDuration", component);
+ String beforeEffectProperty = (String) valueForBinding("beforeEffectProperty", component);
+ String beforeEffectStart = (String) valueForBinding("beforeEffectStart", component);
+
+ if(beforeEffectID == null) {
+ beforeEffectID = AjaxUpdateContainer.currentUpdateContainerID();
+ if (beforeEffectID == null) {
+ beforeEffectID = updateContainerID;
+ }
+ }
+
+ if(beforeEffect.equals("tween")) {
+ if(beforeEffectDuration != null) {
+ onClickBuffer.append("$('").append(beforeEffectID)
+ .append("').set('tween', { duration: '")
+ .append(beforeEffectDuration).append("', property: '" + beforeEffectProperty + "' });");
+ } else {
+ onClickBuffer.append("$('").append(beforeEffectID).append("').set('tween', { property: '" + beforeEffectProperty + "' });");
+ }
+ onClickBuffer.append("$('").append(beforeEffectID).append("').get('tween').start(")
+ .append(beforeEffectStart).append(").chain(function() {");
+ } else if(beforeEffect.equals("morph")) {
+ if(beforeEffectDuration != null) {
+ onClickBuffer.append("$('").append(beforeEffectID).append("').set('morph', { duration: '").append(beforeEffectDuration).append("' });");
+ }
+ onClickBuffer.append("$('").append(beforeEffectID).append("').get('morph').start('." + beforeEffectStart + "'").append(").chain(function() {");
+ } else if(beforeEffect.equals("slide")) {
+ String mode = (String) valueForBinding("effectSlideMode", component);
+ String transition = (String) valueForBinding("beforeEffectTransition", component);
+ onClickBuffer.append("$('").append(beforeEffectID).append("').set('slide'");
+ if(beforeEffectDuration != null || mode != null) {
+ onClickBuffer.append(", { ");
+ if(beforeEffectDuration != null) {
+ onClickBuffer.append("duration: '").append(beforeEffectDuration).append("'").append(mode != null || transition != null ? "," : "");
+ }
+ if(mode != null) {
+ onClickBuffer.append("mode: '").append(mode).append("'").append(transition != null ? "," : "");
+ }
+ if(transition != null) {
+ onClickBuffer.append("transition: ").append(transition);
+ }
+ onClickBuffer.append("}");
+ }
+ onClickBuffer.append("); $('").append(beforeEffectID).append("').get('slide').slide").append(ERXStringUtilities.capitalize(beforeEffectProperty)).append("().chain(function() {");
+ } else if(beforeEffect.equals("highlight")) {
+ if(beforeEffectDuration != null) {
+ onClickBuffer.append("$('").append(beforeEffectID)
+ .append("').set('tween', { duration: '").append(beforeEffectDuration).append("', property: 'background-color'});");
+ } else {
+ onClickBuffer.append("$('").append(beforeEffectID)
+ .append("').set('tween', { property: 'background-color' });");
+ }
+ onClickBuffer.append("$('").append(updateContainerID).append("').get('tween').start('").append(beforeEffectProperty != null ? beforeEffectProperty : "#ffff88', '#ffffff")
+ .append("').chain(function() { ");
+ }
+ }
+
+ if(updateContainerID != null) {
+ onClickBuffer.append("MTASB.update('").append(updateContainerID).append("', ");
+ } else {
+ onClickBuffer.append("MTASB.request(");
+ }
+ onClickBuffer.append(formReference);
+ if(valueForBinding("functionName", component) != null) {
+ onClickBuffer.append(", additionalParams");
+ } else {
+ onClickBuffer.append(", null");
+ }
+
+ onClickBuffer.append(",");
+ NSMutableDictionary options = createAjaxOptions(component);
+
+ String effect = (String) valueForBinding("effect", component);
+ String afterEffect = (String) valueForBinding("afterEffect", component);
+
+ if(effect != null) {
+ String duration = (String) valueForBinding("effectDuration", component);
+ String property = (String) valueForBinding("effectProperty", component);
+ String start = (String) valueForBinding("effectStart", component);
+ String mode = (String) valueForBinding("effectSlideMode", component);
+ MTAjaxUpdateLink.addEffect(options, effect, updateContainerID, property, start, duration, mode);
+ } else if(afterEffect != null) {
+ String duration = (String) valueForBinding("afterEffectDuration", component);
+ String property = (String) valueForBinding("afterEffectProperty", component);
+ String start = (String) valueForBinding("afterEffectStart", component);
+ String afterEffectID = (String) valueForBinding("afterEffectID", component);
+ String mode = (String) valueForBinding("effectSlideMode", component);
+ if(afterEffectID == null) {
+ afterEffectID = AjaxUpdateContainer.currentUpdateContainerID() != null ? AjaxUpdateContainer.currentUpdateContainerID() :
+ updateContainerID;
+ }
+ MTAjaxUpdateLink.addEffect(options, afterEffect, afterEffectID, property, start, duration, mode);
+ }
+
+ AjaxOptions.appendToBuffer(options, onClickBuffer, context);
+ onClickBuffer.append(")");
+ String onClick = (String)valueForBinding("onClick", component);
+ if(onClick != null) {
+ onClickBuffer.append("; ").append(onClick);
+ }
+
+ if(beforeEffect != null) {
+ onClickBuffer.append("}.bind(this));");
+ }
+
+ if(onClickBefore != null) {
+ onClickBuffer.append("}");
+ }
+
+ if(functionName != null) {
+ AjaxUtils.appendScriptHeader(response);
+ response.appendContentString(functionName + " = function(additionalParams) { " + onClickBuffer + " }\n");
+ AjaxUtils.appendScriptFooter(response);
+ }
+
+ if(showUI) {
+
+ boolean disabled = disabledInComponent(component);
+ String elementName = (String)valueForBinding("elementName", "a", component);
+
+ if(showButton) {
+ response.appendContentString(" ");
+ } else {
+ response.appendContentString(">");
+ if(hasChildrenElements()) {
+ appendChildrenToResponse(response, context);
+ }
+ response.appendContentString("" + elementName + ">");
+ }
+
+ }
+
+ super.appendToResponse(response, context);
+
+ }
+
+ @SuppressWarnings({ "rawtypes", "unchecked" })
+ public static void fillInAjaxOptions(IAjaxElement element, WOComponent component, String submitButtonName, NSMutableDictionary options) {
+
+ String systemDefaultFormSerializer = "Form.serializeWithoutSubmits";
+ String defaultFormSerializer = ERXProperties.stringForKeyWithDefault("er.ajax.formSerializer", systemDefaultFormSerializer);
+ String formSerializer = (String) element.valueForBinding("formSerializer", defaultFormSerializer, component);
+ if(!defaultFormSerializer.equals(systemDefaultFormSerializer)) {
+ options.setObjectForKey(formSerializer, "_fs");
+ }
+
+ options.setObjectForKey("'" + submitButtonName + "'", "_asbn");
+
+ if("true".equals(options.objectForKey("async"))) {
+ options.removeObjectForKey("async");
+ }
+
+ if("true".equals(options.objectForKey("evalScripts"))) {
+ options.removeObjectForKey("evalScripts");
+ }
+
+ MTAjaxUpdateContainer.expandInsertionFromOptions(options, element, component);
+
+ }
+
+ public WOActionResults invokeAction(WORequest worequest, WOContext wocontext) {
+
+ WOActionResults result = null;
+ WOComponent wocomponent = wocontext.component();
+
+ String nameInContext = nameInContext(wocontext, wocomponent);
+ boolean shouldHandleRequest = (!disabledInComponent(wocomponent) && wocontext._wasFormSubmitted()) && ((wocontext._isMultipleSubmitForm() && nameInContext.equals(worequest.formValueForKey(KEY_AJAX_SUBMIT_BUTTON_NAME))) || !wocontext._isMultipleSubmitForm());
+
+ if (shouldHandleRequest) {
+ String updateContainerID = MTAjaxUpdateContainer.updateContainerID(this, wocomponent);
+ MTAjaxUpdateContainer.setUpdateContainerID(worequest, updateContainerID);
+ wocontext._setActionInvoked(true);
+ result = handleRequest(worequest, wocontext);
+ AjaxUtils.updateMutableUserInfoWithAjaxInfo(wocontext);
+ }
+
+ return result;
+ }
+
+ public WOActionResults handleRequest(WORequest request, WOContext context) {
+
+ WOComponent component = context.component();
+ WOActionResults result = (WOActionResults) valueForBinding("action", component);
+
+ if (ERXAjaxApplication.isAjaxReplacement(request)) {
+ AjaxUtils.setPageReplacementCacheKey(context, (String)valueForBinding("replaceID", component));
+ }
+ else if (result == null || booleanValueForBinding("ignoreActionResponse", false, component)) {
+ WOResponse response = AjaxUtils.createResponse(request, context);
+ String onClickServer = (String) valueForBinding("onClickServer", component);
+ if (onClickServer != null) {
+ AjaxUtils.appendScriptHeaderIfNecessary(request, response);
+ response.appendContentString(onClickServer);
+ AjaxUtils.appendScriptFooterIfNecessary(request, response);
+ }
+ result = response;
+ }
+ else {
+ String updateContainerID = MTAjaxUpdateContainer.updateContainerID(this, component);
+ if (updateContainerID != null) {
+ AjaxUtils.setPageReplacementCacheKey(context, updateContainerID);
+ }
+ }
+
+ return result;
+ }
+
+
+}
\ No newline at end of file
diff --git a/Frameworks/Ajax/MooTools/Sources/er/ajax/mootools/MTAjaxTabbedPanel.java b/Frameworks/Ajax/MooTools/Sources/er/ajax/mootools/MTAjaxTabbedPanel.java
new file mode 100644
index 00000000000..c4139346f40
--- /dev/null
+++ b/Frameworks/Ajax/MooTools/Sources/er/ajax/mootools/MTAjaxTabbedPanel.java
@@ -0,0 +1,238 @@
+package er.ajax.mootools;
+
+import com.webobjects.appserver.WOActionResults;
+import com.webobjects.appserver.WOAssociation;
+import com.webobjects.appserver.WOComponent;
+import com.webobjects.appserver.WOContext;
+import com.webobjects.appserver.WOElement;
+import com.webobjects.appserver.WORequest;
+import com.webobjects.appserver.WOResponse;
+import com.webobjects.appserver._private.WOConstantValueAssociation;
+import com.webobjects.appserver._private.WODynamicGroup;
+import com.webobjects.foundation.NSArray;
+import com.webobjects.foundation.NSDictionary;
+import com.webobjects.foundation.NSMutableArray;
+
+import er.ajax.AjaxDynamicElement;
+import er.ajax.AjaxUtils;
+import er.extensions.appserver.ERXWOContext;
+
+/**
+ * This implements the tabs and the main control of a tabbed panel display as an
+ * unordered list (UL and LI elements). The tab contents go in AjaxTabbedPanel
+ * components contained within this component. The tab contents are loaded on
+ * demand so only the selected tab is rendered when the page is displayed. If
+ * tabs can take a while to load, a hidden div containing a "working" message
+ * can temporarily replace the panel content while it loads.
+ *
+ * CSS Classes Used by AjaxTabbedPanel and AjaxTabbedPanelTab
+ *
+ *
+ * Class Name
+ * Used For
+ *
+ *
+ * ajaxTabbedPanel
+ * The UL containing the tabs.
+ *
+ *
+ * ajaxTabbedPanelTab-selected
+ * The LI representing the selected tab and the A element that is the clickable title.
+ *
+ *
+ * ajaxTabbedPanelTab-unselected
+ * The LI representing the selected tab(s) and the A element that is the clickable title.
+ *
+ *
+ * ajaxTabbedPanelPanes
+ * The UL containing the panels (panes).
+ *
+ *
+ * ajaxTabbedPanelPane-selected
+ * The LI representing the selected panel.
+ *
+ *
+ * ajaxTabbedPanelPane-unselected
+ * The LI representing the unselected panel(s).
+ *
+ *
not get called when this is first rendered. Use onLoad if you need that.
+ * @binding class css classes to add to the ul.
+ * @author Chuck Hill
+ */
+
+public class MTAjaxTabbedPanel extends AjaxDynamicElement {
+
+ private WOElement content;
+ private NSMutableArray tabs = new NSMutableArray();
+ private WOAssociation id;
+ private WOAssociation busyDiv;
+ private WOAssociation onLoad;
+ private WOAssociation onSelect;
+
+ public MTAjaxTabbedPanel(String name, NSDictionary associations, WOElement template) {
+ super(name, associations, template);
+ content = template;
+ id = (WOAssociation) associations.objectForKey("id");
+ busyDiv = (WOAssociation) associations.objectForKey("busyDiv");
+ onLoad = (WOAssociation) associations.objectForKey("onLoad");
+ onSelect = (WOAssociation) associations.objectForKey("onSelect");
+ findTabs((WODynamicGroup)template);
+
+ if (id == null)
+ {
+ throw new RuntimeException("id binding is required");
+ }
+ }
+
+ /**
+ * Looks through the child components to locate the AjaxTabbedPanelTabs that are controlled by this panel.
+ * Tabs without an explicit id attributed are assigned a calculated one.
+ *
+ * @param template the graph of elements passed to the constructor.
+ */
+ private void findTabs(WODynamicGroup template) {
+ if (template == null || template.childrenElements() == null) return;
+
+ NSArray children = template.childrenElements();
+ for (int i = 0; i < children.count(); i++) {
+ WOElement child = (WOElement)children.objectAtIndex(i);
+ if (child instanceof MTAjaxTabbedPanelTab) {
+ MTAjaxTabbedPanelTab childTab = (MTAjaxTabbedPanelTab)child;
+
+ // The tabs need to have an id attribute so we assign one if needed
+ if (childTab.id() == null) {
+ childTab.setId(new WOConstantValueAssociation(id.valueInComponent(null) + "_pane_" + tabs.count()));
+ }
+
+ tabs.addObject(childTab);
+ }
+ else if (child instanceof WODynamicGroup) {
+ findTabs((WODynamicGroup)child);
+ }
+ }
+ }
+
+ public void appendToResponse(WOResponse response, WOContext context) {
+
+ WOComponent component = context.component();
+ String idString = (String) id.valueInComponent(component);
+ if (idString == null) {
+ throw new RuntimeException("id binding evaluated to null");
+ }
+
+ // UL for tabs
+ response.appendContentString("\n");
+
+ String paneControlID = idString + "_panecontrol";
+ String selectedTabClassName = stringValueForBinding("selectedPanelClassName", component);
+ if(selectedTabClassName == null) {
+ selectedTabClassName = "active";
+ }
+ for(MTAjaxTabbedPanelTab tab : tabs) {
+
+ if (tab.isVisble(component)) {
+ boolean isSelectedTab = tab.isSelected(context.component());
+ String panelTabID = (String) tab.id().valueInComponent(component);
+ String panelID = panelTabID + "_panel";
+ response.appendContentString(" \n");
+ response.appendContentString("");
+ response.appendContentString((String) tab.name().valueInComponent(component));
+ response.appendContentString(" \n");
+ response.appendContentString(" \n");
+ }
+ }
+
+ response.appendContentString(" \n");
+
+ // UL for panes
+ response.appendContentString("\n");
+ // The tabs render themselves as panes
+ if (content != null) {
+ content.appendToResponse(response, context);
+ }
+ response.appendContentString(" \n");
+ super.appendToResponse(response, context);
+
+ AjaxUtils.appendScriptHeader(response);
+ response.appendContentString("window.addEvent('domready', function() {");
+ response.appendContentString("\n\tvar ");
+ response.appendContentString(safeID(context));
+ response.appendContentString(" = new MTAjaxTabbedPanel({");
+ response.appendContentString("tabbedPanelTabsContainer : ");
+ response.appendContentString("'");
+ response.appendContentString(idString);
+ response.appendContentString("', ");
+ response.appendContentString("tabbedPanelPanesContainer : ");
+ response.appendContentString("'");
+ response.appendContentString(paneControlID);
+ response.appendContentString("'");
+ if(! selectedTabClassName.equals("active")) {
+ response.appendContentString(", ");
+ response.appendContentString("selectedTabClassName : ");
+ response.appendContentString("'");
+ response.appendContentString(selectedTabClassName);
+ response.appendContentString("'");
+ }
+
+ response.appendContentString("});");
+ response.appendContentString("\n});");
+ AjaxUtils.appendScriptFooter(response);
+
+ }
+
+ public String safeID(WOContext context) {
+ return "mtTabbedPanel" + ERXWOContext.safeIdentifierName(context, true);
+ }
+
+ protected void addRequiredWebResources(WOResponse response, WOContext context) {
+ MTAjaxUtils.addScriptResourceInHead(context, context.response(), "MooTools", MTAjaxUtils.MOOTOOLS_CORE_JS);
+ MTAjaxUtils.addScriptResourceInHead(context, context.response(), "MooTools", MTAjaxUtils.MOOTOOLS_MORE_JS);
+ MTAjaxUtils.addScriptResourceInHead(context, context.response(), "MooTools", MTAjaxUtils.MOOTOOLS_WONDER_JS);
+ MTAjaxUtils.addScriptResourceInHead(context, context.response(), "MooTools", "scripts/plugins/tabs/MTAjaxTabbedPanel.js");
+ }
+
+ @Override
+ public WOActionResults handleRequest(WORequest request, WOContext context) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+
+}
\ No newline at end of file
diff --git a/Frameworks/Ajax/MooTools/Sources/er/ajax/mootools/MTAjaxTabbedPanelTab.java b/Frameworks/Ajax/MooTools/Sources/er/ajax/mootools/MTAjaxTabbedPanelTab.java
new file mode 100644
index 00000000000..ace0f5a11ca
--- /dev/null
+++ b/Frameworks/Ajax/MooTools/Sources/er/ajax/mootools/MTAjaxTabbedPanelTab.java
@@ -0,0 +1,204 @@
+package er.ajax.mootools;
+
+import com.webobjects.appserver.WOActionResults;
+import com.webobjects.appserver.WOAssociation;
+import com.webobjects.appserver.WOComponent;
+import com.webobjects.appserver.WOContext;
+import com.webobjects.appserver.WOElement;
+import com.webobjects.appserver.WORequest;
+import com.webobjects.appserver.WOResponse;
+import com.webobjects.foundation.NSDictionary;
+
+import er.ajax.AjaxDynamicElement;
+import er.ajax.AjaxUtils;
+
+public class MTAjaxTabbedPanelTab extends AjaxDynamicElement {
+
+ private WOElement content;
+ private WOAssociation name;
+ private WOAssociation id;
+ private WOAssociation isSelected;
+ private WOAssociation refreshOnSelect;
+ private WOAssociation onLoad;
+ private WOAssociation isVisible;
+ private WOAssociation accesskey;
+
+ public MTAjaxTabbedPanelTab(String aName, NSDictionary associations, WOElement template) {
+ super(aName, associations, template);
+
+ content = template;
+ name = (WOAssociation) associations.objectForKey("name");
+ id = (WOAssociation) associations.objectForKey("id");
+ isSelected = (WOAssociation) associations.objectForKey("isSelected");
+ refreshOnSelect = (WOAssociation) associations.objectForKey("refreshOnSelect");
+ onLoad = (WOAssociation) associations.objectForKey("onLoad");
+ isVisible = (WOAssociation) associations.objectForKey("isVisible");
+ accesskey = (WOAssociation)associations.objectForKey("accesskey");
+
+ if (name == null) {
+ throw new RuntimeException("name binding is required");
+ }
+
+ }
+
+ /**
+ * Creates the panes.
+ */
+ public void appendToResponse(WOResponse response, WOContext aContext)
+ {
+ WOComponent component = aContext.component();
+
+ if (isVisble(component)) {
+ response.appendContentString("");
+
+ // The selected pane needs to have its content rendered when the page is first rendered. After that
+ // it is controlled by the user clicking tabs
+ if (isSelected(component) && content != null) {
+ content.appendToResponse(response, aContext);
+ }
+
+ response.appendContentString(" \n");
+
+ }
+
+ }
+
+
+ /**
+ * Do nothing if not visible.
+ */
+ public void takeValuesFromRequest(WORequest request, WOContext context)
+ {
+ if (isVisble(context.component()) && (isSelected == null || isSelected(context.component())) ) {
+ super.takeChildrenValuesFromRequest(request, context);
+ }
+ }
+
+ /**
+ * Do nothing if not visible.
+ */
+ public WOActionResults invokeAction(WORequest request, WOContext context)
+ {
+ if (isVisble(context.component())) {
+ return super.invokeAction(request, context);
+ }
+ return null;
+ }
+
+ /**
+ *
+ * @param component the component this is being rendered in
+ * @return true
if this pane is the selected one
+ */
+ public boolean isSelected(WOComponent component) {
+ return (isSelected != null) ? isSelected.booleanValueInComponent(component) : false;
+ }
+
+ /**
+ * If present and settable, sets the isSelected association to true for this tab when it selected and
+ * to false when it is no longer the selected tab.
+ *
+ * @param component the component this is being rendered in
+ * @param isTabSelected true is this is being rendered as the selected tab
+ */
+ public void setIsSelected(WOComponent component, boolean isTabSelected) {
+ if (isSelected != null && isSelected.isValueSettableInComponent(component)) {
+ isSelected.setValue(new Boolean(isTabSelected), component);
+ }
+ }
+
+ protected void addRequiredWebResources(WOResponse response, WOContext context) {
+ }
+
+ /**
+ * The pane content is rendered when an Ajax request is received.
+ * @return the children rendered as HTML
+ */
+ public WOActionResults handleRequest(WORequest request, WOContext context) {
+ WOResponse response = null;
+ String didSelect = request.stringFormValueForKey("didSelect");
+
+ // This is not set when the tab is initially loaded, that is our cue to generate our content
+ if ( didSelect == null) {
+ response = AjaxUtils.createResponse(request, context);
+ AjaxUtils.setPageReplacementCacheKey(context, _containerID(context));
+
+ if (content != null) {
+ content.appendToResponse(response, context);
+ }
+ }
+ else setIsSelected(context.component(), didSelect.equals("true"));
+
+ return response;
+ }
+
+ /**
+ * @param context WOContext response is being returned in
+ * @return ID to cache this Ajax response under
+ */
+ protected String _containerID(WOContext context) {
+ return (String)id().valueInComponent(context.component()) + "_panel";
+ }
+
+
+ /**
+ * @return association for HTML id attribute
+ */
+ public WOAssociation id() {
+ return id;
+ }
+
+ /**
+ * Sets the id association so that the AjaxTabbedPanel can provide an id if needed.
+ *
+ * @param newID the association to use to get the HTML id attribute
+ */
+ public void setId(WOAssociation newID) {
+ id = newID;
+ }
+
+ /**
+ * @return association for HTML id attribute.
+ */
+ public WOAssociation name() {
+ return name;
+ }
+
+ /**
+ * Returns current component's value for the refreshOnSelect binding.
+ *
+ * @param component the component this is being rendered in
+ * @return Boolean value for refreshOnSelect binding, Boolean.FALSE if unset
+ */
+ public Boolean refreshesOnSelect(WOComponent component) {
+ return (refreshOnSelect != null) ? (Boolean)refreshOnSelect.valueInComponent(component): Boolean.FALSE;
+ }
+
+ /**
+ * Returns current component's value for the isVisible binding.
+ *
+ * @param component the component this is being rendered in
+ * @return Boolean value for isVisible binding, Boolean.TRUE if unset
+ */
+ public boolean isVisble(WOComponent component) {
+ return (isVisible != null) ? ((Boolean)isVisible.valueInComponent(component)).booleanValue() : true;
+ }
+
+ /**
+ * @return WOAssociation for the accesskey binding
+ */
+ public WOAssociation accesskey() {
+ return accesskey;
+ }
+}
\ No newline at end of file
diff --git a/Frameworks/Ajax/MooTools/Sources/er/ajax/mootools/MTAjaxTree.java b/Frameworks/Ajax/MooTools/Sources/er/ajax/mootools/MTAjaxTree.java
new file mode 100644
index 00000000000..37b3ddaccf3
--- /dev/null
+++ b/Frameworks/Ajax/MooTools/Sources/er/ajax/mootools/MTAjaxTree.java
@@ -0,0 +1,10 @@
+package er.ajax.mootools;
+
+import com.webobjects.appserver.WOContext;
+import er.ajax.AjaxTree;
+
+public class MTAjaxTree extends AjaxTree {
+ public MTAjaxTree(WOContext context) {
+ super(context);
+ }
+}
\ No newline at end of file
diff --git a/Frameworks/Ajax/MooTools/Sources/er/ajax/mootools/MTAjaxUpdateContainer.java b/Frameworks/Ajax/MooTools/Sources/er/ajax/mootools/MTAjaxUpdateContainer.java
new file mode 100644
index 00000000000..cafeeec17a7
--- /dev/null
+++ b/Frameworks/Ajax/MooTools/Sources/er/ajax/mootools/MTAjaxUpdateContainer.java
@@ -0,0 +1,232 @@
+package er.ajax.mootools;
+
+import com.webobjects.appserver.WOComponent;
+import com.webobjects.appserver.WOContext;
+import com.webobjects.appserver.WOElement;
+import com.webobjects.appserver.WOResponse;
+import com.webobjects.foundation.NSDictionary;
+import com.webobjects.foundation.NSMutableArray;
+import com.webobjects.foundation.NSMutableDictionary;
+
+import er.ajax.AjaxDynamicElement;
+import er.ajax.AjaxObserveField;
+import er.ajax.AjaxOption;
+import er.ajax.AjaxOptions;
+import er.ajax.AjaxUpdateContainer;
+import er.ajax.AjaxUtils;
+import er.extensions.foundation.ERXValueUtilities;
+
+
+/**
+ * observeFieldID requires ERExtensions, specifically ERXWOForm
+ * @binding elementName the container's element defaults to DIV.
+ * @binding action the action to call when this updateContainer refreshes
+ * @binding method - (string: defaults to 'post') The HTTP method for the request, can be either 'post' or 'get'.
+ * @binding encoding - (string: defaults to 'utf-8') The encoding to be set in the request header.
+ * @binding emulation - (boolean: defaults to true) If set to true, other methods than 'post' or 'get' are appended as post-data named '_method' (as used in rails)
+ * @binding headers - (object) An object to use in order to set the request headers.
+ * @binding isSuccess - (function) Overrides the built-in isSuccess function.
+ * @binding evalScripts - (boolean: defaults to true) If set to true, script tags inside the response will be evaluated.
+ * @binding evalResponse - (boolean: defaults to false) If set to true, the entire response will be evaluated. Responses with javascript content-type will be evaluated automatically.
+ * @binding urlEncoded - (boolean: defaults to true) If set to true, the content-type header is set to www-form-urlencoded + encoding
+ * @binding noCache - (boolean; defaults to false) If true, appends a unique noCache value to the request to prevent caching. (IE has a bad habit of caching ajax request values. Including this script and setting the noCache value to true will prevent it from caching. The server should ignore the noCache value.)
+ * @binding async - (boolean: defaults to true) If set to false, the requests will be synchronous and freeze the browser during request.
+ * @binding optional set to true if you want the container tags to be skipped if this is already in an update container (similar to ERXOptionalForm).
+ * If optional is true and there is a container, it's as if this AUC doesn't exist, and only its children will render to the page.
+ * @binding onCancel Fired when a request has been cancelled.
+ * @binding onComplete Fired when the Request is completed.
+ * @binding onException Fired when setting a request header fails.
+ * @binding onFailure Fired when the request failed (error status code).
+ * @binding onRequest Fired when the Request is sent.
+ * @binding onSuccess(responseTree, responseElements, responseHTML, responseJavaScript) Fired when the Request is completed successfully.
+ * @binding frequency the frequency (in seconds) of a periodic update
+ * @binding initialDelay - (number; defaults to 5000) The initial delay to wait for the request after a call to the start method
+ * @binding delay - (number; defaults to 5000) The delay between requests and the number of ms to add if no valid data has been returned
+ * @binding limit - (number; defaults to 60000) The maximum time the interval uses to request the server
+ * responseTree - (element) The node list of the remote response.
+ * responseElements - (array) An array containing all elements of the remote response.
+ * responseHTML - (string) The content of the remote response.
+ * responseJavaScript - (string) The portion of JavaScript from the remote response.
+ * @binding onFailure Fired when the request failed (error status code).
+ * @binding useSpinner (boolean) use the Spinner class with this request
+ * @binding defaultSpinnerClass inclue the default spinner css class in the headers - if false provide your own.
+ * @binding spinnerOptions - (object) the options object for the Spinner class
+ * @binding spinnerTarget - (mixed) a string of the id for an Element or an Element reference to use instead of the one specifed in the update option. This is useful if you want to overlay a different area (or, say, the parent of the one being updated).
+ */
+
+
+public class MTAjaxUpdateContainer extends AjaxUpdateContainer {
+
+ public MTAjaxUpdateContainer(String name, NSDictionary associations, WOElement children) {
+ super(name, associations, children);
+ }
+
+ public static String updateContainerID(AjaxDynamicElement element, WOComponent component) {
+ return AjaxUpdateContainer.updateContainerID(element, component);
+ }
+
+ @Override
+ protected void addRequiredWebResources(WOResponse response, WOContext context) {
+ MTAjaxUtils.addScriptResourceInHead(context, context.response(), "MooTools", MTAjaxUtils.MOOTOOLS_CORE_JS);
+ MTAjaxUtils.addScriptResourceInHead(context, context.response(), "MooTools", MTAjaxUtils.MOOTOOLS_MORE_JS);
+ Boolean useSpinner = (Boolean)valueForBinding("useSpinner", Boolean.FALSE, context.component());
+ if(useSpinner) {
+ Boolean useDefaultSpinnerClass = (Boolean)valueForBinding("defaultSpinnerClass", Boolean.TRUE, context.component());
+ if(useDefaultSpinnerClass) {
+ MTAjaxUtils.addStylesheetResourceInHead(context, context.response(), "MTAjax", "scripts/plugins/spinner/spinner.css");
+ }
+ }
+ MTAjaxUtils.addScriptResourceInHead(context, context.response(), "MooTools", MTAjaxUtils.MOOTOOLS_WONDER_JS);
+ }
+
+ @SuppressWarnings({ "rawtypes", "unchecked" })
+ public NSDictionary createAjaxOptions(WOComponent component) {
+
+ NSMutableArray ajaxOptionsArray = new NSMutableArray();
+ ajaxOptionsArray.addObject(new AjaxOption("method", AjaxOption.STRING));
+ ajaxOptionsArray.addObject(new AjaxOption("frequency", AjaxOption.NUMBER));
+ ajaxOptionsArray.addObject(new AjaxOption("initialDelay", AjaxOption.NUMBER));
+ ajaxOptionsArray.addObject(new AjaxOption("delay", AjaxOption.NUMBER));
+ ajaxOptionsArray.addObject(new AjaxOption("limit", AjaxOption.NUMBER));
+ ajaxOptionsArray.addObject(new AjaxOption("encoding", AjaxOption.STRING));
+ ajaxOptionsArray.addObject(new AjaxOption("emulation", AjaxOption.BOOLEAN));
+ ajaxOptionsArray.addObject(new AjaxOption("headers", AjaxOption.ARRAY));
+ ajaxOptionsArray.addObject(new AjaxOption("isSuccess", AjaxOption.FUNCTION));
+ ajaxOptionsArray.addObject(new AjaxOption("evalScripts", AjaxOption.BOOLEAN));
+ ajaxOptionsArray.addObject(new AjaxOption("evalResponse", AjaxOption.BOOLEAN));
+ ajaxOptionsArray.addObject(new AjaxOption("urlEncoded", AjaxOption.BOOLEAN));
+ ajaxOptionsArray.addObject(new AjaxOption("async", AjaxOption.BOOLEAN));
+ ajaxOptionsArray.addObject(new AjaxOption("noCache", AjaxOption.BOOLEAN));
+ ajaxOptionsArray.addObject(new AjaxOption("onRequest", AjaxOption.FUNCTION));
+ ajaxOptionsArray.addObject(new AjaxOption("onCancel", AjaxOption.SCRIPT));
+ ajaxOptionsArray.addObject(new AjaxOption("onComplete", AjaxOption.SCRIPT));
+ ajaxOptionsArray.addObject(new AjaxOption("onSuccess", AjaxOption.FUNCTION_2));
+ ajaxOptionsArray.addObject(new AjaxOption("onFailure", AjaxOption.FUNCTION_1));
+ ajaxOptionsArray.addObject(new AjaxOption("onException", AjaxOption.FUNCTION_2));
+ ajaxOptionsArray.addObject(new AjaxOption("useSpinner", AjaxOption.BOOLEAN));
+ ajaxOptionsArray.addObject(new AjaxOption("spinnerTarget", AjaxOption.STRING));
+ ajaxOptionsArray.addObject(new AjaxOption("spinnerOptions", AjaxOption.DICTIONARY));
+
+ NSMutableDictionary options = AjaxOption.createAjaxOptionsDictionary(ajaxOptionsArray, component, associations());
+ options.setObjectForKey("'get'", "method");
+ if (options.objectForKey("evalScripts") == null) {
+ options.setObjectForKey("true", "evalScripts");
+ }
+
+ AjaxUpdateContainer.expandInsertionFromOptions(options, this, component);
+
+ return options;
+
+ }
+
+ public static NSDictionary removeDefaultOptions(NSDictionary options) {
+ // PROTOTYPE OPTIONS
+ NSMutableDictionary mutableOptions = options.mutableClone();
+ if ("'get'".equals(mutableOptions.objectForKey("method"))) {
+ mutableOptions.removeObjectForKey("method");
+ }
+ if ("true".equals(mutableOptions.objectForKey("evalScripts"))) {
+ mutableOptions.removeObjectForKey("evalScripts");
+ }
+ if ("true".equals(mutableOptions.objectForKey("async"))) {
+ mutableOptions.removeObjectForKey("async");
+ }
+ return mutableOptions;
+ }
+
+
+ public void appendToResponse(WOResponse response, WOContext context) {
+
+ WOComponent component = context.component();
+
+ if(!shouldRenderContainer(component)) {
+ if(hasChildrenElements()) {
+ appendChildrenToResponse(response, context);
+ }
+ super.appendToResponse(response, context);
+ }
+
+ else {
+
+ String previousUpdateContainerID = MTAjaxUpdateContainer.currentUpdateContainerID();
+ try {
+
+ String elementName = (String) valueForBinding("elementName", "div", component);
+ String id = _containerID(context);
+ MTAjaxUpdateContainer.setCurrentUpdateContainerID(_containerID(context));
+ response.appendContentString("<" + elementName + " ");
+ appendTagAttributeToResponse(response, "id", id);
+ appendTagAttributeToResponse(response, "class", valueForBinding("class", component));
+ appendTagAttributeToResponse(response, "style", valueForBinding("style", component));
+ appendTagAttributeToResponse(response, "updateUrl", MTAjaxUtils.ajaxComponentActionUrl(context));
+ response.appendContentString(">");
+
+ if(hasChildrenElements()) {
+ appendChildrenToResponse(response, context);
+ }
+
+ response.appendContentString("" + elementName + ">");
+
+ addRequiredWebResources(response, context);
+// super.appendToResponse(response, context);
+
+ NSDictionary options = createAjaxOptions(component);
+
+ Object frequency = valueForBinding("frequency", component);
+ String observeFieldID = (String) valueForBinding("observeFieldID", component);
+
+ boolean skipFunction = frequency == null && observeFieldID == null && booleanValueForBinding("skipFunction", false, component);
+
+ if(!skipFunction) {
+ MTAjaxUtils.appendScriptHeader(response);
+ if(frequency != null) {
+ boolean isNotZero = true;
+ try {
+ float numberFrequency = ERXValueUtilities.floatValue(frequency);
+ if(numberFrequency == 0.0) {
+ isNotZero = false;
+ }
+ } catch (RuntimeException e) {
+ throw new IllegalStateException("Error parsing float from value : <" + frequency + ">");
+ }
+ if(isNotZero) {
+ boolean canStop = false;
+ boolean stopped = false;
+ if(associations().objectForKey("stopped") != null) {
+ canStop = true;
+ stopped = booleanValueForBinding("stopped", false, component);
+ }
+ response.appendContentString("MTAUC.registerPeriodic('" + id + "'," + canStop + "," + stopped + ",");
+ AjaxOptions.appendToResponse(options, response, context);
+ response.appendContentString(");");
+ }
+ }
+
+ if(observeFieldID != null) {
+ boolean fullSubmit = booleanValueForBinding("fullSubmit", false, component);
+ AjaxObserveField.appendToResponse(response, context, this, observeFieldID, false, id, fullSubmit, createObserveFieldOptions(component));
+ }
+
+ response.appendContentString("MTAUC.register('" + id + "'");
+ NSDictionary nonDefaultOptions = AjaxUpdateContainer.removeDefaultOptions(options);
+ if (nonDefaultOptions.count() > 0) {
+ response.appendContentString(", ");
+ AjaxOptions.appendToResponse(nonDefaultOptions, response, context);
+ }
+ response.appendContentString(");");
+
+ AjaxUtils.appendScriptFooter(response);
+
+ }
+
+
+ } finally {
+ MTAjaxUpdateContainer.setCurrentUpdateContainerID(previousUpdateContainerID);
+ }
+
+ }
+
+ }
+
+
+}
\ No newline at end of file
diff --git a/Frameworks/Ajax/MooTools/Sources/er/ajax/mootools/MTAjaxUpdateLink.java b/Frameworks/Ajax/MooTools/Sources/er/ajax/mootools/MTAjaxUpdateLink.java
new file mode 100644
index 00000000000..caa6e7701aa
--- /dev/null
+++ b/Frameworks/Ajax/MooTools/Sources/er/ajax/mootools/MTAjaxUpdateLink.java
@@ -0,0 +1,318 @@
+package er.ajax.mootools;
+
+import com.webobjects.appserver.WOAssociation;
+import com.webobjects.appserver.WOComponent;
+import com.webobjects.appserver.WOContext;
+import com.webobjects.appserver.WOElement;
+import com.webobjects.appserver.WOResponse;
+import com.webobjects.appserver._private.WODynamicElementCreationException;
+import com.webobjects.foundation.NSDictionary;
+import com.webobjects.foundation.NSMutableArray;
+import com.webobjects.foundation.NSMutableDictionary;
+
+import er.ajax.AjaxOption;
+import er.ajax.AjaxOptions;
+import er.ajax.AjaxUpdateContainer;
+import er.ajax.AjaxUpdateLink;
+import er.ajax.AjaxUtils;
+import er.extensions.components.ERXComponentUtilities;
+import er.extensions.foundation.ERXStringUtilities;
+
+/**
+ * Updates a region on the screen by creating a request to an action, then returning a script that in turn creates an
+ * Ajax.Updater for the area. If you do not provide an action binding, it will just update the specified area.
+ * @binding action the action to call when the link executes
+ * @binding directActionName the direct action to call when link executes
+ * @binding updateContainerID the id of the AjaxUpdateContainer to update after performing this action
+ * @binding title title of the link
+ * @binding style css style of the link
+ * @binding class css class of the link
+ * @binding id of the link
+ * @binding disabled boolean defining if the link renders the tag
+ * @binding string string to get preprended to the contained elements
+ * @binding function a custom function to call that takes a single parameter that is the action url
+ * @binding elementName the element name to use (defaults to "a")
+ * @binding functionName if set, the link becomes a javascript function
+ * @binding button if true, this is rendered as a javascript button
+ * @binding async boolean defining if the update request is sent asynchronously or synchronously, defaults to true
+ * @binding accesskey hot key that should trigger the link (optional)
+ * @binding onCancel Fired when a request has been cancelled.
+ * @binding onClickBefore if the given function returns true, the onClick is executed. This is to support confirm(..) dialogs.
+ * @binding onClick JS function, called after the click on the client
+ * @binding onComplete Fired when the Request is completed.
+ * @binding onException Fired when setting a request header fails.
+ * @binding onFailure Fired when the request failed (error status code).
+ * @binding onRequest Fired when the Request is sent.
+ * @binding onSuccess(responseTree, responseElements, responseHTML, responseJavaScript) Fired when the Request is completed successfully.
+ * @binding useSpinner (boolean) use the Spinner class with this request
+ * @binding defaultSpinnerClass inclue the default spinner css class in the headers - if false provide your own.
+ * @binding spinnerOptions - (object) the options object for the Spinner class
+ * @binding spinnerTarget - (mixed) a string of the id for an Element or an Element reference to use instead of the one specifed in the update option. This is useful if you want to overlay a different area (or, say, the parent of the one being updated).
+
+**/
+
+public class MTAjaxUpdateLink extends AjaxUpdateLink {
+
+
+ public MTAjaxUpdateLink(String name, NSDictionary associations, WOElement children) {
+ super(name, associations, children);
+ }
+
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ protected NSMutableDictionary createAjaxOptions(WOComponent component) {
+
+ NSMutableArray ajaxOptionsArray = new NSMutableArray();
+ ajaxOptionsArray.addObject(new AjaxOption("async", AjaxOption.BOOLEAN));
+ ajaxOptionsArray.addObject(new AjaxOption("onRequest", AjaxOption.FUNCTION));
+ ajaxOptionsArray.addObject(new AjaxOption("onComplete", AjaxOption.FUNCTION));
+ ajaxOptionsArray.addObject(new AjaxOption("onSuccess", AjaxOption.FUNCTION_2));
+ ajaxOptionsArray.addObject(new AjaxOption("onFailure", AjaxOption.FUNCTION));
+ ajaxOptionsArray.addObject(new AjaxOption("onException", AjaxOption.SCRIPT));
+ ajaxOptionsArray.addObject(new AjaxOption("evalScripts", AjaxOption.BOOLEAN));
+ ajaxOptionsArray.addObject(new AjaxOption("useSpinner", AjaxOption.BOOLEAN));
+ ajaxOptionsArray.addObject(new AjaxOption("spinnerTarget", AjaxOption.STRING));
+ ajaxOptionsArray.addObject(new AjaxOption("spinnerOptions", AjaxOption.DICTIONARY));
+
+ NSMutableDictionary options = AjaxOption.createAjaxOptionsDictionary(ajaxOptionsArray, component, associations());
+
+ options.setObjectForKey("'get'", "method");
+ if (options.objectForKey("async") == null) {
+ options.setObjectForKey("true", "async");
+ }
+ if (options.objectForKey("evalScripts") == null) {
+ options.setObjectForKey("true", "evalScripts");
+ }
+
+ AjaxUpdateContainer.expandInsertionFromOptions(options, this, component);
+ return options;
+
+ }
+
+ public void addRequiredWebResources(WOResponse response, WOContext context) {
+ MTAjaxUtils.addScriptResourceInHead(context, context.response(), "MooTools", MTAjaxUtils.MOOTOOLS_CORE_JS);
+ MTAjaxUtils.addScriptResourceInHead(context, context.response(), "MooTools", MTAjaxUtils.MOOTOOLS_MORE_JS);
+ Boolean useSpinner = (Boolean)valueForBinding("useSpinner", Boolean.FALSE, context.component());
+ if(useSpinner) {
+ Boolean useDefaultSpinnerClass = (Boolean)valueForBinding("defaultSpinnerClass", Boolean.TRUE, context.component());
+ if(useDefaultSpinnerClass) {
+ MTAjaxUtils.addStylesheetResourceInHead(context, context.response(), "MooTools", "scripts/plugins/spinner/spinner.css");
+ }
+ }
+
+ MTAjaxUtils.addScriptResourceInHead(context, context.response(), "MooTools", MTAjaxUtils.MOOTOOLS_WONDER_JS);
+ }
+
+ public String onClick(WOContext context, boolean generateFunctionWrapper) {
+
+ WOComponent component = context.component();
+ NSMutableDictionary options = createAjaxOptions(component);
+
+ StringBuffer onClickBuffer = new StringBuffer();
+
+ String onClick = (String) valueForBinding("onClick", component);
+ String onClickBefore = (String) valueForBinding("onClickBefore", component);
+ String updateContainerID = (String) valueForBinding("updateContainerID", component);
+ String functionName = (String) valueForBinding("functionName", component);
+ String function = (String) valueForBinding("function", component);
+ String replaceID = (String) valueForBinding("replaceID", component);
+ String effect = (String) valueForBinding("effect", component);
+ String afterEffect = (String) valueForBinding("afterEffect", component);
+ String beforeEffect = (String) valueForBinding("beforeEffect", component);
+
+ if(effect != null) {
+ String duration = (String) valueForBinding("effectDuration", component);
+ String property = (String) valueForBinding("effectProperty", component);
+ String start = (String) valueForBinding("effectStart", component);
+ String mode = (String) valueForBinding("effectSlideMode", component);
+ MTAjaxUpdateLink.addEffect(options, effect, updateContainerID, property, start, duration, mode);
+ } else if(afterEffect != null) {
+ String duration = (String) valueForBinding("afterEffectDuration", component);
+ String property = (String) valueForBinding("afterEffectProperty", component);
+ String start = (String) valueForBinding("afterEffectStart", component);
+ String afterEffectID = (String) valueForBinding("afterEffectID", component);
+ String mode = (String) valueForBinding("effectSlideMode", component);
+ if(afterEffectID == null) {
+ afterEffectID = AjaxUpdateContainer.currentUpdateContainerID() != null ? AjaxUpdateContainer.currentUpdateContainerID() :
+ updateContainerID;
+ }
+ MTAjaxUpdateLink.addEffect(options, afterEffect, afterEffectID, property, start, duration, mode);
+ }
+
+ WOAssociation directActionNameAssociation = (WOAssociation) associations().valueForKey("directActionName");
+
+ if(beforeEffect == null && updateContainerID != null && directActionNameAssociation == null && replaceID == null
+ && function == null && onClick == null && onClickBefore == null) {
+ NSDictionary nonDefaultOptions = MTAjaxUpdateContainer.removeDefaultOptions(options);
+ onClickBuffer.append("MTAUL.")
+ .append(generateFunctionWrapper ? "updateFunc" : "update")
+ .append("('").append(updateContainerID).append("', ");
+ AjaxOptions.appendToBuffer(nonDefaultOptions, onClickBuffer, context);
+ onClickBuffer.append(", '").append(context.contextID()).append('.').append(context.elementID())
+ .append("'").append(")").append(";");
+
+ } else {
+
+ if(generateFunctionWrapper) {
+ onClickBuffer.append("function(additionalParams) {");
+ }
+
+ if(onClickBefore != null) {
+ onClickBuffer.append("if (")
+ .append(onClickBefore)
+ .append(") { ");
+ }
+
+ // EFFECTS
+ if(beforeEffect != null) {
+ String beforeEffectID = (String)valueForBinding("beforeEffectID", component);
+ String beforeEffectDuration = (String) valueForBinding("beforeEffectDuration", component);
+ String beforeEffectProperty = (String)valueForBinding("beforeEffectProperty", component);
+ String beforeEffectStart = (String)valueForBinding("beforeEffectStart", component);
+
+ if(beforeEffectID == null) {
+ beforeEffectID = AjaxUpdateContainer.currentUpdateContainerID() != null ?
+ AjaxUpdateContainer.currentUpdateContainerID() : updateContainerID;
+ }
+
+ if(beforeEffect.equals("tween")) {
+ if(beforeEffectDuration != null) {
+ onClickBuffer.append("$('").append(beforeEffectID)
+ .append("').set('tween', { duration: '")
+ .append(beforeEffectDuration).append("', property: '" + beforeEffectProperty + "' });");
+ } else {
+ onClickBuffer.append("$('").append(beforeEffectID).append("').set('tween', { property: '" + beforeEffectProperty + "' });");
+ }
+ onClickBuffer.append("$('").append(beforeEffectID).append("').get('tween').start(")
+ .append(beforeEffectStart).append(").chain(function() {");
+ } else if(beforeEffect.equals("morph")) {
+ if(beforeEffectDuration != null) {
+ onClickBuffer.append("$('").append(beforeEffectID).append("').set('morph', { duration: '").append(beforeEffectDuration).append("' });");
+ }
+ onClickBuffer.append("$('").append(beforeEffectID).append("').get('morph').start('." + beforeEffectStart + "'").append(").chain(function() {");
+ } else if(beforeEffect.equals("slide")) {
+ String mode = (String) valueForBinding("effectSlideMode", component);
+ String transition = (String) valueForBinding("beforeEffectTransition", component);
+ onClickBuffer.append("$('").append(beforeEffectID).append("').set('slide'");
+ if(beforeEffectDuration != null || mode != null) {
+ onClickBuffer.append(", { ");
+ if(beforeEffectDuration != null) {
+ onClickBuffer.append("duration: '").append(beforeEffectDuration).append("'").append(mode != null || transition != null ? "," : "");
+ }
+ if(mode != null) {
+ onClickBuffer.append("mode: '").append(mode).append("'").append(transition != null ? "," : "");
+ }
+ if(transition != null) {
+ onClickBuffer.append("transition: ").append(transition);
+ }
+ onClickBuffer.append("}");
+ }
+ onClickBuffer.append("); $('").append(beforeEffectID).append("').get('slide').slide").append(ERXStringUtilities.capitalize(beforeEffectProperty)).append("().chain(function() {");
+ } else if(beforeEffect.equals("highlight")) {
+ if(beforeEffectDuration != null) {
+ onClickBuffer.append("$('").append(beforeEffectID)
+ .append("').set('tween', { duration: '").append(beforeEffectDuration).append("', property: 'background-color'});");
+ } else {
+ onClickBuffer.append("$('").append(beforeEffectID)
+ .append("').set('tween', { property: 'background-color' });");
+ }
+ onClickBuffer.append("$('").append(updateContainerID).append("').get('tween').start('").append(beforeEffectProperty != null ? beforeEffectProperty : "#ffff88', '#ffffff")
+ .append("').chain(function() { ");
+ }
+ }
+
+ String actionUrl = null;
+ if(directActionNameAssociation != null) {
+ actionUrl = context.directActionURLForActionNamed((String) directActionNameAssociation.valueInComponent(component), ERXComponentUtilities.queryParametersInComponent(associations(), component)).replaceAll("&", "&");
+ } else {
+ actionUrl = AjaxUtils.ajaxComponentActionUrl(context);
+ }
+ actionUrl = "'" + actionUrl + "'";
+
+ if(functionName != null) {
+ actionUrl = actionUrl + ".addQueryParameters(additionalParams);";
+ }
+
+ if(function != null) {
+ onClickBuffer.append("return " + function + "(" + actionUrl + ")");
+ } else {
+ options.setObjectForKey(actionUrl, "url");
+ if(replaceID == null) {
+ if(updateContainerID == null) {
+ onClickBuffer.append("new Request(");
+ AjaxOptions.appendToBuffer(options, onClickBuffer, context);
+ onClickBuffer.append(").send();");
+ } else {
+ options.takeValueForKey("'" + updateContainerID + "'", "update");
+ onClickBuffer.append("new Request.HTML(");
+ AjaxOptions.appendToBuffer(options, onClickBuffer, context);
+ onClickBuffer.append(").send();");
+ }
+ } else {
+ options.takeValueForKey("'" + replaceID + "'", "update");
+ onClickBuffer.append("new Request.HTML(");
+ AjaxOptions.appendToBuffer(options, onClickBuffer, context);
+ onClickBuffer.append(").send();");
+ }
+ }
+
+ if(onClick != null) {
+ onClickBuffer.append(";")
+ .append(onClick);
+ }
+
+ if(beforeEffect != null) {
+ onClickBuffer.append("});");
+ }
+
+ if(onClickBefore != null) {
+ onClickBuffer.append(" } ");
+ }
+
+ if(generateFunctionWrapper) {
+ onClickBuffer.append("}");
+ }
+ }
+
+ return onClickBuffer.toString();
+
+ }
+
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ public static void addEffect(NSMutableDictionary options, String effect, String updateContainerID, String effectProperty, String effectStart, String duration, String mode) {
+
+ if(effect != null) {
+
+ if(options.objectForKey("onSuccess") != null) {
+ throw new WODynamicElementCreationException("You cannot specify both an effect and a custom onSuccess function.");
+ }
+ if(updateContainerID == null) {
+ throw new WODynamicElementCreationException("You cannot specify an effect without an updateContainerID.");
+ }
+ StringBuffer effectBuffer = new StringBuffer();
+ effectBuffer.append("function() { ");
+ if(effect.equals("tween")) {
+ if(duration != null) {
+ effectBuffer.append("$('").append(updateContainerID).append("').set('tween', { duration: '").append(duration).append("', property: '")
+ .append(effectProperty).append("' });");
+ } else {
+ effectBuffer.append("$('").append(updateContainerID).append("').set('tween', { property: '").append(effectProperty).append("' });");
+ }
+ effectBuffer.append("$('").append(updateContainerID).append("').get('tween').start(" + effectStart + ");");
+ } else if(effect.equals("morph")) {
+ if(duration != null) {
+ effectBuffer.append("$('").append(updateContainerID).append("').set('morph', { duration: '").append(duration).append("'});");
+ }
+ effectBuffer.append("$('").append(updateContainerID).append("').get('morph').start('." + effectStart + "');");
+ } else if(effect.equals("slide")) {
+ effectBuffer.append("$('").append(updateContainerID).append("').get('slide').slide").append(ERXStringUtilities.capitalize(effectProperty)).append("(); ");
+ } else if(effect.equals("highlight")) {
+ effectBuffer.append("$('").append(updateContainerID).append("').highlight(").append(effectProperty != null ? effectProperty : "").append(");");
+ }
+ effectBuffer.append("}");
+ options.setObjectForKey(effectBuffer.toString(), "onSuccess");
+ }
+ }
+
+
+
+}
\ No newline at end of file
diff --git a/Frameworks/Ajax/MooTools/Sources/er/ajax/mootools/MTAjaxUtils.java b/Frameworks/Ajax/MooTools/Sources/er/ajax/mootools/MTAjaxUtils.java
new file mode 100644
index 00000000000..80ab8c59a98
--- /dev/null
+++ b/Frameworks/Ajax/MooTools/Sources/er/ajax/mootools/MTAjaxUtils.java
@@ -0,0 +1,32 @@
+package er.ajax.mootools;
+
+import com.webobjects.appserver.WOContext;
+import com.webobjects.appserver.WOResponse;
+
+import er.ajax.AjaxUtils;
+import er.extensions.appserver.ERXResponseRewriter;
+import er.extensions.foundation.ERXProperties;
+
+public class MTAjaxUtils extends AjaxUtils {
+
+ public static final String MOOTOOLS_MORE_JS = "scripts/core/mootools-more-1.4.0.1.js";
+ public static final String MOOTOOLS_CORE_JS = "scripts/core/mootools-core-1.4.4.js";
+ public static final String MOOTOOLS_WONDER_JS = "scripts/core/MTWonder.js";
+
+ public static void addScriptResourceInHead(WOContext context, WOResponse response, String framework, String fileName) {
+
+ String processedFileName = fileName;
+
+ if(ERXProperties.booleanForKey("er.mootools.compressed") && MOOTOOLS_CORE_JS.equals(fileName)) {
+ processedFileName = "scripts/core/mootools-core-1.4.4-yc.js";
+ }
+
+ if(ERXProperties.booleanForKey("er.mootools.compressed") && MOOTOOLS_MORE_JS.equals(fileName)) {
+ processedFileName = "scripts/core/mootools-more-1.4.0.1-yc.js";
+ }
+
+ ERXResponseRewriter.addScriptResourceInHead(response, context, framework, processedFileName);
+
+ }
+
+}
diff --git a/Frameworks/Ajax/MooTools/Sources/er/ajax/mootools/MTJSDatePicker.java b/Frameworks/Ajax/MooTools/Sources/er/ajax/mootools/MTJSDatePicker.java
new file mode 100644
index 00000000000..385cb4fd05e
--- /dev/null
+++ b/Frameworks/Ajax/MooTools/Sources/er/ajax/mootools/MTJSDatePicker.java
@@ -0,0 +1,130 @@
+package er.ajax.mootools;
+
+import com.webobjects.appserver.WOActionResults;
+import com.webobjects.appserver.WOContext;
+import com.webobjects.appserver.WORequest;
+import com.webobjects.appserver.WOResponse;
+import com.webobjects.foundation.NSDictionary;
+import com.webobjects.foundation.NSMutableArray;
+import com.webobjects.foundation.NSMutableDictionary;
+
+import er.ajax.AjaxComponent;
+import er.ajax.AjaxOption;
+
+/*
+ * @binding pickerClass - default (datepicker) CSS class for the main datepicker container element.
+ * @binding toggleElements - default (null) Toggle your datepicker by clicking another element. Specify as a MooTools selector. The resulting elements are mapped to the selected datepickers by index (the 1st toggle works for the 1st input, the 2nd toggle works for the 2nd input, etc.)
+ * @binding days - default (['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']) - Labels for the days, allows for localization.
+ * @binding daysShort - default (2) - Length of day-abbreviations used in the datepicker.
+ * @binding months - default (['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']) Labels for the months, allows for localization.
+ * @binding monthShort default (3) - Length of month-abbreviations used in the datepicker.
+ * @binding startDay default (1) - First day of a week. Can be 0 (Sunday) through 6 (Saturday) - be aware that this may affect your layout, since days in the last column will likely have a style with right-margin: 0px;which would need to be applied to a different day. Default value 1 is Monday.
+ * @binding timePicker default (false) - Enable/disable timepicker functionality. See timepicker example below. Hours/Minutes values can be changed using the scrollwheel.
+ * @binding timePickerOnly (false) - set to true to use datepicker for time-selection only; recommended formatis H:i; will automatically force timePicker and startView options into timepicker mode
+ * @binding yearPicker (true) - Enable/disable yearpicker functionality. Makes it much easier to change years.
+ * @binding yearsPerPage (20) - Amount of years to show in the year-picking view. Be aware that this may affect your layout.
+ * @binding dateFormat - the dateformat to use. Same as normal.
+ * @binding animationDuration default (400) - Duration of the slide/fade animations in milliseconds.
+ * @binding useFadeInOut default (true (false on Internet Explorer)) Whether to fade-in/out the datepicker popup.
+ * @binding startView default (month) - Initial view of the datepicker. Allowed values are: time(only when timePicker option is true), month,year, decades
+ * @binding allowEmpty default (false) - When set to true the datepicker intializes empty when no value was set (instead of starting at today). In addition the backspace- and delete-key will remove a value from the input. Check out the Allow empty example below.
+ * @binding positionOffset default ({ x: 0, y: 0 }) Allows you to tweak the position at which the datepicker appears, relative to the input element. Formatted as an object with x and y properties. Values can be negative.
+ * @binding debug default (false) - When enabled, will not hide the original input element. Additionally, any formatting errors will be alerted to the user.
+ * @binding onShow default null - function to fire onShow
+ * @binding onCancel default null function to fire onCancel
+ * @binding onSelect default null function to fire onSelect
+
+ */
+
+public class MTJSDatePicker extends AjaxComponent {
+
+ public MTJSDatePicker(WOContext context) {
+ super(context);
+ }
+
+ public boolean isStateless() {
+ return true;
+ }
+
+ @Override
+ protected void addRequiredWebResources(WOResponse res) {
+ MTAjaxUtils.addScriptResourceInHead(context(), res, "MooTools", MTAjaxUtils.MOOTOOLS_CORE_JS);
+ MTAjaxUtils.addScriptResourceInHead(context(), res, "MooTools", "scripts/plugins/datepicker/datepicker.js");
+ Boolean useDefaultCSS = booleanValueForBinding("useDefaultCSS", true);
+ if(useDefaultCSS) {
+ MTAjaxUtils.addStylesheetResourceInHead(context(), res, "MooTools", "scripts/plugins/datepicker/datepicker.css");
+ }
+ }
+
+ @Override
+ public WOActionResults handleRequest(WORequest request, WOContext context) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ private static String[][] conversionTable = new String[][] { { "%Y", "Y" }, { "%y", "y" }, { "%B", "F" }, { "%B", "F" },
+ { "%B", "M" }, { "%m", "m" }, { "%A", "l" }, { "%A", "l" }, { "%A", "l" }, { "%A", "D" }, { "%d", "d" },
+ { "%H", "H" }, { "%M", "i" }, { "%S", "s" }, { "%I", "h" }, { "%p", "a" } };
+
+ public static String convertDateToPhpFormat(String javaFormat) {
+ String result = javaFormat;
+ for(int i = 0; i < conversionTable.length; i++) {
+ result = result.replaceAll(conversionTable[i][0], conversionTable[i][1]);
+ }
+ return result;
+ }
+
+ public static String convertDateToJavaFormat(String phpFormat) {
+ String result = phpFormat;
+ for(int i = 0; i < conversionTable.length; i++) {
+ result = result.replaceAll(conversionTable[i][1], conversionTable[i][0]);
+ }
+ return result;
+ }
+
+ public String classes() {
+ String userDefinedClass = valueForStringBinding("class", "");
+ userDefinedClass += userDefinedClass.length() > 0 ? " dateinput" : "dateinput";
+ return userDefinedClass;
+ }
+
+ public String format() {
+ String format = (String) valueForBinding("dateformat", "%Y-%m-%d");
+ return "'" + convertDateToPhpFormat(format) + "'";
+ }
+
+ @SuppressWarnings({ "rawtypes", "unchecked" })
+ public NSDictionary createAjaxOptions() {
+
+ NSMutableArray ajaxOptionsArray = new NSMutableArray();
+ ajaxOptionsArray.addObject(new AjaxOption("pickerClass", AjaxOption.STRING));
+ ajaxOptionsArray.addObject(new AjaxOption("toggleElements", AjaxOption.STRING));
+ ajaxOptionsArray.addObject(new AjaxOption("days", AjaxOption.ARRAY));
+ ajaxOptionsArray.addObject(new AjaxOption("dayShort", AjaxOption.NUMBER));
+ ajaxOptionsArray.addObject(new AjaxOption("months", AjaxOption.ARRAY));
+ ajaxOptionsArray.addObject(new AjaxOption("monthShort", AjaxOption.NUMBER));
+ ajaxOptionsArray.addObject(new AjaxOption("startDay", AjaxOption.NUMBER));
+ ajaxOptionsArray.addObject(new AjaxOption("timePicker", AjaxOption.BOOLEAN));
+ ajaxOptionsArray.addObject(new AjaxOption("timePickerOnly", AjaxOption.BOOLEAN));
+ ajaxOptionsArray.addObject(new AjaxOption("yearPicker", AjaxOption.BOOLEAN));
+ ajaxOptionsArray.addObject(new AjaxOption("yearsPerPage", AjaxOption.NUMBER));
+ ajaxOptionsArray.addObject(new AjaxOption("animationDuration", AjaxOption.NUMBER));
+ ajaxOptionsArray.addObject(new AjaxOption("useFadeInOut", AjaxOption.BOOLEAN));
+ ajaxOptionsArray.addObject(new AjaxOption("startView", AjaxOption.STRING));
+ ajaxOptionsArray.addObject(new AjaxOption("allowEmpty", AjaxOption.BOOLEAN));
+ ajaxOptionsArray.addObject(new AjaxOption("positionOffset", AjaxOption.ARRAY));
+ ajaxOptionsArray.addObject(new AjaxOption("minDate", AjaxOption.STRING));
+ ajaxOptionsArray.addObject(new AjaxOption("maxDate", AjaxOption.STRING));
+ ajaxOptionsArray.addObject(new AjaxOption("debug", AjaxOption.BOOLEAN));
+ ajaxOptionsArray.addObject(new AjaxOption("onShow", AjaxOption.SCRIPT));
+ ajaxOptionsArray.addObject(new AjaxOption("onClose", AjaxOption.SCRIPT));
+ ajaxOptionsArray.addObject(new AjaxOption("onSelect", AjaxOption.SCRIPT));
+
+ NSMutableDictionary options = AjaxOption.createAjaxOptionsDictionary(ajaxOptionsArray, this);
+ options.takeValueForKey(format(), "format");
+ options.takeValueForKey(format(), "inputOutputFormat");
+ return options;
+
+ }
+
+}
\ No newline at end of file
diff --git a/Frameworks/Ajax/MooTools/Sources/er/ajax/mootools/MTJSSlider.java b/Frameworks/Ajax/MooTools/Sources/er/ajax/mootools/MTJSSlider.java
new file mode 100644
index 00000000000..3f3cc92221a
--- /dev/null
+++ b/Frameworks/Ajax/MooTools/Sources/er/ajax/mootools/MTJSSlider.java
@@ -0,0 +1,147 @@
+package er.ajax.mootools;
+
+import com.webobjects.appserver.WOActionResults;
+import com.webobjects.appserver.WOComponent;
+import com.webobjects.appserver.WOContext;
+import com.webobjects.appserver.WOElement;
+import com.webobjects.appserver.WORequest;
+import com.webobjects.appserver.WOResponse;
+import com.webobjects.foundation.NSDictionary;
+import com.webobjects.foundation.NSMutableArray;
+import com.webobjects.foundation.NSMutableDictionary;
+
+import er.ajax.AjaxDynamicElement;
+import er.ajax.AjaxOption;
+import er.ajax.AjaxOptions;
+import er.ajax.AjaxUtils;
+import er.extensions.appserver.ERXWOContext;
+
+/**
+ * Creates a JavaScript slider
+ * see the MooTools documentation here: http://mootools.net/docs/more/Drag/Slider
+ *
+ * The HTML for the slider will be written like this:
+ * >div id="_1Element" class="element"<
+ * >div id="_2Knob" class="knob">>/div<
+ * >/div<
+ *
+ * @binding id - the identifer for the slider's JS var.
+ * @binding element the identifier to be used for the slider's container
+ * @binding knob the identifier to be used for the knob's container.
+ * @binding elementClass the CSS class to be used on the slider's container.
+ * @binding element - (element) The container element for the slider.
+ * @binding knob - (element) The handle element for the slider.
+ * OPTIONS
+ * @binding snap - (boolean: defaults to false) True if you want the knob to snap to the nearest value.
+ * @binding offset - (number: defaults to 0) Relative offset for knob position at start.
+ * @binding range - (mixed: defaults to false) Array of numbers or false. The minimum and maximum limits values the slider will use.
+ * @binding wheel - (boolean: defaults to false) True if you want the ability to move the knob by mousewheeling.
+ * @binding steps - (number: defaults to 100) The number of steps the Slider should move/tick.
+ * @binding mode - (string: defaults to horizontal) The type of Slider can be either 'horizontal' or 'vertical' in movement.
+ * @binding initialStep - (number: defaults to 0) The step the slider will start at.
+ *
+ * OBSERVER
+ * @binding the id of the element who will update the slider's value with it's value.
+ * @binding the event to observer on defaults to "change"
+ *
+ * This is the layout of the HTML that the
+ *
+ *
+ * @author johnnymiller
+ *
+ */
+
+
+public class MTJSSlider extends AjaxDynamicElement {
+
+ public MTJSSlider(String name, NSDictionary associations, WOElement children) {
+ super(name, associations, children);
+ }
+
+ public void appendToResponse(WOResponse response, WOContext context) {
+
+ // TODO Auto-generated method stub
+
+ WOComponent component = context.component();
+ String sliderID = (String)valueForBinding("id", ERXWOContext.safeIdentifierName(context, true) + "Slider", component);
+ String elementID = (String)valueForBinding("element", ERXWOContext.safeIdentifierName(context, true) + "Element", component);
+ String knobID = (String)valueForBinding("knob", ERXWOContext.safeIdentifierName(context, true) + "Knob", component);
+ response.appendContentString("\n");
+ response.appendContentString("\n\t
");
+ response.appendContentString("\n
\n");
+
+ AjaxUtils.appendScriptHeader(response);
+ response.appendContentString("var ");
+ response.appendContentString(sliderID);
+ response.appendContentString(";");
+ response.appendContentString("\nwindow.addEvent('domready', function() {");
+ response.appendContentString("\n\t");
+ response.appendContentString(sliderID);
+ response.appendContentString(" = new Slider('");
+ response.appendContentString(elementID);
+ response.appendContentString("', '");
+ response.appendContentString(knobID);
+ response.appendContentString("', {");
+ AjaxOptions._appendToResponse(createOptions(component), response, context);
+ response.appendContentString("});");
+
+ String observer = stringValueForBinding("observer", component);
+ if(observer != null) {
+ String observerEvent = (String)valueForBinding("observerEvent", "change", component);
+ response.appendContentString("\n\t$('");
+ response.appendContentString(observer);
+ response.appendContentString("').addEvent('");
+ response.appendContentString(observerEvent);
+ response.appendContentString("', function(e) { ");
+ response.appendContentString("this.set(e.target.value);");
+ response.appendContentString("}.bind(");
+ response.appendContentString(sliderID);
+ response.appendContentString("));");
+ }
+
+ response.appendContentString("\n});\n");
+ AjaxUtils.appendScriptFooter(response);
+ super.appendToResponse(response, context);
+
+ }
+
+ @SuppressWarnings({ "rawtypes", "unchecked" })
+ protected NSMutableDictionary createOptions(WOComponent component) {
+
+ NSMutableArray ajaxOptionsArray = new NSMutableArray();
+ ajaxOptionsArray.addObject(new AjaxOption("snap", AjaxOption.BOOLEAN));
+ ajaxOptionsArray.addObject(new AjaxOption("offset", AjaxOption.NUMBER));
+ ajaxOptionsArray.addObject(new AjaxOption("range", AjaxOption.ARRAY));
+ ajaxOptionsArray.addObject(new AjaxOption("wheel", AjaxOption.BOOLEAN));
+ ajaxOptionsArray.addObject(new AjaxOption("steps", AjaxOption.NUMBER));
+ ajaxOptionsArray.addObject(new AjaxOption("mode", AjaxOption.STRING));
+ ajaxOptionsArray.addObject(new AjaxOption("onChange", AjaxOption.SCRIPT));
+ ajaxOptionsArray.addObject(new AjaxOption("onComplete", AjaxOption.SCRIPT));
+ ajaxOptionsArray.addObject(new AjaxOption("onTick", AjaxOption.SCRIPT));
+ NSMutableDictionary options = AjaxOption.createAjaxOptionsDictionary(ajaxOptionsArray, component, associations());
+ return options;
+
+ }
+
+ @Override
+ protected void addRequiredWebResources(WOResponse response,
+ WOContext context) {
+ MTAjaxUtils.addScriptResourceInHead(context, context.response(), "MooTools", MTAjaxUtils.MOOTOOLS_CORE_JS);
+ MTAjaxUtils.addScriptResourceInHead(context, context.response(), "MooTools", MTAjaxUtils.MOOTOOLS_MORE_JS);
+ }
+
+ @Override
+ public WOActionResults handleRequest(WORequest request, WOContext context) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+
+
+}
\ No newline at end of file
diff --git a/Frameworks/Ajax/MooTools/WebServerResources/scripts/core/MTWonder.js b/Frameworks/Ajax/MooTools/WebServerResources/scripts/core/MTWonder.js
new file mode 100644
index 00000000000..40cc8407863
--- /dev/null
+++ b/Frameworks/Ajax/MooTools/WebServerResources/scripts/core/MTWonder.js
@@ -0,0 +1,483 @@
+/*
+ The code in this file is based upon wonder.js. Which is used in Project Wonder's Ajax Framework.
+ http://wiki.wocommunity.org/display/WO/Project+WONDER-Frameworks-Ajax-AjaxUpdateContainer
+ MoWonder.js ports the functionality found in wonder.js to MooTools. wonder.js is based upon Prototype/Scriptaculous
+ @author Jonathan Miller
+ */
+
+
+ var $wi = $;
+
+ String.implement({
+
+ addQueryParameters: function(additionalParameters) {
+ if(additionalParameters) {
+ return this + (this.match(/\?/) ? '&' : '?') + additionalParameters;
+ } else {
+ return this;
+ }
+ },
+
+ blank: function() {
+ return this.trim().length === 0;
+ }
+
+ });
+
+var MTAjaxOptions = {
+
+ defaultOptions: function(additionalOptions) {
+ var options = {
+ method: 'get',
+ async: true,
+ evalScripts: true
+ };
+
+ return Object.merge(options, additionalOptions);
+
+ }
+
+}
+
+var MTAjaxUpdateContainer = {
+
+ registerPeriodic: function(id, canStop, stopped, options) {
+
+ var el = $(id);
+ var url = el.get('updateUrl');
+ var updater;
+ if(!canStop) {
+
+ var merged = Object.merge(MTAjaxOptions.defaultOptions(options), {
+ update: el,
+ url: url
+ });
+
+ if(! merged.delay && options.frequency) {
+ merged.delay = options.frequency * 1000;
+ }
+ if(! merged.initialDelay && options.frequency) {
+ merged.initialDelay = merged.delay;
+ }
+ updater = new Request.HTML(merged).startTimer();
+
+ }
+
+ },
+
+ insertionFunc: function() {},
+
+ register : function(id, options) {
+ if(!options) options = {},
+ eval(id + "Update = function() { MTAjaxUpdateContainer.update(id, options); }");
+ },
+
+ update: function(id, options) {
+
+ var updateElement = $(id);
+
+ if(updateElement == null) {
+ alert('There is no element on this page with the id "' + id + '".');
+ }
+
+ var actionUrl = updateElement.get('updateUrl');
+ actionUrl = actionUrl.addQueryParameters('__updateID=' + id);
+// new Ajax.Updater(id, actionUrl, AjaxOptions.defaultOptions(options));
+ new Request.HTML(Object.merge(MTAjaxOptions.defaultOptions(options), {
+ update : $(id),
+ url : actionUrl
+ })).send();
+
+ }
+
+}
+
+var MTAUC = MTAjaxUpdateContainer;
+
+var MTAjaxUpdateLink = {
+
+ updateFunc: function(id, options, elementID) {
+ var updateFunction = function(queryParams) {
+ MTAjaxUpdateLink.update(id, options, elementID, queryParams);
+ }
+ return updateFunction;
+ },
+
+ update: function(id, options, elementID, queryParams) {
+ var updateElement = $(id);
+ if(updateElement == null) {
+ alert('There is no element on this page with the id "' + id + '".');
+ }
+ MTAjaxUpdateLink._update(id, updateElement.get('updateUrl'), options, elementID, queryParams);
+ },
+
+ _update: function(id, actionUrl, options, elementID, queryParams) {
+
+ if(elementID) {
+ actionUrl = actionUrl.replace(/[^\/]+$/, elementID);
+ }
+
+ options.url = actionUrl;
+ options.update = $(id);
+ options.__updateID = id;
+ options.noCache = true;
+
+ if(options && options['_r']) {
+ options._r = id;
+ }
+ else {
+ options._u = id;
+ }
+
+ new Request.HTML(MTAjaxOptions.defaultOptions(options)).send(queryParams);
+
+ },
+
+ request: function() {
+
+ if(actionUrl, options, elementID, queryParams) {
+ actionUrl = actionUrl.replace(/[^\/]+$/, elementID);
+ }
+
+ options = Object.merge(options, queryParams.parseQueryString());
+ options.url = actionUrl;
+
+ new Request(MTAjaxOptions.defaultOptions(options)).send();
+
+ }
+
+}
+
+var MTAUL = MTAjaxUpdateLink;
+
+var MTAjaxSubmitButton = {
+
+ PartialFormSenderIDKey: '_partialSenderID',
+ AjaxSubmitButtonNameKey: 'AJAX_SUBMIT_BUTTON_NAME',
+ defaultOptions: function(additionalOptions) {
+ var options = MTAjaxOptions.defaultOptions(additionalOptions);
+ options.method = 'post';
+ options.noCache = true;
+ return options;
+ },
+
+ generateActionUrl: function(id, form, queryParams) {
+ var actionUrl = form.action;
+
+ if(queryParams != null) {
+ actionUrl = actionUrl.addQueryParameters(queryParams);
+ }
+
+ actionUrl = actionUrl.replace('/wo/', '/ajax/');
+
+ if(id != null) {
+ actionUrl = actionUrl.addQueryParameters('__updateID=' + id);
+ }
+
+ return actionUrl;
+
+ },
+
+ processOptions: function(form, options) {
+ var processedOptions = null;
+
+ if(options != null) {
+ processedOptions = Object.merge(new Object(), options);
+ var ajaxSubmitButtonName = processedOptions._asbn;
+ if(ajaxSubmitButtonName != null) {
+ processedOptions._asbn = null;
+ var parameters = processedOptions.parameters;
+ if(parameters === undefined || parameters == null) {
+ var formSerializer = processedOptions._fs;
+ var serializedForm = $(form).toQueryString();
+ processedOptions.parameters = serializedForm +
+ '&' + MTAjaxSubmitButton.AjaxSubmitButtonNameKey + '=' + ajaxSubmitButtonName;
+
+ } else {
+ processedOptions.parameters = parameters +
+ '&' + MTAjaxSubmitButton.AjaxSubmitButtonNameKey + '=' + ajaxSubmitButtonName;
+ }
+ }
+ }
+
+ processedOptions = MTAjaxSubmitButton.defaultOptions(processedOptions);
+ return processedOptions;
+
+ },
+
+ partial: function(updateContainerID, formFieldID, options) {
+
+ var optionsCopy = Object.merge(new Object(), options);
+ var formField = $(formFieldID);
+ var form = formField.form;
+
+ var queryParams = {};
+ queryParams[formField.name] = formField.get('value');
+ queryParams[MTAjaxSubmitButton.PartialFormSenderIDKey] = formField.name;
+ optionsCopy['parameters'] = Object.toQueryString(queryParams);
+
+
+ if(updateContainerID == null) {
+ MTAjaxSubmitButton.request(form, null, optionsCopy);
+ } else {
+ MTAjaxSubmitButton.update(updateContainerID, form, null, optionsCopy);
+ }
+
+ },
+
+ preventEnterKeySubmit : function() {
+ $$('.m-a-s-b').each(function(el) {
+ $(el.form).addEvent('keydown', function(e) {
+ if(e.key == 'enter' && e.target.tagName != 'SELECT') {
+ e.preventDefault();
+ }
+ });
+ });
+ },
+
+ update : function(id, form, queryParams, options) {
+ var updateElement = $(id);
+ if(updateElement == null) {
+ alert('There is no element on this page with the id "' + id + '".');
+ }
+ var finalUrl = MTAjaxSubmitButton.generateActionUrl(id, form, queryParams);
+ var finalOptions = MTAjaxSubmitButton.processOptions(form, options);
+ new Request.HTML(Object.merge({
+ update : id,
+ url : finalUrl
+ }, finalOptions)).send(finalOptions.parameters);
+
+ },
+
+ request : function(form, queryParams, options) {
+
+ var finalUrl = MTAjaxSubmitButton.generateActionUrl(id, form, queryParams);
+ var finalOptions = MTAjaxSubmitButton.processOptions(form, options);
+
+ new Request.HTML(Object.merge({
+ url : finalUrl
+ }, finalOptions)).send(finalOptions.parameters);
+
+ },
+
+ observeDescendentFields : function(updateContainerID, containerID, observeFieldFrequency, partial, observeDelay, options) {
+ $(containerID).getChildren().each(function(element) {
+ if(element.type != 'hidden' && ['input', 'select', 'textarea'].contains(element.tagName.toLowerCase())){
+ MTAjaxSubmitButton.observeField(updateContainerID, element, observeFieldFrequency, partial, observeDelay, options);
+ }
+ });
+ },
+
+ observeField: function(updateContainerID, formFieldID, observeFieldFrequency, partial, observeDelay, options) {
+
+ var submitFunction;
+
+ if(partial) {
+ submitFunction = function(element, value) {
+ if(!options.onBeforeSubmit || options.onBeforeSubmit(formFieldID)) {
+ MTASB.partial(updateContainerID, formFieldID, options);
+ }
+ }
+ } else if (updateContainerID != null) {
+ submitFunction = function(element, value) {
+ if(!options.onBeforeSubmit || options.onBeforeSubmit(formFieldID)) {
+ MTASB.update(updateContainerID, $(formFieldID), null, options);
+ }
+ }
+ } else {
+ submitFunction = function(element, value) {
+ if (!options.onBeforeSubmit || options.onBeforeSubmit(formFieldID)) {
+ MTASB.request($(formFieldID).form, null, options);
+ }
+ }
+
+ }
+
+ if(observeDelay) {
+ var delayer = new MTAjaxObserveDelayer(observeDelay, submitFunction);
+ submitFunction = delayer.valueChanged.bind(delayer);
+ }
+
+ $(formFieldID).addEvent('change', submitFunction);
+
+ }
+
+};
+
+
+var MTASB = MTAjaxSubmitButton;
+
+var MTAjaxObserveDelayer = new Class({
+
+ delay: null,
+ waiting: null,
+ lastValueChange: null,
+ submitFunction: null,
+ element: null,
+ value: null,
+
+ initialize: function(delay, submitFunction) {
+ this.delay = delay * 1000.0;
+ this.submitFunction = submitFunction;
+ },
+
+ valueChanged: function(element, value) {
+
+ this.element = element;
+ this.value = value;
+ this.lastValueChange = new Date().getTime();
+
+ if (!this.waiting) {
+ this.waiting = true;
+ var lastValueChange = this.lastValueChange;
+ setTimeout(this.delayFinished.bind(this, lastValueChange), this.delay);
+ }
+
+ },
+
+ delayFinished: function(lastValueChange) {
+ if (lastValueChange == this.lastValueChange) {
+ this.waiting = false;
+ this.submitFunction(this.element, this.value);
+ }
+ else {
+ var newLastValueChange = this.lastValueChange;
+ var now = new Date().getTime();
+ var delayLeft = Math.max(250, this.delay - (now - newLastValueChange));
+ setTimeout(this.delayFinished.bind(this, newLastValueChange), delayLeft);
+ }
+ }
+
+
+});
+
+var MTAjaxDraggable = new Class({
+
+ Implements: [Options, Events],
+
+ options: {
+
+ draggableKeyName: '',
+ draggableKeyName: null,
+ droppableElementID: null,
+
+ grid: 0,
+ handle: null,
+ invert: false,
+ limit: false,
+ modifiers: {x: 'left', y: 'top'},
+ style: true,
+ snap: 6,
+ unit: 'px',
+ preventDefault: false,
+ stopPropagation: false,
+ container: null,
+ droppables: '',
+ precalculate: false,
+ includeMargins: true,
+ checkDroppables: true,
+
+ ghost: false,
+ ghostOpacity: 0.7,
+
+ id:null,
+ useSpinner: false
+ /*
+ beforeStart: function(draggable) {},
+ onStart: function(draggable) {},
+ onSnap: function(draggable) {},
+ onDrag: function(draggable) {},
+ onComplete: function(draggable) {},
+ onCancel: function(draggable) {},
+ afterDrop: function(element, droppables) {},
+ onDrop: function(element, droppables) {},
+ onEnter: function(element, droppables) {},
+ onLeave: function(element, droppables) {},
+ */
+ },
+
+ initialize : function(updateContainerID, options) {
+ Object.merge(this.options, options);
+ this.setOptions(options);
+ this.element = $(this.options.id);
+ this.updateContainer = $(updateContainerID);
+ var draggableContainer;
+ var draggableContainerName = 'draggable_' + this.options.id;
+ var draggableContainerType = eval("typeof " + draggableContainerName);
+
+ if (draggableContainerType != 'undefined') {
+ eval(draggableContainerName).destroy();
+ }
+ if(this.element == null) {
+ alert("Please supply the draggable element's id.");
+ } else {
+
+ if(this.options.ghost) {
+
+ this.element.addEvent('mousedown', function(event) {
+ var clone = this.element.clone().setStyles(this.element.getCoordinates())
+ .setStyles({opacity: this.options.ghostOpacity, position: 'absolute'}).inject(document.body);
+ draggableContainer = clone;
+ var drag = new Drag.Move(clone, Object.merge(this.options, { onDrop: this._onDrop.bind(this), onEnter: this.enter.bind(this), onLeave: this.leave.bind(this) }));
+ drag.start(event);
+
+ }.bind(this));
+
+ } else {
+ draggableContainer = element;
+ element.makeDraggable(this.options);
+ }
+
+ eval(draggableContainerName + "=draggableContainer");
+
+ }
+
+ },
+
+ _onDrop: function(element, droppable) {
+
+ element = $(element);
+ if(droppable) {
+
+ var draggableID = element.get('draggableID');
+ var droppedAreaID = droppable.get('id');
+
+ if(draggableID == null)
+ draggableID = element.get('id');
+
+ var data = this.options.draggableKeyName + '=' + draggableID + "&" + "dropAreaID=" + droppedAreaID;
+
+ if(this.updateContainer == null) {
+ if(this.form) {
+
+ }
+ } else {
+ if(this.options.form) {
+
+ } else {
+ MTAUL.update(this.updateContainer, {}, this.options.contextID + '.' + this.options.elementID, data);
+ }
+ }
+ }
+
+ element.destroy();
+ this.drop(element, droppable);
+
+ },
+ drop: function(element, droppable) {
+ this.fireEvent("drop", [element, droppable]);
+ },
+ enter: function(element, droppable) {
+ this.fireEvent("enter", [element, droppable]);
+ },
+
+ leave: function(element, droppable) {
+ this.fireEvent("leave", [element, droppable]);
+ }
+
+});
+
+var MTAD = MTAjaxDraggable;
+
+
+
diff --git a/Frameworks/Ajax/MooTools/WebServerResources/scripts/core/mootools-core-1.4.4-yc.js b/Frameworks/Ajax/MooTools/WebServerResources/scripts/core/mootools-core-1.4.4-yc.js
new file mode 100644
index 00000000000..71e8e76db3e
--- /dev/null
+++ b/Frameworks/Ajax/MooTools/WebServerResources/scripts/core/mootools-core-1.4.4-yc.js
@@ -0,0 +1,490 @@
+/*
+---
+MooTools: the javascript framework
+
+web build:
+ - http://mootools.net/core/76bf47062d6c1983d66ce47ad66aa0e0
+
+packager build:
+ - packager build Core/Core Core/Array Core/String Core/Number Core/Function Core/Object Core/Event Core/Browser Core/Class Core/Class.Extras Core/Slick.Parser Core/Slick.Finder Core/Element Core/Element.Style Core/Element.Event Core/Element.Delegation Core/Element.Dimensions Core/Fx Core/Fx.CSS Core/Fx.Tween Core/Fx.Morph Core/Fx.Transitions Core/Request Core/Request.HTML Core/Request.JSON Core/Cookie Core/JSON Core/DOMReady Core/Swiff
+
+copyrights:
+ - [MooTools](http://mootools.net)
+
+licenses:
+ - [MIT License](http://mootools.net/license.txt)
+...
+*/
+
+(function(){this.MooTools={version:"1.4.4",build:"adb02e676407521b516ffa10d2dc6b54237a80f9"};var o=this.typeOf=function(i){if(i==null){return"null";}if(i.$family!=null){return i.$family();
+}if(i.nodeName){if(i.nodeType==1){return"element";}if(i.nodeType==3){return(/\S/).test(i.nodeValue)?"textnode":"whitespace";}}else{if(typeof i.length=="number"){if(i.callee){return"arguments";
+}if("item" in i){return"collection";}}}return typeof i;};var j=this.instanceOf=function(t,i){if(t==null){return false;}var s=t.$constructor||t.constructor;
+while(s){if(s===i){return true;}s=s.parent;}if(!t.hasOwnProperty){return false;}return t instanceof i;};var f=this.Function;var p=true;for(var k in {toString:1}){p=null;
+}if(p){p=["hasOwnProperty","valueOf","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","constructor"];}f.prototype.overloadSetter=function(s){var i=this;
+return function(u,t){if(u==null){return this;}if(s||typeof u!="string"){for(var v in u){i.call(this,v,u[v]);}if(p){for(var w=p.length;w--;){v=p[w];if(u.hasOwnProperty(v)){i.call(this,v,u[v]);
+}}}}else{i.call(this,u,t);}return this;};};f.prototype.overloadGetter=function(s){var i=this;return function(u){var v,t;if(s||typeof u!="string"){v=u;}else{if(arguments.length>1){v=arguments;
+}}if(v){t={};for(var w=0;w>>0;
+b>>0;b >>0;for(var a=(d<0)?Math.max(0,b+d):d||0;a>>0,b=Array(d);for(var a=0;a>>0;
+b-1:String(this).indexOf(a)>-1;},trim:function(){return String(this).replace(/^\s+|\s+$/g,"");
+},clean:function(){return String(this).replace(/\s+/g," ").trim();},camelCase:function(){return String(this).replace(/-\D/g,function(a){return a.charAt(1).toUpperCase();
+});},hyphenate:function(){return String(this).replace(/[A-Z]/g,function(a){return("-"+a.charAt(0).toLowerCase());});},capitalize:function(){return String(this).replace(/\b[a-z]/g,function(a){return a.toUpperCase();
+});},escapeRegExp:function(){return String(this).replace(/([-.*+?^${}()|[\]\/\\])/g,"\\$1");},toInt:function(a){return parseInt(this,a||10);},toFloat:function(){return parseFloat(this);
+},hexToRgb:function(b){var a=String(this).match(/^#?(\w{1,2})(\w{1,2})(\w{1,2})$/);return(a)?a.slice(1).hexToRgb(b):null;},rgbToHex:function(b){var a=String(this).match(/\d{1,3}/g);
+return(a)?a.rgbToHex(b):null;},substitute:function(a,b){return String(this).replace(b||(/\\?\{([^{}]+)\}/g),function(d,c){if(d.charAt(0)=="\\"){return d.slice(1);
+}return(a[c]!=null)?a[c]:"";});}});Number.implement({limit:function(b,a){return Math.min(a,Math.max(b,this));},round:function(a){a=Math.pow(10,a||0).toFixed(a<0?-a:0);
+return Math.round(this*a)/a;},times:function(b,c){for(var a=0;a1?Array.slice(arguments,1):null,d=function(){};var c=function(){var g=e,h=arguments.length;if(this instanceof c){d.prototype=a.prototype;
+g=new d;}var f=(!b&&!h)?a.call(g):a.apply(g,b&&h?b.concat(Array.slice(arguments)):b||arguments);return g==e?f:g;};return c;},pass:function(b,c){var a=this;
+if(b!=null){b=Array.from(b);}return function(){return a.apply(c,b||arguments);};},delay:function(b,c,a){return setTimeout(this.pass((a==null?[]:a),c),b);
+},periodical:function(c,b,a){return setInterval(this.pass((a==null?[]:a),b),c);}});(function(){var a=Object.prototype.hasOwnProperty;Object.extend({subset:function(d,g){var f={};
+for(var e=0,b=g.length;e]*>([\s\S]*?)<\/script>/gi,function(q,r){e+=r+"\n";
+return"";});if(o===true){n.exec(e);}else{if(typeOf(o)=="function"){o(e,p);}}return p;});n.extend({Document:this.Document,Window:this.Window,Element:this.Element,Event:this.Event});
+this.Window=this.$constructor=new Type("Window",function(){});this.$family=Function.from("window").hide();Window.mirror(function(e,o){g[e]=o;});this.Document=j.$constructor=new Type("Document",function(){});
+j.$family=Function.from("document").hide();Document.mirror(function(e,o){j[e]=o;});j.html=j.documentElement;if(!j.head){j.head=j.getElementsByTagName("head")[0];
+}if(j.execCommand){try{j.execCommand("BackgroundImageCache",false,true);}catch(f){}}if(this.attachEvent&&!this.addEventListener){var c=function(){this.detachEvent("onunload",c);
+j.head=j.html=j.window=null;};this.attachEvent("onunload",c);}var l=Array.from;try{l(j.html.childNodes);}catch(f){Array.from=function(o){if(typeof o!="string"&&Type.isEnumerable(o)&&typeOf(o)!="array"){var e=o.length,p=new Array(e);
+while(e--){p[e]=o[e];}return p;}return l(o);};var k=Array.prototype,m=k.slice;["pop","push","reverse","shift","sort","splice","unshift","concat","join","slice"].each(function(e){var o=k[e];
+Array[e]=function(p){return o.apply(Array.from(p),m.call(arguments,1));};});}})();(function(){var b={};var a=this.DOMEvent=new Type("DOMEvent",function(c,g){if(!g){g=window;
+}c=c||g.event;if(c.$extended){return c;}this.event=c;this.$extended=true;this.shift=c.shiftKey;this.control=c.ctrlKey;this.alt=c.altKey;this.meta=c.metaKey;
+var i=this.type=c.type;var h=c.target||c.srcElement;while(h&&h.nodeType==3){h=h.parentNode;}this.target=document.id(h);if(i.indexOf("key")==0){var d=this.code=(c.which||c.keyCode);
+this.key=b[d];if(i=="keydown"){if(d>111&&d<124){this.key="f"+(d-111);}else{if(d>95&&d<106){this.key=d-96;}}}if(this.key==null){this.key=String.fromCharCode(d).toLowerCase();
+}}else{if(i=="click"||i=="dblclick"||i=="contextmenu"||i=="DOMMouseScroll"||i.indexOf("mouse")==0){var j=g.document;j=(!j.compatMode||j.compatMode=="CSS1Compat")?j.html:j.body;
+this.page={x:(c.pageX!=null)?c.pageX:c.clientX+j.scrollLeft,y:(c.pageY!=null)?c.pageY:c.clientY+j.scrollTop};this.client={x:(c.pageX!=null)?c.pageX-g.pageXOffset:c.clientX,y:(c.pageY!=null)?c.pageY-g.pageYOffset:c.clientY};
+if(i=="DOMMouseScroll"||i=="mousewheel"){this.wheel=(c.wheelDelta)?c.wheelDelta/120:-(c.detail||0)/3;}this.rightClick=(c.which==3||c.button==2);if(i=="mouseover"||i=="mouseout"){var k=c.relatedTarget||c[(i=="mouseover"?"from":"to")+"Element"];
+while(k&&k.nodeType==3){k=k.parentNode;}this.relatedTarget=document.id(k);}}else{if(i.indexOf("touch")==0||i.indexOf("gesture")==0){this.rotation=c.rotation;
+this.scale=c.scale;this.targetTouches=c.targetTouches;this.changedTouches=c.changedTouches;var f=this.touches=c.touches;if(f&&f[0]){var e=f[0];this.page={x:e.pageX,y:e.pageY};
+this.client={x:e.clientX,y:e.clientY};}}}}if(!this.client){this.client={};}if(!this.page){this.page={};}});a.implement({stop:function(){return this.preventDefault().stopPropagation();
+},stopPropagation:function(){if(this.event.stopPropagation){this.event.stopPropagation();}else{this.event.cancelBubble=true;}return this;},preventDefault:function(){if(this.event.preventDefault){this.event.preventDefault();
+}else{this.event.returnValue=false;}return this;}});a.defineKey=function(d,c){b[d]=c;return this;};a.defineKeys=a.defineKey.overloadSetter(true);a.defineKeys({"38":"up","40":"down","37":"left","39":"right","27":"esc","32":"space","8":"backspace","9":"tab","46":"delete","13":"enter"});
+})();(function(){var a=this.Class=new Type("Class",function(h){if(instanceOf(h,Function)){h={initialize:h};}var g=function(){e(this);if(g.$prototyping){return this;
+}this.$caller=null;var i=(this.initialize)?this.initialize.apply(this,arguments):this;this.$caller=this.caller=null;return i;}.extend(this).implement(h);
+g.$constructor=a;g.prototype.$constructor=g;g.prototype.parent=c;return g;});var c=function(){if(!this.$caller){throw new Error('The method "parent" cannot be called.');
+}var g=this.$caller.$name,h=this.$caller.$owner.parent,i=(h)?h.prototype[g]:null;if(!i){throw new Error('The method "'+g+'" has no parent.');}return i.apply(this,arguments);
+};var e=function(g){for(var h in g){var j=g[h];switch(typeOf(j)){case"object":var i=function(){};i.prototype=j;g[h]=e(new i);break;case"array":g[h]=j.clone();
+break;}}return g;};var b=function(g,h,j){if(j.$origin){j=j.$origin;}var i=function(){if(j.$protected&&this.$caller==null){throw new Error('The method "'+h+'" cannot be called.');
+}var l=this.caller,m=this.$caller;this.caller=m;this.$caller=i;var k=j.apply(this,arguments);this.$caller=m;this.caller=l;return k;}.extend({$owner:g,$origin:j,$name:h});
+return i;};var f=function(h,i,g){if(a.Mutators.hasOwnProperty(h)){i=a.Mutators[h].call(this,i);if(i==null){return this;}}if(typeOf(i)=="function"){if(i.$hidden){return this;
+}this.prototype[h]=(g)?i:b(this,h,i);}else{Object.merge(this.prototype,h,i);}return this;};var d=function(g){g.$prototyping=true;var h=new g;delete g.$prototyping;
+return h;};a.implement("implement",f.overloadSetter());a.Mutators={Extends:function(g){this.parent=g;this.prototype=d(g);},Implements:function(g){Array.from(g).each(function(j){var h=new j;
+for(var i in h){f.call(this,i,h[i],true);}},this);}};})();(function(){this.Chain=new Class({$chain:[],chain:function(){this.$chain.append(Array.flatten(arguments));
+return this;},callChain:function(){return(this.$chain.length)?this.$chain.shift().apply(this,arguments):false;},clearChain:function(){this.$chain.empty();
+return this;}});var a=function(b){return b.replace(/^on([A-Z])/,function(c,d){return d.toLowerCase();});};this.Events=new Class({$events:{},addEvent:function(d,c,b){d=a(d);
+this.$events[d]=(this.$events[d]||[]).include(c);if(b){c.internal=true;}return this;},addEvents:function(b){for(var c in b){this.addEvent(c,b[c]);}return this;
+},fireEvent:function(e,c,b){e=a(e);var d=this.$events[e];if(!d){return this;}c=Array.from(c);d.each(function(f){if(b){f.delay(b,this,c);}else{f.apply(this,c);
+}},this);return this;},removeEvent:function(e,d){e=a(e);var c=this.$events[e];if(c&&!d.internal){var b=c.indexOf(d);if(b!=-1){delete c[b];}}return this;
+},removeEvents:function(d){var e;if(typeOf(d)=="object"){for(e in d){this.removeEvent(e,d[e]);}return this;}if(d){d=a(d);}for(e in this.$events){if(d&&d!=e){continue;
+}var c=this.$events[e];for(var b=c.length;b--;){if(b in c){this.removeEvent(e,c[b]);}}}return this;}});this.Options=new Class({setOptions:function(){var b=this.options=Object.merge.apply(null,[{},this.options].append(arguments));
+if(this.addEvent){for(var c in b){if(typeOf(b[c])!="function"||!(/^on[A-Z]/).test(c)){continue;}this.addEvent(c,b[c]);delete b[c];}}return this;}});})();
+(function(){var k,n,l,g,a={},c={},m=/\\/g;var e=function(q,p){if(q==null){return null;}if(q.Slick===true){return q;}q=(""+q).replace(/^\s+|\s+$/g,"");g=!!p;
+var o=(g)?c:a;if(o[q]){return o[q];}k={Slick:true,expressions:[],raw:q,reverse:function(){return e(this.raw,true);}};n=-1;while(q!=(q=q.replace(j,b))){}k.length=k.expressions.length;
+return o[k.raw]=(g)?h(k):k;};var i=function(o){if(o==="!"){return" ";}else{if(o===" "){return"!";}else{if((/^!/).test(o)){return o.replace(/^!/,"");}else{return"!"+o;
+}}}};var h=function(u){var r=u.expressions;for(var p=0;p+)\\s*|(\\s+)|(+|\\*)|\\#(+)|\\.(+)|\\[\\s*(+)(?:\\s*([*^$!~|]?=)(?:\\s*(?:([\"']?)(.*?)\\9)))?\\s*\\](?!\\])|(:+)(+)(?:\\((?:(?:([\"'])([^\\13]*)\\13)|((?:\\([^)]+\\)|[^()]*)+))\\))?)".replace(//,"["+f(">+~`!@$%^&={}\\;")+"]").replace(//g,"(?:[\\w\\u00a1-\\uFFFF-]|\\\\[^\\s0-9a-f])").replace(//g,"(?:[:\\w\\u00a1-\\uFFFF-]|\\\\[^\\s0-9a-f])"));
+function b(x,s,D,z,r,C,q,B,A,y,u,F,G,v,p,w){if(s||n===-1){k.expressions[++n]=[];l=-1;if(s){return"";}}if(D||z||l===-1){D=D||" ";var t=k.expressions[n];
+if(g&&t[l]){t[l].reverseCombinator=i(D);}t[++l]={combinator:D,tag:"*"};}var o=k.expressions[n][l];if(r){o.tag=r.replace(m,"");}else{if(C){o.id=C.replace(m,"");
+}else{if(q){q=q.replace(m,"");if(!o.classList){o.classList=[];}if(!o.classes){o.classes=[];}o.classList.push(q);o.classes.push({value:q,regexp:new RegExp("(^|\\s)"+f(q)+"(\\s|$)")});
+}else{if(G){w=w||p;w=w?w.replace(m,""):null;if(!o.pseudos){o.pseudos=[];}o.pseudos.push({key:G.replace(m,""),value:w,type:F.length==1?"class":"element"});
+}else{if(B){B=B.replace(m,"");u=(u||"").replace(m,"");var E,H;switch(A){case"^=":H=new RegExp("^"+f(u));break;case"$=":H=new RegExp(f(u)+"$");break;case"~=":H=new RegExp("(^|\\s)"+f(u)+"(\\s|$)");
+break;case"|=":H=new RegExp("^"+f(u)+"(-|$)");break;case"=":E=function(I){return u==I;};break;case"*=":E=function(I){return I&&I.indexOf(u)>-1;};break;
+case"!=":E=function(I){return u!=I;};break;default:E=function(I){return !!I;};}if(u==""&&(/^[*$^]=$/).test(A)){E=function(){return false;};}if(!E){E=function(I){return I&&H.test(I);
+};}if(!o.attributes){o.attributes=[];}o.attributes.push({key:B,operator:A,value:u,test:E});}}}}}return"";}var d=(this.Slick||{});d.parse=function(o){return e(o);
+};d.escapeRegExp=f;if(!this.Slick){this.Slick=d;}}).apply((typeof exports!="undefined")?exports:this);(function(){var k={},m={},d=Object.prototype.toString;
+k.isNativeCode=function(c){return(/\{\s*\[native code\]\s*\}/).test(""+c);};k.isXML=function(c){return(!!c.xmlVersion)||(!!c.xml)||(d.call(c)=="[object XMLDocument]")||(c.nodeType==9&&c.documentElement.nodeName!="HTML");
+};k.setDocument=function(w){var p=w.nodeType;if(p==9){}else{if(p){w=w.ownerDocument;}else{if(w.navigator){w=w.document;}else{return;}}}if(this.document===w){return;
+}this.document=w;var A=w.documentElement,o=this.getUIDXML(A),s=m[o],r;if(s){for(r in s){this[r]=s[r];}return;}s=m[o]={};s.root=A;s.isXMLDocument=this.isXML(w);
+s.brokenStarGEBTN=s.starSelectsClosedQSA=s.idGetsName=s.brokenMixedCaseQSA=s.brokenGEBCN=s.brokenCheckedQSA=s.brokenEmptyAttributeQSA=s.isHTMLDocument=s.nativeMatchesSelector=false;
+var q,u,y,z,t;var x,v="slick_uniqueid";var c=w.createElement("div");var n=w.body||w.getElementsByTagName("body")[0]||A;n.appendChild(c);try{c.innerHTML=' ';
+s.isHTMLDocument=!!w.getElementById(v);}catch(C){}if(s.isHTMLDocument){c.style.display="none";c.appendChild(w.createComment(""));u=(c.getElementsByTagName("*").length>1);
+try{c.innerHTML="foo";x=c.getElementsByTagName("*");q=(x&&!!x.length&&x[0].nodeName.charAt(0)=="/");}catch(C){}s.brokenStarGEBTN=u||q;try{c.innerHTML=' ';
+s.idGetsName=w.getElementById(v)===c.firstChild;}catch(C){}if(c.getElementsByClassName){try{c.innerHTML=' ';c.getElementsByClassName("b").length;
+c.firstChild.className="b";z=(c.getElementsByClassName("b").length!=2);}catch(C){}try{c.innerHTML=' ';y=(c.getElementsByClassName("a").length!=2);
+}catch(C){}s.brokenGEBCN=z||y;}if(c.querySelectorAll){try{c.innerHTML="foo";x=c.querySelectorAll("*");s.starSelectsClosedQSA=(x&&!!x.length&&x[0].nodeName.charAt(0)=="/");
+}catch(C){}try{c.innerHTML=' ';s.brokenMixedCaseQSA=!c.querySelectorAll(".MiX").length;}catch(C){}try{c.innerHTML='a ';
+s.brokenCheckedQSA=(c.querySelectorAll(":checked").length==0);}catch(C){}try{c.innerHTML=' ';s.brokenEmptyAttributeQSA=(c.querySelectorAll('[class*=""]').length!=0);
+}catch(C){}}try{c.innerHTML='';t=(c.firstChild.getAttribute("action")!="s");}catch(C){}s.nativeMatchesSelector=A.matchesSelector||A.mozMatchesSelector||A.webkitMatchesSelector;
+if(s.nativeMatchesSelector){try{s.nativeMatchesSelector.call(A,":slick");s.nativeMatchesSelector=null;}catch(C){}}}try{A.slick_expando=1;delete A.slick_expando;
+s.getUID=this.getUIDHTML;}catch(C){s.getUID=this.getUIDXML;}n.removeChild(c);c=x=n=null;s.getAttribute=(s.isHTMLDocument&&t)?function(G,E){var H=this.attributeGetters[E];
+if(H){return H.call(G);}var F=G.getAttributeNode(E);return(F)?F.nodeValue:null;}:function(F,E){var G=this.attributeGetters[E];return(G)?G.call(F):F.getAttribute(E);
+};s.hasAttribute=(A&&this.isNativeCode(A.hasAttribute))?function(F,E){return F.hasAttribute(E);}:function(F,E){F=F.getAttributeNode(E);return !!(F&&(F.specified||F.nodeValue));
+};var D=A&&this.isNativeCode(A.contains),B=w&&this.isNativeCode(w.contains);s.contains=(D&&B)?function(E,F){return E.contains(F);}:(D&&!B)?function(E,F){return E===F||((E===w)?w.documentElement:E).contains(F);
+}:(A&&A.compareDocumentPosition)?function(E,F){return E===F||!!(E.compareDocumentPosition(F)&16);}:function(E,F){if(F){do{if(F===E){return true;}}while((F=F.parentNode));
+}return false;};s.documentSorter=(A.compareDocumentPosition)?function(F,E){if(!F.compareDocumentPosition||!E.compareDocumentPosition){return 0;}return F.compareDocumentPosition(E)&4?-1:F===E?0:1;
+}:("sourceIndex" in A)?function(F,E){if(!F.sourceIndex||!E.sourceIndex){return 0;}return F.sourceIndex-E.sourceIndex;}:(w.createRange)?function(H,F){if(!H.ownerDocument||!F.ownerDocument){return 0;
+}var G=H.ownerDocument.createRange(),E=F.ownerDocument.createRange();G.setStart(H,0);G.setEnd(H,0);E.setStart(F,0);E.setEnd(F,0);return G.compareBoundaryPoints(Range.START_TO_END,E);
+}:null;A=null;for(r in s){this[r]=s[r];}};var f=/^([#.]?)((?:[\w-]+|\*))$/,h=/\[.+[*$^]=(?:""|'')?\]/,g={};k.search=function(U,z,H,s){var p=this.found=(s)?null:(H||[]);
+if(!U){return p;}else{if(U.navigator){U=U.document;}else{if(!U.nodeType){return p;}}}var F,O,V=this.uniques={},I=!!(H&&H.length),y=(U.nodeType==9);if(this.document!==(y?U:U.ownerDocument)){this.setDocument(U);
+}if(I){for(O=p.length;O--;){V[this.getUID(p[O])]=true;}}if(typeof z=="string"){var r=z.match(f);simpleSelectors:if(r){var u=r[1],v=r[2],A,E;if(!u){if(v=="*"&&this.brokenStarGEBTN){break simpleSelectors;
+}E=U.getElementsByTagName(v);if(s){return E[0]||null;}for(O=0;A=E[O++];){if(!(I&&V[this.getUID(A)])){p.push(A);}}}else{if(u=="#"){if(!this.isHTMLDocument||!y){break simpleSelectors;
+}A=U.getElementById(v);if(!A){return p;}if(this.idGetsName&&A.getAttributeNode("id").nodeValue!=v){break simpleSelectors;}if(s){return A||null;}if(!(I&&V[this.getUID(A)])){p.push(A);
+}}else{if(u=="."){if(!this.isHTMLDocument||((!U.getElementsByClassName||this.brokenGEBCN)&&U.querySelectorAll)){break simpleSelectors;}if(U.getElementsByClassName&&!this.brokenGEBCN){E=U.getElementsByClassName(v);
+if(s){return E[0]||null;}for(O=0;A=E[O++];){if(!(I&&V[this.getUID(A)])){p.push(A);}}}else{var T=new RegExp("(^|\\s)"+e.escapeRegExp(v)+"(\\s|$)");E=U.getElementsByTagName("*");
+for(O=0;A=E[O++];){className=A.className;if(!(className&&T.test(className))){continue;}if(s){return A;}if(!(I&&V[this.getUID(A)])){p.push(A);}}}}}}if(I){this.sort(p);
+}return(s)?null:p;}querySelector:if(U.querySelectorAll){if(!this.isHTMLDocument||g[z]||this.brokenMixedCaseQSA||(this.brokenCheckedQSA&&z.indexOf(":checked")>-1)||(this.brokenEmptyAttributeQSA&&h.test(z))||(!y&&z.indexOf(",")>-1)||e.disableQSA){break querySelector;
+}var S=z,x=U;if(!y){var C=x.getAttribute("id"),t="slickid__";x.setAttribute("id",t);S="#"+t+" "+S;U=x.parentNode;}try{if(s){return U.querySelector(S)||null;
+}else{E=U.querySelectorAll(S);}}catch(Q){g[z]=1;break querySelector;}finally{if(!y){if(C){x.setAttribute("id",C);}else{x.removeAttribute("id");}U=x;}}if(this.starSelectsClosedQSA){for(O=0;
+A=E[O++];){if(A.nodeName>"@"&&!(I&&V[this.getUID(A)])){p.push(A);}}}else{for(O=0;A=E[O++];){if(!(I&&V[this.getUID(A)])){p.push(A);}}}if(I){this.sort(p);
+}return p;}F=this.Slick.parse(z);if(!F.length){return p;}}else{if(z==null){return p;}else{if(z.Slick){F=z;}else{if(this.contains(U.documentElement||U,z)){(p)?p.push(z):p=z;
+return p;}else{return p;}}}}this.posNTH={};this.posNTHLast={};this.posNTHType={};this.posNTHTypeLast={};this.push=(!I&&(s||(F.length==1&&F.expressions[0].length==1)))?this.pushArray:this.pushUID;
+if(p==null){p=[];}var M,L,K;var B,J,D,c,q,G,W;var N,P,o,w,R=F.expressions;search:for(O=0;(P=R[O]);O++){for(M=0;(o=P[M]);M++){B="combinator:"+o.combinator;
+if(!this[B]){continue search;}J=(this.isXMLDocument)?o.tag:o.tag.toUpperCase();D=o.id;c=o.classList;q=o.classes;G=o.attributes;W=o.pseudos;w=(M===(P.length-1));
+this.bitUniques={};if(w){this.uniques=V;this.found=p;}else{this.uniques={};this.found=[];}if(M===0){this[B](U,J,D,q,G,W,c);if(s&&w&&p.length){break search;
+}}else{if(s&&w){for(L=0,K=N.length;L1)){this.sort(p);}return(s)?(p[0]||null):p;};k.uidx=1;k.uidk="slick-uniqueid";k.getUIDXML=function(n){var c=n.getAttribute(this.uidk);
+if(!c){c=this.uidx++;n.setAttribute(this.uidk,c);}return c;};k.getUIDHTML=function(c){return c.uniqueNumber||(c.uniqueNumber=this.uidx++);};k.sort=function(c){if(!this.documentSorter){return c;
+}c.sort(this.documentSorter);return c;};k.cacheNTH={};k.matchNTH=/^([+-]?\d*)?([a-z]+)?([+-]\d+)?$/;k.parseNTHArgument=function(q){var o=q.match(this.matchNTH);
+if(!o){return false;}var p=o[2]||false;var n=o[1]||1;if(n=="-"){n=-1;}var c=+o[3]||0;o=(p=="n")?{a:n,b:c}:(p=="odd")?{a:2,b:1}:(p=="even")?{a:2,b:0}:{a:0,b:n};
+return(this.cacheNTH[q]=o);};k.createNTHPseudo=function(p,n,c,o){return function(s,q){var u=this.getUID(s);if(!this[c][u]){var A=s.parentNode;if(!A){return false;
+}var r=A[p],t=1;if(o){var z=s.nodeName;do{if(r.nodeName!=z){continue;}this[c][this.getUID(r)]=t++;}while((r=r[n]));}else{do{if(r.nodeType!=1){continue;
+}this[c][this.getUID(r)]=t++;}while((r=r[n]));}}q=q||"n";var v=this.cacheNTH[q]||this.parseNTHArgument(q);if(!v){return false;}var y=v.a,x=v.b,w=this[c][u];
+if(y==0){return x==w;}if(y>0){if(w":function(p,c,r,o,n,q){if((p=p.firstChild)){do{if(p.nodeType==1){this.push(p,c,r,o,n,q);
+}}while((p=p.nextSibling));}},"+":function(p,c,r,o,n,q){while((p=p.nextSibling)){if(p.nodeType==1){this.push(p,c,r,o,n,q);break;}}},"^":function(p,c,r,o,n,q){p=p.firstChild;
+if(p){if(p.nodeType==1){this.push(p,c,r,o,n,q);}else{this["combinator:+"](p,c,r,o,n,q);}}},"~":function(q,c,s,p,n,r){while((q=q.nextSibling)){if(q.nodeType!=1){continue;
+}var o=this.getUID(q);if(this.bitUniques[o]){break;}this.bitUniques[o]=true;this.push(q,c,s,p,n,r);}},"++":function(p,c,r,o,n,q){this["combinator:+"](p,c,r,o,n,q);
+this["combinator:!+"](p,c,r,o,n,q);},"~~":function(p,c,r,o,n,q){this["combinator:~"](p,c,r,o,n,q);this["combinator:!~"](p,c,r,o,n,q);},"!":function(p,c,r,o,n,q){while((p=p.parentNode)){if(p!==this.document){this.push(p,c,r,o,n,q);
+}}},"!>":function(p,c,r,o,n,q){p=p.parentNode;if(p!==this.document){this.push(p,c,r,o,n,q);}},"!+":function(p,c,r,o,n,q){while((p=p.previousSibling)){if(p.nodeType==1){this.push(p,c,r,o,n,q);
+break;}}},"!^":function(p,c,r,o,n,q){p=p.lastChild;if(p){if(p.nodeType==1){this.push(p,c,r,o,n,q);}else{this["combinator:!+"](p,c,r,o,n,q);}}},"!~":function(q,c,s,p,n,r){while((q=q.previousSibling)){if(q.nodeType!=1){continue;
+}var o=this.getUID(q);if(this.bitUniques[o]){break;}this.bitUniques[o]=true;this.push(q,c,s,p,n,r);}}};for(var i in j){k["combinator:"+i]=j[i];}var l={empty:function(c){var n=c.firstChild;
+return !(n&&n.nodeType==1)&&!(c.innerText||c.textContent||"").length;},not:function(c,n){return !this.matchNode(c,n);},contains:function(c,n){return(c.innerText||c.textContent||"").indexOf(n)>-1;
+},"first-child":function(c){while((c=c.previousSibling)){if(c.nodeType==1){return false;}}return true;},"last-child":function(c){while((c=c.nextSibling)){if(c.nodeType==1){return false;
+}}return true;},"only-child":function(o){var n=o;while((n=n.previousSibling)){if(n.nodeType==1){return false;}}var c=o;while((c=c.nextSibling)){if(c.nodeType==1){return false;
+}}return true;},"nth-child":k.createNTHPseudo("firstChild","nextSibling","posNTH"),"nth-last-child":k.createNTHPseudo("lastChild","previousSibling","posNTHLast"),"nth-of-type":k.createNTHPseudo("firstChild","nextSibling","posNTHType",true),"nth-last-of-type":k.createNTHPseudo("lastChild","previousSibling","posNTHTypeLast",true),index:function(n,c){return this["pseudo:nth-child"](n,""+(c+1));
+},even:function(c){return this["pseudo:nth-child"](c,"2n");},odd:function(c){return this["pseudo:nth-child"](c,"2n+1");},"first-of-type":function(c){var n=c.nodeName;
+while((c=c.previousSibling)){if(c.nodeName==n){return false;}}return true;},"last-of-type":function(c){var n=c.nodeName;while((c=c.nextSibling)){if(c.nodeName==n){return false;
+}}return true;},"only-of-type":function(o){var n=o,p=o.nodeName;while((n=n.previousSibling)){if(n.nodeName==p){return false;}}var c=o;while((c=c.nextSibling)){if(c.nodeName==p){return false;
+}}return true;},enabled:function(c){return !c.disabled;},disabled:function(c){return c.disabled;},checked:function(c){return c.checked||c.selected;},focus:function(c){return this.isHTMLDocument&&this.document.activeElement===c&&(c.href||c.type||this.hasAttribute(c,"tabindex"));
+},root:function(c){return(c===this.root);},selected:function(c){return c.selected;}};for(var b in l){k["pseudo:"+b]=l[b];}var a=k.attributeGetters={"for":function(){return("htmlFor" in this)?this.htmlFor:this.getAttribute("for");
+},href:function(){return("href" in this)?this.getAttribute("href",2):this.getAttribute("href");},style:function(){return(this.style)?this.style.cssText:this.getAttribute("style");
+},tabindex:function(){var c=this.getAttributeNode("tabindex");return(c&&c.specified)?c.nodeValue:null;},type:function(){return this.getAttribute("type");
+},maxlength:function(){var c=this.getAttributeNode("maxLength");return(c&&c.specified)?c.nodeValue:null;}};a.MAXLENGTH=a.maxLength=a.maxlength;var e=k.Slick=(this.Slick||{});
+e.version="1.1.7";e.search=function(n,o,c){return k.search(n,o,c);};e.find=function(c,n){return k.search(c,n,null,true);};e.contains=function(c,n){k.setDocument(c);
+return k.contains(c,n);};e.getAttribute=function(n,c){k.setDocument(n);return k.getAttribute(n,c);};e.hasAttribute=function(n,c){k.setDocument(n);return k.hasAttribute(n,c);
+};e.match=function(n,c){if(!(n&&c)){return false;}if(!c||c===n){return true;}k.setDocument(n);return k.matchNode(n,c);};e.defineAttributeGetter=function(c,n){k.attributeGetters[c]=n;
+return this;};e.lookupAttributeGetter=function(c){return k.attributeGetters[c];};e.definePseudo=function(c,n){k["pseudo:"+c]=function(p,o){return n.call(p,o);
+};return this;};e.lookupPseudo=function(c){var n=k["pseudo:"+c];if(n){return function(o){return n.call(this,o);};}return null;};e.override=function(n,c){k.override(n,c);
+return this;};e.isXML=k.isXML;e.uidOf=function(c){return k.getUIDHTML(c);};if(!this.Slick){this.Slick=e;}}).apply((typeof exports!="undefined")?exports:this);
+var Element=function(b,g){var h=Element.Constructors[b];if(h){return h(g);}if(typeof b!="string"){return document.id(b).set(g);}if(!g){g={};}if(!(/^[\w-]+$/).test(b)){var e=Slick.parse(b).expressions[0][0];
+b=(e.tag=="*")?"div":e.tag;if(e.id&&g.id==null){g.id=e.id;}var d=e.attributes;if(d){for(var a,f=0,c=d.length;f=this.length){delete this[g--];
+}return e;}.protect());}Array.forEachMethod(function(g,e){Elements.implement(e,g);});Array.mirror(Elements);var d;try{d=(document.createElement(" ").name=="x");
+}catch(b){}var c=function(e){return(""+e).replace(/&/g,"&").replace(/"/g,""");};Document.implement({newElement:function(e,g){if(g&&g.checked!=null){g.defaultChecked=g.checked;
+}if(d&&g){e="<"+e;if(g.name){e+=' name="'+c(g.name)+'"';}if(g.type){e+=' type="'+c(g.type)+'"';}e+=">";delete g.name;delete g.type;}return this.id(this.createElement(e)).set(g);
+}});})();(function(){Slick.uidOf(window);Slick.uidOf(document);Document.implement({newTextNode:function(e){return this.createTextNode(e);},getDocument:function(){return this;
+},getWindow:function(){return this.window;},id:(function(){var e={string:function(E,D,l){E=Slick.find(l,"#"+E.replace(/(\W)/g,"\\$1"));return(E)?e.element(E,D):null;
+},element:function(D,E){Slick.uidOf(D);if(!E&&!D.$family&&!(/^(?:object|embed)$/i).test(D.tagName)){var l=D.fireEvent;D._fireEvent=function(F,G){return l(F,G);
+};Object.append(D,Element.Prototype);}return D;},object:function(D,E,l){if(D.toElement){return e.element(D.toElement(l),E);}return null;}};e.textnode=e.whitespace=e.window=e.document=function(l){return l;
+};return function(D,F,E){if(D&&D.$family&&D.uniqueNumber){return D;}var l=typeOf(D);return(e[l])?e[l](D,F,E||document):null;};})()});if(window.$==null){Window.implement("$",function(e,l){return document.id(e,l,this.document);
+});}Window.implement({getDocument:function(){return this.document;},getWindow:function(){return this;}});[Document,Element].invoke("implement",{getElements:function(e){return Slick.search(this,e,new Elements);
+},getElement:function(e){return document.id(Slick.find(this,e));}});var m={contains:function(e){return Slick.contains(this,e);}};if(!document.contains){Document.implement(m);
+}if(!document.createElement("div").contains){Element.implement(m);}var r=function(E,D){if(!E){return D;}E=Object.clone(Slick.parse(E));var l=E.expressions;
+for(var e=l.length;e--;){l[e][0].combinator=D;}return E;};Object.forEach({getNext:"~",getPrevious:"!~",getParent:"!"},function(e,l){Element.implement(l,function(D){return this.getElement(r(D,e));
+});});Object.forEach({getAllNext:"~",getAllPrevious:"!~",getSiblings:"~~",getChildren:">",getParents:"!"},function(e,l){Element.implement(l,function(D){return this.getElements(r(D,e));
+});});Element.implement({getFirst:function(e){return document.id(Slick.search(this,r(e,">"))[0]);},getLast:function(e){return document.id(Slick.search(this,r(e,">")).getLast());
+},getWindow:function(){return this.ownerDocument.window;},getDocument:function(){return this.ownerDocument;},getElementById:function(e){return document.id(Slick.find(this,"#"+(""+e).replace(/(\W)/g,"\\$1")));
+},match:function(e){return !e||Slick.match(this,e);}});if(window.$$==null){Window.implement("$$",function(e){if(arguments.length==1){if(typeof e=="string"){return Slick.search(this.document,e,new Elements);
+}else{if(Type.isEnumerable(e)){return new Elements(e);}}}return new Elements(arguments);});}var w={before:function(l,e){var D=e.parentNode;if(D){D.insertBefore(l,e);
+}},after:function(l,e){var D=e.parentNode;if(D){D.insertBefore(l,e.nextSibling);}},bottom:function(l,e){e.appendChild(l);},top:function(l,e){e.insertBefore(l,e.firstChild);
+}};w.inside=w.bottom;var j={},d={};var k={};Array.forEach(["type","value","defaultValue","accessKey","cellPadding","cellSpacing","colSpan","frameBorder","rowSpan","tabIndex","useMap"],function(e){k[e.toLowerCase()]=e;
+});k.html="innerHTML";k.text=(document.createElement("div").textContent==null)?"innerText":"textContent";Object.forEach(k,function(l,e){d[e]=function(D,E){D[l]=E;
+};j[e]=function(D){return D[l];};});var x=["compact","nowrap","ismap","declare","noshade","checked","disabled","readOnly","multiple","selected","noresize","defer","defaultChecked","autofocus","controls","autoplay","loop"];
+var h={};Array.forEach(x,function(e){var l=e.toLowerCase();h[l]=e;d[l]=function(D,E){D[e]=!!E;};j[l]=function(D){return !!D[e];};});Object.append(d,{"class":function(e,l){("className" in e)?e.className=(l||""):e.setAttribute("class",l);
+},"for":function(e,l){("htmlFor" in e)?e.htmlFor=l:e.setAttribute("for",l);},style:function(e,l){(e.style)?e.style.cssText=l:e.setAttribute("style",l);
+},value:function(e,l){e.value=(l!=null)?l:"";}});j["class"]=function(e){return("className" in e)?e.className||null:e.getAttribute("class");};var f=document.createElement("button");
+try{f.type="button";}catch(z){}if(f.type!="button"){d.type=function(e,l){e.setAttribute("type",l);};}f=null;var p=document.createElement("input");p.value="t";
+p.type="submit";if(p.value!="t"){d.type=function(l,e){var D=l.value;l.type=e;l.value=D;};}p=null;var q=(function(e){e.random="attribute";return(e.getAttribute("random")=="attribute");
+})(document.createElement("div"));Element.implement({setProperty:function(l,D){var E=d[l.toLowerCase()];if(E){E(this,D);}else{if(q){var e=this.retrieve("$attributeWhiteList",{});
+}if(D==null){this.removeAttribute(l);if(q){delete e[l];}}else{this.setAttribute(l,D);if(q){e[l]=true;}}}return this;},setProperties:function(e){for(var l in e){this.setProperty(l,e[l]);
+}return this;},getProperty:function(F){var D=j[F.toLowerCase()];if(D){return D(this);}if(q){var l=this.getAttributeNode(F),E=this.retrieve("$attributeWhiteList",{});
+if(!l){return null;}if(l.expando&&!E[F]){var G=this.outerHTML;if(G.substr(0,G.search(/\/?['"]?>(?![^<]*<['"])/)).indexOf(F)<0){return null;}E[F]=true;}}var e=Slick.getAttribute(this,F);
+return(!e&&!Slick.hasAttribute(this,F))?null:e;},getProperties:function(){var e=Array.from(arguments);return e.map(this.getProperty,this).associate(e);
+},removeProperty:function(e){return this.setProperty(e,null);},removeProperties:function(){Array.each(arguments,this.removeProperty,this);return this;},set:function(D,l){var e=Element.Properties[D];
+(e&&e.set)?e.set.call(this,l):this.setProperty(D,l);}.overloadSetter(),get:function(l){var e=Element.Properties[l];return(e&&e.get)?e.get.apply(this):this.getProperty(l);
+}.overloadGetter(),erase:function(l){var e=Element.Properties[l];(e&&e.erase)?e.erase.apply(this):this.removeProperty(l);return this;},hasClass:function(e){return this.className.clean().contains(e," ");
+},addClass:function(e){if(!this.hasClass(e)){this.className=(this.className+" "+e).clean();}return this;},removeClass:function(e){this.className=this.className.replace(new RegExp("(^|\\s)"+e+"(?:\\s|$)"),"$1");
+return this;},toggleClass:function(e,l){if(l==null){l=!this.hasClass(e);}return(l)?this.addClass(e):this.removeClass(e);},adopt:function(){var E=this,e,G=Array.flatten(arguments),F=G.length;
+if(F>1){E=e=document.createDocumentFragment();}for(var D=0;D";
+var a=(t.childNodes.length==1);if(!a){var s="abbr article aside audio canvas datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video".split(" "),b=document.createDocumentFragment(),u=s.length;
+while(u--){b.createElement(s[u]);}}t=null;var g=Function.attempt(function(){var e=document.createElement("table");e.innerHTML=" ";return true;
+});var c=document.createElement("tr"),o=" ";c.innerHTML=o;var y=(c.innerHTML==o);c=null;if(!g||!y||!a){Element.Properties.html.set=(function(l){var e={table:[1,""],select:[1,""," "],tbody:[2,""],tr:[3,""]};
+e.thead=e.tfoot=e.tbody;return function(D){var E=e[this.get("tag")];if(!E&&!a){E=[0,"",""];}if(!E){return l.call(this,D);}var H=E[0],G=document.createElement("div"),F=G;
+if(!a){b.appendChild(G);}G.innerHTML=[E[1],D,E[2]].flatten().join("");while(H--){F=F.firstChild;}this.empty().adopt(F.childNodes);if(!a){b.removeChild(G);
+}G=null;};})(Element.Properties.html.set);}var n=document.createElement("form");n.innerHTML="s ";if(n.firstChild.value!="s"){Element.Properties.value={set:function(G){var l=this.get("tag");
+if(l!="select"){return this.setProperty("value",G);}var D=this.getElements("option");for(var E=0;E0||k==null?"visible":"hidden";};var f=(h?function(l,k){l.style.opacity=k;}:(e?function(l,k){var n=l.style;
+if(!l.currentStyle||!l.currentStyle.hasLayout){n.zoom=1;}if(k==null){k="";}else{k="alpha(opacity="+(k*100).limit(0,100).round()+")";}var m=n.filter||l.getComputedStyle("filter")||"";
+n.filter=j.test(m)?m.replace(j,k):m+k;if(!n.filter){n.removeAttribute("filter");}}:a));var g=(h?function(l){var k=l.style.opacity||l.getComputedStyle("opacity");
+return(k=="")?1:k.toFloat();}:(e?function(l){var m=(l.style.filter||l.getComputedStyle("filter")),k;if(m){k=m.match(j);}return(k==null||m==null)?1:(k[1]/100);
+}:function(l){var k=l.retrieve("$opacity");if(k==null){k=(l.style.visibility=="hidden"?0:1);}return k;}));var b=(i.style.cssFloat==null)?"styleFloat":"cssFloat";
+Element.implement({getComputedStyle:function(m){if(this.currentStyle){return this.currentStyle[m.camelCase()];}var l=Element.getDocument(this).defaultView,k=l?l.getComputedStyle(this,null):null;
+return(k)?k.getPropertyValue((m==b)?"float":m.hyphenate()):null;},setStyle:function(l,k){if(l=="opacity"){if(k!=null){k=parseFloat(k);}f(this,k);return this;
+}l=(l=="float"?b:l).camelCase();if(typeOf(k)!="string"){var m=(Element.Styles[l]||"@").split(" ");k=Array.from(k).map(function(o,n){if(!m[n]){return"";
+}return(typeOf(o)=="number")?m[n].replace("@",Math.round(o)):o;}).join(" ");}else{if(k==String(Number(k))){k=Math.round(k);}}this.style[l]=k;if((k==""||k==null)&&c&&this.style.removeAttribute){this.style.removeAttribute(l);
+}return this;},getStyle:function(q){if(q=="opacity"){return g(this);}q=(q=="float"?b:q).camelCase();var k=this.style[q];if(!k||q=="zIndex"){k=[];for(var p in Element.ShortStyles){if(q!=p){continue;
+}for(var o in Element.ShortStyles[p]){k.push(this.getStyle(o));}return k.join(" ");}k=this.getComputedStyle(q);}if(k){k=String(k);var m=k.match(/rgba?\([\d\s,]+\)/);
+if(m){k=k.replace(m[0],m[0].rgbToHex());}}if(Browser.opera||(Browser.ie&&isNaN(parseFloat(k)))){if((/^(height|width)$/).test(q)){var l=(q=="width")?["left","right"]:["top","bottom"],n=0;
+l.each(function(r){n+=this.getStyle("border-"+r+"-width").toInt()+this.getStyle("padding-"+r).toInt();},this);return this["offset"+q.capitalize()]-n+"px";
+}if(Browser.opera&&String(k).indexOf("px")!=-1){return k;}if((/^border(.+)Width|margin|padding/).test(q)){return"0px";}}return k;},setStyles:function(l){for(var k in l){this.setStyle(k,l[k]);
+}return this;},getStyles:function(){var k={};Array.flatten(arguments).each(function(l){k[l]=this.getStyle(l);},this);return k;}});Element.Styles={left:"@px",top:"@px",bottom:"@px",right:"@px",width:"@px",height:"@px",maxWidth:"@px",maxHeight:"@px",minWidth:"@px",minHeight:"@px",backgroundColor:"rgb(@, @, @)",backgroundPosition:"@px @px",color:"rgb(@, @, @)",fontSize:"@px",letterSpacing:"@px",lineHeight:"@px",clip:"rect(@px @px @px @px)",margin:"@px @px @px @px",padding:"@px @px @px @px",border:"@px @ rgb(@, @, @) @px @ rgb(@, @, @) @px @ rgb(@, @, @)",borderWidth:"@px @px @px @px",borderStyle:"@ @ @ @",borderColor:"rgb(@, @, @) rgb(@, @, @) rgb(@, @, @) rgb(@, @, @)",zIndex:"@",zoom:"@",fontWeight:"@",textIndent:"@px",opacity:"@"};
+Element.ShortStyles={margin:{},padding:{},border:{},borderWidth:{},borderStyle:{},borderColor:{}};["Top","Right","Bottom","Left"].each(function(q){var p=Element.ShortStyles;
+var l=Element.Styles;["margin","padding"].each(function(r){var s=r+q;p[r][s]=l[s]="@px";});var o="border"+q;p.border[o]=l[o]="@px @ rgb(@, @, @)";var n=o+"Width",k=o+"Style",m=o+"Color";
+p[o]={};p.borderWidth[n]=p[o][n]=l[n]="@px";p.borderStyle[k]=p[o][k]=l[k]="@";p.borderColor[m]=p[o][m]=l[m]="rgb(@, @, @)";});})();(function(){Element.Properties.events={set:function(b){this.addEvents(b);
+}};[Element,Window,Document].invoke("implement",{addEvent:function(f,h){var i=this.retrieve("events",{});if(!i[f]){i[f]={keys:[],values:[]};}if(i[f].keys.contains(h)){return this;
+}i[f].keys.push(h);var g=f,b=Element.Events[f],d=h,j=this;if(b){if(b.onAdd){b.onAdd.call(this,h,f);}if(b.condition){d=function(k){if(b.condition.call(this,k,f)){return h.call(this,k);
+}return true;};}if(b.base){g=Function.from(b.base).call(this,f);}}var e=function(){return h.call(j);};var c=Element.NativeEvents[g];if(c){if(c==2){e=function(k){k=new DOMEvent(k,j.getWindow());
+if(d.call(j,k)===false){k.stop();}};}this.addListener(g,e,arguments[2]);}i[f].values.push(e);return this;},removeEvent:function(e,d){var c=this.retrieve("events");
+if(!c||!c[e]){return this;}var h=c[e];var b=h.keys.indexOf(d);if(b==-1){return this;}var g=h.values[b];delete h.keys[b];delete h.values[b];var f=Element.Events[e];
+if(f){if(f.onRemove){f.onRemove.call(this,d,e);}if(f.base){e=Function.from(f.base).call(this,e);}}return(Element.NativeEvents[e])?this.removeListener(e,g,arguments[2]):this;
+},addEvents:function(b){for(var c in b){this.addEvent(c,b[c]);}return this;},removeEvents:function(b){var d;if(typeOf(b)=="object"){for(d in b){this.removeEvent(d,b[d]);
+}return this;}var c=this.retrieve("events");if(!c){return this;}if(!b){for(d in c){this.removeEvents(d);}this.eliminate("events");}else{if(c[b]){c[b].keys.each(function(e){this.removeEvent(b,e);
+},this);delete c[b];}}return this;},fireEvent:function(e,c,b){var d=this.retrieve("events");if(!d||!d[e]){return this;}c=Array.from(c);d[e].keys.each(function(f){if(b){f.delay(b,this,c);
+}else{f.apply(this,c);}},this);return this;},cloneEvents:function(e,d){e=document.id(e);var c=e.retrieve("events");if(!c){return this;}if(!d){for(var b in c){this.cloneEvents(e,b);
+}}else{if(c[d]){c[d].keys.each(function(f){this.addEvent(d,f);},this);}}return this;}});Element.NativeEvents={click:2,dblclick:2,mouseup:2,mousedown:2,contextmenu:2,mousewheel:2,DOMMouseScroll:2,mouseover:2,mouseout:2,mousemove:2,selectstart:2,selectend:2,keydown:2,keypress:2,keyup:2,orientationchange:2,touchstart:2,touchmove:2,touchend:2,touchcancel:2,gesturestart:2,gesturechange:2,gestureend:2,focus:2,blur:2,change:2,reset:2,select:2,submit:2,paste:2,input:2,load:2,unload:1,beforeunload:2,resize:1,move:1,DOMContentLoaded:1,readystatechange:1,error:1,abort:1,scroll:1};
+Element.Events={mousewheel:{base:(Browser.firefox)?"DOMMouseScroll":"mousewheel"}};if("onmouseenter" in document.documentElement){Element.NativeEvents.mouseenter=Element.NativeEvents.mouseleave=2;
+}else{var a=function(b){var c=b.relatedTarget;if(c==null){return true;}if(!c){return false;}return(c!=this&&c.prefix!="xul"&&typeOf(this)!="document"&&!this.contains(c));
+};Element.Events.mouseenter={base:"mouseover",condition:a};Element.Events.mouseleave={base:"mouseout",condition:a};}if(!window.addEventListener){Element.NativeEvents.propertychange=2;
+Element.Events.change={base:function(){var b=this.type;return(this.get("tag")=="input"&&(b=="radio"||b=="checkbox"))?"propertychange":"change";},condition:function(b){return this.type!="radio"||(b.event.propertyName=="checked"&&this.checked);
+}};}})();(function(){var c=!!window.addEventListener;Element.NativeEvents.focusin=Element.NativeEvents.focusout=2;var k=function(l,m,n,o,p){while(p&&p!=l){if(m(p,o)){return n.call(p,o,p);
+}p=document.id(p.parentNode);}};var a={mouseenter:{base:"mouseover"},mouseleave:{base:"mouseout"},focus:{base:"focus"+(c?"":"in"),capture:true},blur:{base:c?"blur":"focusout",capture:true}};
+var b="$delegation:";var i=function(l){return{base:"focusin",remove:function(m,o){var p=m.retrieve(b+l+"listeners",{})[o];if(p&&p.forms){for(var n=p.forms.length;
+n--;){p.forms[n].removeEvent(l,p.fns[n]);}}},listen:function(x,r,v,n,t,s){var o=(t.get("tag")=="form")?t:n.target.getParent("form");if(!o){return;}var u=x.retrieve(b+l+"listeners",{}),p=u[s]||{forms:[],fns:[]},m=p.forms,w=p.fns;
+if(m.indexOf(o)!=-1){return;}m.push(o);var q=function(y){k(x,r,v,y,t);};o.addEvent(l,q);w.push(q);u[s]=p;x.store(b+l+"listeners",u);}};};var d=function(l){return{base:"focusin",listen:function(m,n,p,q,r){var o={blur:function(){this.removeEvents(o);
+}};o[l]=function(s){k(m,n,p,s,r);};q.target.addEvents(o);}};};if(!c){Object.append(a,{submit:i("submit"),reset:i("reset"),change:d("change"),select:d("select")});
+}var h=Element.prototype,f=h.addEvent,j=h.removeEvent;var e=function(l,m){return function(r,q,n){if(r.indexOf(":relay")==-1){return l.call(this,r,q,n);
+}var o=Slick.parse(r).expressions[0][0];if(o.pseudos[0].key!="relay"){return l.call(this,r,q,n);}var p=o.tag;o.pseudos.slice(1).each(function(s){p+=":"+s.key+(s.value?"("+s.value+")":"");
+});l.call(this,r,q);return m.call(this,p,o.pseudos[0].value,q);};};var g={addEvent:function(v,q,x){var t=this.retrieve("$delegates",{}),r=t[v];if(r){for(var y in r){if(r[y].fn==x&&r[y].match==q){return this;
+}}}var p=v,u=q,o=x,n=a[v]||{};v=n.base||p;q=function(B){return Slick.match(B,u);};var w=Element.Events[p];if(w&&w.condition){var l=q,m=w.condition;q=function(C,B){return l(C,B)&&m.call(C,B,v);
+};}var z=this,s=String.uniqueID();var A=n.listen?function(B,C){if(!C&&B&&B.target){C=B.target;}if(C){n.listen(z,q,x,B,C,s);}}:function(B,C){if(!C&&B&&B.target){C=B.target;
+}if(C){k(z,q,x,B,C);}};if(!r){r={};}r[s]={match:u,fn:o,delegator:A};t[p]=r;return f.call(this,v,A,n.capture);},removeEvent:function(r,n,t,u){var q=this.retrieve("$delegates",{}),p=q[r];
+if(!p){return this;}if(u){var m=r,w=p[u].delegator,l=a[r]||{};r=l.base||m;if(l.remove){l.remove(this,u);}delete p[u];q[m]=p;return j.call(this,r,w);}var o,v;
+if(t){for(o in p){v=p[o];if(v.match==n&&v.fn==t){return g.removeEvent.call(this,r,n,t,o);}}}else{for(o in p){v=p[o];if(v.match==n){g.removeEvent.call(this,r,n,v.fn,o);
+}}}return this;}};[Element,Window,Document].invoke("implement",{addEvent:e(f,g.addEvent),removeEvent:e(j,g.removeEvent)});})();(function(){var h=document.createElement("div"),e=document.createElement("div");
+h.style.height="0";h.appendChild(e);var d=(e.offsetParent===h);h=e=null;var l=function(m){return k(m,"position")!="static"||a(m);};var i=function(m){return l(m)||(/^(?:table|td|th)$/i).test(m.tagName);
+};Element.implement({scrollTo:function(m,n){if(a(this)){this.getWindow().scrollTo(m,n);}else{this.scrollLeft=m;this.scrollTop=n;}return this;},getSize:function(){if(a(this)){return this.getWindow().getSize();
+}return{x:this.offsetWidth,y:this.offsetHeight};},getScrollSize:function(){if(a(this)){return this.getWindow().getScrollSize();}return{x:this.scrollWidth,y:this.scrollHeight};
+},getScroll:function(){if(a(this)){return this.getWindow().getScroll();}return{x:this.scrollLeft,y:this.scrollTop};},getScrolls:function(){var n=this.parentNode,m={x:0,y:0};
+while(n&&!a(n)){m.x+=n.scrollLeft;m.y+=n.scrollTop;n=n.parentNode;}return m;},getOffsetParent:d?function(){var m=this;if(a(m)||k(m,"position")=="fixed"){return null;
+}var n=(k(m,"position")=="static")?i:l;while((m=m.parentNode)){if(n(m)){return m;}}return null;}:function(){var m=this;if(a(m)||k(m,"position")=="fixed"){return null;
+}try{return m.offsetParent;}catch(n){}return null;},getOffsets:function(){if(this.getBoundingClientRect&&!Browser.Platform.ios){var r=this.getBoundingClientRect(),o=document.id(this.getDocument().documentElement),q=o.getScroll(),t=this.getScrolls(),s=(k(this,"position")=="fixed");
+return{x:r.left.toInt()+t.x+((s)?0:q.x)-o.clientLeft,y:r.top.toInt()+t.y+((s)?0:q.y)-o.clientTop};}var n=this,m={x:0,y:0};if(a(this)){return m;}while(n&&!a(n)){m.x+=n.offsetLeft;
+m.y+=n.offsetTop;if(Browser.firefox){if(!c(n)){m.x+=b(n);m.y+=g(n);}var p=n.parentNode;if(p&&k(p,"overflow")!="visible"){m.x+=b(p);m.y+=g(p);}}else{if(n!=this&&Browser.safari){m.x+=b(n);
+m.y+=g(n);}}n=n.offsetParent;}if(Browser.firefox&&!c(this)){m.x-=b(this);m.y-=g(this);}return m;},getPosition:function(p){var q=this.getOffsets(),n=this.getScrolls();
+var m={x:q.x-n.x,y:q.y-n.y};if(p&&(p=document.id(p))){var o=p.getPosition();return{x:m.x-o.x-b(p),y:m.y-o.y-g(p)};}return m;},getCoordinates:function(o){if(a(this)){return this.getWindow().getCoordinates();
+}var m=this.getPosition(o),n=this.getSize();var p={left:m.x,top:m.y,width:n.x,height:n.y};p.right=p.left+p.width;p.bottom=p.top+p.height;return p;},computePosition:function(m){return{left:m.x-j(this,"margin-left"),top:m.y-j(this,"margin-top")};
+},setPosition:function(m){return this.setStyles(this.computePosition(m));}});[Document,Window].invoke("implement",{getSize:function(){var m=f(this);return{x:m.clientWidth,y:m.clientHeight};
+},getScroll:function(){var n=this.getWindow(),m=f(this);return{x:n.pageXOffset||m.scrollLeft,y:n.pageYOffset||m.scrollTop};},getScrollSize:function(){var o=f(this),n=this.getSize(),m=this.getDocument().body;
+return{x:Math.max(o.scrollWidth,m.scrollWidth,n.x),y:Math.max(o.scrollHeight,m.scrollHeight,n.y)};},getPosition:function(){return{x:0,y:0};},getCoordinates:function(){var m=this.getSize();
+return{top:0,left:0,bottom:m.y,right:m.x,height:m.y,width:m.x};}});var k=Element.getComputedStyle;function j(m,n){return k(m,n).toInt()||0;}function c(m){return k(m,"-moz-box-sizing")=="border-box";
+}function g(m){return j(m,"border-top-width");}function b(m){return j(m,"border-left-width");}function a(m){return(/^(?:body|html)$/i).test(m.tagName);
+}function f(m){var n=m.getDocument();return(!n.compatMode||n.compatMode=="CSS1Compat")?n.html:n.body;}})();Element.alias({position:"setPosition"});[Window,Document,Element].invoke("implement",{getHeight:function(){return this.getSize().y;
+},getWidth:function(){return this.getSize().x;},getScrollTop:function(){return this.getScroll().y;},getScrollLeft:function(){return this.getScroll().x;
+},getScrollHeight:function(){return this.getScrollSize().y;},getScrollWidth:function(){return this.getScrollSize().x;},getTop:function(){return this.getPosition().y;
+},getLeft:function(){return this.getPosition().x;}});(function(){var f=this.Fx=new Class({Implements:[Chain,Events,Options],options:{fps:60,unit:false,duration:500,frames:null,frameSkip:true,link:"ignore"},initialize:function(g){this.subject=this.subject||this;
+this.setOptions(g);},getTransition:function(){return function(g){return -(Math.cos(Math.PI*g)-1)/2;};},step:function(g){if(this.options.frameSkip){var h=(this.time!=null)?(g-this.time):0,i=h/this.frameInterval;
+this.time=g;this.frame+=i;}else{this.frame++;}if(this.frame=(7-4*d)/11){e=c*c-Math.pow((11-6*d-11*f)/4,2);break;}}return e;
+},Elastic:function(b,a){return Math.pow(2,10*--b)*Math.cos(20*b*Math.PI*(a&&a[0]||1)/3);}});["Quad","Cubic","Quart","Quint"].each(function(b,a){Fx.Transitions[b]=new Fx.Transition(function(c){return Math.pow(c,a+2);
+});});(function(){var d=function(){},a=("onprogress" in new Browser.Request);var c=this.Request=new Class({Implements:[Chain,Events,Options],options:{url:"",data:"",headers:{"X-Requested-With":"XMLHttpRequest",Accept:"text/javascript, text/html, application/xml, text/xml, */*"},async:true,format:false,method:"post",link:"ignore",isSuccess:null,emulation:true,urlEncoded:true,encoding:"utf-8",evalScripts:false,evalResponse:false,timeout:0,noCache:false},initialize:function(e){this.xhr=new Browser.Request();
+this.setOptions(e);this.headers=this.options.headers;},onStateChange:function(){var e=this.xhr;if(e.readyState!=4||!this.running){return;}this.running=false;
+this.status=0;Function.attempt(function(){var f=e.status;this.status=(f==1223)?204:f;}.bind(this));e.onreadystatechange=d;if(a){e.onprogress=e.onloadstart=d;
+}clearTimeout(this.timer);this.response={text:this.xhr.responseText||"",xml:this.xhr.responseXML};if(this.options.isSuccess.call(this,this.status)){this.success(this.response.text,this.response.xml);
+}else{this.failure();}},isSuccess:function(){var e=this.status;return(e>=200&&e<300);},isRunning:function(){return !!this.running;},processScripts:function(e){if(this.options.evalResponse||(/(ecma|java)script/).test(this.getHeader("Content-type"))){return Browser.exec(e);
+}return e.stripScripts(this.options.evalScripts);},success:function(f,e){this.onSuccess(this.processScripts(f),e);},onSuccess:function(){this.fireEvent("complete",arguments).fireEvent("success",arguments).callChain();
+},failure:function(){this.onFailure();},onFailure:function(){this.fireEvent("complete").fireEvent("failure",this.xhr);},loadstart:function(e){this.fireEvent("loadstart",[e,this.xhr]);
+},progress:function(e){this.fireEvent("progress",[e,this.xhr]);},timeout:function(){this.fireEvent("timeout",this.xhr);},setHeader:function(e,f){this.headers[e]=f;
+return this;},getHeader:function(e){return Function.attempt(function(){return this.xhr.getResponseHeader(e);}.bind(this));},check:function(){if(!this.running){return true;
+}switch(this.options.link){case"cancel":this.cancel();return true;case"chain":this.chain(this.caller.pass(arguments,this));return false;}return false;},send:function(o){if(!this.check(o)){return this;
+}this.options.isSuccess=this.options.isSuccess||this.isSuccess;this.running=true;var l=typeOf(o);if(l=="string"||l=="element"){o={data:o};}var h=this.options;
+o=Object.append({data:h.data,url:h.url,method:h.method},o);var j=o.data,f=String(o.url),e=o.method.toLowerCase();switch(typeOf(j)){case"element":j=document.id(j).toQueryString();
+break;case"object":case"hash":j=Object.toQueryString(j);}if(this.options.format){var m="format="+this.options.format;j=(j)?m+"&"+j:m;}if(this.options.emulation&&!["get","post"].contains(e)){var k="_method="+e;
+j=(j)?k+"&"+j:k;e="post";}if(this.options.urlEncoded&&["post","put"].contains(e)){var g=(this.options.encoding)?"; charset="+this.options.encoding:"";this.headers["Content-type"]="application/x-www-form-urlencoded"+g;
+}if(!f){f=document.location.pathname;}var i=f.lastIndexOf("/");if(i>-1&&(i=f.indexOf("#"))>-1){f=f.substr(0,i);}if(this.options.noCache){f+=(f.contains("?")?"&":"?")+String.uniqueID();
+}if(j&&e=="get"){f+=(f.contains("?")?"&":"?")+j;j=null;}var n=this.xhr;if(a){n.onloadstart=this.loadstart.bind(this);n.onprogress=this.progress.bind(this);
+}n.open(e.toUpperCase(),f,this.options.async,this.options.user,this.options.password);if(this.options.user&&"withCredentials" in n){n.withCredentials=true;
+}n.onreadystatechange=this.onStateChange.bind(this);Object.each(this.headers,function(q,p){try{n.setRequestHeader(p,q);}catch(r){this.fireEvent("exception",[p,q]);
+}},this);this.fireEvent("request");n.send(j);if(!this.options.async){this.onStateChange();}else{if(this.options.timeout){this.timer=this.timeout.delay(this.options.timeout,this);
+}}return this;},cancel:function(){if(!this.running){return this;}this.running=false;var e=this.xhr;e.abort();clearTimeout(this.timer);e.onreadystatechange=d;
+if(a){e.onprogress=e.onloadstart=d;}this.xhr=new Browser.Request();this.fireEvent("cancel");return this;}});var b={};["get","post","put","delete","GET","POST","PUT","DELETE"].each(function(e){b[e]=function(g){var f={method:e};
+if(g!=null){f.data=g;}return this.send(f);};});c.implement(b);Element.Properties.send={set:function(e){var f=this.get("send").cancel();f.setOptions(e);
+return this;},get:function(){var e=this.retrieve("send");if(!e){e=new c({data:this,link:"cancel",method:this.get("method")||"post",url:this.get("action")});
+this.store("send",e);}return e;}};Element.implement({send:function(e){var f=this.get("send");f.send({data:this,url:e||f.options.url});return this;}});})();
+Request.HTML=new Class({Extends:Request,options:{update:false,append:false,evalScripts:true,filter:false,headers:{Accept:"text/html, application/xml, text/xml, */*"}},success:function(f){var e=this.options,c=this.response;
+c.html=f.stripScripts(function(h){c.javascript=h;});var d=c.html.match(/]*>([\s\S]*?)<\/body>/i);if(d){c.html=d[1];}var b=new Element("div").set("html",c.html);
+c.tree=b.childNodes;c.elements=b.getElements(e.filter||"*");if(e.filter){c.tree=c.elements;}if(e.update){var g=document.id(e.update).empty();if(e.filter){g.adopt(c.elements);
+}else{g.set("html",c.html);}}else{if(e.append){var a=document.id(e.append);if(e.filter){c.elements.reverse().inject(a);}else{a.adopt(b.getChildren());}}}if(e.evalScripts){Browser.exec(c.javascript);
+}this.onSuccess(c.tree,c.elements,c.html,c.javascript);}});Element.Properties.load={set:function(a){var b=this.get("load").cancel();b.setOptions(a);return this;
+},get:function(){var a=this.retrieve("load");if(!a){a=new Request.HTML({data:this,link:"cancel",update:this,method:"get"});this.store("load",a);}return a;
+}};Element.implement({load:function(){this.get("load").send(Array.link(arguments,{data:Type.isObject,url:Type.isString}));return this;}});if(typeof JSON=="undefined"){this.JSON={};
+}(function(){var special={"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"};var escape=function(chr){return special[chr]||"\\u"+("0000"+chr.charCodeAt(0).toString(16)).slice(-4);
+};JSON.validate=function(string){string=string.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,"");
+return(/^[\],:{}\s]*$/).test(string);};JSON.encode=JSON.stringify?function(obj){return JSON.stringify(obj);}:function(obj){if(obj&&obj.toJSON){obj=obj.toJSON();
+}switch(typeOf(obj)){case"string":return'"'+obj.replace(/[\x00-\x1f\\"]/g,escape)+'"';case"array":return"["+obj.map(JSON.encode).clean()+"]";case"object":case"hash":var string=[];
+Object.each(obj,function(value,key){var json=JSON.encode(value);if(json){string.push(JSON.encode(key)+":"+json);}});return"{"+string+"}";case"number":case"boolean":return""+obj;
+case"null":return"null";}return null;};JSON.decode=function(string,secure){if(!string||typeOf(string)!="string"){return null;}if(secure||JSON.secure){if(JSON.parse){return JSON.parse(string);
+}if(!JSON.validate(string)){throw new Error("JSON could not decode the input; security is enabled and the value is not secure.");}}return eval("("+string+")");
+};})();Request.JSON=new Class({Extends:Request,options:{secure:true},initialize:function(a){this.parent(a);Object.append(this.headers,{Accept:"application/json","X-Request":"JSON"});
+},success:function(c){var b;try{b=this.response.json=JSON.decode(c,this.options.secure);}catch(a){this.fireEvent("error",[c,a]);return;}if(b==null){this.onFailure();
+}else{this.onSuccess(b,c);}}});var Cookie=new Class({Implements:Options,options:{path:"/",domain:false,duration:false,secure:false,document:document,encode:true},initialize:function(b,a){this.key=b;
+this.setOptions(a);},write:function(b){if(this.options.encode){b=encodeURIComponent(b);}if(this.options.domain){b+="; domain="+this.options.domain;}if(this.options.path){b+="; path="+this.options.path;
+}if(this.options.duration){var a=new Date();a.setTime(a.getTime()+this.options.duration*24*60*60*1000);b+="; expires="+a.toGMTString();}if(this.options.secure){b+="; secure";
+}this.options.document.cookie=this.key+"="+b;return this;},read:function(){var a=this.options.document.cookie.match("(?:^|;)\\s*"+this.key.escapeRegExp()+"=([^;]*)");
+return(a)?decodeURIComponent(a[1]):null;},dispose:function(){new Cookie(this.key,Object.merge({},this.options,{duration:-1})).write("");return this;}});
+Cookie.write=function(b,c,a){return new Cookie(b,a).write(c);};Cookie.read=function(a){return new Cookie(a).read();};Cookie.dispose=function(b,a){return new Cookie(b,a).dispose();
+};(function(i,k){var l,f,e=[],c,b,d=k.createElement("div");var g=function(){clearTimeout(b);if(l){return;}Browser.loaded=l=true;k.removeListener("DOMContentLoaded",g).removeListener("readystatechange",a);
+k.fireEvent("domready");i.fireEvent("domready");};var a=function(){for(var m=e.length;m--;){if(e[m]()){g();return true;}}return false;};var j=function(){clearTimeout(b);
+if(!a()){b=setTimeout(j,10);}};k.addListener("DOMContentLoaded",g);var h=function(){try{d.doScroll();return true;}catch(m){}return false;};if(d.doScroll&&!h()){e.push(h);
+c=true;}if(k.readyState){e.push(function(){var m=k.readyState;return(m=="loaded"||m=="complete");});}if("onreadystatechange" in k){k.addListener("readystatechange",a);
+}else{c=true;}if(c){j();}Element.Events.domready={onAdd:function(m){if(l){m.call(this);}}};Element.Events.load={base:"load",onAdd:function(m){if(f&&this==i){m.call(this);
+}},condition:function(){if(this==i){g();delete Element.Events.load;}return true;}};i.addEvent("load",function(){f=true;});})(window,document);(function(){var Swiff=this.Swiff=new Class({Implements:Options,options:{id:null,height:1,width:1,container:null,properties:{},params:{quality:"high",allowScriptAccess:"always",wMode:"window",swLiveConnect:true},callBacks:{},vars:{}},toElement:function(){return this.object;
+},initialize:function(path,options){this.instance="Swiff_"+String.uniqueID();this.setOptions(options);options=this.options;var id=this.id=options.id||this.instance;
+var container=document.id(options.container);Swiff.CallBacks[this.instance]={};var params=options.params,vars=options.vars,callBacks=options.callBacks;
+var properties=Object.append({height:options.height,width:options.width},options.properties);var self=this;for(var callBack in callBacks){Swiff.CallBacks[this.instance][callBack]=(function(option){return function(){return option.apply(self.object,arguments);
+};})(callBacks[callBack]);vars[callBack]="Swiff.CallBacks."+this.instance+"."+callBack;}params.flashVars=Object.toQueryString(vars);if(Browser.ie){properties.classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000";
+params.movie=path;}else{properties.type="application/x-shockwave-flash";}properties.data=path;var build='";for(var param in params){if(params[param]){build+=' ';}}build+=" ";this.object=((container)?container.empty():new Element("div")).set("html",build).firstChild;
+},replaces:function(element){element=document.id(element,true);element.parentNode.replaceChild(this.toElement(),element);return this;},inject:function(element){document.id(element,true).appendChild(this.toElement());
+return this;},remote:function(){return Swiff.remote.apply(Swiff,[this.toElement()].append(arguments));}});Swiff.CallBacks={};Swiff.remote=function(obj,fn){var rs=obj.CallFunction(''+__flash__argumentsToXML(arguments,2)+" ");
+return eval(rs);};})();
\ No newline at end of file
diff --git a/Frameworks/Ajax/MooTools/WebServerResources/scripts/core/mootools-core-1.4.4.js b/Frameworks/Ajax/MooTools/WebServerResources/scripts/core/mootools-core-1.4.4.js
new file mode 100644
index 00000000000..c453119948a
--- /dev/null
+++ b/Frameworks/Ajax/MooTools/WebServerResources/scripts/core/mootools-core-1.4.4.js
@@ -0,0 +1,5966 @@
+/*
+---
+MooTools: the javascript framework
+
+web build:
+ - http://mootools.net/core/76bf47062d6c1983d66ce47ad66aa0e0
+
+packager build:
+ - packager build Core/Core Core/Array Core/String Core/Number Core/Function Core/Object Core/Event Core/Browser Core/Class Core/Class.Extras Core/Slick.Parser Core/Slick.Finder Core/Element Core/Element.Style Core/Element.Event Core/Element.Delegation Core/Element.Dimensions Core/Fx Core/Fx.CSS Core/Fx.Tween Core/Fx.Morph Core/Fx.Transitions Core/Request Core/Request.HTML Core/Request.JSON Core/Cookie Core/JSON Core/DOMReady Core/Swiff
+
+...
+*/
+
+/*
+---
+
+name: Core
+
+description: The heart of MooTools.
+
+license: MIT-style license.
+
+copyright: Copyright (c) 2006-2012 [Valerio Proietti](http://mad4milk.net/).
+
+authors: The MooTools production team (http://mootools.net/developers/)
+
+inspiration:
+ - Class implementation inspired by [Base.js](http://dean.edwards.name/weblog/2006/03/base/) Copyright (c) 2006 Dean Edwards, [GNU Lesser General Public License](http://opensource.org/licenses/lgpl-license.php)
+ - Some functionality inspired by [Prototype.js](http://prototypejs.org) Copyright (c) 2005-2007 Sam Stephenson, [MIT License](http://opensource.org/licenses/mit-license.php)
+
+provides: [Core, MooTools, Type, typeOf, instanceOf, Native]
+
+...
+*/
+
+(function(){
+
+this.MooTools = {
+ version: '1.4.4',
+ build: 'adb02e676407521b516ffa10d2dc6b54237a80f9'
+};
+
+// typeOf, instanceOf
+
+var typeOf = this.typeOf = function(item){
+ if (item == null) return 'null';
+ if (item.$family != null) return item.$family();
+
+ if (item.nodeName){
+ if (item.nodeType == 1) return 'element';
+ if (item.nodeType == 3) return (/\S/).test(item.nodeValue) ? 'textnode' : 'whitespace';
+ } else if (typeof item.length == 'number'){
+ if (item.callee) return 'arguments';
+ if ('item' in item) return 'collection';
+ }
+
+ return typeof item;
+};
+
+var instanceOf = this.instanceOf = function(item, object){
+ if (item == null) return false;
+ var constructor = item.$constructor || item.constructor;
+ while (constructor){
+ if (constructor === object) return true;
+ constructor = constructor.parent;
+ }
+ /**/
+ if (!item.hasOwnProperty) return false;
+ /* */
+ return item instanceof object;
+};
+
+// Function overloading
+
+var Function = this.Function;
+
+var enumerables = true;
+for (var i in {toString: 1}) enumerables = null;
+if (enumerables) enumerables = ['hasOwnProperty', 'valueOf', 'isPrototypeOf', 'propertyIsEnumerable', 'toLocaleString', 'toString', 'constructor'];
+
+Function.prototype.overloadSetter = function(usePlural){
+ var self = this;
+ return function(a, b){
+ if (a == null) return this;
+ if (usePlural || typeof a != 'string'){
+ for (var k in a) self.call(this, k, a[k]);
+ if (enumerables) for (var i = enumerables.length; i--;){
+ k = enumerables[i];
+ if (a.hasOwnProperty(k)) self.call(this, k, a[k]);
+ }
+ } else {
+ self.call(this, a, b);
+ }
+ return this;
+ };
+};
+
+Function.prototype.overloadGetter = function(usePlural){
+ var self = this;
+ return function(a){
+ var args, result;
+ if (usePlural || typeof a != 'string') args = a;
+ else if (arguments.length > 1) args = arguments;
+ if (args){
+ result = {};
+ for (var i = 0; i < args.length; i++) result[args[i]] = self.call(this, args[i]);
+ } else {
+ result = self.call(this, a);
+ }
+ return result;
+ };
+};
+
+Function.prototype.extend = function(key, value){
+ this[key] = value;
+}.overloadSetter();
+
+Function.prototype.implement = function(key, value){
+ this.prototype[key] = value;
+}.overloadSetter();
+
+// From
+
+var slice = Array.prototype.slice;
+
+Function.from = function(item){
+ return (typeOf(item) == 'function') ? item : function(){
+ return item;
+ };
+};
+
+Array.from = function(item){
+ if (item == null) return [];
+ return (Type.isEnumerable(item) && typeof item != 'string') ? (typeOf(item) == 'array') ? item : slice.call(item) : [item];
+};
+
+Number.from = function(item){
+ var number = parseFloat(item);
+ return isFinite(number) ? number : null;
+};
+
+String.from = function(item){
+ return item + '';
+};
+
+// hide, protect
+
+Function.implement({
+
+ hide: function(){
+ this.$hidden = true;
+ return this;
+ },
+
+ protect: function(){
+ this.$protected = true;
+ return this;
+ }
+
+});
+
+// Type
+
+var Type = this.Type = function(name, object){
+ if (name){
+ var lower = name.toLowerCase();
+ var typeCheck = function(item){
+ return (typeOf(item) == lower);
+ };
+
+ Type['is' + name] = typeCheck;
+ if (object != null){
+ object.prototype.$family = (function(){
+ return lower;
+ }).hide();
+
+ }
+ }
+
+ if (object == null) return null;
+
+ object.extend(this);
+ object.$constructor = Type;
+ object.prototype.$constructor = object;
+
+ return object;
+};
+
+var toString = Object.prototype.toString;
+
+Type.isEnumerable = function(item){
+ return (item != null && typeof item.length == 'number' && toString.call(item) != '[object Function]' );
+};
+
+var hooks = {};
+
+var hooksOf = function(object){
+ var type = typeOf(object.prototype);
+ return hooks[type] || (hooks[type] = []);
+};
+
+var implement = function(name, method){
+ if (method && method.$hidden) return;
+
+ var hooks = hooksOf(this);
+
+ for (var i = 0; i < hooks.length; i++){
+ var hook = hooks[i];
+ if (typeOf(hook) == 'type') implement.call(hook, name, method);
+ else hook.call(this, name, method);
+ }
+
+ var previous = this.prototype[name];
+ if (previous == null || !previous.$protected) this.prototype[name] = method;
+
+ if (this[name] == null && typeOf(method) == 'function') extend.call(this, name, function(item){
+ return method.apply(item, slice.call(arguments, 1));
+ });
+};
+
+var extend = function(name, method){
+ if (method && method.$hidden) return;
+ var previous = this[name];
+ if (previous == null || !previous.$protected) this[name] = method;
+};
+
+Type.implement({
+
+ implement: implement.overloadSetter(),
+
+ extend: extend.overloadSetter(),
+
+ alias: function(name, existing){
+ implement.call(this, name, this.prototype[existing]);
+ }.overloadSetter(),
+
+ mirror: function(hook){
+ hooksOf(this).push(hook);
+ return this;
+ }
+
+});
+
+new Type('Type', Type);
+
+// Default Types
+
+var force = function(name, object, methods){
+ var isType = (object != Object),
+ prototype = object.prototype;
+
+ if (isType) object = new Type(name, object);
+
+ for (var i = 0, l = methods.length; i < l; i++){
+ var key = methods[i],
+ generic = object[key],
+ proto = prototype[key];
+
+ if (generic) generic.protect();
+ if (isType && proto) object.implement(key, proto.protect());
+ }
+
+ if (isType){
+ var methodsEnumerable = prototype.propertyIsEnumerable(methods[0]);
+ object.forEachMethod = function(fn){
+ if (!methodsEnumerable) for (var i = 0, l = methods.length; i < l; i++){
+ fn.call(prototype, prototype[methods[i]], methods[i]);
+ }
+ for (var key in prototype) fn.call(prototype, prototype[key], key)
+ };
+ }
+
+ return force;
+};
+
+force('String', String, [
+ 'charAt', 'charCodeAt', 'concat', 'indexOf', 'lastIndexOf', 'match', 'quote', 'replace', 'search',
+ 'slice', 'split', 'substr', 'substring', 'trim', 'toLowerCase', 'toUpperCase'
+])('Array', Array, [
+ 'pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift', 'concat', 'join', 'slice',
+ 'indexOf', 'lastIndexOf', 'filter', 'forEach', 'every', 'map', 'some', 'reduce', 'reduceRight'
+])('Number', Number, [
+ 'toExponential', 'toFixed', 'toLocaleString', 'toPrecision'
+])('Function', Function, [
+ 'apply', 'call', 'bind'
+])('RegExp', RegExp, [
+ 'exec', 'test'
+])('Object', Object, [
+ 'create', 'defineProperty', 'defineProperties', 'keys',
+ 'getPrototypeOf', 'getOwnPropertyDescriptor', 'getOwnPropertyNames',
+ 'preventExtensions', 'isExtensible', 'seal', 'isSealed', 'freeze', 'isFrozen'
+])('Date', Date, ['now']);
+
+Object.extend = extend.overloadSetter();
+
+Date.extend('now', function(){
+ return +(new Date);
+});
+
+new Type('Boolean', Boolean);
+
+// fixes NaN returning as Number
+
+Number.prototype.$family = function(){
+ return isFinite(this) ? 'number' : 'null';
+}.hide();
+
+// Number.random
+
+Number.extend('random', function(min, max){
+ return Math.floor(Math.random() * (max - min + 1) + min);
+});
+
+// forEach, each
+
+var hasOwnProperty = Object.prototype.hasOwnProperty;
+Object.extend('forEach', function(object, fn, bind){
+ for (var key in object){
+ if (hasOwnProperty.call(object, key)) fn.call(bind, object[key], key, object);
+ }
+});
+
+Object.each = Object.forEach;
+
+Array.implement({
+
+ forEach: function(fn, bind){
+ for (var i = 0, l = this.length; i < l; i++){
+ if (i in this) fn.call(bind, this[i], i, this);
+ }
+ },
+
+ each: function(fn, bind){
+ Array.forEach(this, fn, bind);
+ return this;
+ }
+
+});
+
+// Array & Object cloning, Object merging and appending
+
+var cloneOf = function(item){
+ switch (typeOf(item)){
+ case 'array': return item.clone();
+ case 'object': return Object.clone(item);
+ default: return item;
+ }
+};
+
+Array.implement('clone', function(){
+ var i = this.length, clone = new Array(i);
+ while (i--) clone[i] = cloneOf(this[i]);
+ return clone;
+});
+
+var mergeOne = function(source, key, current){
+ switch (typeOf(current)){
+ case 'object':
+ if (typeOf(source[key]) == 'object') Object.merge(source[key], current);
+ else source[key] = Object.clone(current);
+ break;
+ case 'array': source[key] = current.clone(); break;
+ default: source[key] = current;
+ }
+ return source;
+};
+
+Object.extend({
+
+ merge: function(source, k, v){
+ if (typeOf(k) == 'string') return mergeOne(source, k, v);
+ for (var i = 1, l = arguments.length; i < l; i++){
+ var object = arguments[i];
+ for (var key in object) mergeOne(source, key, object[key]);
+ }
+ return source;
+ },
+
+ clone: function(object){
+ var clone = {};
+ for (var key in object) clone[key] = cloneOf(object[key]);
+ return clone;
+ },
+
+ append: function(original){
+ for (var i = 1, l = arguments.length; i < l; i++){
+ var extended = arguments[i] || {};
+ for (var key in extended) original[key] = extended[key];
+ }
+ return original;
+ }
+
+});
+
+// Object-less types
+
+['Object', 'WhiteSpace', 'TextNode', 'Collection', 'Arguments'].each(function(name){
+ new Type(name);
+});
+
+// Unique ID
+
+var UID = Date.now();
+
+String.extend('uniqueID', function(){
+ return (UID++).toString(36);
+});
+
+
+
+})();
+
+
+/*
+---
+
+name: Array
+
+description: Contains Array Prototypes like each, contains, and erase.
+
+license: MIT-style license.
+
+requires: Type
+
+provides: Array
+
+...
+*/
+
+Array.implement({
+
+ /**/
+ every: function(fn, bind){
+ for (var i = 0, l = this.length >>> 0; i < l; i++){
+ if ((i in this) && !fn.call(bind, this[i], i, this)) return false;
+ }
+ return true;
+ },
+
+ filter: function(fn, bind){
+ var results = [];
+ for (var value, i = 0, l = this.length >>> 0; i < l; i++) if (i in this){
+ value = this[i];
+ if (fn.call(bind, value, i, this)) results.push(value);
+ }
+ return results;
+ },
+
+ indexOf: function(item, from){
+ var length = this.length >>> 0;
+ for (var i = (from < 0) ? Math.max(0, length + from) : from || 0; i < length; i++){
+ if (this[i] === item) return i;
+ }
+ return -1;
+ },
+
+ map: function(fn, bind){
+ var length = this.length >>> 0, results = Array(length);
+ for (var i = 0; i < length; i++){
+ if (i in this) results[i] = fn.call(bind, this[i], i, this);
+ }
+ return results;
+ },
+
+ some: function(fn, bind){
+ for (var i = 0, l = this.length >>> 0; i < l; i++){
+ if ((i in this) && fn.call(bind, this[i], i, this)) return true;
+ }
+ return false;
+ },
+ /*!ES5>*/
+
+ clean: function(){
+ return this.filter(function(item){
+ return item != null;
+ });
+ },
+
+ invoke: function(methodName){
+ var args = Array.slice(arguments, 1);
+ return this.map(function(item){
+ return item[methodName].apply(item, args);
+ });
+ },
+
+ associate: function(keys){
+ var obj = {}, length = Math.min(this.length, keys.length);
+ for (var i = 0; i < length; i++) obj[keys[i]] = this[i];
+ return obj;
+ },
+
+ link: function(object){
+ var result = {};
+ for (var i = 0, l = this.length; i < l; i++){
+ for (var key in object){
+ if (object[key](this[i])){
+ result[key] = this[i];
+ delete object[key];
+ break;
+ }
+ }
+ }
+ return result;
+ },
+
+ contains: function(item, from){
+ return this.indexOf(item, from) != -1;
+ },
+
+ append: function(array){
+ this.push.apply(this, array);
+ return this;
+ },
+
+ getLast: function(){
+ return (this.length) ? this[this.length - 1] : null;
+ },
+
+ getRandom: function(){
+ return (this.length) ? this[Number.random(0, this.length - 1)] : null;
+ },
+
+ include: function(item){
+ if (!this.contains(item)) this.push(item);
+ return this;
+ },
+
+ combine: function(array){
+ for (var i = 0, l = array.length; i < l; i++) this.include(array[i]);
+ return this;
+ },
+
+ erase: function(item){
+ for (var i = this.length; i--;){
+ if (this[i] === item) this.splice(i, 1);
+ }
+ return this;
+ },
+
+ empty: function(){
+ this.length = 0;
+ return this;
+ },
+
+ flatten: function(){
+ var array = [];
+ for (var i = 0, l = this.length; i < l; i++){
+ var type = typeOf(this[i]);
+ if (type == 'null') continue;
+ array = array.concat((type == 'array' || type == 'collection' || type == 'arguments' || instanceOf(this[i], Array)) ? Array.flatten(this[i]) : this[i]);
+ }
+ return array;
+ },
+
+ pick: function(){
+ for (var i = 0, l = this.length; i < l; i++){
+ if (this[i] != null) return this[i];
+ }
+ return null;
+ },
+
+ hexToRgb: function(array){
+ if (this.length != 3) return null;
+ var rgb = this.map(function(value){
+ if (value.length == 1) value += value;
+ return value.toInt(16);
+ });
+ return (array) ? rgb : 'rgb(' + rgb + ')';
+ },
+
+ rgbToHex: function(array){
+ if (this.length < 3) return null;
+ if (this.length == 4 && this[3] == 0 && !array) return 'transparent';
+ var hex = [];
+ for (var i = 0; i < 3; i++){
+ var bit = (this[i] - 0).toString(16);
+ hex.push((bit.length == 1) ? '0' + bit : bit);
+ }
+ return (array) ? hex : '#' + hex.join('');
+ }
+
+});
+
+
+
+
+/*
+---
+
+name: String
+
+description: Contains String Prototypes like camelCase, capitalize, test, and toInt.
+
+license: MIT-style license.
+
+requires: Type
+
+provides: String
+
+...
+*/
+
+String.implement({
+
+ test: function(regex, params){
+ return ((typeOf(regex) == 'regexp') ? regex : new RegExp('' + regex, params)).test(this);
+ },
+
+ contains: function(string, separator){
+ return (separator) ? (separator + this + separator).indexOf(separator + string + separator) > -1 : String(this).indexOf(string) > -1;
+ },
+
+ trim: function(){
+ return String(this).replace(/^\s+|\s+$/g, '');
+ },
+
+ clean: function(){
+ return String(this).replace(/\s+/g, ' ').trim();
+ },
+
+ camelCase: function(){
+ return String(this).replace(/-\D/g, function(match){
+ return match.charAt(1).toUpperCase();
+ });
+ },
+
+ hyphenate: function(){
+ return String(this).replace(/[A-Z]/g, function(match){
+ return ('-' + match.charAt(0).toLowerCase());
+ });
+ },
+
+ capitalize: function(){
+ return String(this).replace(/\b[a-z]/g, function(match){
+ return match.toUpperCase();
+ });
+ },
+
+ escapeRegExp: function(){
+ return String(this).replace(/([-.*+?^${}()|[\]\/\\])/g, '\\$1');
+ },
+
+ toInt: function(base){
+ return parseInt(this, base || 10);
+ },
+
+ toFloat: function(){
+ return parseFloat(this);
+ },
+
+ hexToRgb: function(array){
+ var hex = String(this).match(/^#?(\w{1,2})(\w{1,2})(\w{1,2})$/);
+ return (hex) ? hex.slice(1).hexToRgb(array) : null;
+ },
+
+ rgbToHex: function(array){
+ var rgb = String(this).match(/\d{1,3}/g);
+ return (rgb) ? rgb.rgbToHex(array) : null;
+ },
+
+ substitute: function(object, regexp){
+ return String(this).replace(regexp || (/\\?\{([^{}]+)\}/g), function(match, name){
+ if (match.charAt(0) == '\\') return match.slice(1);
+ return (object[name] != null) ? object[name] : '';
+ });
+ }
+
+});
+
+
+/*
+---
+
+name: Number
+
+description: Contains Number Prototypes like limit, round, times, and ceil.
+
+license: MIT-style license.
+
+requires: Type
+
+provides: Number
+
+...
+*/
+
+Number.implement({
+
+ limit: function(min, max){
+ return Math.min(max, Math.max(min, this));
+ },
+
+ round: function(precision){
+ precision = Math.pow(10, precision || 0).toFixed(precision < 0 ? -precision : 0);
+ return Math.round(this * precision) / precision;
+ },
+
+ times: function(fn, bind){
+ for (var i = 0; i < this; i++) fn.call(bind, i, this);
+ },
+
+ toFloat: function(){
+ return parseFloat(this);
+ },
+
+ toInt: function(base){
+ return parseInt(this, base || 10);
+ }
+
+});
+
+Number.alias('each', 'times');
+
+(function(math){
+ var methods = {};
+ math.each(function(name){
+ if (!Number[name]) methods[name] = function(){
+ return Math[name].apply(null, [this].concat(Array.from(arguments)));
+ };
+ });
+ Number.implement(methods);
+})(['abs', 'acos', 'asin', 'atan', 'atan2', 'ceil', 'cos', 'exp', 'floor', 'log', 'max', 'min', 'pow', 'sin', 'sqrt', 'tan']);
+
+
+/*
+---
+
+name: Function
+
+description: Contains Function Prototypes like create, bind, pass, and delay.
+
+license: MIT-style license.
+
+requires: Type
+
+provides: Function
+
+...
+*/
+
+Function.extend({
+
+ attempt: function(){
+ for (var i = 0, l = arguments.length; i < l; i++){
+ try {
+ return arguments[i]();
+ } catch (e){}
+ }
+ return null;
+ }
+
+});
+
+Function.implement({
+
+ attempt: function(args, bind){
+ try {
+ return this.apply(bind, Array.from(args));
+ } catch (e){}
+
+ return null;
+ },
+
+ /**/
+ bind: function(that){
+ var self = this,
+ args = arguments.length > 1 ? Array.slice(arguments, 1) : null,
+ F = function(){};
+
+ var bound = function(){
+ var context = that, length = arguments.length;
+ if (this instanceof bound){
+ F.prototype = self.prototype;
+ context = new F;
+ }
+ var result = (!args && !length)
+ ? self.call(context)
+ : self.apply(context, args && length ? args.concat(Array.slice(arguments)) : args || arguments);
+ return context == that ? result : context;
+ };
+ return bound;
+ },
+ /*!ES5-bind>*/
+
+ pass: function(args, bind){
+ var self = this;
+ if (args != null) args = Array.from(args);
+ return function(){
+ return self.apply(bind, args || arguments);
+ };
+ },
+
+ delay: function(delay, bind, args){
+ return setTimeout(this.pass((args == null ? [] : args), bind), delay);
+ },
+
+ periodical: function(periodical, bind, args){
+ return setInterval(this.pass((args == null ? [] : args), bind), periodical);
+ }
+
+});
+
+
+
+
+/*
+---
+
+name: Object
+
+description: Object generic methods
+
+license: MIT-style license.
+
+requires: Type
+
+provides: [Object, Hash]
+
+...
+*/
+
+(function(){
+
+var hasOwnProperty = Object.prototype.hasOwnProperty;
+
+Object.extend({
+
+ subset: function(object, keys){
+ var results = {};
+ for (var i = 0, l = keys.length; i < l; i++){
+ var k = keys[i];
+ if (k in object) results[k] = object[k];
+ }
+ return results;
+ },
+
+ map: function(object, fn, bind){
+ var results = {};
+ for (var key in object){
+ if (hasOwnProperty.call(object, key)) results[key] = fn.call(bind, object[key], key, object);
+ }
+ return results;
+ },
+
+ filter: function(object, fn, bind){
+ var results = {};
+ for (var key in object){
+ var value = object[key];
+ if (hasOwnProperty.call(object, key) && fn.call(bind, value, key, object)) results[key] = value;
+ }
+ return results;
+ },
+
+ every: function(object, fn, bind){
+ for (var key in object){
+ if (hasOwnProperty.call(object, key) && !fn.call(bind, object[key], key)) return false;
+ }
+ return true;
+ },
+
+ some: function(object, fn, bind){
+ for (var key in object){
+ if (hasOwnProperty.call(object, key) && fn.call(bind, object[key], key)) return true;
+ }
+ return false;
+ },
+
+ keys: function(object){
+ var keys = [];
+ for (var key in object){
+ if (hasOwnProperty.call(object, key)) keys.push(key);
+ }
+ return keys;
+ },
+
+ values: function(object){
+ var values = [];
+ for (var key in object){
+ if (hasOwnProperty.call(object, key)) values.push(object[key]);
+ }
+ return values;
+ },
+
+ getLength: function(object){
+ return Object.keys(object).length;
+ },
+
+ keyOf: function(object, value){
+ for (var key in object){
+ if (hasOwnProperty.call(object, key) && object[key] === value) return key;
+ }
+ return null;
+ },
+
+ contains: function(object, value){
+ return Object.keyOf(object, value) != null;
+ },
+
+ toQueryString: function(object, base){
+ var queryString = [];
+
+ Object.each(object, function(value, key){
+ if (base) key = base + '[' + key + ']';
+ var result;
+ switch (typeOf(value)){
+ case 'object': result = Object.toQueryString(value, key); break;
+ case 'array':
+ var qs = {};
+ value.each(function(val, i){
+ qs[i] = val;
+ });
+ result = Object.toQueryString(qs, key);
+ break;
+ default: result = key + '=' + encodeURIComponent(value);
+ }
+ if (value != null) queryString.push(result);
+ });
+
+ return queryString.join('&');
+ }
+
+});
+
+})();
+
+
+
+
+/*
+---
+
+name: Browser
+
+description: The Browser Object. Contains Browser initialization, Window and Document, and the Browser Hash.
+
+license: MIT-style license.
+
+requires: [Array, Function, Number, String]
+
+provides: [Browser, Window, Document]
+
+...
+*/
+
+(function(){
+
+var document = this.document;
+var window = document.window = this;
+
+var ua = navigator.userAgent.toLowerCase(),
+ platform = navigator.platform.toLowerCase(),
+ UA = ua.match(/(opera|ie|firefox|chrome|version)[\s\/:]([\w\d\.]+)?.*?(safari|version[\s\/:]([\w\d\.]+)|$)/) || [null, 'unknown', 0],
+ mode = UA[1] == 'ie' && document.documentMode;
+
+var Browser = this.Browser = {
+
+ extend: Function.prototype.extend,
+
+ name: (UA[1] == 'version') ? UA[3] : UA[1],
+
+ version: mode || parseFloat((UA[1] == 'opera' && UA[4]) ? UA[4] : UA[2]),
+
+ Platform: {
+ name: ua.match(/ip(?:ad|od|hone)/) ? 'ios' : (ua.match(/(?:webos|android)/) || platform.match(/mac|win|linux/) || ['other'])[0]
+ },
+
+ Features: {
+ xpath: !!(document.evaluate),
+ air: !!(window.runtime),
+ query: !!(document.querySelector),
+ json: !!(window.JSON)
+ },
+
+ Plugins: {}
+
+};
+
+Browser[Browser.name] = true;
+Browser[Browser.name + parseInt(Browser.version, 10)] = true;
+Browser.Platform[Browser.Platform.name] = true;
+
+// Request
+
+Browser.Request = (function(){
+
+ var XMLHTTP = function(){
+ return new XMLHttpRequest();
+ };
+
+ var MSXML2 = function(){
+ return new ActiveXObject('MSXML2.XMLHTTP');
+ };
+
+ var MSXML = function(){
+ return new ActiveXObject('Microsoft.XMLHTTP');
+ };
+
+ return Function.attempt(function(){
+ XMLHTTP();
+ return XMLHTTP;
+ }, function(){
+ MSXML2();
+ return MSXML2;
+ }, function(){
+ MSXML();
+ return MSXML;
+ });
+
+})();
+
+Browser.Features.xhr = !!(Browser.Request);
+
+// Flash detection
+
+var version = (Function.attempt(function(){
+ return navigator.plugins['Shockwave Flash'].description;
+}, function(){
+ return new ActiveXObject('ShockwaveFlash.ShockwaveFlash').GetVariable('$version');
+}) || '0 r0').match(/\d+/g);
+
+Browser.Plugins.Flash = {
+ version: Number(version[0] || '0.' + version[1]) || 0,
+ build: Number(version[2]) || 0
+};
+
+// String scripts
+
+Browser.exec = function(text){
+ if (!text) return text;
+ if (window.execScript){
+ window.execScript(text);
+ } else {
+ var script = document.createElement('script');
+ script.setAttribute('type', 'text/javascript');
+ script.text = text;
+ document.head.appendChild(script);
+ document.head.removeChild(script);
+ }
+ return text;
+};
+
+String.implement('stripScripts', function(exec){
+ var scripts = '';
+ var text = this.replace(/