aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormaggiewachs <maggie@filamentgroup.com>2010-04-16 14:24:49 -0400
committermaggiewachs <maggie@filamentgroup.com>2010-04-16 14:24:49 -0400
commit970ed9a67a533ab44b184babf52100dfbcfa7c96 (patch)
tree423aa90362d991c62af87ec7b1a094706f46cdcd
parent4ffe07457cb21332e9a33c319c1f1f610e532a27 (diff)
parentd1033cc2b79067f31767bfe0bb1f9a761dae9b3f (diff)
downloadjquery-ui-970ed9a67a533ab44b184babf52100dfbcfa7c96.tar.gz
jquery-ui-970ed9a67a533ab44b184babf52100dfbcfa7c96.zip
Merge branch 'master' of github.com:jquery/jquery-ui
-rw-r--r--build/build.xml112
-rw-r--r--demos/autocomplete/combobox.html21
-rw-r--r--demos/autocomplete/index.html3
-rw-r--r--demos/autocomplete/multiple-remote.html75
-rw-r--r--demos/autocomplete/multiple.html69
-rw-r--r--demos/autocomplete/remote-with-cache.html7
-rw-r--r--demos/autocomplete/remote.html1
-rw-r--r--demos/button/splitbutton.html28
-rw-r--r--demos/draggable/visual-feedback.html2
-rw-r--r--demos/droppable/index.html1
-rw-r--r--demos/droppable/shopping-cart.html101
-rw-r--r--demos/effect/index.html2
-rw-r--r--demos/tabs/cookie.html57
-rw-r--r--demos/tabs/index.html1
-rw-r--r--external/qunit.js64
-rw-r--r--tests/unit/accordion/accordion.html90
-rw-r--r--tests/unit/accordion/accordion_core.js11
-rw-r--r--tests/unit/accordion/accordion_methods.js56
-rw-r--r--tests/unit/accordion/accordion_options.js41
-rw-r--r--tests/unit/autocomplete/autocomplete_events.js26
-rw-r--r--tests/unit/autocomplete/autocomplete_methods.js7
-rw-r--r--tests/unit/autocomplete/autocomplete_options.js2
-rw-r--r--tests/unit/button/button_methods.js6
-rw-r--r--tests/unit/core/core.html12
-rw-r--r--tests/unit/datepicker/datepicker.html13
-rw-r--r--tests/unit/dialog/dialog.html13
-rw-r--r--tests/unit/draggable/draggable.html13
-rw-r--r--tests/unit/droppable/droppable.html13
-rw-r--r--tests/unit/position/position.html4
-rw-r--r--tests/unit/position/position_core.js20
-rw-r--r--tests/unit/progressbar/progressbar_core.js4
-rw-r--r--tests/unit/resizable/resizable.html13
-rw-r--r--tests/unit/selectable/selectable.html13
-rw-r--r--tests/unit/slider/slider_events.js58
-rw-r--r--tests/unit/slider/slider_options.js49
-rw-r--r--tests/unit/sortable/sortable.html13
-rw-r--r--tests/unit/sortable/sortable_methods.js3
-rw-r--r--tests/unit/tabs/tabs.html13
-rw-r--r--tests/unit/tabs/tabs_core.js28
-rw-r--r--tests/visual/button/button_performance.html552
-rw-r--r--tests/visual/compound/widgets_in_dialog.html450
-rw-r--r--tests/visual/menu/drilldown.html133
-rw-r--r--tests/visual/menu/nested.html75
-rw-r--r--tests/visual/menu/nested2.html103
-rw-r--r--themes/base/jquery.ui.accordion.css2
-rw-r--r--themes/base/jquery.ui.autocomplete.css5
-rw-r--r--themes/base/jquery.ui.tabs.css2
-rw-r--r--ui/i18n/jquery.ui.datepicker-pl.js2
-rw-r--r--ui/jquery.ui.accordion.js9
-rw-r--r--ui/jquery.ui.autocomplete.js27
-rw-r--r--ui/jquery.ui.core.js7
-rw-r--r--ui/jquery.ui.dialog.js7
-rw-r--r--ui/jquery.ui.position.js4
-rw-r--r--ui/jquery.ui.slider.js749
-rw-r--r--ui/jquery.ui.sortable.js12
-rw-r--r--ui/jquery.ui.widget.js4
56 files changed, 2156 insertions, 1052 deletions
diff --git a/build/build.xml b/build/build.xml
index 0f4131b0e..cdd5aff11 100644
--- a/build/build.xml
+++ b/build/build.xml
@@ -22,24 +22,26 @@
<property name="release.filename" value="jquery-ui-${release.version}" />
<property name="dist.dir" value="dist/${release.filename}/" />
+ <property name="cdndist.dir" value="dist/${release.filename}-googlecdn" />
<property name="build.dir" value="build" />
<property name="ui.dir" value="../" />
<property name="src.dir" value="${ui.dir}/ui/" />
<property name="theme.dir" value="${ui.dir}/themes/base/" />
<property name="docs.dir" value="${ui.dir}/docs/" />
- <property name="min.folder" value="${dist.dir}/ui/minified" />
+ <property name="min.dir" value="${dist.dir}/ui/minified" />
<property name="concatenated" value="jquery-ui" />
<property name="concatenated.i18n" value="jquery-ui-i18n" />
<property name="core.files" value="jquery.ui.core.js, jquery.ui.widget.js, jquery.ui.mouse.js, jquery.ui.draggable.js, jquery.ui.droppable.js, jquery.ui.resizable.js, jquery.ui.selectable.js, jquery.ui.sortable.js, jquery.effects.core.js" />
+ <property name="core.files.min" value="jquery.ui.core.min.js, jquery.ui.widget.min.js, jquery.ui.mouse.min.js, jquery.ui.draggable.min.js, jquery.ui.droppable.min.js, jquery.ui.resizable.min.js, jquery.ui.selectable.min.js, jquery.ui.sortable.min.js, jquery.effects.core.min.js" />
<property description="Google Closure" name="closure-jar" value="${build.dir}/google-compiler-20091218.jar" />
- <target name="deploy-release" depends="docs-download, concatenate, minify, copy, replace-version, prepend-header, zip" description="Release builder">
+ <target name="deploy-release" depends="clean, docs-download, concatenate, minify, copy, replace-version, prepend-header, zip, googlecdn" description="Release builder">
</target>
-
+
<target name="replace-version">
<replaceregexp match="@VERSION" replace="${release.version}" flags="g" byline="true">
<fileset dir="${dist.dir}/ui/" includes="*.js"/>
@@ -49,7 +51,6 @@
</target>
<target name="prepend-header">
- <!-- TODO: refactor this ugly mess -->
<copy todir="${dist.dir}/headers/">
<fileset dir="${dist.dir}/ui/" includes="*.js" />
</copy>
@@ -57,7 +58,7 @@
<fileset dir="${dist.dir}/headers/" includes="*.js"/>
</replaceregexp>
<for param="file">
- <path><fileset dir="${dist.dir}/ui/minified/" includes="*.js" /></path>
+ <path><fileset dir="${min.dir}/" includes="*.js" /></path>
<sequential>
<propertyregex override="yes" property="target" input="@{file}" regexp=".*[\\/](.+)\.min\.js$" replace="\1"/>
<concat destfile="${dist.dir}/ui-headered/${target}.min.js">
@@ -66,9 +67,33 @@
</concat>
</sequential>
</for>
- <copy todir="${dist.dir}/ui/minified">
+ <copy todir="${min.dir}">
<fileset dir="${dist.dir}/ui-headered/" includes="*.js" />
</copy>
+
+ <!-- once more for the i18n files -->
+ <!-- need to clean up headers in those files first
+ <copy todir="${dist.dir}/headers/i18n/">
+ <fileset dir="${dist.dir}/ui/i18n/" includes="*.js" />
+ </copy>
+ <replaceregexp match="^(\/\*.*?\*\/\s).+" replace="\1" flags="s">
+ <fileset dir="${dist.dir}/headers/i18n/" includes="*.js"/>
+ </replaceregexp>
+ <for param="file">
+ <path><fileset dir="${min.dir}/i18n/" includes="*.js" /></path>
+ <sequential>
+ <propertyregex override="yes" property="target" input="@{file}" regexp=".*[\\/](.+)\.min\.js$" replace="\1"/>
+ <concat destfile="${dist.dir}/ui-headered/i18n/${target}.min.js">
+ <header file="${dist.dir}/headers/i18n/${target}.js" />
+ <fileset file="@{file}" />
+ </concat>
+ </sequential>
+ </for>
+ <copy todir="${min.dir}/i18n/">
+ <fileset dir="${dist.dir}/ui-headered/i18n/" includes="*.js" />
+ </copy>
+ -->
+
<delete dir="${dist.dir}/headers/" />
<delete dir="${dist.dir}/ui-headered/" />
</target>
@@ -108,45 +133,44 @@
<target name="minify" depends="concatenate" description="Remove all comments and whitespace, no compression, great in combination with GZip">
<echo message="Building minified" />
- <delete dir="${min.folder}/" />
- <mkdir dir="${min.folder}" />
- <delete dir="${min.folder}/i18n/" />
- <mkdir dir="${min.folder}/i18n/" />
+ <delete dir="${min.dir}/" />
+ <mkdir dir="${min.dir}" />
+ <delete dir="${min.dir}/i18n/" />
+ <mkdir dir="${min.dir}/i18n/" />
<apply executable="java" parallel="false">
<fileset dir="${src.dir}/" includes="jquery.ui.*.js, jquery.effects.*.js" />
<arg line="-jar" />
- <arg path="build/google-compiler-20091218.jar" />
+ <arg path="${closure-jar}" />
<arg value="--warning_level" />
<arg value="QUIET" />
<arg value="--js_output_file" />
<targetfile />
<arg value="--js" />
- <mapper type="glob" from="*.js" to="${min.folder}/*.min.js" />
+ <mapper type="glob" from="*.js" to="${min.dir}/*.min.js" />
</apply>
+
+ <concat destfile="${min.dir}/${concatenated}.min.js">
+ <filelist dir="${min.dir}" files="${core.files.min}" />
+ <fileset dir="${min.dir}" includes="jquery.ui.*.js, jquery.effects.*.js" excludes="${core.files.min}" />
+ </concat>
- <apply executable="java" parallel="false" verbose="true" dest="${dist.dir}">
- <filelist dir="${dist.dir}/ui/" files="${concatenated}.js" />
+ <apply executable="java" parallel="false">
+ <fileset dir="${src.dir}/i18n/" includes="jquery.ui.*.js" />
<arg line="-jar" />
- <arg path="build/google-compiler-20091218.jar" />
+ <arg path="${closure-jar}" />
<arg value="--warning_level" />
<arg value="QUIET" />
<arg value="--js_output_file" />
<targetfile />
<arg value="--js" />
- <mapper type="glob" from="${concatenated}.js" to="tmpmin" />
+ <mapper type="glob" from="*.js" to="${min.dir}/i18n/*.min.js" />
</apply>
- <concat destfile="${min.folder}/jquery-ui.min.js">
- <filelist files="${src.dir}/jquery.ui.core.js, ${dist.dir}/tmpmin"/>
- <filterchain>
- <headfilter lines="9"/>
- </filterchain>
- </concat>
- <concat destfile="${min.folder}/jquery-ui.min.js" append="yes">
- <filelist files="${dist.dir}/tmpmin"/>
+
+ <concat destfile="${min.dir}/i18n/${concatenated.i18n}.min.js">
+ <fileset dir="${min.dir}/i18n" includes="jquery.ui.*.js" />
</concat>
- <delete file="${dist.dir}/tmpmin"/>
-
+
<echo message="Minified ui/ built." />
</target>
@@ -257,5 +281,41 @@
</replaceregexp>
<echo message="All trailing spaces removed." />
</target>
+
+ <target name="googlecdn">
+ <delete dir="${cdndist.dir}" />
+ <mkdir dir="${cdndist.dir}" />
+ <copy todir="${cdndist.dir}">
+ <fileset dir=".." includes="AUTHORS.txt, GPL-LICENSE.txt, MIT-LICENSE.txt, version.txt" />
+ </copy>
+ <copy todir="${cdndist.dir}">
+ <fileset dir="${dist.dir}ui" includes="jquery-ui.js" />
+ <fileset dir="${dist.dir}ui/minified" includes="jquery-ui.min.js" />
+ </copy>
+ <copy todir="${cdndist.dir}/i18n">
+ <fileset dir="${dist.dir}ui/i18n" />
+ <fileset dir="${dist.dir}ui/minified/i18n" />
+ </copy>
+ <copy todir="${cdndist.dir}/themes">
+ <fileset dir="${dist.dir}themes" />
+ </copy>
+ <checksum>
+ <fileset dir="${cdndist.dir}" />
+ </checksum>
+ <for param="file">
+ <path><fileset dir="${cdndist.dir}" includes="**/" excludes="**/*.MD5" /></path>
+ <sequential>
+ <!-- @{file} is an absolute path, use that ugly regexes to make it relative -->
+ <propertyregex override="yes" property="relativepath" input="@{file}" regexp=".+?googlecdn[\\/](.+)$" replace="\1"/>
+ <propertyregex override="yes" property="relativepath" input="${relativepath}" regexp="\\" replace="/" global="true" />
+ <concat destfile="${cdndist.dir}/MANIFEST" append="yes">${relativepath} </concat>
+ <concat destfile="${cdndist.dir}/MANIFEST" append="yes"><file file="@{file}.MD5" /></concat>
+ </sequential>
+ </for>
+ <delete dir="${cdndist.dir}" includes="**/*.MD5" />
+ <zip destfile="${dist.dir}/../${release.filename}-googlecdn.zip">
+ <zipfileset dir="${cdndist.dir}/" />
+ </zip>
+ </target>
</project>
diff --git a/demos/autocomplete/combobox.html b/demos/autocomplete/combobox.html
index e5dc6c92b..3001f7d17 100644
--- a/demos/autocomplete/combobox.html
+++ b/demos/autocomplete/combobox.html
@@ -30,24 +30,23 @@
var matcher = new RegExp(request.term, "i");
response(select.children("option").map(function() {
var text = $(this).text();
- if (!request.term || matcher.test(text))
+ if (this.value && (!request.term || matcher.test(text)))
return {
- id: $(this).val(),
- label: text.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)(" + request.term.replace(/([\^\$\(\)\[\]\{\}\*\.\+\?\|\\])/gi, "\\$1") + ")(?![^<>]*>)(?![^&;]+;)", "gi"), "<strong>$1</strong>"),
+ id: this.value,
+ label: text.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)(" + $.ui.autocomplete.escapeRegex(request.term) + ")(?![^<>]*>)(?![^&;]+;)", "gi"), "<strong>$1</strong>"),
value: text
};
}));
},
delay: 0,
- select: function(e, ui) {
+ change: function(event, ui) {
if (!ui.item) {
// remove invalid value, as it didn't match anything
$(this).val("");
return false;
}
- $(this).focus();
select.val(ui.item.id);
- self._trigger("selected", null, {
+ self._trigger("selected", event, {
item: select.find("[value='" + ui.item.id + "']")
});
@@ -56,6 +55,7 @@
})
.addClass("ui-widget ui-widget-content ui-corner-left");
$("<button>&nbsp;</button>")
+ .attr("tabIndex", -1)
.attr("title", "Show All Items")
.insertAfter(input)
.button({
@@ -81,7 +81,10 @@
})(jQuery);
$(function() {
- $("select").combobox();
+ $("#combobox").combobox();
+ $("#toggle").click(function() {
+ $("#combobox").toggle();
+ });
});
</script>
</head>
@@ -91,7 +94,8 @@
<div class="ui-widget">
<label>Your preferred programming language: </label>
- <select>
+ <select id="combobox">
+ <option value="">Select one...</option>
<option value="a">asp</option>
<option value="c">c</option>
<option value="cpp">c++</option>
@@ -107,6 +111,7 @@
<option value="s">scala</option>
</select>
</div>
+<button id="toggle">Show underlying select</button>
</div><!-- End demo -->
diff --git a/demos/autocomplete/index.html b/demos/autocomplete/index.html
index 9389b076d..ba96d994e 100644
--- a/demos/autocomplete/index.html
+++ b/demos/autocomplete/index.html
@@ -16,6 +16,9 @@
<li><a href="combobox.html">Combobox</a></li>
<li><a href="custom-data.html">Custom data and display</a></li>
<li><a href="xml.html">XML data parsed once</a></li>
+ <li><a href="categories.html">Categories</a></li>
+ <li><a href="multiple.html">Multiple values</a></li>
+ <li><a href="multiple-remote.html">Multiple, remote</a></li>
</ul>
</div>
</body>
diff --git a/demos/autocomplete/multiple-remote.html b/demos/autocomplete/multiple-remote.html
new file mode 100644
index 000000000..5e0f4b50b
--- /dev/null
+++ b/demos/autocomplete/multiple-remote.html
@@ -0,0 +1,75 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8" />
+ <title>jQuery UI Autocomplete multiple demo</title>
+ <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" />
+ <script type="text/javascript" src="../../jquery-1.4.2.js"></script>
+ <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script>
+ <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script>
+ <script type="text/javascript" src="../../ui/jquery.ui.position.js"></script>
+ <script type="text/javascript" src="../../ui/jquery.ui.autocomplete.js"></script>
+ <link type="text/css" href="../demos.css" rel="stylesheet" />
+ <script type="text/javascript">
+ $(function() {
+ function split(val) {
+ return val.split(/,\s*/);
+ }
+ function extractLast(term) {
+ return split(term).pop();
+ }
+
+ $("#birds").autocomplete({
+ source: function(request, response) {
+ $.getJSON("search.php", {
+ term: extractLast(request.term)
+ }, response);
+ },
+ search: function() {
+ // custom minLength
+ var term = extractLast(this.value);
+ if (term.length < 2) {
+ return false;
+ }
+ },
+ focus: function() {
+ // prevent value inserted on focus
+ return false;
+ },
+ select: function(event, ui) {
+ var terms = split( this.value );
+ // remove the current input
+ terms.pop();
+ // add the selected item
+ terms.push( ui.item.value );
+ // add placeholder to get the comma-and-space at the end
+ terms.push("");
+ this.value = terms.join(", ");
+ return false;
+ }
+ });
+ });
+ </script>
+</head>
+<body>
+
+<div class="demo">
+
+<div class="ui-widget">
+ <label for="birds">Birds: </label>
+ <input id="birds" size="50" />
+</div>
+
+</div><!-- End demo -->
+
+<div class="demo-description">
+<p>
+Usage: Enter at least two characters to get bird name suggestions. Select a value to continue adding more names.
+</p>
+<p>
+This is an example showing how to use the source-option along with some events to enable autocompleting multiple values into a single field.
+</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
diff --git a/demos/autocomplete/multiple.html b/demos/autocomplete/multiple.html
new file mode 100644
index 000000000..908cfe6ce
--- /dev/null
+++ b/demos/autocomplete/multiple.html
@@ -0,0 +1,69 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8" />
+ <title>jQuery UI Autocomplete multiple demo</title>
+ <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" />
+ <script type="text/javascript" src="../../jquery-1.4.2.js"></script>
+ <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script>
+ <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script>
+ <script type="text/javascript" src="../../ui/jquery.ui.position.js"></script>
+ <script type="text/javascript" src="../../ui/jquery.ui.autocomplete.js"></script>
+ <link type="text/css" href="../demos.css" rel="stylesheet" />
+ <script type="text/javascript">
+ $(function() {
+ var availableTags = ["c++", "java", "php", "coldfusion", "javascript", "asp", "ruby", "python", "c", "scala", "groovy", "haskell", "perl"];
+ function split(val) {
+ return val.split(/,\s*/);
+ }
+ function extractLast(term) {
+ return split(term).pop();
+ }
+
+ $("#tags").autocomplete({
+ minLength: 0,
+ source: function(request, response) {
+ // delegate back to autocomplete, but extract the last term
+ response($.ui.autocomplete.filter(availableTags, extractLast(request.term)));
+ },
+ focus: function() {
+ // prevent value inserted on focus
+ return false;
+ },
+ select: function(event, ui) {
+ var terms = split( this.value );
+ // remove the current input
+ terms.pop();
+ // add the selected item
+ terms.push( ui.item.value );
+ // add placeholder to get the comma-and-space at the end
+ terms.push("");
+ this.value = terms.join(", ");
+ return false;
+ }
+ });
+ });
+ </script>
+</head>
+<body>
+
+<div class="demo">
+
+<div class="ui-widget">
+ <label for="tags">Tag programming languages: </label>
+ <input id="tags" size="50" />
+</div>
+
+</div><!-- End demo -->
+
+<div class="demo-description">
+<p>
+Usage: Type something, eg. "j" to see suggestions for tagging with programming languages. Select a value, then continue typing to add more.
+</p>
+<p>
+This is an example showing how to use the source-option along with some events to enable autocompleting multiple values into a single field.
+</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
diff --git a/demos/autocomplete/remote-with-cache.html b/demos/autocomplete/remote-with-cache.html
index 3688365d4..a00c741e4 100644
--- a/demos/autocomplete/remote-with-cache.html
+++ b/demos/autocomplete/remote-with-cache.html
@@ -22,12 +22,11 @@
source: function(request, response) {
if (cache.term == request.term && cache.content) {
response(cache.content);
+ return;
}
if (new RegExp(cache.term).test(request.term) && cache.content && cache.content.length < 13) {
- var matcher = new RegExp($.ui.autocomplete.escapeRegex(request.term), "i");
- response($.grep(cache.content, function(value) {
- return matcher.test(value.value)
- }));
+ response($.ui.autocomplete.filter(cache.content, request.term));
+ return;
}
$.ajax({
url: "search.php",
diff --git a/demos/autocomplete/remote.html b/demos/autocomplete/remote.html
index 3b0d7096d..9414102e6 100644
--- a/demos/autocomplete/remote.html
+++ b/demos/autocomplete/remote.html
@@ -18,7 +18,6 @@
}
$("#birds").autocomplete({
- // TODO doesn't work when loaded from /demos/#autocomplete|remote
source: "search.php",
minLength: 2,
select: function(event, ui) {
diff --git a/demos/button/splitbutton.html b/demos/button/splitbutton.html
index b42fe520a..7e4d66038 100644
--- a/demos/button/splitbutton.html
+++ b/demos/button/splitbutton.html
@@ -11,21 +11,23 @@
<link type="text/css" href="../demos.css" rel="stylesheet" />
<script type="text/javascript">
$(function() {
- $("#rerun").button().click(function() {
- alert("Running the last action");
- })
+ $("#rerun")
+ .button()
+ .click( function() {
+ alert( "Running the last action" );
+ })
.next()
- .button({
- text: false,
- icons: {
- primary: "ui-icon-triangle-1-s"
- }
- })
- .click(function() {
- alert("Could display a menu to select an action");
- })
+ .button( {
+ text: false,
+ icons: {
+ primary: "ui-icon-triangle-1-s"
+ }
+ })
+ .click( function() {
+ alert( "Could display a menu to select an action" );
+ })
.parent()
- .buttonset();
+ .buttonset();
});
</script>
<style>
diff --git a/demos/draggable/visual-feedback.html b/demos/draggable/visual-feedback.html
index bb54de4fe..4644472f0 100644
--- a/demos/draggable/visual-feedback.html
+++ b/demos/draggable/visual-feedback.html
@@ -27,7 +27,7 @@
return $('<div class="ui-widget-header">I\'m a custom helper</div>');
}
});
- $("#set div").draggable({ stack: { group: '#set div', min: 1 } });
+ $("#set div").draggable({ stack: '#set div' });
});
</script>
</head>
diff --git a/demos/droppable/index.html b/demos/droppable/index.html
index c2e08eef8..e0c4e6ae2 100644
--- a/demos/droppable/index.html
+++ b/demos/droppable/index.html
@@ -15,6 +15,7 @@
<li><a href="propagation.html">Prevent propagation</a></li>
<li><a href="visual-feedback.html">Visual feedback</a></li>
<li><a href="revert.html">Revert draggable position</a></li>
+ <li><a href="shopping-cart.html">Shopping Cart</a></li>
<li><a href="photo-manager.html">Simple photo manager</a></li>
</ul>
</div>
diff --git a/demos/droppable/shopping-cart.html b/demos/droppable/shopping-cart.html
new file mode 100644
index 000000000..de8ce4fe3
--- /dev/null
+++ b/demos/droppable/shopping-cart.html
@@ -0,0 +1,101 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8" />
+ <title>jQuery UI Droppable - Shopping Cart Demo</title>
+ <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" />
+ <script type="text/javascript" src="../../jquery-1.4.2.js"></script>
+ <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script>
+ <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script>
+ <script type="text/javascript" src="../../ui/jquery.ui.mouse.js"></script>
+ <script type="text/javascript" src="../../ui/jquery.ui.draggable.js"></script>
+ <script type="text/javascript" src="../../ui/jquery.ui.droppable.js"></script>
+ <script type="text/javascript" src="../../ui/jquery.ui.sortable.js"></script>
+ <script type="text/javascript" src="../../ui/jquery.ui.accordion.js"></script>
+ <link type="text/css" href="../demos.css" rel="stylesheet" />
+ <style type="text/css">
+ h1 { padding: .2em; margin: 0; }
+ #products { float:left; width: 500px; margin-right: 2em; }
+ #cart { width: 200px; float: left; }
+ /* style the list to maximize the droppable hitarea */
+ #cart ol { margin: 0; padding: 1em 0 1em 3em; }
+ </style>
+ <script type="text/javascript">
+ $(function() {
+ $("#catalog").accordion();
+ $("#catalog li").draggable({
+ appendTo: "body",
+ helper: "clone"
+ });
+ $("#cart ol").droppable({
+ activeClass: "ui-state-default",
+ hoverClass: "ui-state-hover",
+ accept: ":not(.ui-sortable-helper)",
+ drop: function(event, ui) {
+ $(this).find(".placeholder").remove();
+ $("<li></li>").text(ui.draggable.text()).appendTo(this);
+ }
+ }).sortable({
+ items: "li:not(.placeholder)",
+ sort: function() {
+ // gets added unintentionally by droppable interacting with sortable
+ // using connectWithSortable fixes this, but doesn't allow you to customize active/hoverClass options
+ $(this).removeClass("ui-state-default");
+ }
+ });
+
+ });
+ </script>
+</head>
+<body>
+<div class="demo">
+
+<div id="products">
+ <h1 class="ui-widget-header">Products</h1>
+ <div id="catalog">
+ <h3><a href="#">T-Shirts</a></h3>
+ <div>
+ <ul>
+ <li>Lolcat Shirt</li>
+ <li>Cheezeburger Shirt</li>
+ <li>Buckit Shirt</li>
+ </ul>
+ </div>
+ <h3><a href="#">Bags</a></h3>
+ <div>
+ <ul>
+ <li>Zebra Striped</li>
+ <li>Black Leather</li>
+ <li>Alligator Leather</li>
+ </ul>
+ </div>
+ <h3><a href="#">Gadgets</a></h3>
+ <div>
+ <ul>
+ <li>iPhone</li>
+ <li>iPod</li>
+ <li>iPad</li>
+ </ul>
+ </div>
+ </div>
+</div>
+
+<div id="cart">
+ <h1 class="ui-widget-header">Shopping Cart</h1>
+ <div class="ui-widget-content">
+ <ol>
+ <li class="placeholder">Add your items here</li>
+ </ol>
+ </div>
+</div>
+
+</div><!-- End demo -->
+
+<div class="demo-description">
+
+<p>Demonstrate how to use an accordion to structure products into a catalog and make use drag and drop for adding
+them to a shopping cart, where they are sortable.</p>
+
+</div><!-- End demo-description -->
+</body>
+</html>
diff --git a/demos/effect/index.html b/demos/effect/index.html
index b914c96c5..cecceb6cd 100644
--- a/demos/effect/index.html
+++ b/demos/effect/index.html
@@ -11,7 +11,7 @@
<h4>Examples</h4>
<ul>
<li class="demo-config-on"><a href="default.html">Effect showcase</a></li>
- <li class="demo-config-on"><a href="easing.html">Easing showcase</a></li>
+ <li><a href="easing.html">Easing showcase</a></li>
<!-- WIP
<li class="demo-config-on"><a href="scale.html">Scale effect</a></li>
<li class="demo-config-on"><a href="size.html">Size effect</a></li>
diff --git a/demos/tabs/cookie.html b/demos/tabs/cookie.html
new file mode 100644
index 000000000..638ee37f2
--- /dev/null
+++ b/demos/tabs/cookie.html
@@ -0,0 +1,57 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8" />
+ <title>jQuery UI Tabs - Default functionality</title>
+ <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" />
+ <script type="text/javascript" src="../../jquery-1.4.2.js"></script>
+ <script type="text/javascript" src="../../external/jquery.cookie.js"></script>
+ <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script>
+ <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script>
+ <script type="text/javascript" src="../../ui/jquery.ui.tabs.js"></script>
+ <link type="text/css" href="../demos.css" rel="stylesheet" />
+ <script type="text/javascript">
+ $(function() {
+ $("#tabs").tabs({
+ cookie: {
+ // store cookie for a day, without, it would be a session cookie
+ expires: 1
+ }
+ });
+ });
+ </script>
+</head>
+<body>
+
+<div class="demo">
+
+<div id="tabs">
+ <ul>
+ <li><a href="#tabs-1">Nunc tincidunt</a></li>
+ <li><a href="#tabs-2">Proin dolor</a></li>
+ <li><a href="#tabs-3">Aenean lacinia</a></li>
+ </ul>
+ <div id="tabs-1">
+ <p>Proin elit arcu, rutrum commodo, vehicula tempus, commodo a, risus. Curabitur nec arcu. Donec sollicitudin mi sit amet mauris. Nam elementum quam ullamcorper ante. Etiam aliquet massa et lorem. Mauris dapibus lacus auctor risus. Aenean tempor ullamcorper leo. Vivamus sed magna quis ligula eleifend adipiscing. Duis orci. Aliquam sodales tortor vitae ipsum. Aliquam nulla. Duis aliquam molestie erat. Ut et mauris vel pede varius sollicitudin. Sed ut dolor nec orci tincidunt interdum. Phasellus ipsum. Nunc tristique tempus lectus.</p>
+ </div>
+ <div id="tabs-2">
+ <p>Morbi tincidunt, dui sit amet facilisis feugiat, odio metus gravida ante, ut pharetra massa metus id nunc. Duis scelerisque molestie turpis. Sed fringilla, massa eget luctus malesuada, metus eros molestie lectus, ut tempus eros massa ut dolor. Aenean aliquet fringilla sem. Suspendisse sed ligula in ligula suscipit aliquam. Praesent in eros vestibulum mi adipiscing adipiscing. Morbi facilisis. Curabitur ornare consequat nunc. Aenean vel metus. Ut posuere viverra nulla. Aliquam erat volutpat. Pellentesque convallis. Maecenas feugiat, tellus pellentesque pretium posuere, felis lorem euismod felis, eu ornare leo nisi vel felis. Mauris consectetur tortor et purus.</p>
+ </div>
+ <div id="tabs-3">
+ <p>Mauris eleifend est et turpis. Duis id erat. Suspendisse potenti. Aliquam vulputate, pede vel vehicula accumsan, mi neque rutrum erat, eu congue orci lorem eget lorem. Vestibulum non ante. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Fusce sodales. Quisque eu urna vel enim commodo pellentesque. Praesent eu risus hendrerit ligula tempus pretium. Curabitur lorem enim, pretium nec, feugiat nec, luctus a, lacus.</p>
+ <p>Duis cursus. Maecenas ligula eros, blandit nec, pharetra at, semper at, magna. Nullam ac lacus. Nulla facilisi. Praesent viverra justo vitae neque. Praesent blandit adipiscing velit. Suspendisse potenti. Donec mattis, pede vel pharetra blandit, magna ligula faucibus eros, id euismod lacus dolor eget odio. Nam scelerisque. Donec non libero sed nulla mattis commodo. Ut sagittis. Donec nisi lectus, feugiat porttitor, tempor ac, tempor vitae, pede. Aenean vehicula velit eu tellus interdum rutrum. Maecenas commodo. Pellentesque nec elit. Fusce in lacus. Vivamus a libero vitae lectus hendrerit hendrerit.</p>
+ </div>
+</div>
+
+</div><!-- End demo -->
+
+<div class="demo-description">
+
+<p>Looks the same as the default demo, but uses cookie to store the selected tab, and restore it when the page (re)loads.
+
+The cookie is stored for a day, so tabs will be restored even after closing the browser. Use cookie: {} for using cookies with default options.</p>
+
+</div><!-- End demo-description -->
+
+</body>
+</html>
diff --git a/demos/tabs/index.html b/demos/tabs/index.html
index 48b3636c3..8fc417a4f 100644
--- a/demos/tabs/index.html
+++ b/demos/tabs/index.html
@@ -17,6 +17,7 @@
<li><a href="sortable.html">Sortable</a></li>
<li><a href="manipulation.html">Simple manipulation</a></li>
<li><a href="bottom.html">Tabs below content</a></li>
+ <li><a href="cookie.html">Cookie persistence</a></li>
</ul>
</div>
diff --git a/external/qunit.js b/external/qunit.js
index f2704148e..9ef5f8d6f 100644
--- a/external/qunit.js
+++ b/external/qunit.js
@@ -18,6 +18,7 @@ var QUnit = {
stats: { all: 0, bad: 0 },
moduleStats: { all: 0, bad: 0 },
started: +new Date,
+ updateRate: 1000,
blocking: false,
autorun: false,
assertions: [],
@@ -578,7 +579,7 @@ function validTest( name ) {
function push(result, actual, expected, message) {
message = message || (result ? "okay" : "failed");
- QUnit.ok( result, result ? message + ": " + expected : message + ", expected: " + QUnit.jsDump.parse(expected) + " result: " + QUnit.jsDump.parse(actual) );
+ QUnit.ok( result, result ? message + ": " + QUnit.jsDump.parse(expected) : message + ", expected: " + QUnit.jsDump.parse(expected) + " result: " + QUnit.jsDump.parse(actual) );
}
function synchronize( callback ) {
@@ -590,8 +591,16 @@ function synchronize( callback ) {
}
function process() {
+ var start = (new Date()).getTime();
+
while ( config.queue.length && !config.blocking ) {
- config.queue.shift()();
+ if ( config.updateRate <= 0 || (((new Date()).getTime() - start) < config.updateRate) ) {
+ config.queue.shift()();
+
+ } else {
+ setTimeout( process, 13 );
+ break;
+ }
}
}
@@ -679,6 +688,7 @@ QUnit.equiv = function () {
var innerEquiv; // the real equiv function
var callers = []; // stack to decide between skip/abort functions
+ var parents = []; // stack to avoiding loops from circular referencing
// Determine what is o.
@@ -788,28 +798,39 @@ QUnit.equiv = function () {
},
"array": function (b, a) {
- var i;
+ var i, j, loop;
var len;
// b could be an object literal here
if ( ! (hoozit(b) === "array")) {
return false;
- }
-
+ }
+
len = a.length;
if (len !== b.length) { // safe and faster
return false;
}
+
+ //track reference to avoid circular references
+ parents.push(a);
for (i = 0; i < len; i++) {
- if ( ! innerEquiv(a[i], b[i])) {
+ loop = false;
+ for(j=0;j<parents.length;j++){
+ if(parents[j] === a[i]){
+ loop = true;//dont rewalk array
+ }
+ }
+ if (!loop && ! innerEquiv(a[i], b[i])) {
+ parents.pop();
return false;
}
}
+ parents.pop();
return true;
},
"object": function (b, a) {
- var i;
+ var i, j, loop;
var eq = true; // unless we can proove it
var aProperties = [], bProperties = []; // collection of strings
@@ -820,18 +841,25 @@ QUnit.equiv = function () {
// stack constructor before traversing properties
callers.push(a.constructor);
-
+ //track reference to avoid circular references
+ parents.push(a);
+
for (i in a) { // be strict: don't ensures hasOwnProperty and go deep
-
+ loop = false;
+ for(j=0;j<parents.length;j++){
+ if(parents[j] === a[i])
+ loop = true; //don't go down the same path twice
+ }
aProperties.push(i); // collect a's properties
- if ( ! innerEquiv(a[i], b[i])) {
+ if (!loop && ! innerEquiv(a[i], b[i])) {
eq = false;
break;
}
}
callers.pop(); // unstack, we are done
+ parents.pop();
for (i in b) {
bProperties.push(i); // collect b's properties
@@ -925,16 +953,14 @@ QUnit.jsDump = (function() {
type = "date";
} else if (QUnit.is("Function", obj)) {
type = "function";
- } else if (QUnit.is("Array", obj)) {
- type = "array";
- } else if (QUnit.is("Window", obj) || QUnit.is("global", obj)) {
+ } else if (obj.setInterval && obj.document && !obj.nodeType) {
type = "window";
- } else if (QUnit.is("HTMLDocument", obj)) {
+ } else if (obj.nodeType === 9) {
type = "document";
- } else if (QUnit.is("HTMLCollection", obj) || QUnit.is("NodeList", obj)) {
- type = "nodelist";
- } else if (/^\[object HTML/.test(Object.prototype.toString.call( obj ))) {
+ } else if (obj.nodeType) {
type = "node";
+ } else if (typeof obj === "object" && typeof obj.length === "number" && obj.length >= 0) {
+ type = "array";
} else {
type = typeof obj;
}
@@ -1032,9 +1058,9 @@ QUnit.jsDump = (function() {
name:'name',
'class':'className'
},
- HTML:true,//if true, entities are escaped ( <, >, \t, space and \n )
+ HTML:false,//if true, entities are escaped ( <, >, \t, space and \n )
indentChar:' ',//indentation unit
- multiline:true //if true, items in a collection, are separated by a \n, else just a space.
+ multiline:false //if true, items in a collection, are separated by a \n, else just a space.
};
return jsDump;
diff --git a/tests/unit/accordion/accordion.html b/tests/unit/accordion/accordion.html
index a7142250e..c53db8c75 100644
--- a/tests/unit/accordion/accordion.html
+++ b/tests/unit/accordion/accordion.html
@@ -16,6 +16,29 @@
<script type="text/javascript" src="../../jquery.simulate.js"></script>
<script type="text/javascript" src="../testsuite.js"></script>
+ <script type="text/javascript">
+ $.ui.accordion.prototype.options.animated = false;
+
+ function state(accordion) {
+ var args = $.makeArray(arguments).slice(1);
+ var result = [];
+ $.each(args, function(i, n) {
+ result.push( accordion.find(".ui-accordion-content").eq(i).filter(function() {
+ return $(this).css("display") != "none"
+ }).length ? 1 : 0 );
+ });
+ same(args, result)
+ }
+ function equalHeights(accordion, min, max) {
+ var sizes = [];
+ accordion.find(".ui-accordion-content").each(function() {
+ sizes.push($(this).outerHeight());
+ });
+ ok( sizes[0] >= min && sizes[0] <= max, "must be within " + min + " and " + max + ", was " + sizes[0] );
+ same(sizes[0], sizes[1]);
+ same(sizes[0], sizes[2]);
+ }
+ </script>
<script type="text/javascript" src="accordion_core.js"></script>
<script type="text/javascript" src="accordion_defaults.js"></script>
<script type="text/javascript" src="accordion_events.js"></script>
@@ -25,8 +48,7 @@
<style>
#main { font-size: 10pt; font-family: 'trebuchet ms', verdana, arial; }
- #main h2 { margin: 0; }
- #main ul, #main li { padding: 0; }
+ #list, #list1 *, #navigation, #navigation * { margin: 0; padding: 0; font-size: 12px; }
</style>
</head>
<body>
@@ -39,37 +61,39 @@
<div id="main" style="position: absolute; top: -10000px; left: -10000px;">
- <div id="list1">
- <a>There is one obvious advantage:</a>
- <div>
- <p>
- You've seen it coming!
- <br/>
- Buy now and get nothing for free!
- <br/>
- Well, at least no free beer. Perhaps a bear, if you can afford it.
- </p>
- </div>
- <a>Now that you've got...</a>
- <div>
- <p>
- your bear, you have to admit it!
- <br/>
- No, we aren't selling bears.
- </p>
- <p>
- We could talk about renting one.
- </p>
- </div>
- <a>Rent one bear, ...</a>
- <div>
- <p>
- get two for three beer.
- </p>
- <p>
- And now, for something completely different.
- </p>
- </div>
+ <div>
+ <div id="list1" class="foo">
+ <a class="bar">There is one obvious advantage:</a>
+ <div class="foo">
+ <p>
+ You've seen it coming!
+ <br/>
+ Buy now and get nothing for free!
+ <br/>
+ Well, at least no free beer. Perhaps a bear, if you can afford it.
+ </p>
+ </div>
+ <a class="bar">Now that you've got...</a>
+ <div class="foo">
+ <p>
+ your bear, you have to admit it!
+ <br/>
+ No, we aren't selling bears.
+ </p>
+ <p>
+ We could talk about renting one.
+ </p>
+ </div>
+ <a class="bar">Rent one bear, ...</a>
+ <div class="foo">
+ <p>
+ get two for three beer.
+ </p>
+ <p>
+ And now, for something completely different.
+ </p>
+ </div>
+ </div>
</div>
<div id="navigationWrapper">
diff --git a/tests/unit/accordion/accordion_core.js b/tests/unit/accordion/accordion_core.js
index 47d2509e6..2bef43149 100644
--- a/tests/unit/accordion/accordion_core.js
+++ b/tests/unit/accordion/accordion_core.js
@@ -5,17 +5,6 @@
(function($) {
-$.ui.accordion.prototype.options.animated = false;
-
-function state(accordion) {
- var args = $.makeArray(arguments).slice(1);
- var result = [];
- $.each(args, function(i, n) {
- result.push( accordion.find(".ui-accordion-content").eq(i).is(":visible") ? 1 : 0 );
- });
- same(args, result)
-}
-
module("accordion: core");
test("handle click on header-descendant", function() {
diff --git a/tests/unit/accordion/accordion_methods.js b/tests/unit/accordion/accordion_methods.js
index 6761d24a6..73faff27c 100644
--- a/tests/unit/accordion/accordion_methods.js
+++ b/tests/unit/accordion/accordion_methods.js
@@ -3,15 +3,6 @@
*/
(function($) {
-function state(accordion) {
- var expected = $.makeArray(arguments).slice(1);
- var actual = [];
- $.each(expected, function(i, n) {
- actual.push( accordion.find(".ui-accordion-content").eq(i).is(":visible") ? 1 : 0 );
- });
- same(actual, expected)
-}
-
module("accordion: methods");
test("init", function() {
@@ -40,21 +31,13 @@ test("init", function() {
});
test("destroy", function() {
- $("<div></div>").appendTo('body').accordion().accordion("destroy").remove();
- ok(true, '.accordion("destroy") called on element');
-
- $([]).accordion().accordion("destroy").remove();
- ok(true, '.accordion("destroy") called on empty collection');
-
- $('<div></div>').accordion().accordion("destroy").remove();
- ok(true, '.accordion("destroy") called on disconnected DOMElement');
-
- $('<div></div>').accordion().accordion("destroy").accordion("foo").remove();
- ok(true, 'arbitrary method called after destroy');
-
- var expected = $('<div></div>').accordion(),
- actual = expected.accordion('destroy');
- equals(actual, expected, 'destroy is chainable');
+ var beforeHtml = $("#list1").find("div").css("font-style", "normal").end().parent().html();
+ var afterHtml = $("#list1").accordion().accordion("destroy").parent().html();
+ // Opera 9 outputs role="" instead of removing the attribute like everyone else
+ if ($.browser.opera) {
+ afterHtml = afterHtml.replace(/ role=""/g, "");
+ }
+ equal( afterHtml, beforeHtml );
});
test("enable", function() {
@@ -124,8 +107,7 @@ test("activate, string expression", function() {
ac.accordion("activate", ":last");
state(ac, 0, 0, 1);
});
-//[ 0, 1, 1 ] result: [ 0, 0, 1 ]
-//[ 0, 1, 1] result: [ 0, 0, 1]
+
test("activate, jQuery or DOM element", function() {
var ac = $('#list1').accordion({ active: $("#list1 a:last") });
state(ac, 0, 0, 1);
@@ -136,24 +118,14 @@ test("activate, jQuery or DOM element", function() {
});
test("resize", function() {
- var expected = $('#list1').accordion();
-
- var sizes = [];
- expected.find(".ui-accordion-content").each(function() {
- sizes.push($(this).outerHeight());
- });
-
- var actual = expected.accordion('resize');
- equals(actual, expected, 'resize is chainable');
-
- var sizes2 = [];
- expected.find(".ui-accordion-content").each(function() {
- sizes2.push($(this).outerHeight());
+ var expected = $('#navigation').parent().height(300).end().accordion({
+ fillSpace: true
});
- same(sizes, sizes2);
+ equalHeights(expected, 246, 258);
- expected.find(".ui-accordion-content:first").height(500)
- var sizes3 = [];
+ expected.parent().height(500);
+ expected.accordion("resize");
+ equalHeights(expected, 446, 458);
});
})(jQuery);
diff --git a/tests/unit/accordion/accordion_options.js b/tests/unit/accordion/accordion_options.js
index 0782b4bb7..499fec383 100644
--- a/tests/unit/accordion/accordion_options.js
+++ b/tests/unit/accordion/accordion_options.js
@@ -3,16 +3,6 @@
*/
(function($) {
-function state(accordion) {
- var expected = $.makeArray(arguments).slice(1);
- var actual = [];
- $.each(expected, function(i, n) {
- actual.push( accordion.find(".ui-accordion-content").eq(i).is(":visible") ? 1 : 0 );
- });
- same(actual, expected)
-}
-
-
module("accordion: options");
test("{ active: first child }, default", function() {
@@ -76,17 +66,18 @@ test("{ active: Number }", function() {
});
test("{ autoHeight: true }, default", function() {
- $('#navigation').accordion({ autoHeight: true });
- equals( $('#navigation > li:eq(0) > ul').height(), 126 );
- equals( $('#navigation > li:eq(1) > ul').height(), 126 );
- equals( $('#navigation > li:eq(2) > ul').height(), 126 );
+ equalHeights($('#navigation').accordion({ autoHeight: true }), 95, 130);
});
test("{ autoHeight: false }", function() {
- $('#navigation').accordion({ autoHeight: false });
- equals( $('#navigation > li:eq(0) > ul').height(), 90 );
- equals( $('#navigation > li:eq(1) > ul').height(), 126 );
- equals( $('#navigation > li:eq(2) > ul').height(), 54 );
+ var accordion = $('#navigation').accordion({ autoHeight: false });
+ var sizes = [];
+ accordion.find(".ui-accordion-content").each(function() {
+ sizes.push($(this).height());
+ });
+ ok( sizes[0] >= 70 && sizes[0] <= 90, "was " + sizes[0] );
+ ok( sizes[1] >= 98 && sizes[1] <= 126, "was " + sizes[1] );
+ ok( sizes[2] >= 42 && sizes[2] <= 54, "was " + sizes[2] );
});
test("{ collapsible: false }, default", function() {
@@ -105,20 +96,10 @@ test("{ collapsible: true }", function() {
state(ac, 0, 0, 0);
});
-test("{ fillSpace: false }, default", function() {
- $("#navigationWrapper").height(500);
- $('#navigation').accordion({ fillSpace: false });
- equals( $('#navigation > li:eq(0) > ul').height(), 126 );
- equals( $('#navigation > li:eq(1) > ul').height(), 126 );
- equals( $('#navigation > li:eq(2) > ul').height(), 126 );
-});
-
+// fillSpace: false == autoHeight: true, covered above
test("{ fillSpace: true }", function() {
$("#navigationWrapper").height(500);
- $('#navigation').accordion({ fillSpace: true });
- equals( $('#navigation > li:eq(0) > ul').height(), 362 );
- equals( $('#navigation > li:eq(1) > ul').height(), 362 );
- equals( $('#navigation > li:eq(2) > ul').height(), 362 );
+ equalHeights($('#navigation').accordion({ fillSpace: true }), 446, 458);
});
test("{ header: '> li > :first-child,> :not(li):even' }, default", function() {
diff --git a/tests/unit/autocomplete/autocomplete_events.js b/tests/unit/autocomplete/autocomplete_events.js
index ccbe66c1b..a8924e192 100644
--- a/tests/unit/autocomplete/autocomplete_events.js
+++ b/tests/unit/autocomplete/autocomplete_events.js
@@ -12,7 +12,7 @@ module("autocomplete: events", {
var data = ["c++", "java", "php", "coldfusion", "javascript", "asp", "ruby", "python", "c", "scala", "groovy", "haskell", "perl"];
test("all events", function() {
- expect(11);
+ expect(12);
var ac = $("#autocomplete").autocomplete({
delay: 0,
source: data,
@@ -34,21 +34,39 @@ test("all events", function() {
same(event.type, "autocompleteselect");
same(ui.item, {label:"java", value:"java"});
},
- change: function(event) {
+ change: function(event, ui) {
same(event.type, "autocompletechange");
+ same(ui.item, {label:"java", value:"java"});
same( $(".ui-menu:visible").length, 0 );
+ start();
}
});
stop();
- ac.val("ja").keydown();
+ ac.focus().val("ja").keydown();
setTimeout(function() {
same( $(".ui-menu:visible").length, 1 );
ac.simulate("keydown", { keyCode: $.ui.keyCode.DOWN });
ac.simulate("keydown", { keyCode: $.ui.keyCode.ENTER });
- start();
+ $.browser.msie ? ac.simulate("blur") : ac.blur();
}, 50);
});
+test("change without selection", function() {
+ expect(2);
+ stop();
+ var ac = $("#autocomplete").autocomplete({
+ delay: 0,
+ source: data,
+ change: function(event, ui) {
+ same(event.type, "autocompletechange");
+ same(ui.item, null);
+ start();
+ }
+ });
+ ac.triggerHandler("focus");
+ ac.val("ja").triggerHandler("blur");
+});
+
test("cancel search", function() {
expect(6);
var first = true;
diff --git a/tests/unit/autocomplete/autocomplete_methods.js b/tests/unit/autocomplete/autocomplete_methods.js
index 5c20a6c95..05a7d6e14 100644
--- a/tests/unit/autocomplete/autocomplete_methods.js
+++ b/tests/unit/autocomplete/autocomplete_methods.js
@@ -13,8 +13,11 @@ module("autocomplete: methods", {
test("destroy", function() {
var beforeHtml = $("#autocomplete").parent().html();
var afterHtml = $("#autocomplete").autocomplete().autocomplete("destroy").parent().html();
- // TODO can't use same, as that would insert the markup unescaped into the test results, screwing up other tests
- ok( beforeHtml == afterHtml );
+ // Opera 9 outputs role="" instead of removing the attribute like everyone else
+ if ($.browser.opera) {
+ afterHtml = afterHtml.replace(/ role=""/g, "");
+ }
+ equal( afterHtml, beforeHtml, "before/after html should be the same" );
})
var data = ["c++", "java", "php", "coldfusion", "javascript", "asp", "ruby", "python", "c", "scala", "groovy", "haskell", "perl"];
diff --git a/tests/unit/autocomplete/autocomplete_options.js b/tests/unit/autocomplete/autocomplete_options.js
index 6639e9014..c5aa7c961 100644
--- a/tests/unit/autocomplete/autocomplete_options.js
+++ b/tests/unit/autocomplete/autocomplete_options.js
@@ -120,7 +120,7 @@ function source_test(source, async) {
}
if (async) {
stop();
- setTimeout(result, 100);
+ $(document).one("ajaxStop", result);
} else {
result();
}
diff --git a/tests/unit/button/button_methods.js b/tests/unit/button/button_methods.js
index 1fcd836b8..a83a73ba4 100644
--- a/tests/unit/button/button_methods.js
+++ b/tests/unit/button/button_methods.js
@@ -9,7 +9,11 @@ module("button: methods");
test("destroy", function() {
var beforeHtml = $("#button").parent().html();
var afterHtml = $("#button").button().button("destroy").parent().html();
- same( beforeHtml, afterHtml );
+ // Opera 9 outputs role="" instead of removing the attribute like everyone else
+ if ($.browser.opera) {
+ afterHtml = afterHtml.replace(/ role=""/g, "");
+ }
+ equal( afterHtml, beforeHtml );
});
})(jQuery);
diff --git a/tests/unit/core/core.html b/tests/unit/core/core.html
index eb0d2f930..468c962e5 100644
--- a/tests/unit/core/core.html
+++ b/tests/unit/core/core.html
@@ -15,6 +15,18 @@
<script type="text/javascript" src="core.js"></script>
<script type="text/javascript" src="selector.js"></script>
+ <script type="text/javascript">
+ // disable this stale testsuite for testswarm only
+ var url = window.location.search;
+ url = decodeURIComponent( url.slice( url.indexOf("swarmURL=") + 9 ) );
+ if ( url && url.indexOf("http") == 0 ) {
+ // reset config to kill previous tests; make sure testsuite.js is loaded afterwards to init the testswarm script
+ QUnit.init();
+ test("core", function() { ok(true, "disabled core testsuite"); });
+ }
+ </script>
+ <script type="text/javascript" src="../testsuite.js"></script>
+
<style type="text/css">
.zindex {z-index: 100}
.absolute {position: absolute}
diff --git a/tests/unit/datepicker/datepicker.html b/tests/unit/datepicker/datepicker.html
index e64bc74c0..9354e7b99 100644
--- a/tests/unit/datepicker/datepicker.html
+++ b/tests/unit/datepicker/datepicker.html
@@ -16,7 +16,6 @@
<link rel="stylesheet" href="../../../external/qunit.css" type="text/css"/>
<script type="text/javascript" src="../../../external/qunit.js"></script>
<script type="text/javascript" src="../../jquery.simulate.js"></script>
- <script type="text/javascript" src="../testsuite.js"></script>
<script type="text/javascript" src="datepicker_core.js"></script>
<script type="text/javascript" src="datepicker_defaults.js"></script>
@@ -24,6 +23,18 @@
<script type="text/javascript" src="datepicker_methods.js"></script>
<script type="text/javascript" src="datepicker_options.js"></script>
<script type="text/javascript" src="datepicker_tickets.js"></script>
+
+ <script type="text/javascript">
+ // disable this stale testsuite for testswarm only
+ var url = window.location.search;
+ url = decodeURIComponent( url.slice( url.indexOf("swarmURL=") + 9 ) );
+ if ( url && url.indexOf("http") == 0 ) {
+ // reset config to kill previous tests; make sure testsuite.js is loaded afterwards to init the testswarm script
+ QUnit.init();
+ test("datepicker", function() { ok(true, "disabled datepicker testsuite"); });
+ }
+ </script>
+ <script type="text/javascript" src="../testsuite.js"></script>
</head>
<body>
diff --git a/tests/unit/dialog/dialog.html b/tests/unit/dialog/dialog.html
index 03ce280e3..97a5d44cd 100644
--- a/tests/unit/dialog/dialog.html
+++ b/tests/unit/dialog/dialog.html
@@ -19,7 +19,6 @@
<link rel="stylesheet" href="../../../external/qunit.css" type="text/css"/>
<script type="text/javascript" src="../../../external/qunit.js"></script>
<script type="text/javascript" src="../../jquery.simulate.js"></script>
- <script type="text/javascript" src="../testsuite.js"></script>
<script type="text/javascript" src="dialog_core.js"></script>
<script type="text/javascript" src="dialog_defaults.js"></script>
@@ -27,6 +26,18 @@
<script type="text/javascript" src="dialog_methods.js"></script>
<script type="text/javascript" src="dialog_options.js"></script>
<script type="text/javascript" src="dialog_tickets.js"></script>
+
+ <script type="text/javascript">
+ // disable this stale testsuite for testswarm only
+ var url = window.location.search;
+ url = decodeURIComponent( url.slice( url.indexOf("swarmURL=") + 9 ) );
+ if ( url && url.indexOf("http") == 0 ) {
+ // reset config to kill previous tests; make sure testsuite.js is loaded afterwards to init the testswarm script
+ QUnit.init();
+ test("dialog", function() { ok(true, "disabled dialog testsuite"); });
+ }
+ </script>
+ <script type="text/javascript" src="../testsuite.js"></script>
</head>
<body>
diff --git a/tests/unit/draggable/draggable.html b/tests/unit/draggable/draggable.html
index a48f3c092..2be472a50 100644
--- a/tests/unit/draggable/draggable.html
+++ b/tests/unit/draggable/draggable.html
@@ -13,7 +13,6 @@
<link rel="stylesheet" href="../../../external/qunit.css" type="text/css"/>
<script type="text/javascript" src="../../../external/qunit.js"></script>
<script type="text/javascript" src="../../jquery.simulate.js"></script>
- <script type="text/javascript" src="../testsuite.js"></script>
<script type="text/javascript" src="draggable_core.js"></script>
<script type="text/javascript" src="draggable_defaults.js"></script>
@@ -21,6 +20,18 @@
<script type="text/javascript" src="draggable_methods.js"></script>
<script type="text/javascript" src="draggable_options.js"></script>
<script type="text/javascript" src="draggable_tickets.js"></script>
+
+ <script type="text/javascript">
+ // disable this stale testsuite for testswarm only
+ var url = window.location.search;
+ url = decodeURIComponent( url.slice( url.indexOf("swarmURL=") + 9 ) );
+ if ( url && url.indexOf("http") == 0 ) {
+ // reset config to kill previous tests; make sure testsuite.js is loaded afterwards to init the testswarm script
+ QUnit.init();
+ test("draggable", function() { ok(true, "disabled draggable testsuite"); });
+ }
+ </script>
+ <script type="text/javascript" src="../testsuite.js"></script>
</head>
<body>
diff --git a/tests/unit/droppable/droppable.html b/tests/unit/droppable/droppable.html
index 9f2c14a1d..c15992bcd 100644
--- a/tests/unit/droppable/droppable.html
+++ b/tests/unit/droppable/droppable.html
@@ -14,7 +14,6 @@
<link rel="stylesheet" href="../../../external/qunit.css" type="text/css"/>
<script type="text/javascript" src="../../../external/qunit.js"></script>
<script type="text/javascript" src="../../jquery.simulate.js"></script>
- <script type="text/javascript" src="../testsuite.js"></script>
<script type="text/javascript" src="droppable_core.js"></script>
<script type="text/javascript" src="droppable_defaults.js"></script>
@@ -22,6 +21,18 @@
<script type="text/javascript" src="droppable_methods.js"></script>
<script type="text/javascript" src="droppable_options.js"></script>
<script type="text/javascript" src="droppable_tickets.js"></script>
+
+ <script type="text/javascript">
+ // disable this stale testsuite for testswarm only
+ var url = window.location.search;
+ url = decodeURIComponent( url.slice( url.indexOf("swarmURL=") + 9 ) );
+ if ( url && url.indexOf("http") == 0 ) {
+ // reset config to kill previous tests; make sure testsuite.js is loaded afterwards to init the testswarm script
+ QUnit.init();
+ test("droppable", function() { ok(true, "disabled droppable testsuite"); });
+ }
+ </script>
+ <script type="text/javascript" src="../testsuite.js"></script>
</head>
<body>
diff --git a/tests/unit/position/position.html b/tests/unit/position/position.html
index 5a54e44c9..ca5f2585d 100644
--- a/tests/unit/position/position.html
+++ b/tests/unit/position/position.html
@@ -43,5 +43,9 @@
<div style="position: absolute; height: 5000px; width: 5000px;"></div>
+<div id="bug-5280" style="height: 30px; width: 201px;">
+ <div style="width: 50px; height: 10px;"></div>
+</div>
+
</body>
</html>
diff --git a/tests/unit/position/position_core.js b/tests/unit/position/position_core.js
index 4d2716ced..3976e43ab 100644
--- a/tests/unit/position/position_core.js
+++ b/tests/unit/position/position_core.js
@@ -2,6 +2,8 @@
* position_core.js
*/
(function($) {
+
+module("position");
test('my, at, of', function() {
$('#elx').position({
@@ -330,4 +332,22 @@ test("collision: none, with offset", function() {
}, { top: -13, left: -12 }, "left top, negative offset");
});
+//test('bug #5280: consistent results (avoid fractional values)', function() {
+// var wrapper = $('#bug-5280'),
+// elem = wrapper.children(),
+// offset1 = elem.position({
+// my: 'center',
+// at: 'center',
+// of: wrapper,
+// collision: 'none'
+// }).offset(),
+// offset2 = elem.position({
+// my: 'center',
+// at: 'center',
+// of: wrapper,
+// collision: 'none'
+// }).offset();
+// same(offset1, offset2);
+//});
+
})(jQuery);
diff --git a/tests/unit/progressbar/progressbar_core.js b/tests/unit/progressbar/progressbar_core.js
index 2d95ae2f6..e59579634 100644
--- a/tests/unit/progressbar/progressbar_core.js
+++ b/tests/unit/progressbar/progressbar_core.js
@@ -21,8 +21,8 @@ test("accessibility", function() {
el.progressbar("disable");
equals(el.attr("aria-disabled"), "true", "aria-disabled on");
el.progressbar("enable");
- // FAIL: for some reason IE6 returns a boolean false instead of the string
- equals(el.attr("aria-disabled"), "false", "aria-disabled off");
+ // FAIL: for some reason IE6 and 7 return a boolean false instead of the string
+ equals(el.attr("aria-disabled"), $.browser.msie && $.browser.version == 6 || $.browser.version == 7 ? false : "false", "aria-disabled off");
});
})(jQuery);
diff --git a/tests/unit/resizable/resizable.html b/tests/unit/resizable/resizable.html
index fe100d2aa..0f4f91aae 100644
--- a/tests/unit/resizable/resizable.html
+++ b/tests/unit/resizable/resizable.html
@@ -15,7 +15,6 @@
<link rel="stylesheet" href="../../../external/qunit.css" type="text/css"/>
<script type="text/javascript" src="../../../external/qunit.js"></script>
<script type="text/javascript" src="../../jquery.simulate.js"></script>
- <script type="text/javascript" src="../testsuite.js"></script>
<script type="text/javascript" src="resizable_core.js"></script>
<script type="text/javascript" src="resizable_defaults.js"></script>
@@ -23,6 +22,18 @@
<script type="text/javascript" src="resizable_methods.js"></script>
<script type="text/javascript" src="resizable_options.js"></script>
<script type="text/javascript" src="resizable_tickets.js"></script>
+
+ <script type="text/javascript">
+ // disable this stale testsuite for testswarm only
+ var url = window.location.search;
+ url = decodeURIComponent( url.slice( url.indexOf("swarmURL=") + 9 ) );
+ if ( url && url.indexOf("http") == 0 ) {
+ // reset config to kill previous tests; make sure testsuite.js is loaded afterwards to init the testswarm script
+ QUnit.init();
+ test("resizable", function() { ok(true, "disabled resizable testsuite"); });
+ }
+ </script>
+ <script type="text/javascript" src="../testsuite.js"></script>
</head>
<body>
diff --git a/tests/unit/selectable/selectable.html b/tests/unit/selectable/selectable.html
index 74a10584a..278d4dde3 100644
--- a/tests/unit/selectable/selectable.html
+++ b/tests/unit/selectable/selectable.html
@@ -13,7 +13,6 @@
<link rel="stylesheet" href="../../../external/qunit.css" type="text/css"/>
<script type="text/javascript" src="../../../external/qunit.js"></script>
<script type="text/javascript" src="../../jquery.simulate.js"></script>
- <script type="text/javascript" src="../testsuite.js"></script>
<script type="text/javascript" src="selectable_core.js"></script>
<script type="text/javascript" src="selectable_defaults.js"></script>
@@ -21,6 +20,18 @@
<script type="text/javascript" src="selectable_methods.js"></script>
<script type="text/javascript" src="selectable_options.js"></script>
<script type="text/javascript" src="selectable_tickets.js"></script>
+
+ <script type="text/javascript">
+ // disable this stale testsuite for testswarm only
+ var url = window.location.search;
+ url = decodeURIComponent( url.slice( url.indexOf("swarmURL=") + 9 ) );
+ if ( url && url.indexOf("http") == 0 ) {
+ // reset config to kill previous tests; make sure testsuite.js is loaded afterwards to init the testswarm script
+ QUnit.init();
+ test("selectable", function() { ok(true, "disabled selectable testsuite"); });
+ }
+ </script>
+ <script type="text/javascript" src="../testsuite.js"></script>
</head>
<body>
diff --git a/tests/unit/slider/slider_events.js b/tests/unit/slider/slider_events.js
index fb9af8155..d7c146d84 100644
--- a/tests/unit/slider/slider_events.js
+++ b/tests/unit/slider/slider_events.js
@@ -3,45 +3,54 @@
*/
(function($) {
-var el;
-
module( "slider: events" );
-test( "start", function() {
- ok( false, "missing test - untested code is broken code." );
-});
-
-test( "slide", function() {
- ok( false, "missing test - untested code is broken code." );
-});
-
//Specs from http://wiki.jqueryui.com/Slider#specs
//"change callback: triggers when the slider has stopped moving and has a new
// value (even if same as previous value), via mouse(mouseup) or keyboard(keyup)
// or value method/option"
-test( "change", function() {
- expect(8);
+test( "mouse based interaction", function() {
+ expect(4);
- var handle;
- // Test mouseup at end of handle slide (mouse)
- el = $( "<div></div>" )
+ var el = $( "<div></div>" )
.appendTo( "body" )
.slider({
+ start: function(event, ui) {
+ equals( event.originalEvent.type, "mousedown", "start triggered by mousedown" );
+ },
+ slide: function(event, ui) {
+ equals( event.originalEvent.type, "mousemove", "slider triggered by mousemove" );
+ },
+ stop: function(event, ui) {
+ equals( event.originalEvent.type, "mouseup", "stop triggered by mouseup" );
+ },
change: function(event, ui) {
- ok( true, "change triggered by mouseup at end of handle slide (mouse)" );
+ equals( event.originalEvent.type, "mouseup", "change triggered by mouseup" );
}
});
el.find( ".ui-slider-handle" ).eq( 0 )
.simulate( "drag", { dx: 10, dy: 10 } );
- reset();
+});
+test( "keyboard based interaction", function() {
+ expect(3);
+
// Test keyup at end of handle slide (keyboard)
- el = $( "<div></div>" )
+ var el = $( "<div></div>" )
.appendTo( "body" )
.slider({
+ start: function(event, ui) {
+ equals( event.originalEvent.type, "keydown", "start triggered by keydown" );
+ },
+ slide: function(event, ui) {
+ ok( false, "Slider never triggered by keys" );
+ },
+ stop: function(event, ui) {
+ equals( event.originalEvent.type, "keyup", "stop triggered by keyup" );
+ },
change: function(event, ui) {
- ok( true, "change triggered by keyup at end of handle slide (keyboard)" );
+ equals( event.originalEvent.type, "keyup", "change triggered by keyup" );
}
});
@@ -50,9 +59,12 @@ test( "change", function() {
.simulate( "keypress", { keyCode: $.ui.keyCode.LEFT } )
.simulate( "keyup", { keyCode: $.ui.keyCode.LEFT } );
- reset();
+});
+test( "programmatic event triggers", function() {
+ expect(6);
+
// Test value method
- el = $( "<div></div>" )
+ var el = $( "<div></div>" )
.slider({
change: function(event, ui) {
ok( true, "change triggered by value method" );
@@ -94,8 +106,4 @@ test( "change", function() {
});
-test( "stop", function() {
- ok( false, "missing test - untested code is broken code." );
-});
-
}( jQuery ) );
diff --git a/tests/unit/slider/slider_options.js b/tests/unit/slider/slider_options.js
index 88eb26a8f..b9a766539 100644
--- a/tests/unit/slider/slider_options.js
+++ b/tests/unit/slider/slider_options.js
@@ -11,10 +11,6 @@ function handle() {
module("slider: options");
-test("animate", function() {
- ok(false, "missing test - untested code is broken code.");
-});
-
test("max", function() {
el = $('<div></div>');
@@ -92,8 +88,51 @@ test("range", function() {
ok(false, "missing test - untested code is broken code.");
});
+//spec: http://wiki.jqueryui.com/Slider#specs
+// value option/method: the value option is not restricted by min/max/step.
+// What is returned by the value method is restricted by min (>=), max (<=), and step (even multiple)
test("step", function() {
- ok(false, "missing test - untested code is broken code.");
+ var el = $('<div></div>').slider({
+ min: 0,
+ value: 0,
+ step: 10,
+ max: 100,
+ });
+ equals( el.slider("value"), 0 );
+
+ el.slider("value", 1);
+ equals( el.slider("value"), 0 );
+
+ el.slider("value", 9);
+ equals( el.slider("value"), 10 );
+
+ el.slider("value", 11);
+ equals( el.slider("value"), 10 );
+
+ el.slider("value", 19);
+ equals( el.slider("value"), 20 );
+
+el = $('<div></div>').slider({
+ min: 0,
+ value: 0,
+ step: 20,
+ max: 100,
+ });
+ el.slider("value", 0);
+
+ el.slider("option", "value", 1);
+ equals( el.slider("value"), 0 );
+
+ el.slider("option", "value", 9);
+ equals( el.slider("value"), 0 );
+
+ el.slider("option", "value", 11);
+ equals( el.slider("value"), 20 );
+
+ el.slider("option", "value", 19);
+ equals( el.slider("value"), 20 );
+
+ el.slider('destroy');
});
test("value", function() {
diff --git a/tests/unit/sortable/sortable.html b/tests/unit/sortable/sortable.html
index 2a50f85a1..ad5cdca6d 100644
--- a/tests/unit/sortable/sortable.html
+++ b/tests/unit/sortable/sortable.html
@@ -13,7 +13,6 @@
<link rel="stylesheet" href="../../../external/qunit.css" type="text/css"/>
<script type="text/javascript" src="../../../external/qunit.js"></script>
<script type="text/javascript" src="../../jquery.simulate.js"></script>
- <script type="text/javascript" src="../testsuite.js"></script>
<script type="text/javascript" src="sortable_core.js"></script>
<script type="text/javascript" src="sortable_defaults.js"></script>
@@ -21,6 +20,18 @@
<script type="text/javascript" src="sortable_methods.js"></script>
<script type="text/javascript" src="sortable_options.js"></script>
<script type="text/javascript" src="sortable_tickets.js"></script>
+
+ <script type="text/javascript">
+ // disable this stale testsuite for testswarm only
+ var url = window.location.search;
+ url = decodeURIComponent( url.slice( url.indexOf("swarmURL=") + 9 ) );
+ if ( url && url.indexOf("http") == 0 ) {
+ // reset config to kill previous tests; make sure testsuite.js is loaded afterwards to init the testswarm script
+ QUnit.init();
+ test("sortable", function() { ok(true, "disabled sortable testsuite"); });
+ }
+ </script>
+ <script type="text/javascript" src="../testsuite.js"></script>
</head>
<body>
diff --git a/tests/unit/sortable/sortable_methods.js b/tests/unit/sortable/sortable_methods.js
index adccc8c87..c4b5cdc08 100644
--- a/tests/unit/sortable/sortable_methods.js
+++ b/tests/unit/sortable/sortable_methods.js
@@ -84,7 +84,7 @@ test("enable", function() {
});
test("disable", function() {
- expect(6);
+ expect(7);
el = $("#sortable").sortable({ disabled: false });
sort($("li", el)[0], 0, 40, 2, '.sortable({ disabled: false })');
@@ -97,6 +97,7 @@ test("disable", function() {
sort($("li", el)[0], 0, 40, 2, '.sortable({ disabled: false })');
el.sortable("option", "disabled", true);
equals(el.sortable("option", "disabled"), true, "disabled option setter");
+ ok(el.sortable("widget").is(":not(.ui-state-disabled)"), "sortable element does not get ui-state-disabled since it's an interaction");
sort($("li", el)[0], 0, 40, 0, '.sortable("option", "disabled", true)');
var expected = $('<div></div>').sortable(),
diff --git a/tests/unit/tabs/tabs.html b/tests/unit/tabs/tabs.html
index 1e050af97..269f47ed5 100644
--- a/tests/unit/tabs/tabs.html
+++ b/tests/unit/tabs/tabs.html
@@ -15,7 +15,6 @@
<link rel="stylesheet" href="../../../external/qunit.css" type="text/css"/>
<script type="text/javascript" src="../../../external/qunit.js"></script>
<script type="text/javascript" src="../../jquery.simulate.js"></script>
- <script type="text/javascript" src="../testsuite.js"></script>
<script type="text/javascript" src="tabs_core.js"></script>
<script type="text/javascript" src="tabs_defaults.js"></script>
@@ -23,6 +22,18 @@
<script type="text/javascript" src="tabs_methods.js"></script>
<script type="text/javascript" src="tabs_options.js"></script>
<script type="text/javascript" src="tabs_tickets.js"></script>
+
+ <script type="text/javascript">
+ // disable this stale testsuite for testswarm only
+ var url = window.location.search;
+ url = decodeURIComponent( url.slice( url.indexOf("swarmURL=") + 9 ) );
+ if ( url && url.indexOf("http") == 0 ) {
+ // reset config to kill previous tests; make sure testsuite.js is loaded afterwards to init the testswarm script
+ QUnit.init();
+ test("tabs", function() { ok(true, "disabled tabs testsuite"); });
+ }
+ </script>
+ <script type="text/javascript" src="../testsuite.js"></script>
</head>
<body>
diff --git a/tests/unit/tabs/tabs_core.js b/tests/unit/tabs/tabs_core.js
index 20ab2b1fd..652788bba 100644
--- a/tests/unit/tabs/tabs_core.js
+++ b/tests/unit/tabs/tabs_core.js
@@ -35,19 +35,21 @@ test('ajax', function() {
selected: 2,
load: function() {
// spinner: default spinner
- equals($('li:eq(2) > a > span', el).length, 1, "should restore tab markup after spinner is removed");
- equals($('li:eq(2) > a > span', el).html(), '3', "should restore tab label after spinner is removed");
- el.tabs('destroy');
- el.tabs({
- selected: 2,
- spinner: '<img src="spinner.gif" alt="">',
- load: function() {
- // spinner: image
- equals($('li:eq(2) > a > span', el).length, 1, "should restore tab markup after spinner is removed");
- equals($('li:eq(2) > a > span', el).html(), '3', "should restore tab label after spinner is removed");
- start();
- }
- });
+ setTimeout(function() {
+ equals($('li:eq(2) > a > span', el).length, 1, "should restore tab markup after spinner is removed");
+ equals($('li:eq(2) > a > span', el).html(), '3', "should restore tab label after spinner is removed");
+ el.tabs('destroy');
+ el.tabs({
+ selected: 2,
+ spinner: '<img src="spinner.gif" alt="">',
+ load: function() {
+ // spinner: image
+ equals($('li:eq(2) > a > span', el).length, 1, "should restore tab markup after spinner is removed");
+ equals($('li:eq(2) > a > span', el).html(), '3', "should restore tab label after spinner is removed");
+ start();
+ }
+ });
+ }, 1);
}
});
diff --git a/tests/visual/button/button_performance.html b/tests/visual/button/button_performance.html
new file mode 100644
index 000000000..2d31c2f27
--- /dev/null
+++ b/tests/visual/button/button_performance.html
@@ -0,0 +1,552 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8" />
+ <title>Button Visual push: Default</title>
+ <link rel="stylesheet" href="../visual.css" type="text/css" />
+ <link rel="stylesheet" href="../../../themes/base/jquery.ui.all.css" type="text/css">
+ <style type="text/css">
+ #toolbar { margin-top: 2em; padding:0.2em; }
+ #ops1, #ops2, #format, #mode { margin-right: 1em }
+ </style>
+ <script type="text/javascript" src="../../../jquery-1.4.2.js"></script>
+ <script type="text/javascript" src="../../../external/jquery.metadata.js"></script>
+ <script type="text/javascript" src="../../../ui/jquery.ui.core.js"></script>
+ <script type="text/javascript" src="../../../ui/jquery.ui.widget.js"></script>
+ <script type="text/javascript" src="../../../ui/jquery.ui.button.js"></script>
+ <script type="text/javascript">
+ $(function() {
+ $("button").button();
+ });
+ </script>
+</head>
+<body>
+
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+<button>Simple button, only text</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'},text:false}}">Button with icon only</button>
+<button class="{button:{icons:{primary:'ui-icon-locked'}}}">Button with icon on the left</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}}}">Button with two icons</button>
+<button class="{button:{icons:{primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'},text:false}}">Button with two icons</button>
+
+</body>
+</html>
diff --git a/tests/visual/compound/widgets_in_dialog.html b/tests/visual/compound/widgets_in_dialog.html
index 88dbd2d70..7551efd8d 100644
--- a/tests/visual/compound/widgets_in_dialog.html
+++ b/tests/visual/compound/widgets_in_dialog.html
@@ -1,225 +1,225 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
- <meta charset="UTF-8" />
- <title>Compound Visual Test : All Widgets in Dialog</title>
- <link rel="stylesheet" href="../visual.css" type="text/css" />
- <link rel="stylesheet" href="../../../themes/base/jquery.ui.all.css" type="text/css">
- <script type="text/javascript" src="../../../jquery-1.4.2.js"></script>
- <script type="text/javascript" src="../../../ui/jquery.ui.core.js"></script>
- <script type="text/javascript" src="../../../ui/jquery.ui.widget.js"></script>
- <script type="text/javascript" src="../../../ui/jquery.ui.mouse.js"></script>
- <script type="text/javascript" src="../../../ui/jquery.ui.position.js"></script>
- <script type="text/javascript" src="../../../ui/jquery.ui.resizable.js"></script>
- <script type="text/javascript" src="../../../ui/jquery.ui.draggable.js"></script>
- <script type="text/javascript" src="../../../ui/jquery.ui.accordion.js"></script>
- <script type="text/javascript" src="../../../ui/jquery.ui.autocomplete.js"></script>
- <script type="text/javascript" src="../../../ui/jquery.ui.button.js"></script>
- <script type="text/javascript" src="../../../ui/jquery.ui.datepicker.js"></script>
- <script type="text/javascript" src="../../../ui/jquery.ui.dialog.js"></script>
- <script type="text/javascript" src="../../../ui/jquery.ui.progressbar.js"></script>
- <script type="text/javascript" src="../../../ui/jquery.ui.slider.js"></script>
- <script type="text/javascript" src="../../../ui/jquery.ui.tabs.js"></script>
- <script type="text/javascript">
- $(function() {
- $("#accordion").accordion();
- $("#autocomplete").autocomplete({
- source: ["c++", "java", "php", "coldfusion", "javascript", "asp", "ruby", "python", "c", "scala", "groovy", "haskell", "perl"]
- });
- $("button").button().click(function() {
- $("#dialog2").dialog("open");
- });
- $("#datepicker").datepicker();
- $("#progressbar").progressbar({
- value: 30
- });
- $("#slider").slider({
- // should be animated
- animate: true,
- value: 30,
- slide: function(event, ui) {
- $("#progress").val(ui.value);
- $("#progressbar").progressbar("option", "value", ui.value);
- }
- });
- $("#tabs").tabs();
-
- $("#dialog").dialog();
- $("#dialog2").dialog({
- autoOpen: false,
- width: 100,
- height: 75,
- modal: true
- })
- });
- </script>
-</head>
-<body>
-
-<div id="dialog">
- <div id="accordion">
- <h3><a href="#">Accordion Header 1</a></h3>
- <div>
- Accordion Content 1
- </div>
- <h3><a href="#">Accordion Header 2</a></h3>
- <div>
- Accordion Content 2
- </div>
- <h3><a href="#">Accordion Header 3</a></h3>
- <div>
- Accordion Content 3
- </div>
- </div>
- <input id="autocomplete">
- <button>A Button</button>
- <input id="datepicker">
- <button>Another button</button>
- <div>
- <label for="progress">Progress: <input id="progress" /></label>
- </div>
- <div id="progressbar">
- </div>
- <div id="slider"></div>
- <div id="tabs">
- <ul>
- <li><a href="#tabs-1">First</a></li>
- <li><a href="#tabs-2">Second</a></li>
- <li><a href="#tabs-3">Third</a></li>
- </ul>
- <div id="tabs-1">Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</div>
- <div id="tabs-2">Phasellus mattis tincidunt nibh. Cras orci urna, blandit id, pretium vel, aliquet ornare, felis. Maecenas scelerisque sem non nisl. Fusce sed lorem in enim dictum bibendum.</div>
- <div id="tabs-3">Nam dui erat, auctor a, dignissim quis, sollicitudin eu, felis. Pellentesque nisi urna, interdum eget, sagittis et, consequat vestibulum, lacus. Mauris porttitor ullamcorper augue.</div>
- </div>
-</div>
-<div id="dialog2">
- Yay, another dialog.
-</div>
-
-Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam vitae urna quam. Fusce adipiscing erat eget magna malesuada vel mollis ligula ullamcorper. Donec pulvinar, libero et vehicula facilisis, odio orci fringilla magna, non ultricies ipsum justo a tellus. Proin facilisis magna vitae quam vestibulum tempor. Aenean semper placerat posuere. In nisi diam, ullamcorper sit amet viverra sed, pretium sed neque. Sed posuere vulputate mauris vitae placerat. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nam in odio elit, non tempor felis. Integer non iaculis ante. Sed erat mauris, aliquam nec consequat id, congue id libero. Maecenas elementum gravida tincidunt. Suspendisse lacinia enim sit amet nulla cursus pulvinar.
-</p>
-<p>
-Proin ut sem nulla, at cursus sapien. Duis sagittis lacus vitae justo mattis in sagittis ligula eleifend. Curabitur sit amet felis pharetra justo facilisis mollis eget nec massa. Sed nisi urna, semper lobortis pretium ac, interdum nec lacus. In gravida, leo sit amet vehicula malesuada, augue nunc consectetur nulla, vel tincidunt est nunc aliquet neque. Maecenas imperdiet eros id ligula tempor dapibus. Integer commodo metus sit amet quam vestibulum volutpat. In et lorem ac leo rhoncus auctor sit amet ut urna. Nulla sed nisl quis turpis vestibulum accumsan. Duis mollis aliquam sollicitudin. Pellentesque porta semper interdum. Sed eros orci, congue quis sollicitudin ut, rutrum vitae nibh. Nunc et leo non ligula interdum imperdiet. Integer tincidunt rhoncus ullamcorper. Curabitur et ullamcorper lorem. Ut at tellus eu metus congue sollicitudin eget at orci.
-</p>
-<p>
-Duis sem mauris, pulvinar quis placerat vel, aliquet non leo. Cras eros arcu, ullamcorper sit amet imperdiet at, blandit interdum augue. Phasellus non nunc ac ante condimentum tristique vitae sed urna. Integer nec sapien et dolor volutpat bibendum ac vitae justo. Aliquam gravida fermentum felis, nec dictum dui dictum ac. Maecenas eget magna leo. Phasellus ac nulla risus, dapibus ornare turpis. Morbi a massa tortor. Duis ac turpis lacus. Duis nibh metus, euismod quis ultrices vitae, sollicitudin vel leo. Nullam volutpat odio ac elit imperdiet gravida.
-</p>
-<p>
-Donec luctus magna id ipsum aliquam eget convallis tortor tristique. Etiam est quam, aliquam ac rutrum quis, pretium sed tortor. Aliquam lacus diam, rhoncus molestie convallis ut, luctus ac lacus. Nunc porttitor ante a ligula rutrum elementum. Cras dui tellus, pulvinar vel convallis sit amet, facilisis nec ipsum. Donec fermentum lectus lorem, id accumsan eros. Nunc semper laoreet lacus quis ullamcorper. Nunc luctus erat vitae orci sodales facilisis non ut felis. Aliquam pretium sapien sed enim adipiscing in feugiat est ornare. Aenean ultricies convallis tortor sit amet ullamcorper.
-</p>
-<p>
-Etiam ultricies elit non enim elementum aliquet. Vivamus quis fringilla mauris. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nunc blandit felis at massa interdum ac molestie lectus volutpat. Mauris commodo nibh id sem porta id feugiat ante euismod. Nullam fermentum libero varius turpis pharetra cursus ut sed lacus. Mauris molestie egestas augue eu bibendum. Quisque pulvinar, leo luctus vehicula faucibus, quam mi ornare dui, a rhoncus nisi eros nec dolor. Sed dictum ultricies ipsum eu ultrices. Etiam semper condimentum nibh in tempor.
-</p>
-<p>
-
-Vivamus interdum ligula nec neque sollicitudin ornare. Vestibulum a eros eget nisi accumsan hendrerit quis sit amet ipsum. Phasellus condimentum vestibulum felis eu hendrerit. Suspendisse in est tellus, et consequat ante. Nam at sapien lobortis risus dignissim malesuada. In dapibus lectus sed nibh adipiscing dictum. Nulla pellentesque convallis auctor. Suspendisse ut purus et nibh pulvinar tincidunt. Maecenas dapibus purus at odio commodo ac cursus risus luctus. Ut quis libero justo. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nullam vestibulum ipsum quis ante porttitor porta. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Ut in ante neque. Donec ante ante, porttitor non egestas a, pulvinar sed sem. Nam augue quam, fringilla sed egestas et, vulputate non nisi.
-</p>
-<p>
-Nunc sit amet arcu ac nulla bibendum sollicitudin. Pellentesque sed ligula urna. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Quisque egestas, tortor a vestibulum malesuada, ante dui condimentum massa, ac rutrum massa mauris non mi. Praesent in nisi leo. Sed ac augue nisl. Donec eget enim ut arcu posuere condimentum vel id magna. Vestibulum laoreet imperdiet massa, ut venenatis ante dapibus eu. Phasellus faucibus vestibulum eros mollis adipiscing. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque aliquet lectus at enim gravida tempus tincidunt mi porta. Sed vehicula molestie ligula, sed tincidunt diam suscipit vitae.
-</p>
-<p>
-Nullam euismod tempus ante, vel semper turpis pharetra eget. Nulla pretium ante et ipsum dapibus imperdiet. Praesent ipsum velit, gravida sed adipiscing id, condimentum in odio. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Fusce blandit vehicula felis, pretium ullamcorper leo tempor non. Nunc eget nisi nunc, posuere pellentesque enim. Nunc gravida orci quis odio semper ultricies. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque eu neque a sapien commodo placerat. Aenean non eros semper metus viverra porttitor. Integer vel tortor eu neque commodo ultrices eu quis tellus. Nam commodo sagittis dolor in consequat. Fusce hendrerit turpis eget leo rutrum ut scelerisque nibh condimentum. Fusce sit amet feugiat mauris. Maecenas elementum tellus nec augue rutrum mattis. Sed viverra tempor blandit. Pellentesque adipiscing tincidunt est sit amet tincidunt. Proin suscipit suscipit odio, eu pellentesque dolor pharetra non. Aliquam erat volutpat.
-</p>
-<p>
-Duis pellentesque, enim sed mollis congue, ante mauris feugiat nisi, bibendum euismod erat enim ac magna. Mauris risus nisl, sodales vel viverra ut, interdum sed neque. Nunc ac dignissim felis. Proin tincidunt orci elementum erat molestie suscipit. Cras suscipit, sem ac vehicula vehicula, lorem orci dictum nibh, ut bibendum odio sem non erat. Maecenas quis metus eget mauris feugiat porta a eu ipsum. Vivamus tortor purus, posuere ut luctus sed, ullamcorper feugiat neque. In hac habitasse platea dictumst. Vivamus nec justo vel lacus mattis pellentesque. Nunc vel gravida quam. Etiam at aliquam magna.
-</p>
-<p>
-Sed ac lacus ac felis auctor suscipit. Aliquam lacinia lectus ac nunc placerat aliquam accumsan neque interdum. Aenean in sapien sem. Suspendisse potenti. Aenean congue vulputate scelerisque. Proin eget eros tortor. Morbi rhoncus, mi vitae sollicitudin luctus, est orci porttitor turpis, vitae cursus est dui sed leo. Curabitur erat nunc, placerat bibendum tempus in, blandit eget ipsum. Cras in feugiat ipsum. Vestibulum dapibus quam nec odio pretium non dapibus purus dapibus. Pellentesque vehicula metus bibendum orci ultrices tincidunt. Sed fermentum, neque eget porta tempor, sem neque pulvinar ligula, vitae elementum massa metus eget nunc. Nunc sed orci eu purus sodales fringilla. Quisque aliquet arcu ac dolor ultrices fringilla. Nullam ornare tempus lorem, in mattis magna mollis laoreet. Vestibulum convallis arcu in purus lobortis et sollicitudin ipsum aliquet. Quisque risus est, sagittis eu aliquam ac, condimentum at massa. Fusce consectetur dignissim sem vel ornare. Maecenas posuere ultricies sollicitudin. Duis luctus, purus quis auctor egestas, diam felis scelerisque diam, a varius tellus erat a nunc.
-</p>
-<p>
-Phasellus id ante neque, eget volutpat risus. Vivamus scelerisque, nisi rutrum ultrices varius, sem quam suscipit purus, in elementum nibh nulla nec nisi. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Phasellus interdum hendrerit mi, nec cursus nisi tempor ac. Phasellus luctus ligula bibendum mauris iaculis id tempor odio volutpat. Nunc in augue metus. Suspendisse at libero at libero lacinia convallis eu vitae metus. Duis eget risus odio. Nam id mi tellus, non vulputate libero. In placerat dictum orci eu pellentesque. Etiam sed varius felis. Phasellus ut adipiscing leo. Morbi ante eros, interdum eget dapibus ac, varius congue nunc. Donec vulputate sapien id risus sodales sit amet pretium velit iaculis. Etiam ultrices tempor euismod.
-</p>
-
-<p>
-Praesent in turpis ut mauris cursus commodo. Mauris lectus tellus, congue sit amet dictum id, convallis ac nisi. Curabitur ante dolor, sagittis ac auctor ac, aliquet vel nisl. Nulla non porta sapien. Nunc non aliquet erat. Vestibulum euismod auctor volutpat. Mauris libero tellus, pharetra eget lacinia sit amet, viverra eget velit. Sed viverra varius velit at pharetra. Sed pharetra dolor sed erat interdum in placerat magna lacinia. Cras venenatis tellus non sapien egestas sollicitudin. Duis congue pharetra lacinia. Curabitur eu diam vel tortor rhoncus dignissim vel sed enim. Proin ut congue mi. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce viverra elit eu dolor tincidunt tempor vel nec magna. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae;
-</p>
-<p>
-Sed ligula purus, tristique nec condimentum sed, facilisis ac augue. Integer volutpat velit urna, et posuere ligula. In tempus luctus dignissim. Duis augue neque, egestas ut tincidunt in, congue a enim. Aliquam ut odio dui, id congue tortor. Nullam venenatis erat non nulla tincidunt scelerisque. Morbi in urna ac nulla molestie scelerisque eu a nulla. Aliquam erat volutpat. Praesent dictum scelerisque lorem mattis vehicula. Quisque ut rutrum metus. Mauris pharetra ante vitae nunc mattis vulputate. Mauris molestie volutpat mauris, ut iaculis dui bibendum ac. Ut egestas laoreet est, eget mollis libero laoreet at. In sagittis vestibulum accumsan. Nam dapibus ultrices urna sit amet accumsan. Pellentesque id ultrices elit. Aliquam quis magna ut leo sagittis posuere sit amet id enim. Etiam congue eros sit amet nulla aliquam gravida. In accumsan lectus nibh. Proin volutpat pretium facilisis.
-</p>
-<p>
-Mauris pulvinar erat at quam egestas ac aliquet mi gravida. Integer pellentesque quam vel massa commodo vitae sollicitudin eros volutpat. Aenean mollis felis molestie quam placerat et elementum eros gravida. In hac habitasse platea dictumst. Mauris ullamcorper facilisis eros, nec rutrum mi auctor sed. Ut viverra, orci a viverra ultricies, turpis enim pellentesque urna, sit amet viverra metus enim ut justo. Donec aliquam, urna id condimentum rutrum, nibh nunc tristique magna, at luctus quam enim at turpis. Maecenas dapibus dui ac velit adipiscing fringilla. Nullam malesuada nunc vel lorem cursus sed congue felis lacinia. Pellentesque vehicula gravida est nec facilisis. Nullam imperdiet fringilla orci in dignissim. Praesent orci dolor, vestibulum eu auctor quis, tristique auctor mi. Nunc euismod dui sit amet metus malesuada feugiat. Fusce iaculis neque in velit interdum rhoncus. Aenean at risus ut arcu dapibus congue a tincidunt dolor. Donec porttitor lacus et urna vestibulum a sagittis nunc mollis.
-</p>
-<p>
-In metus tellus, eleifend id aliquet at, pulvinar ut tortor. Aliquam erat volutpat. Vivamus lacus magna, consequat vel euismod sed, viverra a ipsum. Praesent dapibus laoreet nisi, nec posuere massa commodo vel. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed ullamcorper adipiscing ante, dapibus molestie velit cursus id. Nam cursus arcu consectetur lectus sollicitudin gravida. Maecenas urna sapien, fermentum sit amet consectetur at, feugiat ut massa. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer sit amet ante nec arcu bibendum bibendum ut ut justo. Nulla ut libero est.
-</p>
-<p>
-Aenean sem augue, malesuada quis elementum id, aliquet at turpis. Nam volutpat interdum purus, at dictum risus posuere rhoncus. Praesent metus diam, egestas in lacinia eu, tincidunt in nibh. Phasellus sollicitudin volutpat erat, sit amet mattis sapien fringilla in. Quisque rhoncus, felis a pellentesque dictum, arcu urna molestie sem, ut tincidunt nulla magna in enim. Vestibulum erat nulla, sollicitudin quis faucibus et, blandit quis est. Nam vehicula justo augue. Vivamus elementum sodales aliquet. Donec convallis neque sed dui euismod aliquet. Morbi elementum hendrerit odio, vel mollis felis dignissim vitae. Phasellus a diam lacus. Integer congue, mi vehicula egestas imperdiet, nulla mi commodo tortor, sit amet fermentum urna leo non dolor. Donec elementum elementum urna at sollicitudin. Vestibulum placerat tortor in nibh lobortis ac consectetur felis interdum. Integer faucibus diam nec magna porttitor sit amet dictum elit consectetur. Suspendisse risus velit, pellentesque eget viverra in, porta eget metus. Sed porta elit erat.
-</p>
-<p>
-Nulla facilisi. Aliquam vulputate dolor quis nisi auctor luctus. Fusce vitae scelerisque velit. Sed sit amet tortor a nisi convallis pulvinar et eget sapien. Nulla condimentum auctor velit, a viverra nibh pellentesque eget. Aenean at lacus quam, lobortis posuere justo. Duis et diam in ligula rhoncus pellentesque. Morbi massa tellus, mattis nec condimentum ut, tempus eu lectus. In mi orci, luctus at pulvinar vel, scelerisque nec enim. Vestibulum vehicula odio in augue dignissim tincidunt. Integer ac velit ligula. Integer elit turpis, mattis eget ornare ut, eleifend in magna. Curabitur sagittis dui in felis ultricies gravida.
-
-</p>
-<p>
-Praesent adipiscing rhoncus rutrum. Aenean ultricies auctor risus at fringilla. Mauris quam lectus, ullamcorper sed ultricies at, interdum eget tellus. Vestibulum ac mi erat. Sed ac tellus erat, sed laoreet arcu. Fusce eget ipsum ac sem volutpat viverra. Suspendisse ac felis sit amet purus viverra luctus non eget ipsum. Praesent eleifend euismod tortor, vel malesuada felis consectetur ac. Nunc a mi sit amet nulla venenatis tincidunt. Morbi vitae nisl nulla, nec adipiscing sem. Nullam porttitor scelerisque urna, id dapibus diam malesuada vitae. Duis auctor eleifend lectus, a tempor odio aliquet quis. Nam eu est urna, nec ultricies lectus. Ut egestas aliquet nunc, et hendrerit erat vehicula non. Aliquam tempus faucibus arcu, at vulputate erat tempor eu. Quisque tempus, lectus adipiscing blandit scelerisque, magna felis eleifend odio, non volutpat felis enim sit amet leo. Mauris augue tortor, ultrices ac sagittis non, vulputate quis nisl.
-</p>
-<p>
-Fusce erat sem, dictum in bibendum ac, feugiat ut odio. Duis aliquam felis sit amet diam egestas consectetur. Phasellus consequat, mauris eget venenatis porta, velit sapien malesuada nibh, id dignissim ante tellus vitae lacus. Duis non nisl sit amet nunc euismod posuere. Donec eros erat, fringilla vel iaculis condimentum, vestibulum at neque. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Aliquam lorem sapien, bibendum eu mollis nec, gravida dapibus lectus. Aenean pretium volutpat nunc a placerat. Nullam eget tellus quis ipsum ultrices ullamcorper non eu mauris. Donec volutpat tincidunt elit, sit amet cursus justo elementum quis. Mauris volutpat, enim sit amet tempor commodo, purus lacus luctus dui, sed aliquet ligula nisi vel diam. Donec est elit, lobortis at eleifend id, feugiat egestas massa. Fusce elementum sollicitudin adipiscing. Vivamus et dapibus ipsum. Morbi interdum libero a nisl dignissim sed facilisis ipsum lacinia.
-</p>
-<p>
-Cras a augue dui, vitae tincidunt enim. In hac habitasse platea dictumst. Proin nec magna sed nulla mollis tempus id ut lectus. Morbi volutpat ultricies ipsum, quis imperdiet libero tempor nec. Donec bibendum ornare blandit. Aliquam rutrum risus non turpis commodo non commodo erat molestie. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut fermentum, magna vel euismod convallis, mi magna vehicula velit, aliquet rhoncus ipsum massa et nunc. Nullam blandit purus non neque ullamcorper a aliquet nisl tristique. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Sed sit amet velit magna, sit amet rutrum dui. Donec elementum mi sed velit consectetur vulputate. Sed interdum adipiscing mattis.
-</p>
-Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam vitae urna quam. Fusce adipiscing erat eget magna malesuada vel mollis ligula ullamcorper. Donec pulvinar, libero et vehicula facilisis, odio orci fringilla magna, non ultricies ipsum justo a tellus. Proin facilisis magna vitae quam vestibulum tempor. Aenean semper placerat posuere. In nisi diam, ullamcorper sit amet viverra sed, pretium sed neque. Sed posuere vulputate mauris vitae placerat. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nam in odio elit, non tempor felis. Integer non iaculis ante. Sed erat mauris, aliquam nec consequat id, congue id libero. Maecenas elementum gravida tincidunt. Suspendisse lacinia enim sit amet nulla cursus pulvinar.
-</p>
-<p>
-Proin ut sem nulla, at cursus sapien. Duis sagittis lacus vitae justo mattis in sagittis ligula eleifend. Curabitur sit amet felis pharetra justo facilisis mollis eget nec massa. Sed nisi urna, semper lobortis pretium ac, interdum nec lacus. In gravida, leo sit amet vehicula malesuada, augue nunc consectetur nulla, vel tincidunt est nunc aliquet neque. Maecenas imperdiet eros id ligula tempor dapibus. Integer commodo metus sit amet quam vestibulum volutpat. In et lorem ac leo rhoncus auctor sit amet ut urna. Nulla sed nisl quis turpis vestibulum accumsan. Duis mollis aliquam sollicitudin. Pellentesque porta semper interdum. Sed eros orci, congue quis sollicitudin ut, rutrum vitae nibh. Nunc et leo non ligula interdum imperdiet. Integer tincidunt rhoncus ullamcorper. Curabitur et ullamcorper lorem. Ut at tellus eu metus congue sollicitudin eget at orci.
-</p>
-<p>
-Duis sem mauris, pulvinar quis placerat vel, aliquet non leo. Cras eros arcu, ullamcorper sit amet imperdiet at, blandit interdum augue. Phasellus non nunc ac ante condimentum tristique vitae sed urna. Integer nec sapien et dolor volutpat bibendum ac vitae justo. Aliquam gravida fermentum felis, nec dictum dui dictum ac. Maecenas eget magna leo. Phasellus ac nulla risus, dapibus ornare turpis. Morbi a massa tortor. Duis ac turpis lacus. Duis nibh metus, euismod quis ultrices vitae, sollicitudin vel leo. Nullam volutpat odio ac elit imperdiet gravida.
-</p>
-<p>
-Donec luctus magna id ipsum aliquam eget convallis tortor tristique. Etiam est quam, aliquam ac rutrum quis, pretium sed tortor. Aliquam lacus diam, rhoncus molestie convallis ut, luctus ac lacus. Nunc porttitor ante a ligula rutrum elementum. Cras dui tellus, pulvinar vel convallis sit amet, facilisis nec ipsum. Donec fermentum lectus lorem, id accumsan eros. Nunc semper laoreet lacus quis ullamcorper. Nunc luctus erat vitae orci sodales facilisis non ut felis. Aliquam pretium sapien sed enim adipiscing in feugiat est ornare. Aenean ultricies convallis tortor sit amet ullamcorper.
-</p>
-<p>
-Etiam ultricies elit non enim elementum aliquet. Vivamus quis fringilla mauris. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nunc blandit felis at massa interdum ac molestie lectus volutpat. Mauris commodo nibh id sem porta id feugiat ante euismod. Nullam fermentum libero varius turpis pharetra cursus ut sed lacus. Mauris molestie egestas augue eu bibendum. Quisque pulvinar, leo luctus vehicula faucibus, quam mi ornare dui, a rhoncus nisi eros nec dolor. Sed dictum ultricies ipsum eu ultrices. Etiam semper condimentum nibh in tempor.
-</p>
-<p>
-
-Vivamus interdum ligula nec neque sollicitudin ornare. Vestibulum a eros eget nisi accumsan hendrerit quis sit amet ipsum. Phasellus condimentum vestibulum felis eu hendrerit. Suspendisse in est tellus, et consequat ante. Nam at sapien lobortis risus dignissim malesuada. In dapibus lectus sed nibh adipiscing dictum. Nulla pellentesque convallis auctor. Suspendisse ut purus et nibh pulvinar tincidunt. Maecenas dapibus purus at odio commodo ac cursus risus luctus. Ut quis libero justo. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nullam vestibulum ipsum quis ante porttitor porta. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Ut in ante neque. Donec ante ante, porttitor non egestas a, pulvinar sed sem. Nam augue quam, fringilla sed egestas et, vulputate non nisi.
-</p>
-<p>
-Nunc sit amet arcu ac nulla bibendum sollicitudin. Pellentesque sed ligula urna. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Quisque egestas, tortor a vestibulum malesuada, ante dui condimentum massa, ac rutrum massa mauris non mi. Praesent in nisi leo. Sed ac augue nisl. Donec eget enim ut arcu posuere condimentum vel id magna. Vestibulum laoreet imperdiet massa, ut venenatis ante dapibus eu. Phasellus faucibus vestibulum eros mollis adipiscing. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque aliquet lectus at enim gravida tempus tincidunt mi porta. Sed vehicula molestie ligula, sed tincidunt diam suscipit vitae.
-</p>
-<p>
-Nullam euismod tempus ante, vel semper turpis pharetra eget. Nulla pretium ante et ipsum dapibus imperdiet. Praesent ipsum velit, gravida sed adipiscing id, condimentum in odio. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Fusce blandit vehicula felis, pretium ullamcorper leo tempor non. Nunc eget nisi nunc, posuere pellentesque enim. Nunc gravida orci quis odio semper ultricies. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque eu neque a sapien commodo placerat. Aenean non eros semper metus viverra porttitor. Integer vel tortor eu neque commodo ultrices eu quis tellus. Nam commodo sagittis dolor in consequat. Fusce hendrerit turpis eget leo rutrum ut scelerisque nibh condimentum. Fusce sit amet feugiat mauris. Maecenas elementum tellus nec augue rutrum mattis. Sed viverra tempor blandit. Pellentesque adipiscing tincidunt est sit amet tincidunt. Proin suscipit suscipit odio, eu pellentesque dolor pharetra non. Aliquam erat volutpat.
-</p>
-<p>
-Duis pellentesque, enim sed mollis congue, ante mauris feugiat nisi, bibendum euismod erat enim ac magna. Mauris risus nisl, sodales vel viverra ut, interdum sed neque. Nunc ac dignissim felis. Proin tincidunt orci elementum erat molestie suscipit. Cras suscipit, sem ac vehicula vehicula, lorem orci dictum nibh, ut bibendum odio sem non erat. Maecenas quis metus eget mauris feugiat porta a eu ipsum. Vivamus tortor purus, posuere ut luctus sed, ullamcorper feugiat neque. In hac habitasse platea dictumst. Vivamus nec justo vel lacus mattis pellentesque. Nunc vel gravida quam. Etiam at aliquam magna.
-</p>
-<p>
-Sed ac lacus ac felis auctor suscipit. Aliquam lacinia lectus ac nunc placerat aliquam accumsan neque interdum. Aenean in sapien sem. Suspendisse potenti. Aenean congue vulputate scelerisque. Proin eget eros tortor. Morbi rhoncus, mi vitae sollicitudin luctus, est orci porttitor turpis, vitae cursus est dui sed leo. Curabitur erat nunc, placerat bibendum tempus in, blandit eget ipsum. Cras in feugiat ipsum. Vestibulum dapibus quam nec odio pretium non dapibus purus dapibus. Pellentesque vehicula metus bibendum orci ultrices tincidunt. Sed fermentum, neque eget porta tempor, sem neque pulvinar ligula, vitae elementum massa metus eget nunc. Nunc sed orci eu purus sodales fringilla. Quisque aliquet arcu ac dolor ultrices fringilla. Nullam ornare tempus lorem, in mattis magna mollis laoreet. Vestibulum convallis arcu in purus lobortis et sollicitudin ipsum aliquet. Quisque risus est, sagittis eu aliquam ac, condimentum at massa. Fusce consectetur dignissim sem vel ornare. Maecenas posuere ultricies sollicitudin. Duis luctus, purus quis auctor egestas, diam felis scelerisque diam, a varius tellus erat a nunc.
-</p>
-<p>
-Phasellus id ante neque, eget volutpat risus. Vivamus scelerisque, nisi rutrum ultrices varius, sem quam suscipit purus, in elementum nibh nulla nec nisi. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Phasellus interdum hendrerit mi, nec cursus nisi tempor ac. Phasellus luctus ligula bibendum mauris iaculis id tempor odio volutpat. Nunc in augue metus. Suspendisse at libero at libero lacinia convallis eu vitae metus. Duis eget risus odio. Nam id mi tellus, non vulputate libero. In placerat dictum orci eu pellentesque. Etiam sed varius felis. Phasellus ut adipiscing leo. Morbi ante eros, interdum eget dapibus ac, varius congue nunc. Donec vulputate sapien id risus sodales sit amet pretium velit iaculis. Etiam ultrices tempor euismod.
-</p>
-
-<p>
-Praesent in turpis ut mauris cursus commodo. Mauris lectus tellus, congue sit amet dictum id, convallis ac nisi. Curabitur ante dolor, sagittis ac auctor ac, aliquet vel nisl. Nulla non porta sapien. Nunc non aliquet erat. Vestibulum euismod auctor volutpat. Mauris libero tellus, pharetra eget lacinia sit amet, viverra eget velit. Sed viverra varius velit at pharetra. Sed pharetra dolor sed erat interdum in placerat magna lacinia. Cras venenatis tellus non sapien egestas sollicitudin. Duis congue pharetra lacinia. Curabitur eu diam vel tortor rhoncus dignissim vel sed enim. Proin ut congue mi. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce viverra elit eu dolor tincidunt tempor vel nec magna. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae;
-</p>
-<p>
-Sed ligula purus, tristique nec condimentum sed, facilisis ac augue. Integer volutpat velit urna, et posuere ligula. In tempus luctus dignissim. Duis augue neque, egestas ut tincidunt in, congue a enim. Aliquam ut odio dui, id congue tortor. Nullam venenatis erat non nulla tincidunt scelerisque. Morbi in urna ac nulla molestie scelerisque eu a nulla. Aliquam erat volutpat. Praesent dictum scelerisque lorem mattis vehicula. Quisque ut rutrum metus. Mauris pharetra ante vitae nunc mattis vulputate. Mauris molestie volutpat mauris, ut iaculis dui bibendum ac. Ut egestas laoreet est, eget mollis libero laoreet at. In sagittis vestibulum accumsan. Nam dapibus ultrices urna sit amet accumsan. Pellentesque id ultrices elit. Aliquam quis magna ut leo sagittis posuere sit amet id enim. Etiam congue eros sit amet nulla aliquam gravida. In accumsan lectus nibh. Proin volutpat pretium facilisis.
-</p>
-<p>
-Mauris pulvinar erat at quam egestas ac aliquet mi gravida. Integer pellentesque quam vel massa commodo vitae sollicitudin eros volutpat. Aenean mollis felis molestie quam placerat et elementum eros gravida. In hac habitasse platea dictumst. Mauris ullamcorper facilisis eros, nec rutrum mi auctor sed. Ut viverra, orci a viverra ultricies, turpis enim pellentesque urna, sit amet viverra metus enim ut justo. Donec aliquam, urna id condimentum rutrum, nibh nunc tristique magna, at luctus quam enim at turpis. Maecenas dapibus dui ac velit adipiscing fringilla. Nullam malesuada nunc vel lorem cursus sed congue felis lacinia. Pellentesque vehicula gravida est nec facilisis. Nullam imperdiet fringilla orci in dignissim. Praesent orci dolor, vestibulum eu auctor quis, tristique auctor mi. Nunc euismod dui sit amet metus malesuada feugiat. Fusce iaculis neque in velit interdum rhoncus. Aenean at risus ut arcu dapibus congue a tincidunt dolor. Donec porttitor lacus et urna vestibulum a sagittis nunc mollis.
-</p>
-<p>
-In metus tellus, eleifend id aliquet at, pulvinar ut tortor. Aliquam erat volutpat. Vivamus lacus magna, consequat vel euismod sed, viverra a ipsum. Praesent dapibus laoreet nisi, nec posuere massa commodo vel. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed ullamcorper adipiscing ante, dapibus molestie velit cursus id. Nam cursus arcu consectetur lectus sollicitudin gravida. Maecenas urna sapien, fermentum sit amet consectetur at, feugiat ut massa. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer sit amet ante nec arcu bibendum bibendum ut ut justo. Nulla ut libero est.
-</p>
-<p>
-Aenean sem augue, malesuada quis elementum id, aliquet at turpis. Nam volutpat interdum purus, at dictum risus posuere rhoncus. Praesent metus diam, egestas in lacinia eu, tincidunt in nibh. Phasellus sollicitudin volutpat erat, sit amet mattis sapien fringilla in. Quisque rhoncus, felis a pellentesque dictum, arcu urna molestie sem, ut tincidunt nulla magna in enim. Vestibulum erat nulla, sollicitudin quis faucibus et, blandit quis est. Nam vehicula justo augue. Vivamus elementum sodales aliquet. Donec convallis neque sed dui euismod aliquet. Morbi elementum hendrerit odio, vel mollis felis dignissim vitae. Phasellus a diam lacus. Integer congue, mi vehicula egestas imperdiet, nulla mi commodo tortor, sit amet fermentum urna leo non dolor. Donec elementum elementum urna at sollicitudin. Vestibulum placerat tortor in nibh lobortis ac consectetur felis interdum. Integer faucibus diam nec magna porttitor sit amet dictum elit consectetur. Suspendisse risus velit, pellentesque eget viverra in, porta eget metus. Sed porta elit erat.
-</p>
-<p>
-Nulla facilisi. Aliquam vulputate dolor quis nisi auctor luctus. Fusce vitae scelerisque velit. Sed sit amet tortor a nisi convallis pulvinar et eget sapien. Nulla condimentum auctor velit, a viverra nibh pellentesque eget. Aenean at lacus quam, lobortis posuere justo. Duis et diam in ligula rhoncus pellentesque. Morbi massa tellus, mattis nec condimentum ut, tempus eu lectus. In mi orci, luctus at pulvinar vel, scelerisque nec enim. Vestibulum vehicula odio in augue dignissim tincidunt. Integer ac velit ligula. Integer elit turpis, mattis eget ornare ut, eleifend in magna. Curabitur sagittis dui in felis ultricies gravida.
-
-</p>
-<p>
-Praesent adipiscing rhoncus rutrum. Aenean ultricies auctor risus at fringilla. Mauris quam lectus, ullamcorper sed ultricies at, interdum eget tellus. Vestibulum ac mi erat. Sed ac tellus erat, sed laoreet arcu. Fusce eget ipsum ac sem volutpat viverra. Suspendisse ac felis sit amet purus viverra luctus non eget ipsum. Praesent eleifend euismod tortor, vel malesuada felis consectetur ac. Nunc a mi sit amet nulla venenatis tincidunt. Morbi vitae nisl nulla, nec adipiscing sem. Nullam porttitor scelerisque urna, id dapibus diam malesuada vitae. Duis auctor eleifend lectus, a tempor odio aliquet quis. Nam eu est urna, nec ultricies lectus. Ut egestas aliquet nunc, et hendrerit erat vehicula non. Aliquam tempus faucibus arcu, at vulputate erat tempor eu. Quisque tempus, lectus adipiscing blandit scelerisque, magna felis eleifend odio, non volutpat felis enim sit amet leo. Mauris augue tortor, ultrices ac sagittis non, vulputate quis nisl.
-</p>
-<p>
-Fusce erat sem, dictum in bibendum ac, feugiat ut odio. Duis aliquam felis sit amet diam egestas consectetur. Phasellus consequat, mauris eget venenatis porta, velit sapien malesuada nibh, id dignissim ante tellus vitae lacus. Duis non nisl sit amet nunc euismod posuere. Donec eros erat, fringilla vel iaculis condimentum, vestibulum at neque. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Aliquam lorem sapien, bibendum eu mollis nec, gravida dapibus lectus. Aenean pretium volutpat nunc a placerat. Nullam eget tellus quis ipsum ultrices ullamcorper non eu mauris. Donec volutpat tincidunt elit, sit amet cursus justo elementum quis. Mauris volutpat, enim sit amet tempor commodo, purus lacus luctus dui, sed aliquet ligula nisi vel diam. Donec est elit, lobortis at eleifend id, feugiat egestas massa. Fusce elementum sollicitudin adipiscing. Vivamus et dapibus ipsum. Morbi interdum libero a nisl dignissim sed facilisis ipsum lacinia.
-</p>
-<p>
-Cras a augue dui, vitae tincidunt enim. In hac habitasse platea dictumst. Proin nec magna sed nulla mollis tempus id ut lectus. Morbi volutpat ultricies ipsum, quis imperdiet libero tempor nec. Donec bibendum ornare blandit. Aliquam rutrum risus non turpis commodo non commodo erat molestie. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut fermentum, magna vel euismod convallis, mi magna vehicula velit, aliquet rhoncus ipsum massa et nunc. Nullam blandit purus non neque ullamcorper a aliquet nisl tristique. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Sed sit amet velit magna, sit amet rutrum dui. Donec elementum mi sed velit consectetur vulputate. Sed interdum adipiscing mattis.
-</p>
-
-</body>
-</html>
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8" />
+ <title>Compound Visual Test : All Widgets in Dialog</title>
+ <link rel="stylesheet" href="../visual.css" type="text/css" />
+ <link rel="stylesheet" href="../../../themes/base/jquery.ui.all.css" type="text/css">
+ <script type="text/javascript" src="../../../jquery-1.4.2.js"></script>
+ <script type="text/javascript" src="../../../ui/jquery.ui.core.js"></script>
+ <script type="text/javascript" src="../../../ui/jquery.ui.widget.js"></script>
+ <script type="text/javascript" src="../../../ui/jquery.ui.mouse.js"></script>
+ <script type="text/javascript" src="../../../ui/jquery.ui.position.js"></script>
+ <script type="text/javascript" src="../../../ui/jquery.ui.resizable.js"></script>
+ <script type="text/javascript" src="../../../ui/jquery.ui.draggable.js"></script>
+ <script type="text/javascript" src="../../../ui/jquery.ui.accordion.js"></script>
+ <script type="text/javascript" src="../../../ui/jquery.ui.autocomplete.js"></script>
+ <script type="text/javascript" src="../../../ui/jquery.ui.button.js"></script>
+ <script type="text/javascript" src="../../../ui/jquery.ui.datepicker.js"></script>
+ <script type="text/javascript" src="../../../ui/jquery.ui.dialog.js"></script>
+ <script type="text/javascript" src="../../../ui/jquery.ui.progressbar.js"></script>
+ <script type="text/javascript" src="../../../ui/jquery.ui.slider.js"></script>
+ <script type="text/javascript" src="../../../ui/jquery.ui.tabs.js"></script>
+ <script type="text/javascript">
+ $(function() {
+ $("#accordion").accordion();
+ $("#autocomplete").autocomplete({
+ source: ["c++", "java", "php", "coldfusion", "javascript", "asp", "ruby", "python", "c", "scala", "groovy", "haskell", "perl"]
+ });
+ $("button").button().click(function() {
+ $("#dialog2").dialog("open");
+ });
+ $("#datepicker").datepicker();
+ $("#progressbar").progressbar({
+ value: 30
+ });
+ $("#slider").slider({
+ // should be animated
+ animate: true,
+ value: 30,
+ slide: function(event, ui) {
+ $("#progress").val(ui.value);
+ $("#progressbar").progressbar("option", "value", ui.value);
+ }
+ });
+ $("#tabs").tabs();
+
+ $("#dialog").dialog();
+ $("#dialog2").dialog({
+ autoOpen: false,
+ width: 100,
+ height: 75,
+ modal: true
+ })
+ });
+ </script>
+</head>
+<body>
+
+<div id="dialog">
+ <div id="accordion">
+ <h3><a href="#">Accordion Header 1</a></h3>
+ <div>
+ Accordion Content 1
+ </div>
+ <h3><a href="#">Accordion Header 2</a></h3>
+ <div>
+ Accordion Content 2
+ </div>
+ <h3><a href="#">Accordion Header 3</a></h3>
+ <div>
+ Accordion Content 3
+ </div>
+ </div>
+ <input id="autocomplete">
+ <button>A Button</button>
+ <input id="datepicker">
+ <button>Another button</button>
+ <div>
+ <label for="progress">Progress: <input id="progress" /></label>
+ </div>
+ <div id="progressbar">
+ </div>
+ <div id="slider"></div>
+ <div id="tabs">
+ <ul>
+ <li><a href="#tabs-1">First</a></li>
+ <li><a href="#tabs-2">Second</a></li>
+ <li><a href="#tabs-3">Third</a></li>
+ </ul>
+ <div id="tabs-1">Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</div>
+ <div id="tabs-2">Phasellus mattis tincidunt nibh. Cras orci urna, blandit id, pretium vel, aliquet ornare, felis. Maecenas scelerisque sem non nisl. Fusce sed lorem in enim dictum bibendum.</div>
+ <div id="tabs-3">Nam dui erat, auctor a, dignissim quis, sollicitudin eu, felis. Pellentesque nisi urna, interdum eget, sagittis et, consequat vestibulum, lacus. Mauris porttitor ullamcorper augue.</div>
+ </div>
+</div>
+<div id="dialog2">
+ Yay, another dialog.
+</div>
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam vitae urna quam. Fusce adipiscing erat eget magna malesuada vel mollis ligula ullamcorper. Donec pulvinar, libero et vehicula facilisis, odio orci fringilla magna, non ultricies ipsum justo a tellus. Proin facilisis magna vitae quam vestibulum tempor. Aenean semper placerat posuere. In nisi diam, ullamcorper sit amet viverra sed, pretium sed neque. Sed posuere vulputate mauris vitae placerat. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nam in odio elit, non tempor felis. Integer non iaculis ante. Sed erat mauris, aliquam nec consequat id, congue id libero. Maecenas elementum gravida tincidunt. Suspendisse lacinia enim sit amet nulla cursus pulvinar.
+</p>
+<p>
+Proin ut sem nulla, at cursus sapien. Duis sagittis lacus vitae justo mattis in sagittis ligula eleifend. Curabitur sit amet felis pharetra justo facilisis mollis eget nec massa. Sed nisi urna, semper lobortis pretium ac, interdum nec lacus. In gravida, leo sit amet vehicula malesuada, augue nunc consectetur nulla, vel tincidunt est nunc aliquet neque. Maecenas imperdiet eros id ligula tempor dapibus. Integer commodo metus sit amet quam vestibulum volutpat. In et lorem ac leo rhoncus auctor sit amet ut urna. Nulla sed nisl quis turpis vestibulum accumsan. Duis mollis aliquam sollicitudin. Pellentesque porta semper interdum. Sed eros orci, congue quis sollicitudin ut, rutrum vitae nibh. Nunc et leo non ligula interdum imperdiet. Integer tincidunt rhoncus ullamcorper. Curabitur et ullamcorper lorem. Ut at tellus eu metus congue sollicitudin eget at orci.
+</p>
+<p>
+Duis sem mauris, pulvinar quis placerat vel, aliquet non leo. Cras eros arcu, ullamcorper sit amet imperdiet at, blandit interdum augue. Phasellus non nunc ac ante condimentum tristique vitae sed urna. Integer nec sapien et dolor volutpat bibendum ac vitae justo. Aliquam gravida fermentum felis, nec dictum dui dictum ac. Maecenas eget magna leo. Phasellus ac nulla risus, dapibus ornare turpis. Morbi a massa tortor. Duis ac turpis lacus. Duis nibh metus, euismod quis ultrices vitae, sollicitudin vel leo. Nullam volutpat odio ac elit imperdiet gravida.
+</p>
+<p>
+Donec luctus magna id ipsum aliquam eget convallis tortor tristique. Etiam est quam, aliquam ac rutrum quis, pretium sed tortor. Aliquam lacus diam, rhoncus molestie convallis ut, luctus ac lacus. Nunc porttitor ante a ligula rutrum elementum. Cras dui tellus, pulvinar vel convallis sit amet, facilisis nec ipsum. Donec fermentum lectus lorem, id accumsan eros. Nunc semper laoreet lacus quis ullamcorper. Nunc luctus erat vitae orci sodales facilisis non ut felis. Aliquam pretium sapien sed enim adipiscing in feugiat est ornare. Aenean ultricies convallis tortor sit amet ullamcorper.
+</p>
+<p>
+Etiam ultricies elit non enim elementum aliquet. Vivamus quis fringilla mauris. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nunc blandit felis at massa interdum ac molestie lectus volutpat. Mauris commodo nibh id sem porta id feugiat ante euismod. Nullam fermentum libero varius turpis pharetra cursus ut sed lacus. Mauris molestie egestas augue eu bibendum. Quisque pulvinar, leo luctus vehicula faucibus, quam mi ornare dui, a rhoncus nisi eros nec dolor. Sed dictum ultricies ipsum eu ultrices. Etiam semper condimentum nibh in tempor.
+</p>
+<p>
+
+Vivamus interdum ligula nec neque sollicitudin ornare. Vestibulum a eros eget nisi accumsan hendrerit quis sit amet ipsum. Phasellus condimentum vestibulum felis eu hendrerit. Suspendisse in est tellus, et consequat ante. Nam at sapien lobortis risus dignissim malesuada. In dapibus lectus sed nibh adipiscing dictum. Nulla pellentesque convallis auctor. Suspendisse ut purus et nibh pulvinar tincidunt. Maecenas dapibus purus at odio commodo ac cursus risus luctus. Ut quis libero justo. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nullam vestibulum ipsum quis ante porttitor porta. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Ut in ante neque. Donec ante ante, porttitor non egestas a, pulvinar sed sem. Nam augue quam, fringilla sed egestas et, vulputate non nisi.
+</p>
+<p>
+Nunc sit amet arcu ac nulla bibendum sollicitudin. Pellentesque sed ligula urna. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Quisque egestas, tortor a vestibulum malesuada, ante dui condimentum massa, ac rutrum massa mauris non mi. Praesent in nisi leo. Sed ac augue nisl. Donec eget enim ut arcu posuere condimentum vel id magna. Vestibulum laoreet imperdiet massa, ut venenatis ante dapibus eu. Phasellus faucibus vestibulum eros mollis adipiscing. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque aliquet lectus at enim gravida tempus tincidunt mi porta. Sed vehicula molestie ligula, sed tincidunt diam suscipit vitae.
+</p>
+<p>
+Nullam euismod tempus ante, vel semper turpis pharetra eget. Nulla pretium ante et ipsum dapibus imperdiet. Praesent ipsum velit, gravida sed adipiscing id, condimentum in odio. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Fusce blandit vehicula felis, pretium ullamcorper leo tempor non. Nunc eget nisi nunc, posuere pellentesque enim. Nunc gravida orci quis odio semper ultricies. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque eu neque a sapien commodo placerat. Aenean non eros semper metus viverra porttitor. Integer vel tortor eu neque commodo ultrices eu quis tellus. Nam commodo sagittis dolor in consequat. Fusce hendrerit turpis eget leo rutrum ut scelerisque nibh condimentum. Fusce sit amet feugiat mauris. Maecenas elementum tellus nec augue rutrum mattis. Sed viverra tempor blandit. Pellentesque adipiscing tincidunt est sit amet tincidunt. Proin suscipit suscipit odio, eu pellentesque dolor pharetra non. Aliquam erat volutpat.
+</p>
+<p>
+Duis pellentesque, enim sed mollis congue, ante mauris feugiat nisi, bibendum euismod erat enim ac magna. Mauris risus nisl, sodales vel viverra ut, interdum sed neque. Nunc ac dignissim felis. Proin tincidunt orci elementum erat molestie suscipit. Cras suscipit, sem ac vehicula vehicula, lorem orci dictum nibh, ut bibendum odio sem non erat. Maecenas quis metus eget mauris feugiat porta a eu ipsum. Vivamus tortor purus, posuere ut luctus sed, ullamcorper feugiat neque. In hac habitasse platea dictumst. Vivamus nec justo vel lacus mattis pellentesque. Nunc vel gravida quam. Etiam at aliquam magna.
+</p>
+<p>
+Sed ac lacus ac felis auctor suscipit. Aliquam lacinia lectus ac nunc placerat aliquam accumsan neque interdum. Aenean in sapien sem. Suspendisse potenti. Aenean congue vulputate scelerisque. Proin eget eros tortor. Morbi rhoncus, mi vitae sollicitudin luctus, est orci porttitor turpis, vitae cursus est dui sed leo. Curabitur erat nunc, placerat bibendum tempus in, blandit eget ipsum. Cras in feugiat ipsum. Vestibulum dapibus quam nec odio pretium non dapibus purus dapibus. Pellentesque vehicula metus bibendum orci ultrices tincidunt. Sed fermentum, neque eget porta tempor, sem neque pulvinar ligula, vitae elementum massa metus eget nunc. Nunc sed orci eu purus sodales fringilla. Quisque aliquet arcu ac dolor ultrices fringilla. Nullam ornare tempus lorem, in mattis magna mollis laoreet. Vestibulum convallis arcu in purus lobortis et sollicitudin ipsum aliquet. Quisque risus est, sagittis eu aliquam ac, condimentum at massa. Fusce consectetur dignissim sem vel ornare. Maecenas posuere ultricies sollicitudin. Duis luctus, purus quis auctor egestas, diam felis scelerisque diam, a varius tellus erat a nunc.
+</p>
+<p>
+Phasellus id ante neque, eget volutpat risus. Vivamus scelerisque, nisi rutrum ultrices varius, sem quam suscipit purus, in elementum nibh nulla nec nisi. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Phasellus interdum hendrerit mi, nec cursus nisi tempor ac. Phasellus luctus ligula bibendum mauris iaculis id tempor odio volutpat. Nunc in augue metus. Suspendisse at libero at libero lacinia convallis eu vitae metus. Duis eget risus odio. Nam id mi tellus, non vulputate libero. In placerat dictum orci eu pellentesque. Etiam sed varius felis. Phasellus ut adipiscing leo. Morbi ante eros, interdum eget dapibus ac, varius congue nunc. Donec vulputate sapien id risus sodales sit amet pretium velit iaculis. Etiam ultrices tempor euismod.
+</p>
+
+<p>
+Praesent in turpis ut mauris cursus commodo. Mauris lectus tellus, congue sit amet dictum id, convallis ac nisi. Curabitur ante dolor, sagittis ac auctor ac, aliquet vel nisl. Nulla non porta sapien. Nunc non aliquet erat. Vestibulum euismod auctor volutpat. Mauris libero tellus, pharetra eget lacinia sit amet, viverra eget velit. Sed viverra varius velit at pharetra. Sed pharetra dolor sed erat interdum in placerat magna lacinia. Cras venenatis tellus non sapien egestas sollicitudin. Duis congue pharetra lacinia. Curabitur eu diam vel tortor rhoncus dignissim vel sed enim. Proin ut congue mi. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce viverra elit eu dolor tincidunt tempor vel nec magna. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae;
+</p>
+<p>
+Sed ligula purus, tristique nec condimentum sed, facilisis ac augue. Integer volutpat velit urna, et posuere ligula. In tempus luctus dignissim. Duis augue neque, egestas ut tincidunt in, congue a enim. Aliquam ut odio dui, id congue tortor. Nullam venenatis erat non nulla tincidunt scelerisque. Morbi in urna ac nulla molestie scelerisque eu a nulla. Aliquam erat volutpat. Praesent dictum scelerisque lorem mattis vehicula. Quisque ut rutrum metus. Mauris pharetra ante vitae nunc mattis vulputate. Mauris molestie volutpat mauris, ut iaculis dui bibendum ac. Ut egestas laoreet est, eget mollis libero laoreet at. In sagittis vestibulum accumsan. Nam dapibus ultrices urna sit amet accumsan. Pellentesque id ultrices elit. Aliquam quis magna ut leo sagittis posuere sit amet id enim. Etiam congue eros sit amet nulla aliquam gravida. In accumsan lectus nibh. Proin volutpat pretium facilisis.
+</p>
+<p>
+Mauris pulvinar erat at quam egestas ac aliquet mi gravida. Integer pellentesque quam vel massa commodo vitae sollicitudin eros volutpat. Aenean mollis felis molestie quam placerat et elementum eros gravida. In hac habitasse platea dictumst. Mauris ullamcorper facilisis eros, nec rutrum mi auctor sed. Ut viverra, orci a viverra ultricies, turpis enim pellentesque urna, sit amet viverra metus enim ut justo. Donec aliquam, urna id condimentum rutrum, nibh nunc tristique magna, at luctus quam enim at turpis. Maecenas dapibus dui ac velit adipiscing fringilla. Nullam malesuada nunc vel lorem cursus sed congue felis lacinia. Pellentesque vehicula gravida est nec facilisis. Nullam imperdiet fringilla orci in dignissim. Praesent orci dolor, vestibulum eu auctor quis, tristique auctor mi. Nunc euismod dui sit amet metus malesuada feugiat. Fusce iaculis neque in velit interdum rhoncus. Aenean at risus ut arcu dapibus congue a tincidunt dolor. Donec porttitor lacus et urna vestibulum a sagittis nunc mollis.
+</p>
+<p>
+In metus tellus, eleifend id aliquet at, pulvinar ut tortor. Aliquam erat volutpat. Vivamus lacus magna, consequat vel euismod sed, viverra a ipsum. Praesent dapibus laoreet nisi, nec posuere massa commodo vel. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed ullamcorper adipiscing ante, dapibus molestie velit cursus id. Nam cursus arcu consectetur lectus sollicitudin gravida. Maecenas urna sapien, fermentum sit amet consectetur at, feugiat ut massa. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer sit amet ante nec arcu bibendum bibendum ut ut justo. Nulla ut libero est.
+</p>
+<p>
+Aenean sem augue, malesuada quis elementum id, aliquet at turpis. Nam volutpat interdum purus, at dictum risus posuere rhoncus. Praesent metus diam, egestas in lacinia eu, tincidunt in nibh. Phasellus sollicitudin volutpat erat, sit amet mattis sapien fringilla in. Quisque rhoncus, felis a pellentesque dictum, arcu urna molestie sem, ut tincidunt nulla magna in enim. Vestibulum erat nulla, sollicitudin quis faucibus et, blandit quis est. Nam vehicula justo augue. Vivamus elementum sodales aliquet. Donec convallis neque sed dui euismod aliquet. Morbi elementum hendrerit odio, vel mollis felis dignissim vitae. Phasellus a diam lacus. Integer congue, mi vehicula egestas imperdiet, nulla mi commodo tortor, sit amet fermentum urna leo non dolor. Donec elementum elementum urna at sollicitudin. Vestibulum placerat tortor in nibh lobortis ac consectetur felis interdum. Integer faucibus diam nec magna porttitor sit amet dictum elit consectetur. Suspendisse risus velit, pellentesque eget viverra in, porta eget metus. Sed porta elit erat.
+</p>
+<p>
+Nulla facilisi. Aliquam vulputate dolor quis nisi auctor luctus. Fusce vitae scelerisque velit. Sed sit amet tortor a nisi convallis pulvinar et eget sapien. Nulla condimentum auctor velit, a viverra nibh pellentesque eget. Aenean at lacus quam, lobortis posuere justo. Duis et diam in ligula rhoncus pellentesque. Morbi massa tellus, mattis nec condimentum ut, tempus eu lectus. In mi orci, luctus at pulvinar vel, scelerisque nec enim. Vestibulum vehicula odio in augue dignissim tincidunt. Integer ac velit ligula. Integer elit turpis, mattis eget ornare ut, eleifend in magna. Curabitur sagittis dui in felis ultricies gravida.
+
+</p>
+<p>
+Praesent adipiscing rhoncus rutrum. Aenean ultricies auctor risus at fringilla. Mauris quam lectus, ullamcorper sed ultricies at, interdum eget tellus. Vestibulum ac mi erat. Sed ac tellus erat, sed laoreet arcu. Fusce eget ipsum ac sem volutpat viverra. Suspendisse ac felis sit amet purus viverra luctus non eget ipsum. Praesent eleifend euismod tortor, vel malesuada felis consectetur ac. Nunc a mi sit amet nulla venenatis tincidunt. Morbi vitae nisl nulla, nec adipiscing sem. Nullam porttitor scelerisque urna, id dapibus diam malesuada vitae. Duis auctor eleifend lectus, a tempor odio aliquet quis. Nam eu est urna, nec ultricies lectus. Ut egestas aliquet nunc, et hendrerit erat vehicula non. Aliquam tempus faucibus arcu, at vulputate erat tempor eu. Quisque tempus, lectus adipiscing blandit scelerisque, magna felis eleifend odio, non volutpat felis enim sit amet leo. Mauris augue tortor, ultrices ac sagittis non, vulputate quis nisl.
+</p>
+<p>
+Fusce erat sem, dictum in bibendum ac, feugiat ut odio. Duis aliquam felis sit amet diam egestas consectetur. Phasellus consequat, mauris eget venenatis porta, velit sapien malesuada nibh, id dignissim ante tellus vitae lacus. Duis non nisl sit amet nunc euismod posuere. Donec eros erat, fringilla vel iaculis condimentum, vestibulum at neque. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Aliquam lorem sapien, bibendum eu mollis nec, gravida dapibus lectus. Aenean pretium volutpat nunc a placerat. Nullam eget tellus quis ipsum ultrices ullamcorper non eu mauris. Donec volutpat tincidunt elit, sit amet cursus justo elementum quis. Mauris volutpat, enim sit amet tempor commodo, purus lacus luctus dui, sed aliquet ligula nisi vel diam. Donec est elit, lobortis at eleifend id, feugiat egestas massa. Fusce elementum sollicitudin adipiscing. Vivamus et dapibus ipsum. Morbi interdum libero a nisl dignissim sed facilisis ipsum lacinia.
+</p>
+<p>
+Cras a augue dui, vitae tincidunt enim. In hac habitasse platea dictumst. Proin nec magna sed nulla mollis tempus id ut lectus. Morbi volutpat ultricies ipsum, quis imperdiet libero tempor nec. Donec bibendum ornare blandit. Aliquam rutrum risus non turpis commodo non commodo erat molestie. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut fermentum, magna vel euismod convallis, mi magna vehicula velit, aliquet rhoncus ipsum massa et nunc. Nullam blandit purus non neque ullamcorper a aliquet nisl tristique. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Sed sit amet velit magna, sit amet rutrum dui. Donec elementum mi sed velit consectetur vulputate. Sed interdum adipiscing mattis.
+</p>
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam vitae urna quam. Fusce adipiscing erat eget magna malesuada vel mollis ligula ullamcorper. Donec pulvinar, libero et vehicula facilisis, odio orci fringilla magna, non ultricies ipsum justo a tellus. Proin facilisis magna vitae quam vestibulum tempor. Aenean semper placerat posuere. In nisi diam, ullamcorper sit amet viverra sed, pretium sed neque. Sed posuere vulputate mauris vitae placerat. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nam in odio elit, non tempor felis. Integer non iaculis ante. Sed erat mauris, aliquam nec consequat id, congue id libero. Maecenas elementum gravida tincidunt. Suspendisse lacinia enim sit amet nulla cursus pulvinar.
+</p>
+<p>
+Proin ut sem nulla, at cursus sapien. Duis sagittis lacus vitae justo mattis in sagittis ligula eleifend. Curabitur sit amet felis pharetra justo facilisis mollis eget nec massa. Sed nisi urna, semper lobortis pretium ac, interdum nec lacus. In gravida, leo sit amet vehicula malesuada, augue nunc consectetur nulla, vel tincidunt est nunc aliquet neque. Maecenas imperdiet eros id ligula tempor dapibus. Integer commodo metus sit amet quam vestibulum volutpat. In et lorem ac leo rhoncus auctor sit amet ut urna. Nulla sed nisl quis turpis vestibulum accumsan. Duis mollis aliquam sollicitudin. Pellentesque porta semper interdum. Sed eros orci, congue quis sollicitudin ut, rutrum vitae nibh. Nunc et leo non ligula interdum imperdiet. Integer tincidunt rhoncus ullamcorper. Curabitur et ullamcorper lorem. Ut at tellus eu metus congue sollicitudin eget at orci.
+</p>
+<p>
+Duis sem mauris, pulvinar quis placerat vel, aliquet non leo. Cras eros arcu, ullamcorper sit amet imperdiet at, blandit interdum augue. Phasellus non nunc ac ante condimentum tristique vitae sed urna. Integer nec sapien et dolor volutpat bibendum ac vitae justo. Aliquam gravida fermentum felis, nec dictum dui dictum ac. Maecenas eget magna leo. Phasellus ac nulla risus, dapibus ornare turpis. Morbi a massa tortor. Duis ac turpis lacus. Duis nibh metus, euismod quis ultrices vitae, sollicitudin vel leo. Nullam volutpat odio ac elit imperdiet gravida.
+</p>
+<p>
+Donec luctus magna id ipsum aliquam eget convallis tortor tristique. Etiam est quam, aliquam ac rutrum quis, pretium sed tortor. Aliquam lacus diam, rhoncus molestie convallis ut, luctus ac lacus. Nunc porttitor ante a ligula rutrum elementum. Cras dui tellus, pulvinar vel convallis sit amet, facilisis nec ipsum. Donec fermentum lectus lorem, id accumsan eros. Nunc semper laoreet lacus quis ullamcorper. Nunc luctus erat vitae orci sodales facilisis non ut felis. Aliquam pretium sapien sed enim adipiscing in feugiat est ornare. Aenean ultricies convallis tortor sit amet ullamcorper.
+</p>
+<p>
+Etiam ultricies elit non enim elementum aliquet. Vivamus quis fringilla mauris. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nunc blandit felis at massa interdum ac molestie lectus volutpat. Mauris commodo nibh id sem porta id feugiat ante euismod. Nullam fermentum libero varius turpis pharetra cursus ut sed lacus. Mauris molestie egestas augue eu bibendum. Quisque pulvinar, leo luctus vehicula faucibus, quam mi ornare dui, a rhoncus nisi eros nec dolor. Sed dictum ultricies ipsum eu ultrices. Etiam semper condimentum nibh in tempor.
+</p>
+<p>
+
+Vivamus interdum ligula nec neque sollicitudin ornare. Vestibulum a eros eget nisi accumsan hendrerit quis sit amet ipsum. Phasellus condimentum vestibulum felis eu hendrerit. Suspendisse in est tellus, et consequat ante. Nam at sapien lobortis risus dignissim malesuada. In dapibus lectus sed nibh adipiscing dictum. Nulla pellentesque convallis auctor. Suspendisse ut purus et nibh pulvinar tincidunt. Maecenas dapibus purus at odio commodo ac cursus risus luctus. Ut quis libero justo. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nullam vestibulum ipsum quis ante porttitor porta. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Ut in ante neque. Donec ante ante, porttitor non egestas a, pulvinar sed sem. Nam augue quam, fringilla sed egestas et, vulputate non nisi.
+</p>
+<p>
+Nunc sit amet arcu ac nulla bibendum sollicitudin. Pellentesque sed ligula urna. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Quisque egestas, tortor a vestibulum malesuada, ante dui condimentum massa, ac rutrum massa mauris non mi. Praesent in nisi leo. Sed ac augue nisl. Donec eget enim ut arcu posuere condimentum vel id magna. Vestibulum laoreet imperdiet massa, ut venenatis ante dapibus eu. Phasellus faucibus vestibulum eros mollis adipiscing. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque aliquet lectus at enim gravida tempus tincidunt mi porta. Sed vehicula molestie ligula, sed tincidunt diam suscipit vitae.
+</p>
+<p>
+Nullam euismod tempus ante, vel semper turpis pharetra eget. Nulla pretium ante et ipsum dapibus imperdiet. Praesent ipsum velit, gravida sed adipiscing id, condimentum in odio. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Fusce blandit vehicula felis, pretium ullamcorper leo tempor non. Nunc eget nisi nunc, posuere pellentesque enim. Nunc gravida orci quis odio semper ultricies. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque eu neque a sapien commodo placerat. Aenean non eros semper metus viverra porttitor. Integer vel tortor eu neque commodo ultrices eu quis tellus. Nam commodo sagittis dolor in consequat. Fusce hendrerit turpis eget leo rutrum ut scelerisque nibh condimentum. Fusce sit amet feugiat mauris. Maecenas elementum tellus nec augue rutrum mattis. Sed viverra tempor blandit. Pellentesque adipiscing tincidunt est sit amet tincidunt. Proin suscipit suscipit odio, eu pellentesque dolor pharetra non. Aliquam erat volutpat.
+</p>
+<p>
+Duis pellentesque, enim sed mollis congue, ante mauris feugiat nisi, bibendum euismod erat enim ac magna. Mauris risus nisl, sodales vel viverra ut, interdum sed neque. Nunc ac dignissim felis. Proin tincidunt orci elementum erat molestie suscipit. Cras suscipit, sem ac vehicula vehicula, lorem orci dictum nibh, ut bibendum odio sem non erat. Maecenas quis metus eget mauris feugiat porta a eu ipsum. Vivamus tortor purus, posuere ut luctus sed, ullamcorper feugiat neque. In hac habitasse platea dictumst. Vivamus nec justo vel lacus mattis pellentesque. Nunc vel gravida quam. Etiam at aliquam magna.
+</p>
+<p>
+Sed ac lacus ac felis auctor suscipit. Aliquam lacinia lectus ac nunc placerat aliquam accumsan neque interdum. Aenean in sapien sem. Suspendisse potenti. Aenean congue vulputate scelerisque. Proin eget eros tortor. Morbi rhoncus, mi vitae sollicitudin luctus, est orci porttitor turpis, vitae cursus est dui sed leo. Curabitur erat nunc, placerat bibendum tempus in, blandit eget ipsum. Cras in feugiat ipsum. Vestibulum dapibus quam nec odio pretium non dapibus purus dapibus. Pellentesque vehicula metus bibendum orci ultrices tincidunt. Sed fermentum, neque eget porta tempor, sem neque pulvinar ligula, vitae elementum massa metus eget nunc. Nunc sed orci eu purus sodales fringilla. Quisque aliquet arcu ac dolor ultrices fringilla. Nullam ornare tempus lorem, in mattis magna mollis laoreet. Vestibulum convallis arcu in purus lobortis et sollicitudin ipsum aliquet. Quisque risus est, sagittis eu aliquam ac, condimentum at massa. Fusce consectetur dignissim sem vel ornare. Maecenas posuere ultricies sollicitudin. Duis luctus, purus quis auctor egestas, diam felis scelerisque diam, a varius tellus erat a nunc.
+</p>
+<p>
+Phasellus id ante neque, eget volutpat risus. Vivamus scelerisque, nisi rutrum ultrices varius, sem quam suscipit purus, in elementum nibh nulla nec nisi. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Phasellus interdum hendrerit mi, nec cursus nisi tempor ac. Phasellus luctus ligula bibendum mauris iaculis id tempor odio volutpat. Nunc in augue metus. Suspendisse at libero at libero lacinia convallis eu vitae metus. Duis eget risus odio. Nam id mi tellus, non vulputate libero. In placerat dictum orci eu pellentesque. Etiam sed varius felis. Phasellus ut adipiscing leo. Morbi ante eros, interdum eget dapibus ac, varius congue nunc. Donec vulputate sapien id risus sodales sit amet pretium velit iaculis. Etiam ultrices tempor euismod.
+</p>
+
+<p>
+Praesent in turpis ut mauris cursus commodo. Mauris lectus tellus, congue sit amet dictum id, convallis ac nisi. Curabitur ante dolor, sagittis ac auctor ac, aliquet vel nisl. Nulla non porta sapien. Nunc non aliquet erat. Vestibulum euismod auctor volutpat. Mauris libero tellus, pharetra eget lacinia sit amet, viverra eget velit. Sed viverra varius velit at pharetra. Sed pharetra dolor sed erat interdum in placerat magna lacinia. Cras venenatis tellus non sapien egestas sollicitudin. Duis congue pharetra lacinia. Curabitur eu diam vel tortor rhoncus dignissim vel sed enim. Proin ut congue mi. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce viverra elit eu dolor tincidunt tempor vel nec magna. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae;
+</p>
+<p>
+Sed ligula purus, tristique nec condimentum sed, facilisis ac augue. Integer volutpat velit urna, et posuere ligula. In tempus luctus dignissim. Duis augue neque, egestas ut tincidunt in, congue a enim. Aliquam ut odio dui, id congue tortor. Nullam venenatis erat non nulla tincidunt scelerisque. Morbi in urna ac nulla molestie scelerisque eu a nulla. Aliquam erat volutpat. Praesent dictum scelerisque lorem mattis vehicula. Quisque ut rutrum metus. Mauris pharetra ante vitae nunc mattis vulputate. Mauris molestie volutpat mauris, ut iaculis dui bibendum ac. Ut egestas laoreet est, eget mollis libero laoreet at. In sagittis vestibulum accumsan. Nam dapibus ultrices urna sit amet accumsan. Pellentesque id ultrices elit. Aliquam quis magna ut leo sagittis posuere sit amet id enim. Etiam congue eros sit amet nulla aliquam gravida. In accumsan lectus nibh. Proin volutpat pretium facilisis.
+</p>
+<p>
+Mauris pulvinar erat at quam egestas ac aliquet mi gravida. Integer pellentesque quam vel massa commodo vitae sollicitudin eros volutpat. Aenean mollis felis molestie quam placerat et elementum eros gravida. In hac habitasse platea dictumst. Mauris ullamcorper facilisis eros, nec rutrum mi auctor sed. Ut viverra, orci a viverra ultricies, turpis enim pellentesque urna, sit amet viverra metus enim ut justo. Donec aliquam, urna id condimentum rutrum, nibh nunc tristique magna, at luctus quam enim at turpis. Maecenas dapibus dui ac velit adipiscing fringilla. Nullam malesuada nunc vel lorem cursus sed congue felis lacinia. Pellentesque vehicula gravida est nec facilisis. Nullam imperdiet fringilla orci in dignissim. Praesent orci dolor, vestibulum eu auctor quis, tristique auctor mi. Nunc euismod dui sit amet metus malesuada feugiat. Fusce iaculis neque in velit interdum rhoncus. Aenean at risus ut arcu dapibus congue a tincidunt dolor. Donec porttitor lacus et urna vestibulum a sagittis nunc mollis.
+</p>
+<p>
+In metus tellus, eleifend id aliquet at, pulvinar ut tortor. Aliquam erat volutpat. Vivamus lacus magna, consequat vel euismod sed, viverra a ipsum. Praesent dapibus laoreet nisi, nec posuere massa commodo vel. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed ullamcorper adipiscing ante, dapibus molestie velit cursus id. Nam cursus arcu consectetur lectus sollicitudin gravida. Maecenas urna sapien, fermentum sit amet consectetur at, feugiat ut massa. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer sit amet ante nec arcu bibendum bibendum ut ut justo. Nulla ut libero est.
+</p>
+<p>
+Aenean sem augue, malesuada quis elementum id, aliquet at turpis. Nam volutpat interdum purus, at dictum risus posuere rhoncus. Praesent metus diam, egestas in lacinia eu, tincidunt in nibh. Phasellus sollicitudin volutpat erat, sit amet mattis sapien fringilla in. Quisque rhoncus, felis a pellentesque dictum, arcu urna molestie sem, ut tincidunt nulla magna in enim. Vestibulum erat nulla, sollicitudin quis faucibus et, blandit quis est. Nam vehicula justo augue. Vivamus elementum sodales aliquet. Donec convallis neque sed dui euismod aliquet. Morbi elementum hendrerit odio, vel mollis felis dignissim vitae. Phasellus a diam lacus. Integer congue, mi vehicula egestas imperdiet, nulla mi commodo tortor, sit amet fermentum urna leo non dolor. Donec elementum elementum urna at sollicitudin. Vestibulum placerat tortor in nibh lobortis ac consectetur felis interdum. Integer faucibus diam nec magna porttitor sit amet dictum elit consectetur. Suspendisse risus velit, pellentesque eget viverra in, porta eget metus. Sed porta elit erat.
+</p>
+<p>
+Nulla facilisi. Aliquam vulputate dolor quis nisi auctor luctus. Fusce vitae scelerisque velit. Sed sit amet tortor a nisi convallis pulvinar et eget sapien. Nulla condimentum auctor velit, a viverra nibh pellentesque eget. Aenean at lacus quam, lobortis posuere justo. Duis et diam in ligula rhoncus pellentesque. Morbi massa tellus, mattis nec condimentum ut, tempus eu lectus. In mi orci, luctus at pulvinar vel, scelerisque nec enim. Vestibulum vehicula odio in augue dignissim tincidunt. Integer ac velit ligula. Integer elit turpis, mattis eget ornare ut, eleifend in magna. Curabitur sagittis dui in felis ultricies gravida.
+
+</p>
+<p>
+Praesent adipiscing rhoncus rutrum. Aenean ultricies auctor risus at fringilla. Mauris quam lectus, ullamcorper sed ultricies at, interdum eget tellus. Vestibulum ac mi erat. Sed ac tellus erat, sed laoreet arcu. Fusce eget ipsum ac sem volutpat viverra. Suspendisse ac felis sit amet purus viverra luctus non eget ipsum. Praesent eleifend euismod tortor, vel malesuada felis consectetur ac. Nunc a mi sit amet nulla venenatis tincidunt. Morbi vitae nisl nulla, nec adipiscing sem. Nullam porttitor scelerisque urna, id dapibus diam malesuada vitae. Duis auctor eleifend lectus, a tempor odio aliquet quis. Nam eu est urna, nec ultricies lectus. Ut egestas aliquet nunc, et hendrerit erat vehicula non. Aliquam tempus faucibus arcu, at vulputate erat tempor eu. Quisque tempus, lectus adipiscing blandit scelerisque, magna felis eleifend odio, non volutpat felis enim sit amet leo. Mauris augue tortor, ultrices ac sagittis non, vulputate quis nisl.
+</p>
+<p>
+Fusce erat sem, dictum in bibendum ac, feugiat ut odio. Duis aliquam felis sit amet diam egestas consectetur. Phasellus consequat, mauris eget venenatis porta, velit sapien malesuada nibh, id dignissim ante tellus vitae lacus. Duis non nisl sit amet nunc euismod posuere. Donec eros erat, fringilla vel iaculis condimentum, vestibulum at neque. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Aliquam lorem sapien, bibendum eu mollis nec, gravida dapibus lectus. Aenean pretium volutpat nunc a placerat. Nullam eget tellus quis ipsum ultrices ullamcorper non eu mauris. Donec volutpat tincidunt elit, sit amet cursus justo elementum quis. Mauris volutpat, enim sit amet tempor commodo, purus lacus luctus dui, sed aliquet ligula nisi vel diam. Donec est elit, lobortis at eleifend id, feugiat egestas massa. Fusce elementum sollicitudin adipiscing. Vivamus et dapibus ipsum. Morbi interdum libero a nisl dignissim sed facilisis ipsum lacinia.
+</p>
+<p>
+Cras a augue dui, vitae tincidunt enim. In hac habitasse platea dictumst. Proin nec magna sed nulla mollis tempus id ut lectus. Morbi volutpat ultricies ipsum, quis imperdiet libero tempor nec. Donec bibendum ornare blandit. Aliquam rutrum risus non turpis commodo non commodo erat molestie. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut fermentum, magna vel euismod convallis, mi magna vehicula velit, aliquet rhoncus ipsum massa et nunc. Nullam blandit purus non neque ullamcorper a aliquet nisl tristique. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Sed sit amet velit magna, sit amet rutrum dui. Donec elementum mi sed velit consectetur vulputate. Sed interdum adipiscing mattis.
+</p>
+
+</body>
+</html>
diff --git a/tests/visual/menu/drilldown.html b/tests/visual/menu/drilldown.html
index 78b8cf9f2..1539045f0 100644
--- a/tests/visual/menu/drilldown.html
+++ b/tests/visual/menu/drilldown.html
@@ -8,93 +8,120 @@
<script type="text/javascript" src="../../../ui/jquery.ui.core.js"></script>
<script type="text/javascript" src="../../../ui/jquery.ui.widget.js"></script>
<script type="text/javascript" src="../../../ui/jquery.ui.position.js"></script>
+ <script type="text/javascript" src="../../../ui/jquery.ui.button.js"></script>
<script type="text/javascript" src="../../../ui/jquery.ui.autocomplete.js"></script>
<script type="text/javascript">
$(function() {
$.widget("ui.drilldown", {
_init: function() {
var self = this;
- this.active = this.element;
+ this.active = this.element.find(">ul").attr("tabindex", 0);
// hide submenus and create indicator icons
this.element.find("ul").hide().prev("a").prepend('<span class="ui-icon ui-icon-carat-1-e"></span>').end().filter(":first").show();
this.element.find("ul").menu({
+ focus: function(event, ui) {
+ self.activeItem = ui.item;
+ },
selected: function(event, ui) {
- var nested = $(">ul", ui.item);
- if (!nested.length) {
- self.element.find("h3").text(ui.item.text());
- self.options.selected.apply(this, arguments);
+ if (this != self.active[0]) {
return;
}
- self.active = ui.item.parent();
- // put a previous submenu back into its place and hide it
- self.hideDown();
+ var nested = $(">ul", ui.item);
if (nested.length) {
- // append to body in order to display the submenu above the parent menu, instead of inside of it
- nested.appendTo(document.body).menu("deactivate").show().position({
- my: "left top",
- at: "left top",
- of: self.element.children("ul:first")
- // store the current submenu
- }).data("menuparent", ui.item);
-
- self.active.data("submenu", nested);
+ self._open(nested);
+ } else {
+ self.element.find("h3").text(ui.item.text());
+ self.options.selected.apply(this, arguments);
}
}
});
+
+ this.back = this.element.children(":last").button({
+ icons: {
+ primary: "ui-icon-carat-1-w"
+ }
+ }).click(function() {
+ self.up();
+ return false;
+ }).hide();
+ },
+
+ _open: function(submenu) {
+ this.active = submenu.show().css({
+ top: 0,
+ left: 0,
+ opacity: 0
+ }).position({
+ my: "left top",
+ at: "right top",
+ of: this.widget()
+ }).position({
+ my: "left top",
+ at: "left top",
+ of: this.widget(),
+ using: function(to) {
+ $(this).animate({
+ left: to.left,
+ top: to.top,
+ opacity: 1
+ });
+ }
+ });
+ this.back.show();
},
up: function() {
- if (!this.active.data("menuparent"))
+ if (this.active.parent()[0] == this.element[0]) {
return;
- this.hideDown();
- this.active.menu("deactivate");
- this.active = this.active.data("menuparent").parent();
+ }
+ this.active.position({
+ my: "left top",
+ at: "right top",
+ of: this.widget(),
+ using: function(to) {
+ $(this).animate({
+ left: to.left,
+ top: to.top,
+ opacity: 0
+ });
+ }
+ });
+ this.active = this.active.parent().parent().show();
+ this.activeItem = this.active.data("menu").active;
+ if (!this.active.parent().parent().is(":ui-menu")) {
+ this.back.hide();
+ }
},
- down: function() {
- var submenu = this.active.data("submenu");
- if (!submenu)
- return;
- submenu.data("menu").activate(submenu.children(":first"))
- this.active = submenu;
+ down: function(event) {
+ var nested = this.activeItem.find(">ul");
+ if (nested.length) {
+ this._open(nested);
+ nested.menu("activate", event, nested.children(":first"))
+ }
},
show: function() {
- this.element.menu("deactivate").show();
- this.active = this.element;
},
hide: function() {
- this.hideDown();
- var child = this.active.hide(), parent;
- while(child.data("menuparent")) {
- parent = child.data("menuparent");
- child.appendTo(parent).removeData("menuparent");
- child = parent.parent().removeData("submenu").hide();
- }
},
- hideDown: function() {
- var submenu = this.active.data("submenu");
- while(submenu) {
- var parent = submenu.data("menuparent");
- submenu.appendTo(parent).hide().removeData("menuparent");
- parent.parent().removeData("submenu");
- submenu = submenu.data("submenu");
- };
+ widget: function() {
+ return this.element.find(">ul");
}
});
- var nestedmenu = $("#drilldown").drilldown({
+ var drilldown = $("#drilldown").drilldown({
selected: function(event, ui) {
$("#log").append("<div>Selected " + ui.item.text() + "</div>");
}
});
- $().keydown(function(event) {
- var menu = nestedmenu.data("drilldown").active.data("menu");
+ drilldown.drilldown("widget").keydown(function(event) {
+ var menu = drilldown.data("drilldown").active.data("menu");
if (menu.widget().is(":hidden"))
return;
event.stopPropagation();
@@ -109,10 +136,10 @@
menu.previous();
break;
case $.ui.keyCode.LEFT:
- nestedmenu.nestedmenu("up");
+ drilldown.drilldown("up");
break;
case $.ui.keyCode.RIGHT:
- nestedmenu.nestedmenu("down");
+ drilldown.drilldown("down");
break;
case $.ui.keyCode.DOWN:
menu.next();
@@ -121,11 +148,11 @@
case $.ui.keyCode.ENTER:
case $.ui.keyCode.TAB:
menu.select();
- nestedmenu.nestedmenu("hide");
+ drilldown.drilldown("hide");
event.preventDefault();
break;
case $.ui.keyCode.ESCAPE:
- nestedmenu.nestedmenu("hide");
+ drilldown.drilldown("hide", event);
break;
default:
clearTimeout(menu.filterTimer);
@@ -149,7 +176,7 @@
});
}
if (match.length) {
- menu.activate(match);
+ menu.activate(event, match);
if (match.length > 1) {
menu.previousFilter = character;
menu.filterTimer = setTimeout(function() {
@@ -168,6 +195,7 @@
<style>
body { font-size:62.5%; }
.ui-menu { width: 200px; height: 170px; }
+ .ui-menu .ui-menu { position: absolute; }
.ui-menu .ui-icon { float: right; }
</style>
</head>
@@ -219,6 +247,7 @@
<li><a href="#">Utrecht</a></li>
<li><a href="#">Zurich</a></li>
</ul>
+ <a href="#">Go back</a>
</div>
<div class="ui-widget" style="margin-top:2em; font-family:Arial">
diff --git a/tests/visual/menu/nested.html b/tests/visual/menu/nested.html
index 96a0379d3..063b946c7 100644
--- a/tests/visual/menu/nested.html
+++ b/tests/visual/menu/nested.html
@@ -9,8 +9,16 @@
<script type="text/javascript" src="../../../ui/jquery.ui.widget.js"></script>
<script type="text/javascript" src="../../../ui/jquery.ui.position.js"></script>
<script type="text/javascript" src="../../../ui/jquery.ui.autocomplete.js"></script>
+ <script type="text/javascript" src="../../../external/jquery.bgiframe-2.1.1.js"></script>
+ <script type="text/javascript" src="http://jqueryui.com/themeroller/themeswitchertool/"></script>
<script type="text/javascript">
$(function() {
+ $.fn.themeswitcher && $('<div/>').css({
+ position: "absolute",
+ right: 10,
+ top: 10
+ }).appendTo(document.body).themeswitcher();
+
$.widget("ui.nestedmenu", {
_init: function() {
var self = this;
@@ -24,77 +32,46 @@
focus: function(event, ui) {
self.active = ui.item.parent();
self.activeItem = ui.item;
- // put a previous submenu back into its place and hide it
- self.hideDown();
+ ui.item.parent().find("ul").hide();
var nested = $(">ul", ui.item);
- // only for mouse-events (should actually check event.originalEvent.type, but for keys, originalEvent is undefined...)
if (nested.length && /^mouse/.test(event.originalEvent.type)) {
- self._openSubmenu(nested, ui.item);
+ self._open(nested);
}
}
})
},
- _openSubmenu: function(nested, item) {
- // append to body in order to display the submenu above the parent menu, instead of inside of it
- nested.appendTo(document.body).menu("deactivate").show().position({
+ _open: function(submenu) {
+ submenu.show().css({
+ top: 0,
+ left: 0
+ }).position({
my: "left top",
at: "right top",
- of: item
- // store the current submenu
- }).data("menuparent", item);
-
- this.active.data("submenu", nested);
+ of: this.activeItem
+ });
},
up: function(event) {
- if (!this.active.data("menuparent"))
- return;
- this.active.menu("deactivate");
- this.active = this.active.data("menuparent").parent();
+ this.active = this.active.menu("deactivate").hide().parent().parent();
this.activeItem = this.active.data("menu").active;
- this.hideDown();
},
down: function(event) {
- var submenu = this.active.data("submenu");
- if (!submenu && this.activeItem) {
- // try to open submenu or return(?); only mouseover opens submenu directly, key doesn't
- var item = this.activeItem,
- nested = item.children("ul");
- if (!nested.length)
- return;
- this._openSubmenu(nested, item);
- submenu = this.active.data("submenu");
- }
- submenu.data("menu").activate(event, submenu.children(":first"))
- this.active = submenu;
+ var submenu = $(">ul", this.activeItem);
+ this._open(submenu, this.activeItem);
+ submenu.menu("activate", event, submenu.children(":first"));
},
show: function() {
- this.element.menu("deactivate").show();
this.active = this.element;
+ this.element.show();
},
hide: function() {
- this.hideDown();
- var child = this.active.hide(), parent;
- while(child.data("menuparent")) {
- parent = child.data("menuparent");
- child.appendTo(parent).removeData("menuparent");
- child = parent.parent().removeData("submenu").hide();
- }
- },
-
- hideDown: function() {
- var submenu = this.active.data("submenu");
- while(submenu) {
- var parent = submenu.data("menuparent");
- submenu.appendTo(parent).hide().removeData("menuparent");
- parent.parent().removeData("submenu");
- submenu = submenu.data("submenu");
- };
+ this.element.find("ul").andSelf().menu("deactivate").hide();
}
+
});
var nestedmenu = $("#menu").nestedmenu({
@@ -200,6 +177,10 @@
<body>
<button>Show context menu</button>
+<br/>
+<select>
+ <option>some option with some text</option>
+</select>
<ul id="menu">
<li>
diff --git a/tests/visual/menu/nested2.html b/tests/visual/menu/nested2.html
deleted file mode 100644
index 837fb7568..000000000
--- a/tests/visual/menu/nested2.html
+++ /dev/null
@@ -1,103 +0,0 @@
-<!doctype html>
-<html>
-<head>
- <title>Menu Visual Test: Default</title>
- <link rel="stylesheet" href="../visual.css" type="text/css" />
- <link rel="stylesheet" href="../../../themes/base/jquery.ui.all.css" type="text/css" title="ui-theme" />
- <script type="text/javascript" src="../../../jquery-1.4.2.js"></script>
- <script type="text/javascript" src="../../../ui/jquery.ui.core.js"></script>
- <script type="text/javascript" src="../../../ui/jquery.ui.widget.js"></script>
- <script type="text/javascript" src="../../../ui/jquery.ui.position.js"></script>
- <script type="text/javascript" src="../../../ui/jquery.ui.autocomplete.js"></script>
- <script type="text/javascript" src="../../../external/jquery.bgiframe-2.1.1.js"></script>
- <script type="text/javascript">
- $(function() {
- $.fn.position2 = function(options) {
- return this.css({
- top: 0,
- left: 0
- }).position(options);
- }
- var menus = $("#menu").menu().position2({
- my: "left top",
- at: "center bottom",
- of: "button"
- }).find("ul").menu().hide();
- var sub1 = menus.filter(":first").show().position2({
- my: "left top",
- at: "right center",
- of: "#menu"
- });
- sub1.find("ul:first").show().position2({
- of: sub1,
- offset: "-10 50"
- });
- });
- </script>
- <style>
- body { font-size:62.5%; }
- .ui-menu { width: 200px; position: absolute; }
- .ui-menu .ui-icon { float: right; }
- ul, li {margin: 0; padding: 0}
- </style>
-</head>
-<body>
-
-<button>Show context menu</button>
-<br/>
-<select>
- <option>some option with some text</option>
-</select>
-
-<ul id="menu">
- <li>
- <a href="#">Amsterdam</a>
- <ul>
- <li><a href="#">Aberdeen</a></li>
- <li><a href="#">Ada</a></li>
- <li>
- <a href="#">Adamsville</a>
- <ul>
- <li><a href="#">Anaheim</a></li>
- <li>
- <a href="#">Cologne</a>
- <ul>
- <li><a href="#">Mberdeen</a></li>
- <li><a href="#">Mda</a></li>
- <li><a href="#">Mdamsville</a></li>
- <li><a href="#">Mddyston</a></li>
- <li><a href="#">Mmesville</a></li>
- </ul>
- </li>
- <li><a href="#">Frankfurt</a></li>
- </ul>
- </li>
- <li><a href="#">Addyston</a></li>
- <li><a href="#">Amesville</a></li>
- </ul>
- </li>
- <li><a href="#">Anaheim</a></li>
- <li><a href="#">Cologne</a></li>
- <li><a href="#">Frankfurt</a></li>
- <li>
- <a href="#">Magdeburg</a>
- <ul>
- <li><a href="#">Mberdeen</a></li>
- <li><a href="#">Mda</a></li>
- <li><a href="#">Mdamsville</a></li>
- <li><a href="#">Mddyston</a></li>
- <li><a href="#">Mmesville</a></li>
- </ul>
- </li>
- <li><a href="#">Munich</a></li>
- <li><a href="#">Utrecht</a></li>
- <li><a href="#">Zurich</a></li>
-</ul>
-
-<div class="ui-widget" style="margin-top:2em; font-family:Arial">
- Log:
- <div id="log" style="height: 400px; width: 300px; overflow: auto;" class="ui-widget-content"></div>
-</div>
-
-</body>
-</html>
diff --git a/themes/base/jquery.ui.accordion.css b/themes/base/jquery.ui.accordion.css
index acd7f5e1e..8d8a1a6e1 100644
--- a/themes/base/jquery.ui.accordion.css
+++ b/themes/base/jquery.ui.accordion.css
@@ -4,6 +4,8 @@
.ui-accordion .ui-accordion-li-fix { display: inline; }
.ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; }
.ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em .7em; }
+/* IE7-/Win - Fix extra vertical space in lists */
+.ui-accordion a { zoom: 1; }
.ui-accordion-icons .ui-accordion-header a { padding-left: 2.2em; }
.ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; }
.ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; zoom: 1; }
diff --git a/themes/base/jquery.ui.autocomplete.css b/themes/base/jquery.ui.autocomplete.css
index 1263f935d..f99006243 100644
--- a/themes/base/jquery.ui.autocomplete.css
+++ b/themes/base/jquery.ui.autocomplete.css
@@ -20,6 +20,10 @@
.ui-menu .ui-menu-item {
margin:0;
padding: 0;
+ zoom: 1;
+ float: left;
+ clear: left;
+ width: 100%;
}
.ui-menu .ui-menu-item a {
text-decoration:none;
@@ -30,5 +34,6 @@
}
.ui-menu .ui-menu-item a.ui-state-hover,
.ui-menu .ui-menu-item a.ui-state-active {
+ font-weight: normal;
margin: -1px;
}
diff --git a/themes/base/jquery.ui.tabs.css b/themes/base/jquery.ui.tabs.css
index 729758fec..99e16dbdb 100644
--- a/themes/base/jquery.ui.tabs.css
+++ b/themes/base/jquery.ui.tabs.css
@@ -7,5 +7,5 @@
.ui-tabs .ui-tabs-nav li.ui-tabs-selected { margin-bottom: 0; padding-bottom: 1px; }
.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; }
.ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */
-.ui-tabs .ui-tabs-panel { display: block; border: 0; padding: 1em 1.4em; background: none; }
+.ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; }
.ui-tabs .ui-tabs-hide { display: none !important; }
diff --git a/ui/i18n/jquery.ui.datepicker-pl.js b/ui/i18n/jquery.ui.datepicker-pl.js
index 2d2d4d765..d315bf523 100644
--- a/ui/i18n/jquery.ui.datepicker-pl.js
+++ b/ui/i18n/jquery.ui.datepicker-pl.js
@@ -10,7 +10,7 @@ jQuery(function($){
'Lipiec','Sierpień','Wrzesień','Październik','Listopad','Grudzień'],
monthNamesShort: ['Sty','Lu','Mar','Kw','Maj','Cze',
'Lip','Sie','Wrz','Pa','Lis','Gru'],
- dayNames: ['Niedziela','Poniedzialek','Wtorek','Åšroda','Czwartek','PiÄ…tek','Sobota'],
+ dayNames: ['Niedziela','Poniedziałek','Wtorek','Środa','Czwartek','Piątek','Sobota'],
dayNamesShort: ['Nie','Pn','Wt','Åšr','Czw','Pt','So'],
dayNamesMin: ['N','Pn','Wt','Åšr','Cz','Pt','So'],
weekHeader: 'Tydz',
diff --git a/ui/jquery.ui.accordion.js b/ui/jquery.ui.accordion.js
index d1a7abd6d..0ac478b73 100644
--- a/ui/jquery.ui.accordion.js
+++ b/ui/jquery.ui.accordion.js
@@ -74,11 +74,6 @@ $.widget("ui.accordion", {
//Append icon elements
this._createIcons();
- // IE7-/Win - Extra vertical space in lists fixed
- if ($.browser.msie) {
- this.element.find('a').css('zoom', '1');
- }
-
this.resize();
//ARIA
@@ -145,9 +140,9 @@ $.widget("ui.accordion", {
this.headers
.unbind(".accordion")
.removeClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-corner-top")
- .removeAttr("role").removeAttr("aria-expanded").removeAttr("tabindex");
+ .removeAttr("role").removeAttr("aria-expanded").removeAttr("tabIndex");
- this.headers.find("a").removeAttr("tabindex");
+ this.headers.find("a").removeAttr("tabIndex");
this._destroyIcons();
var contents = this.headers.next().css("display", "").removeAttr("role").removeClass("ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active");
if (o.autoHeight || o.fillHeight) {
diff --git a/ui/jquery.ui.autocomplete.js b/ui/jquery.ui.autocomplete.js
index 83a8cf7a4..070045d16 100644
--- a/ui/jquery.ui.autocomplete.js
+++ b/ui/jquery.ui.autocomplete.js
@@ -70,7 +70,7 @@ $.widget( "ui.autocomplete", {
case keyCode.RIGHT:
case keyCode.SHIFT:
case keyCode.CONTROL:
- case 18:
+ case keyCode.ALT:
// ignore metakeys (shift, ctrl, alt)
break;
default:
@@ -83,6 +83,7 @@ $.widget( "ui.autocomplete", {
}
})
.bind( "focus.autocomplete", function() {
+ self.selectedItem = null;
self.previous = self.element.val();
})
.bind( "blur.autocomplete", function( event ) {
@@ -91,6 +92,7 @@ $.widget( "ui.autocomplete", {
// TODO try to implement this without a timeout, see clearTimeout in search()
self.closing = setTimeout(function() {
self.close( event );
+ self._change( event );
}, 150 );
});
this._initSource();
@@ -116,11 +118,13 @@ $.widget( "ui.autocomplete", {
self.element.val( item.value );
}
self.close( event );
- self.previous = self.element.val();
// only trigger when focus was lost (click on menu)
+ var previous = self.previous;
if ( self.element[0] !== doc.activeElement ) {
self.element.focus();
+ self.previous = previous;
}
+ self.selectedItem = item;
},
blur: function( event, ui ) {
if ( self.menu.element.is(":visible") ) {
@@ -140,7 +144,7 @@ $.widget( "ui.autocomplete", {
destroy: function() {
this.element
- .removeClass( "ui-autocomplete-input ui-widget ui-widget-content" )
+ .removeClass( "ui-autocomplete-input" )
.removeAttr( "autocomplete" )
.removeAttr( "role" )
.removeAttr( "aria-autocomplete" )
@@ -162,11 +166,7 @@ $.widget( "ui.autocomplete", {
if ( $.isArray(this.options.source) ) {
array = this.options.source;
this.source = function( request, response ) {
- // escape regex characters
- var matcher = new RegExp( $.ui.autocomplete.escapeRegex(request.term), "i" );
- response( $.grep( array, function(value) {
- return matcher.test( value.label || value.value || value );
- }) );
+ response( $.ui.autocomplete.filter(array, request.term) );
};
} else if ( typeof this.options.source === "string" ) {
url = this.options.source;
@@ -219,8 +219,11 @@ $.widget( "ui.autocomplete", {
this.menu.element.hide();
this.menu.deactivate();
}
+ },
+
+ _change: function( event ) {
if ( this.previous !== this.element.val() ) {
- this._trigger( "change", event );
+ this._trigger( "change", event, { item: this.selectedItem } );
}
},
@@ -301,6 +304,12 @@ $.widget( "ui.autocomplete", {
$.extend( $.ui.autocomplete, {
escapeRegex: function( value ) {
return value.replace( /([\^\$\(\)\[\]\{\}\*\.\+\?\|\\])/gi, "\\$1" );
+ },
+ filter: function(array, term) {
+ var matcher = new RegExp( $.ui.autocomplete.escapeRegex(term), "i" );
+ return $.grep( array, function(value) {
+ return matcher.test( value.label || value.value || value );
+ });
}
});
diff --git a/ui/jquery.ui.core.js b/ui/jquery.ui.core.js
index e0e1727ee..c0eab46b4 100644
--- a/ui/jquery.ui.core.js
+++ b/ui/jquery.ui.core.js
@@ -70,6 +70,7 @@ $.ui = {
},
keyCode: {
+ ALT: 18,
BACKSPACE: 8,
CAPS_LOCK: 20,
COMMA: 188,
@@ -117,15 +118,13 @@ $.fn.extend({
enableSelection: function() {
return this
.attr('unselectable', 'off')
- .css('MozUserSelect', '')
- .unbind('selectstart.ui');
+ .css('MozUserSelect', '');
},
disableSelection: function() {
return this
.attr('unselectable', 'on')
- .css('MozUserSelect', 'none')
- .bind('selectstart.ui', function() { return false; });
+ .css('MozUserSelect', 'none');
},
scrollParent: function() {
diff --git a/ui/jquery.ui.dialog.js b/ui/jquery.ui.dialog.js
index 4e164dbe8..6e538b6e5 100644
--- a/ui/jquery.ui.dialog.js
+++ b/ui/jquery.ui.dialog.js
@@ -622,8 +622,11 @@ $.widget("ui.dialog", {
// reset content sizing
// hide for non content measurement because height: 0 doesn't work in IE quirks mode (see #4350)
- this.element.css('width', 'auto')
- .height(0);
+ this.element.css({
+ width: 'auto',
+ minHeight: 0,
+ height: 0
+ });
// reset wrapper sizing
// determine the height of all the non-content elements
diff --git a/ui/jquery.ui.position.js b/ui/jquery.ui.position.js
index f01640e18..11f8baa06 100644
--- a/ui/jquery.ui.position.js
+++ b/ui/jquery.ui.position.js
@@ -113,6 +113,10 @@ $.fn.position = function( options ) {
position.top -= elemHeight / 2;
}
+ // prevent fractions (see #5280)
+ position.left = parseInt( position.left );
+ position.top = parseInt( position.top );
+
$.each( [ "left", "top" ], function( i, dir ) {
if ( $.ui.position[ collision[i] ] ) {
$.ui.position[ collision[i] ][ dir ]( position, {
diff --git a/ui/jquery.ui.slider.js b/ui/jquery.ui.slider.js
index c392facd7..440e75635 100644
--- a/ui/jquery.ui.slider.js
+++ b/ui/jquery.ui.slider.js
@@ -13,28 +13,32 @@
* jquery.ui.widget.js
*/
-(function($) {
+(function( $ ) {
// number of pages in a slider
// (how many times can you page up/down to go through the whole range)
var numPages = 5;
-$.widget("ui.slider", $.ui.mouse, {
+$.widget( "ui.slider", $.ui.mouse, {
+
widgetEventPrefix: "slide",
+
options: {
animate: false,
distance: 0,
max: 100,
min: 0,
- orientation: 'horizontal',
+ orientation: "horizontal",
range: false,
step: 1,
value: 0,
values: null
},
+
_create: function() {
+ var self = this,
+ o = this.options;
- var self = this, o = this.options;
this._keySliding = false;
this._mouseSliding = false;
this._animateOff = true;
@@ -43,197 +47,218 @@ $.widget("ui.slider", $.ui.mouse, {
this._mouseInit();
this.element
- .addClass("ui-slider"
- + " ui-slider-" + this.orientation
- + " ui-widget"
- + " ui-widget-content"
- + " ui-corner-all");
+ .addClass( "ui-slider" +
+ " ui-slider-" + this.orientation +
+ " ui-widget" +
+ " ui-widget-content" +
+ " ui-corner-all" );
- if (o.disabled) {
- this.element.addClass('ui-slider-disabled ui-disabled');
+ if ( o.disabled ) {
+ this.element.addClass( "ui-slider-disabled ui-disabled" );
}
this.range = $([]);
- if (o.range) {
-
- if (o.range === true) {
- this.range = $('<div></div>');
- if (!o.values) o.values = [this._valueMin(), this._valueMin()];
- if (o.values.length && o.values.length != 2) {
- o.values = [o.values[0], o.values[0]];
+ if ( o.range ) {
+ if ( o.range === true ) {
+ this.range = $( "<div></div>" );
+ if ( !o.values ) {
+ o.values = [ this._valueMin(), this._valueMin() ];
+ }
+ if ( o.values.length && o.values.length !== 2 ) {
+ o.values = [ o.values[0], o.values[0] ];
}
} else {
- this.range = $('<div></div>');
+ this.range = $( "<div></div>" );
}
this.range
- .appendTo(this.element)
- .addClass("ui-slider-range");
+ .appendTo( this.element )
+ .addClass( "ui-slider-range" );
- if (o.range == "min" || o.range == "max") {
- this.range.addClass("ui-slider-range-" + o.range);
+ if ( o.range === "min" || o.range === "max" ) {
+ this.range.addClass( "ui-slider-range-" + o.range );
}
// note: this isn't the most fittingly semantic framework class for this element,
// but worked best visually with a variety of themes
- this.range.addClass("ui-widget-header");
-
+ this.range.addClass( "ui-widget-header" );
}
- if ($(".ui-slider-handle", this.element).length == 0)
- $('<a href="#"></a>')
- .appendTo(this.element)
- .addClass("ui-slider-handle");
+ if ( $( ".ui-slider-handle", this.element ).length === 0 ) {
+ $( "<a href='#'></a>" )
+ .appendTo( this.element )
+ .addClass( "ui-slider-handle" );
+ }
- if (o.values && o.values.length) {
- while ($(".ui-slider-handle", this.element).length < o.values.length)
- $('<a href="#"></a>')
- .appendTo(this.element)
- .addClass("ui-slider-handle");
+ if ( o.values && o.values.length ) {
+ while ( $(".ui-slider-handle", this.element).length < o.values.length ) {
+ $( "<a href='#'></a>" )
+ .appendTo( this.element )
+ .addClass( "ui-slider-handle" );
+ }
}
- this.handles = $(".ui-slider-handle", this.element)
- .addClass("ui-state-default"
- + " ui-corner-all");
+ this.handles = $( ".ui-slider-handle", this.element )
+ .addClass( "ui-state-default" +
+ " ui-corner-all" );
- this.handle = this.handles.eq(0);
+ this.handle = this.handles.eq( 0 );
- this.handles.add(this.range).filter("a")
- .click(function(event) {
+ this.handles.add( this.range ).filter( "a" )
+ .click(function( event ) {
event.preventDefault();
})
.hover(function() {
- if (!o.disabled) {
- $(this).addClass('ui-state-hover');
+ if ( !o.disabled ) {
+ $( this ).addClass( "ui-state-hover" );
}
}, function() {
- $(this).removeClass('ui-state-hover');
+ $( this ).removeClass( "ui-state-hover" );
})
.focus(function() {
- if (!o.disabled) {
- $(".ui-slider .ui-state-focus").removeClass('ui-state-focus'); $(this).addClass('ui-state-focus');
+ if ( !o.disabled ) {
+ $( ".ui-slider .ui-state-focus" ).removeClass( "ui-state-focus" );
+ $( this ).addClass( "ui-state-focus" );
} else {
- $(this).blur();
+ $( this ).blur();
}
})
.blur(function() {
- $(this).removeClass('ui-state-focus');
+ $( this ).removeClass( "ui-state-focus" );
});
- this.handles.each(function(i) {
- $(this).data("index.ui-slider-handle", i);
+ this.handles.each(function( i ) {
+ $( this ).data( "index.ui-slider-handle", i );
});
- this.handles.keydown(function(event) {
-
- var ret = true;
-
- var index = $(this).data("index.ui-slider-handle");
-
- if (self.options.disabled)
- return;
-
- switch (event.keyCode) {
- case $.ui.keyCode.HOME:
- case $.ui.keyCode.END:
- case $.ui.keyCode.PAGE_UP:
- case $.ui.keyCode.PAGE_DOWN:
- case $.ui.keyCode.UP:
- case $.ui.keyCode.RIGHT:
- case $.ui.keyCode.DOWN:
- case $.ui.keyCode.LEFT:
- ret = false;
- if (!self._keySliding) {
- self._keySliding = true;
- $(this).addClass("ui-state-active");
- self._start(event, index);
- }
- break;
- }
-
- var curVal, newVal, step = self._step();
- if (self.options.values && self.options.values.length) {
- curVal = newVal = self.values(index);
- } else {
- curVal = newVal = self.value();
- }
-
- switch (event.keyCode) {
- case $.ui.keyCode.HOME:
- newVal = self._valueMin();
- break;
- case $.ui.keyCode.END:
- newVal = self._valueMax();
- break;
- case $.ui.keyCode.PAGE_UP:
- newVal = curVal + ((self._valueMax() - self._valueMin()) / numPages);
- break;
- case $.ui.keyCode.PAGE_DOWN:
- newVal = curVal - ((self._valueMax() - self._valueMin()) / numPages);
- break;
- case $.ui.keyCode.UP:
- case $.ui.keyCode.RIGHT:
- if(curVal == self._valueMax()) return;
- newVal = curVal + step;
- break;
- case $.ui.keyCode.DOWN:
- case $.ui.keyCode.LEFT:
- if(curVal == self._valueMin()) return;
- newVal = curVal - step;
- break;
- }
-
- self._slide(event, index, newVal);
-
- return ret;
-
- }).keyup(function(event) {
-
- var index = $(this).data("index.ui-slider-handle");
-
- if (self._keySliding) {
- self._keySliding = false;
- self._stop(event, index);
- self._change(event, index);
- $(this).removeClass("ui-state-active");
- }
-
- });
+ this.handles
+ .keydown(function( event ) {
+ var ret = true,
+ index = $( this ).data( "index.ui-slider-handle" ),
+ allowed,
+ curVal,
+ newVal,
+ step;
+
+ if ( self.options.disabled ) {
+ return;
+ }
+
+ switch ( event.keyCode ) {
+ case $.ui.keyCode.HOME:
+ case $.ui.keyCode.END:
+ case $.ui.keyCode.PAGE_UP:
+ case $.ui.keyCode.PAGE_DOWN:
+ case $.ui.keyCode.UP:
+ case $.ui.keyCode.RIGHT:
+ case $.ui.keyCode.DOWN:
+ case $.ui.keyCode.LEFT:
+ ret = false;
+ if ( !self._keySliding ) {
+ self._keySliding = true;
+ $( this ).addClass( "ui-state-active" );
+ allowed = self._start( event, index );
+ if ( allowed === false ) {
+ return;
+ }
+ }
+ break;
+ }
+
+ step = self.options.step;
+ if ( self.options.values && self.options.values.length ) {
+ curVal = newVal = self.values( index );
+ } else {
+ curVal = newVal = self.value();
+ }
+
+ switch ( event.keyCode ) {
+ case $.ui.keyCode.HOME:
+ newVal = self._valueMin();
+ break;
+ case $.ui.keyCode.END:
+ newVal = self._valueMax();
+ break;
+ case $.ui.keyCode.PAGE_UP:
+ newVal = curVal + ( (self._valueMax() - self._valueMin()) / numPages );
+ break;
+ case $.ui.keyCode.PAGE_DOWN:
+ newVal = curVal - ( (self._valueMax() - self._valueMin()) / numPages );
+ break;
+ case $.ui.keyCode.UP:
+ case $.ui.keyCode.RIGHT:
+ if ( curVal === self._valueMax() ) {
+ return;
+ }
+ newVal = curVal + step;
+ break;
+ case $.ui.keyCode.DOWN:
+ case $.ui.keyCode.LEFT:
+ if ( curVal === self._valueMin() ) {
+ return;
+ }
+ newVal = curVal - step;
+ break;
+ }
+
+ self._slide( event, index, newVal );
+
+ return ret;
+
+ })
+ .keyup(function( event ) {
+ var index = $( this ).data( "index.ui-slider-handle" );
+
+ if ( self._keySliding ) {
+ self._keySliding = false;
+ self._stop( event, index );
+ self._change( event, index );
+ $( this ).removeClass( "ui-state-active" );
+ }
+
+ });
this._refreshValue();
this._animateOff = false;
-
},
destroy: function() {
-
this.handles.remove();
this.range.remove();
this.element
- .removeClass("ui-slider"
- + " ui-slider-horizontal"
- + " ui-slider-vertical"
- + " ui-slider-disabled"
- + " ui-widget"
- + " ui-widget-content"
- + " ui-corner-all")
- .removeData("slider")
- .unbind(".slider");
+ .removeClass( "ui-slider" +
+ " ui-slider-horizontal" +
+ " ui-slider-vertical" +
+ " ui-slider-disabled" +
+ " ui-widget" +
+ " ui-widget-content" +
+ " ui-corner-all" )
+ .removeData( "slider" )
+ .unbind( ".slider" );
this._mouseDestroy();
return this;
},
- _mouseCapture: function(event) {
-
- var o = this.options;
-
- if (o.disabled)
+ _mouseCapture: function( event ) {
+ var o = this.options,
+ position,
+ normValue,
+ distance,
+ closestHandle,
+ self,
+ index,
+ allowed,
+ offset,
+ mouseOverHandle;
+
+ if ( o.disabled ) {
return false;
+ }
this.elementSize = {
width: this.element.outerWidth(),
@@ -241,16 +266,15 @@ $.widget("ui.slider", $.ui.mouse, {
};
this.elementOffset = this.element.offset();
- var position = { x: event.pageX, y: event.pageY };
- var normValue = this._normValueFromMouse(position);
-
- var distance = this._valueMax() - this._valueMin() + 1, closestHandle;
- var self = this, index;
- this.handles.each(function(i) {
- var thisDistance = Math.abs(normValue - self.values(i));
- if (distance > thisDistance) {
+ position = { x: event.pageX, y: event.pageY };
+ normValue = this._normValueFromMouse( position );
+ distance = this._valueMax() - this._valueMin() + 1;
+ self = this;
+ this.handles.each(function( i ) {
+ var thisDistance = Math.abs( normValue - self.values(i) );
+ if ( distance > thisDistance ) {
distance = thisDistance;
- closestHandle = $(this);
+ closestHandle = $( this );
index = i;
}
});
@@ -258,216 +282,218 @@ $.widget("ui.slider", $.ui.mouse, {
// workaround for bug #3736 (if both handles of a range are at 0,
// the first is always used as the one with least distance,
// and moving it is obviously prevented by preventing negative ranges)
- if(o.range == true && this.values(1) == o.min) {
- closestHandle = $(this.handles[++index]);
+ if( o.range === true && this.values(1) === o.min ) {
+ index += 1;
+ closestHandle = $( this.handles[index] );
}
- this._start(event, index);
+ allowed = this._start( event, index );
+ if ( allowed === false ) {
+ return false;
+ }
this._mouseSliding = true;
self._handleIndex = index;
closestHandle
- .addClass("ui-state-active")
+ .addClass( "ui-state-active" )
.focus();
- var offset = closestHandle.offset();
- var mouseOverHandle = !$(event.target).parents().andSelf().is('.ui-slider-handle');
+ offset = closestHandle.offset();
+ mouseOverHandle = !$( event.target ).parents().andSelf().is( ".ui-slider-handle" );
this._clickOffset = mouseOverHandle ? { left: 0, top: 0 } : {
- left: event.pageX - offset.left - (closestHandle.width() / 2),
- top: event.pageY - offset.top
- - (closestHandle.height() / 2)
- - (parseInt(closestHandle.css('borderTopWidth'),10) || 0)
- - (parseInt(closestHandle.css('borderBottomWidth'),10) || 0)
- + (parseInt(closestHandle.css('marginTop'),10) || 0)
+ left: event.pageX - offset.left - ( closestHandle.width() / 2 ),
+ top: event.pageY - offset.top -
+ ( closestHandle.height() / 2 ) -
+ ( parseInt( closestHandle.css("borderTopWidth"), 10 ) || 0 ) -
+ ( parseInt( closestHandle.css("borderBottomWidth"), 10 ) || 0) +
+ ( parseInt( closestHandle.css("marginTop"), 10 ) || 0)
};
- normValue = this._normValueFromMouse(position);
- this._slide(event, index, normValue);
+ normValue = this._normValueFromMouse( position );
+ this._slide( event, index, normValue );
this._animateOff = true;
return true;
-
},
- _mouseStart: function(event) {
+ _mouseStart: function( event ) {
return true;
},
- _mouseDrag: function(event) {
-
- var position = { x: event.pageX, y: event.pageY };
- var normValue = this._normValueFromMouse(position);
+ _mouseDrag: function( event ) {
+ var position = { x: event.pageX, y: event.pageY },
+ normValue = this._normValueFromMouse( position );
- this._slide(event, this._handleIndex, normValue);
+ this._slide( event, this._handleIndex, normValue );
return false;
-
},
- _mouseStop: function(event) {
-
- this.handles.removeClass("ui-state-active");
+ _mouseStop: function( event ) {
+ this.handles.removeClass( "ui-state-active" );
this._mouseSliding = false;
- this._stop(event, this._handleIndex);
- this._change(event, this._handleIndex);
+
+ this._stop( event, this._handleIndex );
+ this._change( event, this._handleIndex );
+
this._handleIndex = null;
this._clickOffset = null;
-
this._animateOff = false;
- return false;
+ return false;
},
_detectOrientation: function() {
- this.orientation = this.options.orientation == 'vertical' ? 'vertical' : 'horizontal';
+ this.orientation = ( this.options.orientation === "vertical" ) ? "vertical" : "horizontal";
},
- _normValueFromMouse: function(position) {
+ _normValueFromMouse: function( position ) {
+ var pixelTotal,
+ pixelMouse,
+ percentMouse,
+ valueTotal,
+ valueMouse;
- var pixelTotal, pixelMouse;
- if ('horizontal' == this.orientation) {
+ if ( this.orientation === "horizontal" ) {
pixelTotal = this.elementSize.width;
- pixelMouse = position.x - this.elementOffset.left - (this._clickOffset ? this._clickOffset.left : 0);
+ pixelMouse = position.x - this.elementOffset.left - ( this._clickOffset ? this._clickOffset.left : 0 );
} else {
pixelTotal = this.elementSize.height;
- pixelMouse = position.y - this.elementOffset.top - (this._clickOffset ? this._clickOffset.top : 0);
+ pixelMouse = position.y - this.elementOffset.top - ( this._clickOffset ? this._clickOffset.top : 0 );
}
- var percentMouse = (pixelMouse / pixelTotal);
- if (percentMouse > 1) percentMouse = 1;
- if (percentMouse < 0) percentMouse = 0;
- if ('vertical' == this.orientation)
+ percentMouse = ( pixelMouse / pixelTotal );
+ if ( percentMouse > 1 ) {
+ percentMouse = 1;
+ }
+ if ( percentMouse < 0 ) {
+ percentMouse = 0;
+ }
+ if ( this.orientation === "vertical" ) {
percentMouse = 1 - percentMouse;
+ }
- var valueTotal = this._valueMax() - this._valueMin(),
- valueMouse = percentMouse * valueTotal,
- valueMouseModStep = valueMouse % this.options.step,
- normValue = this._valueMin() + valueMouse - valueMouseModStep;
-
- if (valueMouseModStep > (this.options.step / 2))
- normValue += this.options.step;
-
- // Since JavaScript has problems with large floats, round
- // the final value to 5 digits after the decimal point (see #4124)
- return parseFloat(normValue.toFixed(5));
+ valueTotal = this._valueMax() - this._valueMin();
+ valueMouse = this._valueMin() + percentMouse * valueTotal;
+ return this._trimAlignValue( valueMouse );
},
- _start: function(event, index) {
+ _start: function( event, index ) {
var uiHash = {
- handle: this.handles[index],
+ handle: this.handles[ index ],
value: this.value()
};
- if (this.options.values && this.options.values.length) {
- uiHash.value = this.values(index);
+ if ( this.options.values && this.options.values.length ) {
+ uiHash.value = this.values( index );
uiHash.values = this.values();
}
- this._trigger("start", event, uiHash);
+ return this._trigger( "start", event, uiHash );
},
- _slide: function(event, index, newVal) {
-
- var handle = this.handles[index];
-
- if (this.options.values && this.options.values.length) {
+ _slide: function( event, index, newVal ) {
+ var otherVal,
+ newValues,
+ allowed;
- var otherVal = this.values(index ? 0 : 1);
+ if ( this.options.values && this.options.values.length ) {
+ otherVal = this.values( index ? 0 : 1 );
- if ((this.options.values.length == 2 && this.options.range === true) &&
- ((index == 0 && newVal > otherVal) || (index == 1 && newVal < otherVal))){
- newVal = otherVal;
+ if ( ( this.options.values.length === 2 && this.options.range === true ) &&
+ ( ( index === 0 && newVal > otherVal) || ( index === 1 && newVal < otherVal ) )
+ ) {
+ newVal = otherVal;
}
- if (newVal != this.values(index)) {
- var newValues = this.values();
- newValues[index] = newVal;
+ if ( newVal !== this.values( index ) ) {
+ newValues = this.values();
+ newValues[ index ] = newVal;
// A slide can be canceled by returning false from the slide callback
- var allowed = this._trigger("slide", event, {
- handle: this.handles[index],
+ allowed = this._trigger( "slide", event, {
+ handle: this.handles[ index ],
value: newVal,
values: newValues
- });
- var otherVal = this.values(index ? 0 : 1);
- if (allowed !== false) {
- this.values(index, newVal, true);
+ } );
+ otherVal = this.values( index ? 0 : 1 );
+ if ( allowed !== false ) {
+ this.values( index, newVal, true );
}
}
-
} else {
-
- if (newVal != this.value()) {
+ if ( newVal !== this.value() ) {
// A slide can be canceled by returning false from the slide callback
- var allowed = this._trigger("slide", event, {
- handle: this.handles[index],
+ allowed = this._trigger( "slide", event, {
+ handle: this.handles[ index ],
value: newVal
- });
- if (allowed !== false) {
- this.value(newVal);
+ } );
+ if ( allowed !== false ) {
+ this.value( newVal );
}
-
}
-
}
-
},
- _stop: function(event, index) {
+ _stop: function( event, index ) {
var uiHash = {
- handle: this.handles[index],
+ handle: this.handles[ index ],
value: this.value()
};
- if (this.options.values && this.options.values.length) {
- uiHash.value = this.values(index);
+ if ( this.options.values && this.options.values.length ) {
+ uiHash.value = this.values( index );
uiHash.values = this.values();
}
- this._trigger("stop", event, uiHash);
+
+ this._trigger( "stop", event, uiHash );
},
- _change: function(event, index) {
- if (!this._keySliding && !this._mouseSliding) {
+ _change: function( event, index ) {
+ if ( !this._keySliding && !this._mouseSliding ) {
var uiHash = {
- handle: this.handles[index],
+ handle: this.handles[ index ],
value: this.value()
};
- if (this.options.values && this.options.values.length) {
- uiHash.value = this.values(index);
+ if ( this.options.values && this.options.values.length ) {
+ uiHash.value = this.values( index );
uiHash.values = this.values();
}
- this._trigger("change", event, uiHash);
+
+ this._trigger( "change", event, uiHash );
}
},
- value: function(newValue) {
-
- if (arguments.length) {
- this.options.value = this._trimValue(newValue);
+ value: function( newValue ) {
+ if ( arguments.length ) {
+ this.options.value = this._trimAlignValue( newValue );
this._refreshValue();
- this._change(null, 0);
+ this._change( null, 0 );
}
return this._value();
-
},
- values: function(index, newValue) {
+ values: function( index, newValue ) {
+ var vals,
+ newValues,
+ i;
- if (arguments.length > 1) {
- this.options.values[index] = this._trimValue(newValue);
+ if ( arguments.length > 1 ) {
+ this.options.values[ index ] = this._trimAlignValue( newValue );
this._refreshValue();
- this._change(null, index);
+ this._change( null, index );
}
- if (arguments.length) {
- if ($.isArray(arguments[0])) {
- var vals = this.options.values, newValues = arguments[0];
- for (var i = 0, l = vals.length; i < l; i++) {
- vals[i] = this._trimValue(newValues[i]);
- this._change(null, i);
+ if ( arguments.length ) {
+ if ( $.isArray( arguments[ 0 ] ) ) {
+ vals = this.options.values;
+ newValues = arguments[ 0 ];
+ for ( i = 0; i < vals.length; i += 1 ) {
+ vals[ i ] = this._trimAlignValue( newValues[ i ] );
+ this._change( null, i );
}
this._refreshValue();
} else {
- if (this.options.values && this.options.values.length) {
- return this._values(index);
+ if ( this.options.values && this.options.values.length ) {
+ return this._values( index );
} else {
return this.value();
}
@@ -475,155 +501,182 @@ $.widget("ui.slider", $.ui.mouse, {
} else {
return this._values();
}
-
},
- _setOption: function(key, value) {
-
+ _setOption: function( key, value ) {
var i,
valsLength = 0;
- if ( jQuery.isArray(this.options.values) ) {
+
+ if ( $.isArray( this.options.values ) ) {
valsLength = this.options.values.length;
- };
+ }
- $.Widget.prototype._setOption.apply(this, arguments);
+ $.Widget.prototype._setOption.apply( this, arguments );
- switch (key) {
- case 'disabled':
- if (value) {
- this.handles.filter(".ui-state-focus").blur();
- this.handles.removeClass("ui-state-hover");
- this.handles.attr("disabled", "disabled");
- this.element.addClass("ui-disabled");
+ switch ( key ) {
+ case "disabled":
+ if ( value ) {
+ this.handles.filter( ".ui-state-focus" ).blur();
+ this.handles.removeClass( "ui-state-hover" );
+ this.handles.attr( "disabled", "disabled" );
+ this.element.addClass( "ui-disabled" );
} else {
- this.handles.removeAttr("disabled");
- this.element.removeClass("ui-disabled");
+ this.handles.removeAttr( "disabled" );
+ this.element.removeClass( "ui-disabled" );
}
- case 'orientation':
-
+ break;
+ case "orientation":
this._detectOrientation();
-
this.element
- .removeClass("ui-slider-horizontal ui-slider-vertical")
- .addClass("ui-slider-" + this.orientation);
+ .removeClass( "ui-slider-horizontal ui-slider-vertical" )
+ .addClass( "ui-slider-" + this.orientation );
this._refreshValue();
break;
- case 'value':
+ case "value":
this._animateOff = true;
this._refreshValue();
- this._change(null, 0);
+ this._change( null, 0 );
this._animateOff = false;
break;
- case 'values':
+ case "values":
this._animateOff = true;
this._refreshValue();
- for (i = 0; i < valsLength; i++) {
- this._change(null, i);
+ for ( i = 0; i < valsLength; i += 1 ) {
+ this._change( null, i );
}
this._animateOff = false;
break;
}
-
- },
-
- _step: function() {
- var step = this.options.step;
- return step;
},
+ //internal value getter
+ // _value() returns value trimmed by min and max, aligned by step
_value: function() {
- //internal value getter
- // _value() returns value trimmed by min and max
var val = this.options.value;
- val = this._trimValue(val);
+ val = this._trimAlignValue( val );
return val;
},
- _values: function(index) {
- //internal values getter
- // _values() returns array of values trimmed by min and max
- // _values(index) returns single value trimmed by min and max
+ //internal values getter
+ // _values() returns array of values trimmed by min and max, aligned by step
+ // _values( index ) returns single value trimmed by min and max, aligned by step
+ _values: function( index ) {
+ var val,
+ vals,
+ i;
- if (arguments.length) {
- var val = this.options.values[index];
- val = this._trimValue(val);
+ if ( arguments.length ) {
+ val = this.options.values[ index ];
+ val = this._trimAlignValue( val );
return val;
} else {
// .slice() creates a copy of the array
// this copy gets trimmed by min and max and then returned
- var vals = this.options.values.slice();
- for (var i = 0, l = vals.length; i < l; i++) {
- vals[i] = this._trimValue(vals[i]);
+ vals = this.options.values.slice();
+ for ( i = 0; i < vals.length; i+= 1) {
+ vals[ i ] = this._trimAlignValue( vals[ i ] );
}
return vals;
}
-
},
- _trimValue: function(val) {
- if (val < this._valueMin()) val = this._valueMin();
- if (val > this._valueMax()) val = this._valueMax();
+ // returns the step-aligned value that val is closest to, between (inclusive) min and max
+ _trimAlignValue: function( val ) {
+ if ( val < this._valueMin() ) {
+ return this._valueMin();
+ }
+ if ( val > this._valueMax() ) {
+ return this._valueMax();
+ }
+ var step = this.options.step,
+ valModStep = val % step,
+ alignValue = val - valModStep;
- return val;
+ if ( valModStep >= ( step / 2 ) ) {
+ alignValue += step;
+ }
+
+ // Since JavaScript has problems with large floats, round
+ // the final value to 5 digits after the decimal point (see #4124)
+ return parseFloat( alignValue.toFixed(5) );
},
_valueMin: function() {
- var valueMin = this.options.min;
- return valueMin;
+ return this.options.min;
},
_valueMax: function() {
- var valueMax = this.options.max;
- return valueMax;
+ return this.options.max;
},
_refreshValue: function() {
-
- var oRange = this.options.range, o = this.options, self = this;
- var animate = (!this._animateOff) ? o.animate : false;
-
- if (this.options.values && this.options.values.length) {
- var vp0, vp1;
- this.handles.each(function(i, j) {
- var valPercent = (self.values(i) - self._valueMin()) / (self._valueMax() - self._valueMin()) * 100;
- var _set = {}; _set[self.orientation == 'horizontal' ? 'left' : 'bottom'] = valPercent + '%';
- $(this).stop(1,1)[animate ? 'animate' : 'css'](_set, o.animate);
- if (self.options.range === true) {
- if (self.orientation == 'horizontal') {
- (i == 0) && self.range.stop(1,1)[animate ? 'animate' : 'css']({ left: valPercent + '%' }, o.animate);
- (i == 1) && self.range[animate ? 'animate' : 'css']({ width: (valPercent - lastValPercent) + '%' }, { queue: false, duration: o.animate });
+ var oRange = this.options.range,
+ o = this.options,
+ self = this,
+ animate = ( !this._animateOff ) ? o.animate : false,
+ valPercent,
+ _set = {},
+ lastValPercent,
+ value,
+ valueMin,
+ valueMax;
+
+ if ( this.options.values && this.options.values.length ) {
+ this.handles.each(function( i, j ) {
+ valPercent = ( self.values(i) - self._valueMin() ) / ( self._valueMax() - self._valueMin() ) * 100;
+ _set[ self.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%";
+ $( this ).stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate );
+ if ( self.options.range === true ) {
+ if ( self.orientation === "horizontal" ) {
+ if ( i === 0 ) {
+ self.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { left: valPercent + "%" }, o.animate );
+ }
+ if ( i === 1 ) {
+ self.range[ animate ? "animate" : "css" ]( { width: ( valPercent - lastValPercent ) + "%" }, { queue: false, duration: o.animate } );
+ }
} else {
- (i == 0) && self.range.stop(1,1)[animate ? 'animate' : 'css']({ bottom: (valPercent) + '%' }, o.animate);
- (i == 1) && self.range[animate ? 'animate' : 'css']({ height: (valPercent - lastValPercent) + '%' }, { queue: false, duration: o.animate });
+ if ( i === 0 ) {
+ self.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { bottom: ( valPercent ) + "%" }, o.animate );
+ }
+ if ( i === 1 ) {
+ self.range[ animate ? "animate" : "css" ]( { height: ( valPercent - lastValPercent ) + "%" }, { queue: false, duration: o.animate } );
+ }
}
}
lastValPercent = valPercent;
});
} else {
- var value = this.value(),
- valueMin = this._valueMin(),
- valueMax = this._valueMax(),
- valPercent = valueMax != valueMin
- ? (value - valueMin) / (valueMax - valueMin) * 100
- : 0;
- var _set = {}; _set[self.orientation == 'horizontal' ? 'left' : 'bottom'] = valPercent + '%';
- this.handle.stop(1,1)[animate ? 'animate' : 'css'](_set, o.animate);
-
- (oRange == "min") && (this.orientation == "horizontal") && this.range.stop(1,1)[animate ? 'animate' : 'css']({ width: valPercent + '%' }, o.animate);
- (oRange == "max") && (this.orientation == "horizontal") && this.range[animate ? 'animate' : 'css']({ width: (100 - valPercent) + '%' }, { queue: false, duration: o.animate });
- (oRange == "min") && (this.orientation == "vertical") && this.range.stop(1,1)[animate ? 'animate' : 'css']({ height: valPercent + '%' }, o.animate);
- (oRange == "max") && (this.orientation == "vertical") && this.range[animate ? 'animate' : 'css']({ height: (100 - valPercent) + '%' }, { queue: false, duration: o.animate });
+ value = this.value();
+ valueMin = this._valueMin();
+ valueMax = this._valueMax();
+ valPercent = ( valueMax !== valueMin ) ?
+ ( value - valueMin ) / ( valueMax - valueMin ) * 100 :
+ 0;
+ _set[ self.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%";
+ this.handle.stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate );
+
+ if ( oRange === "min" && this.orientation === "horizontal" ) {
+ this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { width: valPercent + "%" }, o.animate );
+ }
+ if ( oRange === "max" && this.orientation === "horizontal" ) {
+ this.range[ animate ? "animate" : "css" ]( { width: ( 100 - valPercent ) + "%" }, { queue: false, duration: o.animate } );
+ }
+ if ( oRange === "min" && this.orientation === "vertical" ) {
+ this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { height: valPercent + "%" }, o.animate );
+ }
+ if ( oRange === "max" && this.orientation === "vertical" ) {
+ this.range[ animate ? "animate" : "css" ]( { height: ( 100 - valPercent ) + "%" }, { queue: false, duration: o.animate } );
+ }
}
-
}
-
+
});
-$.extend($.ui.slider, {
+$.extend( $.ui.slider, {
version: "@VERSION"
});
-})(jQuery);
+}(jQuery));
diff --git a/ui/jquery.ui.sortable.js b/ui/jquery.ui.sortable.js
index 28be062f6..0fa3a1253 100644
--- a/ui/jquery.ui.sortable.js
+++ b/ui/jquery.ui.sortable.js
@@ -73,6 +73,18 @@ $.widget("ui.sortable", $.ui.mouse, {
return this;
},
+ _setOption: function(key, value){
+ if ( key === "disabled" ) {
+ this.options[ key ] = value;
+
+ this.widget()
+ [ value ? "addClass" : "removeClass"]( "ui-sortable-disabled" );
+ } else {
+ // Don't call widget base _setOption for disable as it adds ui-state-disabled class
+ $.Widget.prototype._setOption.apply(self, arguments);
+ }
+ },
+
_mouseCapture: function(event, overrideHandle) {
if (this.reverting) {
diff --git a/ui/jquery.ui.widget.js b/ui/jquery.ui.widget.js
index 49067449d..a9829d2e5 100644
--- a/ui/jquery.ui.widget.js
+++ b/ui/jquery.ui.widget.js
@@ -155,7 +155,7 @@ $.Widget.prototype = {
.removeAttr( "aria-disabled" )
.removeClass(
this.widgetBaseClass + "-disabled " +
- this.namespace + "-state-disabled" );
+ "ui-state-disabled" );
},
widget: function() {
@@ -192,7 +192,7 @@ $.Widget.prototype = {
this.widget()
[ value ? "addClass" : "removeClass"](
this.widgetBaseClass + "-disabled" + " " +
- this.namespace + "-state-disabled" )
+ "ui-state-disabled" )
.attr( "aria-disabled", value );
}